Merge branch 'newagentmgr'

Conflicts:
	agent-simulator/src/com/cloud/api/commands/ConfigureSimulator.java
	ovm/src/com/cloud/ovm/hypervisor/OvmDiscoverer.java
	server/src/com/cloud/agent/manager/AgentManagerImpl.java
	server/src/com/cloud/capacity/CapacityManagerImpl.java
	server/src/com/cloud/network/F5BigIpManagerImpl.java
	server/src/com/cloud/network/JuniperSrxManagerImpl.java
	server/src/com/cloud/resource/ResourceManagerImpl.java
	server/src/com/cloud/server/ManagementServerImpl.java
	server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
	server/src/com/cloud/vm/UserVmManagerImpl.java
	server/src/com/cloud/vm/VirtualMachineManagerImpl.java
	utils/src/com/cloud/utils/db/GenericDao.java
This commit is contained in:
frank 2011-10-27 11:09:56 -07:00
commit cef30956e9
99 changed files with 3873 additions and 2249 deletions

View File

@ -24,6 +24,7 @@ import com.cloud.agent.api.CheckHealthCommand;
import com.cloud.agent.api.GetHostStatsAnswer; import com.cloud.agent.api.GetHostStatsAnswer;
import com.cloud.agent.api.GetHostStatsCommand; import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.HostStatsEntry; import com.cloud.agent.api.HostStatsEntry;
import com.cloud.agent.api.MaintainAnswer;
import com.cloud.agent.api.PingTestCommand; import com.cloud.agent.api.PingTestCommand;
import com.cloud.agent.api.PrepareForMigrationAnswer; import com.cloud.agent.api.PrepareForMigrationAnswer;
import com.cloud.agent.api.PrepareForMigrationCommand; import com.cloud.agent.api.PrepareForMigrationCommand;
@ -34,6 +35,7 @@ import com.cloud.host.Host.Type;
import com.cloud.resource.AgentResourceBase; import com.cloud.resource.AgentResourceBase;
import com.cloud.resource.AgentRoutingResource; import com.cloud.resource.AgentRoutingResource;
import com.cloud.resource.AgentStorageResource; import com.cloud.resource.AgentStorageResource;
import com.cloud.resource.ResourceManager;
import com.cloud.simulator.MockHost; import com.cloud.simulator.MockHost;
import com.cloud.simulator.MockHostVO; import com.cloud.simulator.MockHostVO;
import com.cloud.simulator.MockVMVO; import com.cloud.simulator.MockVMVO;
@ -56,6 +58,7 @@ public class MockAgentManagerImpl implements MockAgentManager {
@Inject SimulatorManager _simulatorMgr = null; @Inject SimulatorManager _simulatorMgr = null;
@Inject AgentManager _agentMgr = null; @Inject AgentManager _agentMgr = null;
@Inject MockStorageManager _storageMgr = null; @Inject MockStorageManager _storageMgr = null;
@Inject ResourceManager _resourceMgr;
private SecureRandom random; private SecureRandom random;
private Map<String, AgentResourceBase> _resources = new ConcurrentHashMap<String, AgentResourceBase>(); private Map<String, AgentResourceBase> _resources = new ConcurrentHashMap<String, AgentResourceBase>();
private ThreadPoolExecutor _executor; private ThreadPoolExecutor _executor;
@ -270,7 +273,7 @@ public class MockAgentManagerImpl implements MockAgentManager {
} }
Map<String, String> details = new HashMap<String, String>(); Map<String, String> details = new HashMap<String, String>();
_agentMgr.addHost(this.dcId, storageResource, Type.SecondaryStorageVM, details); _resourceMgr.addHost(this.dcId, storageResource, Type.SecondaryStorageVM, details);
_resources.put(this.guid, storageResource); _resources.put(this.guid, storageResource);
} }
@ -347,7 +350,7 @@ public class MockAgentManagerImpl implements MockAgentManager {
@Override @Override
public Answer MaintainCommand(com.cloud.agent.api.MaintainCommand cmd) { public MaintainAnswer MaintainCommand(com.cloud.agent.api.MaintainCommand cmd) {
return new Answer(cmd); return new MaintainAnswer(cmd);
} }
} }

View File

View File

View File

@ -38,6 +38,7 @@ import com.cloud.agent.api.AgentControlCommand;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupRoutingCommand;
import com.cloud.agent.manager.MockAgentManager; import com.cloud.agent.manager.MockAgentManager;
import com.cloud.agent.manager.MockStorageManager; import com.cloud.agent.manager.MockStorageManager;
import com.cloud.agent.manager.SimulatorManager; import com.cloud.agent.manager.SimulatorManager;
@ -66,7 +67,7 @@ import com.cloud.utils.component.Inject;
* *
*/ */
@Local(value = Discoverer.class) @Local(value = Discoverer.class)
public class SimulatorDiscoverer extends DiscovererBase implements Discoverer, Listener { public class SimulatorDiscoverer extends DiscovererBase implements Discoverer, Listener, ResourceStateAdapter {
private static final Logger s_logger = Logger private static final Logger s_logger = Logger
.getLogger(SimulatorDiscoverer.class); .getLogger(SimulatorDiscoverer.class);
@ -78,6 +79,7 @@ public class SimulatorDiscoverer extends DiscovererBase implements Discoverer, L
@Inject AgentManager _agentMgr = null; @Inject AgentManager _agentMgr = null;
@Inject MockAgentManager _mockAgentMgr = null; @Inject MockAgentManager _mockAgentMgr = null;
@Inject MockStorageManager _mockStorageMgr = null; @Inject MockStorageManager _mockStorageMgr = null;
@Inject ResourceManager _resourceMgr;
/** /**
* Finds ServerResources of an in-process simulator * Finds ServerResources of an in-process simulator
@ -244,6 +246,7 @@ public class SimulatorDiscoverer extends DiscovererBase implements Discoverer, L
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
super.configure(name, params); super.configure(name, params);
_agentMgr.registerForHostEvents(this, true, false, false); _agentMgr.registerForHostEvents(this, true, false, false);
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
return true; return true;
} }
@ -305,4 +308,41 @@ public class SimulatorDiscoverer extends DiscovererBase implements Discoverer, L
return false; return false;
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host,
StartupCommand[] cmd) {
// TODO Auto-generated method stub
return null;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host,
StartupCommand[] startup, ServerResource resource,
Map<String, String> details, List<String> hostTags) {
StartupCommand firstCmd = startup[0];
if (!(firstCmd instanceof StartupRoutingCommand)) {
return null;
}
StartupRoutingCommand ssCmd = ((StartupRoutingCommand) firstCmd);
if (ssCmd.getHypervisorType() != HypervisorType.Simulator) {
return null;
}
return _resourceMgr.fillRoutingHostVO(host, ssCmd, HypervisorType.Simulator, details, hostTags);
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced,
boolean isForceDeleteStorage) throws UnableDeleteHostException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean stop() {
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return super.stop();
}
} }

View File

@ -0,0 +1,32 @@
package com.cloud.agent.api;
import com.cloud.resource.ResourceState;
public class PropagateResourceEventCommand extends Command {
long hostId;
ResourceState.Event event;
protected PropagateResourceEventCommand() {
}
public PropagateResourceEventCommand(long hostId, ResourceState.Event event) {
this.hostId = hostId;
this.event = event;
}
public long getHostId() {
return hostId;
}
public ResourceState.Event getEvent() {
return event;
}
@Override
public boolean executeInSequence() {
// TODO Auto-generated method stub
return false;
}
}

2
api/src/com/cloud/api/commands/ReconnectHostCmd.java Normal file → Executable file
View File

@ -107,7 +107,7 @@ public class ReconnectHostCmd extends BaseAsyncCmd {
} else { } else {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to reconnect host"); throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to reconnect host");
} }
} catch (AgentUnavailableException ex) { } catch (Exception ex) {
s_logger.warn("Exception: ", ex); s_logger.warn("Exception: ", ex);
throw new ServerApiException(BaseCmd.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage()); throw new ServerApiException(BaseCmd.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage());
} }

0
api/src/com/cloud/api/response/BaseResponse.java Normal file → Executable file
View File

View File

@ -20,12 +20,14 @@ package com.cloud.host;
import java.util.Date; import java.util.Date;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.resource.ResourceState;
import com.cloud.utils.fsm.StateObject;
/** /**
* Host represents one particular host server. * Host represents one particular host server.
*/ */
public interface Host { public interface Host extends StateObject<Status> {
public enum Type { public enum Type {
Storage(false), Storage(false),
Routing(false), Routing(false),
@ -58,11 +60,6 @@ public interface Host {
} }
} }
public enum HostAllocationState {
Disabled,
Enabled;
}
/** /**
* @return id of the host. * @return id of the host.
*/ */
@ -197,8 +194,9 @@ public interface Host {
String getStorageMacAddressDeux(); String getStorageMacAddressDeux();
HostAllocationState getHostAllocationState();
String getHypervisorVersion(); String getHypervisorVersion();
boolean isInMaintenanceStates();
ResourceState getResourceState();
} }

70
api/src/com/cloud/host/Status.java Normal file → Executable file
View File

@ -20,19 +20,19 @@ package com.cloud.host;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import com.cloud.utils.fsm.NoTransitionException;
import com.cloud.utils.fsm.StateMachine; import com.cloud.utils.fsm.StateMachine;
import com.cloud.utils.fsm.StateMachine2;
public enum Status { public enum Status {
Creating(true, false, false),
Connecting(true, false, false), Connecting(true, false, false),
Up(true, false, false), Up(true, false, false),
Down(true, true, true), Down(true, true, true),
Disconnected(true, true, true), Disconnected(true, true, true),
Updating(true, true, false),
PrepareForMaintenance(false, false, false),
ErrorInMaintenance(false, false, false),
Maintenance(false, false, false),
Alert(true, true, true), Alert(true, true, true),
Removed(true, false, true), Removed(true, false, true),
Error(true, false, true),
Rebalancing(false, false, false); Rebalancing(false, false, false);
private final boolean updateManagementServer; private final boolean updateManagementServer;
@ -60,26 +60,19 @@ public enum Status {
public enum Event { public enum Event {
AgentConnected(false, "Agent connected"), AgentConnected(false, "Agent connected"),
PingTimeout(false, "Agent is behind on ping"), PingTimeout(false, "Agent is behind on ping"),
UpdateNeeded(false, "UpdateRequested"),
ShutdownRequested(false, "Shutdown requested by the agent"), ShutdownRequested(false, "Shutdown requested by the agent"),
AgentDisconnected(false, "Agent disconnected"), AgentDisconnected(false, "Agent disconnected"),
ResetRequested(true, "Reset is requested by the user"),
HostDown(false, "Host is found to be down by the investigator"), HostDown(false, "Host is found to be down by the investigator"),
PreparationComplete(false, "Preparation for PrepareForMaintenance is completed"),
UnableToMigrate(false, "Migration for at least one VM didn't work"),
Ping(false, "Ping is received from the host"), Ping(false, "Ping is received from the host"),
MaintenanceRequested(true, "PrepareForMaintenance requested by user"),
ManagementServerDown(false, "Management Server that the agent is connected is going down"), ManagementServerDown(false, "Management Server that the agent is connected is going down"),
WaitedTooLong(false, "Waited too long from the agent to reconnect on its own. Time to do HA"), WaitedTooLong(false, "Waited too long from the agent to reconnect on its own. Time to do HA"),
Remove(true, "Host is removed"), Remove(true, "Host is removed"),
Ready(false, "Host is ready for commands"), Ready(false, "Host is ready for commands"),
UpdatePassword(false, "Update host password from db"),
RequestAgentRebalance(false, "Request rebalance for the certain host"), RequestAgentRebalance(false, "Request rebalance for the certain host"),
StartAgentRebalance(false, "Start rebalance for the certain host"), StartAgentRebalance(false, "Start rebalance for the certain host"),
RebalanceCompleted(false, "Host is rebalanced successfully"), RebalanceCompleted(false, "Host is rebalanced successfully"),
RebalanceFailed(false, "Failed to rebalance the host"), RebalanceFailed(false, "Failed to rebalance the host"),
PrepareUnmanaged(true, "prepare for cluster entering unmanaged status"), Error(false, "An internal error happened");
HypervisorVersionChanged(false, " hypervisor version changed when host is reconnected");
private final boolean isUserRequest; private final boolean isUserRequest;
private final String comment; private final String comment;
@ -97,7 +90,11 @@ public enum Status {
} }
} }
public Status getNextStatus(Event e) { public static StateMachine2<Status, Event, Host> getStateMachine() {
return s_fsm;
}
public Status getNextStatus(Event e) throws NoTransitionException {
return s_fsm.getNextState(this, e); return s_fsm.getNextState(this, e);
} }
@ -118,22 +115,20 @@ public enum Status {
return strs; return strs;
} }
protected static final StateMachine<Status, Event> s_fsm = new StateMachine<Status, Event>(); protected static final StateMachine2<Status, Event, Host> s_fsm = new StateMachine2<Status, Event, Host>();
static { static {
s_fsm.addTransition(null, Event.AgentConnected, Status.Connecting); s_fsm.addTransition(null, Event.AgentConnected, Status.Connecting);
s_fsm.addTransition(Status.Creating, Event.AgentConnected, Status.Connecting);
s_fsm.addTransition(Status.Creating, Event.Error, Status.Error);
s_fsm.addTransition(Status.Connecting, Event.AgentConnected, Status.Connecting); s_fsm.addTransition(Status.Connecting, Event.AgentConnected, Status.Connecting);
s_fsm.addTransition(Status.Connecting, Event.Ready, Status.Up); s_fsm.addTransition(Status.Connecting, Event.Ready, Status.Up);
s_fsm.addTransition(Status.Connecting, Event.PingTimeout, Status.Alert); s_fsm.addTransition(Status.Connecting, Event.PingTimeout, Status.Alert);
s_fsm.addTransition(Status.Connecting, Event.UpdateNeeded, Status.Updating);
s_fsm.addTransition(Status.Connecting, Event.MaintenanceRequested, Status.PrepareForMaintenance);
s_fsm.addTransition(Status.Connecting, Event.ShutdownRequested, Status.Disconnected); s_fsm.addTransition(Status.Connecting, Event.ShutdownRequested, Status.Disconnected);
s_fsm.addTransition(Status.Connecting, Event.HostDown, Status.Alert); s_fsm.addTransition(Status.Connecting, Event.HostDown, Status.Alert);
s_fsm.addTransition(Status.Connecting, Event.Ping, Status.Connecting); s_fsm.addTransition(Status.Connecting, Event.Ping, Status.Connecting);
s_fsm.addTransition(Status.Connecting, Event.ManagementServerDown, Status.Disconnected); s_fsm.addTransition(Status.Connecting, Event.ManagementServerDown, Status.Disconnected);
s_fsm.addTransition(Status.Connecting, Event.AgentDisconnected, Status.Alert); s_fsm.addTransition(Status.Connecting, Event.AgentDisconnected, Status.Alert);
s_fsm.addTransition(Status.Connecting, Event.HypervisorVersionChanged, Status.Disconnected);
s_fsm.addTransition(Status.Up, Event.PingTimeout, Status.Alert); s_fsm.addTransition(Status.Up, Event.PingTimeout, Status.Alert);
s_fsm.addTransition(Status.Up, Event.MaintenanceRequested, Status.PrepareForMaintenance);
s_fsm.addTransition(Status.Up, Event.AgentDisconnected, Status.Alert); s_fsm.addTransition(Status.Up, Event.AgentDisconnected, Status.Alert);
s_fsm.addTransition(Status.Up, Event.ShutdownRequested, Status.Disconnected); s_fsm.addTransition(Status.Up, Event.ShutdownRequested, Status.Disconnected);
s_fsm.addTransition(Status.Up, Event.HostDown, Status.Down); s_fsm.addTransition(Status.Up, Event.HostDown, Status.Down);
@ -141,59 +136,28 @@ public enum Status {
s_fsm.addTransition(Status.Up, Event.AgentConnected, Status.Connecting); s_fsm.addTransition(Status.Up, Event.AgentConnected, Status.Connecting);
s_fsm.addTransition(Status.Up, Event.ManagementServerDown, Status.Disconnected); s_fsm.addTransition(Status.Up, Event.ManagementServerDown, Status.Disconnected);
s_fsm.addTransition(Status.Up, Event.StartAgentRebalance, Status.Rebalancing); s_fsm.addTransition(Status.Up, Event.StartAgentRebalance, Status.Rebalancing);
s_fsm.addTransition(Status.Up, Event.PrepareUnmanaged, Status.Disconnected);
s_fsm.addTransition(Status.Up, Event.HypervisorVersionChanged, Status.Disconnected);
s_fsm.addTransition(Status.Updating, Event.PingTimeout, Status.Alert);
s_fsm.addTransition(Status.Updating, Event.Ping, Status.Updating);
s_fsm.addTransition(Status.Updating, Event.AgentConnected, Status.Connecting);
s_fsm.addTransition(Status.Updating, Event.ManagementServerDown, Status.Disconnected);
s_fsm.addTransition(Status.Updating, Event.WaitedTooLong, Status.Alert);
s_fsm.addTransition(Status.PrepareForMaintenance, Event.ResetRequested, Status.Disconnected);
s_fsm.addTransition(Status.PrepareForMaintenance, Event.PreparationComplete, Status.Maintenance);
s_fsm.addTransition(Status.PrepareForMaintenance, Event.AgentDisconnected, Status.PrepareForMaintenance);
s_fsm.addTransition(Status.PrepareForMaintenance, Event.AgentConnected, Status.PrepareForMaintenance);
s_fsm.addTransition(Status.PrepareForMaintenance, Event.HostDown, Status.PrepareForMaintenance);
s_fsm.addTransition(Status.PrepareForMaintenance, Event.UnableToMigrate, Status.ErrorInMaintenance);
s_fsm.addTransition(Status.PrepareForMaintenance, Event.Ping, Status.PrepareForMaintenance);
s_fsm.addTransition(Status.PrepareForMaintenance, Event.ManagementServerDown, Status.PrepareForMaintenance);
s_fsm.addTransition(Status.ErrorInMaintenance, Event.MaintenanceRequested, Status.PrepareForMaintenance);
s_fsm.addTransition(Status.ErrorInMaintenance, Event.ResetRequested, Status.Disconnected);
s_fsm.addTransition(Status.ErrorInMaintenance, Event.HostDown, Status.ErrorInMaintenance);
s_fsm.addTransition(Status.ErrorInMaintenance, Event.AgentDisconnected, Status.ErrorInMaintenance);
s_fsm.addTransition(Status.ErrorInMaintenance, Event.AgentConnected, Status.ErrorInMaintenance);
s_fsm.addTransition(Status.ErrorInMaintenance, Event.Remove, Status.Removed);
s_fsm.addTransition(Status.ErrorInMaintenance, Event.UnableToMigrate, Status.ErrorInMaintenance);
s_fsm.addTransition(Status.ErrorInMaintenance, Event.PreparationComplete, Status.Maintenance);
s_fsm.addTransition(Status.ErrorInMaintenance, Event.Ping, Status.ErrorInMaintenance);
s_fsm.addTransition(Status.ErrorInMaintenance, Event.ManagementServerDown, Status.ErrorInMaintenance);
s_fsm.addTransition(Status.Maintenance, Event.ResetRequested, Status.Disconnected);
s_fsm.addTransition(Status.Maintenance, Event.AgentDisconnected, Status.Maintenance);
s_fsm.addTransition(Status.Maintenance, Event.HostDown, Status.Maintenance);
s_fsm.addTransition(Status.Maintenance, Event.Remove, Status.Removed);
s_fsm.addTransition(Status.Maintenance, Event.AgentConnected, Status.Maintenance);
s_fsm.addTransition(Status.Maintenance, Event.Ping, Status.Maintenance);
s_fsm.addTransition(Status.Maintenance, Event.ManagementServerDown, Status.Maintenance);
s_fsm.addTransition(Status.Disconnected, Event.PingTimeout, Status.Alert); s_fsm.addTransition(Status.Disconnected, Event.PingTimeout, Status.Alert);
s_fsm.addTransition(Status.Disconnected, Event.AgentConnected, Status.Connecting); s_fsm.addTransition(Status.Disconnected, Event.AgentConnected, Status.Connecting);
s_fsm.addTransition(Status.Disconnected, Event.Ping, Status.Up); s_fsm.addTransition(Status.Disconnected, Event.Ping, Status.Up);
s_fsm.addTransition(Status.Disconnected, Event.HostDown, Status.Down);
s_fsm.addTransition(Status.Disconnected, Event.ManagementServerDown, Status.Disconnected); s_fsm.addTransition(Status.Disconnected, Event.ManagementServerDown, Status.Disconnected);
s_fsm.addTransition(Status.Disconnected, Event.WaitedTooLong, Status.Alert); s_fsm.addTransition(Status.Disconnected, Event.WaitedTooLong, Status.Alert);
s_fsm.addTransition(Status.Disconnected, Event.Remove, Status.Removed); s_fsm.addTransition(Status.Disconnected, Event.Remove, Status.Removed);
s_fsm.addTransition(Status.Disconnected, Event.HypervisorVersionChanged, Status.Disconnected);
s_fsm.addTransition(Status.Disconnected, Event.AgentDisconnected, Status.Disconnected); s_fsm.addTransition(Status.Disconnected, Event.AgentDisconnected, Status.Disconnected);
s_fsm.addTransition(Status.Down, Event.MaintenanceRequested, Status.PrepareForMaintenance);
s_fsm.addTransition(Status.Down, Event.AgentConnected, Status.Connecting); s_fsm.addTransition(Status.Down, Event.AgentConnected, Status.Connecting);
s_fsm.addTransition(Status.Down, Event.Remove, Status.Removed); s_fsm.addTransition(Status.Down, Event.Remove, Status.Removed);
s_fsm.addTransition(Status.Down, Event.ManagementServerDown, Status.Down); s_fsm.addTransition(Status.Down, Event.ManagementServerDown, Status.Down);
s_fsm.addTransition(Status.Down, Event.AgentDisconnected, Status.Down); s_fsm.addTransition(Status.Down, Event.AgentDisconnected, Status.Down);
s_fsm.addTransition(Status.Alert, Event.MaintenanceRequested, Status.PrepareForMaintenance);
s_fsm.addTransition(Status.Alert, Event.AgentConnected, Status.Connecting); s_fsm.addTransition(Status.Alert, Event.AgentConnected, Status.Connecting);
s_fsm.addTransition(Status.Alert, Event.Ping, Status.Up); s_fsm.addTransition(Status.Alert, Event.Ping, Status.Up);
s_fsm.addTransition(Status.Alert, Event.Remove, Status.Removed); s_fsm.addTransition(Status.Alert, Event.Remove, Status.Removed);
s_fsm.addTransition(Status.Alert, Event.ManagementServerDown, Status.Alert); s_fsm.addTransition(Status.Alert, Event.ManagementServerDown, Status.Alert);
s_fsm.addTransition(Status.Alert, Event.AgentDisconnected, Status.Alert); s_fsm.addTransition(Status.Alert, Event.AgentDisconnected, Status.Alert);
s_fsm.addTransition(Status.Alert, Event.ShutdownRequested, Status.Disconnected);
s_fsm.addTransition(Status.Rebalancing, Event.RebalanceFailed, Status.Disconnected); s_fsm.addTransition(Status.Rebalancing, Event.RebalanceFailed, Status.Disconnected);
s_fsm.addTransition(Status.Rebalancing, Event.RebalanceCompleted, Status.Connecting); s_fsm.addTransition(Status.Rebalancing, Event.RebalanceCompleted, Status.Connecting);
s_fsm.addTransition(Status.Rebalancing, Event.AgentConnected, Status.Connecting);
s_fsm.addTransition(Status.Error, Event.AgentConnected, Status.Connecting);
} }
public static void main(String[] args) { public static void main(String[] args) {

2
api/src/com/cloud/resource/ResourceService.java Normal file → Executable file
View File

@ -46,7 +46,7 @@ public interface ResourceService {
Host cancelMaintenance(CancelMaintenanceCmd cmd); Host cancelMaintenance(CancelMaintenanceCmd cmd);
Host reconnectHost(ReconnectHostCmd cmd) throws AgentUnavailableException; Host reconnectHost(ReconnectHostCmd cmd);
/** /**
* We will automatically create a cloud.com cluster to attach to the external cluster and return a hyper host to perform * We will automatically create a cloud.com cluster to attach to the external cluster and return a hyper host to perform

View File

@ -0,0 +1,101 @@
package com.cloud.resource;
import java.util.List;
import java.util.Set;
import com.cloud.utils.fsm.StateMachine;
public enum ResourceState {
Creating,
Enabled,
Disabled,
Unmanaged,
PrepareForMaintenance,
ErrorInMaintenance,
Maintenance,
Error;
public enum Event {
InternalCreated("Resource is created"),
Enable("Admin enables"),
Disable("Admin disables"),
AdminAskMaintenace("Admin asks to enter maintenance"),
AdminCancelMaintenance("Admin asks to cancel maintenance"),
InternalEnterMaintenance("Resource enters maintenance"),
Unmanaged("Admin turns a host into umanaged state"),
UpdatePassword("Admin updates password of host"),
UnableToMigrate("Management server migrates VM failed"),
Error("An internal error happened"),
DeleteHost("Admin delete a host");
private final String comment;
private Event(String comment) {
this.comment = comment;
}
public String getDescription() {
return this.comment;
}
}
public ResourceState getNextState(Event a) {
return s_fsm.getNextState(this, a);
}
public ResourceState[] getFromStates(Event a) {
List<ResourceState> from = s_fsm.getFromStates(this, a);
return from.toArray(new ResourceState[from.size()]);
}
public Set<Event> getPossibleEvents() {
return s_fsm.getPossibleEvents(this);
}
public static String[] toString(ResourceState... states) {
String[] strs = new String[states.length];
for (int i=0; i<states.length; i++) {
strs[i] = states[i].toString();
}
return strs;
}
protected static final StateMachine<ResourceState, Event> s_fsm = new StateMachine<ResourceState, Event>();
static {
s_fsm.addTransition(null, Event.InternalCreated, ResourceState.Enabled);
s_fsm.addTransition(ResourceState.Creating, Event.InternalCreated, ResourceState.Enabled);
s_fsm.addTransition(ResourceState.Creating, Event.Unmanaged, ResourceState.Enabled);
s_fsm.addTransition(ResourceState.Creating, Event.Error, ResourceState.Error);
s_fsm.addTransition(ResourceState.Enabled, Event.Enable, ResourceState.Enabled);
s_fsm.addTransition(ResourceState.Enabled, Event.InternalCreated, ResourceState.Enabled);
s_fsm.addTransition(ResourceState.Enabled, Event.Disable, ResourceState.Disabled);
s_fsm.addTransition(ResourceState.Enabled, Event.Unmanaged, ResourceState.Unmanaged);
s_fsm.addTransition(ResourceState.Enabled, Event.AdminAskMaintenace, ResourceState.PrepareForMaintenance);
//s_fsm.addTransition(ResourceState.Enabled, Event.Error, ResourceState.Error);
s_fsm.addTransition(ResourceState.Disabled, Event.Enable, ResourceState.Enabled);
s_fsm.addTransition(ResourceState.Disabled, Event.Disable, ResourceState.Disabled);
s_fsm.addTransition(ResourceState.Disabled, Event.InternalCreated, ResourceState.Disabled);
s_fsm.addTransition(ResourceState.Disabled, Event.Unmanaged, ResourceState.Unmanaged);
//s_fsm.addTransition(ResourceState.Disabled, Event.Error, ResourceState.Error);
s_fsm.addTransition(ResourceState.Unmanaged, Event.Unmanaged, ResourceState.Unmanaged);
s_fsm.addTransition(ResourceState.Unmanaged, Event.InternalCreated, ResourceState.Unmanaged);
//s_fsm.addTransition(ResourceState.Unmanaged, Event.Error, ResourceState.Error);
s_fsm.addTransition(ResourceState.PrepareForMaintenance, Event.InternalEnterMaintenance, ResourceState.Maintenance);
s_fsm.addTransition(ResourceState.PrepareForMaintenance, Event.AdminCancelMaintenance, ResourceState.Enabled);
s_fsm.addTransition(ResourceState.PrepareForMaintenance, Event.Unmanaged, ResourceState.Unmanaged);
//s_fsm.addTransition(ResourceState.PrepareForMaintenance, Event.Error, ResourceState.Error);
s_fsm.addTransition(ResourceState.PrepareForMaintenance, Event.UnableToMigrate, ResourceState.ErrorInMaintenance);
s_fsm.addTransition(ResourceState.PrepareForMaintenance, Event.InternalCreated, ResourceState.PrepareForMaintenance);
s_fsm.addTransition(ResourceState.Maintenance, Event.AdminCancelMaintenance, ResourceState.Enabled);
s_fsm.addTransition(ResourceState.Maintenance, Event.InternalCreated, ResourceState.Maintenance);
s_fsm.addTransition(ResourceState.Maintenance, Event.DeleteHost, ResourceState.Disabled);
s_fsm.addTransition(ResourceState.Maintenance, Event.Unmanaged, ResourceState.Unmanaged);
//s_fsm.addTransition(ResourceState.Maintenance, Event.Error, ResourceState.Error);
s_fsm.addTransition(ResourceState.ErrorInMaintenance, Event.Unmanaged, ResourceState.Unmanaged);
s_fsm.addTransition(ResourceState.ErrorInMaintenance, Event.InternalCreated, ResourceState.ErrorInMaintenance);
s_fsm.addTransition(ResourceState.ErrorInMaintenance, Event.Disable, ResourceState.Disabled);
s_fsm.addTransition(ResourceState.ErrorInMaintenance, Event.DeleteHost, ResourceState.Disabled);
s_fsm.addTransition(ResourceState.ErrorInMaintenance, Event.InternalEnterMaintenance, ResourceState.Maintenance);
//s_fsm.addTransition(ResourceState.ErrorInMaintenance, Event.Error, ResourceState.Error);
s_fsm.addTransition(ResourceState.Error, Event.InternalCreated, ResourceState.Error);
}
}

View File

@ -242,11 +242,11 @@
</target> </target>
<target name="deploydb-simulator"> <target name="deploydb-simulator">
<condition property="server-setup.file" value="override/server-setup.xml" else="server-setup.xml"> <condition property="server-setup.file" value="${setup.db.dir}/override/server-setup.xml" else="server-setup.xml">
<available file="${setup.db.dir}/override/server-setup.xml" /> <available file="${setup.db.dir}/override/server-setup.xml" />
</condition> </condition>
<condition property="templates.file" value="override/templates.sql" else="templates.sql" > <condition property="templates.file" value="${setup.db.dir}/override/templates.sql" else="templates.sql" >
<available file="${setup.db.dir}/override/templates.sql" /> <available file="${setup.db.dir}/override/templates.sql" />
</condition> </condition>
@ -362,11 +362,6 @@
<include name="**/${test}.java"/> <include name="**/${test}.java"/>
</fileset> </fileset>
</batchtest> </batchtest>
<junitreport todir="${unittest.dir}">
<fileset dir="${unittest.dir}"/>
<report todir="${unittest.dir}/test-reports"/>
</junitreport>
<fail if="junit.failure" message="Unit test(s) failed. See reports!"/>
</junit> </junit>
<junitreport todir="${unittest.dir}"> <junitreport todir="${unittest.dir}">
<fileset dir="${unittest.dir}"/> <fileset dir="${unittest.dir}"/>

61
core/src/com/cloud/host/HostVO.java Normal file → Executable file
View File

@ -38,6 +38,7 @@ import javax.persistence.TemporalType;
import javax.persistence.Transient; import javax.persistence.Transient;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.resource.ResourceState;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.utils.NumbersUtil; import com.cloud.utils.NumbersUtil;
import com.cloud.utils.db.GenericDao; import com.cloud.utils.db.GenericDao;
@ -127,13 +128,16 @@ public class HostVO implements Host {
@Column(name="setup") @Column(name="setup")
private boolean setup = false; private boolean setup = false;
@Column(name="allocation_state", nullable=false) @Column(name="resource_state", nullable=false)
@Enumerated(value=EnumType.STRING) @Enumerated(value=EnumType.STRING)
private HostAllocationState hostAllocationState; private ResourceState resourceState;
@Column(name="hypervisor_version") @Column(name="hypervisor_version")
private String hypervisorVersion; private String hypervisorVersion;
@Column(name="update_count", updatable = true, nullable=false)
protected long updated; // This field should be updated everytime the state is updated. There's no set method in the vo object because it is done with in the dao code.
// This is a delayed load value. If the value is null, // This is a delayed load value. If the value is null,
// then this field has not been loaded yet. // then this field has not been loaded yet.
// Call host dao to load it. // Call host dao to load it.
@ -356,10 +360,10 @@ public class HostVO implements Host {
public HostVO(String guid) { public HostVO(String guid) {
this.guid = guid; this.guid = guid;
this.status = Status.Up; this.status = Status.Creating;
this.totalMemory = 0; this.totalMemory = 0;
this.dom0MinMemory = 0; this.dom0MinMemory = 0;
this.hostAllocationState = Host.HostAllocationState.Enabled; this.resourceState = ResourceState.Creating;
} }
protected HostVO() { protected HostVO() {
@ -396,7 +400,6 @@ public class HostVO implements Host {
this.parent = parent; this.parent = parent;
this.totalSize = totalSize; this.totalSize = totalSize;
this.fsType = fsType; this.fsType = fsType;
this.hostAllocationState = Host.HostAllocationState.Enabled;
} }
public HostVO(long id, public HostVO(long id,
@ -454,7 +457,6 @@ public class HostVO implements Host {
this.disconnectedOn = disconnectedOn; this.disconnectedOn = disconnectedOn;
this.dom0MinMemory = dom0MinMemory; this.dom0MinMemory = dom0MinMemory;
this.storageUrl = url; this.storageUrl = url;
this.hostAllocationState = Host.HostAllocationState.Enabled;
} }
public void setPodId(Long podId) { public void setPodId(Long podId) {
@ -671,16 +673,6 @@ public class HostVO implements Host {
return hypervisorType; return hypervisorType;
} }
@Override
public HostAllocationState getHostAllocationState() {
return hostAllocationState;
}
public void setHostAllocationState(HostAllocationState hostAllocationState) {
this.hostAllocationState = hostAllocationState;
}
public void setHypervisorVersion(String hypervisorVersion) { public void setHypervisorVersion(String hypervisorVersion) {
this.hypervisorVersion = hypervisorVersion; this.hypervisorVersion = hypervisorVersion;
} }
@ -689,4 +681,41 @@ public class HostVO implements Host {
public String getHypervisorVersion() { public String getHypervisorVersion() {
return hypervisorVersion; return hypervisorVersion;
} }
@Override
@Transient
public Status getState() {
return status;
}
//FIXME: change the upper interface
@Override
public Long getHostId() {
// TODO Auto-generated method stub
return null;
}
@Override
public ResourceState getResourceState() {
return resourceState;
}
public void setResourceState(ResourceState state) {
resourceState = state;
}
@Override
public boolean isInMaintenanceStates() {
return (getResourceState() == ResourceState.Maintenance || getResourceState() == ResourceState.ErrorInMaintenance
|| getResourceState() == ResourceState.PrepareForMaintenance);
}
public long getUpdated() {
return updated;
}
public long incrUpdated() {
updated++;
return updated;
}
} }

View File

@ -0,0 +1,11 @@
package com.cloud.resource;
import com.cloud.utils.SerialVersionUID;
public class UnableDeleteHostException extends Exception {
private static final long serialVersionUID = SerialVersionUID.UnableDeleteHostException;
public UnableDeleteHostException(String msg) {
super(msg);
}
}

View File

@ -15,6 +15,8 @@ import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException; import org.apache.xmlrpc.XmlRpcException;
import com.cloud.configuration.Config; import com.cloud.configuration.Config;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupRoutingCommand;
import com.cloud.dc.ClusterVO; import com.cloud.dc.ClusterVO;
import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.ClusterDao;
import com.cloud.exception.DiscoveryException; import com.cloud.exception.DiscoveryException;
@ -25,19 +27,23 @@ import com.cloud.ovm.object.Connection;
import com.cloud.ovm.object.OvmHost; import com.cloud.ovm.object.OvmHost;
import com.cloud.resource.Discoverer; import com.cloud.resource.Discoverer;
import com.cloud.resource.DiscovererBase; import com.cloud.resource.DiscovererBase;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceStateAdapter;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.ssh.SSHCmdHelper; import com.cloud.utils.ssh.SSHCmdHelper;
@Local(value=Discoverer.class) @Local(value=Discoverer.class)
public class OvmDiscoverer extends DiscovererBase implements Discoverer { public class OvmDiscoverer extends DiscovererBase implements Discoverer, ResourceStateAdapter {
private static final Logger s_logger = Logger.getLogger(OvmDiscoverer.class); private static final Logger s_logger = Logger.getLogger(OvmDiscoverer.class);
protected String _publicNetworkDevice; protected String _publicNetworkDevice;
protected String _privateNetworkDevice; protected String _privateNetworkDevice;
protected String _guestNetworkDevice; protected String _guestNetworkDevice;
@Inject ClusterDao _clusterDao; @Inject ClusterDao _clusterDao;
@Inject ResourceManager _resourceMgr;
@Override @Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
@ -51,6 +57,18 @@ public class OvmDiscoverer extends DiscovererBase implements Discoverer {
protected OvmDiscoverer() { protected OvmDiscoverer() {
} }
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
return super.configure(name, params);
}
@Override
public boolean stop() {
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return super.stop();
}
@Override @Override
public Map<? extends ServerResource, Map<String, String>> find(long dcId, public Map<? extends ServerResource, Map<String, String>> find(long dcId,
Long podId, Long clusterId, URI url, String username, Long podId, Long clusterId, URI url, String username,
@ -184,4 +202,32 @@ public class OvmDiscoverer extends DiscovererBase implements Discoverer {
return HypervisorType.Ovm; return HypervisorType.Ovm;
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
// TODO Auto-generated method stub
return null;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
List<String> hostTags) {
StartupCommand firstCmd = startup[0];
if (!(firstCmd instanceof StartupRoutingCommand)) {
return null;
}
StartupRoutingCommand ssCmd = ((StartupRoutingCommand) firstCmd);
if (ssCmd.getHypervisorType() != HypervisorType.Ovm) {
return null;
}
return _resourceMgr.fillRoutingHostVO(host, ssCmd, HypervisorType.Ovm, details, hostTags);
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
// TODO Auto-generated method stub
return null;
}
} }

1
server/.classpath Normal file → Executable file
View File

@ -10,5 +10,6 @@
<classpathentry combineaccessrules="false" kind="src" path="/tools"/> <classpathentry combineaccessrules="false" kind="src" path="/tools"/>
<classpathentry combineaccessrules="false" kind="src" path="/vmware-base"/> <classpathentry combineaccessrules="false" kind="src" path="/vmware-base"/>
<classpathentry combineaccessrules="false" kind="src" path="/agent"/> <classpathentry combineaccessrules="false" kind="src" path="/agent"/>
<classpathentry combineaccessrules="false" kind="src" path="/agent-simulator"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

View File

@ -23,6 +23,7 @@ import java.util.Set;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.manager.AgentAttache; import com.cloud.agent.manager.AgentAttache;
import com.cloud.agent.manager.Commands; import com.cloud.agent.manager.Commands;
import com.cloud.api.commands.UpdateHostPasswordCmd; import com.cloud.api.commands.UpdateHostPasswordCmd;
@ -30,6 +31,7 @@ import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO; import com.cloud.dc.HostPodVO;
import com.cloud.dc.PodCluster; import com.cloud.dc.PodCluster;
import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConnectionException;
import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.OperationTimedoutException;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.Host.Type; import com.cloud.host.Host.Type;
@ -53,6 +55,12 @@ public interface AgentManager extends Manager {
Continue, Stop Continue, Stop
} }
public enum TapAgentsAction {
Add,
Del,
Contains,
}
/** /**
* easy send method that returns null if there's any errors. It handles all exceptions. * easy send method that returns null if there's any errors. It handles all exceptions.
* *
@ -157,26 +165,6 @@ public interface AgentManager extends Manager {
*/ */
Set<Long> getConnectedHosts(); Set<Long> getConnectedHosts();
/**
* Disconnect the agent.
*
* @param hostId
* host to disconnect.
* @param reason
* the reason why we're disconnecting.
*
*/
void disconnect(long hostId, Status.Event event, boolean investigate);
/**
* Obtains statistics for a host; vCPU utilisation, memory utilisation, and network utilisation
*
* @param hostId
* @return HostStat
*/
boolean disconnect(long hostId);
HostStats getHostStatistics(long hostId); HostStats getHostStatistics(long hostId);
Long getGuestOSCategoryId(long hostId); Long getGuestOSCategoryId(long hostId);
@ -187,29 +175,6 @@ public interface AgentManager extends Manager {
List<PodCluster> listByPod(long podId); List<PodCluster> listByPod(long podId);
/**
* Adds a new host
*
* @param zoneId
* @param resource
* @param hostType
* @param hostDetails
* @return new Host
*/
public Host addHost(long zoneId, ServerResource resource, Type hostType, Map<String, String> hostDetails);
/**
* Deletes a host
*
* @param hostId
* @param isForced
* TODO
* @param caller
* TODO
* @param true if deleted, false otherwise
*/
boolean deleteHost(long hostId, boolean isForced, boolean forceDestroy, User caller);
/** /**
* Find a pod based on the user id, template, and data center. * Find a pod based on the user id, template, and data center.
* *
@ -220,46 +185,38 @@ public interface AgentManager extends Manager {
*/ */
Pair<HostPodVO, Long> findPod(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long userId, Set<Long> avoids); Pair<HostPodVO, Long> findPod(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long userId, Set<Long> avoids);
/**
* Put the agent in maintenance mode.
*
* @param hostId
* id of the host to put in maintenance mode.
* @return true if it was able to put the agent into maintenance mode. false if not.
*/
boolean maintain(long hostId) throws AgentUnavailableException;
boolean maintenanceFailed(long hostId);
/**
* Cancel the maintenance mode.
*
* @param hostId
* host id
* @return true if it's done. false if not.
*/
boolean cancelMaintenance(long hostId);
public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException; public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException;
public boolean reconnect(final long hostId) throws AgentUnavailableException;
boolean isHostNativeHAEnabled(long hostId); boolean isHostNativeHAEnabled(long hostId);
Answer sendTo(Long dcId, HypervisorType type, Command cmd); Answer sendTo(Long dcId, HypervisorType type, Command cmd);
void notifyAnswersToMonitors(long agentId, long seq, Answer[] answers); void notifyAnswersToMonitors(long agentId, long seq, Answer[] answers);
AgentAttache simulateStart(Long id, ServerResource resource, Map<String, String> details, boolean old, List<String> hostTags, String allocationState, boolean forRebalance) throws IllegalArgumentException;
boolean updateHostPassword(UpdateHostPasswordCmd upasscmd);
long sendToSecStorage(HostVO ssHost, Command cmd, Listener listener); long sendToSecStorage(HostVO ssHost, Command cmd, Listener listener);
Answer sendToSecStorage(HostVO ssHost, Command cmd); Answer sendToSecStorage(HostVO ssHost, Command cmd);
HostVO getSSAgent(HostVO ssHost); HostVO getSSAgent(HostVO ssHost);
void updateStatus(HostVO host, Event event); /* working as a lock while agent is being loaded */
public boolean tapLoadingAgents(Long hostId, TapAgentsAction action);
public AgentAttache handleDirectConnectAgent(HostVO host, StartupCommand[] cmds, ServerResource resource, boolean forRebalance) throws ConnectionException;
public boolean agentStatusTransitTo(HostVO host, Status.Event e, long msId);
public AgentAttache findAttache(long hostId);
void disconnectWithoutInvestigation(long hostId, Status.Event event);
void disconnectWithInvestigation(long hostId, Status.Event event);
public boolean disconnectAgent(HostVO host, Status.Event e, long msId);
public void pullAgentToMaintenance(long hostId);
public void pullAgentOutMaintenance(long hostId);
boolean reconnect(long hostId);
} }

File diff suppressed because it is too large Load Diff

View File

@ -42,15 +42,21 @@ import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.Status.Event; import com.cloud.host.Status.Event;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceState;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.db.ConnectionConcierge; import com.cloud.utils.db.ConnectionConcierge;
import com.cloud.utils.db.DB; import com.cloud.utils.db.DB;
import com.cloud.utils.db.SearchCriteria2;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.SearchCriteriaService;
import com.cloud.utils.time.InaccurateClock; import com.cloud.utils.time.InaccurateClock;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.dao.VMInstanceDao; import com.cloud.vm.dao.VMInstanceDao;
public class AgentMonitor extends Thread implements Listener { public class AgentMonitor extends Thread implements Listener {
private static Logger s_logger = Logger.getLogger(AgentMonitor.class); private static Logger s_logger = Logger.getLogger(AgentMonitor.class);
private static Logger status_Logger = Logger.getLogger(Status.class);
private long _pingTimeout; private long _pingTimeout;
private HostDao _hostDao; private HostDao _hostDao;
private boolean _stop; private boolean _stop;
@ -63,6 +69,9 @@ public class AgentMonitor extends Thread implements Listener {
private ConnectionConcierge _concierge; private ConnectionConcierge _concierge;
@Inject @Inject
ClusterDao _clusterDao; ClusterDao _clusterDao;
@Inject
ResourceManager _resourceMgr;
// private ConnectionConcierge _concierge; // private ConnectionConcierge _concierge;
private Map<Long, Long> _pingMap; private Map<Long, Long> _pingMap;
@ -130,13 +139,26 @@ public class AgentMonitor extends Thread implements Listener {
} }
try { try {
List<Long> behindAgents = findAgentsBehindOnPing(); List<Long> behindAgents = findAgentsBehindOnPing();
for (Long agentId : behindAgents) { for (Long agentId : behindAgents) {
_agentMgr.disconnect(agentId, Event.PingTimeout, true); SearchCriteriaService<HostVO, ResourceState> sc = SearchCriteria2.create(HostVO.class, ResourceState.class);
sc.selectField(sc.getEntity().getResourceState());
sc.addAnd(sc.getEntity().getId(), Op.EQ, agentId);
ResourceState resourceState = sc.find();
if (resourceState == ResourceState.Disabled || resourceState == ResourceState.Maintenance || resourceState == ResourceState.Unmanaged || resourceState == ResourceState.ErrorInMaintenance) {
/* Host is in non-operation state, so no investigation and direct put agent to Disconnected */
status_Logger.debug("Ping timeout but host " + agentId + " is in resource state of " + resourceState + ", so no investigation");
_agentMgr.disconnectWithoutInvestigation(agentId, Event.ShutdownRequested);
} else {
status_Logger.debug("Ping timeout for host " + agentId + ", do invstigation");
_agentMgr.disconnectWithInvestigation(agentId, Event.PingTimeout);
}
} }
List<HostVO> hosts = _hostDao.listByStatus(Status.PrepareForMaintenance, Status.ErrorInMaintenance); SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getResourceState(), Op.IN, ResourceState.PrepareForMaintenance, ResourceState.ErrorInMaintenance);
List<HostVO> hosts = sc.list();
for (HostVO host : hosts) { for (HostVO host : hosts) {
long hostId = host.getId(); long hostId = host.getId();
DataCenterVO dcVO = _dcDao.findById(host.getDataCenterId()); DataCenterVO dcVO = _dcDao.findById(host.getDataCenterId());
@ -148,7 +170,7 @@ public class AgentMonitor extends Thread implements Listener {
List<VMInstanceVO> vosMigrating = _vmDao.listVmsMigratingFromHost(hostId); List<VMInstanceVO> vosMigrating = _vmDao.listVmsMigratingFromHost(hostId);
if (vos.isEmpty() && vosMigrating.isEmpty()) { if (vos.isEmpty() && vosMigrating.isEmpty()) {
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, host.getDataCenterId(), host.getPodId(), "Migration Complete for host " + hostDesc, "Host [" + hostDesc + "] is ready for maintenance"); _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, host.getDataCenterId(), host.getPodId(), "Migration Complete for host " + hostDesc, "Host [" + hostDesc + "] is ready for maintenance");
_hostDao.updateStatus(host, Event.PreparationComplete, _msId); _resourceMgr.resourceStateTransitTo(host, ResourceState.Event.InternalEnterMaintenance, _msId);
} }
} }
} }
@ -227,7 +249,7 @@ public class AgentMonitor extends Thread implements Listener {
s_logger.info("Asking agent mgr to investgate why host " + host.getId() + s_logger.info("Asking agent mgr to investgate why host " + host.getId() +
" is behind on ping. last ping time: " + host.getLastPinged()); " is behind on ping. last ping time: " + host.getLastPinged());
} }
_agentMgr.disconnect(host.getId(), Event.PingTimeout, true); _agentMgr.disconnectWithInvestigation(host.getId(), Event.PingTimeout);
} }
} }

View File

@ -58,6 +58,7 @@ import com.cloud.configuration.Config;
import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.OperationTimedoutException;
import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.Status.Event; import com.cloud.host.Status.Event;
@ -71,7 +72,10 @@ import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB; import com.cloud.utils.db.DB;
import com.cloud.utils.db.SearchCriteria2;
import com.cloud.utils.db.SearchCriteriaService;
import com.cloud.utils.db.Transaction; import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.nio.Link; import com.cloud.utils.nio.Link;
import com.cloud.utils.nio.Task; import com.cloud.utils.nio.Task;
@ -103,6 +107,9 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
@Inject(adapter = AgentLoadBalancerPlanner.class) @Inject(adapter = AgentLoadBalancerPlanner.class)
protected Adapters<AgentLoadBalancerPlanner> _lbPlanners; protected Adapters<AgentLoadBalancerPlanner> _lbPlanners;
@Inject
protected AgentManager _agentMgr;
protected ClusteredAgentManagerImpl() { protected ClusteredAgentManagerImpl() {
super(); super();
} }
@ -206,35 +213,6 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
return new ClusteredAgentHandler(type, link, data); return new ClusteredAgentHandler(type, link, data);
} }
@Override
public boolean cancelMaintenance(final long hostId) {
try {
Boolean result = _clusterMgr.propagateAgentEvent(hostId, Event.ResetRequested);
if (result != null) {
return result;
}
} catch (AgentUnavailableException e) {
return false;
}
return super.cancelMaintenance(hostId);
}
@Override
public boolean disconnect(final long hostId) {
try {
Boolean result = _clusterMgr.propagateAgentEvent(hostId, Event.PrepareUnmanaged);
if (result != null) {
return result;
}
} catch (AgentUnavailableException e) {
return false;
}
return super.disconnect(hostId);
}
protected AgentAttache createAttache(long id) { protected AgentAttache createAttache(long id) {
s_logger.debug("create forwarding ClusteredAgentAttache for " + id); s_logger.debug("create forwarding ClusteredAgentAttache for " + id);
final AgentAttache attache = new ClusteredAgentAttache(this, id); final AgentAttache attache = new ClusteredAgentAttache(this, id);
@ -250,15 +228,14 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
} }
@Override @Override
protected AgentAttache createAttache(long id, HostVO server, Link link) { protected AgentAttache createAttacheForConnect(HostVO host, Link link) {
s_logger.debug("create ClusteredAgentAttache for " + id); s_logger.debug("create ClusteredAgentAttache for " + host.getId());
final AgentAttache attache = new ClusteredAgentAttache(this, id, link, server.getStatus() == Status.Maintenance || server.getStatus() == Status.ErrorInMaintenance final AgentAttache attache = new ClusteredAgentAttache(this, host.getId(), link, host.isInMaintenanceStates());
|| server.getStatus() == Status.PrepareForMaintenance);
link.attach(attache); link.attach(attache);
AgentAttache old = null; AgentAttache old = null;
synchronized (_agents) { synchronized (_agents) {
old = _agents.get(id); old = _agents.get(host.getId());
_agents.put(id, attache); _agents.put(host.getId(), attache);
} }
if (old != null) { if (old != null) {
old.disconnect(Status.Removed); old.disconnect(Status.Removed);
@ -267,17 +244,16 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
} }
@Override @Override
protected AgentAttache createAttache(long id, HostVO server, ServerResource resource) { protected AgentAttache createAttacheForDirectConnect(HostVO host, ServerResource resource) {
if (resource instanceof DummySecondaryStorageResource) { if (resource instanceof DummySecondaryStorageResource) {
return new DummyAttache(this, id, false); return new DummyAttache(this, host.getId(), false);
} }
s_logger.debug("create ClusteredDirectAgentAttache for " + id); s_logger.debug("create ClusteredDirectAgentAttache for " + host.getId());
final DirectAgentAttache attache = new ClusteredDirectAgentAttache(this, id, _nodeId, resource, server.getStatus() == Status.Maintenance || server.getStatus() == Status.ErrorInMaintenance final DirectAgentAttache attache = new ClusteredDirectAgentAttache(this, host.getId(), _nodeId, resource, host.isInMaintenanceStates(), this);
|| server.getStatus() == Status.PrepareForMaintenance, this);
AgentAttache old = null; AgentAttache old = null;
synchronized (_agents) { synchronized (_agents) {
old = _agents.get(id); old = _agents.get(host.getId());
_agents.put(id, attache); _agents.put(host.getId(), attache);
} }
if (old != null) { if (old != null) {
old.disconnect(Status.Removed); old.disconnect(Status.Removed);
@ -286,16 +262,24 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
} }
@Override @Override
protected boolean handleDisconnect(AgentAttache attache, Status.Event event, boolean investigate) { protected boolean handleDisconnectWithoutInvestigation(AgentAttache attache, Status.Event event) {
return handleDisconnect(attache, event, investigate, true); return handleDisconnect(attache, event, false, true);
}
@Override
protected boolean handleDisconnectWithInvestigation(AgentAttache attache, Status.Event event) {
return handleDisconnect(attache, event, true, true);
} }
protected boolean handleDisconnect(AgentAttache agent, Status.Event event, boolean investigate, boolean broadcast) { protected boolean handleDisconnect(AgentAttache agent, Status.Event event, boolean investigate, boolean broadcast) {
if (agent == null) { boolean res;
return true; if (!investigate) {
res = super.handleDisconnectWithoutInvestigation(agent, event);
} else {
res = super.handleDisconnectWithInvestigation(agent, event);
} }
if (super.handleDisconnect(agent, event, investigate)) { if (res) {
if (broadcast) { if (broadcast) {
notifyNodesInCluster(agent); notifyNodesInCluster(agent);
} }
@ -323,65 +307,19 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
} }
@Override @Override
public boolean maintain(final long hostId) throws AgentUnavailableException { public boolean reconnect(final long hostId) {
Boolean result = _clusterMgr.propagateAgentEvent(hostId, Event.MaintenanceRequested); Boolean result;
if (result != null) {
return result;
}
return super.maintain(hostId);
}
@Override
public boolean reconnect(final long hostId) throws AgentUnavailableException {
Boolean result = _clusterMgr.propagateAgentEvent(hostId, Event.ShutdownRequested);
if (result != null) {
return result;
}
return super.reconnect(hostId);
}
@Override
@DB
public boolean deleteHost(long hostId, boolean isForced, boolean forceDestroy, User caller) {
try { try {
Boolean result = _clusterMgr.propagateAgentEvent(hostId, Event.Remove); result = _clusterMgr.propagateAgentEvent(hostId, Event.ShutdownRequested);
if (result != null) { if (result != null) {
return result; return result;
} }
} catch (AgentUnavailableException e) { } catch (AgentUnavailableException e) {
s_logger.debug("cannot propagate agent reconnect because agent is not available", e);
return false; return false;
} }
return super.deleteHost(hostId, isForced, forceDestroy, caller); return super.reconnect(hostId);
}
@Override
public boolean updateHostPassword(UpdateHostPasswordCmd upasscmd) {
if (upasscmd.getClusterId() == null) {
// update agent attache password
try {
Boolean result = _clusterMgr.propagateAgentEvent(upasscmd.getHostId(), Event.UpdatePassword);
if (result != null) {
return result;
}
} catch (AgentUnavailableException e) {
}
} else {
// get agents for the cluster
List<HostVO> hosts = _hostDao.listByCluster(upasscmd.getClusterId());
for (HostVO h : hosts) {
try {
Boolean result = _clusterMgr.propagateAgentEvent(h.getId(), Event.UpdatePassword);
if (result != null) {
return result;
}
} catch (AgentUnavailableException e) {
}
}
}
return super.updateHostPassword(upasscmd);
} }
public void notifyNodesInCluster(AgentAttache attache) { public void notifyNodesInCluster(AgentAttache attache) {
@ -775,7 +713,10 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
public void startRebalanceAgents() { public void startRebalanceAgents() {
s_logger.debug("Management server " + _nodeId + " is asking other peers to rebalance their agents"); s_logger.debug("Management server " + _nodeId + " is asking other peers to rebalance their agents");
List<ManagementServerHostVO> allMS = _mshostDao.listBy(ManagementServerHost.State.Up); List<ManagementServerHostVO> allMS = _mshostDao.listBy(ManagementServerHost.State.Up);
List<HostVO> allManagedAgents = _hostDao.listManagedRoutingAgents(); SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getManagementServerId(), Op.NNULL);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.Routing);
List<HostVO> allManagedAgents = sc.list();
int avLoad = 0; int avLoad = 0;
@ -1087,7 +1028,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
s_logger.debug("Updating host id=" + hostId + " with the status " + Status.Rebalancing); s_logger.debug("Updating host id=" + hostId + " with the status " + Status.Rebalancing);
host.setManagementServerId(null); host.setManagementServerId(null);
_hostDao.updateStatus(host, Event.StartAgentRebalance, _nodeId); _agentMgr.agentStatusTransitTo(host, Event.StartAgentRebalance, _nodeId);
_hostTransferDao.startAgentTransfer(hostId); _hostTransferDao.startAgentTransfer(hostId);
txn.commit(); txn.commit();

View File

@ -143,7 +143,7 @@ public class DirectAgentAttache extends AgentAttache {
PingCommand cmd = resource.getCurrentStatus(_id); PingCommand cmd = resource.getCurrentStatus(_id);
if (cmd == null) { if (cmd == null) {
s_logger.warn("Unable to get current status on " + _id); s_logger.warn("Unable to get current status on " + _id);
_mgr.disconnect(DirectAgentAttache.this, Event.AgentDisconnected, true); _mgr.disconnectWithInvestigation(DirectAgentAttache.this, Event.AgentDisconnected);
return; return;
} }
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {

View File

@ -41,6 +41,7 @@ import com.cloud.host.dao.HostDetailsDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao; import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
import com.cloud.offering.ServiceOffering; import com.cloud.offering.ServiceOffering;
import com.cloud.resource.ResourceManager;
import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.GuestOSCategoryVO; import com.cloud.storage.GuestOSCategoryVO;
import com.cloud.storage.GuestOSVO; import com.cloud.storage.GuestOSVO;
@ -78,6 +79,7 @@ public class FirstFitAllocator implements HostAllocator {
@Inject GuestOSCategoryDao _guestOSCategoryDao = null; @Inject GuestOSCategoryDao _guestOSCategoryDao = null;
@Inject HypervisorCapabilitiesDao _hypervisorCapabilitiesDao = null; @Inject HypervisorCapabilitiesDao _hypervisorCapabilitiesDao = null;
@Inject VMInstanceDao _vmInstanceDao = null; @Inject VMInstanceDao _vmInstanceDao = null;
@Inject ResourceManager _resourceMgr;
float _factor = 1; float _factor = 1;
protected String _allocationAlgorithm = "random"; protected String _allocationAlgorithm = "random";
@Inject CapacityManager _capacityMgr; @Inject CapacityManager _capacityMgr;
@ -115,7 +117,7 @@ public class FirstFitAllocator implements HostAllocator {
List<HostVO> clusterHosts = new ArrayList<HostVO>(); List<HostVO> clusterHosts = new ArrayList<HostVO>();
if(hostTagOnOffering == null && hostTagOnTemplate == null){ if(hostTagOnOffering == null && hostTagOnTemplate == null){
clusterHosts = _hostDao.listBy(type, clusterId, podId, dcId); clusterHosts = _resourceMgr.listAllUpAndEnabledHosts(type, clusterId, podId, dcId);
}else{ }else{
List<HostVO> hostsMatchingOfferingTag = new ArrayList<HostVO>(); List<HostVO> hostsMatchingOfferingTag = new ArrayList<HostVO>();
List<HostVO> hostsMatchingTemplateTag = new ArrayList<HostVO>(); List<HostVO> hostsMatchingTemplateTag = new ArrayList<HostVO>();
@ -194,13 +196,6 @@ public class FirstFitAllocator implements HostAllocator {
continue; continue;
} }
if(host.getHostAllocationState() != Host.HostAllocationState.Enabled){
if (s_logger.isDebugEnabled()) {
s_logger.debug("Host name: " + host.getName() + ", hostId: "+ host.getId() +" is in " + host.getHostAllocationState().name() + " state, skipping this and trying other available hosts");
}
continue;
}
//find number of guest VMs occupying capacity on this host. //find number of guest VMs occupying capacity on this host.
Long vmCount = _vmInstanceDao.countRunningByHostId(host.getId()); Long vmCount = _vmInstanceDao.countRunningByHostId(host.getId());
Long maxGuestLimit = getHostMaxGuestLimit(host); Long maxGuestLimit = getHostMaxGuestLimit(host);

View File

@ -34,6 +34,7 @@ import com.cloud.host.Host.Type;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.offering.ServiceOffering; import com.cloud.offering.ServiceOffering;
import com.cloud.resource.ResourceManager;
import com.cloud.uservm.UserVm; import com.cloud.uservm.UserVm;
import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.ComponentLocator;
import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine;
@ -44,6 +45,7 @@ public class RandomAllocator implements HostAllocator {
private static final Logger s_logger = Logger.getLogger(RandomAllocator.class); private static final Logger s_logger = Logger.getLogger(RandomAllocator.class);
private String _name; private String _name;
private HostDao _hostDao; private HostDao _hostDao;
private ResourceManager _resourceMgr;
@Override @Override
public List<Host> allocateTo(VirtualMachineProfile<? extends VirtualMachine> vmProfile, DeploymentPlan plan, Type type, public List<Host> allocateTo(VirtualMachineProfile<? extends VirtualMachine> vmProfile, DeploymentPlan plan, Type type,
@ -78,7 +80,7 @@ public class RandomAllocator implements HostAllocator {
if(hostTag != null){ if(hostTag != null){
hosts = _hostDao.listByHostTag(type, clusterId, podId, dcId, hostTag); hosts = _hostDao.listByHostTag(type, clusterId, podId, dcId, hostTag);
}else{ }else{
hosts = _hostDao.listBy(type, clusterId, podId, dcId); hosts = _resourceMgr.listAllUpAndEnabledHosts(type, clusterId, podId, dcId);
} }
s_logger.debug("Random Allocator found " + hosts.size() + " hosts"); s_logger.debug("Random Allocator found " + hosts.size() + " hosts");
@ -94,13 +96,6 @@ public class RandomAllocator implements HostAllocator {
break; break;
} }
if(host.getHostAllocationState() != Host.HostAllocationState.Enabled){
if (s_logger.isDebugEnabled()) {
s_logger.debug("Host name: " + host.getName() + ", hostId: "+ host.getId() +" is in " + host.getHostAllocationState().name() + " state, skipping this and trying other available hosts");
}
continue;
}
if (!avoid.shouldAvoid(host)) { if (!avoid.shouldAvoid(host)) {
suitableHosts.add(host); suitableHosts.add(host);
}else{ }else{
@ -126,6 +121,7 @@ public class RandomAllocator implements HostAllocator {
public boolean configure(String name, Map<String, Object> params) { public boolean configure(String name, Map<String, Object> params) {
ComponentLocator locator = ComponentLocator.getCurrentLocator(); ComponentLocator locator = ComponentLocator.getCurrentLocator();
_hostDao = locator.getDao(HostDao.class); _hostDao = locator.getDao(HostDao.class);
_resourceMgr = locator.getManager(ResourceManager.class);
if (_hostDao == null) { if (_hostDao == null) {
s_logger.error("Unable to get host dao."); s_logger.error("Unable to get host dao.");
return false; return false;

View File

@ -590,7 +590,7 @@ public class ApiResponseHelper implements ResponseGenerator {
hostResponse.setEvents(events); hostResponse.setEvents(events);
} }
hostResponse.setAllocationState(host.getHostAllocationState().toString()); hostResponse.setAllocationState(host.getResourceState().toString());
hostResponse.setObjectName("host"); hostResponse.setObjectName("host");

View File

@ -27,14 +27,17 @@ import java.util.Map;
import java.util.UUID; import java.util.UUID;
import javax.ejb.Local; import javax.ejb.Local;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.api.StartupCommand;
import com.cloud.dc.ClusterVO; import com.cloud.dc.ClusterVO;
import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterDao;
import com.cloud.exception.DiscoveryException; import com.cloud.exception.DiscoveryException;
import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor;
@ -42,17 +45,37 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.network.Network; import com.cloud.network.Network;
import com.cloud.resource.Discoverer; import com.cloud.resource.Discoverer;
import com.cloud.resource.DiscovererBase; import com.cloud.resource.DiscovererBase;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceStateAdapter;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script; import com.cloud.utils.script.Script;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine.State;
import com.cloud.vm.dao.VMInstanceDao;
@Local(value=Discoverer.class) @Local(value=Discoverer.class)
public class BareMetalDiscoverer extends DiscovererBase implements Discoverer { public class BareMetalDiscoverer extends DiscovererBase implements Discoverer, ResourceStateAdapter {
private static final Logger s_logger = Logger.getLogger(BareMetalDiscoverer.class); private static final Logger s_logger = Logger.getLogger(BareMetalDiscoverer.class);
@Inject ClusterDao _clusterDao; @Inject ClusterDao _clusterDao;
@Inject protected HostDao _hostDao; @Inject protected HostDao _hostDao;
@Inject DataCenterDao _dcDao; @Inject DataCenterDao _dcDao;
@Inject VMInstanceDao _vmDao = null;
@Inject ResourceManager _resourceMgr;
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
return super.configure(name, params);
}
@Override
public boolean stop() {
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return super.stop();
}
@Override @Override
public Map<? extends ServerResource, Map<String, String>> find(long dcId, Long podId, Long clusterId, URI url, String username, String password, List<String> hostTags) public Map<? extends ServerResource, Map<String, String>> find(long dcId, Long podId, Long clusterId, URI url, String username, String password, List<String> hostTags)
@ -179,4 +202,34 @@ public class BareMetalDiscoverer extends DiscovererBase implements Discoverer {
return Hypervisor.HypervisorType.BareMetal; return Hypervisor.HypervisorType.BareMetal;
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
// TODO Auto-generated method stub
return null;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
List<String> hostTags) {
// TODO Auto-generated method stub
return null;
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
if (host.getType() != Host.Type.Routing || host.getHypervisorType() != HypervisorType.BareMetal) {
return null;
}
List<VMInstanceVO> deadVms = _vmDao.listByLastHostId(host.getId());
for (VMInstanceVO vm : deadVms) {
if (vm.getState() == State.Running || vm.getHostId() != null) {
throw new CloudRuntimeException("VM " + vm.getId() + "is still running on host " + host.getId());
}
_vmDao.remove(vm.getId());
}
return new DeleteHostAnswer(true);
}
} }

View File

@ -39,8 +39,10 @@ import com.cloud.deploy.DeployDestination;
import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.InvalidParameterValueException;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.uservm.UserVm; import com.cloud.uservm.UserVm;
import com.cloud.utils.component.Inject;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.NicProfile; import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO; import com.cloud.vm.NicVO;
@ -51,6 +53,7 @@ import com.cloud.vm.VirtualMachineProfile;
@Local(value=PxeServerService.class) @Local(value=PxeServerService.class)
public class BareMetalPingServiceImpl extends BareMetalPxeServiceBase implements PxeServerService { public class BareMetalPingServiceImpl extends BareMetalPxeServiceBase implements PxeServerService {
private static final Logger s_logger = Logger.getLogger(BareMetalPingServiceImpl.class); private static final Logger s_logger = Logger.getLogger(BareMetalPingServiceImpl.class);
@Inject ResourceManager _resourceMgr;
@Override @Override
public Host addPxeServer(PxeServerProfile profile) { public Host addPxeServer(PxeServerProfile profile) {
@ -62,7 +65,7 @@ public class BareMetalPingServiceImpl extends BareMetalPxeServiceBase implements
throw new InvalidParameterValueException("Could not find zone with ID: " + zoneId); throw new InvalidParameterValueException("Could not find zone with ID: " + zoneId);
} }
List<HostVO> pxeServers = _hostDao.listBy(Host.Type.PxeServer, null, podId, zoneId); List<HostVO> pxeServers = _resourceMgr.listAllUpAndEnabledHosts(Host.Type.PxeServer, null, podId, zoneId);
if (pxeServers.size() != 0) { if (pxeServers.size() != 0) {
throw new InvalidParameterValueException("Already had a PXE server in Pod: " + podId + " zone: " + zoneId); throw new InvalidParameterValueException("Already had a PXE server in Pod: " + podId + " zone: " + zoneId);
} }
@ -122,7 +125,7 @@ public class BareMetalPingServiceImpl extends BareMetalPxeServiceBase implements
throw new CloudRuntimeException("Unsupport PXE server type:" + profile.getType()); throw new CloudRuntimeException("Unsupport PXE server type:" + profile.getType());
} }
Host pxeServer = _agentMgr.addHost(zoneId, resource, Host.Type.PxeServer, params); Host pxeServer = _resourceMgr.addHost(zoneId, resource, Host.Type.PxeServer, params);
if (pxeServer == null) { if (pxeServer == null) {
throw new CloudRuntimeException("Cannot add PXE server as a host"); throw new CloudRuntimeException("Cannot add PXE server as a host");
} }

View File

@ -18,6 +18,7 @@ import com.cloud.exception.ResourceAllocationException;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.resource.ResourceManager;
import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
@ -34,6 +35,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
public class BareMetalTemplateAdapter extends TemplateAdapterBase implements TemplateAdapter { public class BareMetalTemplateAdapter extends TemplateAdapterBase implements TemplateAdapter {
private final static Logger s_logger = Logger.getLogger(BareMetalTemplateAdapter.class); private final static Logger s_logger = Logger.getLogger(BareMetalTemplateAdapter.class);
@Inject HostDao _hostDao; @Inject HostDao _hostDao;
@Inject ResourceManager _resourceMgr;
@Override @Override
public TemplateProfile prepare(RegisterTemplateCmd cmd) throws ResourceAllocationException { public TemplateProfile prepare(RegisterTemplateCmd cmd) throws ResourceAllocationException {
@ -43,13 +45,13 @@ public class BareMetalTemplateAdapter extends TemplateAdapterBase implements Tem
if (profile.getZoneId() == null || profile.getZoneId() == -1) { if (profile.getZoneId() == null || profile.getZoneId() == -1) {
List<DataCenterVO> dcs = _dcDao.listAllIncludingRemoved(); List<DataCenterVO> dcs = _dcDao.listAllIncludingRemoved();
for (DataCenterVO dc : dcs) { for (DataCenterVO dc : dcs) {
List<HostVO> pxeServers = _hostDao.listAllBy(Host.Type.PxeServer, dc.getId()); List<HostVO> pxeServers = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.PxeServer, dc.getId());
if (pxeServers.size() == 0) { if (pxeServers.size() == 0) {
throw new CloudRuntimeException("Please add PXE server before adding baremetal template in zone " + dc.getName()); throw new CloudRuntimeException("Please add PXE server before adding baremetal template in zone " + dc.getName());
} }
} }
} else { } else {
List<HostVO> pxeServers = _hostDao.listAllBy(Host.Type.PxeServer, profile.getZoneId()); List<HostVO> pxeServers = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.PxeServer, profile.getZoneId());
if (pxeServers.size() == 0) { if (pxeServers.size() == 0) {
throw new CloudRuntimeException("Please add PXE server before adding baremetal template in zone " + profile.getZoneId()); throw new CloudRuntimeException("Please add PXE server before adding baremetal template in zone " + profile.getZoneId());
} }
@ -86,7 +88,7 @@ public class BareMetalTemplateAdapter extends TemplateAdapterBase implements Tem
if (zoneId == null || zoneId == -1) { if (zoneId == null || zoneId == -1) {
List<DataCenterVO> dcs = _dcDao.listAllIncludingRemoved(); List<DataCenterVO> dcs = _dcDao.listAllIncludingRemoved();
for (DataCenterVO dc : dcs) { for (DataCenterVO dc : dcs) {
HostVO pxe = _hostDao.listAllBy(Host.Type.PxeServer, dc.getId()).get(0); HostVO pxe = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.PxeServer, dc.getId()).get(0);
vmTemplateHost = _tmpltHostDao.findByHostTemplate(dc.getId(), template.getId()); vmTemplateHost = _tmpltHostDao.findByHostTemplate(dc.getId(), template.getId());
if (vmTemplateHost == null) { if (vmTemplateHost == null) {
@ -97,7 +99,7 @@ public class BareMetalTemplateAdapter extends TemplateAdapterBase implements Tem
} }
} }
} else { } else {
HostVO pxe = _hostDao.listAllBy(Host.Type.PxeServer, zoneId).get(0); HostVO pxe = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.PxeServer, zoneId).get(0);
vmTemplateHost = new VMTemplateHostVO(pxe.getId(), template.getId(), new Date(), 100, vmTemplateHost = new VMTemplateHostVO(pxe.getId(), template.getId(), new Date(), 100,
Status.DOWNLOADED, null, null, null, null, template.getUrl()); Status.DOWNLOADED, null, null, null, null, template.getUrl());
_tmpltHostDao.persist(vmTemplateHost); _tmpltHostDao.persist(vmTemplateHost);

View File

@ -64,6 +64,7 @@ import com.cloud.network.Network;
import com.cloud.network.NetworkVO; import com.cloud.network.NetworkVO;
import com.cloud.network.Networks.TrafficType; import com.cloud.network.Networks.TrafficType;
import com.cloud.org.Grouping; import com.cloud.org.Grouping;
import com.cloud.resource.ResourceManager;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.storage.Storage; import com.cloud.storage.Storage;
import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.Storage.TemplateType;
@ -109,6 +110,7 @@ public class BareMetalVmManagerImpl extends UserVmManagerImpl implements BareMet
private static final Logger s_logger = Logger.getLogger(BareMetalVmManagerImpl.class); private static final Logger s_logger = Logger.getLogger(BareMetalVmManagerImpl.class);
private ConfigurationDao _configDao; private ConfigurationDao _configDao;
@Inject PxeServerManager _pxeMgr; @Inject PxeServerManager _pxeMgr;
@Inject ResourceManager _resourceMgr;
@Inject (adapter=TemplateAdapter.class) @Inject (adapter=TemplateAdapter.class)
protected Adapters<TemplateAdapter> _adapters; protected Adapters<TemplateAdapter> _adapters;
@ -161,7 +163,7 @@ public class BareMetalVmManagerImpl extends UserVmManagerImpl implements BareMet
throw new InvalidParameterValueException("Cannot find host with id " + hostId); throw new InvalidParameterValueException("Cannot find host with id " + hostId);
} }
List<HostVO> pxes = _hostDao.listBy(Host.Type.PxeServer, null, host.getPodId(), host.getDataCenterId()); List<HostVO> pxes = _resourceMgr.listAllUpAndEnabledHosts(Host.Type.PxeServer, null, host.getPodId(), host.getDataCenterId());
if (pxes.size() == 0) { if (pxes.size() == 0) {
throw new CloudRuntimeException("Please add PXE server in Pod before taking image"); throw new CloudRuntimeException("Please add PXE server in Pod before taking image");
} }
@ -400,7 +402,7 @@ public class BareMetalVmManagerImpl extends UserVmManagerImpl implements BareMet
long vmId = cmd.getEntityId(); long vmId = cmd.getEntityId();
UserVmVO vm = _vmDao.findById(vmId); UserVmVO vm = _vmDao.findById(vmId);
List<HostVO> servers = _hostDao.listBy(Host.Type.PxeServer, vm.getDataCenterIdToDeployIn()); List<HostVO> servers = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByType(Host.Type.PxeServer, vm.getDataCenterIdToDeployIn());
if (servers.size() == 0) { if (servers.size() == 0) {
throw new CloudRuntimeException("Cannot find PXE server, please make sure there is one PXE server per zone"); throw new CloudRuntimeException("Cannot find PXE server, please make sure there is one PXE server per zone");
} }
@ -469,7 +471,7 @@ public class BareMetalVmManagerImpl extends UserVmManagerImpl implements BareMet
} }
s_logger.debug("This is a PXE start, prepare PXE server first"); s_logger.debug("This is a PXE start, prepare PXE server first");
List<HostVO> servers = _hostDao.listBy(Host.Type.PxeServer, vm.getDataCenterIdToDeployIn()); List<HostVO> servers = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByType(Host.Type.PxeServer, dest.getDataCenter().getId());
if (servers.size() == 0) { if (servers.size() == 0) {
throw new CloudRuntimeException("Cannot find PXE server, please make sure there is one PXE server per zone"); throw new CloudRuntimeException("Cannot find PXE server, please make sure there is one PXE server per zone");
} }

View File

@ -39,6 +39,7 @@ import com.cloud.agent.api.AgentControlCommand;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupExternalDhcpCommand;
import com.cloud.agent.api.routing.DhcpEntryCommand; import com.cloud.agent.api.routing.DhcpEntryCommand;
import com.cloud.agent.manager.Commands; import com.cloud.agent.manager.Commands;
import com.cloud.baremetal.ExternalDhcpEntryListener.DhcpEntryState; import com.cloud.baremetal.ExternalDhcpEntryListener.DhcpEntryState;
@ -59,7 +60,10 @@ import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.network.Network; import com.cloud.network.Network;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceStateAdapter;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB; import com.cloud.utils.db.DB;
@ -73,7 +77,7 @@ import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.UserVmDao;
@Local(value = {ExternalDhcpManager.class}) @Local(value = {ExternalDhcpManager.class})
public class ExternalDhcpManagerImpl implements ExternalDhcpManager { public class ExternalDhcpManagerImpl implements ExternalDhcpManager, ResourceStateAdapter {
private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalDhcpManagerImpl.class); private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalDhcpManagerImpl.class);
protected String _name; protected String _name;
@Inject DataCenterDao _dcDao; @Inject DataCenterDao _dcDao;
@ -81,9 +85,11 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
@Inject AgentManager _agentMgr; @Inject AgentManager _agentMgr;
@Inject HostPodDao _podDao; @Inject HostPodDao _podDao;
@Inject UserVmDao _userVmDao; @Inject UserVmDao _userVmDao;
@Inject ResourceManager _resourceMgr;
@Override @Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
return true; return true;
} }
@ -94,6 +100,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
@Override @Override
public boolean stop() { public boolean stop() {
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return true; return true;
} }
@ -119,7 +126,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
throw new InvalidParameterValueException("Could not find pod with ID: " + podId); throw new InvalidParameterValueException("Could not find pod with ID: " + podId);
} }
List<HostVO> dhcps = _hostDao.listBy(Host.Type.ExternalDhcp, null, podId, zoneId); List<HostVO> dhcps = _resourceMgr.listAllUpAndEnabledHosts(Host.Type.ExternalDhcp, null, podId, zoneId);
if (dhcps.size() != 0) { if (dhcps.size() != 0) {
throw new InvalidParameterValueException("Already had a DHCP server in Pod: " + podId + " zone: " + zoneId); throw new InvalidParameterValueException("Already had a DHCP server in Pod: " + podId + " zone: " + zoneId);
} }
@ -159,7 +166,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
throw new CloudRuntimeException(e.getMessage()); throw new CloudRuntimeException(e.getMessage());
} }
Host dhcpServer = _agentMgr.addHost(zoneId, resource, Host.Type.ExternalDhcp, params); Host dhcpServer = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalDhcp, params);
if (dhcpServer == null) { if (dhcpServer == null) {
throw new CloudRuntimeException("Cannot add external Dhcp server as a host"); throw new CloudRuntimeException("Cannot add external Dhcp server as a host");
} }
@ -187,7 +194,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
return; return;
} }
List<HostVO> servers = _hostDao.listBy(Host.Type.PxeServer, null, vm.getPodIdToDeployIn(), vm.getDataCenterIdToDeployIn()); List<HostVO> servers = _resourceMgr.listAllUpAndEnabledHosts(Host.Type.PxeServer, null, vm.getPodIdToDeployIn(), vm.getDataCenterIdToDeployIn());
if (servers.size() != 1) { if (servers.size() != 1) {
throw new CloudRuntimeException("Wrong number of PXE server found in zone " + vm.getDataCenterIdToDeployIn() throw new CloudRuntimeException("Wrong number of PXE server found in zone " + vm.getDataCenterIdToDeployIn()
+ " Pod " + vm.getPodIdToDeployIn() + ", number is " + servers.size()); + " Pod " + vm.getPodIdToDeployIn() + ", number is " + servers.size());
@ -202,7 +209,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
ReservationContext context) throws ResourceUnavailableException { ReservationContext context) throws ResourceUnavailableException {
Long zoneId = profile.getVirtualMachine().getDataCenterIdToDeployIn(); Long zoneId = profile.getVirtualMachine().getDataCenterIdToDeployIn();
Long podId = profile.getVirtualMachine().getPodIdToDeployIn(); Long podId = profile.getVirtualMachine().getPodIdToDeployIn();
List<HostVO> hosts = _hostDao.listBy(Type.ExternalDhcp, null, podId, zoneId); List<HostVO> hosts = _resourceMgr.listAllUpAndEnabledHosts(Type.ExternalDhcp, null, podId, zoneId);
if (hosts.size() == 0) { if (hosts.size() == 0) {
throw new CloudRuntimeException("No external Dhcp found in zone " + zoneId + " pod " + podId); throw new CloudRuntimeException("No external Dhcp found in zone " + zoneId + " pod " + podId);
} }
@ -235,4 +242,27 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
throw new ResourceUnavailableException(errMsg + e.getMessage(), DataCenter.class, zoneId); throw new ResourceUnavailableException(errMsg + e.getMessage(), DataCenter.class, zoneId);
} }
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
// TODO Auto-generated method stub
return null;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
List<String> hostTags) {
if (!(startup[0] instanceof StartupExternalDhcpCommand)) {
return null;
}
host.setType(Host.Type.ExternalDhcp);
return host;
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
// TODO Auto-generated method stub
return null;
}
} }

View File

@ -20,6 +20,7 @@
package com.cloud.baremetal; package com.cloud.baremetal;
import java.util.List;
import java.util.Map; import java.util.Map;
import javax.ejb.Local; import javax.ejb.Local;
@ -27,12 +28,18 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager; import com.cloud.agent.AgentManager;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupPxeServerCommand;
import com.cloud.baremetal.PxeServerManager.PxeServerType; import com.cloud.baremetal.PxeServerManager.PxeServerType;
import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterDao;
import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeployDestination;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceStateAdapter;
import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.uservm.UserVm; import com.cloud.uservm.UserVm;
import com.cloud.utils.component.Adapters; import com.cloud.utils.component.Adapters;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
@ -43,20 +50,21 @@ import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.VirtualMachineProfile.Param; import com.cloud.vm.VirtualMachineProfile.Param;
@Local(value = {PxeServerManager.class}) @Local(value = {PxeServerManager.class})
public class PxeServerManagerImpl implements PxeServerManager { public class PxeServerManagerImpl implements PxeServerManager, ResourceStateAdapter {
private static final org.apache.log4j.Logger s_logger = Logger.getLogger(PxeServerManagerImpl.class); private static final org.apache.log4j.Logger s_logger = Logger.getLogger(PxeServerManagerImpl.class);
protected String _name; protected String _name;
@Inject DataCenterDao _dcDao; @Inject DataCenterDao _dcDao;
@Inject HostDao _hostDao; @Inject HostDao _hostDao;
@Inject AgentManager _agentMgr; @Inject AgentManager _agentMgr;
@Inject ExternalDhcpManager exDhcpMgr; @Inject ExternalDhcpManager exDhcpMgr;
@Inject ResourceManager _resourceMgr;
@Inject(adapter=PxeServerService.class) @Inject(adapter=PxeServerService.class)
protected Adapters<PxeServerService> _services; protected Adapters<PxeServerService> _services;
@Override @Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
_name = name; _name = name;
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
return true; return true;
} }
@ -67,6 +75,7 @@ public class PxeServerManagerImpl implements PxeServerManager {
@Override @Override
public boolean stop() { public boolean stop() {
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return true; return true;
} }
@ -115,4 +124,27 @@ public class PxeServerManagerImpl implements PxeServerManager {
throw new CloudRuntimeException("Unkown PXE server resource " + host.getResource()); throw new CloudRuntimeException("Unkown PXE server resource " + host.getResource());
} }
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
// TODO Auto-generated method stub
return null;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
List<String> hostTags) {
if (!(startup[0] instanceof StartupPxeServerCommand)) {
return null;
}
host.setType(Host.Type.PxeServer);
return host;
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
// TODO Auto-generated method stub
return null;
}
} }

View File

@ -44,6 +44,7 @@ import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.offering.ServiceOffering; import com.cloud.offering.ServiceOffering;
import com.cloud.resource.ResourceManager;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.utils.DateUtil; import com.cloud.utils.DateUtil;
@ -77,6 +78,8 @@ public class CapacityManagerImpl implements CapacityManager, StateListener<State
VMInstanceDao _vmDao; VMInstanceDao _vmDao;
@Inject @Inject
AgentManager _agentManager; AgentManager _agentManager;
@Inject
ResourceManager _resourceMgr;
private int _vmCapacityReleaseInterval; private int _vmCapacityReleaseInterval;
private ScheduledExecutorService _executor; private ScheduledExecutorService _executor;

3
server/src/com/cloud/cluster/ClusterManager.java Normal file → Executable file
View File

@ -24,6 +24,7 @@ import com.cloud.agent.api.Command;
import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.OperationTimedoutException;
import com.cloud.host.Status.Event; import com.cloud.host.Status.Event;
import com.cloud.resource.ResourceState;
import com.cloud.utils.component.Manager; import com.cloud.utils.component.Manager;
public interface ClusterManager extends Manager { public interface ClusterManager extends Manager {
@ -40,6 +41,8 @@ public interface ClusterManager extends Manager {
public long sendToAgent(Long hostId, Command[] cmds, boolean stopOnError, Listener listener) throws AgentUnavailableException; public long sendToAgent(Long hostId, Command[] cmds, boolean stopOnError, Listener listener) throws AgentUnavailableException;
public boolean executeAgentUserRequest(long agentId, Event event) throws AgentUnavailableException; public boolean executeAgentUserRequest(long agentId, Event event) throws AgentUnavailableException;
public Boolean propagateAgentEvent(long agentId, Event event) throws AgentUnavailableException; public Boolean propagateAgentEvent(long agentId, Event event) throws AgentUnavailableException;
public Boolean propagateResourceEvent(long agentId, ResourceState.Event event) throws AgentUnavailableException;
public boolean executeResourceUserRequest(long hostId, ResourceState.Event event) throws AgentUnavailableException;
public int getHeartbeatThreshold(); public int getHeartbeatThreshold();

49
server/src/com/cloud/cluster/ClusterManagerImpl.java Normal file → Executable file
View File

@ -49,6 +49,7 @@ import com.cloud.agent.Listener;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
import com.cloud.agent.api.ChangeAgentCommand; import com.cloud.agent.api.ChangeAgentCommand;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.agent.api.PropagateResourceEventCommand;
import com.cloud.agent.manager.Commands; import com.cloud.agent.manager.Commands;
import com.cloud.cluster.agentlb.dao.HostTransferMapDao; import com.cloud.cluster.agentlb.dao.HostTransferMapDao;
import com.cloud.cluster.dao.ManagementServerHostDao; import com.cloud.cluster.dao.ManagementServerHostDao;
@ -56,9 +57,12 @@ import com.cloud.configuration.Config;
import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.OperationTimedoutException;
import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status.Event; import com.cloud.host.Status.Event;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceState;
import com.cloud.serializer.GsonHelper; import com.cloud.serializer.GsonHelper;
import com.cloud.utils.DateUtil; import com.cloud.utils.DateUtil;
import com.cloud.utils.NumbersUtil; import com.cloud.utils.NumbersUtil;
@ -70,6 +74,9 @@ import com.cloud.utils.component.Inject;
import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.ConnectionConcierge; import com.cloud.utils.db.ConnectionConcierge;
import com.cloud.utils.db.DB; import com.cloud.utils.db.DB;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.SearchCriteria2;
import com.cloud.utils.db.SearchCriteriaService;
import com.cloud.utils.db.Transaction; import com.cloud.utils.db.Transaction;
import com.cloud.utils.events.SubscriptionMgr; import com.cloud.utils.events.SubscriptionMgr;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
@ -99,6 +106,8 @@ public class ClusterManagerImpl implements ClusterManager {
private AgentManager _agentMgr; private AgentManager _agentMgr;
@Inject @Inject
private ClusteredAgentRebalanceService _rebalanceService; private ClusteredAgentRebalanceService _rebalanceService;
@Inject
private ResourceManager _resourceMgr;
private final ScheduledExecutorService _heartbeatScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Cluster-Heartbeat")); private final ScheduledExecutorService _heartbeatScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Cluster-Heartbeat"));
private final ExecutorService _notificationExecutor = Executors.newFixedThreadPool(1, new NamedThreadFactory("Cluster-Notification")); private final ExecutorService _notificationExecutor = Executors.newFixedThreadPool(1, new NamedThreadFactory("Cluster-Notification"));
@ -614,8 +623,14 @@ public class ClusterManagerImpl implements ClusterManager {
//initiate agent lb task will be scheduled and executed only once, and only when number of agents loaded exceeds _connectedAgentsThreshold //initiate agent lb task will be scheduled and executed only once, and only when number of agents loaded exceeds _connectedAgentsThreshold
if (_agentLBEnabled && !_agentLbHappened) { if (_agentLBEnabled && !_agentLbHappened) {
List<HostVO> allManagedRoutingAgents = _hostDao.listManagedRoutingAgents(); SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
List<HostVO> allAgents = _hostDao.listAllRoutingAgents(); sc.addAnd(sc.getEntity().getManagementServerId(), Op.NNULL);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.Routing);
List<HostVO> allManagedRoutingAgents = sc.list();
sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.Routing);
List<HostVO> allAgents = sc.list();
double allHostsCount = allAgents.size(); double allHostsCount = allAgents.size();
double managedHostsCount = allManagedRoutingAgents.size(); double managedHostsCount = allManagedRoutingAgents.size();
if (allHostsCount > 0.0) { if (allHostsCount > 0.0) {
@ -1229,4 +1244,34 @@ public class ClusterManagerImpl implements ClusterManager {
public boolean isAgentRebalanceEnabled() { public boolean isAgentRebalanceEnabled() {
return _agentLBEnabled; return _agentLBEnabled;
} }
@Override
public Boolean propagateResourceEvent(long agentId, ResourceState.Event event) throws AgentUnavailableException {
final String msPeer = getPeerName(agentId);
if (msPeer == null) {
return null;
}
if (s_logger.isDebugEnabled()) {
s_logger.debug("Propagating agent change request event:" + event.toString() + " to agent:" + agentId);
}
Command[] cmds = new Command[1];
cmds[0] = new PropagateResourceEventCommand(agentId, event);
Answer[] answers = execute(msPeer, agentId, cmds, true);
if (answers == null) {
throw new AgentUnavailableException(agentId);
}
if (s_logger.isDebugEnabled()) {
s_logger.debug("Result for agent change is " + answers[0].getResult());
}
return answers[0].getResult();
}
@Override
public boolean executeResourceUserRequest(long hostId, ResourceState.Event event) throws AgentUnavailableException {
return _resourceMgr.executeUserRequest(hostId, event);
}
} }

View File

@ -38,6 +38,7 @@ import com.cloud.agent.api.Answer;
import com.cloud.agent.api.ChangeAgentAnswer; import com.cloud.agent.api.ChangeAgentAnswer;
import com.cloud.agent.api.ChangeAgentCommand; import com.cloud.agent.api.ChangeAgentCommand;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.agent.api.PropagateResourceEventCommand;
import com.cloud.agent.api.TransferAgentCommand; import com.cloud.agent.api.TransferAgentCommand;
import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.OperationTimedoutException;
@ -240,6 +241,27 @@ public class ClusterServiceServletHttpHandler implements HttpRequestHandler {
Answer[] answers = new Answer[1]; Answer[] answers = new Answer[1];
answers[0] = new Answer(cmd, result, null); answers[0] = new Answer(cmd, result, null);
return gson.toJson(answers); return gson.toJson(answers);
} else if (cmds.length == 1 && cmds[0] instanceof PropagateResourceEventCommand) {
PropagateResourceEventCommand cmd = (PropagateResourceEventCommand) cmds[0];
if (s_logger.isDebugEnabled()) {
s_logger.debug("Intercepting command for resource event: host " + cmd.getHostId() + " event: " + cmd.getEvent());
}
boolean result = false;
try {
result = manager.executeResourceUserRequest(cmd.getHostId(), cmd.getEvent());
if (s_logger.isDebugEnabled()) {
s_logger.debug("Result is " + result);
}
} catch (AgentUnavailableException e) {
s_logger.warn("Agent is unavailable", e);
return null;
}
Answer[] answers = new Answer[1];
answers[0] = new Answer(cmd, result, null);
return gson.toJson(answers);
} }
try { try {

View File

@ -175,4 +175,16 @@ public class DummyClusterManagerImpl implements ClusterManager {
public boolean isAgentRebalanceEnabled() { public boolean isAgentRebalanceEnabled() {
return false; return false;
} }
@Override
public Boolean propagateResourceEvent(long agentId, com.cloud.resource.ResourceState.Event event) throws AgentUnavailableException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean executeResourceUserRequest(long hostId, com.cloud.resource.ResourceState.Event event) throws AgentUnavailableException {
// TODO Auto-generated method stub
return false;
}
} }

View File

@ -30,10 +30,14 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.db.SearchCriteria2;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.SearchCriteriaService;
@Local(value=AgentLoadBalancerPlanner.class) @Local(value=AgentLoadBalancerPlanner.class)
@ -66,14 +70,21 @@ public class ClusterBasedAgentLoadBalancerPlanner implements AgentLoadBalancerPl
@Override @Override
public List<HostVO> getHostsToRebalance(long msId, int avLoad) { public List<HostVO> getHostsToRebalance(long msId, int avLoad) {
List<HostVO> allHosts = _hostDao.listRoutingHostsByManagementServer(msId); SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.Routing);
sc.addAnd(sc.getEntity().getManagementServerId(), Op.EQ, msId);
List<HostVO> allHosts = sc.list();
if (allHosts.size() <= avLoad) { if (allHosts.size() <= avLoad) {
s_logger.debug("Agent load = " + allHosts.size() + " for management server " + msId + " doesn't exceed average system agent load = " + avLoad + "; so it doesn't participate in agent rebalancing process"); s_logger.debug("Agent load = " + allHosts.size() + " for management server " + msId + " doesn't exceed average system agent load = " + avLoad + "; so it doesn't participate in agent rebalancing process");
return null; return null;
} }
List<HostVO> directHosts = _hostDao.listDirectHostsBy(msId, Status.Up); sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getManagementServerId(), Op.EQ, msId);
sc.addAnd(sc.getEntity().getStatus(), Op.EQ, Status.Up);
List<HostVO> directHosts = sc.list();
if (directHosts.isEmpty()) { if (directHosts.isEmpty()) {
s_logger.debug("No direct agents in status " + Status.Up + " exist for the management server " + msId + "; so it doesn't participate in agent rebalancing process"); s_logger.debug("No direct agents in status " + Status.Up + " exist for the management server " + msId + "; so it doesn't participate in agent rebalancing process");
return null; return null;

View File

View File

@ -24,6 +24,7 @@ import com.cloud.agent.api.ConsoleProxyLoadReportCommand;
import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupCommand;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.Host.Type;
import com.cloud.info.ConsoleProxyInfo; import com.cloud.info.ConsoleProxyInfo;
import com.cloud.utils.component.Manager; import com.cloud.utils.component.Manager;
import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.ConsoleProxyVO;
@ -58,5 +59,4 @@ public interface ConsoleProxyManager extends Manager {
public void onAgentConnect(HostVO host, StartupCommand cmd); public void onAgentConnect(HostVO host, StartupCommand cmd);
public void onAgentDisconnect(long agentId, Status state); public void onAgentDisconnect(long agentId, Status state);
} }

View File

@ -70,6 +70,7 @@ import com.cloud.exception.OperationTimedoutException;
import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.StorageUnavailableException; import com.cloud.exception.StorageUnavailableException;
import com.cloud.host.Host.Type; import com.cloud.host.Host.Type;
import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
@ -88,6 +89,10 @@ import com.cloud.network.NetworkVO;
import com.cloud.network.Networks.TrafficType; import com.cloud.network.Networks.TrafficType;
import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceStateAdapter;
import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.servlet.ConsoleProxyServlet; import com.cloud.servlet.ConsoleProxyServlet;
@ -112,7 +117,10 @@ import com.cloud.utils.component.Inject;
import com.cloud.utils.component.Manager; import com.cloud.utils.component.Manager;
import com.cloud.utils.db.DB; import com.cloud.utils.db.DB;
import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.SearchCriteria2;
import com.cloud.utils.db.SearchCriteriaService;
import com.cloud.utils.db.Transaction; import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.events.SubscriptionMgr; import com.cloud.utils.events.SubscriptionMgr;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils; import com.cloud.utils.net.NetUtils;
@ -149,7 +157,7 @@ import com.google.gson.GsonBuilder;
// because sooner or later, it will be driven into Running state // because sooner or later, it will be driven into Running state
// //
@Local(value = { ConsoleProxyManager.class, ConsoleProxyService.class }) @Local(value = { ConsoleProxyManager.class, ConsoleProxyService.class })
public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProxyService, Manager, AgentHook, VirtualMachineGuru<ConsoleProxyVO>, SystemVmLoadScanHandler<Long> { public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProxyService, Manager, AgentHook, VirtualMachineGuru<ConsoleProxyVO>, SystemVmLoadScanHandler<Long>, ResourceStateAdapter {
private static final Logger s_logger = Logger.getLogger(ConsoleProxyManagerImpl.class); private static final Logger s_logger = Logger.getLogger(ConsoleProxyManagerImpl.class);
private static final int DEFAULT_CAPACITY_SCAN_INTERVAL = 30000; // 30 seconds private static final int DEFAULT_CAPACITY_SCAN_INTERVAL = 30000; // 30 seconds
@ -199,6 +207,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
StoragePoolDao _storagePoolDao; StoragePoolDao _storagePoolDao;
@Inject @Inject
UserVmDetailsDao _vmDetailsDao; UserVmDetailsDao _vmDetailsDao;
@Inject
ResourceManager _resourceMgr;
private ConsoleProxyListener _listener; private ConsoleProxyListener _listener;
@ -1000,6 +1010,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
this._loadScanner.stop(); this._loadScanner.stop();
_allocProxyLock.releaseRef(); _allocProxyLock.releaseRef();
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return true; return true;
} }
@ -1267,6 +1278,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
_loadScanner = new SystemVmLoadScanner<Long>(this); _loadScanner = new SystemVmLoadScanner<Long>(this);
_loadScanner.initScan(STARTUP_DELAY, _capacityScanInterval); _loadScanner.initScan(STARTUP_DELAY, _capacityScanInterval);
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
if (s_logger.isInfoEnabled()) { if (s_logger.isInfoEnabled()) {
s_logger.info("Console Proxy Manager is configured."); s_logger.info("Console Proxy Manager is configured.");
@ -1459,7 +1471,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
long proxyVmId = startupCmd.getProxyVmId(); long proxyVmId = startupCmd.getProxyVmId();
ConsoleProxyVO consoleProxy = _consoleProxyDao.findById(proxyVmId); ConsoleProxyVO consoleProxy = _consoleProxyDao.findById(proxyVmId);
assert (consoleProxy != null); assert (consoleProxy != null);
HostVO consoleProxyHost = _hostDao.findConsoleProxyHost(consoleProxy.getHostName(), Type.ConsoleProxy); HostVO consoleProxyHost = findConsoleProxyHostByName(consoleProxy.getHostName());
Answer answer = _agentMgr.send(consoleProxyHost.getId(), cmd); Answer answer = _agentMgr.send(consoleProxyHost.getId(), cmd);
if (answer == null || !answer.getResult()) { if (answer == null || !answer.getResult()) {
@ -1657,4 +1669,34 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
@Override @Override
public void onScanEnd() { public void onScanEnd() {
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
if (!(cmd[0] instanceof StartupProxyCommand)) {
return null;
}
host.setType(com.cloud.host.Host.Type.ConsoleProxy);
return host;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
List<String> hostTags) {
// TODO Auto-generated method stub
return null;
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
// TODO Auto-generated method stub
return null;
}
protected HostVO findConsoleProxyHostByName(String name) {
SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.ConsoleProxy);
sc.addAnd(sc.getEntity().getName(), Op.EQ, name);
return sc.find();
}
} }

View File

@ -27,6 +27,7 @@ import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.host.Host.Type; import com.cloud.host.Host.Type;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.info.ConsoleProxyInfo; import com.cloud.info.ConsoleProxyInfo;
import com.cloud.resource.ResourceManager;
import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
@ -36,11 +37,12 @@ import com.cloud.vm.dao.ConsoleProxyDao;
public class StaticConsoleProxyManager extends AgentBasedConsoleProxyManager implements ConsoleProxyManager { public class StaticConsoleProxyManager extends AgentBasedConsoleProxyManager implements ConsoleProxyManager {
String _ip = null; String _ip = null;
@Inject ConsoleProxyDao _proxyDao; @Inject ConsoleProxyDao _proxyDao;
@Inject ResourceManager _resourceMgr;
@Override @Override
protected HostVO findHost(VMInstanceVO vm) { protected HostVO findHost(VMInstanceVO vm) {
List<HostVO> hosts = _hostDao.listBy(Type.ConsoleProxy, vm.getDataCenterIdToDeployIn()); List<HostVO> hosts = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByType(Type.ConsoleProxy, vm.getDataCenterIdToDeployIn());
return hosts.isEmpty() ? null : hosts.get(0); return hosts.isEmpty() ? null : hosts.get(0);
} }

4
server/src/com/cloud/deploy/BareMetalPlanner.java Normal file → Executable file
View File

@ -42,6 +42,7 @@ import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.offering.ServiceOffering; import com.cloud.offering.ServiceOffering;
import com.cloud.org.Cluster; import com.cloud.org.Cluster;
import com.cloud.resource.ResourceManager;
import com.cloud.utils.NumbersUtil; import com.cloud.utils.NumbersUtil;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
@ -57,6 +58,7 @@ public class BareMetalPlanner implements DeploymentPlanner {
@Inject protected HostDao _hostDao; @Inject protected HostDao _hostDao;
@Inject protected ConfigurationDao _configDao; @Inject protected ConfigurationDao _configDao;
@Inject protected CapacityManager _capacityMgr; @Inject protected CapacityManager _capacityMgr;
@Inject protected ResourceManager _resourceMgr;
String _name; String _name;
@Override @Override
@ -94,7 +96,7 @@ public class BareMetalPlanner implements DeploymentPlanner {
int cpu_requested; int cpu_requested;
long ram_requested; long ram_requested;
HostVO target = null; HostVO target = null;
List<HostVO> hosts = _hostDao.listByCluster(cluster.getId()); List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cluster.getId());
if (hostTag != null) { if (hostTag != null) {
for (HostVO h : hosts) { for (HostVO h : hosts) {
_hostDao.loadDetails(h); _hostDao.loadDetails(h);

View File

@ -53,6 +53,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.offering.ServiceOffering; import com.cloud.offering.ServiceOffering;
import com.cloud.org.Cluster; import com.cloud.org.Cluster;
import com.cloud.org.Grouping; import com.cloud.org.Grouping;
import com.cloud.resource.ResourceState;
import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.DiskOfferingVO;
import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolHostVO; import com.cloud.storage.StoragePoolHostVO;
@ -177,7 +178,7 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
if(host == null){ if(host == null){
s_logger.debug("The last host of this VM cannot be found"); s_logger.debug("The last host of this VM cannot be found");
}else{ }else{
if (host.getStatus() == Status.Up && host.getHostAllocationState() == Host.HostAllocationState.Enabled) { if (host.getStatus() == Status.Up && host.getResourceState() == ResourceState.Enabled) {
if(_capacityMgr.checkIfHostHasCapacity(host.getId(), cpu_requested, ram_requested, true, cpuOverprovisioningFactor, true)){ if(_capacityMgr.checkIfHostHasCapacity(host.getId(), cpu_requested, ram_requested, true, cpuOverprovisioningFactor, true)){
s_logger.debug("The last host of this VM is UP and has enough capacity"); s_logger.debug("The last host of this VM is UP and has enough capacity");
s_logger.debug("Now checking for suitable pools under zone: "+host.getDataCenterId() +", pod: "+ host.getPodId()+", cluster: "+ host.getClusterId()); s_logger.debug("Now checking for suitable pools under zone: "+host.getDataCenterId() +", pod: "+ host.getPodId()+", cluster: "+ host.getClusterId());
@ -209,7 +210,7 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
s_logger.debug("The last host of this VM does not have enough capacity"); s_logger.debug("The last host of this VM does not have enough capacity");
} }
}else{ }else{
s_logger.debug("The last host of this VM is not UP or is not enabled, host status is: "+host.getStatus().name() + ", host allocation state is: "+host.getHostAllocationState().name()); s_logger.debug("The last host of this VM is not UP or is not enabled, host status is: "+host.getStatus().name() + ", host resource state is: "+host.getResourceState());
} }
} }

13
server/src/com/cloud/ha/AbstractInvestigatorImpl.java Normal file → Executable file
View File

@ -33,9 +33,14 @@ import com.cloud.agent.api.PingTestCommand;
import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.OperationTimedoutException;
import com.cloud.host.Host.Type; import com.cloud.host.Host.Type;
import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.resource.ResourceManager;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.db.SearchCriteria2;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.SearchCriteriaService;
public abstract class AbstractInvestigatorImpl implements Investigator { public abstract class AbstractInvestigatorImpl implements Investigator {
private static final Logger s_logger = Logger.getLogger(AbstractInvestigatorImpl.class); private static final Logger s_logger = Logger.getLogger(AbstractInvestigatorImpl.class);
@ -43,6 +48,7 @@ public abstract class AbstractInvestigatorImpl implements Investigator {
private String _name = null; private String _name = null;
@Inject private HostDao _hostDao = null; @Inject private HostDao _hostDao = null;
@Inject private AgentManager _agentMgr = null; @Inject private AgentManager _agentMgr = null;
@Inject private ResourceManager _resourceMgr = null;
@Override @Override
@ -69,7 +75,12 @@ public abstract class AbstractInvestigatorImpl implements Investigator {
// Host.status is up and Host.type is routing // Host.status is up and Host.type is routing
protected List<Long> findHostByPod(long podId, Long excludeHostId) { protected List<Long> findHostByPod(long podId, Long excludeHostId) {
List<Long> hostIds = _hostDao.listBy(null, podId, null, Type.Routing, Status.Up); SearchCriteriaService<HostVO, Long> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Type.Routing);
sc.addAnd(sc.getEntity().getPodId(), Op.EQ, podId);
sc.addAnd(sc.getEntity().getStatus(), Op.EQ, Status.Up);
List<Long> hostIds = sc.list();
if (excludeHostId != null){ if (excludeHostId != null){
hostIds.remove(excludeHostId); hostIds.remove(excludeHostId);
} }

View File

@ -57,6 +57,7 @@ import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.resource.ResourceManager;
import com.cloud.server.ManagementServer; import com.cloud.server.ManagementServer;
import com.cloud.storage.StorageManager; import com.cloud.storage.StorageManager;
import com.cloud.storage.dao.GuestOSCategoryDao; import com.cloud.storage.dao.GuestOSCategoryDao;
@ -135,6 +136,8 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager, Clu
VirtualMachineManager _itMgr; VirtualMachineManager _itMgr;
@Inject @Inject
AccountManager _accountMgr; AccountManager _accountMgr;
@Inject
ResourceManager _resourceMgr;
String _instance; String _instance;
ScheduledExecutorService _executor; ScheduledExecutorService _executor;
@ -548,16 +551,16 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager, Clu
if (!_itMgr.migrateAway(work.getType(), vmId, srcHostId)) { if (!_itMgr.migrateAway(work.getType(), vmId, srcHostId)) {
s_logger.warn("Unable to migrate vm from " + srcHostId); s_logger.warn("Unable to migrate vm from " + srcHostId);
_agentMgr.maintenanceFailed(srcHostId); _resourceMgr.maintenanceFailed(srcHostId);
} }
return null; return null;
} catch (InsufficientServerCapacityException e) { } catch (InsufficientServerCapacityException e) {
s_logger.warn("Insufficient capacity for migrating a VM."); s_logger.warn("Insufficient capacity for migrating a VM.");
_agentMgr.maintenanceFailed(srcHostId); _resourceMgr.maintenanceFailed(srcHostId);
return (System.currentTimeMillis() >> 10) + _migrateRetryInterval; return (System.currentTimeMillis() >> 10) + _migrateRetryInterval;
} catch (VirtualMachineMigrationException e) { } catch (VirtualMachineMigrationException e) {
s_logger.warn("Looks like VM is still starting, we need to retry migrating the VM later."); s_logger.warn("Looks like VM is still starting, we need to retry migrating the VM later.");
_agentMgr.maintenanceFailed(srcHostId); _resourceMgr.maintenanceFailed(srcHostId);
return (System.currentTimeMillis() >> 10) + _migrateRetryInterval; return (System.currentTimeMillis() >> 10) + _migrateRetryInterval;
} }
} }

4
server/src/com/cloud/ha/KVMFencer.java Normal file → Executable file
View File

@ -36,6 +36,7 @@ import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.resource.ResourceManager;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
@ -46,6 +47,7 @@ public class KVMFencer implements FenceBuilder {
@Inject HostDao _hostDao; @Inject HostDao _hostDao;
@Inject AgentManager _agentMgr; @Inject AgentManager _agentMgr;
@Inject ResourceManager _resourceMgr;
@Override @Override
public boolean configure(String name, Map<String, Object> params) public boolean configure(String name, Map<String, Object> params)
throws ConfigurationException { throws ConfigurationException {
@ -82,7 +84,7 @@ public class KVMFencer implements FenceBuilder {
return null; return null;
} }
List<HostVO> hosts = _hostDao.listByCluster(host.getClusterId()); List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(host.getClusterId());
FenceCommand fence = new FenceCommand(vm, host); FenceCommand fence = new FenceCommand(vm, host);
for (HostVO h : hosts) { for (HostVO h : hosts) {

4
server/src/com/cloud/ha/XenServerFencer.java Normal file → Executable file
View File

@ -35,6 +35,7 @@ import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.resource.ResourceManager;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
@ -45,6 +46,7 @@ public class XenServerFencer implements FenceBuilder {
@Inject HostDao _hostDao; @Inject HostDao _hostDao;
@Inject AgentManager _agentMgr; @Inject AgentManager _agentMgr;
@Inject ResourceManager _resourceMgr;
@Override @Override
public Boolean fenceOff(VMInstanceVO vm, HostVO host) { public Boolean fenceOff(VMInstanceVO vm, HostVO host) {
@ -53,7 +55,7 @@ public class XenServerFencer implements FenceBuilder {
return null; return null;
} }
List<HostVO> hosts = _hostDao.listByCluster(host.getClusterId()); List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(host.getClusterId());
FenceCommand fence = new FenceCommand(vm, host); FenceCommand fence = new FenceCommand(vm, host);
for (HostVO h : hosts) { for (HostVO h : hosts) {

4
server/src/com/cloud/ha/XenServerInvestigator.java Normal file → Executable file
View File

@ -31,6 +31,7 @@ import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.resource.ResourceManager;
import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
@ -40,6 +41,7 @@ public class XenServerInvestigator extends AdapterBase implements Investigator {
private final static Logger s_logger = Logger.getLogger(XenServerInvestigator.class); private final static Logger s_logger = Logger.getLogger(XenServerInvestigator.class);
@Inject HostDao _hostDao; @Inject HostDao _hostDao;
@Inject AgentManager _agentMgr; @Inject AgentManager _agentMgr;
@Inject ResourceManager _resourceMgr;
protected XenServerInvestigator() { protected XenServerInvestigator() {
} }
@ -51,7 +53,7 @@ public class XenServerInvestigator extends AdapterBase implements Investigator {
} }
CheckOnHostCommand cmd = new CheckOnHostCommand(agent); CheckOnHostCommand cmd = new CheckOnHostCommand(agent);
List<HostVO> neighbors = _hostDao.listByCluster(agent.getClusterId()); List<HostVO> neighbors = _resourceMgr.listAllHostsInCluster(agent.getClusterId());
for (HostVO neighbor : neighbors) { for (HostVO neighbor : neighbors) {
if (neighbor.getId() == agent.getId() || neighbor.getHypervisorType() != HypervisorType.XenServer) { if (neighbor.getId() == agent.getId() || neighbor.getHypervisorType() != HypervisorType.XenServer) {
continue; continue;

View File

@ -27,29 +27,16 @@ import com.cloud.host.Status;
import com.cloud.host.Status.Event; import com.cloud.host.Status.Event;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.info.RunningHostCountInfo; import com.cloud.info.RunningHostCountInfo;
import com.cloud.resource.ResourceState;
import com.cloud.utils.db.GenericDao; import com.cloud.utils.db.GenericDao;
import com.cloud.utils.fsm.StateDao;
/** /**
* Data Access Object for server * Data Access Object for server
* *
*/ */
public interface HostDao extends GenericDao<HostVO, Long> { public interface HostDao extends GenericDao<HostVO, Long>, StateDao<Status, Status.Event, Host> {
List<HostVO> listBy(Host.Type type, Long clusterId, Long podId, long dcId); long countBy(long clusterId, ResourceState... states);
long countBy(long clusterId, Status... statuses);
List<HostVO> listByDataCenter(long dcId);
List<HostVO> listByHostPod(long podId);
List<HostVO> listByStatus(Status... status);
List<HostVO> listBy(Host.Type type, long dcId);
List<HostVO> listAllBy(Host.Type type, long dcId);
HostVO findSecondaryStorageHost(long dcId);
List<HostVO> listByCluster(long clusterId);
/**
* Lists all secondary storage hosts, across all zones
* @return list of Hosts
*/
List<HostVO> listSecondaryStorageHosts();
/** /**
* Mark all hosts associated with a certain management server * Mark all hosts associated with a certain management server
@ -61,63 +48,7 @@ public interface HostDao extends GenericDao<HostVO, Long> {
List<HostVO> findLostHosts(long timeout); List<HostVO> findLostHosts(long timeout);
List<HostVO> findHostsLike(String hostName);
/**
* Find hosts that are directly connected.
*/
List<HostVO> findDirectlyConnectedHosts();
List<HostVO> findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId); List<HostVO> findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId);
/**
* Mark the host as disconnected if it is in one of these states.
* The management server id is set to null.
* The lastPinged timestamp is set to current.
* The state is set to the state passed in.
* The disconnectedOn timestamp is set to current.
*
* @param host host to be marked
* @param state state to be set to.
* @param ifStates only if it is one of these states.
* @return true if it's updated; false if not.
*/
boolean disconnect(HostVO host, Event event, long msId);
boolean connect(HostVO host, long msId);
HostVO findByStorageIpAddressInDataCenter(long dcId, String privateIpAddress);
HostVO findByPrivateIpAddressInDataCenter(long dcId, String privateIpAddress);
public HostVO findByGuid(String guid);
public HostVO findByName(String name);
/**
* find all hosts of a certain type in a data center
* @param type
* @param routingCapable
* @param dcId
* @return
*/
List<HostVO> listByTypeDataCenter(Host.Type type, long dcId);
/**
* find all hosts of a particular type
* @param type
* @return
*/
List<HostVO> listByType(Type type);
/**
* update the host and changes the status depending on the Event and
* the current status. If the status changed between
* @param host host object to change
* @param event event that happened.
* @param management server who's making this update
* @return true if updated; false if not.
*/
boolean updateStatus(HostVO host, Event event, long msId);
List<RunningHostCountInfo> getRunningHostCounts(Date cutTime); List<RunningHostCountInfo> getRunningHostCounts(Date cutTime);
@ -127,56 +58,13 @@ public interface HostDao extends GenericDao<HostVO, Long> {
void saveDetails(HostVO host); void saveDetails(HostVO host);
HostVO findConsoleProxyHost(String name, Type type);
List<HypervisorType> getAvailHypervisorInZone(Long hostId, Long zoneId);
/**
* Returns a list of host ids given the conditions.
* @param dataCenterId if specified, then must be in this data center.
* @param podId if specified, then must be in this pod.
* @param clusterId if specified, then must be in this cluster.
* @param hostType TODO
* @param statuses the host needs to be in.
* @return ids of the host meeting the search parameters.
*/
List<Long> listBy(Long dataCenterId, Long podId, Long clusterId, Type hostType, Status... statuses);
List<HostVO> listBy(Long clusterId, Long podId, long dcId);
void loadHostTags(HostVO host); void loadHostTags(HostVO host);
List<HostVO> listByHostTag(Host.Type type, Long clusterId, Long podId, long dcId, String hostTag); List<HostVO> listByHostTag(Host.Type type, Long clusterId, Long podId, long dcId, String hostTag);
long countRoutingHostsByDataCenter(long dcId); long countRoutingHostsByDataCenter(long dcId);
List<HostVO> listSecondaryStorageHosts(long dataCenterId);
boolean directConnect(HostVO host, long msId);
List<HostVO> listDirectHostsBy(long msId, Status status);
List<HostVO> listManagedDirectAgents();
List<HostVO> listManagedRoutingAgents();
HostVO findTrafficMonitorHost();
List<HostVO> listLocalSecondaryStorageHosts();
List<HostVO> listLocalSecondaryStorageHosts(long dataCenterId);
List<HostVO> listAllSecondaryStorageHosts(long dataCenterId);
List<HostVO> listRoutingHostsByManagementServer(long msId);
List<HostVO> listSecondaryStorageVM(long dcId);
List<HostVO> listAllRoutingAgents();
List<HostVO> findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId); List<HostVO> findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId);
List<HostVO> listByInAllStatus(Type type, Long clusterId, Long podId, long dcId); boolean updateResourceState(ResourceState oldState, ResourceState.Event event, ResourceState newState, Host vo);
List<HostVO> listByClusterStatus(long clusterId, Status status);
} }

View File

@ -45,6 +45,7 @@ import com.cloud.host.Status.Event;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.info.RunningHostCountInfo; import com.cloud.info.RunningHostCountInfo;
import com.cloud.org.Managed; import com.cloud.org.Managed;
import com.cloud.resource.ResourceState;
import com.cloud.utils.DateUtil; import com.cloud.utils.DateUtil;
import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.db.Attribute; import com.cloud.utils.db.Attribute;
@ -67,6 +68,8 @@ import com.cloud.utils.exception.CloudRuntimeException;
@TableGenerator(name = "host_req_sq", table = "op_host", pkColumnName = "id", valueColumnName = "sequence", allocationSize = 1) @TableGenerator(name = "host_req_sq", table = "op_host", pkColumnName = "id", valueColumnName = "sequence", allocationSize = 1)
public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao { public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao {
private static final Logger s_logger = Logger.getLogger(HostDaoImpl.class); private static final Logger s_logger = Logger.getLogger(HostDaoImpl.class);
private static final Logger status_logger = Logger.getLogger(Status.class);
private static final Logger state_logger = Logger.getLogger(ResourceState.class);
protected final SearchBuilder<HostVO> TypePodDcStatusSearch; protected final SearchBuilder<HostVO> TypePodDcStatusSearch;
@ -82,6 +85,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
protected final SearchBuilder<HostVO> PodSearch; protected final SearchBuilder<HostVO> PodSearch;
protected final SearchBuilder<HostVO> TypeSearch; protected final SearchBuilder<HostVO> TypeSearch;
protected final SearchBuilder<HostVO> StatusSearch; protected final SearchBuilder<HostVO> StatusSearch;
protected final SearchBuilder<HostVO> ResourceStateSearch;
protected final SearchBuilder<HostVO> NameLikeSearch; protected final SearchBuilder<HostVO> NameLikeSearch;
protected final SearchBuilder<HostVO> NameSearch; protected final SearchBuilder<HostVO> NameSearch;
protected final SearchBuilder<HostVO> SequenceSearch; protected final SearchBuilder<HostVO> SequenceSearch;
@ -106,6 +110,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
protected final SearchBuilder<HostVO> RoutingSearch; protected final SearchBuilder<HostVO> RoutingSearch;
protected final Attribute _statusAttr; protected final Attribute _statusAttr;
protected final Attribute _resourceStateAttr;
protected final Attribute _msIdAttr; protected final Attribute _msIdAttr;
protected final Attribute _pingTimeAttr; protected final Attribute _pingTimeAttr;
@ -119,7 +124,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
MaintenanceCountSearch = createSearchBuilder(); MaintenanceCountSearch = createSearchBuilder();
MaintenanceCountSearch.and("cluster", MaintenanceCountSearch.entity().getClusterId(), SearchCriteria.Op.EQ); MaintenanceCountSearch.and("cluster", MaintenanceCountSearch.entity().getClusterId(), SearchCriteria.Op.EQ);
MaintenanceCountSearch.and("status", MaintenanceCountSearch.entity().getStatus(), SearchCriteria.Op.IN); MaintenanceCountSearch.and("resourceState", MaintenanceCountSearch.entity().getResourceState(), SearchCriteria.Op.IN);
MaintenanceCountSearch.done(); MaintenanceCountSearch.done();
TypePodDcStatusSearch = createSearchBuilder(); TypePodDcStatusSearch = createSearchBuilder();
@ -129,12 +134,13 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
TypePodDcStatusSearch.and("dc", entity.getDataCenterId(), SearchCriteria.Op.EQ); TypePodDcStatusSearch.and("dc", entity.getDataCenterId(), SearchCriteria.Op.EQ);
TypePodDcStatusSearch.and("cluster", entity.getClusterId(), SearchCriteria.Op.EQ); TypePodDcStatusSearch.and("cluster", entity.getClusterId(), SearchCriteria.Op.EQ);
TypePodDcStatusSearch.and("status", entity.getStatus(), SearchCriteria.Op.EQ); TypePodDcStatusSearch.and("status", entity.getStatus(), SearchCriteria.Op.EQ);
TypePodDcStatusSearch.and("resourceState", entity.getResourceState(), SearchCriteria.Op.EQ);
TypePodDcStatusSearch.done(); TypePodDcStatusSearch.done();
MsStatusSearch = createSearchBuilder(); MsStatusSearch = createSearchBuilder();
MsStatusSearch.and("ms", MsStatusSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ); MsStatusSearch.and("ms", MsStatusSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ);
MsStatusSearch.and("type", MsStatusSearch.entity().getType(), SearchCriteria.Op.EQ); MsStatusSearch.and("type", MsStatusSearch.entity().getType(), SearchCriteria.Op.EQ);
MsStatusSearch.and("statuses", MsStatusSearch.entity().getStatus(), SearchCriteria.Op.NIN); MsStatusSearch.and("resourceState", MsStatusSearch.entity().getResourceState(), SearchCriteria.Op.NIN);
MsStatusSearch.done(); MsStatusSearch.done();
TypeDcSearch = createSearchBuilder(); TypeDcSearch = createSearchBuilder();
@ -152,6 +158,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
TypeDcStatusSearch.and("type", TypeDcStatusSearch.entity().getType(), SearchCriteria.Op.EQ); TypeDcStatusSearch.and("type", TypeDcStatusSearch.entity().getType(), SearchCriteria.Op.EQ);
TypeDcStatusSearch.and("dc", TypeDcStatusSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); TypeDcStatusSearch.and("dc", TypeDcStatusSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
TypeDcStatusSearch.and("status", TypeDcStatusSearch.entity().getStatus(), SearchCriteria.Op.EQ); TypeDcStatusSearch.and("status", TypeDcStatusSearch.entity().getStatus(), SearchCriteria.Op.EQ);
TypeDcStatusSearch.and("resourceState", TypeDcStatusSearch.entity().getResourceState(), SearchCriteria.Op.EQ);
TypeDcStatusSearch.done(); TypeDcStatusSearch.done();
IdStatusSearch = createSearchBuilder(); IdStatusSearch = createSearchBuilder();
@ -199,6 +206,10 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
StatusSearch.and("status", StatusSearch.entity().getStatus(), SearchCriteria.Op.IN); StatusSearch.and("status", StatusSearch.entity().getStatus(), SearchCriteria.Op.IN);
StatusSearch.done(); StatusSearch.done();
ResourceStateSearch = createSearchBuilder();
ResourceStateSearch.and("resourceState", ResourceStateSearch.entity().getResourceState(), SearchCriteria.Op.IN);
ResourceStateSearch.done();
NameLikeSearch = createSearchBuilder(); NameLikeSearch = createSearchBuilder();
NameLikeSearch.and("name", NameLikeSearch.entity().getName(), SearchCriteria.Op.LIKE); NameLikeSearch.and("name", NameLikeSearch.entity().getName(), SearchCriteria.Op.LIKE);
NameLikeSearch.done(); NameLikeSearch.done();
@ -216,13 +227,14 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
DirectlyConnectedSearch.and("resource", DirectlyConnectedSearch.entity().getResource(), SearchCriteria.Op.NNULL); DirectlyConnectedSearch.and("resource", DirectlyConnectedSearch.entity().getResource(), SearchCriteria.Op.NNULL);
DirectlyConnectedSearch.and("ms", DirectlyConnectedSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ); DirectlyConnectedSearch.and("ms", DirectlyConnectedSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ);
DirectlyConnectedSearch.and("statuses", DirectlyConnectedSearch.entity().getStatus(), SearchCriteria.Op.EQ); DirectlyConnectedSearch.and("statuses", DirectlyConnectedSearch.entity().getStatus(), SearchCriteria.Op.EQ);
DirectlyConnectedSearch.and("resourceState", DirectlyConnectedSearch.entity().getResourceState(), SearchCriteria.Op.NOTIN);
DirectlyConnectedSearch.done(); DirectlyConnectedSearch.done();
UnmanagedDirectConnectSearch = createSearchBuilder(); UnmanagedDirectConnectSearch = createSearchBuilder();
UnmanagedDirectConnectSearch.and("resource", UnmanagedDirectConnectSearch.entity().getResource(), SearchCriteria.Op.NNULL); UnmanagedDirectConnectSearch.and("resource", UnmanagedDirectConnectSearch.entity().getResource(), SearchCriteria.Op.NNULL);
UnmanagedDirectConnectSearch.and("server", UnmanagedDirectConnectSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL); UnmanagedDirectConnectSearch.and("server", UnmanagedDirectConnectSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL);
UnmanagedDirectConnectSearch.and("lastPinged", UnmanagedDirectConnectSearch.entity().getLastPinged(), SearchCriteria.Op.LTEQ); UnmanagedDirectConnectSearch.and("lastPinged", UnmanagedDirectConnectSearch.entity().getLastPinged(), SearchCriteria.Op.LTEQ);
UnmanagedDirectConnectSearch.and("statuses", UnmanagedDirectConnectSearch.entity().getStatus(), SearchCriteria.Op.NIN); UnmanagedDirectConnectSearch.and("resourceStates", UnmanagedDirectConnectSearch.entity().getResourceState(), SearchCriteria.Op.NIN);
/* /*
* UnmanagedDirectConnectSearch.op(SearchCriteria.Op.OR, "managementServerId", * UnmanagedDirectConnectSearch.op(SearchCriteria.Op.OR, "managementServerId",
* UnmanagedDirectConnectSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ); * UnmanagedDirectConnectSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ);
@ -238,7 +250,6 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
UnmanagedDirectConnectSearch.done(); UnmanagedDirectConnectSearch.done();
DirectConnectSearch = createSearchBuilder(); DirectConnectSearch = createSearchBuilder();
DirectConnectSearch.and("resource", DirectConnectSearch.entity().getResource(), SearchCriteria.Op.NNULL); DirectConnectSearch.and("resource", DirectConnectSearch.entity().getResource(), SearchCriteria.Op.NNULL);
DirectConnectSearch.and("id", DirectConnectSearch.entity().getId(), SearchCriteria.Op.EQ); DirectConnectSearch.and("id", DirectConnectSearch.entity().getId(), SearchCriteria.Op.EQ);
@ -295,88 +306,29 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
_statusAttr = _allAttributes.get("status"); _statusAttr = _allAttributes.get("status");
_msIdAttr = _allAttributes.get("managementServerId"); _msIdAttr = _allAttributes.get("managementServerId");
_pingTimeAttr = _allAttributes.get("lastPinged"); _pingTimeAttr = _allAttributes.get("lastPinged");
_resourceStateAttr = _allAttributes.get("resourceState");
assert (_statusAttr != null && _msIdAttr != null && _pingTimeAttr != null) : "Couldn't find one of these attributes"; assert (_statusAttr != null && _msIdAttr != null && _pingTimeAttr != null) : "Couldn't find one of these attributes";
} }
@Override @Override
public long countBy(long clusterId, Status... statuses) { public long countBy(long clusterId, ResourceState... states) {
SearchCriteria<HostVO> sc = MaintenanceCountSearch.create(); SearchCriteria<HostVO> sc = MaintenanceCountSearch.create();
sc.setParameters("status", (Object[]) statuses); sc.setParameters("resourceState", (Object[]) states);
sc.setParameters("cluster", clusterId); sc.setParameters("cluster", clusterId);
List<HostVO> hosts = listBy(sc); List<HostVO> hosts = listBy(sc);
return hosts.size(); return hosts.size();
} }
@Override
public HostVO findSecondaryStorageHost(long dcId) {
SearchCriteria<HostVO> sc = TypeDcSearch.create();
sc.setParameters("type", Host.Type.SecondaryStorage);
sc.setParameters("dc", dcId);
List<HostVO> storageHosts = listBy(sc);
if (storageHosts == null || storageHosts.size() < 1) {
return null;
} else {
Collections.shuffle(storageHosts);
return storageHosts.get(0);
}
}
@Override
public List<HostVO> listSecondaryStorageHosts() {
SearchCriteria<HostVO> sc = createSearchCriteria();
sc.addAnd("type", SearchCriteria.Op.EQ, Host.Type.SecondaryStorage);
return search(sc, null);
}
@Override
public List<HostVO> listSecondaryStorageHosts(long dataCenterId) {
SearchCriteria<HostVO> sc = createSearchCriteria();
sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, dataCenterId);
sc.addAnd("type", SearchCriteria.Op.EQ, Host.Type.SecondaryStorage);
return search(sc, null);
}
@Override
public List<HostVO> listLocalSecondaryStorageHosts() {
SearchCriteria<HostVO> sc = createSearchCriteria();
sc.addAnd("type", SearchCriteria.Op.EQ, Host.Type.LocalSecondaryStorage);
return search(sc, null);
}
@Override
public List<HostVO> listLocalSecondaryStorageHosts(long dataCenterId) {
SearchCriteria<HostVO> sc = createSearchCriteria();
sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, dataCenterId);
sc.addAnd("type", SearchCriteria.Op.EQ, Host.Type.LocalSecondaryStorage);
return search(sc, null);
}
@Override
public List<HostVO> listAllSecondaryStorageHosts(long dataCenterId) {
SearchCriteria<HostVO> sc = createSearchCriteria();
sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, dataCenterId);
sc.addAnd("type", SearchCriteria.Op.IN, new Object[]{Host.Type.LocalSecondaryStorage, Host.Type.SecondaryStorage});
return search(sc, null);
}
@Override
public List<HostVO> findDirectlyConnectedHosts() {
SearchCriteria<HostVO> sc = DirectlyConnectedSearch.create();
return search(sc, null);
}
@Override @DB @Override @DB
public List<HostVO> findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId) { public List<HostVO> findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId) {
Transaction txn = Transaction.currentTxn(); Transaction txn = Transaction.currentTxn();
txn.start(); txn.start();
SearchCriteria<HostVO> sc = UnmanagedDirectConnectSearch.create(); SearchCriteria<HostVO> sc = UnmanagedDirectConnectSearch.create();
sc.setParameters("lastPinged", lastPingSecondsAfter); sc.setParameters("lastPinged", lastPingSecondsAfter);
sc.setParameters("statuses", Status.ErrorInMaintenance, Status.Maintenance, Status.PrepareForMaintenance); //sc.setParameters("resourceStates", ResourceState.ErrorInMaintenance, ResourceState.Maintenance, ResourceState.PrepareForMaintenance, ResourceState.Disabled);
sc.setJoinParameters("ClusterManagedSearch", "managed", Managed.ManagedState.Managed); sc.setJoinParameters("ClusterManagedSearch", "managed", Managed.ManagedState.Managed);
List<HostVO> hosts = lockRows(sc, new Filter(HostVO.class, "clusterId", true, 0L, limit), true); List<HostVO> hosts = lockRows(sc, new Filter(HostVO.class, "clusterId", true, 0L, limit), true);
@ -414,7 +366,6 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
public void markHostsAsDisconnected(long msId, long lastPing) { public void markHostsAsDisconnected(long msId, long lastPing) {
SearchCriteria<HostVO> sc = MsStatusSearch.create(); SearchCriteria<HostVO> sc = MsStatusSearch.create();
sc.setParameters("ms", msId); sc.setParameters("ms", msId);
sc.setParameters("statuses", Status.ErrorInMaintenance, Status.Maintenance, Status.PrepareForMaintenance);
HostVO host = createForUpdate(); HostVO host = createForUpdate();
host.setLastPinged(lastPing); host.setLastPinged(lastPing);
@ -435,54 +386,6 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
update(ub, sc, null); update(ub, sc, null);
} }
@Override
public List<HostVO> listBy(Host.Type type, Long clusterId, Long podId, long dcId) {
SearchCriteria<HostVO> sc = TypePodDcStatusSearch.create();
if (type != null) {
sc.setParameters("type", type.toString());
}
if (clusterId != null) {
sc.setParameters("cluster", clusterId);
}
if (podId != null) {
sc.setParameters("pod", podId);
}
sc.setParameters("dc", dcId);
sc.setParameters("status", Status.Up.toString());
return listBy(sc);
}
@Override
public List<HostVO> listByInAllStatus(Host.Type type, Long clusterId, Long podId, long dcId) {
SearchCriteria<HostVO> sc = TypePodDcStatusSearch.create();
if ( type != null ) {
sc.setParameters("type", type.toString());
}
if (clusterId != null) {
sc.setParameters("cluster", clusterId);
}
if (podId != null ) {
sc.setParameters("pod", podId);
}
sc.setParameters("dc", dcId);
return listBy(sc);
}
@Override
public List<HostVO> listBy(Long clusterId, Long podId, long dcId) {
SearchCriteria<HostVO> sc = TypePodDcStatusSearch.create();
if (podId != null) {
sc.setParameters("pod", podId);
}
if (clusterId != null) {
sc.setParameters("cluster", clusterId);
}
sc.setParameters("dc", dcId);
return listBy(sc);
}
@Override @Override
public List<HostVO> listByHostTag(Host.Type type, Long clusterId, Long podId, long dcId, String hostTag) { public List<HostVO> listByHostTag(Host.Type type, Long clusterId, Long podId, long dcId, String hostTag) {
@ -497,6 +400,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
hostSearch.and("dc", entity.getDataCenterId(), SearchCriteria.Op.EQ); hostSearch.and("dc", entity.getDataCenterId(), SearchCriteria.Op.EQ);
hostSearch.and("cluster", entity.getClusterId(), SearchCriteria.Op.EQ); hostSearch.and("cluster", entity.getClusterId(), SearchCriteria.Op.EQ);
hostSearch.and("status", entity.getStatus(), SearchCriteria.Op.EQ); hostSearch.and("status", entity.getStatus(), SearchCriteria.Op.EQ);
hostSearch.and("resourceState", entity.getState(), SearchCriteria.Op.EQ);
hostSearch.join("hostTagSearch", hostTagSearch, entity.getId(), tagEntity.getHostId(), JoinBuilder.JoinType.INNER); hostSearch.join("hostTagSearch", hostTagSearch, entity.getId(), tagEntity.getHostId(), JoinBuilder.JoinType.INNER);
SearchCriteria<HostVO> sc = hostSearch.create(); SearchCriteria<HostVO> sc = hostSearch.create();
@ -510,68 +414,11 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
} }
sc.setParameters("dc", dcId); sc.setParameters("dc", dcId);
sc.setParameters("status", Status.Up.toString()); sc.setParameters("status", Status.Up.toString());
sc.setParameters("resourceState", ResourceState.Enabled.toString());
return listBy(sc); return listBy(sc);
} }
@Override
public List<HostVO> listByCluster(long clusterId) {
SearchCriteria<HostVO> sc = ClusterStatusSearch.create();
sc.setParameters("cluster", clusterId);
return listBy(sc);
}
@Override
public List<HostVO> listByClusterStatus(long clusterId, Status status) {
SearchCriteria<HostVO> sc = ClusterStatusSearch.create();
sc.setParameters("cluster", clusterId);
sc.setParameters("status", status.toString());
return listBy(sc);
}
@Override
public List<HostVO> listBy(Host.Type type, long dcId) {
SearchCriteria<HostVO> sc = TypeDcStatusSearch.create();
sc.setParameters("type", type.toString());
sc.setParameters("dc", dcId);
sc.setParameters("status", Status.Up.toString());
return listBy(sc);
}
@Override
public List<HostVO> listAllBy(Host.Type type, long dcId) {
SearchCriteria<HostVO> sc = TypeDcSearch.create();
sc.setParameters("type", type.toString());
sc.setParameters("dc", dcId);
return listBy(sc);
}
@Override
public HostVO findByPrivateIpAddressInDataCenter(long dcId, String privateIpAddress) {
SearchCriteria<HostVO> sc = DcPrivateIpAddressSearch.create();
sc.setParameters("dc", dcId);
sc.setParameters("privateIpAddress", privateIpAddress);
return findOneBy(sc);
}
@Override
public HostVO findByStorageIpAddressInDataCenter(long dcId, String privateIpAddress) {
SearchCriteria<HostVO> sc = DcStorageIpAddressSearch.create();
sc.setParameters("dc", dcId);
sc.setParameters("storageIpAddress", privateIpAddress);
return findOneBy(sc);
}
@Override @Override
public void loadDetails(HostVO host) { public void loadDetails(HostVO host) {
Map<String, String> details = _detailsDao.findDetails(host.getId()); Map<String, String> details = _detailsDao.findDetails(host.getId());
@ -584,132 +431,6 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
host.setHostTags(hostTags); host.setHostTags(hostTags);
} }
@Override
public boolean directConnect(HostVO host, long msId) {
SearchCriteria<HostVO> sc = DirectConnectSearch.create();
sc.setParameters("id", host.getId());
sc.setParameters("server", msId);
host.setManagementServerId(msId);
host.setLastPinged(System.currentTimeMillis() >> 10);
UpdateBuilder ub = getUpdateBuilder(host);
ub.set(host, _statusAttr, Status.Connecting);
return update(host, sc) > 0;
}
@Override
public boolean updateStatus(HostVO host, Event event, long msId) {
if (host == null) {
return false;
}
Status oldStatus = host.getStatus();
long oldPingTime = host.getLastPinged();
Status newStatus = oldStatus.getNextStatus(event);
if (newStatus == null) {
return false;
}
SearchBuilder<HostVO> sb = createSearchBuilder();
sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ);
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
if (newStatus.checkManagementServer()) {
sb.and("ping", sb.entity().getLastPinged(), SearchCriteria.Op.EQ);
sb.and().op("nullmsid", sb.entity().getManagementServerId(), SearchCriteria.Op.NULL);
sb.or("msid", sb.entity().getManagementServerId(), SearchCriteria.Op.EQ);
sb.closeParen();
}
sb.done();
SearchCriteria<HostVO> sc = sb.create();
sc.setParameters("status", oldStatus);
sc.setParameters("id", host.getId());
if (newStatus.checkManagementServer()) {
sc.setParameters("ping", oldPingTime);
sc.setParameters("msid", msId);
}
UpdateBuilder ub = getUpdateBuilder(host);
ub.set(host, _statusAttr, newStatus);
if (newStatus.updateManagementServer()) {
if (newStatus.lostConnection()) {
ub.set(host, _msIdAttr, null);
} else {
ub.set(host, _msIdAttr, msId);
}
if (event.equals(Event.Ping) || event.equals(Event.AgentConnected)) {
ub.set(host, _pingTimeAttr, System.currentTimeMillis() >> 10);
}
}
if (event.equals(Event.ManagementServerDown)) {
ub.set(host, _pingTimeAttr, ((System.currentTimeMillis() >> 10) - (10 * 60)));
}
int result = update(ub, sc, null);
assert result <= 1 : "How can this update " + result + " rows? ";
if (result < 1) {
s_logger.warn("Unable to update db record for host id=" + host.getId() + "; it's possible that the host is removed");
}
if (s_logger.isDebugEnabled() && result == 0) {
HostVO vo = findById(host.getId());
if (vo != null) {
StringBuilder str = new StringBuilder("Unable to update host for event:").append(event.toString());
str.append(". New=[status=").append(newStatus.toString()).append(":msid=").append(newStatus.lostConnection() ? "null" : msId).append(":lastpinged=").append(host.getLastPinged())
.append("]");
str.append("; Old=[status=").append(oldStatus.toString()).append(":msid=").append(msId).append(":lastpinged=").append(oldPingTime).append("]");
str.append("; DB=[status=").append(vo.getStatus().toString()).append(":msid=").append(vo.getManagementServerId()).append(":lastpinged=").append(vo.getLastPinged()).append("]");
s_logger.debug(str.toString());
} else {
s_logger.warn("Can't find host db record by id=" + host.getId() + "; host might be already marked as removed");
}
}
return result > 0;
}
@Override
public boolean disconnect(HostVO host, Event event, long msId) {
host.setDisconnectedOn(new Date());
if (event != null && event.equals(Event.Remove)) {
host.setGuid(null);
host.setClusterId(null);
}
return updateStatus(host, event, msId);
}
@Override
@DB
public boolean connect(HostVO host, long msId) {
Transaction txn = Transaction.currentTxn();
long id = host.getId();
txn.start();
if (!updateStatus(host, Event.AgentConnected, msId)) {
return false;
}
txn.commit();
return true;
}
@Override
public HostVO findByGuid(String guid) {
SearchCriteria<HostVO> sc = GuidSearch.create("guid", guid);
return findOneBy(sc);
}
@Override
public HostVO findByName(String name) {
SearchCriteria<HostVO> sc = NameSearch.create("name", name);
return findOneBy(sc);
}
@DB @DB
@Override @Override
public List<HostVO> findLostHosts(long timeout) { public List<HostVO> findLostHosts(long timeout) {
@ -742,74 +463,6 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
return result; return result;
} }
@Override
public List<HostVO> findHostsLike(String hostName) {
SearchCriteria<HostVO> sc = NameLikeSearch.create();
sc.setParameters("name", "%" + hostName + "%");
return listBy(sc);
}
@Override
public List<HostVO> listByDataCenter(long dcId) {
SearchCriteria<HostVO> sc = DcSearch.create("dc", dcId);
return listBy(sc);
}
@Override
public HostVO findConsoleProxyHost(String name, Type type) {
SearchCriteria<HostVO> sc = ConsoleProxyHostSearch.create();
sc.setParameters("name", name);
sc.setParameters("type", type);
List<HostVO> hostList = listBy(sc);
if (hostList == null || hostList.size() == 0) {
return null;
} else {
return hostList.get(0);
}
}
@Override
public List<HostVO> listByHostPod(long podId) {
SearchCriteria<HostVO> sc = PodSearch.create("pod", podId);
return listBy(sc);
}
@Override
public List<HostVO> listByStatus(Status... status) {
SearchCriteria<HostVO> sc = StatusSearch.create();
sc.setParameters("status", (Object[]) status);
return listBy(sc);
}
@Override
public List<HostVO> listByTypeDataCenter(Type type, long dcId) {
SearchCriteria<HostVO> sc = TypeDcSearch.create();
sc.setParameters("type", type.toString());
sc.setParameters("dc", dcId);
return listBy(sc);
}
@Override
public List<HostVO> listSecondaryStorageVM(long dcId) {
SearchCriteria<HostVO> sc = SecondaryStorageVMSearch.create();
sc.setParameters("type", Type.SecondaryStorageVM);
sc.setParameters("status", Status.Up);
sc.setParameters("dc", dcId);
return listBy(sc);
}
@Override
public List<HostVO> listByType(Type type) {
SearchCriteria<HostVO> sc = TypeSearch.create();
sc.setParameters("type", type.toString());
return listBy(sc);
}
@Override @Override
public void saveDetails(HostVO host) { public void saveDetails(HostVO host) {
Map<String, String> details = host.getDetails(); Map<String, String> details = host.getDetails();
@ -920,48 +573,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
return s_seqFetcher.getNextSequence(Long.class, tg, hostId); return s_seqFetcher.getNextSequence(Long.class, tg, hostId);
} }
@Override /*TODO: this is used by mycloud, check if it needs resource state Enabled */
public List<HypervisorType> getAvailHypervisorInZone(Long hostId, Long zoneId) {
SearchCriteria<HostVO> sc = AvailHypevisorInZone.create();
if ( zoneId != null ) {
sc.setParameters("zoneId", zoneId);
}
if ( hostId != null ) {
sc.setParameters("hostId", hostId);
}
sc.setParameters("type", Host.Type.Routing);
List<HostVO> hosts = listBy(sc);
List<HypervisorType> hypers = new ArrayList<HypervisorType>(4);
for (HostVO host : hosts) {
hypers.add(host.getHypervisorType());
}
return hypers;
}
@Override
public List<Long> listBy(Long dataCenterId, Long podId, Long clusterId, Type hostType, Status... statuses) {
SearchCriteria<Long> sc = HostsInStatusSearch.create();
if (dataCenterId != null) {
sc.setParameters("dc", dataCenterId);
}
if (podId != null) {
sc.setParameters("pod", podId);
}
if (clusterId != null) {
sc.setParameters("cluster", clusterId);
}
if (hostType != null) {
sc.setParameters("type", hostType);
}
sc.setParameters("statuses", (Object[]) statuses);
return customSearch(sc, null);
}
@Override @Override
public long countRoutingHostsByDataCenter(long dcId) { public long countRoutingHostsByDataCenter(long dcId) {
SearchCriteria<Long> sc = CountRoutingByDc.create(); SearchCriteria<Long> sc = CountRoutingByDc.create();
@ -971,57 +583,122 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
return customSearch(sc, null).get(0); return customSearch(sc, null).get(0);
} }
@Override
public HostVO findTrafficMonitorHost() {
SearchCriteria<HostVO> sc = TypeSearch.create();
sc.setParameters("type", Host.Type.TrafficMonitor);
List<HostVO> trafficHosts = listBy(sc);
if (trafficHosts == null || trafficHosts.size() < 1) { @Override
return null; public boolean updateState(Status oldStatus, Event event, Status newStatus, Host vo, Long id) {
HostVO host = (HostVO) vo;
long oldPingTime = host.getLastPinged();
SearchBuilder<HostVO> sb = createSearchBuilder();
sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ);
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
sb.and("update", sb.entity().getUpdated(), SearchCriteria.Op.EQ);
if (newStatus.checkManagementServer()) {
sb.and("ping", sb.entity().getLastPinged(), SearchCriteria.Op.EQ);
sb.and().op("nullmsid", sb.entity().getManagementServerId(), SearchCriteria.Op.NULL);
sb.or("msid", sb.entity().getManagementServerId(), SearchCriteria.Op.EQ);
sb.closeParen();
}
sb.done();
SearchCriteria<HostVO> sc = sb.create();
sc.setParameters("status", oldStatus);
sc.setParameters("id", host.getId());
sc.setParameters("update", host.getUpdated());
long oldUpdateCount = host.getUpdated();
if (newStatus.checkManagementServer()) {
sc.setParameters("ping", oldPingTime);
sc.setParameters("msid", host.getManagementServerId());
}
long newUpdateCount = host.incrUpdated();
UpdateBuilder ub = getUpdateBuilder(host);
ub.set(host, _statusAttr, newStatus);
if (newStatus.updateManagementServer()) {
if (newStatus.lostConnection()) {
ub.set(host, _msIdAttr, null);
} else { } else {
return trafficHosts.get(0); ub.set(host, _msIdAttr, host.getManagementServerId());
} }
if (event.equals(Event.Ping) || event.equals(Event.AgentConnected)) {
ub.set(host, _pingTimeAttr, System.currentTimeMillis() >> 10);
}
}
if (event.equals(Event.ManagementServerDown)) {
ub.set(host, _pingTimeAttr, ((System.currentTimeMillis() >> 10) - (10 * 60)));
}
int result = update(ub, sc, null);
assert result <= 1 : "How can this update " + result + " rows? ";
if (status_logger.isDebugEnabled() && result == 0) {
HostVO ho = findById(host.getId());
assert ho != null : "How how how? : " + host.getId();
StringBuilder str = new StringBuilder("Unable to update host for event:").append(event.toString());
str.append(". Name=").append(host.getName());
str.append("; New=[status=").append(newStatus.toString()).append(":msid=")
.append(newStatus.lostConnection() ? "null" : host.getManagementServerId()).append(":lastpinged=").append(host.getLastPinged()).append("]");
str.append("; Old=[status=").append(oldStatus.toString()).append(":msid=").append(host.getManagementServerId()).append(":lastpinged=")
.append(oldPingTime).append("]");
str.append("; DB=[status=").append(vo.getStatus().toString()).append(":msid=").append(vo.getManagementServerId()).append(":lastpinged=")
.append(vo.getLastPinged()).append(":old update count=").append(oldUpdateCount).append("]");
status_logger.debug(str.toString());
} else {
StringBuilder msg = new StringBuilder("Agent status update: [");
msg.append("id = " + host.getId());
msg.append("; name = " + host.getName());
msg.append("; old status = " + oldStatus);
msg.append("; event = " + event);
msg.append("; new status = " + newStatus);
msg.append("; old update count = " + oldUpdateCount);
msg.append("; new update count = " + newUpdateCount + "]");
status_logger.debug(msg.toString());
}
return result > 0;
} }
@Override @Override
public List<HostVO> listDirectHostsBy(long msId, Status status) { public boolean updateResourceState(ResourceState oldState, ResourceState.Event event, ResourceState newState, Host vo) {
SearchCriteria<HostVO> sc = DirectlyConnectedSearch.create(); HostVO host = (HostVO)vo;
sc.setParameters("ms", msId); SearchBuilder<HostVO> sb = createSearchBuilder();
if (status != null) { sb.and("resource_state", sb.entity().getResourceState(), SearchCriteria.Op.EQ);
sc.setParameters("statuses", Status.Up); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
sb.done();
SearchCriteria<HostVO> sc = sb.create();
sc.setParameters("resource_state", oldState);
sc.setParameters("id", host.getId());
UpdateBuilder ub = getUpdateBuilder(host);
ub.set(host, _resourceStateAttr, newState);
int result = update(ub, sc, null);
assert result <= 1 : "How can this update " + result + " rows? ";
if (state_logger.isDebugEnabled() && result == 0) {
HostVO ho = findById(host.getId());
assert ho != null : "How how how? : " + host.getId();
StringBuilder str = new StringBuilder("Unable to update resource state: [");
str.append("m = " + host.getId());
str.append("; name = " + host.getName());
str.append("; old state = " + oldState);
str.append("; event = " + event);
str.append("; new state = " + newState + "]");
state_logger.debug(str.toString());
} else {
StringBuilder msg = new StringBuilder("Resource state update: [");
msg.append("id = " + host.getId());
msg.append("; name = " + host.getName());
msg.append("; old state = " + oldState);
msg.append("; event = " + event);
msg.append("; new state = " + newState + "]");
state_logger.debug(msg.toString());
} }
return listBy(sc); return result > 0;
}
@Override
public List<HostVO> listManagedDirectAgents() {
SearchCriteria<HostVO> sc = ManagedDirectConnectSearch.create();
return listBy(sc);
}
@Override
public List<HostVO> listManagedRoutingAgents() {
SearchCriteria<HostVO> sc = ManagedRoutingServersSearch.create();
sc.setParameters("type", Type.Routing);
return listBy(sc);
}
@Override
public List<HostVO> listRoutingHostsByManagementServer(long msId) {
SearchCriteria<HostVO> sc = MsStatusSearch.create();
sc.setParameters("ms", msId);
sc.setParameters("type", Type.Routing);
return listBy(sc);
}
@Override
public List<HostVO> listAllRoutingAgents() {
SearchCriteria<HostVO> sc = RoutingSearch.create();
sc.setParameters("type", Type.Routing);
return listBy(sc);
} }
} }

View File

@ -134,6 +134,7 @@ public class CloudZonesStartupProcessor implements StartupCommandProcessor {
} }
protected boolean processHostStartup(StartupRoutingCommand startup) throws ConnectionException{ protected boolean processHostStartup(StartupRoutingCommand startup) throws ConnectionException{
/*
boolean found = false; boolean found = false;
Type type = Host.Type.Routing; Type type = Host.Type.Routing;
final Map<String, String> hostDetails = startup.getHostDetails(); final Map<String, String> hostDetails = startup.getHostDetails();
@ -170,6 +171,7 @@ public class CloudZonesStartupProcessor implements StartupCommandProcessor {
s_logger.info("Old " + server.getType().toString() s_logger.info("Old " + server.getType().toString()
+ " host reconnected w/ id =" + server.getId()); + " host reconnected w/ id =" + server.getId());
} }
*/
return true; return true;
@ -396,6 +398,7 @@ public class CloudZonesStartupProcessor implements StartupCommandProcessor {
protected boolean processStorageStartup(StartupStorageCommand startup) throws ConnectionException{ protected boolean processStorageStartup(StartupStorageCommand startup) throws ConnectionException{
/*
if (startup.getResourceType() != Storage.StorageResourceType.LOCAL_SECONDARY_STORAGE) { if (startup.getResourceType() != Storage.StorageResourceType.LOCAL_SECONDARY_STORAGE) {
return false; return false;
} }
@ -435,6 +438,7 @@ public class CloudZonesStartupProcessor implements StartupCommandProcessor {
s_logger.info("Old " + server.getType().toString() s_logger.info("Old " + server.getType().toString()
+ " host reconnected w/ id =" + server.getId()); + " host reconnected w/ id =" + server.getId());
} }
*/
return true; return true;

View File

@ -48,6 +48,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.hyperv.resource.HypervDummyResourceBase; import com.cloud.hypervisor.hyperv.resource.HypervDummyResourceBase;
import com.cloud.resource.Discoverer; import com.cloud.resource.Discoverer;
import com.cloud.resource.DiscovererBase; import com.cloud.resource.DiscovererBase;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.nio.HandlerFactory; import com.cloud.utils.nio.HandlerFactory;
@ -65,6 +66,7 @@ public class HypervServerDiscoverer extends DiscovererBase implements Discoverer
@Inject AlertManager _alertMgr; @Inject AlertManager _alertMgr;
@Inject ClusterDetailsDao _clusterDetailsDao; @Inject ClusterDetailsDao _clusterDetailsDao;
@Inject HostDao _hostDao = null; @Inject HostDao _hostDao = null;
@Inject ResourceManager _resourceMgr;
Link _link; Link _link;
@SuppressWarnings("static-access") @SuppressWarnings("static-access")
@ -105,7 +107,7 @@ public class HypervServerDiscoverer extends DiscovererBase implements Discoverer
String agentIp = ia.getHostAddress(); String agentIp = ia.getHostAddress();
String guid = UUID.nameUUIDFromBytes(agentIp.getBytes()).toString(); String guid = UUID.nameUUIDFromBytes(agentIp.getBytes()).toString();
String guidWithTail = guid + "-HypervResource";/*tail added by agent.java*/ String guidWithTail = guid + "-HypervResource";/*tail added by agent.java*/
if (_hostDao.findByGuid(guidWithTail) != null) { if (_resourceMgr.findHostByGuid(guidWithTail) != null) {
s_logger.debug("Skipping " + agentIp + " because " + guidWithTail + " is already in the database."); s_logger.debug("Skipping " + agentIp + " because " + guidWithTail + " is already in the database.");
return null; return null;
} }
@ -204,7 +206,7 @@ public class HypervServerDiscoverer extends DiscovererBase implements Discoverer
private HostVO waitForHostConnect(long dcId, long podId, long clusterId, String guid) { private HostVO waitForHostConnect(long dcId, long podId, long clusterId, String guid) {
for (int i = 0; i < _waitTime *2; i++) { for (int i = 0; i < _waitTime *2; i++) {
List<HostVO> hosts = _hostDao.listBy(Host.Type.Routing, clusterId, podId, dcId); List<HostVO> hosts = _resourceMgr.listAllUpAndEnabledHosts(Host.Type.Routing, clusterId, podId, dcId);
for (HostVO host : hosts) { for (HostVO host : hosts) {
if (host.getGuid().equalsIgnoreCase(guid)) { if (host.getGuid().equalsIgnoreCase(guid)) {
return host; return host;

View File

@ -30,18 +30,23 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
import com.cloud.agent.Listener; import com.cloud.agent.Listener;
import com.cloud.agent.api.AgentControlAnswer; import com.cloud.agent.api.AgentControlAnswer;
import com.cloud.agent.api.AgentControlCommand; import com.cloud.agent.api.AgentControlCommand;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.agent.api.ShutdownCommand;
import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupRoutingCommand;
import com.cloud.configuration.Config; import com.cloud.configuration.Config;
import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.dc.ClusterVO; import com.cloud.dc.ClusterVO;
import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.ClusterDao;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.DiscoveredWithErrorException; import com.cloud.exception.DiscoveredWithErrorException;
import com.cloud.exception.DiscoveryException; import com.cloud.exception.DiscoveryException;
import com.cloud.exception.OperationTimedoutException;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
@ -51,7 +56,10 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.kvm.resource.KvmDummyResourceBase; import com.cloud.hypervisor.kvm.resource.KvmDummyResourceBase;
import com.cloud.resource.Discoverer; import com.cloud.resource.Discoverer;
import com.cloud.resource.DiscovererBase; import com.cloud.resource.DiscovererBase;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceStateAdapter;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.script.Script; import com.cloud.utils.script.Script;
@ -62,7 +70,7 @@ import com.trilead.ssh2.Session;
@Local(value=Discoverer.class) @Local(value=Discoverer.class)
public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
Listener { Listener, ResourceStateAdapter {
private static final Logger s_logger = Logger.getLogger(KvmServerDiscoverer.class); private static final Logger s_logger = Logger.getLogger(KvmServerDiscoverer.class);
private String _setupAgentPath; private String _setupAgentPath;
private ConfigurationDao _configDao; private ConfigurationDao _configDao;
@ -73,6 +81,8 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
private String _kvmGuestNic; private String _kvmGuestNic;
@Inject HostDao _hostDao = null; @Inject HostDao _hostDao = null;
@Inject ClusterDao _clusterDao; @Inject ClusterDao _clusterDao;
@Inject ResourceManager _resourceMgr;
@Inject AgentManager _agentMgr;
@Override @Override
public boolean processAnswers(long agentId, long seq, Answer[] answers) { public boolean processAnswers(long agentId, long seq, Answer[] answers) {
@ -149,7 +159,7 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
agentIp = ia.getHostAddress(); agentIp = ia.getHostAddress();
String guid = UUID.nameUUIDFromBytes(agentIp.getBytes()).toString(); String guid = UUID.nameUUIDFromBytes(agentIp.getBytes()).toString();
String guidWithTail = guid + "-LibvirtComputingResource";/*tail added by agent.java*/ String guidWithTail = guid + "-LibvirtComputingResource";/*tail added by agent.java*/
if (_hostDao.findByGuid(guidWithTail) != null) { if (_resourceMgr.findHostByGuid(guidWithTail) != null) {
s_logger.debug("Skipping " + agentIp + " because " + guidWithTail + " is already in the database."); s_logger.debug("Skipping " + agentIp + " because " + guidWithTail + " is already in the database.");
return null; return null;
} }
@ -221,7 +231,7 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
private HostVO waitForHostConnect(long dcId, long podId, long clusterId, String guid) { private HostVO waitForHostConnect(long dcId, long podId, long clusterId, String guid) {
for (int i = 0; i < _waitTime *2; i++) { for (int i = 0; i < _waitTime *2; i++) {
List<HostVO> hosts = _hostDao.listBy(Host.Type.Routing, clusterId, podId, dcId); List<HostVO> hosts = _resourceMgr.listAllUpAndEnabledHosts(Host.Type.Routing, clusterId, podId, dcId);
for (HostVO host : hosts) { for (HostVO host : hosts) {
if (host.getGuid().equalsIgnoreCase(guid)) { if (host.getGuid().equalsIgnoreCase(guid)) {
return host; return host;
@ -264,6 +274,7 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
if (_hostIp == null) { if (_hostIp == null) {
throw new ConfigurationException("Can't get host IP"); throw new ConfigurationException("Can't get host IP");
} }
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
return true; return true;
} }
@ -290,4 +301,66 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
return Hypervisor.HypervisorType.KVM.toString().equalsIgnoreCase(hypervisor); return Hypervisor.HypervisorType.KVM.toString().equalsIgnoreCase(hypervisor);
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
StartupCommand firstCmd = cmd[0];
if (!(firstCmd instanceof StartupRoutingCommand)) {
return null;
}
StartupRoutingCommand ssCmd = ((StartupRoutingCommand) firstCmd);
if (ssCmd.getHypervisorType() != HypervisorType.KVM) {
return null;
}
/* KVM requires host are the same in cluster */
ClusterVO clusterVO = _clusterDao.findById(host.getClusterId());
List<HostVO> hostsInCluster = _resourceMgr.listAllHostsInCluster(clusterVO.getId());
if (!hostsInCluster.isEmpty()) {
HostVO oneHost = hostsInCluster.get(0);
_hostDao.loadDetails(oneHost);
String hostOsInCluster = oneHost.getDetail("Host.OS");
String hostOs = ssCmd.getHostDetails().get("Host.OS");
if (!hostOsInCluster.equalsIgnoreCase(hostOs)) {
throw new IllegalArgumentException("Can't add host: " + firstCmd.getPrivateIpAddress() + " with hostOS: " + hostOs + " into a cluster,"
+ "in which there are " + hostOsInCluster + " hosts added");
}
}
return _resourceMgr.fillRoutingHostVO(host, ssCmd, HypervisorType.KVM, null, null);
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
List<String> hostTags) {
// TODO Auto-generated method stub
return null;
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
if (host.getType() != Host.Type.Routing || host.getHypervisorType() != HypervisorType.KVM) {
return null;
}
_resourceMgr.deleteRoutingHost(host, isForced, isForceDeleteStorage);
try {
ShutdownCommand cmd = new ShutdownCommand(ShutdownCommand.DeleteHost, null);
_agentMgr.send(host.getId(), cmd);
} catch (AgentUnavailableException e) {
s_logger.warn("Sending ShutdownCommand failed: ", e);
} catch (OperationTimedoutException e) {
s_logger.warn("Sending ShutdownCommand failed: ", e);
}
return new DeleteHostAnswer(true);
}
@Override
public boolean stop() {
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return super.stop();
}
} }

View File

@ -62,6 +62,7 @@ import com.cloud.org.Cluster.ClusterType;
import com.cloud.secstorage.CommandExecLogDao; import com.cloud.secstorage.CommandExecLogDao;
import com.cloud.serializer.GsonHelper; import com.cloud.serializer.GsonHelper;
import com.cloud.storage.StorageLayer; import com.cloud.storage.StorageLayer;
import com.cloud.storage.secondary.SecondaryStorageVmManager;
import com.cloud.utils.FileUtil; import com.cloud.utils.FileUtil;
import com.cloud.utils.NumbersUtil; import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair; import com.cloud.utils.Pair;
@ -102,6 +103,7 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis
@Inject ClusterManager _clusterMgr; @Inject ClusterManager _clusterMgr;
@Inject CheckPointManager _checkPointMgr; @Inject CheckPointManager _checkPointMgr;
@Inject VirtualNetworkApplianceManager _routerMgr; @Inject VirtualNetworkApplianceManager _routerMgr;
@Inject SecondaryStorageVmManager _ssvmMgr;
String _mountParent; String _mountParent;
StorageLayer _storage; StorageLayer _storage;
@ -436,7 +438,7 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis
@Override @Override
public String getSecondaryStorageStoreUrl(long dcId) { public String getSecondaryStorageStoreUrl(long dcId) {
List<HostVO> secStorageHosts = _hostDao.listSecondaryStorageHosts(dcId); List<HostVO> secStorageHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId);
if(secStorageHosts.size() > 0) if(secStorageHosts.size() > 0)
return secStorageHosts.get(0).getStorageUrl(); return secStorageHosts.get(0).getStorageUrl();

View File

@ -16,6 +16,8 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupRoutingCommand;
import com.cloud.alert.AlertManager; import com.cloud.alert.AlertManager;
import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterDetailsDao;
@ -35,7 +37,10 @@ import com.cloud.hypervisor.vmware.resource.VmwareResource;
import com.cloud.hypervisor.vmware.util.VmwareContext; import com.cloud.hypervisor.vmware.util.VmwareContext;
import com.cloud.resource.Discoverer; import com.cloud.resource.Discoverer;
import com.cloud.resource.DiscovererBase; import com.cloud.resource.DiscovererBase;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceStateAdapter;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
@ -48,7 +53,7 @@ import com.vmware.vim25.ClusterDasConfigInfo;
import com.vmware.vim25.ManagedObjectReference; import com.vmware.vim25.ManagedObjectReference;
@Local(value=Discoverer.class) @Local(value=Discoverer.class)
public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer { public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer, ResourceStateAdapter {
private static final Logger s_logger = Logger.getLogger(VmwareServerDiscoverer.class); private static final Logger s_logger = Logger.getLogger(VmwareServerDiscoverer.class);
@Inject ClusterDao _clusterDao; @Inject ClusterDao _clusterDao;
@ -57,6 +62,7 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer
@Inject VMTemplateDao _tmpltDao; @Inject VMTemplateDao _tmpltDao;
@Inject ClusterDetailsDao _clusterDetailsDao; @Inject ClusterDetailsDao _clusterDetailsDao;
@Inject HostDao _hostDao; @Inject HostDao _hostDao;
@Inject ResourceManager _resourceMgr;
@Override @Override
public Map<? extends ServerResource, Map<String, String>> find(long dcId, Long podId, Long clusterId, URI url, public Map<? extends ServerResource, Map<String, String>> find(long dcId, Long podId, Long clusterId, URI url,
@ -78,7 +84,7 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer
return null; return null;
} }
List<HostVO> hosts = _hostDao.listByCluster(clusterId); List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(clusterId);
if(hosts.size() >= _vmwareMgr.getMaxHostsPerCluster()) { if(hosts.size() >= _vmwareMgr.getMaxHostsPerCluster()) {
String msg = "VMware cluster " + cluster.getName() + " is too big to add new host now. (current configured cluster size: " + _vmwareMgr.getMaxHostsPerCluster() + ")"; String msg = "VMware cluster " + cluster.getName() + " is too big to add new host now. (current configured cluster size: " + _vmwareMgr.getMaxHostsPerCluster() + ")";
s_logger.error(msg); s_logger.error(msg);
@ -224,8 +230,10 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer
createVmwareToolsIso(); createVmwareToolsIso();
if(s_logger.isInfoEnabled()) if(s_logger.isInfoEnabled()) {
s_logger.info("VmwareServerDiscoverer has been successfully configured"); s_logger.info("VmwareServerDiscoverer has been successfully configured");
}
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
return true; return true;
} }
@ -246,5 +254,39 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer
_tmpltDao.update(id, tmplt); _tmpltDao.update(id, tmplt);
} }
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
// TODO Auto-generated method stub
return null;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
List<String> hostTags) {
StartupCommand firstCmd = startup[0];
if (!(firstCmd instanceof StartupRoutingCommand)) {
return null;
}
StartupRoutingCommand ssCmd = ((StartupRoutingCommand) firstCmd);
if (ssCmd.getHypervisorType() != HypervisorType.VMware) {
return null;
}
return _resourceMgr.fillRoutingHostVO(host, ssCmd, HypervisorType.VMware, details, hostTags);
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean stop() {
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return super.stop();
}
} }

View File

@ -47,7 +47,11 @@ import com.cloud.alert.AlertManager;
import com.cloud.configuration.Config; import com.cloud.configuration.Config;
import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.dc.ClusterVO; import com.cloud.dc.ClusterVO;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO;
import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConnectionException; import com.cloud.exception.ConnectionException;
import com.cloud.exception.DiscoveredWithErrorException; import com.cloud.exception.DiscoveredWithErrorException;
@ -69,7 +73,10 @@ import com.cloud.hypervisor.xen.resource.XenServer600Resource;
import com.cloud.hypervisor.xen.resource.XenServerConnectionPool; import com.cloud.hypervisor.xen.resource.XenServerConnectionPool;
import com.cloud.resource.Discoverer; import com.cloud.resource.Discoverer;
import com.cloud.resource.DiscovererBase; import com.cloud.resource.DiscovererBase;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceStateAdapter;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
@ -88,7 +95,7 @@ import com.xensource.xenapi.Types.SessionAuthenticationFailed;
import com.xensource.xenapi.Types.XenAPIException; import com.xensource.xenapi.Types.XenAPIException;
@Local(value=Discoverer.class) @Local(value=Discoverer.class)
public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, Listener { public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, Listener, ResourceStateAdapter {
private static final Logger s_logger = Logger.getLogger(XcpServerDiscoverer.class); private static final Logger s_logger = Logger.getLogger(XcpServerDiscoverer.class);
protected String _publicNic; protected String _publicNic;
protected String _privateNic; protected String _privateNic;
@ -108,6 +115,9 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
@Inject VMTemplateHostDao _vmTemplateHostDao; @Inject VMTemplateHostDao _vmTemplateHostDao;
@Inject ClusterDao _clusterDao; @Inject ClusterDao _clusterDao;
@Inject protected ConfigurationDao _configDao; @Inject protected ConfigurationDao _configDao;
@Inject ResourceManager _resourceMgr;
@Inject HostPodDao _podDao;
@Inject DataCenterDao _dcDao;
protected XcpServerDiscoverer() { protected XcpServerDiscoverer() {
} }
@ -141,7 +151,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
} }
try { try {
List<HostVO> eHosts = _hostDao.listByCluster(clusterId); List<HostVO> eHosts = _resourceMgr.listAllHostsInCluster(clusterId);
if( eHosts.size() > 0 ) { if( eHosts.size() > 0 ) {
HostVO eHost = eHosts.get(0); HostVO eHost = eHosts.get(0);
_hostDao.loadDetails(eHost); _hostDao.loadDetails(eHost);
@ -170,7 +180,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
if ( clu.getGuid()== null ) { if ( clu.getGuid()== null ) {
clu.setGuid(poolUuid); clu.setGuid(poolUuid);
} else { } else {
List<HostVO> clusterHosts = _hostDao.listByCluster(clusterId); List<HostVO> clusterHosts = _resourceMgr.listAllHostsInCluster(clusterId);
if( clusterHosts != null && clusterHosts.size() > 0) { if( clusterHosts != null && clusterHosts.size() > 0) {
if (!clu.getGuid().equals(poolUuid)) { if (!clu.getGuid().equals(poolUuid)) {
if (hosts.size() == 1) { if (hosts.size() == 1) {
@ -233,7 +243,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
String hostOSVer = prodVersion; String hostOSVer = prodVersion;
String hostKernelVer = record.softwareVersion.get("linux"); String hostKernelVer = record.softwareVersion.get("linux");
if (_hostDao.findByGuid(record.uuid) != null) { if (_resourceMgr.findHostByGuid(record.uuid) != null) {
s_logger.debug("Skipping " + record.address + " because " + record.uuid + " is already in the database."); s_logger.debug("Skipping " + record.address + " because " + record.uuid + " is already in the database.");
continue; continue;
} }
@ -338,7 +348,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
protected boolean addHostsToPool(Connection conn, String hostIp, Long clusterId) throws XenAPIException, XmlRpcException, DiscoveryException { protected boolean addHostsToPool(Connection conn, String hostIp, Long clusterId) throws XenAPIException, XmlRpcException, DiscoveryException {
List<HostVO> hosts; List<HostVO> hosts;
hosts = _hostDao.listByCluster(clusterId); hosts = _resourceMgr.listAllHostsInCluster(clusterId);
String masterIp = null; String masterIp = null;
String username = null; String username = null;
@ -454,6 +464,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
_agentMgr.registerForHostEvents(this, true, false, true); _agentMgr.registerForHostEvents(this, true, false, true);
createXsToolsISO(); createXsToolsISO();
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
return true; return true;
} }
@ -618,4 +629,42 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
public boolean processTimeout(long agentId, long seq) { public boolean processTimeout(long agentId, long seq) {
return false; return false;
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
// TODO Auto-generated method stub
return null;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
List<String> hostTags) {
StartupCommand firstCmd = startup[0];
if (!(firstCmd instanceof StartupRoutingCommand)) {
return null;
}
StartupRoutingCommand ssCmd = ((StartupRoutingCommand) firstCmd);
if (ssCmd.getHypervisorType() != HypervisorType.XenServer) {
return null;
}
HostPodVO pod = _podDao.findById(host.getPodId());
DataCenterVO dc = _dcDao.findById(host.getDataCenterId());
s_logger.info("Host: " + host.getName() + " connected with hypervisor type: " + HypervisorType.XenServer + ". Checking CIDR...");
_resourceMgr.checkCIDR(pod, dc, ssCmd.getPrivateIpAddress(), ssCmd.getPrivateNetmask());
return _resourceMgr.fillRoutingHostVO(host, ssCmd, HypervisorType.XenServer, details, hostTags);
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean stop() {
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return super.stop();
}
} }

View File

@ -43,6 +43,7 @@ import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.xen.resource.XenServerConnectionPool; import com.cloud.hypervisor.xen.resource.XenServerConnectionPool;
import com.cloud.resource.ResourceManager;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.AccountDao;
import com.cloud.utils.PropertiesUtil; import com.cloud.utils.PropertiesUtil;
@ -68,6 +69,7 @@ public class Db21to22MigrationUtil {
private InstanceGroupVMMapDao _groupVMMapDao; private InstanceGroupVMMapDao _groupVMMapDao;
private ConfigurationDao _configurationDao; private ConfigurationDao _configurationDao;
private DataCenterDao _zoneDao; private DataCenterDao _zoneDao;
private ResourceManager _resourceMgr;
private void doMigration() { private void doMigration() {
setupComponents(); setupComponents();
@ -88,7 +90,7 @@ public class Db21to22MigrationUtil {
XenServerConnectionPool _connPool = XenServerConnectionPool.getInstance(); XenServerConnectionPool _connPool = XenServerConnectionPool.getInstance();
List<ClusterVO> clusters = _clusterDao.listByHyTypeWithoutGuid(HypervisorType.XenServer.toString()); List<ClusterVO> clusters = _clusterDao.listByHyTypeWithoutGuid(HypervisorType.XenServer.toString());
for (ClusterVO cluster : clusters) { for (ClusterVO cluster : clusters) {
List<HostVO> hosts = _hostDao.listByCluster(cluster.getId()); List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cluster.getId());
for (HostVO host : hosts) { for (HostVO host : hosts) {
String ip = host.getPrivateIpAddress(); String ip = host.getPrivateIpAddress();
String username = host.getDetail("username"); String username = host.getDetail("username");
@ -179,6 +181,7 @@ public class Db21to22MigrationUtil {
_groupVMMapDao = locator.getDao(InstanceGroupVMMapDao.class); _groupVMMapDao = locator.getDao(InstanceGroupVMMapDao.class);
_configurationDao = locator.getDao(ConfigurationDao.class); _configurationDao = locator.getDao(ConfigurationDao.class);
_zoneDao = locator.getDao(DataCenterDao.class); _zoneDao = locator.getDao(DataCenterDao.class);
_resourceMgr = locator.getManager(ResourceManager.class);
} }
private void setupInstanceGroups() { private void setupInstanceGroups() {

View File

@ -37,6 +37,9 @@ import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer; import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer;
import com.cloud.agent.api.ExternalNetworkResourceUsageCommand; import com.cloud.agent.api.ExternalNetworkResourceUsageCommand;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupExternalFirewallCommand;
import com.cloud.agent.api.StartupExternalLoadBalancerCommand;
import com.cloud.agent.api.routing.IpAssocCommand; import com.cloud.agent.api.routing.IpAssocCommand;
import com.cloud.agent.api.routing.LoadBalancerConfigCommand; import com.cloud.agent.api.routing.LoadBalancerConfigCommand;
import com.cloud.agent.api.routing.NetworkElementCommand; import com.cloud.agent.api.routing.NetworkElementCommand;
@ -93,7 +96,10 @@ import com.cloud.network.rules.dao.PortForwardingRulesDao;
import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceStateAdapter;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.server.api.response.ExternalFirewallResponse; import com.cloud.server.api.response.ExternalFirewallResponse;
import com.cloud.server.api.response.ExternalLoadBalancerResponse; import com.cloud.server.api.response.ExternalLoadBalancerResponse;
import com.cloud.user.Account; import com.cloud.user.Account;
@ -121,7 +127,7 @@ import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.NicDao;
@Local(value = {ExternalNetworkManager.class}) @Local(value = {ExternalNetworkManager.class})
public class ExternalNetworkManagerImpl implements ExternalNetworkManager { public class ExternalNetworkManagerImpl implements ExternalNetworkManager, ResourceStateAdapter {
public enum ExternalNetworkResourceName { public enum ExternalNetworkResourceName {
JuniperSrx, JuniperSrx,
F5BigIp, F5BigIp,
@ -147,6 +153,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
@Inject VpnUserDao _vpnUsersDao; @Inject VpnUserDao _vpnUsersDao;
@Inject InlineLoadBalancerNicMapDao _inlineLoadBalancerNicMapDao; @Inject InlineLoadBalancerNicMapDao _inlineLoadBalancerNicMapDao;
@Inject AccountManager _accountMgr; @Inject AccountManager _accountMgr;
@Inject ResourceManager _resourceMgr;
ScheduledExecutorService _executor; ScheduledExecutorService _executor;
int _externalNetworkStatsInterval; int _externalNetworkStatsInterval;
@ -161,6 +168,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
if (_externalNetworkStatsInterval > 0){ if (_externalNetworkStatsInterval > 0){
_executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("ExternalNetworkMonitor")); _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("ExternalNetworkMonitor"));
} }
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
return true; return true;
} }
@ -174,6 +182,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
@Override @Override
public boolean stop() { public boolean stop() {
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return true; return true;
} }
@ -192,7 +201,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
s_logger.debug("Zone " + zone.getName() + " is not configured for external networking."); s_logger.debug("Zone " + zone.getName() + " is not configured for external networking.");
return null; return null;
} else { } else {
List<HostVO> externalNetworkAppliancesInZone = _hostDao.listBy(type, zoneId); List<HostVO> externalNetworkAppliancesInZone = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByType(type, zoneId);
if (externalNetworkAppliancesInZone.size() != 1) { if (externalNetworkAppliancesInZone.size() != 1) {
return null; return null;
} else { } else {
@ -216,7 +225,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
zoneName = zone.getName(); zoneName = zone.getName();
} }
List<HostVO> externalLoadBalancersInZone = _hostDao.listByTypeDataCenter(Host.Type.ExternalLoadBalancer, zoneId); List<HostVO> externalLoadBalancersInZone = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.ExternalLoadBalancer, zoneId);
if (externalLoadBalancersInZone.size() != 0) { if (externalLoadBalancersInZone.size() != 0) {
throw new InvalidParameterValueException("Already found an external load balancer in zone: " + zoneName); throw new InvalidParameterValueException("Already found an external load balancer in zone: " + zoneName);
} }
@ -285,7 +294,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
throw new CloudRuntimeException(e.getMessage()); throw new CloudRuntimeException(e.getMessage());
} }
Host host = _agentMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails); Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails);
if (host != null) { if (host != null) {
if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.F5BigIP.getName())) { if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.F5BigIP.getName())) {
zone.setLoadBalancerProvider(Network.Provider.F5BigIp.getName()); zone.setLoadBalancerProvider(Network.Provider.F5BigIp.getName());
@ -309,7 +318,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
} }
try { try {
if (_agentMgr.maintain(hostId) && _agentMgr.deleteHost(hostId, false, false, caller)) { if (_resourceMgr.maintain(hostId) && _resourceMgr.deleteHost(hostId, false, false)) {
DataCenterVO zone = _dcDao.findById(externalLoadBalancer.getDataCenterId()); DataCenterVO zone = _dcDao.findById(externalLoadBalancer.getDataCenterId());
if (zone.getNetworkType().equals(NetworkType.Advanced)) { if (zone.getNetworkType().equals(NetworkType.Advanced)) {
@ -331,7 +340,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
@Override @Override
public List<HostVO> listExternalLoadBalancers(ListExternalLoadBalancersCmd cmd) { public List<HostVO> listExternalLoadBalancers(ListExternalLoadBalancersCmd cmd) {
long zoneId = cmd.getZoneId(); long zoneId = cmd.getZoneId();
return _hostDao.listByTypeDataCenter(Host.Type.ExternalLoadBalancer, zoneId); return _resourceMgr.listAllHostsInOneZoneByType(Host.Type.ExternalLoadBalancer, zoneId);
} }
@Override @Override
@ -533,7 +542,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
zoneName = zone.getName(); zoneName = zone.getName();
} }
List<HostVO> externalFirewallsInZone = _hostDao.listByTypeDataCenter(Host.Type.ExternalFirewall, zoneId); List<HostVO> externalFirewallsInZone = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.ExternalFirewall, zoneId);
if (externalFirewallsInZone.size() != 0) { if (externalFirewallsInZone.size() != 0) {
throw new InvalidParameterValueException("Already added an external firewall in zone: " + zoneName); throw new InvalidParameterValueException("Already added an external firewall in zone: " + zoneName);
} }
@ -630,7 +639,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
throw new CloudRuntimeException(e.getMessage()); throw new CloudRuntimeException(e.getMessage());
} }
Host externalFirewall = _agentMgr.addHost(zoneId, resource, Host.Type.ExternalFirewall, hostDetails); Host externalFirewall = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalFirewall, hostDetails);
if (externalFirewall != null) { if (externalFirewall != null) {
zone.setFirewallProvider(Network.Provider.JuniperSRX.getName()); zone.setFirewallProvider(Network.Provider.JuniperSRX.getName());
zone.setUserDataProvider(Network.Provider.DhcpServer.getName()); zone.setUserDataProvider(Network.Provider.DhcpServer.getName());
@ -669,7 +678,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
} }
try { try {
if (_agentMgr.maintain(hostId) && _agentMgr.deleteHost(hostId, false, false, caller)) { if (_resourceMgr.maintain(hostId) && _resourceMgr.deleteHost(hostId, false, false)) {
DataCenterVO zone = _dcDao.findById(externalFirewall.getDataCenterId()); DataCenterVO zone = _dcDao.findById(externalFirewall.getDataCenterId());
zone.setFirewallProvider(Network.Provider.VirtualRouter.getName()); zone.setFirewallProvider(Network.Provider.VirtualRouter.getName());
zone.setUserDataProvider(Network.Provider.VirtualRouter.getName()); zone.setUserDataProvider(Network.Provider.VirtualRouter.getName());
@ -708,7 +717,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
@Override @Override
public List<HostVO> listExternalFirewalls(ListExternalFirewallsCmd cmd) { public List<HostVO> listExternalFirewalls(ListExternalFirewallsCmd cmd) {
long zoneId = cmd.getZoneId(); long zoneId = cmd.getZoneId();
return _hostDao.listByTypeDataCenter(Host.Type.ExternalFirewall, zoneId); return _resourceMgr.listAllHostsInOneZoneByType(Host.Type.ExternalFirewall, zoneId);
} }
@Override @Override
@ -1285,4 +1294,30 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
} }
} }
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
// TODO Auto-generated method stub
return null;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
List<String> hostTags) {
if (startup[0] instanceof StartupExternalFirewallCommand) {
host.setType(Host.Type.ExternalFirewall);
return host;
} else if (startup[0] instanceof StartupExternalLoadBalancerCommand) {
host.setType(Host.Type.ExternalLoadBalancer);
return host;
} else {
return null;
}
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
// TODO Auto-generated method stub
return null;
}
} }

View File

@ -25,6 +25,7 @@ import com.cloud.exception.InvalidParameterValueException;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.resource.ResourceManager;
import com.cloud.server.api.response.NetworkDeviceResponse; import com.cloud.server.api.response.NetworkDeviceResponse;
import com.cloud.server.api.response.NwDeviceDhcpResponse; import com.cloud.server.api.response.NwDeviceDhcpResponse;
import com.cloud.server.api.response.PxePingResponse; import com.cloud.server.api.response.PxePingResponse;
@ -38,6 +39,7 @@ public class NetworkDeviceManagerImpl implements NetworkDeviceManager {
@Inject ExternalDhcpManager _dhcpMgr; @Inject ExternalDhcpManager _dhcpMgr;
@Inject PxeServerManager _pxeMgr; @Inject PxeServerManager _pxeMgr;
@Inject HostDao _hostDao; @Inject HostDao _hostDao;
@Inject ResourceManager _resourceMgr;
@Override @Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
@ -137,14 +139,14 @@ public class NetworkDeviceManagerImpl implements NetworkDeviceManager {
private List<Host> listNetworkDevice(Long zoneId, Long podId, Host.Type type) { private List<Host> listNetworkDevice(Long zoneId, Long podId, Host.Type type) {
List<Host> res = new ArrayList<Host>(); List<Host> res = new ArrayList<Host>();
if (podId != null) { if (podId != null) {
List<HostVO> devs = _hostDao.listBy(type, null, podId, zoneId); List<HostVO> devs = _resourceMgr.listAllUpAndEnabledHosts(type, null, podId, zoneId);
if (devs.size() == 1) { if (devs.size() == 1) {
res.add(devs.get(0)); res.add(devs.get(0));
} else { } else {
s_logger.debug("List " + type + ": " + devs.size() + " found"); s_logger.debug("List " + type + ": " + devs.size() + " found");
} }
} else { } else {
List<HostVO> devs = _hostDao.listBy(type, zoneId); List<HostVO> devs = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByType(type, zoneId);
res.addAll(devs); res.addAll(devs);
} }

View File

@ -66,6 +66,10 @@ import com.cloud.network.Network.GuestIpType;
import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkDao;
import com.cloud.network.resource.TrafficSentinelResource; import com.cloud.network.resource.TrafficSentinelResource;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceStateAdapter;
import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.server.api.response.TrafficMonitorResponse; import com.cloud.server.api.response.TrafficMonitorResponse;
import com.cloud.usage.UsageIPAddressVO; import com.cloud.usage.UsageIPAddressVO;
import com.cloud.user.AccountManager; import com.cloud.user.AccountManager;
@ -87,7 +91,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.MacAddress; import com.cloud.utils.net.MacAddress;
@Local(value = {NetworkUsageManager.class}) @Local(value = {NetworkUsageManager.class})
public class NetworkUsageManagerImpl implements NetworkUsageManager { public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceStateAdapter {
public enum NetworkUsageResourceName { public enum NetworkUsageResourceName {
TrafficSentinel; TrafficSentinel;
} }
@ -104,6 +108,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
@Inject HostDetailsDao _detailsDao; @Inject HostDetailsDao _detailsDao;
@Inject AccountManager _accountMgr; @Inject AccountManager _accountMgr;
@Inject NetworkDao _networksDao = null; @Inject NetworkDao _networksDao = null;
@Inject ResourceManager _resourceMgr;
ScheduledExecutorService _executor; ScheduledExecutorService _executor;
int _networkStatsInterval; int _networkStatsInterval;
protected SearchBuilder<IPAddressVO> AllocatedIpSearch; protected SearchBuilder<IPAddressVO> AllocatedIpSearch;
@ -122,7 +127,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
} }
List<HostVO> trafficMonitorsInZone = _hostDao.listByTypeDataCenter(Host.Type.TrafficMonitor, zoneId); List<HostVO> trafficMonitorsInZone = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.TrafficMonitor, zoneId);
if (trafficMonitorsInZone.size() != 0) { if (trafficMonitorsInZone.size() != 0) {
throw new InvalidParameterValueException("Already added an traffic monitor in zone: " + zoneName); throw new InvalidParameterValueException("Already added an traffic monitor in zone: " + zoneName);
} }
@ -161,7 +166,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
hostDetails.put("url", cmd.getUrl()); hostDetails.put("url", cmd.getUrl());
hostDetails.put("last_collection", ""+System.currentTimeMillis()); hostDetails.put("last_collection", ""+System.currentTimeMillis());
Host trafficMonitor = _agentMgr.addHost(zoneId, resource, Host.Type.TrafficMonitor, hostDetails); Host trafficMonitor = _resourceMgr.addHost(zoneId, resource, Host.Type.TrafficMonitor, hostDetails);
return trafficMonitor; return trafficMonitor;
} }
@ -179,7 +184,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
} }
try { try {
if (_agentMgr.maintain(hostId) && _agentMgr.deleteHost(hostId, false, false, caller)) { if (_resourceMgr.maintain(hostId) && _resourceMgr.deleteHost(hostId, false, false)) {
return true; return true;
} else { } else {
return false; return false;
@ -193,7 +198,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
@Override @Override
public List<HostVO> listTrafficMonitors(ListTrafficMonitorsCmd cmd) { public List<HostVO> listTrafficMonitors(ListTrafficMonitorsCmd cmd) {
long zoneId = cmd.getZoneId(); long zoneId = cmd.getZoneId();
return _hostDao.listByTypeDataCenter(Host.Type.TrafficMonitor, zoneId); return _resourceMgr.listAllHostsInOneZoneByType(Host.Type.TrafficMonitor, zoneId);
} }
@Override @Override
@ -221,6 +226,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
_networkStatsInterval = NumbersUtil.parseInt(_configDao.getValue(Config.DirectNetworkStatsInterval.key()), 86400); _networkStatsInterval = NumbersUtil.parseInt(_configDao.getValue(Config.DirectNetworkStatsInterval.key()), 86400);
_agentMgr.registerForHostEvents(new DirectNetworkStatsListener( _networkStatsInterval), true, false, false); _agentMgr.registerForHostEvents(new DirectNetworkStatsListener( _networkStatsInterval), true, false, false);
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
return true; return true;
} }
@ -231,6 +237,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
@Override @Override
public boolean stop() { public boolean stop() {
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return true; return true;
} }
@ -499,4 +506,27 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
// TODO Auto-generated method stub
return null;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
List<String> hostTags) {
if (!(startup[0] instanceof StartupTrafficMonitorCommand)) {
return null;
}
host.setType(Host.Type.TrafficMonitor);
return host;
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
// TODO Auto-generated method stub
return null;
}
} }

View File

@ -44,6 +44,8 @@ import com.cloud.network.ovs.dao.OvsWorkDao;
import com.cloud.network.ovs.dao.OvsWorkVO.Step; import com.cloud.network.ovs.dao.OvsWorkVO.Step;
import com.cloud.network.ovs.dao.VlanMappingDao; import com.cloud.network.ovs.dao.VlanMappingDao;
import com.cloud.network.ovs.dao.VlanMappingVO; import com.cloud.network.ovs.dao.VlanMappingVO;
import com.cloud.resource.ResourceManager;
import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
public class OvsListener implements Listener { public class OvsListener implements Listener {
@ -53,6 +55,7 @@ public class OvsListener implements Listener {
GreTunnelDao _tunnelDao; GreTunnelDao _tunnelDao;
VlanMappingDao _mappingDao; VlanMappingDao _mappingDao;
HostDao _hostDao; HostDao _hostDao;
ResourceManager _resourceMgr;
public OvsListener(OvsNetworkManager ovsMgr, OvsWorkDao workDao, GreTunnelDao tunnelDao, public OvsListener(OvsNetworkManager ovsMgr, OvsWorkDao workDao, GreTunnelDao tunnelDao,
VlanMappingDao mappingDao, HostDao hostDao) { VlanMappingDao mappingDao, HostDao hostDao) {
@ -61,6 +64,8 @@ public class OvsListener implements Listener {
this._tunnelDao = tunnelDao; this._tunnelDao = tunnelDao;
this._mappingDao = mappingDao; this._mappingDao = mappingDao;
this._hostDao = hostDao; this._hostDao = hostDao;
ComponentLocator locator = ComponentLocator.getLocator("management-server");
_resourceMgr = locator.getManager(ResourceManager.class);
} }
@Override @Override
@ -131,7 +136,7 @@ public class OvsListener implements Listener {
} }
try { try {
List<HostVO> hosts = _hostDao.listByType(Host.Type.Routing); List<HostVO> hosts = _resourceMgr.listAllHostsInAllZonesByType(Host.Type.Routing);
for (HostVO h : hosts) { for (HostVO h : hosts) {
if (h.getId() == host.getId()) { if (h.getId() == host.getId()) {
continue; continue;

View File

@ -38,15 +38,20 @@ import com.cloud.host.dao.HostDao;
import com.cloud.network.ovs.dao.GreTunnelVO; import com.cloud.network.ovs.dao.GreTunnelVO;
import com.cloud.network.ovs.dao.OvsTunnelDao; import com.cloud.network.ovs.dao.OvsTunnelDao;
import com.cloud.network.ovs.dao.OvsTunnelVO; import com.cloud.network.ovs.dao.OvsTunnelVO;
import com.cloud.resource.ResourceManager;
import com.cloud.utils.component.ComponentLocator;
public class OvsTunnelListener implements Listener { public class OvsTunnelListener implements Listener {
public static final Logger s_logger = Logger.getLogger(OvsListener.class.getName()); public static final Logger s_logger = Logger.getLogger(OvsListener.class.getName());
HostDao _hostDao; HostDao _hostDao;
OvsTunnelDao _tunnelDao; OvsTunnelDao _tunnelDao;
ResourceManager _resourceMgr;
public OvsTunnelListener(OvsTunnelDao tunnelDao, HostDao hostDao) { public OvsTunnelListener(OvsTunnelDao tunnelDao, HostDao hostDao) {
this._hostDao = hostDao; this._hostDao = hostDao;
this._tunnelDao = tunnelDao; this._tunnelDao = tunnelDao;
ComponentLocator locator = ComponentLocator.getLocator("management-server");
_resourceMgr = locator.getManager(ResourceManager.class);
} }
@Override @Override
@ -76,7 +81,7 @@ public class OvsTunnelListener implements Listener {
} }
try { try {
List<HostVO> hosts = _hostDao.listByType(Host.Type.Routing); List<HostVO> hosts = _resourceMgr.listAllHostsInAllZonesByType(Host.Type.Routing);
for (HostVO h : hosts) { for (HostVO h : hosts) {
if (h.getId() == host.getId()) { if (h.getId() == host.getId()) {
continue; continue;

View File

@ -17,7 +17,21 @@
*/ */
package com.cloud.resource; package com.cloud.resource;
import java.util.List;
import java.util.Map;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupRoutingCommand;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.Status;
import com.cloud.host.Host.Type;
import com.cloud.host.HostVO;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.resource.ResourceState.Event;
import com.cloud.utils.fsm.NoTransitionException;
/** /**
* ResourceManager manages how physical resources are organized within the * ResourceManager manages how physical resources are organized within the
@ -34,4 +48,62 @@ public interface ResourceManager {
public void registerResourceEvent(Integer event, ResourceListener listener); public void registerResourceEvent(Integer event, ResourceListener listener);
public void unregisterResourceEvent(ResourceListener listener); public void unregisterResourceEvent(ResourceListener listener);
/**
*
* @param name of adapter
* @param adapter
* @param hates, a list of names which will be eliminated by this adapter. Especially for the case where
* can be only one adapter responds to an event, e.g. startupCommand
*/
public void registerResourceStateAdapter(String name, ResourceStateAdapter adapter);
public void unregisterResourceStateAdapter(String name);
public Host createHostAndAgent(Long hostId, ServerResource resource, Map<String, String> details, boolean old, List<String> hostTags,
boolean forRebalance);
public Host addHost(long zoneId, ServerResource resource, Type hostType, Map<String, String> hostDetails);
public HostVO createHostVOForConnectedAgent(StartupCommand[] cmds);
public void checkCIDR(HostPodVO pod, DataCenterVO dc, String serverPrivateIP, String serverPrivateNetmask);
public HostVO fillRoutingHostVO(HostVO host, StartupRoutingCommand ssCmd, HypervisorType hyType, Map<String, String> details, List<String> hostTags);
public void deleteRoutingHost(HostVO host, boolean isForced, boolean forceDestroyStorage) throws UnableDeleteHostException;
public boolean executeUserRequest(long hostId, ResourceState.Event event) throws AgentUnavailableException;
boolean resourceStateTransitTo(Host host, Event event, long msId) throws NoTransitionException;
boolean umanageHost(long hostId);
boolean maintenanceFailed(long hostId);
public boolean maintain(final long hostId) throws AgentUnavailableException;
public boolean deleteHost(long hostId, boolean isForced, boolean isForceDeleteStorage);
public List<HostVO> findDirectlyConnectedHosts();
public List<HostVO> listAllUpAndEnabledHosts(Host.Type type, Long clusterId, Long podId, long dcId);
public List<HostVO> listAllHostsInCluster(long clusterId);
public List<HostVO> listHostsInClusterByStatus(long clusterId, Status status);
public List<HostVO> listAllUpAndEnabledHostsInOneZoneByType(Host.Type type, long dcId);
public List<HostVO> listAllHostsInOneZoneByType(Host.Type type, long dcId);
public List<HostVO> listAllHostsInAllZonesByType(Type type);
public List<HypervisorType> listAvailHypervisorInZone(Long hostId, Long zoneId);
public HostVO findHostByGuid(String guid);
public HostVO findHostByName(String name);
public List<HostVO> listHostsByNameLike(String name);
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,47 @@
package com.cloud.resource;
import java.util.List;
import java.util.Map;
import com.cloud.agent.api.StartupAnswer;
import com.cloud.agent.api.StartupCommand;
import com.cloud.exception.ConnectionException;
import com.cloud.host.HostVO;
import com.cloud.utils.component.Adapter;
public interface ResourceStateAdapter extends Adapter {
static public enum Event {
CREATE_HOST_VO_FOR_CONNECTED,
CREATE_HOST_VO_FOR_DIRECT_CONNECT,
DELETE_HOST,
}
static public class DeleteHostAnswer {
private boolean isContinue;
private boolean isException;
public DeleteHostAnswer(boolean isContinue) {
this.isContinue = isContinue;
this.isException = false;
}
public DeleteHostAnswer(boolean isContinue, boolean isException) {
this.isContinue = isContinue;
this.isException = isException;
}
public boolean getIsContinue() {
return this.isContinue;
}
public boolean getIsException() {
return this.isException;
}
}
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd);
public HostVO createHostVOForDirectConnectAgent(HostVO host, final StartupCommand[] startup, ServerResource resource, Map<String, String> details, List<String> hostTags);
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException;
}

View File

@ -18,6 +18,7 @@ import com.cloud.configuration.Config;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.resource.ResourceManager;
import com.cloud.storage.secondary.SecondaryStorageManagerImpl; import com.cloud.storage.secondary.SecondaryStorageManagerImpl;
import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.storage.secondary.SecondaryStorageVmManager;
import com.cloud.utils.DateUtil; import com.cloud.utils.DateUtil;
@ -45,6 +46,7 @@ public class PremiumSecondaryStorageManagerImpl extends SecondaryStorageManagerI
@Inject SecondaryStorageVmDao _secStorageVmDao; @Inject SecondaryStorageVmDao _secStorageVmDao;
@Inject CommandExecLogDao _cmdExecLogDao; @Inject CommandExecLogDao _cmdExecLogDao;
@Inject HostDao _hostDao; @Inject HostDao _hostDao;
@Inject ResourceManager _resourceMgr;
protected SearchBuilder<CommandExecLogVO> ActiveCommandSearch; protected SearchBuilder<CommandExecLogVO> ActiveCommandSearch;
protected SearchBuilder<HostVO> HostSearch; protected SearchBuilder<HostVO> HostSearch;
@ -68,7 +70,6 @@ public class PremiumSecondaryStorageManagerImpl extends SecondaryStorageManagerI
HostSearch.done(); HostSearch.done();
ActiveCommandSearch.done(); ActiveCommandSearch.done();
return true; return true;
} }
@ -135,7 +136,7 @@ public class PremiumSecondaryStorageManagerImpl extends SecondaryStorageManagerI
for(Long vmId : vms) { for(Long vmId : vms) {
SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(vmId); SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(vmId);
HostVO host; HostVO host;
host = _hostDao.findByName(secStorageVm.getHostName()); host = _resourceMgr.findHostByName(secStorageVm.getHostName());
if(host != null && host.getStatus() == Status.Up) if(host != null && host.getStatus() == Status.Up)
return new Pair<HostVO, SecondaryStorageVmVO>(host, secStorageVm); return new Pair<HostVO, SecondaryStorageVmVO>(host, secStorageVm);
} }

View File

@ -171,6 +171,7 @@ import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkDao;
import com.cloud.projects.Project; import com.cloud.projects.Project;
import com.cloud.projects.ProjectManager; import com.cloud.projects.ProjectManager;
import com.cloud.resource.ResourceManager;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.DiskOfferingVO;
@ -310,6 +311,7 @@ public class ManagementServerImpl implements ManagementServer {
private final HypervisorCapabilitiesDao _hypervisorCapabilitiesDao; private final HypervisorCapabilitiesDao _hypervisorCapabilitiesDao;
private final Adapters<HostAllocator> _hostAllocators; private final Adapters<HostAllocator> _hostAllocators;
@Inject ProjectManager _projectMgr; @Inject ProjectManager _projectMgr;
private final ResourceManager _resourceMgr;
private final KeystoreManager _ksMgr; private final KeystoreManager _ksMgr;
@ -375,6 +377,7 @@ public class ManagementServerImpl implements ManagementServer {
_sshKeyPairDao = locator.getDao(SSHKeyPairDao.class); _sshKeyPairDao = locator.getDao(SSHKeyPairDao.class);
_itMgr = locator.getManager(VirtualMachineManager.class); _itMgr = locator.getManager(VirtualMachineManager.class);
_ksMgr = locator.getManager(KeystoreManager.class); _ksMgr = locator.getManager(KeystoreManager.class);
_resourceMgr = locator.getManager(ResourceManager.class);
_hypervisorCapabilitiesDao = locator.getDao(HypervisorCapabilitiesDao.class); _hypervisorCapabilitiesDao = locator.getDao(HypervisorCapabilitiesDao.class);
@ -1378,7 +1381,7 @@ public class ManagementServerImpl implements ManagementServer {
} }
List<HypervisorType> hypers = null; List<HypervisorType> hypers = null;
if( ! isIso ) { if( ! isIso ) {
hypers = _hostDao.getAvailHypervisorInZone(null, null); hypers = _resourceMgr.listAvailHypervisorInZone(null, null);
} }
Set<Pair<Long, Long>> templateZonePairSet = new HashSet<Pair<Long, Long>>(); Set<Pair<Long, Long>> templateZonePairSet = new HashSet<Pair<Long, Long>>();
@ -3412,7 +3415,7 @@ public class ManagementServerImpl implements ManagementServer {
String secondaryStorageURL = _storageMgr.getSecondaryStorageURL(zoneId); String secondaryStorageURL = _storageMgr.getSecondaryStorageURL(zoneId);
StoragePoolVO srcPool = _poolDao.findById(volume.getPoolId()); StoragePoolVO srcPool = _poolDao.findById(volume.getPoolId());
List<HostVO> storageServers = _hostDao.listByTypeDataCenter(Host.Type.SecondaryStorage, zoneId); List<HostVO> storageServers = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.SecondaryStorage, zoneId);
HostVO sserver = storageServers.get(0); HostVO sserver = storageServers.get(0);
List<UploadVO> extractURLList = _uploadDao.listByTypeUploadStatus(volumeId, Upload.Type.VOLUME, UploadVO.Status.DOWNLOAD_URL_CREATED); List<UploadVO> extractURLList = _uploadDao.listByTypeUploadStatus(volumeId, Upload.Type.VOLUME, UploadVO.Status.DOWNLOAD_URL_CREATED);
@ -3867,7 +3870,7 @@ public class ManagementServerImpl implements ManagementServer {
} }
} else { } else {
// get all the hosts in this cluster // get all the hosts in this cluster
List<HostVO> hosts = _hostDao.listByCluster(cmd.getClusterId()); List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cmd.getClusterId());
Transaction txn = Transaction.currentTxn(); Transaction txn = Transaction.currentTxn();
txn.start(); txn.start();
for (HostVO h : hosts) { for (HostVO h : hosts) {

View File

@ -46,6 +46,7 @@ import com.cloud.host.HostStats;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.resource.ResourceState;
import com.cloud.storage.StorageManager; import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePoolHostVO; import com.cloud.storage.StoragePoolHostVO;
import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StoragePoolVO;
@ -55,6 +56,7 @@ import com.cloud.storage.VolumeVO;
import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.StoragePoolDao;
import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.storage.dao.StoragePoolHostDao;
import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeDao;
import com.cloud.storage.secondary.SecondaryStorageVmManager;
import com.cloud.utils.NumbersUtil; import com.cloud.utils.NumbersUtil;
import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.concurrency.NamedThreadFactory;
@ -84,6 +86,7 @@ public class StatsCollector {
private final StoragePoolDao _storagePoolDao; private final StoragePoolDao _storagePoolDao;
private final StorageManager _storageManager; private final StorageManager _storageManager;
private final StoragePoolHostDao _storagePoolHostDao; private final StoragePoolHostDao _storagePoolHostDao;
private final SecondaryStorageVmManager _ssvmMgr;
private ConcurrentHashMap<Long, HostStats> _hostStats = new ConcurrentHashMap<Long, HostStats>(); private ConcurrentHashMap<Long, HostStats> _hostStats = new ConcurrentHashMap<Long, HostStats>();
private final ConcurrentHashMap<Long, VmStats> _VmStats = new ConcurrentHashMap<Long, VmStats>(); private final ConcurrentHashMap<Long, VmStats> _VmStats = new ConcurrentHashMap<Long, VmStats>();
@ -112,6 +115,7 @@ public class StatsCollector {
ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name);
_agentMgr = locator.getManager(AgentManager.class); _agentMgr = locator.getManager(AgentManager.class);
_userVmMgr = locator.getManager(UserVmManager.class); _userVmMgr = locator.getManager(UserVmManager.class);
_ssvmMgr = locator.getManager(SecondaryStorageVmManager.class);
_hostDao = locator.getDao(HostDao.class); _hostDao = locator.getDao(HostDao.class);
_userVmDao = locator.getDao(UserVmDao.class); _userVmDao = locator.getDao(UserVmDao.class);
_volsDao = locator.getDao(VolumeDao.class); _volsDao = locator.getDao(VolumeDao.class);
@ -154,6 +158,7 @@ public class StatsCollector {
SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria(); SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria();
sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString()); sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString());
sc.addAnd("resourceState", SearchCriteria.Op.NIN, ResourceState.Maintenance, ResourceState.PrepareForMaintenance, ResourceState.ErrorInMaintenance);
sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.Storage.toString()); sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.Storage.toString());
sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.ConsoleProxy.toString()); sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.ConsoleProxy.toString());
sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.SecondaryStorage.toString()); sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.SecondaryStorage.toString());
@ -193,6 +198,7 @@ public class StatsCollector {
SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria(); SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria();
sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString()); sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString());
sc.addAnd("resourceState", SearchCriteria.Op.NIN, ResourceState.Maintenance, ResourceState.PrepareForMaintenance, ResourceState.ErrorInMaintenance);
sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.Storage.toString()); sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.Storage.toString());
sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.ConsoleProxy.toString()); sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.ConsoleProxy.toString());
sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.SecondaryStorage.toString()); sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.SecondaryStorage.toString());
@ -265,7 +271,7 @@ public class StatsCollector {
s_logger.debug("StorageCollector is running..."); s_logger.debug("StorageCollector is running...");
} }
List<HostVO> hosts = _hostDao.listSecondaryStorageHosts(); List<HostVO> hosts = _ssvmMgr.listSecondaryStorageHostsInAllZones();
ConcurrentHashMap<Long, StorageStats> storageStats = new ConcurrentHashMap<Long, StorageStats>(); ConcurrentHashMap<Long, StorageStats> storageStats = new ConcurrentHashMap<Long, StorageStats>();
for (HostVO host : hosts) { for (HostVO host : hosts) {
if ( host.getStorageUrl() == null ) { if ( host.getStorageUrl() == null ) {

View File

@ -28,6 +28,9 @@ import com.cloud.storage.dao.StoragePoolDao;
import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.storage.dao.StoragePoolHostDao;
import com.cloud.utils.Ternary; import com.cloud.utils.Ternary;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.SearchCriteria2;
import com.cloud.utils.db.SearchCriteriaService;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
@Local(value ={OCFS2Manager.class}) @Local(value ={OCFS2Manager.class})
@ -129,7 +132,12 @@ public class OCFS2ManagerImpl implements OCFS2Manager, ResourceListener {
throw new CloudRuntimeException("Cannot find cluster for ID " + clusterId); throw new CloudRuntimeException("Cannot find cluster for ID " + clusterId);
} }
List<HostVO> hosts = _hostDao.listByInAllStatus(Host.Type.Routing, clusterId, cluster.getPodId(), cluster.getDataCenterId()); SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getClusterId(), Op.EQ, clusterId);
sc.addAnd(sc.getEntity().getPodId(), Op.EQ, cluster.getPodId());
sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, cluster.getDataCenterId());
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.Routing);
List<HostVO> hosts = sc.list();
if (hosts.isEmpty()) { if (hosts.isEmpty()) {
s_logger.debug("There is no host in cluster " + clusterId + ", no need to prepare OCFS2 nodes"); s_logger.debug("There is no host in cluster " + clusterId + ", no need to prepare OCFS2 nodes");
return true; return true;

View File

@ -117,6 +117,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.network.NetworkManager; import com.cloud.network.NetworkManager;
import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.org.Grouping; import com.cloud.org.Grouping;
import com.cloud.resource.ResourceManager;
import com.cloud.server.ManagementServer; import com.cloud.server.ManagementServer;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDao;
@ -289,6 +290,10 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
protected OCFS2Manager _ocfs2Mgr; protected OCFS2Manager _ocfs2Mgr;
@Inject @Inject
protected ResourceLimitService _resourceLimitMgr; protected ResourceLimitService _resourceLimitMgr;
@Inject
protected SecondaryStorageVmManager _ssvmMgr;
@Inject
protected ResourceManager _resourceMgr;
@Inject(adapter = StoragePoolAllocator.class) @Inject(adapter = StoragePoolAllocator.class)
protected Adapters<StoragePoolAllocator> _storagePoolAllocators; protected Adapters<StoragePoolAllocator> _storagePoolAllocators;
@ -361,7 +366,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
List<StoragePoolVO> pools = _storagePoolDao.listAll(); List<StoragePoolVO> pools = _storagePoolDao.listAll();
// if no pools or 1 pool which is in maintenance // if no pools or 1 pool which is in maintenance
if (pools == null || pools.size() == 0 || (pools.size() == 1 && pools.get(0).getStatus().equals(Status.Maintenance))) { if (pools == null || pools.size() == 0 || (pools.size() == 1 && pools.get(0).getStatus().equals(StoragePoolStatus.Maintenance))) {
return false; return false;
} else { } else {
return true; return true;
@ -965,7 +970,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
public Pair<String, String> getAbsoluteIsoPath(long templateId, long dataCenterId) { public Pair<String, String> getAbsoluteIsoPath(long templateId, long dataCenterId) {
String isoPath = null; String isoPath = null;
List<HostVO> storageHosts = _hostDao.listAllBy(Host.Type.SecondaryStorage, dataCenterId); List<HostVO> storageHosts = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.SecondaryStorage, dataCenterId);
if (storageHosts != null) { if (storageHosts != null) {
for (HostVO storageHost : storageHosts) { for (HostVO storageHost : storageHosts) {
VMTemplateHostVO templateHostVO = _vmTemplateHostDao.findByHostTemplate(storageHost.getId(), templateId); VMTemplateHostVO templateHostVO = _vmTemplateHostDao.findByHostTemplate(storageHost.getId(), templateId);
@ -993,7 +998,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
@Override @Override
public HostVO getSecondaryStorageHost(long zoneId, long tmpltId) { public HostVO getSecondaryStorageHost(long zoneId, long tmpltId) {
List<HostVO> hosts = _hostDao.listSecondaryStorageHosts(zoneId); List<HostVO> hosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
if( hosts == null || hosts.size() == 0) { if( hosts == null || hosts.size() == 0) {
return null; return null;
} }
@ -1008,7 +1013,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
@Override @Override
public VMTemplateHostVO getTemplateHostRef(long zoneId, long tmpltId, boolean readyOnly) { public VMTemplateHostVO getTemplateHostRef(long zoneId, long tmpltId, boolean readyOnly) {
List<HostVO> hosts = _hostDao.listSecondaryStorageHosts(zoneId); List<HostVO> hosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
if( hosts == null || hosts.size() == 0) { if( hosts == null || hosts.size() == 0) {
return null; return null;
} }
@ -1034,9 +1039,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
@Override @Override
public HostVO getSecondaryStorageHost(long zoneId) { public HostVO getSecondaryStorageHost(long zoneId) {
List<HostVO> hosts = _hostDao.listSecondaryStorageHosts(zoneId); List<HostVO> hosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
if( hosts == null || hosts.size() == 0) { if( hosts == null || hosts.size() == 0) {
hosts = _hostDao.listLocalSecondaryStorageHosts(zoneId); hosts = _ssvmMgr.listLocalSecondaryStorageHostsInOneZone(zoneId);
if (hosts.isEmpty()) { if (hosts.isEmpty()) {
return null; return null;
} }
@ -1050,9 +1055,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
@Override @Override
public List<HostVO> getSecondaryStorageHosts(long zoneId) { public List<HostVO> getSecondaryStorageHosts(long zoneId) {
List<HostVO> hosts = _hostDao.listSecondaryStorageHosts(zoneId); List<HostVO> hosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
if( hosts == null || hosts.size() == 0) { if( hosts == null || hosts.size() == 0) {
hosts = _hostDao.listLocalSecondaryStorageHosts(zoneId); hosts = _ssvmMgr.listLocalSecondaryStorageHostsInOneZone(zoneId);
if (hosts.isEmpty()) { if (hosts.isEmpty()) {
return new ArrayList<HostVO>(); return new ArrayList<HostVO>();
} }
@ -1132,7 +1137,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
} }
// Check if there is host up in this cluster // Check if there is host up in this cluster
List<HostVO> allHosts = _hostDao.listBy(Host.Type.Routing, clusterId, podId, zoneId); List<HostVO> allHosts = _resourceMgr.listAllUpAndEnabledHosts(Host.Type.Routing, clusterId, podId, zoneId);
if (allHosts.isEmpty()) { if (allHosts.isEmpty()) {
throw new ResourceUnavailableException("No host up to associate a storage pool with in cluster " + clusterId, HostPodVO.class, podId); throw new ResourceUnavailableException("No host up to associate a storage pool with in cluster " + clusterId, HostPodVO.class, podId);
} }
@ -1686,9 +1691,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
} }
// Check that there is at least one host in the specified zone // Check that there is at least one host in the specified zone
List<HostVO> hosts = _hostDao.listByDataCenter(zoneId); List<HostVO> hosts = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByType(Host.Type.Routing, zoneId);
if (hosts.isEmpty()) { if (hosts.isEmpty()) {
throw new InvalidParameterValueException("Please add a host in the specified zone before creating a new volume."); throw new InvalidParameterValueException("There is no workable host in data center id " + zoneId + ", please check hosts' agent status and see if they are disabled");
} }
if (!sharedPoolExists) { if (!sharedPoolExists) {
@ -1934,7 +1939,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
} }
// Cleanup secondary storage hosts // Cleanup secondary storage hosts
List<HostVO> secondaryStorageHosts = _hostDao.listSecondaryStorageHosts(); List<HostVO> secondaryStorageHosts = _ssvmMgr.listSecondaryStorageHostsInAllZones();
for (HostVO secondaryStorageHost : secondaryStorageHosts) { for (HostVO secondaryStorageHost : secondaryStorageHosts) {
try { try {
long hostId = secondaryStorageHost.getId(); long hostId = secondaryStorageHost.getId();
@ -2031,7 +2036,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
} }
List<HostVO> hosts = _hostDao.listByClusterStatus(primaryStorage.getClusterId(), Status.Up); List<HostVO> hosts = _resourceMgr.listHostsInClusterByStatus(primaryStorage.getClusterId(), Status.Up);
if( hosts == null || hosts.size() == 0 ) { if( hosts == null || hosts.size() == 0 ) {
primaryStorage.setStatus(StoragePoolStatus.Maintenance); primaryStorage.setStatus(StoragePoolStatus.Maintenance);
_storagePoolDao.update(primaryStorageId, primaryStorage); _storagePoolDao.update(primaryStorageId, primaryStorage);
@ -2260,7 +2265,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
primaryStorage.setStatus(StoragePoolStatus.Up); primaryStorage.setStatus(StoragePoolStatus.Up);
_storagePoolDao.update(primaryStorageId, primaryStorage); _storagePoolDao.update(primaryStorageId, primaryStorage);
txn.commit(); txn.commit();
List<HostVO> hosts = _hostDao.listByClusterStatus(primaryStorage.getClusterId(), Status.Up); List<HostVO> hosts = _resourceMgr.listHostsInClusterByStatus(primaryStorage.getClusterId(), Status.Up);
if( hosts == null || hosts.size() == 0 ) { if( hosts == null || hosts.size() == 0 ) {
return _storagePoolDao.findById(primaryStorageId); return _storagePoolDao.findById(primaryStorageId);
} }
@ -3131,7 +3136,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
long dcId = pool.getDataCenterId(); long dcId = pool.getDataCenterId();
Long podId = pool.getPodId(); Long podId = pool.getPodId();
List<HostVO> secHosts = _hostDao.listSecondaryStorageHosts(dcId); List<HostVO> secHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId);
//FIXME, for cloudzone, the local secondary storoge //FIXME, for cloudzone, the local secondary storoge
if (pool.isLocal() && pool.getPoolType() == StoragePoolType.Filesystem && secHosts.isEmpty()) { if (pool.isLocal() && pool.getPoolType() == StoragePoolType.Filesystem && secHosts.isEmpty()) {

View File

@ -54,6 +54,7 @@ import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.resource.ResourceManager;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateStorageResourceAssoc;
@ -104,6 +105,8 @@ public class DownloadMonitorImpl implements DownloadMonitor {
SecondaryStorageVmDao _secStorageVmDao; SecondaryStorageVmDao _secStorageVmDao;
@Inject @Inject
AlertManager _alertMgr; AlertManager _alertMgr;
@Inject
SecondaryStorageVmManager _ssvmMgr;
@Inject @Inject
private final DataCenterDao _dcDao = null; private final DataCenterDao _dcDao = null;
@ -125,6 +128,8 @@ public class DownloadMonitorImpl implements DownloadMonitor {
private ClusterDao _clusterDao; private ClusterDao _clusterDao;
@Inject @Inject
private HostDao _hostDao; private HostDao _hostDao;
@Inject
private ResourceManager _resourceMgr;
private String _name; private String _name;
private Boolean _sslCopy = new Boolean(false); private Boolean _sslCopy = new Boolean(false);
@ -361,7 +366,7 @@ public class DownloadMonitorImpl implements DownloadMonitor {
long templateId = template.getId(); long templateId = template.getId();
boolean isPublic = template.isFeatured() || template.isPublicTemplate(); boolean isPublic = template.isFeatured() || template.isPublicTemplate();
for ( DataCenterVO dc : dcs ) { for ( DataCenterVO dc : dcs ) {
List<HostVO> ssHosts = _hostDao.listAllSecondaryStorageHosts(dc.getId()); List<HostVO> ssHosts = _ssvmMgr.listAllTypesSecondaryStorageHostsInOneZone(dc.getId());
for ( HostVO ssHost : ssHosts ) { for ( HostVO ssHost : ssHosts ) {
if (isTemplateUpdateable(templateId, ssHost.getId())) { if (isTemplateUpdateable(templateId, ssHost.getId())) {
initiateTemplateDownload(templateId, ssHost); initiateTemplateDownload(templateId, ssHost);
@ -419,14 +424,14 @@ public class DownloadMonitorImpl implements DownloadMonitor {
@Override @Override
public void handleSysTemplateDownload(HostVO host) { public void handleSysTemplateDownload(HostVO host) {
List<HypervisorType> hypers = _hostDao.getAvailHypervisorInZone(host.getId(), host.getDataCenterId()); List<HypervisorType> hypers = _resourceMgr.listAvailHypervisorInZone(host.getId(), host.getDataCenterId());
HypervisorType hostHyper = host.getHypervisorType(); HypervisorType hostHyper = host.getHypervisorType();
if (hypers.contains(hostHyper)) { if (hypers.contains(hostHyper)) {
return; return;
} }
Set<VMTemplateVO> toBeDownloaded = new HashSet<VMTemplateVO>(); Set<VMTemplateVO> toBeDownloaded = new HashSet<VMTemplateVO>();
List<HostVO> ssHosts = _hostDao.listBy(Host.Type.SecondaryStorage, host.getDataCenterId()); List<HostVO> ssHosts = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByType(Host.Type.SecondaryStorage, host.getDataCenterId());
if (ssHosts == null || ssHosts.isEmpty()) { if (ssHosts == null || ssHosts.isEmpty()) {
return; return;
} }
@ -481,7 +486,7 @@ public class DownloadMonitorImpl implements DownloadMonitor {
@Override @Override
public void handleTemplateSync(long dcId) { public void handleTemplateSync(long dcId) {
List<HostVO> ssHosts = _hostDao.listSecondaryStorageHosts(dcId); List<HostVO> ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId);
for ( HostVO ssHost : ssHosts ) { for ( HostVO ssHost : ssHosts ) {
handleTemplateSync(ssHost); handleTemplateSync(ssHost);
} }

View File

@ -32,6 +32,7 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status.Event; import com.cloud.host.Status.Event;
@ -78,6 +79,8 @@ public class SecondaryStorageDiscoverer extends DiscovererBase implements Discov
protected VMTemplateDao _vmTemplateDao = null; protected VMTemplateDao _vmTemplateDao = null;
@Inject @Inject
protected ConfigurationDao _configDao = null; protected ConfigurationDao _configDao = null;
@Inject
protected AgentManager _agentMgr = null;
protected SecondaryStorageDiscoverer() { protected SecondaryStorageDiscoverer() {
} }
@ -290,7 +293,7 @@ public class SecondaryStorageDiscoverer extends DiscovererBase implements Discov
public void postDiscovery(List<HostVO> hosts, long msId) { public void postDiscovery(List<HostVO> hosts, long msId) {
if (_useServiceVM) { if (_useServiceVM) {
for (HostVO h: hosts) { for (HostVO h: hosts) {
_hostDao.disconnect(h, Event.AgentDisconnected, msId); _agentMgr.agentStatusTransitTo(h, Event.AgentDisconnected, msId);
} }
} }
for (HostVO h: hosts) { for (HostVO h: hosts) {

View File

@ -28,6 +28,7 @@ import com.cloud.agent.api.Command;
import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupSecondaryStorageCommand; import com.cloud.agent.api.StartupSecondaryStorageCommand;
import com.cloud.agent.api.StartupStorageCommand; import com.cloud.agent.api.StartupStorageCommand;
import com.cloud.cluster.ManagementServerNode;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.Status.Event; import com.cloud.host.Status.Event;
@ -71,7 +72,6 @@ public class SecondaryStorageListener implements Listener {
@Override @Override
public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) { public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) {
if ((cmd instanceof StartupStorageCommand) ) { if ((cmd instanceof StartupStorageCommand) ) {
StartupStorageCommand scmd = (StartupStorageCommand)cmd; StartupStorageCommand scmd = (StartupStorageCommand)cmd;
if (scmd.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE ) { if (scmd.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE ) {
@ -82,7 +82,6 @@ public class SecondaryStorageListener implements Listener {
if(s_logger.isInfoEnabled()) { if(s_logger.isInfoEnabled()) {
s_logger.info("Received a host startup notification " + cmd); s_logger.info("Received a host startup notification " + cmd);
} }
_agentMgr.updateStatus(agent, Event.Ready);
_ssVmMgr.onAgentConnect(agent.getDataCenterId(), cmd); _ssVmMgr.onAgentConnect(agent.getDataCenterId(), cmd);
_ssVmMgr.generateSetupCommand(agent.getId()); _ssVmMgr.generateSetupCommand(agent.getId());
_ssVmMgr.generateFirewallConfiguration(agent.getId()); _ssVmMgr.generateFirewallConfiguration(agent.getId());
@ -90,8 +89,6 @@ public class SecondaryStorageListener implements Listener {
return; return;
} }
return; return;
} }
@Override @Override

View File

@ -18,6 +18,8 @@
package com.cloud.storage.secondary; package com.cloud.storage.secondary;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
@ -38,6 +40,8 @@ import com.cloud.agent.api.SecStorageSetupAnswer;
import com.cloud.agent.api.SecStorageSetupCommand; import com.cloud.agent.api.SecStorageSetupCommand;
import com.cloud.agent.api.SecStorageVMSetupCommand; import com.cloud.agent.api.SecStorageVMSetupCommand;
import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupSecondaryStorageCommand;
import com.cloud.agent.api.StartupStorageCommand;
import com.cloud.agent.api.StopAnswer; import com.cloud.agent.api.StopAnswer;
import com.cloud.agent.api.check.CheckSshAnswer; import com.cloud.agent.api.check.CheckSshAnswer;
import com.cloud.agent.api.check.CheckSshCommand; import com.cloud.agent.api.check.CheckSshCommand;
@ -69,6 +73,10 @@ import com.cloud.network.NetworkManager;
import com.cloud.network.NetworkVO; import com.cloud.network.NetworkVO;
import com.cloud.network.Networks.TrafficType; import com.cloud.network.Networks.TrafficType;
import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceStateAdapter;
import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.SnapshotVO; import com.cloud.storage.SnapshotVO;
@ -79,6 +87,7 @@ import com.cloud.storage.dao.SnapshotDao;
import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.storage.dao.StoragePoolHostDao;
import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VMTemplateHostDao;
import com.cloud.storage.resource.DummySecondaryStorageResource;
import com.cloud.storage.template.TemplateConstants; import com.cloud.storage.template.TemplateConstants;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.user.AccountService; import com.cloud.user.AccountService;
@ -90,6 +99,9 @@ import com.cloud.utils.component.Adapters;
import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.SearchCriteria2;
import com.cloud.utils.db.SearchCriteriaService;
import com.cloud.utils.events.SubscriptionMgr; import com.cloud.utils.events.SubscriptionMgr;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils; import com.cloud.utils.net.NetUtils;
@ -110,6 +122,7 @@ import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.SecondaryStorageVmDao;
import com.cloud.vm.dao.UserVmDetailsDao; import com.cloud.vm.dao.UserVmDetailsDao;
import com.cloud.vm.dao.VMInstanceDao; import com.cloud.vm.dao.VMInstanceDao;
import com.cloud.storage.Storage;
// //
// Possible secondary storage vm state transition cases // Possible secondary storage vm state transition cases
@ -130,7 +143,7 @@ import com.cloud.vm.dao.VMInstanceDao;
// because sooner or later, it will be driven into Running state // because sooner or later, it will be driven into Running state
// //
@Local(value = { SecondaryStorageVmManager.class }) @Local(value = { SecondaryStorageVmManager.class })
public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, VirtualMachineGuru<SecondaryStorageVmVO>, SystemVmLoadScanHandler<Long> { public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, VirtualMachineGuru<SecondaryStorageVmVO>, SystemVmLoadScanHandler<Long>, ResourceStateAdapter {
private static final Logger s_logger = Logger.getLogger(SecondaryStorageManagerImpl.class); private static final Logger s_logger = Logger.getLogger(SecondaryStorageManagerImpl.class);
private static final int DEFAULT_CAPACITY_SCAN_INTERVAL = 30000; // 30 private static final int DEFAULT_CAPACITY_SCAN_INTERVAL = 30000; // 30
@ -189,6 +202,10 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
protected CapacityDao _capacityDao; protected CapacityDao _capacityDao;
@Inject @Inject
UserVmDetailsDao _vmDetailsDao; UserVmDetailsDao _vmDetailsDao;
@Inject
protected ResourceManager _resourceMgr;
@Inject
protected SecondaryStorageVmManager _ssvmMgr;
private long _capacityScanInterval = DEFAULT_CAPACITY_SCAN_INTERVAL; private long _capacityScanInterval = DEFAULT_CAPACITY_SCAN_INTERVAL;
@ -248,7 +265,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
return false; return false;
} }
List<HostVO> ssHosts = _hostDao.listSecondaryStorageHosts(zoneId); List<HostVO> ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
for( HostVO ssHost : ssHosts ) { for( HostVO ssHost : ssHosts ) {
String secUrl = ssHost.getStorageUrl(); String secUrl = ssHost.getStorageUrl();
SecStorageSetupCommand setupCmd = new SecStorageSetupCommand(secUrl); SecStorageSetupCommand setupCmd = new SecStorageSetupCommand(secUrl);
@ -273,7 +290,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
String secUrl = cssHost.getStorageUrl(); String secUrl = cssHost.getStorageUrl();
SecStorageSetupCommand setupCmd = new SecStorageSetupCommand(secUrl); SecStorageSetupCommand setupCmd = new SecStorageSetupCommand(secUrl);
for ( SecondaryStorageVmVO ssVm : alreadyRunning ) { for ( SecondaryStorageVmVO ssVm : alreadyRunning ) {
HostVO host = _hostDao.findByName(ssVm.getInstanceName()); HostVO host = _resourceMgr.findHostByName(ssVm.getInstanceName());
Answer answer = _agentMgr.easySend(host.getId(), setupCmd); Answer answer = _agentMgr.easySend(host.getId(), setupCmd);
if (answer != null && answer.getResult()) { if (answer != null && answer.getResult()) {
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
@ -394,7 +411,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
continue; continue;
} }
String instanceName = ssVm.getInstanceName(); String instanceName = ssVm.getInstanceName();
HostVO host = _hostDao.findByName(instanceName); HostVO host = _resourceMgr.findHostByName(instanceName);
if ( host == null ) { if ( host == null ) {
continue; continue;
} }
@ -479,7 +496,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
} }
protected Map<String, Object> createSecStorageVmInstance(long dataCenterId, SecondaryStorageVm.Role role) { protected Map<String, Object> createSecStorageVmInstance(long dataCenterId, SecondaryStorageVm.Role role) {
HostVO secHost = _hostDao.findSecondaryStorageHost(dataCenterId); HostVO secHost = findSecondaryStorageHost(dataCenterId);
if (secHost == null) { if (secHost == null) {
String msg = "No secondary storage available in zone " + dataCenterId + ", cannot create secondary storage vm"; String msg = "No secondary storage available in zone " + dataCenterId + ", cannot create secondary storage vm";
s_logger.warn(msg); s_logger.warn(msg);
@ -665,7 +682,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
ZoneHostInfo zoneHostInfo = zoneHostInfoMap.get(dataCenterId); ZoneHostInfo zoneHostInfo = zoneHostInfoMap.get(dataCenterId);
if (zoneHostInfo != null && (zoneHostInfo.getFlags() & RunningHostInfoAgregator.ZoneHostInfo.ROUTING_HOST_MASK) != 0) { if (zoneHostInfo != null && (zoneHostInfo.getFlags() & RunningHostInfoAgregator.ZoneHostInfo.ROUTING_HOST_MASK) != 0) {
VMTemplateVO template = _templateDao.findSystemVMTemplate(dataCenterId); VMTemplateVO template = _templateDao.findSystemVMTemplate(dataCenterId);
HostVO secHost = _hostDao.findSecondaryStorageHost(dataCenterId); HostVO secHost = _ssvmMgr.findSecondaryStorageHost(dataCenterId);
if (secHost == null) { if (secHost == null) {
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
s_logger.debug("No secondary storage available in zone " + dataCenterId + ", wait until it is ready to launch secondary storage vm"); s_logger.debug("No secondary storage available in zone " + dataCenterId + ", wait until it is ready to launch secondary storage vm");
@ -731,6 +748,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
public boolean stop() { public boolean stop() {
_loadScanner.stop(); _loadScanner.stop();
_allocLock.releaseRef(); _allocLock.releaseRef();
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
return true; return true;
} }
@ -807,6 +825,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
if (s_logger.isInfoEnabled()) { if (s_logger.isInfoEnabled()) {
s_logger.info("Secondary storage vm Manager is configured."); s_logger.info("Secondary storage vm Manager is configured.");
} }
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
return true; return true;
} }
@ -949,7 +968,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
Map<String, String> details = _vmDetailsDao.findDetails(vm.getId()); Map<String, String> details = _vmDetailsDao.findDetails(vm.getId());
vm.setDetails(details); vm.setDetails(details);
HostVO secHost = _hostDao.findSecondaryStorageHost(dest.getDataCenter().getId()); HostVO secHost = _ssvmMgr.findSecondaryStorageHost(dest.getDataCenter().getId());
assert (secHost != null); assert (secHost != null);
StringBuilder buf = profile.getBootArgsBuilder(); StringBuilder buf = profile.getBootArgsBuilder();
@ -1158,7 +1177,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
List<SecondaryStorageVmVO> ssVms = _secStorageVmDao.getSecStorageVmListInStates(SecondaryStorageVm.Role.templateProcessor, dataCenterId, State.Running, State.Migrating, List<SecondaryStorageVmVO> ssVms = _secStorageVmDao.getSecStorageVmListInStates(SecondaryStorageVm.Role.templateProcessor, dataCenterId, State.Running, State.Migrating,
State.Starting, State.Stopped, State.Stopping ); State.Starting, State.Stopped, State.Stopping );
int vmSize = (ssVms == null)? 0 : ssVms.size(); int vmSize = (ssVms == null)? 0 : ssVms.size();
List<HostVO> ssHosts = _hostDao.listSecondaryStorageHosts(dataCenterId); List<HostVO> ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dataCenterId);
int hostSize = (ssHosts == null)? 0 : ssHosts.size(); int hostSize = (ssHosts == null)? 0 : ssHosts.size();
if ( hostSize > vmSize ) { if ( hostSize > vmSize ) {
s_logger.info("No secondary storage vms found in datacenter id=" + dataCenterId + ", starting a new one"); s_logger.info("No secondary storage vms found in datacenter id=" + dataCenterId + ", starting a new one");
@ -1182,4 +1201,125 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
public void onScanEnd() { public void onScanEnd() {
} }
@Override
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
/* Called when Secondary Storage VM connected */
StartupCommand firstCmd = cmd[0];
if (!(firstCmd instanceof StartupSecondaryStorageCommand)) {
return null;
}
host.setType( com.cloud.host.Host.Type.SecondaryStorageVM);
return host;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
List<String> hostTags) {
/* Called when add secondary storage on UI */
StartupCommand firstCmd = startup[0];
if (!(firstCmd instanceof StartupStorageCommand)) {
return null;
}
com.cloud.host.Host.Type type = null;
StartupStorageCommand ssCmd = ((StartupStorageCommand) firstCmd);
if (ssCmd.getHostType() == Host.Type.SecondaryStorageCmdExecutor) {
type = ssCmd.getHostType();
} else {
if (ssCmd.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE) {
type = Host.Type.SecondaryStorage;
if (resource != null && resource instanceof DummySecondaryStorageResource) {
host.setResource(null);
}
} else if (ssCmd.getResourceType() == Storage.StorageResourceType.LOCAL_SECONDARY_STORAGE) {
type = Host.Type.LocalSecondaryStorage;
} else {
type = Host.Type.Storage;
}
final Map<String, String> hostDetails = ssCmd.getHostDetails();
if (hostDetails != null) {
if (details != null) {
details.putAll(hostDetails);
} else {
details = hostDetails;
}
}
host.setDetails(details);
host.setParent(ssCmd.getParent());
host.setTotalSize(ssCmd.getTotalSize());
host.setHypervisorType(HypervisorType.None);
host.setType(type);
if (ssCmd.getNfsShare() != null) {
host.setStorageUrl(ssCmd.getNfsShare());
}
}
return host;
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
if (host.getType() == Host.Type.SecondaryStorage) {
deleteHost(host.getId());
return new DeleteHostAnswer(false);
}
return null;
}
@Override
public HostVO findSecondaryStorageHost(long dcId) {
SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.SecondaryStorage);
sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dcId);
List<HostVO> storageHosts = sc.list();
if (storageHosts == null || storageHosts.size() < 1) {
return null;
} else {
Collections.shuffle(storageHosts);
return storageHosts.get(0);
}
}
@Override
public List<HostVO> listSecondaryStorageHostsInAllZones() {
SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.SecondaryStorage);
return sc.list();
}
@Override
public List<HostVO> listSecondaryStorageHostsInOneZone(long dataCenterId) {
SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dataCenterId);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.SecondaryStorage);
return sc.list();
}
@Override
public List<HostVO> listLocalSecondaryStorageHostsInOneZone(long dataCenterId) {
SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dataCenterId);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.LocalSecondaryStorage);
return sc.list();
}
@Override
public List<HostVO> listAllTypesSecondaryStorageHostsInOneZone(long dataCenterId) {
SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dataCenterId);
sc.addAnd(sc.getEntity().getType(), Op.IN, Host.Type.LocalSecondaryStorage, Host.Type.SecondaryStorage);
return sc.list();
}
@Override
public List<HostVO> listUpSecondaryStorageVmHost(long dcId) {
SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dcId);
sc.addAnd(sc.getEntity().getStatus(), Op.EQ, com.cloud.host.Status.Up);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.SecondaryStorageVM);
return sc.list();
}
} }

View File

@ -17,6 +17,8 @@
*/ */
package com.cloud.storage.secondary; package com.cloud.storage.secondary;
import java.util.List;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupCommand;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
@ -45,4 +47,10 @@ public interface SecondaryStorageVmManager extends Manager {
public Pair<HostVO, SecondaryStorageVmVO> assignSecStorageVm(long zoneId, Command cmd); public Pair<HostVO, SecondaryStorageVmVO> assignSecStorageVm(long zoneId, Command cmd);
boolean generateSetupCommand(Long hostId); boolean generateSetupCommand(Long hostId);
boolean deleteHost(Long hostId); boolean deleteHost(Long hostId);
public HostVO findSecondaryStorageHost(long dcId);
public List<HostVO> listSecondaryStorageHostsInAllZones();
public List<HostVO> listSecondaryStorageHostsInOneZone(long dataCenterId);
public List<HostVO> listLocalSecondaryStorageHostsInOneZone(long dataCenterId);
public List<HostVO> listAllTypesSecondaryStorageHostsInOneZone(long dataCenterId);
public List<HostVO> listUpSecondaryStorageVmHost(long dcId);
} }

View File

@ -68,6 +68,7 @@ import com.cloud.host.dao.HostDetailsDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.projects.Project; import com.cloud.projects.Project;
import com.cloud.projects.ProjectManager; import com.cloud.projects.ProjectManager;
import com.cloud.resource.ResourceManager;
import com.cloud.storage.Snapshot; import com.cloud.storage.Snapshot;
import com.cloud.storage.Snapshot.Status; import com.cloud.storage.Snapshot.Status;
import com.cloud.storage.Snapshot.Type; import com.cloud.storage.Snapshot.Type;
@ -90,6 +91,7 @@ import com.cloud.storage.dao.StoragePoolDao;
import com.cloud.storage.dao.SwiftDao; import com.cloud.storage.dao.SwiftDao;
import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeDao;
import com.cloud.storage.secondary.SecondaryStorageVmManager;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.user.AccountManager; import com.cloud.user.AccountManager;
import com.cloud.user.AccountVO; import com.cloud.user.AccountVO;
@ -171,7 +173,10 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
private SwiftDao _swiftDao; private SwiftDao _swiftDao;
@Inject @Inject
private ProjectManager _projectMgr; private ProjectManager _projectMgr;
@Inject
private SecondaryStorageVmManager _ssvmMgr;
@Inject
private ResourceManager _resourceMgr;
String _name; String _name;
private int _totalRetries; private int _totalRetries;
private int _pauseInterval; private int _pauseInterval;
@ -389,7 +394,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
if (_volsDao.getHypervisorType(volume.getId()).equals(HypervisorType.KVM)) { if (_volsDao.getHypervisorType(volume.getId()).equals(HypervisorType.KVM)) {
StoragePoolVO storagePool = _storagePoolDao.findById(volume.getPoolId()); StoragePoolVO storagePool = _storagePoolDao.findById(volume.getPoolId());
ClusterVO cluster = _clusterDao.findById(storagePool.getClusterId()); ClusterVO cluster = _clusterDao.findById(storagePool.getClusterId());
List<HostVO> hosts = _hostDao.listByCluster(cluster.getId()); List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cluster.getId());
if (hosts != null && !hosts.isEmpty()) { if (hosts != null && !hosts.isEmpty()) {
HostVO host = hosts.get(0); HostVO host = hosts.get(0);
if (!hostSupportSnapsthot(host)) { if (!hostSupportSnapsthot(host)) {
@ -1026,7 +1031,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
continue; continue;
} }
List<HostVO> ssHosts = _hostDao.listSecondaryStorageHosts(dcId); List<HostVO> ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId);
for ( HostVO ssHost : ssHosts ) { for ( HostVO ssHost : ssHosts ) {
DeleteSnapshotsDirCommand cmd = new DeleteSnapshotsDirCommand(primaryStoragePoolNameLabel, ssHost.getStorageUrl(), dcId, accountId, volumeId, volume.getPath()); DeleteSnapshotsDirCommand cmd = new DeleteSnapshotsDirCommand(primaryStoragePoolNameLabel, ssHost.getStorageUrl(), dcId, accountId, volumeId, volume.getPath());
Answer answer = null; Answer answer = null;

View File

@ -48,6 +48,7 @@ import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.resource.ResourceManager;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Upload; import com.cloud.storage.Upload;
import com.cloud.storage.Upload.Mode; import com.cloud.storage.Upload.Mode;
@ -95,6 +96,8 @@ public class UploadMonitorImpl implements UploadMonitor {
private AgentManager _agentMgr; private AgentManager _agentMgr;
@Inject @Inject
ConfigurationDao _configDao; ConfigurationDao _configDao;
@Inject
ResourceManager _resourceMgr;
private String _name; private String _name;
private Boolean _sslCopy = new Boolean(false); private Boolean _sslCopy = new Boolean(false);
@ -165,7 +168,7 @@ public class UploadMonitorImpl implements UploadMonitor {
Type type = (template.getFormat() == ImageFormat.ISO) ? Type.ISO : Type.TEMPLATE ; Type type = (template.getFormat() == ImageFormat.ISO) ? Type.ISO : Type.TEMPLATE ;
List<HostVO> storageServers = _serverDao.listByTypeDataCenter(Host.Type.SecondaryStorage, dataCenterId); List<HostVO> storageServers = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.SecondaryStorage, dataCenterId);
HostVO sserver = storageServers.get(0); HostVO sserver = storageServers.get(0);
UploadVO uploadTemplateObj = new UploadVO(sserver.getId(), template.getId(), new Date(), UploadVO uploadTemplateObj = new UploadVO(sserver.getId(), template.getId(), new Date(),
@ -264,7 +267,7 @@ public class UploadMonitorImpl implements UploadMonitor {
String errorString = ""; String errorString = "";
boolean success = false; boolean success = false;
try{ try{
List<HostVO> storageServers = _serverDao.listByTypeDataCenter(Host.Type.SecondaryStorage, dataCenterId); List<HostVO> storageServers = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.SecondaryStorage, dataCenterId);
if(storageServers == null ){ if(storageServers == null ){
errorString = "No Storage Server found at the datacenter - " +dataCenterId; errorString = "No Storage Server found at the datacenter - " +dataCenterId;
throw new CloudRuntimeException(errorString); throw new CloudRuntimeException(errorString);

View File

@ -29,6 +29,7 @@ import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.VMTemplateZoneVO;
import com.cloud.storage.download.DownloadMonitor; import com.cloud.storage.download.DownloadMonitor;
import com.cloud.storage.secondary.SecondaryStorageVmManager;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.db.DB; import com.cloud.utils.db.DB;
@ -38,6 +39,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
public class HyervisorTemplateAdapter extends TemplateAdapterBase implements TemplateAdapter { public class HyervisorTemplateAdapter extends TemplateAdapterBase implements TemplateAdapter {
private final static Logger s_logger = Logger.getLogger(HyervisorTemplateAdapter.class); private final static Logger s_logger = Logger.getLogger(HyervisorTemplateAdapter.class);
@Inject DownloadMonitor _downloadMonitor; @Inject DownloadMonitor _downloadMonitor;
@Inject SecondaryStorageVmManager _ssvmMgr;
private String validateUrl(String url) { private String validateUrl(String url) {
try { try {
@ -133,10 +135,10 @@ public class HyervisorTemplateAdapter extends TemplateAdapterBase implements Tem
if (!template.isCrossZones() && zoneId != null) { if (!template.isCrossZones() && zoneId != null) {
DataCenterVO zone = _dcDao.findById(zoneId); DataCenterVO zone = _dcDao.findById(zoneId);
zoneName = zone.getName(); zoneName = zone.getName();
secondaryStorageHosts = _hostDao.listSecondaryStorageHosts(zoneId); secondaryStorageHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
} else { } else {
zoneName = "(all zones)"; zoneName = "(all zones)";
secondaryStorageHosts = _hostDao.listSecondaryStorageHosts(); secondaryStorageHosts = _ssvmMgr.listSecondaryStorageHostsInAllZones();
} }
s_logger.debug("Attempting to mark template host refs for template: " + template.getName() + " as destroyed in zone: " + zoneName); s_logger.debug("Attempting to mark template host refs for template: " + template.getName() + " as destroyed in zone: " + zoneName);
@ -237,7 +239,7 @@ public class HyervisorTemplateAdapter extends TemplateAdapterBase implements Tem
throw new InvalidParameterValueException("The DomR template cannot be deleted."); throw new InvalidParameterValueException("The DomR template cannot be deleted.");
} }
if (zoneId != null && (_hostDao.findSecondaryStorageHost(zoneId) == null)) { if (zoneId != null && (_ssvmMgr.findSecondaryStorageHost(zoneId) == null)) {
throw new InvalidParameterValueException("Failed to find a secondary storage host in the specified zone."); throw new InvalidParameterValueException("Failed to find a secondary storage host in the specified zone.");
} }
@ -248,7 +250,7 @@ public class HyervisorTemplateAdapter extends TemplateAdapterBase implements Tem
TemplateProfile profile = super.prepareDelete(cmd); TemplateProfile profile = super.prepareDelete(cmd);
Long zoneId = profile.getZoneId(); Long zoneId = profile.getZoneId();
if (zoneId != null && (_hostDao.findSecondaryStorageHost(zoneId) == null)) { if (zoneId != null && (_ssvmMgr.findSecondaryStorageHost(zoneId) == null)) {
throw new InvalidParameterValueException("Failed to find a secondary storage host in the specified zone."); throw new InvalidParameterValueException("Failed to find a secondary storage host in the specified zone.");
} }

View File

@ -97,6 +97,7 @@ import com.cloud.storage.dao.VMTemplatePoolDao;
import com.cloud.storage.dao.VMTemplateZoneDao; import com.cloud.storage.dao.VMTemplateZoneDao;
import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeDao;
import com.cloud.storage.download.DownloadMonitor; import com.cloud.storage.download.DownloadMonitor;
import com.cloud.storage.secondary.SecondaryStorageVmManager;
import com.cloud.storage.upload.UploadMonitor; import com.cloud.storage.upload.UploadMonitor;
import com.cloud.template.TemplateAdapter.TemplateAdapterType; import com.cloud.template.TemplateAdapter.TemplateAdapterType;
import com.cloud.user.Account; import com.cloud.user.Account;
@ -163,6 +164,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
@Inject HypervisorGuruManager _hvGuruMgr; @Inject HypervisorGuruManager _hvGuruMgr;
@Inject AccountService _accountService; @Inject AccountService _accountService;
@Inject ResourceLimitService _resourceLimitMgr; @Inject ResourceLimitService _resourceLimitMgr;
@Inject SecondaryStorageVmManager _ssvmMgr;
int _primaryStorageDownloadWait; int _primaryStorageDownloadWait;
protected SearchBuilder<VMTemplateHostVO> HostTemplateStatesSearch; protected SearchBuilder<VMTemplateHostVO> HostTemplateStatesSearch;
@ -517,7 +519,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
@Override @Override
@DB @DB
public boolean copy(long userId, VMTemplateVO template, HostVO srcSecHost, DataCenterVO srcZone, DataCenterVO dstZone) throws StorageUnavailableException, ResourceAllocationException { public boolean copy(long userId, VMTemplateVO template, HostVO srcSecHost, DataCenterVO srcZone, DataCenterVO dstZone) throws StorageUnavailableException, ResourceAllocationException {
List<HostVO> dstSecHosts = _hostDao.listSecondaryStorageHosts(dstZone.getId()); List<HostVO> dstSecHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dstZone.getId());
long tmpltId = template.getId(); long tmpltId = template.getId();
long dstZoneId = dstZone.getId(); long dstZoneId = dstZone.getId();
if (dstSecHosts == null || dstSecHosts.isEmpty() ) { if (dstSecHosts == null || dstSecHosts.isEmpty() ) {
@ -905,7 +907,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
throw new InvalidParameterValueException("Please specify a valid iso."); throw new InvalidParameterValueException("Please specify a valid iso.");
} }
if (zoneId != null && (_hostDao.findSecondaryStorageHost(zoneId) == null)) { if (zoneId != null && (_ssvmMgr.findSecondaryStorageHost(zoneId) == null)) {
throw new InvalidParameterValueException("Failed to find a secondary storage host in the specified zone."); throw new InvalidParameterValueException("Failed to find a secondary storage host in the specified zone.");
} }
TemplateAdapter adapter = getAdapter(template.getHypervisorType()); TemplateAdapter adapter = getAdapter(template.getHypervisorType());

View File

@ -145,6 +145,7 @@ import com.cloud.org.Cluster;
import com.cloud.org.Grouping; import com.cloud.org.Grouping;
import com.cloud.projects.Project; import com.cloud.projects.Project;
import com.cloud.projects.ProjectManager; import com.cloud.projects.ProjectManager;
import com.cloud.resource.ResourceManager;
import com.cloud.server.Criteria; import com.cloud.server.Criteria;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDao;
@ -349,6 +350,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
protected FirewallManager _firewallMgr; protected FirewallManager _firewallMgr;
@Inject @Inject
protected ProjectManager _projectMgr; protected ProjectManager _projectMgr;
@Inject
protected ResourceManager _resourceMgr;
protected ScheduledExecutorService _executor = null; protected ScheduledExecutorService _executor = null;
protected int _expungeInterval; protected int _expungeInterval;
@ -3150,7 +3153,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
sc.setParameters("hostIdEQ", hostId); sc.setParameters("hostIdEQ", hostId);
} else { } else {
if (hostName != null) { if (hostName != null) {
List<HostVO> hosts = _hostDao.findHostsLike((String) hostName); List<HostVO> hosts = _resourceMgr.listHostsByNameLike((String) hostName);
if (hosts != null & !hosts.isEmpty()) { if (hosts != null & !hosts.isEmpty()) {
Long[] hostIds = new Long[hosts.size()]; Long[] hostIds = new Long[hosts.size()];
for (int i = 0; i < hosts.size(); i++) { for (int i = 0; i < hosts.size(); i++) {

View File

@ -107,6 +107,7 @@ import com.cloud.network.NetworkManager;
import com.cloud.network.NetworkVO; import com.cloud.network.NetworkVO;
import com.cloud.offering.ServiceOffering; import com.cloud.offering.ServiceOffering;
import com.cloud.org.Cluster; import com.cloud.org.Cluster;
import com.cloud.resource.ResourceManager;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.DiskOfferingVO;
@ -226,6 +227,9 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene
@Inject(adapter = HostAllocator.class) @Inject(adapter = HostAllocator.class)
protected Adapters<HostAllocator> _hostAllocators; protected Adapters<HostAllocator> _hostAllocators;
@Inject
protected ResourceManager _resourceMgr;
Map<VirtualMachine.Type, VirtualMachineGuru<? extends VMInstanceVO>> _vmGurus = new HashMap<VirtualMachine.Type, VirtualMachineGuru<? extends VMInstanceVO>>(); Map<VirtualMachine.Type, VirtualMachineGuru<? extends VMInstanceVO>> _vmGurus = new HashMap<VirtualMachine.Type, VirtualMachineGuru<? extends VMInstanceVO>>();
protected StateMachine2<State, VirtualMachine.Event, VirtualMachine> _stateMachine; protected StateMachine2<State, VirtualMachine.Event, VirtualMachine> _stateMachine;
@ -761,7 +765,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene
if (startAnswer != null && startAnswer.getResult()) { if (startAnswer != null && startAnswer.getResult()) {
String host_guid = startAnswer.getHost_guid(); String host_guid = startAnswer.getHost_guid();
if( host_guid != null ) { if( host_guid != null ) {
HostVO finalHost = _hostDao.findByGuid(host_guid); HostVO finalHost = _resourceMgr.findHostByGuid(host_guid);
if ( finalHost == null ) { if ( finalHost == null ) {
throw new CloudRuntimeException("Host Guid " + host_guid + " doesn't exist in DB, something wrong here"); throw new CloudRuntimeException("Host Guid " + host_guid + " doesn't exist in DB, something wrong here");
} }

95
server/test/com/cloud/agent/MockAgentManagerImpl.java Normal file → Executable file
View File

@ -9,6 +9,7 @@ import javax.naming.ConfigurationException;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.manager.AgentAttache; import com.cloud.agent.manager.AgentAttache;
import com.cloud.agent.manager.Commands; import com.cloud.agent.manager.Commands;
import com.cloud.api.commands.UpdateHostPasswordCmd; import com.cloud.api.commands.UpdateHostPasswordCmd;
@ -16,6 +17,7 @@ import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO; import com.cloud.dc.HostPodVO;
import com.cloud.dc.PodCluster; import com.cloud.dc.PodCluster;
import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConnectionException;
import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.OperationTimedoutException;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.Host.Type; import com.cloud.host.Host.Type;
@ -115,12 +117,6 @@ public class MockAgentManagerImpl implements AgentManager {
return null; return null;
} }
@Override
public void disconnect(long hostId, Event event, boolean investigate) {
// TODO Auto-generated method stub
}
@Override @Override
public HostStats getHostStatistics(long hostId) { public HostStats getHostStatistics(long hostId) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
@ -151,42 +147,12 @@ public class MockAgentManagerImpl implements AgentManager {
return null; return null;
} }
@Override
public Host addHost(long zoneId, ServerResource resource, Type hostType, Map<String, String> hostDetails) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean deleteHost(long hostId, boolean isForced, boolean forceDestroy, User caller) {
// TODO Auto-generated method stub
return false;
}
@Override @Override
public Pair<HostPodVO, Long> findPod(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long userId, Set<Long> avoids) { public Pair<HostPodVO, Long> findPod(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long userId, Set<Long> avoids) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return null;
} }
@Override
public boolean maintain(long hostId) throws AgentUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean maintenanceFailed(long hostId) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean cancelMaintenance(long hostId) {
// TODO Auto-generated method stub
return false;
}
@Override @Override
public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException { public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException {
// TODO Auto-generated method stub // TODO Auto-generated method stub
@ -194,7 +160,7 @@ public class MockAgentManagerImpl implements AgentManager {
} }
@Override @Override
public boolean reconnect(long hostId) throws AgentUnavailableException { public boolean reconnect(long hostId) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return false; return false;
} }
@ -217,19 +183,6 @@ public class MockAgentManagerImpl implements AgentManager {
} }
@Override
public AgentAttache simulateStart(Long id, ServerResource resource, Map<String, String> details, boolean old, List<String> hostTags, String allocationState, boolean forRebalance)
throws IllegalArgumentException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean updateHostPassword(UpdateHostPasswordCmd upasscmd) {
// TODO Auto-generated method stub
return false;
}
@Override @Override
public long sendToSecStorage(HostVO ssHost, Command cmd, Listener listener) { public long sendToSecStorage(HostVO ssHost, Command cmd, Listener listener) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
@ -249,15 +202,51 @@ public class MockAgentManagerImpl implements AgentManager {
} }
@Override @Override
public void updateStatus(HostVO host, Event event) { public boolean tapLoadingAgents(Long hostId, TapAgentsAction action) {
// TODO Auto-generated method stub
return false;
}
@Override
public AgentAttache handleDirectConnectAgent(HostVO host, StartupCommand[] cmds, ServerResource resource, boolean forRebalance) throws ConnectionException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean agentStatusTransitTo(HostVO host, Event e, long msId) {
// TODO Auto-generated method stub
return false;
}
@Override
public AgentAttache findAttache(long hostId) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean disconnectAgent(HostVO host, Event e, long msId) {
// TODO Auto-generated method stub
return false;
}
@Override
public void pullAgentToMaintenance(long hostId) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
public boolean disconnect(long hostId) { public void disconnectWithoutInvestigation(long hostId, Event event) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return false;
}
@Override
public void disconnectWithInvestigation(long hostId, Event event) {
// TODO Auto-generated method stub
} }
} }

View File

@ -0,0 +1,370 @@
package com.cloud.agent.manager;
import java.io.Serializable;
import java.lang.reflect.Field;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import com.cloud.agent.AgentManager;
import com.cloud.alert.AlertManagerImpl;
import com.cloud.alert.dao.AlertDaoImpl;
import com.cloud.api.BaseCmd;
import com.cloud.api.commands.CreatePodCmd;
import com.cloud.api.commands.CreateZoneCmd;
import com.cloud.ha.HighAvailabilityManagerImpl;
import com.cloud.ha.dao.HighAvailabilityDaoImpl;
import com.cloud.host.dao.HostDaoImpl;
import com.cloud.host.dao.HostTagsDaoImpl;
import com.cloud.storage.OCFS2ManagerImpl;
import com.cloud.storage.StorageManager;
import com.cloud.storage.dao.DiskOfferingDaoImpl;
import com.cloud.storage.dao.GuestOSCategoryDaoImpl;
import com.cloud.storage.dao.GuestOSDaoImpl;
import com.cloud.storage.dao.LaunchPermissionDaoImpl;
import com.cloud.storage.dao.SnapshotDaoImpl;
import com.cloud.storage.dao.SnapshotPolicyDaoImpl;
import com.cloud.storage.dao.SnapshotScheduleDaoImpl;
import com.cloud.storage.dao.StoragePoolHostDaoImpl;
import com.cloud.storage.dao.StoragePoolWorkDaoImpl;
import com.cloud.storage.dao.SwiftDaoImpl;
import com.cloud.storage.dao.UploadDaoImpl;
import com.cloud.storage.dao.VMTemplateDaoImpl;
import com.cloud.storage.dao.VMTemplateHostDaoImpl;
import com.cloud.storage.dao.VMTemplatePoolDaoImpl;
import com.cloud.storage.dao.VMTemplateZoneDaoImpl;
import com.cloud.storage.dao.VolumeDaoImpl;
import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.component.Manager;
import com.cloud.utils.component.MockComponentLocator;
import com.cloud.utils.component.ComponentLocator.ComponentInfo;
import com.cloud.utils.db.GenericDao;
import com.cloud.vm.ClusteredVirtualMachineManagerImpl;
import com.cloud.vm.ItWorkDaoImpl;
import com.cloud.vm.UserVmManagerImpl;
import com.cloud.vm.dao.ConsoleProxyDaoImpl;
import com.cloud.vm.dao.DomainRouterDaoImpl;
import com.cloud.vm.dao.InstanceGroupDaoImpl;
import com.cloud.vm.dao.InstanceGroupVMMapDaoImpl;
import com.cloud.vm.dao.NicDaoImpl;
import com.cloud.vm.dao.SecondaryStorageVmDaoImpl;
import com.cloud.vm.dao.UserVmDaoImpl;
import com.cloud.vm.dao.UserVmDetailsDaoImpl;
import com.cloud.vm.dao.VMInstanceDaoImpl;
import com.cloud.storage.dao.StoragePoolDaoImpl;
import com.cloud.storage.download.DownloadMonitorImpl;
import com.cloud.offerings.dao.NetworkOfferingDaoImpl;
import com.cloud.projects.ProjectManagerImpl;
import com.cloud.projects.dao.ProjectAccountDaoImpl;
import com.cloud.projects.dao.ProjectDaoImpl;
import com.cloud.resource.ResourceManagerImpl;
import com.cloud.resourcelimit.ResourceLimitManagerImpl;
import com.cloud.storage.StorageManagerImpl;
import com.cloud.cluster.CheckPointManagerImpl;
import com.cloud.cluster.ClusterFenceManagerImpl;
import com.cloud.cluster.ClusterManagerImpl;
import com.cloud.cluster.agentlb.dao.HostTransferMapDaoImpl;
import com.cloud.cluster.dao.ManagementServerHostDaoImpl;
import com.cloud.cluster.dao.StackMaidDaoImpl;
import com.cloud.configuration.ConfigurationManagerImpl;
import com.cloud.configuration.ConfigurationService;
import com.cloud.configuration.DefaultInterceptorLibrary;
import com.cloud.configuration.dao.ConfigurationDaoImpl;
import com.cloud.configuration.dao.ResourceCountDaoImpl;
import com.cloud.configuration.dao.ResourceLimitDaoImpl;
import com.cloud.template.TemplateManagerImpl;
import com.cloud.user.AccountManagerImpl;
import com.cloud.user.DomainManagerImpl;
import com.cloud.user.dao.AccountDaoImpl;
import com.cloud.user.dao.SSHKeyPairDaoImpl;
import com.cloud.user.dao.UserAccountDaoImpl;
import com.cloud.user.dao.UserDaoImpl;
import com.cloud.user.dao.UserStatisticsDaoImpl;
import junit.framework.TestCase;
import com.cloud.dao.EntityManagerImpl;
import com.cloud.dc.ClusterDetailsDaoImpl;
import com.cloud.dc.dao.AccountVlanMapDaoImpl;
import com.cloud.dc.dao.DataCenterDaoImpl;
import com.cloud.dc.dao.DataCenterIpAddressDaoImpl;
import com.cloud.dc.dao.DcDetailsDaoImpl;
import com.cloud.dc.dao.HostPodDaoImpl;
import com.cloud.dc.dao.ClusterDaoImpl;
import com.cloud.dc.dao.PodVlanMapDaoImpl;
import com.cloud.dc.dao.VlanDaoImpl;
import com.cloud.domain.dao.DomainDaoImpl;
import com.cloud.event.dao.EventDaoImpl;
import com.cloud.event.dao.UsageEventDaoImpl;
import com.cloud.host.dao.HostDetailsDaoImpl;
import com.cloud.hypervisor.HypervisorGuruManagerImpl;
import com.cloud.hypervisor.dao.HypervisorCapabilitiesDaoImpl;
import com.cloud.keystore.KeystoreDaoImpl;
import com.cloud.keystore.KeystoreManagerImpl;
import com.cloud.capacity.CapacityManagerImpl;
import com.cloud.capacity.dao.CapacityDaoImpl;
import com.cloud.certificate.dao.CertificateDaoImpl;
import com.cloud.async.AsyncJobExecutorContextImpl;
import com.cloud.async.AsyncJobManagerImpl;
import com.cloud.async.SyncQueueManagerImpl;
import com.cloud.async.dao.AsyncJobDaoImpl;
import com.cloud.async.dao.SyncQueueDaoImpl;
import com.cloud.async.dao.SyncQueueItemDaoImpl;
import com.cloud.storage.secondary.SecondaryStorageManagerImpl;
import com.cloud.storage.snapshot.SnapshotManagerImpl;
import com.cloud.storage.snapshot.SnapshotSchedulerImpl;
import com.cloud.storage.upload.UploadMonitorImpl;
import com.cloud.consoleproxy.ConsoleProxyManagerImpl;
import com.cloud.secstorage.PremiumSecondaryStorageManagerImpl;
import com.cloud.service.dao.ServiceOfferingDaoImpl;
import com.cloud.maint.UpgradeManagerImpl;
import com.cloud.maint.dao.AgentUpgradeDaoImpl;
import com.cloud.network.NetworkManagerImpl;
import com.cloud.network.dao.FirewallRulesCidrsDaoImpl;
import com.cloud.network.dao.FirewallRulesDaoImpl;
import com.cloud.network.dao.IPAddressDaoImpl;
import com.cloud.network.dao.InlineLoadBalancerNicMapDaoImpl;
import com.cloud.network.dao.LoadBalancerDaoImpl;
import com.cloud.network.dao.LoadBalancerVMMapDaoImpl;
import com.cloud.network.dao.NetworkDaoImpl;
import com.cloud.network.dao.NetworkDomainDaoImpl;
import com.cloud.network.dao.NetworkRuleConfigDaoImpl;
import com.cloud.network.dao.RemoteAccessVpnDaoImpl;
import com.cloud.network.dao.VpnUserDaoImpl;
import com.cloud.network.firewall.FirewallManagerImpl;
import com.cloud.network.lb.ElasticLoadBalancerManagerImpl;
import com.cloud.network.lb.LoadBalancingRulesManagerImpl;
import com.cloud.network.lb.dao.ElasticLbVmMapDaoImpl;
import com.cloud.network.ovs.OvsNetworkManagerImpl;
import com.cloud.network.ovs.OvsTunnelManagerImpl;
import com.cloud.network.ovs.dao.GreTunnelDaoImpl;
import com.cloud.network.ovs.dao.OvsTunnelAccountDaoImpl;
import com.cloud.network.ovs.dao.OvsTunnelDaoImpl;
import com.cloud.network.ovs.dao.OvsWorkDaoImpl;
import com.cloud.network.ovs.dao.VlanMappingDaoImpl;
import com.cloud.network.ovs.dao.VlanMappingDirtyDaoImpl;
import com.cloud.network.ovs.dao.VmFlowLogDaoImpl;
import com.cloud.network.router.VirtualNetworkApplianceManagerImpl;
import com.cloud.network.rules.RulesManagerImpl;
import com.cloud.network.rules.dao.PortForwardingRulesDaoImpl;
import com.cloud.network.security.SecurityGroupManagerImpl2;
import com.cloud.network.security.dao.IngressRuleDaoImpl;
import com.cloud.network.security.dao.SecurityGroupDaoImpl;
import com.cloud.network.security.dao.SecurityGroupRulesDaoImpl;
import com.cloud.network.security.dao.SecurityGroupVMMapDaoImpl;
import com.cloud.network.security.dao.SecurityGroupWorkDaoImpl;
import com.cloud.network.security.dao.VmRulesetLogDaoImpl;
import com.cloud.network.vpn.RemoteAccessVpnManagerImpl;
public class ResourceManagerTest extends TestCase {
MockComponentLocator _locator;
private static final Logger s_logger = Logger.getLogger(ResourceManagerTest.class);
ConfigurationService _configService;
@Override
@Before
public void setUp() throws Exception {
_locator = new MockComponentLocator("management-server");
_locator.addDao("StackMaidDao", StackMaidDaoImpl.class);
_locator.addDao("VMTemplateZoneDao", VMTemplateZoneDaoImpl.class);
_locator.addDao("DomainRouterDao", DomainRouterDaoImpl.class);
_locator.addDao("HostDao", HostDaoImpl.class);
_locator.addDao("VMInstanceDao", VMInstanceDaoImpl.class);
_locator.addDao("UserVmDao", UserVmDaoImpl.class);
ComponentInfo<? extends GenericDao<?, ? extends Serializable>> info = _locator.addDao("ServiceOfferingDao", ServiceOfferingDaoImpl.class);
info.addParameter("cache.size", "50");
info.addParameter("cache.time.to.live", "600");
info = _locator.addDao("DiskOfferingDao", DiskOfferingDaoImpl.class);
info.addParameter("cache.size", "50");
info.addParameter("cache.time.to.live", "600");
info = _locator.addDao("DataCenterDao", DataCenterDaoImpl.class);
info.addParameter("cache.size", "50");
info.addParameter("cache.time.to.live", "600");
info = _locator.addDao("HostPodDao", HostPodDaoImpl.class);
info.addParameter("cache.size", "50");
info.addParameter("cache.time.to.live", "600");
_locator.addDao("IPAddressDao", IPAddressDaoImpl.class);
info = _locator.addDao("VlanDao", VlanDaoImpl.class);
info.addParameter("cache.size", "30");
info.addParameter("cache.time.to.live", "3600");
_locator.addDao("PodVlanMapDao", PodVlanMapDaoImpl.class);
_locator.addDao("AccountVlanMapDao", AccountVlanMapDaoImpl.class);
_locator.addDao("VolumeDao", VolumeDaoImpl.class);
_locator.addDao("EventDao", EventDaoImpl.class);
info = _locator.addDao("UserDao", UserDaoImpl.class);
info.addParameter("cache.size", "5000");
info.addParameter("cache.time.to.live", "300");
_locator.addDao("UserStatisticsDao", UserStatisticsDaoImpl.class);
_locator.addDao("FirewallRulesDao", FirewallRulesDaoImpl.class);
_locator.addDao("LoadBalancerDao", LoadBalancerDaoImpl.class);
_locator.addDao("NetworkRuleConfigDao", NetworkRuleConfigDaoImpl.class);
_locator.addDao("LoadBalancerVMMapDao", LoadBalancerVMMapDaoImpl.class);
_locator.addDao("DataCenterIpAddressDao", DataCenterIpAddressDaoImpl.class);
_locator.addDao("SecurityGroupDao", SecurityGroupDaoImpl.class);
_locator.addDao("IngressRuleDao", IngressRuleDaoImpl.class);
_locator.addDao("SecurityGroupVMMapDao", SecurityGroupVMMapDaoImpl.class);
_locator.addDao("SecurityGroupRulesDao", SecurityGroupRulesDaoImpl.class);
_locator.addDao("SecurityGroupWorkDao", SecurityGroupWorkDaoImpl.class);
_locator.addDao("VmRulesetLogDao", VmRulesetLogDaoImpl.class);
_locator.addDao("AlertDao", AlertDaoImpl.class);
_locator.addDao("CapacityDao", CapacityDaoImpl.class);
_locator.addDao("DomainDao", DomainDaoImpl.class);
_locator.addDao("AccountDao", AccountDaoImpl.class);
_locator.addDao("ResourceLimitDao", ResourceLimitDaoImpl.class);
_locator.addDao("ResourceCountDao", ResourceCountDaoImpl.class);
_locator.addDao("UserAccountDao", UserAccountDaoImpl.class);
_locator.addDao("VMTemplateHostDao", VMTemplateHostDaoImpl.class);
_locator.addDao("UploadDao", UploadDaoImpl.class);
_locator.addDao("VMTemplatePoolDao", VMTemplatePoolDaoImpl.class);
_locator.addDao("LaunchPermissionDao", LaunchPermissionDaoImpl.class);
_locator.addDao("ConfigurationDao", ConfigurationDaoImpl.class);
info = _locator.addDao("VMTemplateDao", VMTemplateDaoImpl.class);
info.addParameter("cache.size", "100");
info.addParameter("cache.time.to.live", "600");
info.addParameter("routing.uniquename", "routing");
_locator.addDao("HighAvailabilityDao", HighAvailabilityDaoImpl.class);
_locator.addDao("ConsoleProxyDao", ConsoleProxyDaoImpl.class);
_locator.addDao("SecondaryStorageVmDao", SecondaryStorageVmDaoImpl.class);
_locator.addDao("ManagementServerHostDao", ManagementServerHostDaoImpl.class);
_locator.addDao("AgentUpgradeDao", AgentUpgradeDaoImpl.class);
_locator.addDao("SnapshotDao", SnapshotDaoImpl.class);
_locator.addDao("AsyncJobDao", AsyncJobDaoImpl.class);
_locator.addDao("SyncQueueDao", SyncQueueDaoImpl.class);
_locator.addDao("SyncQueueItemDao", SyncQueueItemDaoImpl.class);
_locator.addDao("GuestOSDao", GuestOSDaoImpl.class);
_locator.addDao("GuestOSCategoryDao", GuestOSCategoryDaoImpl.class);
_locator.addDao("StoragePoolDao", StoragePoolDaoImpl.class);
_locator.addDao("StoragePoolHostDao", StoragePoolHostDaoImpl.class);
_locator.addDao("DetailsDao", HostDetailsDaoImpl.class);
_locator.addDao("SnapshotPolicyDao", SnapshotPolicyDaoImpl.class);
_locator.addDao("SnapshotScheduleDao", SnapshotScheduleDaoImpl.class);
_locator.addDao("ClusterDao", ClusterDaoImpl.class);
_locator.addDao("CertificateDao", CertificateDaoImpl.class);
_locator.addDao("NetworkConfigurationDao", NetworkDaoImpl.class);
_locator.addDao("NetworkOfferingDao", NetworkOfferingDaoImpl.class);
_locator.addDao("NicDao", NicDaoImpl.class);
_locator.addDao("InstanceGroupDao", InstanceGroupDaoImpl.class);
_locator.addDao("InstanceGroupVMMapDao", InstanceGroupVMMapDaoImpl.class);
_locator.addDao("RemoteAccessVpnDao", RemoteAccessVpnDaoImpl.class);
_locator.addDao("VpnUserDao", VpnUserDaoImpl.class);
_locator.addDao("ItWorkDao", ItWorkDaoImpl.class);
_locator.addDao("FirewallRulesDao", FirewallRulesDaoImpl.class);
_locator.addDao("PortForwardingRulesDao", PortForwardingRulesDaoImpl.class);
_locator.addDao("FirewallRulesCidrsDao", FirewallRulesCidrsDaoImpl.class);
_locator.addDao("SSHKeyPairDao", SSHKeyPairDaoImpl.class);
_locator.addDao("UsageEventDao", UsageEventDaoImpl.class);
_locator.addDao("ClusterDetailsDao", ClusterDetailsDaoImpl.class);
_locator.addDao("UserVmDetailsDao", UserVmDetailsDaoImpl.class);
_locator.addDao("VlanMappingDao", VlanMappingDaoImpl.class);
_locator.addDao("VlanMappingDirtyDao", VlanMappingDirtyDaoImpl.class);
_locator.addDao("OvsWorkDao", OvsWorkDaoImpl.class);
_locator.addDao("VmFlowLogDao", VmFlowLogDaoImpl.class);
_locator.addDao("GreTunnelDao", GreTunnelDaoImpl.class);
_locator.addDao("OvsTunnelDao", OvsTunnelDaoImpl.class);
_locator.addDao("OvsTunnelAccountDao", OvsTunnelAccountDaoImpl.class);
_locator.addDao("StoragePoolWorkDao", StoragePoolWorkDaoImpl.class);
_locator.addDao("HostTagsDao", HostTagsDaoImpl.class);
_locator.addDao("NetworkDomainDao", NetworkDomainDaoImpl.class);
_locator.addDao("KeystoreDao", KeystoreDaoImpl.class);
_locator.addDao("DcDetailsDao", DcDetailsDaoImpl.class);
_locator.addDao("SwiftDao", SwiftDaoImpl.class);
_locator.addDao("AgentTransferMapDao", HostTransferMapDaoImpl.class);
_locator.addDao("ProjectDao", ProjectDaoImpl.class);
_locator.addDao("InlineLoadBalancerNicMapDao", InlineLoadBalancerNicMapDaoImpl.class);
_locator.addDao("ElasticLbVmMap", ElasticLbVmMapDaoImpl.class);
_locator.addDao("ProjectsAccountDao", ProjectAccountDaoImpl.class);
info = _locator.addDao("HypervisorCapabilitiesDao", HypervisorCapabilitiesDaoImpl.class);
info.addParameter("cache.size", "100");
info.addParameter("cache.time.to.live", "600");
_locator.addManager("StackMaidManager", CheckPointManagerImpl.class);
_locator.addManager("account manager", AccountManagerImpl.class);
_locator.addManager("domain manager", DomainManagerImpl.class);
_locator.addManager("resource limit manager", ResourceLimitManagerImpl.class);
_locator.addManager("configuration manager", ConfigurationManagerImpl.class);
_locator.addManager("network manager", NetworkManagerImpl.class);
_locator.addManager("download manager", DownloadMonitorImpl.class);
_locator.addManager("upload manager", UploadMonitorImpl.class);
_locator.addManager("keystore manager", KeystoreManagerImpl.class);
_locator.addManager("secondary storage vm manager", SecondaryStorageManagerImpl.class);
_locator.addManager("vm manager", UserVmManagerImpl.class);
_locator.addManager("upgrade manager", UpgradeManagerImpl.class);
_locator.addManager("StorageManager", StorageManagerImpl.class);
_locator.addManager("SyncQueueManager", SyncQueueManagerImpl.class);
_locator.addManager("AsyncJobManager", AsyncJobManagerImpl.class);
_locator.addManager("AsyncJobExecutorContext", AsyncJobExecutorContextImpl.class);
_locator.addManager("HA Manager", HighAvailabilityManagerImpl.class);
_locator.addManager("Alert Manager", AlertManagerImpl.class);
_locator.addManager("Template Manager", TemplateManagerImpl.class);
_locator.addManager("Snapshot Manager", SnapshotManagerImpl.class);
_locator.addManager("SnapshotScheduler", SnapshotSchedulerImpl.class);
_locator.addManager("SecurityGroupManager", SecurityGroupManagerImpl2.class);
_locator.addManager("DomainRouterManager", VirtualNetworkApplianceManagerImpl.class);
_locator.addManager("EntityManager", EntityManagerImpl.class);
_locator.addManager("LoadBalancingRulesManager", LoadBalancingRulesManagerImpl.class);
_locator.addManager("RulesManager", RulesManagerImpl.class);
_locator.addManager("RemoteAccessVpnManager", RemoteAccessVpnManagerImpl.class);
_locator.addManager("OvsNetworkManager", OvsNetworkManagerImpl.class);
_locator.addManager("OvsTunnelManager", OvsTunnelManagerImpl.class);
_locator.addManager("Capacity Manager", CapacityManagerImpl.class);
_locator.addManager("Cluster Manager", ClusterManagerImpl.class);
_locator.addManager("VirtualMachineManager", ClusteredVirtualMachineManagerImpl.class);
_locator.addManager("HypervisorGuruManager", HypervisorGuruManagerImpl.class);
_locator.addManager("ClusterFenceManager", ClusterFenceManagerImpl.class);
_locator.addManager("ResourceManager", ResourceManagerImpl.class);
_locator.addManager("OCFS2Manager", OCFS2ManagerImpl.class);
_locator.addManager("FirewallManager", FirewallManagerImpl.class);
ComponentInfo<? extends Manager> info1 = _locator.addManager("ConsoleProxyManager", ConsoleProxyManagerImpl.class);
info1.addParameter("consoleproxy.sslEnabled", "true");
_locator.addManager("ClusteredAgentManager", ClusteredAgentManagerImpl.class);
_locator.addManager("ProjectManager", ProjectManagerImpl.class);
_locator.addManager("ElasticLoadBalancerManager", ElasticLoadBalancerManagerImpl.class);
_locator.makeActive(null);
_configService = ComponentLocator.inject(ConfigurationManagerImpl.class);
}
private <T extends BaseCmd> void evaluateCmd(T cmd, String name, Object value) {
try {
Field f = cmd.getClass().getDeclaredField(name);
f.set(cmd, value);
} catch (Exception e) {
s_logger.debug("Unable to evaluate " + cmd.getClass().getName() + "." + name, e);
TestCase.fail();
}
}
private void createZone(String zoneName) {
CreateZoneCmd cZone = new CreateZoneCmd();
evaluateCmd(cZone, "dns1", "10.223.110.254");
evaluateCmd(cZone, "internalDns1", "10.223.110.254");
evaluateCmd(cZone, "zoneName", zoneName);
evaluateCmd(cZone, "networkType", "Basic");
evaluateCmd(cZone, "securitygroupenabled", false);
s_logger.info("Create zone:" + cZone.getZoneName());
_configService.createZone(cZone);
}
private void createPod(String name) {
CreatePodCmd cPod = new CreatePodCmd();
evaluateCmd(cPod, "netmask", "255.255.255.0");
}
private void deploy100Hosts() {
createZone("test1");
}
public void testDeploy100Hosts() {
deploy100Hosts();
}
@Override
@After
public void tearDown() throws Exception {
}
}

View File

@ -0,0 +1,83 @@
package com.cloud.agent.manager;
import java.util.List;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.host.Status;
import com.cloud.host.dao.HostDao;
import com.cloud.host.dao.HostDaoImpl;
import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.component.MockComponentLocator;
import com.cloud.utils.db.DbTestUtils;
import com.cloud.utils.db.SearchCriteria2;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.SearchCriteriaService;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.dao.VMInstanceDao;
import com.cloud.vm.dao.VMInstanceDaoImpl;
import junit.framework.TestCase;
public class SearchCriteria2Test extends TestCase {
private static final Logger s_logger = Logger.getLogger(SearchCriteria2Test.class);
@Override
@Before
public void setUp() throws Exception {
DbTestUtils.executeScript("PreviousDatabaseSchema/clean-db.sql", false, true);
MockComponentLocator locator = new MockComponentLocator("management-server");
locator.addDao("HostDao", HostDaoImpl.class);
locator.addDao("VmInstance", VMInstanceDaoImpl.class);
s_logger.debug("Finding sample data from 2.1.12");
DbTestUtils.executeScript("PreviousDatabaseSchema/2.2.12-newagentmanager/2.2.12_new_agent_manager_cloud_db_sample.sql", false, true);
}
public void testSearch() {
ComponentLocator locator = ComponentLocator.getCurrentLocator();
HostDao _hostDao = locator.inject(HostDaoImpl.class);
VMInstanceDao _vmDao = locator.inject(VMInstanceDaoImpl.class);
s_logger.debug("Test seraching host:");
SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getStatus(), Op.EQ, Status.Disconnected);
List<HostVO> ups = sc.list();
for (HostVO vo : ups) {
s_logger.info("Host id: " + vo.getId() + " is Disconnected");
}
SearchCriteriaService<VMInstanceVO, VMInstanceVO> sc1 = SearchCriteria2.create(VMInstanceVO.class);
sc1.addAnd(sc1.getEntity().getState(), Op.EQ, VirtualMachine.State.Running);
List<VMInstanceVO> vms = sc1.list();
for (VMInstanceVO vm : vms) {
s_logger.info("Vm name:" + vm.getInstanceName());
}
sc1 = SearchCriteria2.create(VMInstanceVO.class);
sc1.addAnd(sc1.getEntity().getInstanceName(), Op.EQ, "s-1-TEST");
VMInstanceVO vo = sc1.find();
s_logger.info("SSVM name is " + vo.getInstanceName());
SearchCriteriaService<HostVO, Long> sc3 = SearchCriteria2.create(HostVO.class, Long.class);
sc3.selectField(sc3.getEntity().getId());
sc3.addAnd(sc3.getEntity().getStatus(), Op.EQ, Status.Disconnected);
sc3.addAnd(sc3.getEntity().getType(), Op.EQ, Host.Type.Routing);
List<Long> hostIds = sc3.list();
for (Long id : hostIds) {
s_logger.info("Host Id is " + id);
}
}
@Override
@After
public void tearDown() throws Exception {
}
}

View File

@ -379,6 +379,18 @@ public class CheckPointManagerTest extends TestCase {
@Override @Override
public boolean isAgentRebalanceEnabled() { public boolean isAgentRebalanceEnabled() {
return false; return false;
}
@Override
public Boolean propagateResourceEvent(long agentId, com.cloud.resource.ResourceState.Event event) throws AgentUnavailableException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean executeResourceUserRequest(long hostId, com.cloud.resource.ResourceState.Event event) throws AgentUnavailableException {
// TODO Auto-generated method stub
return false;
} }
} }

View File

@ -93,12 +93,6 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
return false; return false;
} }
@Override
public boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
// TODO Auto-generated method stub
return false;
}
@Override @Override
public int getActiveNicsInNetwork(long networkId) { public int getActiveNicsInNetwork(long networkId) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
@ -501,4 +495,17 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
return null; return null;
} }
@Override
public boolean restartNetwork(RestartNetworkCmd cmd, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
// TODO Auto-generated method stub
return false;
}
@Override
public Long getPodIdForVlan(long vlanDbId) {
// TODO Auto-generated method stub
return null;
}
} }

View File

@ -192,4 +192,10 @@ public class MockVirtualMachineManagerImpl implements VirtualMachineManager {
return false; return false;
} }
@Override
public VMInstanceVO findById(long vmId) {
// TODO Auto-generated method stub
return null;
}
} }

View File

@ -702,7 +702,8 @@ CREATE TABLE `cloud`.`host` (
`disconnected` datetime COMMENT 'Time this was disconnected', `disconnected` datetime COMMENT 'Time this was disconnected',
`created` datetime COMMENT 'date the host first signed on', `created` datetime COMMENT 'date the host first signed on',
`removed` datetime COMMENT 'date removed if not null', `removed` datetime COMMENT 'date removed if not null',
`allocation_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this host enabled for allocation for new resources', `update_count` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'atomic increase count making status update operation atomical',
`resource_state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'Is this host enabled for allocation for new resources',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
INDEX `i_host__removed`(`removed`), INDEX `i_host__removed`(`removed`),
INDEX `i_host__last_ping`(`last_ping`), INDEX `i_host__last_ping`(`last_ping`),

View File

View File

@ -0,0 +1,73 @@
'''
Created on Oct 18, 2011
@author: frank
'''
from optparse import OptionParser
from configGenerator import *
if __name__ == '__main__':
parser = OptionParser()
parser.add_option('-o', '--output', action='store', default='./setup.conf', dest='output', help='the path where the json config file generated')
parser.add_option('-m', '--mshost', dest='mshost', help='hostname/ip of management server', action='store')
(opts, args) = parser.parse_args()
mandatories = ['mshost']
for m in mandatories:
if not opts.__dict__[m]:
parser.error("mandatory option - " + m +" missing")
zs = cloudstackConfiguration()
#Define Zone
z = zone()
z.dns1 = "8.8.8.8"
z.dns2 = "4.4.4.4"
z.internaldns1 = "192.168.110.254"
z.internaldns2 = "192.168.110.253"
z.name = "testZone"
z.networktype = 'Basic'
#Define SecondaryStorage
ss = secondaryStorage()
ss.url ="nfs://172.16.15.32/export/share/secondary"
z.secondaryStorages.append(ss)
p = pod()
p.name = "POD-1"
p.gateway = "10.223.64.1"
p.netmask = "255.255.254.0"
p.startip = "10.223.64.50"
p.endip = "10.223.64.60"
ip = iprange()
ip.vlan="untagged"
ip.gateway = p.gateway
ip.netmask = p.netmask
ip.startip = "10.223.64.70"
ip.endip = "10.223.64.220"
p.guestIpRanges.append(ip)
c = cluster()
c.clustername = "CLUSTER-1"
c.clustertype = "CloudManaged"
c.hypervisor = "Simulator"
p.clusters.append(c)
z.pods.append(p)
zs.zones.append(z)
'''Add one mgt server'''
mgt = managementServer()
mgt.mgtSvrIp = opts.mshost
zs.mgtSvr.append(mgt)
'''Add a database'''
db = dbServer()
db.dbSvr = opts.mshost
db.user = "root"
db.passwd = ""
zs.dbSvr = db
generate_setup_config(zs,opts.output)

View File

@ -0,0 +1,94 @@
'''
Created on Oct 18, 2011
@author: frank
'''
from cloudstackTestCase import *
from cloudstackAPI import *
import uuid
import threading
import random
import time
class Task(threading.Thread):
def __init__(self, func, param=None):
super(Task, self).__init__()
self.func = func
self.param = param
def run(self):
self.func(self.param)
def doTask(self):
self.start()
class TestDeploy100Hosts(cloudstackTestCase):
hosts = []
def deployHost(self, url):
apiClient = self.testClient.getApiClient()
addHostCmd = addHost.addHostCmd()
addHostCmd.hypervisor = "simulator"
addHostCmd.clusterid = 1
addHostCmd.zoneid = 1
addHostCmd.podid = 1
addHostCmd.url = "http://sim/%s"%url
addHostCmd.username = "placeholder"
addHostCmd.password = "placeholder"
addHostResponce = apiClient.addHost(addHostCmd)
return addHostResponce[0].id
def randomCancelMaintenance(self):
def run(param):
while(1):
try:
interval = random.randint(1, 2)
time.sleep(interval)
if len(self.hosts) == 0:
continue
index = random.randint(0, len(self.hosts)-1)
hostId = self.hosts[index]
apiClient = self.testClient.getApiClient()
cMaintainCmd = cancelHostMaintenance.cancelHostMaintenanceCmd()
cMaintainCmd.id = hostId
response = apiClient.cancelHostMaintenance(cMaintainCmd)
id = response.id
print "Host %s cancelled maintenance mode" % id
except Exception, e:
print e
t = Task(run)
t.doTask()
def randomEnterMaintenance(self):
def run(param):
while(1):
try:
interval = random.randint(1, 2)
time.sleep(interval)
if len(self.hosts) == 0:
continue
index = random.randint(0, len(self.hosts)-1)
hostId = self.hosts[index]
apiClient = self.testClient.getApiClient()
maintainCmd = prepareHostForMaintenance.prepareHostForMaintenanceCmd()
maintainCmd.id = hostId
response = apiClient.prepareHostForMaintenance(maintainCmd)
id = response.id
print "Host %s entered maintenance mode" % id
except Exception, e:
print e
t = Task(run)
t.doTask()
def test_deploy100Hosts(self):
#for i in range(200):
#self.hosts.append(self.deployHost(i))
for i in range(200):
self.hosts.append(i)
self.randomEnterMaintenance()
self.randomCancelMaintenance()
while(1): time.sleep(10000)

View File

@ -66,4 +66,5 @@ public interface SerialVersionUID {
public static final long NoTransitionException = Base | 0x26; public static final long NoTransitionException = Base | 0x26;
public static final long CloudExecutionException = Base | 0x27; public static final long CloudExecutionException = Base | 0x27;
public static final long CallFailedException = Base | 0x28; public static final long CallFailedException = Base | 0x28;
public static final long UnableDeleteHostException = Base | 0x29;
} }

View File

@ -28,11 +28,25 @@ public class DatabaseCallbackFilter implements CallbackFilter {
} }
public static boolean checkAnnotation(Method method) { public static boolean checkAnnotation(Method method) {
/*Check self*/
DB db = method.getAnnotation(DB.class); DB db = method.getAnnotation(DB.class);
if (db != null) { if (db != null) {
return db.txn(); return db.txn();
} }
Class<?> clazz = method.getDeclaringClass(); Class<?> clazz = method.getDeclaringClass();
/*Check parent method*/
try {
Method pMethod = clazz.getMethod(method.getName(), method.getParameterTypes());
db = pMethod.getAnnotation(DB.class);
if (db != null) {
return db.txn();
}
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {
}
/*Check class's annotation and ancestor's annotation*/
do { do {
db = clazz.getAnnotation(DB.class); db = clazz.getAnnotation(DB.class);
if (db != null) { if (db != null) {

View File

@ -254,4 +254,9 @@ public interface GenericDao<T, ID extends Serializable> {
public <K> K getRandomlyIncreasingNextInSequence(Class<K> clazz, String name); public <K> K getRandomlyIncreasingNextInSequence(Class<K> clazz, String name);
<K> SearchCriteria2 createSearchCriteria2(Class<K> resultType);
SearchCriteria2 createSearchCriteria2();
public T findOneBy(final SearchCriteria<T> sc);
} }

View File

@ -852,8 +852,9 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
return results.size() == 0 ? null : results.get(0); return results.size() == 0 ? null : results.get(0);
} }
@Override
@DB(txn=false) @DB(txn=false)
protected T findOneBy(final SearchCriteria<T> sc) { public T findOneBy(final SearchCriteria<T> sc) {
if (_removed != null) { if (_removed != null) {
sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL); sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL);
} }
@ -1727,4 +1728,21 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
return builder.create(); return builder.create();
} }
@Override @DB(txn=false)
public <K> SearchCriteria2 createSearchCriteria2(Class<K> resultType) {
final T entity = (T)_searchEnhancer.create();
final Factory factory = (Factory)entity;
SearchCriteria2 sc = new SearchCriteria2(entity, resultType, _allAttributes, this);
factory.setCallback(0, sc);
return sc;
}
@Override @DB(txn=false)
public SearchCriteria2 createSearchCriteria2() {
final T entity = (T)_searchEnhancer.create();
final Factory factory = (Factory)entity;
SearchCriteria2 sc = new SearchCriteria2(entity, (Class<T>)entity.getClass(), _allAttributes, this);
factory.setCallback(0, sc);
return sc;
}
} }

4
utils/src/com/cloud/utils/db/GenericSearchBuilder.java Normal file → Executable file
View File

@ -24,6 +24,8 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.persistence.Transient;
import net.sf.cglib.proxy.Factory; import net.sf.cglib.proxy.Factory;
import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; import net.sf.cglib.proxy.MethodProxy;
@ -154,6 +156,7 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
@Override @Override
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
String name = method.getName(); String name = method.getName();
if (method.getAnnotation(Transient.class) == null) {
if (name.startsWith("get")) { if (name.startsWith("get")) {
String fieldName = Character.toLowerCase(name.charAt(3)) + name.substring(4); String fieldName = Character.toLowerCase(name.charAt(3)) + name.substring(4);
set(fieldName); set(fieldName);
@ -172,6 +175,7 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
} }
assert false : "Perhaps you need to make the method start with get or is?"; assert false : "Perhaps you need to make the method start with get or is?";
} }
}
return methodProxy.invokeSuper(object, args); return methodProxy.invokeSuper(object, args);
} }

View File

@ -115,7 +115,7 @@ public class SearchCriteria<K> {
private final Map<String, Attribute> _attrs; private final Map<String, Attribute> _attrs;
private final ArrayList<Condition> _conditions; private final ArrayList<Condition> _conditions;
private ArrayList<Condition> _additionals = null; private ArrayList<Condition> _additionals = null;
private final HashMap<String, Object[]> _params = new HashMap<String, Object[]>(); private HashMap<String, Object[]> _params = new HashMap<String, Object[]>();
private int _counter; private int _counter;
private HashMap<String, JoinBuilder<SearchCriteria<?>>> _joins; private HashMap<String, JoinBuilder<SearchCriteria<?>>> _joins;
private final ArrayList<Select> _selects; private final ArrayList<Select> _selects;
@ -139,6 +139,21 @@ public class SearchCriteria<K> {
_selectType = null; _selectType = null;
} }
protected SearchCriteria(final Map<String, Attribute> attrs, ArrayList<GenericSearchBuilder.Condition> conditions, ArrayList<Select> selects, SelectType selectType, Class<K> resultType, HashMap<String, Object[]> params) {
this._attrs = attrs;
this._conditions = conditions;
this._selects = selects;
this._selectType = selectType;
this._resultType = resultType;
this._params = params;
this._builder = null;
this._additionals = new ArrayList<Condition>();
this._counter = 0;
this._joins = null;
this._groupBy = null;
this._groupByValues = null;
}
protected SearchCriteria(GenericSearchBuilder<?, K> sb) { protected SearchCriteria(GenericSearchBuilder<?, K> sb) {
this._builder = null; this._builder = null;
this._attrs = sb._attrs; this._attrs = sb._attrs;

View File

@ -0,0 +1,197 @@
package com.cloud.utils.db;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.persistence.Transient;
import net.sf.cglib.proxy.Factory;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import com.cloud.utils.db.GenericSearchBuilder.Condition;
import com.cloud.utils.db.GenericSearchBuilder.Select;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.SearchCriteria.SelectType;
public class SearchCriteria2<T, K> implements SearchCriteriaService<T, K>, MethodInterceptor{
GenericDao<? extends Serializable, ? extends Serializable> _dao;
final protected Map<String, Attribute> _attrs;
protected ArrayList<Attribute> _specifiedAttrs;
protected T _entity;
protected ArrayList<GenericSearchBuilder.Condition> _conditions;
protected ArrayList<Select> _selects;
private final HashMap<String, Object[]> _params = new HashMap<String, Object[]>();
protected Class<K> _resultType;
protected SelectType _selectType;
protected Class<T> _entityBeanType;
protected SearchCriteria2(T entity, Class<K> resultType, final Map<String, Attribute> attrs, GenericDao<? extends Serializable, ? extends Serializable> dao) {
_entityBeanType = (Class<T>)entity.getClass();
_dao = dao;
_resultType = resultType;
_attrs = attrs;
_entity = entity;
_conditions = new ArrayList<Condition>();
_specifiedAttrs = new ArrayList<Attribute>();
}
static public <T, K> SearchCriteria2<T, K> create(Class<T> entityType, Class<K> resultType) {
GenericDao<? extends Serializable, ? extends Serializable> dao = (GenericDao<? extends Serializable, ? extends Serializable>)GenericDaoBase.getDao(entityType);
assert dao != null : "Can not find DAO for " + entityType.getName();
SearchCriteria2<T, K> sc = dao.createSearchCriteria2(resultType);
return sc;
}
static public <T, K> SearchCriteria2<T, K> create(Class<T> entityType) {
GenericDao<? extends Serializable, ? extends Serializable> dao = (GenericDao<? extends Serializable, ? extends Serializable>)GenericDaoBase.getDao(entityType);
assert dao != null : "Can not find DAO for " + entityType.getName();
SearchCriteria2<T, K> sc = dao.createSearchCriteria2();
return sc;
}
@Override
public void selectField(Object... useless) {
assert _entity != null : "SearchBuilder cannot be modified once it has been setup";
assert _specifiedAttrs.size() > 0 : "You didn't specify any attributes";
if (_selects == null) {
_selects = new ArrayList<Select>();
}
for (Attribute attr : _specifiedAttrs) {
Field field = null;
try {
field = _resultType.getDeclaredField(attr.field.getName());
field.setAccessible(true);
} catch (SecurityException e) {
} catch (NoSuchFieldException e) {
}
_selects.add(new Select(Func.NATIVE, attr, field, null));
}
_specifiedAttrs.clear();
}
private void constructCondition(String conditionName, String cond, Attribute attr, Op op) {
assert _entity != null : "SearchBuilder cannot be modified once it has been setup";
assert op == null || _specifiedAttrs.size() == 1 : "You didn't select the attribute.";
assert op != Op.SC : "Call join";
GenericSearchBuilder.Condition condition = new GenericSearchBuilder.Condition(conditionName, cond, attr, op);
_conditions.add(condition);
_specifiedAttrs.clear();
}
private void setParameters(String conditionName, Object... params) {
assert _conditions.contains(new Condition(conditionName)) : "Couldn't find " + conditionName;
_params.put(conditionName, params);
}
@Override
public void addAnd(Object useless, Op op, Object...values) {
String uuid = UUID.randomUUID().toString();
constructCondition(uuid, " AND ", _specifiedAttrs.get(0), op);
setParameters(uuid, values);
}
@Override
public List<K> list() {
done();
SearchCriteria sc1 = createSearchCriteria();
if (isSelectAll()) {
return (List<K>)_dao.search(sc1, null);
} else {
return (List<K>)_dao.customSearch(sc1, null);
}
}
private boolean isSelectAll() {
return _selects == null || _selects.size() == 0;
}
@Override
public T getEntity() {
return (T) _entity;
}
private SearchCriteria<K> createSearchCriteria() {
return new SearchCriteria<K>(_attrs, _conditions, _selects, _selectType, _resultType, _params);
}
private void set(String name) {
Attribute attr = _attrs.get(name);
assert (attr != null) : "Searching for a field that's not there: " + name;
_specifiedAttrs.add(attr);
}
private void done() {
if (_entity != null) {
Factory factory = (Factory)_entity;
factory.setCallback(0, null);
_entity = null;
}
if (_selects == null || _selects.size() == 0) {
_selectType = SelectType.Entity;
assert _entityBeanType.equals(_resultType) : "Expecting " + _entityBeanType + " because you didn't specify any selects but instead got " + _resultType;
return;
}
for (Select select : _selects) {
if (select.field == null) {
assert (_selects.size() == 1) : "You didn't specify any fields to put the result in but you're specifying more than one select so where should I put the selects?";
_selectType = SelectType.Single;
return;
}
if (select.func != null) {
_selectType = SelectType.Result;
return;
}
}
_selectType = SelectType.Fields;
}
@Override
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
String name = method.getName();
if (method.getAnnotation(Transient.class) == null) {
if (name.startsWith("get")) {
String fieldName = Character.toLowerCase(name.charAt(3)) + name.substring(4);
set(fieldName);
return null;
} else if (name.startsWith("is")) {
String fieldName = Character.toLowerCase(name.charAt(2)) + name.substring(3);
set(fieldName);
return null;
} else {
name = name.toLowerCase();
for (String fieldName : _attrs.keySet()) {
if (name.endsWith(fieldName.toLowerCase())) {
set(fieldName);
return null;
}
}
assert false : "Perhaps you need to make the method start with get or is?";
}
}
return methodProxy.invokeSuper(object, args);
}
@Override
public <K> K find() {
assert isSelectAll() : "find doesn't support select search";
done();
SearchCriteria sc1 = createSearchCriteria();
return (K)_dao.findOneBy(sc1);
}
}

View File

@ -0,0 +1,13 @@
package com.cloud.utils.db;
import java.util.List;
import com.cloud.utils.db.SearchCriteria.Op;
public interface SearchCriteriaService<T, K> {
public void selectField(Object... useless);
public void addAnd(Object useless, Op op, Object...values);
public List<K> list();
public T getEntity();
public <K> K find();
}

View File

@ -84,7 +84,9 @@ public class MockComponentLocator extends ComponentLocator {
s_callbacks = new Callback[] { NoOp.INSTANCE, new DatabaseCallback()}; s_callbacks = new Callback[] { NoOp.INSTANCE, new DatabaseCallback()};
s_callbackFilter = new DatabaseCallbackFilter(); s_callbackFilter = new DatabaseCallbackFilter();
s_interceptors.clear(); s_interceptors.clear();
if (interceptors != null) {
resetInterceptors(interceptors); resetInterceptors(interceptors);
}
s_tl.set(this); s_tl.set(this);
parse("fake file"); parse("fake file");
} }