mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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:
commit
cef30956e9
9
agent-simulator/src/com/cloud/agent/manager/MockAgentManagerImpl.java
Normal file → Executable file
9
agent-simulator/src/com/cloud/agent/manager/MockAgentManagerImpl.java
Normal file → Executable file
@ -24,6 +24,7 @@ import com.cloud.agent.api.CheckHealthCommand;
|
||||
import com.cloud.agent.api.GetHostStatsAnswer;
|
||||
import com.cloud.agent.api.GetHostStatsCommand;
|
||||
import com.cloud.agent.api.HostStatsEntry;
|
||||
import com.cloud.agent.api.MaintainAnswer;
|
||||
import com.cloud.agent.api.PingTestCommand;
|
||||
import com.cloud.agent.api.PrepareForMigrationAnswer;
|
||||
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.AgentRoutingResource;
|
||||
import com.cloud.resource.AgentStorageResource;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.simulator.MockHost;
|
||||
import com.cloud.simulator.MockHostVO;
|
||||
import com.cloud.simulator.MockVMVO;
|
||||
@ -56,6 +58,7 @@ public class MockAgentManagerImpl implements MockAgentManager {
|
||||
@Inject SimulatorManager _simulatorMgr = null;
|
||||
@Inject AgentManager _agentMgr = null;
|
||||
@Inject MockStorageManager _storageMgr = null;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
private SecureRandom random;
|
||||
private Map<String, AgentResourceBase> _resources = new ConcurrentHashMap<String, AgentResourceBase>();
|
||||
private ThreadPoolExecutor _executor;
|
||||
@ -270,7 +273,7 @@ public class MockAgentManagerImpl implements MockAgentManager {
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
@ -347,7 +350,7 @@ public class MockAgentManagerImpl implements MockAgentManager {
|
||||
|
||||
|
||||
@Override
|
||||
public Answer MaintainCommand(com.cloud.agent.api.MaintainCommand cmd) {
|
||||
return new Answer(cmd);
|
||||
public MaintainAnswer MaintainCommand(com.cloud.agent.api.MaintainCommand cmd) {
|
||||
return new MaintainAnswer(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
0
agent-simulator/src/com/cloud/agent/manager/SimulatorManager.java
Normal file → Executable file
0
agent-simulator/src/com/cloud/agent/manager/SimulatorManager.java
Normal file → Executable file
0
agent-simulator/src/com/cloud/api/commands/ConfigureSimulator.java
Normal file → Executable file
0
agent-simulator/src/com/cloud/api/commands/ConfigureSimulator.java
Normal file → Executable file
@ -38,6 +38,7 @@ import com.cloud.agent.api.AgentControlCommand;
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.agent.api.StartupRoutingCommand;
|
||||
import com.cloud.agent.manager.MockAgentManager;
|
||||
import com.cloud.agent.manager.MockStorageManager;
|
||||
import com.cloud.agent.manager.SimulatorManager;
|
||||
@ -66,7 +67,7 @@ import com.cloud.utils.component.Inject;
|
||||
*
|
||||
*/
|
||||
@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
|
||||
.getLogger(SimulatorDiscoverer.class);
|
||||
|
||||
@ -78,6 +79,7 @@ public class SimulatorDiscoverer extends DiscovererBase implements Discoverer, L
|
||||
@Inject AgentManager _agentMgr = null;
|
||||
@Inject MockAgentManager _mockAgentMgr = null;
|
||||
@Inject MockStorageManager _mockStorageMgr = null;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
/**
|
||||
* Finds ServerResources of an in-process simulator
|
||||
@ -243,7 +245,8 @@ public class SimulatorDiscoverer extends DiscovererBase implements Discoverer, L
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||
super.configure(name, params);
|
||||
_agentMgr.registerForHostEvents(this, true, false, false);
|
||||
_agentMgr.registerForHostEvents(this, true, false, false);
|
||||
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -304,5 +307,42 @@ public class SimulatorDiscoverer extends DiscovererBase implements Discoverer, L
|
||||
public boolean processTimeout(long agentId, long seq) {
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
32
api/src/com/cloud/agent/api/PropagateResourceEventCommand.java
Executable file
32
api/src/com/cloud/agent/api/PropagateResourceEventCommand.java
Executable 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
2
api/src/com/cloud/api/commands/ReconnectHostCmd.java
Normal file → Executable file
@ -107,7 +107,7 @@ public class ReconnectHostCmd extends BaseAsyncCmd {
|
||||
} else {
|
||||
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to reconnect host");
|
||||
}
|
||||
} catch (AgentUnavailableException ex) {
|
||||
} catch (Exception ex) {
|
||||
s_logger.warn("Exception: ", ex);
|
||||
throw new ServerApiException(BaseCmd.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage());
|
||||
}
|
||||
|
||||
0
api/src/com/cloud/api/response/BaseResponse.java
Normal file → Executable file
0
api/src/com/cloud/api/response/BaseResponse.java
Normal file → Executable file
@ -20,12 +20,14 @@ package com.cloud.host;
|
||||
import java.util.Date;
|
||||
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.resource.ResourceState;
|
||||
import com.cloud.utils.fsm.StateObject;
|
||||
|
||||
|
||||
/**
|
||||
* Host represents one particular host server.
|
||||
*/
|
||||
public interface Host {
|
||||
public interface Host extends StateObject<Status> {
|
||||
public enum Type {
|
||||
Storage(false),
|
||||
Routing(false),
|
||||
@ -58,11 +60,6 @@ public interface Host {
|
||||
}
|
||||
}
|
||||
|
||||
public enum HostAllocationState {
|
||||
Disabled,
|
||||
Enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return id of the host.
|
||||
*/
|
||||
@ -197,8 +194,9 @@ public interface Host {
|
||||
|
||||
String getStorageMacAddressDeux();
|
||||
|
||||
HostAllocationState getHostAllocationState();
|
||||
|
||||
String getHypervisorVersion();
|
||||
|
||||
boolean isInMaintenanceStates();
|
||||
|
||||
ResourceState getResourceState();
|
||||
}
|
||||
|
||||
70
api/src/com/cloud/host/Status.java
Normal file → Executable file
70
api/src/com/cloud/host/Status.java
Normal file → Executable file
@ -20,19 +20,19 @@ package com.cloud.host;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.cloud.utils.fsm.NoTransitionException;
|
||||
import com.cloud.utils.fsm.StateMachine;
|
||||
import com.cloud.utils.fsm.StateMachine2;
|
||||
|
||||
public enum Status {
|
||||
Creating(true, false, false),
|
||||
Connecting(true, false, false),
|
||||
Up(true, false, false),
|
||||
Down(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),
|
||||
Removed(true, false, true),
|
||||
Error(true, false, true),
|
||||
Rebalancing(false, false, false);
|
||||
|
||||
private final boolean updateManagementServer;
|
||||
@ -60,26 +60,19 @@ public enum Status {
|
||||
public enum Event {
|
||||
AgentConnected(false, "Agent connected"),
|
||||
PingTimeout(false, "Agent is behind on ping"),
|
||||
UpdateNeeded(false, "UpdateRequested"),
|
||||
ShutdownRequested(false, "Shutdown requested by the agent"),
|
||||
AgentDisconnected(false, "Agent disconnected"),
|
||||
ResetRequested(true, "Reset is requested by the user"),
|
||||
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"),
|
||||
MaintenanceRequested(true, "PrepareForMaintenance requested by user"),
|
||||
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"),
|
||||
Remove(true, "Host is removed"),
|
||||
Ready(false, "Host is ready for commands"),
|
||||
UpdatePassword(false, "Update host password from db"),
|
||||
RequestAgentRebalance(false, "Request rebalance for the certain host"),
|
||||
StartAgentRebalance(false, "Start rebalance for the certain host"),
|
||||
RebalanceCompleted(false, "Host is rebalanced successfully"),
|
||||
RebalanceFailed(false, "Failed to rebalance the host"),
|
||||
PrepareUnmanaged(true, "prepare for cluster entering unmanaged status"),
|
||||
HypervisorVersionChanged(false, " hypervisor version changed when host is reconnected");
|
||||
Error(false, "An internal error happened");
|
||||
|
||||
private final boolean isUserRequest;
|
||||
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);
|
||||
}
|
||||
|
||||
@ -118,22 +115,20 @@ public enum Status {
|
||||
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 {
|
||||
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.Ready, Status.Up);
|
||||
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.HostDown, Status.Alert);
|
||||
s_fsm.addTransition(Status.Connecting, Event.Ping, Status.Connecting);
|
||||
s_fsm.addTransition(Status.Connecting, Event.ManagementServerDown, Status.Disconnected);
|
||||
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.MaintenanceRequested, Status.PrepareForMaintenance);
|
||||
s_fsm.addTransition(Status.Up, Event.AgentDisconnected, Status.Alert);
|
||||
s_fsm.addTransition(Status.Up, Event.ShutdownRequested, Status.Disconnected);
|
||||
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.ManagementServerDown, Status.Disconnected);
|
||||
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.AgentConnected, Status.Connecting);
|
||||
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.WaitedTooLong, Status.Alert);
|
||||
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.Down, Event.MaintenanceRequested, Status.PrepareForMaintenance);
|
||||
s_fsm.addTransition(Status.Down, Event.AgentConnected, Status.Connecting);
|
||||
s_fsm.addTransition(Status.Down, Event.Remove, Status.Removed);
|
||||
s_fsm.addTransition(Status.Down, Event.ManagementServerDown, 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.Ping, Status.Up);
|
||||
s_fsm.addTransition(Status.Alert, Event.Remove, Status.Removed);
|
||||
s_fsm.addTransition(Status.Alert, Event.ManagementServerDown, 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.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) {
|
||||
|
||||
2
api/src/com/cloud/resource/ResourceService.java
Normal file → Executable file
2
api/src/com/cloud/resource/ResourceService.java
Normal file → Executable file
@ -46,7 +46,7 @@ public interface ResourceService {
|
||||
|
||||
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
|
||||
|
||||
101
api/src/com/cloud/resource/ResourceState.java
Executable file
101
api/src/com/cloud/resource/ResourceState.java
Executable 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);
|
||||
}
|
||||
}
|
||||
@ -242,11 +242,11 @@
|
||||
</target>
|
||||
|
||||
<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" />
|
||||
</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" />
|
||||
</condition>
|
||||
|
||||
@ -362,11 +362,6 @@
|
||||
<include name="**/${test}.java"/>
|
||||
</fileset>
|
||||
</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>
|
||||
<junitreport todir="${unittest.dir}">
|
||||
<fileset dir="${unittest.dir}"/>
|
||||
|
||||
69
core/src/com/cloud/host/HostVO.java
Normal file → Executable file
69
core/src/com/cloud/host/HostVO.java
Normal file → Executable file
@ -38,6 +38,7 @@ import javax.persistence.TemporalType;
|
||||
import javax.persistence.Transient;
|
||||
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.resource.ResourceState;
|
||||
import com.cloud.storage.Storage.StoragePoolType;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
@ -126,13 +127,16 @@ public class HostVO implements Host {
|
||||
|
||||
@Column(name="setup")
|
||||
private boolean setup = false;
|
||||
|
||||
@Column(name="allocation_state", nullable=false)
|
||||
|
||||
@Column(name="resource_state", nullable=false)
|
||||
@Enumerated(value=EnumType.STRING)
|
||||
private HostAllocationState hostAllocationState;
|
||||
private ResourceState resourceState;
|
||||
|
||||
@Column(name="hypervisor_version")
|
||||
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,
|
||||
// then this field has not been loaded yet.
|
||||
@ -356,10 +360,10 @@ public class HostVO implements Host {
|
||||
|
||||
public HostVO(String guid) {
|
||||
this.guid = guid;
|
||||
this.status = Status.Up;
|
||||
this.status = Status.Creating;
|
||||
this.totalMemory = 0;
|
||||
this.dom0MinMemory = 0;
|
||||
this.hostAllocationState = Host.HostAllocationState.Enabled;
|
||||
this.resourceState = ResourceState.Creating;
|
||||
}
|
||||
|
||||
protected HostVO() {
|
||||
@ -395,8 +399,7 @@ public class HostVO implements Host {
|
||||
this(id, name, type, privateIpAddress, privateNetmask, privateMacAddress, publicIpAddress, publicNetmask, publicMacAddress, storageIpAddress, storageNetmask, storageMacAddress, guid, status, version, iqn, disconnectedOn, dcId, podId, serverId, ping, null, null, null, 0, null);
|
||||
this.parent = parent;
|
||||
this.totalSize = totalSize;
|
||||
this.fsType = fsType;
|
||||
this.hostAllocationState = Host.HostAllocationState.Enabled;
|
||||
this.fsType = fsType;
|
||||
}
|
||||
|
||||
public HostVO(long id,
|
||||
@ -453,8 +456,7 @@ public class HostVO implements Host {
|
||||
this.caps = caps;
|
||||
this.disconnectedOn = disconnectedOn;
|
||||
this.dom0MinMemory = dom0MinMemory;
|
||||
this.storageUrl = url;
|
||||
this.hostAllocationState = Host.HostAllocationState.Enabled;
|
||||
this.storageUrl = url;
|
||||
}
|
||||
|
||||
public void setPodId(Long podId) {
|
||||
@ -671,16 +673,6 @@ public class HostVO implements Host {
|
||||
return hypervisorType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HostAllocationState getHostAllocationState() {
|
||||
return hostAllocationState;
|
||||
}
|
||||
|
||||
public void setHostAllocationState(HostAllocationState hostAllocationState) {
|
||||
this.hostAllocationState = hostAllocationState;
|
||||
}
|
||||
|
||||
|
||||
public void setHypervisorVersion(String hypervisorVersion) {
|
||||
this.hypervisorVersion = hypervisorVersion;
|
||||
}
|
||||
@ -688,5 +680,42 @@ public class HostVO implements Host {
|
||||
@Override
|
||||
public String getHypervisorVersion() {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
11
core/src/com/cloud/resource/UnableDeleteHostException.java
Executable file
11
core/src/com/cloud/resource/UnableDeleteHostException.java
Executable 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);
|
||||
}
|
||||
}
|
||||
@ -15,6 +15,8 @@ import org.apache.log4j.Logger;
|
||||
import org.apache.xmlrpc.XmlRpcException;
|
||||
|
||||
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.dao.ClusterDao;
|
||||
import com.cloud.exception.DiscoveryException;
|
||||
@ -25,19 +27,23 @@ import com.cloud.ovm.object.Connection;
|
||||
import com.cloud.ovm.object.OvmHost;
|
||||
import com.cloud.resource.Discoverer;
|
||||
import com.cloud.resource.DiscovererBase;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.resource.ResourceStateAdapter;
|
||||
import com.cloud.resource.ServerResource;
|
||||
import com.cloud.resource.UnableDeleteHostException;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
import com.cloud.utils.ssh.SSHCmdHelper;
|
||||
|
||||
@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);
|
||||
protected String _publicNetworkDevice;
|
||||
protected String _privateNetworkDevice;
|
||||
protected String _guestNetworkDevice;
|
||||
|
||||
@Inject ClusterDao _clusterDao;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||
@ -51,6 +57,18 @@ public class OvmDiscoverer extends DiscovererBase implements Discoverer {
|
||||
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
|
||||
public Map<? extends ServerResource, Map<String, String>> find(long dcId,
|
||||
Long podId, Long clusterId, URI url, String username,
|
||||
@ -184,4 +202,32 @@ public class OvmDiscoverer extends DiscovererBase implements Discoverer {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
29
server/.classpath
Normal file → Executable file
29
server/.classpath
Normal file → Executable file
@ -1,14 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="test"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/utils"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/core"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/api"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/deps"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/tools"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/vmware-base"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/agent"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="test"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/utils"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/core"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/api"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/deps"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/tools"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/vmware-base"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/agent"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/agent-simulator"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
|
||||
@ -23,6 +23,7 @@ import java.util.Set;
|
||||
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.agent.manager.AgentAttache;
|
||||
import com.cloud.agent.manager.Commands;
|
||||
import com.cloud.api.commands.UpdateHostPasswordCmd;
|
||||
@ -30,6 +31,7 @@ import com.cloud.dc.DataCenterVO;
|
||||
import com.cloud.dc.HostPodVO;
|
||||
import com.cloud.dc.PodCluster;
|
||||
import com.cloud.exception.AgentUnavailableException;
|
||||
import com.cloud.exception.ConnectionException;
|
||||
import com.cloud.exception.OperationTimedoutException;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.Host.Type;
|
||||
@ -53,6 +55,12 @@ public interface AgentManager extends Manager {
|
||||
Continue, Stop
|
||||
}
|
||||
|
||||
public enum TapAgentsAction {
|
||||
Add,
|
||||
Del,
|
||||
Contains,
|
||||
}
|
||||
|
||||
/**
|
||||
* easy send method that returns null if there's any errors. It handles all exceptions.
|
||||
*
|
||||
@ -156,26 +164,6 @@ public interface AgentManager extends Manager {
|
||||
* @return hosts currently connected.
|
||||
*/
|
||||
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);
|
||||
|
||||
@ -187,29 +175,6 @@ public interface AgentManager extends Manager {
|
||||
|
||||
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.
|
||||
*
|
||||
@ -220,46 +185,38 @@ public interface AgentManager extends Manager {
|
||||
*/
|
||||
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 reconnect(final long hostId) throws AgentUnavailableException;
|
||||
|
||||
boolean isHostNativeHAEnabled(long hostId);
|
||||
|
||||
Answer sendTo(Long dcId, HypervisorType type, Command cmd);
|
||||
|
||||
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);
|
||||
|
||||
Answer sendToSecStorage(HostVO ssHost, Command cmd);
|
||||
|
||||
HostVO getSSAgent(HostVO ssHost);
|
||||
|
||||
/* 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);
|
||||
|
||||
void updateStatus(HostVO host, Event event);
|
||||
|
||||
boolean reconnect(long hostId);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -42,15 +42,21 @@ import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.Status.Event;
|
||||
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.db.ConnectionConcierge;
|
||||
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.vm.VMInstanceVO;
|
||||
import com.cloud.vm.dao.VMInstanceDao;
|
||||
|
||||
public class AgentMonitor extends Thread implements Listener {
|
||||
private static Logger s_logger = Logger.getLogger(AgentMonitor.class);
|
||||
private static Logger status_Logger = Logger.getLogger(Status.class);
|
||||
private long _pingTimeout;
|
||||
private HostDao _hostDao;
|
||||
private boolean _stop;
|
||||
@ -63,6 +69,9 @@ public class AgentMonitor extends Thread implements Listener {
|
||||
private ConnectionConcierge _concierge;
|
||||
@Inject
|
||||
ClusterDao _clusterDao;
|
||||
@Inject
|
||||
ResourceManager _resourceMgr;
|
||||
|
||||
// private ConnectionConcierge _concierge;
|
||||
private Map<Long, Long> _pingMap;
|
||||
|
||||
@ -130,13 +139,26 @@ public class AgentMonitor extends Thread implements Listener {
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
List<Long> behindAgents = findAgentsBehindOnPing();
|
||||
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) {
|
||||
long hostId = host.getId();
|
||||
DataCenterVO dcVO = _dcDao.findById(host.getDataCenterId());
|
||||
@ -148,7 +170,7 @@ public class AgentMonitor extends Thread implements Listener {
|
||||
List<VMInstanceVO> vosMigrating = _vmDao.listVmsMigratingFromHost(hostId);
|
||||
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");
|
||||
_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() +
|
||||
" is behind on ping. last ping time: " + host.getLastPinged());
|
||||
}
|
||||
_agentMgr.disconnect(host.getId(), Event.PingTimeout, true);
|
||||
_agentMgr.disconnectWithInvestigation(host.getId(), Event.PingTimeout);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -58,6 +58,7 @@ import com.cloud.configuration.Config;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.exception.AgentUnavailableException;
|
||||
import com.cloud.exception.OperationTimedoutException;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
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.concurrency.NamedThreadFactory;
|
||||
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.SearchCriteria.Op;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
import com.cloud.utils.nio.Link;
|
||||
import com.cloud.utils.nio.Task;
|
||||
@ -102,6 +106,9 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
||||
|
||||
@Inject(adapter = AgentLoadBalancerPlanner.class)
|
||||
protected Adapters<AgentLoadBalancerPlanner> _lbPlanners;
|
||||
|
||||
@Inject
|
||||
protected AgentManager _agentMgr;
|
||||
|
||||
protected ClusteredAgentManagerImpl() {
|
||||
super();
|
||||
@ -206,35 +213,6 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
||||
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) {
|
||||
s_logger.debug("create forwarding ClusteredAgentAttache for " + id);
|
||||
final AgentAttache attache = new ClusteredAgentAttache(this, id);
|
||||
@ -250,15 +228,14 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AgentAttache createAttache(long id, HostVO server, Link link) {
|
||||
s_logger.debug("create ClusteredAgentAttache for " + id);
|
||||
final AgentAttache attache = new ClusteredAgentAttache(this, id, link, server.getStatus() == Status.Maintenance || server.getStatus() == Status.ErrorInMaintenance
|
||||
|| server.getStatus() == Status.PrepareForMaintenance);
|
||||
protected AgentAttache createAttacheForConnect(HostVO host, Link link) {
|
||||
s_logger.debug("create ClusteredAgentAttache for " + host.getId());
|
||||
final AgentAttache attache = new ClusteredAgentAttache(this, host.getId(), link, host.isInMaintenanceStates());
|
||||
link.attach(attache);
|
||||
AgentAttache old = null;
|
||||
synchronized (_agents) {
|
||||
old = _agents.get(id);
|
||||
_agents.put(id, attache);
|
||||
old = _agents.get(host.getId());
|
||||
_agents.put(host.getId(), attache);
|
||||
}
|
||||
if (old != null) {
|
||||
old.disconnect(Status.Removed);
|
||||
@ -267,17 +244,16 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AgentAttache createAttache(long id, HostVO server, ServerResource resource) {
|
||||
protected AgentAttache createAttacheForDirectConnect(HostVO host, ServerResource resource) {
|
||||
if (resource instanceof DummySecondaryStorageResource) {
|
||||
return new DummyAttache(this, id, false);
|
||||
return new DummyAttache(this, host.getId(), false);
|
||||
}
|
||||
s_logger.debug("create ClusteredDirectAgentAttache for " + id);
|
||||
final DirectAgentAttache attache = new ClusteredDirectAgentAttache(this, id, _nodeId, resource, server.getStatus() == Status.Maintenance || server.getStatus() == Status.ErrorInMaintenance
|
||||
|| server.getStatus() == Status.PrepareForMaintenance, this);
|
||||
s_logger.debug("create ClusteredDirectAgentAttache for " + host.getId());
|
||||
final DirectAgentAttache attache = new ClusteredDirectAgentAttache(this, host.getId(), _nodeId, resource, host.isInMaintenanceStates(), this);
|
||||
AgentAttache old = null;
|
||||
synchronized (_agents) {
|
||||
old = _agents.get(id);
|
||||
_agents.put(id, attache);
|
||||
old = _agents.get(host.getId());
|
||||
_agents.put(host.getId(), attache);
|
||||
}
|
||||
if (old != null) {
|
||||
old.disconnect(Status.Removed);
|
||||
@ -286,23 +262,31 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean handleDisconnect(AgentAttache attache, Status.Event event, boolean investigate) {
|
||||
return handleDisconnect(attache, event, investigate, true);
|
||||
protected boolean handleDisconnectWithoutInvestigation(AgentAttache attache, Status.Event event) {
|
||||
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) {
|
||||
if (agent == null) {
|
||||
return true;
|
||||
boolean res;
|
||||
if (!investigate) {
|
||||
res = super.handleDisconnectWithoutInvestigation(agent, event);
|
||||
} else {
|
||||
res = super.handleDisconnectWithInvestigation(agent, event);
|
||||
}
|
||||
|
||||
if (super.handleDisconnect(agent, event, investigate)) {
|
||||
if (broadcast) {
|
||||
notifyNodesInCluster(agent);
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
if (res) {
|
||||
if (broadcast) {
|
||||
notifyNodesInCluster(agent);
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -323,65 +307,19 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean maintain(final long hostId) throws AgentUnavailableException {
|
||||
Boolean result = _clusterMgr.propagateAgentEvent(hostId, Event.MaintenanceRequested);
|
||||
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) {
|
||||
public boolean reconnect(final long hostId) {
|
||||
Boolean result;
|
||||
try {
|
||||
Boolean result = _clusterMgr.propagateAgentEvent(hostId, Event.Remove);
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
result = _clusterMgr.propagateAgentEvent(hostId, Event.ShutdownRequested);
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
} catch (AgentUnavailableException e) {
|
||||
return false;
|
||||
s_logger.debug("cannot propagate agent reconnect because agent is not available", e);
|
||||
return false;
|
||||
}
|
||||
|
||||
return super.deleteHost(hostId, isForced, forceDestroy, caller);
|
||||
}
|
||||
|
||||
@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);
|
||||
|
||||
return super.reconnect(hostId);
|
||||
}
|
||||
|
||||
public void notifyNodesInCluster(AgentAttache attache) {
|
||||
@ -775,7 +713,10 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
||||
public void startRebalanceAgents() {
|
||||
s_logger.debug("Management server " + _nodeId + " is asking other peers to rebalance their agents");
|
||||
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;
|
||||
|
||||
@ -1087,7 +1028,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
||||
|
||||
s_logger.debug("Updating host id=" + hostId + " with the status " + Status.Rebalancing);
|
||||
host.setManagementServerId(null);
|
||||
_hostDao.updateStatus(host, Event.StartAgentRebalance, _nodeId);
|
||||
_agentMgr.agentStatusTransitTo(host, Event.StartAgentRebalance, _nodeId);
|
||||
_hostTransferDao.startAgentTransfer(hostId);
|
||||
txn.commit();
|
||||
|
||||
|
||||
2
server/src/com/cloud/agent/manager/DirectAgentAttache.java
Normal file → Executable file
2
server/src/com/cloud/agent/manager/DirectAgentAttache.java
Normal file → Executable file
@ -143,7 +143,7 @@ public class DirectAgentAttache extends AgentAttache {
|
||||
PingCommand cmd = resource.getCurrentStatus(_id);
|
||||
if (cmd == null) {
|
||||
s_logger.warn("Unable to get current status on " + _id);
|
||||
_mgr.disconnect(DirectAgentAttache.this, Event.AgentDisconnected, true);
|
||||
_mgr.disconnectWithInvestigation(DirectAgentAttache.this, Event.AgentDisconnected);
|
||||
return;
|
||||
}
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
|
||||
@ -41,6 +41,7 @@ import com.cloud.host.dao.HostDetailsDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
|
||||
import com.cloud.offering.ServiceOffering;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.service.dao.ServiceOfferingDao;
|
||||
import com.cloud.storage.GuestOSCategoryVO;
|
||||
import com.cloud.storage.GuestOSVO;
|
||||
@ -77,7 +78,8 @@ public class FirstFitAllocator implements HostAllocator {
|
||||
@Inject GuestOSDao _guestOSDao = null;
|
||||
@Inject GuestOSCategoryDao _guestOSCategoryDao = null;
|
||||
@Inject HypervisorCapabilitiesDao _hypervisorCapabilitiesDao = null;
|
||||
@Inject VMInstanceDao _vmInstanceDao = null;
|
||||
@Inject VMInstanceDao _vmInstanceDao = null;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
float _factor = 1;
|
||||
protected String _allocationAlgorithm = "random";
|
||||
@Inject CapacityManager _capacityMgr;
|
||||
@ -115,7 +117,7 @@ public class FirstFitAllocator implements HostAllocator {
|
||||
|
||||
List<HostVO> clusterHosts = new ArrayList<HostVO>();
|
||||
if(hostTagOnOffering == null && hostTagOnTemplate == null){
|
||||
clusterHosts = _hostDao.listBy(type, clusterId, podId, dcId);
|
||||
clusterHosts = _resourceMgr.listAllUpAndEnabledHosts(type, clusterId, podId, dcId);
|
||||
}else{
|
||||
List<HostVO> hostsMatchingOfferingTag = new ArrayList<HostVO>();
|
||||
List<HostVO> hostsMatchingTemplateTag = new ArrayList<HostVO>();
|
||||
@ -193,14 +195,7 @@ public class FirstFitAllocator implements HostAllocator {
|
||||
}
|
||||
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.
|
||||
Long vmCount = _vmInstanceDao.countRunningByHostId(host.getId());
|
||||
Long maxGuestLimit = getHostMaxGuestLimit(host);
|
||||
|
||||
@ -34,6 +34,7 @@ import com.cloud.host.Host.Type;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.offering.ServiceOffering;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.uservm.UserVm;
|
||||
import com.cloud.utils.component.ComponentLocator;
|
||||
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 String _name;
|
||||
private HostDao _hostDao;
|
||||
private ResourceManager _resourceMgr;
|
||||
|
||||
@Override
|
||||
public List<Host> allocateTo(VirtualMachineProfile<? extends VirtualMachine> vmProfile, DeploymentPlan plan, Type type,
|
||||
@ -78,7 +80,7 @@ public class RandomAllocator implements HostAllocator {
|
||||
if(hostTag != null){
|
||||
hosts = _hostDao.listByHostTag(type, clusterId, podId, dcId, hostTag);
|
||||
}else{
|
||||
hosts = _hostDao.listBy(type, clusterId, podId, dcId);
|
||||
hosts = _resourceMgr.listAllUpAndEnabledHosts(type, clusterId, podId, dcId);
|
||||
}
|
||||
|
||||
s_logger.debug("Random Allocator found " + hosts.size() + " hosts");
|
||||
@ -94,13 +96,6 @@ public class RandomAllocator implements HostAllocator {
|
||||
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)) {
|
||||
suitableHosts.add(host);
|
||||
}else{
|
||||
@ -126,6 +121,7 @@ public class RandomAllocator implements HostAllocator {
|
||||
public boolean configure(String name, Map<String, Object> params) {
|
||||
ComponentLocator locator = ComponentLocator.getCurrentLocator();
|
||||
_hostDao = locator.getDao(HostDao.class);
|
||||
_resourceMgr = locator.getManager(ResourceManager.class);
|
||||
if (_hostDao == null) {
|
||||
s_logger.error("Unable to get host dao.");
|
||||
return false;
|
||||
|
||||
@ -590,7 +590,7 @@ public class ApiResponseHelper implements ResponseGenerator {
|
||||
hostResponse.setEvents(events);
|
||||
}
|
||||
|
||||
hostResponse.setAllocationState(host.getHostAllocationState().toString());
|
||||
hostResponse.setAllocationState(host.getResourceState().toString());
|
||||
|
||||
hostResponse.setObjectName("host");
|
||||
|
||||
|
||||
@ -27,14 +27,17 @@ import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.ejb.Local;
|
||||
import javax.naming.ConfigurationException;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.dc.ClusterVO;
|
||||
import com.cloud.dc.DataCenterVO;
|
||||
import com.cloud.dc.dao.ClusterDao;
|
||||
import com.cloud.dc.dao.DataCenterDao;
|
||||
import com.cloud.exception.DiscoveryException;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor;
|
||||
@ -42,18 +45,38 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.resource.Discoverer;
|
||||
import com.cloud.resource.DiscovererBase;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.resource.ResourceStateAdapter;
|
||||
import com.cloud.resource.ServerResource;
|
||||
import com.cloud.resource.UnableDeleteHostException;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
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)
|
||||
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);
|
||||
@Inject ClusterDao _clusterDao;
|
||||
@Inject protected HostDao _hostDao;
|
||||
@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
|
||||
public Map<? extends ServerResource, Map<String, String>> find(long dcId, Long podId, Long clusterId, URI url, String username, String password, List<String> hostTags)
|
||||
throws DiscoveryException {
|
||||
@ -179,4 +202,34 @@ public class BareMetalDiscoverer extends DiscovererBase implements Discoverer {
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
7
server/src/com/cloud/baremetal/BareMetalPingServiceImpl.java
Normal file → Executable file
7
server/src/com/cloud/baremetal/BareMetalPingServiceImpl.java
Normal file → Executable file
@ -39,8 +39,10 @@ import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.exception.InvalidParameterValueException;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.resource.ServerResource;
|
||||
import com.cloud.uservm.UserVm;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
import com.cloud.vm.NicProfile;
|
||||
import com.cloud.vm.NicVO;
|
||||
@ -51,6 +53,7 @@ import com.cloud.vm.VirtualMachineProfile;
|
||||
@Local(value=PxeServerService.class)
|
||||
public class BareMetalPingServiceImpl extends BareMetalPxeServiceBase implements PxeServerService {
|
||||
private static final Logger s_logger = Logger.getLogger(BareMetalPingServiceImpl.class);
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
@Override
|
||||
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);
|
||||
}
|
||||
|
||||
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) {
|
||||
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());
|
||||
}
|
||||
|
||||
Host pxeServer = _agentMgr.addHost(zoneId, resource, Host.Type.PxeServer, params);
|
||||
Host pxeServer = _resourceMgr.addHost(zoneId, resource, Host.Type.PxeServer, params);
|
||||
if (pxeServer == null) {
|
||||
throw new CloudRuntimeException("Cannot add PXE server as a host");
|
||||
}
|
||||
|
||||
10
server/src/com/cloud/baremetal/BareMetalTemplateAdapter.java
Normal file → Executable file
10
server/src/com/cloud/baremetal/BareMetalTemplateAdapter.java
Normal file → Executable file
@ -18,6 +18,7 @@ import com.cloud.exception.ResourceAllocationException;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.storage.VMTemplateHostVO;
|
||||
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
||||
import com.cloud.storage.VMTemplateVO;
|
||||
@ -34,6 +35,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
|
||||
public class BareMetalTemplateAdapter extends TemplateAdapterBase implements TemplateAdapter {
|
||||
private final static Logger s_logger = Logger.getLogger(BareMetalTemplateAdapter.class);
|
||||
@Inject HostDao _hostDao;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
@Override
|
||||
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) {
|
||||
List<DataCenterVO> dcs = _dcDao.listAllIncludingRemoved();
|
||||
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) {
|
||||
throw new CloudRuntimeException("Please add PXE server before adding baremetal template in zone " + dc.getName());
|
||||
}
|
||||
}
|
||||
} 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) {
|
||||
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) {
|
||||
List<DataCenterVO> dcs = _dcDao.listAllIncludingRemoved();
|
||||
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());
|
||||
if (vmTemplateHost == null) {
|
||||
@ -97,7 +99,7 @@ public class BareMetalTemplateAdapter extends TemplateAdapterBase implements Tem
|
||||
}
|
||||
}
|
||||
} 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,
|
||||
Status.DOWNLOADED, null, null, null, null, template.getUrl());
|
||||
_tmpltHostDao.persist(vmTemplateHost);
|
||||
|
||||
@ -64,6 +64,7 @@ import com.cloud.network.Network;
|
||||
import com.cloud.network.NetworkVO;
|
||||
import com.cloud.network.Networks.TrafficType;
|
||||
import com.cloud.org.Grouping;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.service.ServiceOfferingVO;
|
||||
import com.cloud.storage.Storage;
|
||||
import com.cloud.storage.Storage.TemplateType;
|
||||
@ -108,7 +109,8 @@ public class BareMetalVmManagerImpl extends UserVmManagerImpl implements BareMet
|
||||
StateListener<State, VirtualMachine.Event, VirtualMachine> {
|
||||
private static final Logger s_logger = Logger.getLogger(BareMetalVmManagerImpl.class);
|
||||
private ConfigurationDao _configDao;
|
||||
@Inject PxeServerManager _pxeMgr;
|
||||
@Inject PxeServerManager _pxeMgr;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
@Inject (adapter=TemplateAdapter.class)
|
||||
protected Adapters<TemplateAdapter> _adapters;
|
||||
@ -161,7 +163,7 @@ public class BareMetalVmManagerImpl extends UserVmManagerImpl implements BareMet
|
||||
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) {
|
||||
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();
|
||||
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) {
|
||||
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");
|
||||
|
||||
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) {
|
||||
throw new CloudRuntimeException("Cannot find PXE server, please make sure there is one PXE server per zone");
|
||||
}
|
||||
|
||||
@ -39,6 +39,7 @@ import com.cloud.agent.api.AgentControlCommand;
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.agent.api.StartupExternalDhcpCommand;
|
||||
import com.cloud.agent.api.routing.DhcpEntryCommand;
|
||||
import com.cloud.agent.manager.Commands;
|
||||
import com.cloud.baremetal.ExternalDhcpEntryListener.DhcpEntryState;
|
||||
@ -59,7 +60,10 @@ import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.resource.ResourceStateAdapter;
|
||||
import com.cloud.resource.ServerResource;
|
||||
import com.cloud.resource.UnableDeleteHostException;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.concurrency.NamedThreadFactory;
|
||||
import com.cloud.utils.db.DB;
|
||||
@ -73,7 +77,7 @@ import com.cloud.vm.VirtualMachineProfile;
|
||||
import com.cloud.vm.dao.UserVmDao;
|
||||
|
||||
@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);
|
||||
protected String _name;
|
||||
@Inject DataCenterDao _dcDao;
|
||||
@ -81,9 +85,11 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
|
||||
@Inject AgentManager _agentMgr;
|
||||
@Inject HostPodDao _podDao;
|
||||
@Inject UserVmDao _userVmDao;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -94,6 +100,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
|
||||
|
||||
@Override
|
||||
public boolean stop() {
|
||||
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -119,7 +126,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
|
||||
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) {
|
||||
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());
|
||||
}
|
||||
|
||||
Host dhcpServer = _agentMgr.addHost(zoneId, resource, Host.Type.ExternalDhcp, params);
|
||||
Host dhcpServer = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalDhcp, params);
|
||||
if (dhcpServer == null) {
|
||||
throw new CloudRuntimeException("Cannot add external Dhcp server as a host");
|
||||
}
|
||||
@ -187,7 +194,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
|
||||
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) {
|
||||
throw new CloudRuntimeException("Wrong number of PXE server found in zone " + vm.getDataCenterIdToDeployIn()
|
||||
+ " Pod " + vm.getPodIdToDeployIn() + ", number is " + servers.size());
|
||||
@ -202,7 +209,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager {
|
||||
ReservationContext context) throws ResourceUnavailableException {
|
||||
Long zoneId = profile.getVirtualMachine().getDataCenterIdToDeployIn();
|
||||
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) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
}
|
||||
|
||||
36
server/src/com/cloud/baremetal/PxeServerManagerImpl.java
Normal file → Executable file
36
server/src/com/cloud/baremetal/PxeServerManagerImpl.java
Normal file → Executable file
@ -20,6 +20,7 @@
|
||||
package com.cloud.baremetal;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.ejb.Local;
|
||||
@ -27,12 +28,18 @@ import javax.naming.ConfigurationException;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
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.dc.dao.DataCenterDao;
|
||||
import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
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.utils.component.Adapters;
|
||||
import com.cloud.utils.component.Inject;
|
||||
@ -43,20 +50,21 @@ import com.cloud.vm.VirtualMachineProfile;
|
||||
import com.cloud.vm.VirtualMachineProfile.Param;
|
||||
|
||||
@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);
|
||||
protected String _name;
|
||||
@Inject DataCenterDao _dcDao;
|
||||
@Inject HostDao _hostDao;
|
||||
@Inject AgentManager _agentMgr;
|
||||
@Inject ExternalDhcpManager exDhcpMgr;
|
||||
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
@Inject(adapter=PxeServerService.class)
|
||||
protected Adapters<PxeServerService> _services;
|
||||
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||
_name = name;
|
||||
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -67,6 +75,7 @@ public class PxeServerManagerImpl implements PxeServerManager {
|
||||
|
||||
@Override
|
||||
public boolean stop() {
|
||||
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -115,4 +124,27 @@ public class PxeServerManagerImpl implements PxeServerManager {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -44,6 +44,7 @@ import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.offering.ServiceOffering;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.service.ServiceOfferingVO;
|
||||
import com.cloud.service.dao.ServiceOfferingDao;
|
||||
import com.cloud.utils.DateUtil;
|
||||
@ -77,6 +78,8 @@ public class CapacityManagerImpl implements CapacityManager, StateListener<State
|
||||
VMInstanceDao _vmDao;
|
||||
@Inject
|
||||
AgentManager _agentManager;
|
||||
@Inject
|
||||
ResourceManager _resourceMgr;
|
||||
|
||||
private int _vmCapacityReleaseInterval;
|
||||
private ScheduledExecutorService _executor;
|
||||
|
||||
5
server/src/com/cloud/cluster/ClusterManager.java
Normal file → Executable file
5
server/src/com/cloud/cluster/ClusterManager.java
Normal file → Executable file
@ -24,6 +24,7 @@ import com.cloud.agent.api.Command;
|
||||
import com.cloud.exception.AgentUnavailableException;
|
||||
import com.cloud.exception.OperationTimedoutException;
|
||||
import com.cloud.host.Status.Event;
|
||||
import com.cloud.resource.ResourceState;
|
||||
import com.cloud.utils.component.Manager;
|
||||
|
||||
public interface ClusterManager extends Manager {
|
||||
@ -39,7 +40,9 @@ public interface ClusterManager extends Manager {
|
||||
public Answer[] sendToAgent(Long hostId, Command [] cmds, boolean stopOnError) throws AgentUnavailableException, OperationTimedoutException;
|
||||
public long sendToAgent(Long hostId, Command[] cmds, boolean stopOnError, Listener listener) 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();
|
||||
|
||||
|
||||
49
server/src/com/cloud/cluster/ClusterManagerImpl.java
Normal file → Executable file
49
server/src/com/cloud/cluster/ClusterManagerImpl.java
Normal file → Executable file
@ -49,6 +49,7 @@ import com.cloud.agent.Listener;
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.ChangeAgentCommand;
|
||||
import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.PropagateResourceEventCommand;
|
||||
import com.cloud.agent.manager.Commands;
|
||||
import com.cloud.cluster.agentlb.dao.HostTransferMapDao;
|
||||
import com.cloud.cluster.dao.ManagementServerHostDao;
|
||||
@ -56,9 +57,12 @@ import com.cloud.configuration.Config;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.exception.AgentUnavailableException;
|
||||
import com.cloud.exception.OperationTimedoutException;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status.Event;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.resource.ResourceState;
|
||||
import com.cloud.serializer.GsonHelper;
|
||||
import com.cloud.utils.DateUtil;
|
||||
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.db.ConnectionConcierge;
|
||||
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.events.SubscriptionMgr;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
@ -99,6 +106,8 @@ public class ClusterManagerImpl implements ClusterManager {
|
||||
private AgentManager _agentMgr;
|
||||
@Inject
|
||||
private ClusteredAgentRebalanceService _rebalanceService;
|
||||
@Inject
|
||||
private ResourceManager _resourceMgr;
|
||||
|
||||
private final ScheduledExecutorService _heartbeatScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Cluster-Heartbeat"));
|
||||
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
|
||||
if (_agentLBEnabled && !_agentLbHappened) {
|
||||
List<HostVO> allManagedRoutingAgents = _hostDao.listManagedRoutingAgents();
|
||||
List<HostVO> allAgents = _hostDao.listAllRoutingAgents();
|
||||
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> 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 managedHostsCount = allManagedRoutingAgents.size();
|
||||
if (allHostsCount > 0.0) {
|
||||
@ -1229,4 +1244,34 @@ public class ClusterManagerImpl implements ClusterManager {
|
||||
public boolean isAgentRebalanceEnabled() {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
24
server/src/com/cloud/cluster/ClusterServiceServletHttpHandler.java
Normal file → Executable file
24
server/src/com/cloud/cluster/ClusterServiceServletHttpHandler.java
Normal file → Executable file
@ -38,6 +38,7 @@ import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.ChangeAgentAnswer;
|
||||
import com.cloud.agent.api.ChangeAgentCommand;
|
||||
import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.PropagateResourceEventCommand;
|
||||
import com.cloud.agent.api.TransferAgentCommand;
|
||||
import com.cloud.exception.AgentUnavailableException;
|
||||
import com.cloud.exception.OperationTimedoutException;
|
||||
@ -240,7 +241,28 @@ public class ClusterServiceServletHttpHandler implements HttpRequestHandler {
|
||||
Answer[] answers = new Answer[1];
|
||||
answers[0] = new Answer(cmd, result, null);
|
||||
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 {
|
||||
long startTick = System.currentTimeMillis();
|
||||
|
||||
12
server/src/com/cloud/cluster/DummyClusterManagerImpl.java
Normal file → Executable file
12
server/src/com/cloud/cluster/DummyClusterManagerImpl.java
Normal file → Executable file
@ -174,5 +174,17 @@ public class DummyClusterManagerImpl implements ClusterManager {
|
||||
@Override
|
||||
public boolean isAgentRebalanceEnabled() {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
15
server/src/com/cloud/cluster/agentlb/ClusterBasedAgentLoadBalancerPlanner.java
Normal file → Executable file
15
server/src/com/cloud/cluster/agentlb/ClusterBasedAgentLoadBalancerPlanner.java
Normal file → Executable file
@ -30,10 +30,14 @@ import javax.naming.ConfigurationException;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
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)
|
||||
@ -66,14 +70,21 @@ public class ClusterBasedAgentLoadBalancerPlanner implements AgentLoadBalancerPl
|
||||
|
||||
@Override
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
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()) {
|
||||
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;
|
||||
|
||||
0
server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java
Normal file → Executable file
0
server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java
Normal file → Executable file
2
server/src/com/cloud/consoleproxy/ConsoleProxyManager.java
Normal file → Executable file
2
server/src/com/cloud/consoleproxy/ConsoleProxyManager.java
Normal file → Executable file
@ -24,6 +24,7 @@ import com.cloud.agent.api.ConsoleProxyLoadReportCommand;
|
||||
import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.Host.Type;
|
||||
import com.cloud.info.ConsoleProxyInfo;
|
||||
import com.cloud.utils.component.Manager;
|
||||
import com.cloud.vm.ConsoleProxyVO;
|
||||
@ -58,5 +59,4 @@ public interface ConsoleProxyManager extends Manager {
|
||||
|
||||
public void onAgentConnect(HostVO host, StartupCommand cmd);
|
||||
public void onAgentDisconnect(long agentId, Status state);
|
||||
|
||||
}
|
||||
|
||||
46
server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
Normal file → Executable file
46
server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
Normal file → Executable file
@ -70,6 +70,7 @@ import com.cloud.exception.OperationTimedoutException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.exception.StorageUnavailableException;
|
||||
import com.cloud.host.Host.Type;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
@ -88,6 +89,10 @@ import com.cloud.network.NetworkVO;
|
||||
import com.cloud.network.Networks.TrafficType;
|
||||
import com.cloud.offerings.NetworkOfferingVO;
|
||||
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.dao.ServiceOfferingDao;
|
||||
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.db.DB;
|
||||
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.SearchCriteria.Op;
|
||||
import com.cloud.utils.events.SubscriptionMgr;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
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
|
||||
//
|
||||
@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 int DEFAULT_CAPACITY_SCAN_INTERVAL = 30000; // 30 seconds
|
||||
@ -199,6 +207,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
|
||||
StoragePoolDao _storagePoolDao;
|
||||
@Inject
|
||||
UserVmDetailsDao _vmDetailsDao;
|
||||
@Inject
|
||||
ResourceManager _resourceMgr;
|
||||
|
||||
private ConsoleProxyListener _listener;
|
||||
|
||||
@ -1000,6 +1010,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
|
||||
|
||||
this._loadScanner.stop();
|
||||
_allocProxyLock.releaseRef();
|
||||
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1267,6 +1278,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
|
||||
|
||||
_loadScanner = new SystemVmLoadScanner<Long>(this);
|
||||
_loadScanner.initScan(STARTUP_DELAY, _capacityScanInterval);
|
||||
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
|
||||
|
||||
if (s_logger.isInfoEnabled()) {
|
||||
s_logger.info("Console Proxy Manager is configured.");
|
||||
@ -1459,7 +1471,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
|
||||
long proxyVmId = startupCmd.getProxyVmId();
|
||||
ConsoleProxyVO consoleProxy = _consoleProxyDao.findById(proxyVmId);
|
||||
assert (consoleProxy != null);
|
||||
HostVO consoleProxyHost = _hostDao.findConsoleProxyHost(consoleProxy.getHostName(), Type.ConsoleProxy);
|
||||
HostVO consoleProxyHost = findConsoleProxyHostByName(consoleProxy.getHostName());
|
||||
|
||||
Answer answer = _agentMgr.send(consoleProxyHost.getId(), cmd);
|
||||
if (answer == null || !answer.getResult()) {
|
||||
@ -1657,4 +1669,34 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
|
||||
@Override
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
4
server/src/com/cloud/consoleproxy/StaticConsoleProxyManager.java
Normal file → Executable file
4
server/src/com/cloud/consoleproxy/StaticConsoleProxyManager.java
Normal file → Executable file
@ -27,6 +27,7 @@ import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.host.Host.Type;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.info.ConsoleProxyInfo;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.utils.component.ComponentLocator;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.vm.VMInstanceVO;
|
||||
@ -36,11 +37,12 @@ import com.cloud.vm.dao.ConsoleProxyDao;
|
||||
public class StaticConsoleProxyManager extends AgentBasedConsoleProxyManager implements ConsoleProxyManager {
|
||||
String _ip = null;
|
||||
@Inject ConsoleProxyDao _proxyDao;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
@Override
|
||||
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);
|
||||
}
|
||||
|
||||
4
server/src/com/cloud/deploy/BareMetalPlanner.java
Normal file → Executable file
4
server/src/com/cloud/deploy/BareMetalPlanner.java
Normal file → Executable file
@ -42,6 +42,7 @@ import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.offering.ServiceOffering;
|
||||
import com.cloud.org.Cluster;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
@ -57,6 +58,7 @@ public class BareMetalPlanner implements DeploymentPlanner {
|
||||
@Inject protected HostDao _hostDao;
|
||||
@Inject protected ConfigurationDao _configDao;
|
||||
@Inject protected CapacityManager _capacityMgr;
|
||||
@Inject protected ResourceManager _resourceMgr;
|
||||
String _name;
|
||||
|
||||
@Override
|
||||
@ -94,7 +96,7 @@ public class BareMetalPlanner implements DeploymentPlanner {
|
||||
int cpu_requested;
|
||||
long ram_requested;
|
||||
HostVO target = null;
|
||||
List<HostVO> hosts = _hostDao.listByCluster(cluster.getId());
|
||||
List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cluster.getId());
|
||||
if (hostTag != null) {
|
||||
for (HostVO h : hosts) {
|
||||
_hostDao.loadDetails(h);
|
||||
|
||||
@ -53,6 +53,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.offering.ServiceOffering;
|
||||
import com.cloud.org.Cluster;
|
||||
import com.cloud.org.Grouping;
|
||||
import com.cloud.resource.ResourceState;
|
||||
import com.cloud.storage.DiskOfferingVO;
|
||||
import com.cloud.storage.StoragePool;
|
||||
import com.cloud.storage.StoragePoolHostVO;
|
||||
@ -177,7 +178,7 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
|
||||
if(host == null){
|
||||
s_logger.debug("The last host of this VM cannot be found");
|
||||
}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)){
|
||||
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());
|
||||
@ -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");
|
||||
}
|
||||
}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
13
server/src/com/cloud/ha/AbstractInvestigatorImpl.java
Normal file → Executable file
@ -33,9 +33,14 @@ import com.cloud.agent.api.PingTestCommand;
|
||||
import com.cloud.exception.AgentUnavailableException;
|
||||
import com.cloud.exception.OperationTimedoutException;
|
||||
import com.cloud.host.Host.Type;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
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 {
|
||||
private static final Logger s_logger = Logger.getLogger(AbstractInvestigatorImpl.class);
|
||||
@ -43,6 +48,7 @@ public abstract class AbstractInvestigatorImpl implements Investigator {
|
||||
private String _name = null;
|
||||
@Inject private HostDao _hostDao = null;
|
||||
@Inject private AgentManager _agentMgr = null;
|
||||
@Inject private ResourceManager _resourceMgr = null;
|
||||
|
||||
|
||||
@Override
|
||||
@ -69,7 +75,12 @@ public abstract class AbstractInvestigatorImpl implements Investigator {
|
||||
|
||||
// Host.status is up and Host.type is routing
|
||||
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){
|
||||
hostIds.remove(excludeHostId);
|
||||
}
|
||||
|
||||
9
server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
Normal file → Executable file
9
server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
Normal file → Executable file
@ -57,6 +57,7 @@ import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.server.ManagementServer;
|
||||
import com.cloud.storage.StorageManager;
|
||||
import com.cloud.storage.dao.GuestOSCategoryDao;
|
||||
@ -135,6 +136,8 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager, Clu
|
||||
VirtualMachineManager _itMgr;
|
||||
@Inject
|
||||
AccountManager _accountMgr;
|
||||
@Inject
|
||||
ResourceManager _resourceMgr;
|
||||
|
||||
String _instance;
|
||||
ScheduledExecutorService _executor;
|
||||
@ -548,16 +551,16 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager, Clu
|
||||
|
||||
if (!_itMgr.migrateAway(work.getType(), vmId, srcHostId)) {
|
||||
s_logger.warn("Unable to migrate vm from " + srcHostId);
|
||||
_agentMgr.maintenanceFailed(srcHostId);
|
||||
_resourceMgr.maintenanceFailed(srcHostId);
|
||||
}
|
||||
return null;
|
||||
} catch (InsufficientServerCapacityException e) {
|
||||
s_logger.warn("Insufficient capacity for migrating a VM.");
|
||||
_agentMgr.maintenanceFailed(srcHostId);
|
||||
_resourceMgr.maintenanceFailed(srcHostId);
|
||||
return (System.currentTimeMillis() >> 10) + _migrateRetryInterval;
|
||||
} catch (VirtualMachineMigrationException e) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
4
server/src/com/cloud/ha/KVMFencer.java
Normal file → Executable file
4
server/src/com/cloud/ha/KVMFencer.java
Normal file → Executable file
@ -36,6 +36,7 @@ import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.vm.VMInstanceVO;
|
||||
|
||||
@ -46,6 +47,7 @@ public class KVMFencer implements FenceBuilder {
|
||||
|
||||
@Inject HostDao _hostDao;
|
||||
@Inject AgentManager _agentMgr;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params)
|
||||
throws ConfigurationException {
|
||||
@ -82,7 +84,7 @@ public class KVMFencer implements FenceBuilder {
|
||||
return null;
|
||||
}
|
||||
|
||||
List<HostVO> hosts = _hostDao.listByCluster(host.getClusterId());
|
||||
List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(host.getClusterId());
|
||||
FenceCommand fence = new FenceCommand(vm, host);
|
||||
|
||||
for (HostVO h : hosts) {
|
||||
|
||||
4
server/src/com/cloud/ha/XenServerFencer.java
Normal file → Executable file
4
server/src/com/cloud/ha/XenServerFencer.java
Normal file → Executable file
@ -35,6 +35,7 @@ import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.vm.VMInstanceVO;
|
||||
|
||||
@ -45,6 +46,7 @@ public class XenServerFencer implements FenceBuilder {
|
||||
|
||||
@Inject HostDao _hostDao;
|
||||
@Inject AgentManager _agentMgr;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
@Override
|
||||
public Boolean fenceOff(VMInstanceVO vm, HostVO host) {
|
||||
@ -53,7 +55,7 @@ public class XenServerFencer implements FenceBuilder {
|
||||
return null;
|
||||
}
|
||||
|
||||
List<HostVO> hosts = _hostDao.listByCluster(host.getClusterId());
|
||||
List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(host.getClusterId());
|
||||
FenceCommand fence = new FenceCommand(vm, host);
|
||||
|
||||
for (HostVO h : hosts) {
|
||||
|
||||
4
server/src/com/cloud/ha/XenServerInvestigator.java
Normal file → Executable file
4
server/src/com/cloud/ha/XenServerInvestigator.java
Normal file → Executable file
@ -31,6 +31,7 @@ import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.utils.component.AdapterBase;
|
||||
import com.cloud.utils.component.Inject;
|
||||
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);
|
||||
@Inject HostDao _hostDao;
|
||||
@Inject AgentManager _agentMgr;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
protected XenServerInvestigator() {
|
||||
}
|
||||
@ -51,7 +53,7 @@ public class XenServerInvestigator extends AdapterBase implements Investigator {
|
||||
}
|
||||
|
||||
CheckOnHostCommand cmd = new CheckOnHostCommand(agent);
|
||||
List<HostVO> neighbors = _hostDao.listByCluster(agent.getClusterId());
|
||||
List<HostVO> neighbors = _resourceMgr.listAllHostsInCluster(agent.getClusterId());
|
||||
for (HostVO neighbor : neighbors) {
|
||||
if (neighbor.getId() == agent.getId() || neighbor.getHypervisorType() != HypervisorType.XenServer) {
|
||||
continue;
|
||||
|
||||
@ -27,29 +27,16 @@ import com.cloud.host.Status;
|
||||
import com.cloud.host.Status.Event;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.info.RunningHostCountInfo;
|
||||
import com.cloud.resource.ResourceState;
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
import com.cloud.utils.fsm.StateDao;
|
||||
|
||||
/**
|
||||
* Data Access Object for server
|
||||
*
|
||||
*/
|
||||
public interface HostDao extends GenericDao<HostVO, Long> {
|
||||
List<HostVO> listBy(Host.Type type, Long clusterId, Long podId, long dcId);
|
||||
|
||||
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();
|
||||
public interface HostDao extends GenericDao<HostVO, Long>, StateDao<Status, Status.Event, Host> {
|
||||
long countBy(long clusterId, ResourceState... states);
|
||||
|
||||
/**
|
||||
* 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> findHostsLike(String hostName);
|
||||
|
||||
/**
|
||||
* Find hosts that are directly connected.
|
||||
*/
|
||||
List<HostVO> findDirectlyConnectedHosts();
|
||||
|
||||
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<HostVO> findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId);
|
||||
|
||||
List<RunningHostCountInfo> getRunningHostCounts(Date cutTime);
|
||||
|
||||
@ -127,56 +58,13 @@ public interface HostDao extends GenericDao<HostVO, Long> {
|
||||
|
||||
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);
|
||||
|
||||
List<HostVO> listByHostTag(Host.Type type, Long clusterId, Long podId, long dcId, String hostTag);
|
||||
|
||||
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> listByInAllStatus(Type type, Long clusterId, Long podId, long dcId);
|
||||
|
||||
List<HostVO> listByClusterStatus(long clusterId, Status status);
|
||||
boolean updateResourceState(ResourceState oldState, ResourceState.Event event, ResourceState newState, Host vo);
|
||||
}
|
||||
|
||||
@ -45,6 +45,7 @@ import com.cloud.host.Status.Event;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.info.RunningHostCountInfo;
|
||||
import com.cloud.org.Managed;
|
||||
import com.cloud.resource.ResourceState;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import com.cloud.utils.component.ComponentLocator;
|
||||
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)
|
||||
public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao {
|
||||
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;
|
||||
|
||||
@ -82,6 +85,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
|
||||
protected final SearchBuilder<HostVO> PodSearch;
|
||||
protected final SearchBuilder<HostVO> TypeSearch;
|
||||
protected final SearchBuilder<HostVO> StatusSearch;
|
||||
protected final SearchBuilder<HostVO> ResourceStateSearch;
|
||||
protected final SearchBuilder<HostVO> NameLikeSearch;
|
||||
protected final SearchBuilder<HostVO> NameSearch;
|
||||
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 Attribute _statusAttr;
|
||||
protected final Attribute _resourceStateAttr;
|
||||
protected final Attribute _msIdAttr;
|
||||
protected final Attribute _pingTimeAttr;
|
||||
|
||||
@ -119,7 +124,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
|
||||
|
||||
MaintenanceCountSearch = createSearchBuilder();
|
||||
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();
|
||||
|
||||
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("cluster", entity.getClusterId(), SearchCriteria.Op.EQ);
|
||||
TypePodDcStatusSearch.and("status", entity.getStatus(), SearchCriteria.Op.EQ);
|
||||
TypePodDcStatusSearch.and("resourceState", entity.getResourceState(), SearchCriteria.Op.EQ);
|
||||
TypePodDcStatusSearch.done();
|
||||
|
||||
MsStatusSearch = createSearchBuilder();
|
||||
MsStatusSearch.and("ms", MsStatusSearch.entity().getManagementServerId(), 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();
|
||||
|
||||
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("dc", TypeDcStatusSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
|
||||
TypeDcStatusSearch.and("status", TypeDcStatusSearch.entity().getStatus(), SearchCriteria.Op.EQ);
|
||||
TypeDcStatusSearch.and("resourceState", TypeDcStatusSearch.entity().getResourceState(), SearchCriteria.Op.EQ);
|
||||
TypeDcStatusSearch.done();
|
||||
|
||||
IdStatusSearch = createSearchBuilder();
|
||||
@ -198,6 +205,10 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
|
||||
StatusSearch = createSearchBuilder();
|
||||
StatusSearch.and("status", StatusSearch.entity().getStatus(), SearchCriteria.Op.IN);
|
||||
StatusSearch.done();
|
||||
|
||||
ResourceStateSearch = createSearchBuilder();
|
||||
ResourceStateSearch.and("resourceState", ResourceStateSearch.entity().getResourceState(), SearchCriteria.Op.IN);
|
||||
ResourceStateSearch.done();
|
||||
|
||||
NameLikeSearch = createSearchBuilder();
|
||||
NameLikeSearch.and("name", NameLikeSearch.entity().getName(), SearchCriteria.Op.LIKE);
|
||||
@ -216,13 +227,14 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
|
||||
DirectlyConnectedSearch.and("resource", DirectlyConnectedSearch.entity().getResource(), SearchCriteria.Op.NNULL);
|
||||
DirectlyConnectedSearch.and("ms", DirectlyConnectedSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ);
|
||||
DirectlyConnectedSearch.and("statuses", DirectlyConnectedSearch.entity().getStatus(), SearchCriteria.Op.EQ);
|
||||
DirectlyConnectedSearch.and("resourceState", DirectlyConnectedSearch.entity().getResourceState(), SearchCriteria.Op.NOTIN);
|
||||
DirectlyConnectedSearch.done();
|
||||
|
||||
UnmanagedDirectConnectSearch = createSearchBuilder();
|
||||
UnmanagedDirectConnectSearch.and("resource", UnmanagedDirectConnectSearch.entity().getResource(), SearchCriteria.Op.NNULL);
|
||||
UnmanagedDirectConnectSearch.and("server", UnmanagedDirectConnectSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL);
|
||||
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.entity().getManagementServerId(), SearchCriteria.Op.EQ);
|
||||
@ -238,7 +250,6 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
|
||||
UnmanagedDirectConnectSearch.done();
|
||||
|
||||
|
||||
|
||||
DirectConnectSearch = createSearchBuilder();
|
||||
DirectConnectSearch.and("resource", DirectConnectSearch.entity().getResource(), SearchCriteria.Op.NNULL);
|
||||
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");
|
||||
_msIdAttr = _allAttributes.get("managementServerId");
|
||||
_pingTimeAttr = _allAttributes.get("lastPinged");
|
||||
_resourceStateAttr = _allAttributes.get("resourceState");
|
||||
|
||||
assert (_statusAttr != null && _msIdAttr != null && _pingTimeAttr != null) : "Couldn't find one of these attributes";
|
||||
}
|
||||
|
||||
@Override
|
||||
public long countBy(long clusterId, Status... statuses) {
|
||||
public long countBy(long clusterId, ResourceState... states) {
|
||||
SearchCriteria<HostVO> sc = MaintenanceCountSearch.create();
|
||||
|
||||
sc.setParameters("status", (Object[]) statuses);
|
||||
sc.setParameters("resourceState", (Object[]) states);
|
||||
sc.setParameters("cluster", clusterId);
|
||||
|
||||
List<HostVO> hosts = listBy(sc);
|
||||
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
|
||||
public List<HostVO> findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId) {
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
txn.start();
|
||||
SearchCriteria<HostVO> sc = UnmanagedDirectConnectSearch.create();
|
||||
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);
|
||||
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) {
|
||||
SearchCriteria<HostVO> sc = MsStatusSearch.create();
|
||||
sc.setParameters("ms", msId);
|
||||
sc.setParameters("statuses", Status.ErrorInMaintenance, Status.Maintenance, Status.PrepareForMaintenance);
|
||||
|
||||
HostVO host = createForUpdate();
|
||||
host.setLastPinged(lastPing);
|
||||
@ -434,55 +385,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
|
||||
ub = getUpdateBuilder(host);
|
||||
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
|
||||
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("cluster", entity.getClusterId(), 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);
|
||||
|
||||
SearchCriteria<HostVO> sc = hostSearch.create();
|
||||
@ -510,68 +414,11 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
|
||||
}
|
||||
sc.setParameters("dc", dcId);
|
||||
sc.setParameters("status", Status.Up.toString());
|
||||
|
||||
return listBy(sc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<HostVO> listByCluster(long clusterId) {
|
||||
SearchCriteria<HostVO> sc = ClusterStatusSearch.create();
|
||||
|
||||
sc.setParameters("cluster", clusterId);
|
||||
sc.setParameters("resourceState", ResourceState.Enabled.toString());
|
||||
|
||||
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
|
||||
public void loadDetails(HostVO host) {
|
||||
Map<String, String> details = _detailsDao.findDetails(host.getId());
|
||||
@ -584,132 +431,6 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
|
||||
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
|
||||
@Override
|
||||
public List<HostVO> findLostHosts(long timeout) {
|
||||
@ -741,75 +462,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
|
||||
}
|
||||
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
|
||||
public void saveDetails(HostVO host) {
|
||||
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);
|
||||
}
|
||||
|
||||
@Override
|
||||
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);
|
||||
}
|
||||
|
||||
/*TODO: this is used by mycloud, check if it needs resource state Enabled */
|
||||
@Override
|
||||
public long countRoutingHostsByDataCenter(long dcId) {
|
||||
SearchCriteria<Long> sc = CountRoutingByDc.create();
|
||||
@ -971,57 +583,122 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
|
||||
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) {
|
||||
return null;
|
||||
@Override
|
||||
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 {
|
||||
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
|
||||
public boolean updateResourceState(ResourceState oldState, ResourceState.Event event, ResourceState newState, Host vo) {
|
||||
HostVO host = (HostVO)vo;
|
||||
SearchBuilder<HostVO> sb = createSearchBuilder();
|
||||
sb.and("resource_state", sb.entity().getResourceState(), SearchCriteria.Op.EQ);
|
||||
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 {
|
||||
return trafficHosts.get(0);
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<HostVO> listDirectHostsBy(long msId, Status status) {
|
||||
SearchCriteria<HostVO> sc = DirectlyConnectedSearch.create();
|
||||
sc.setParameters("ms", msId);
|
||||
if (status != null) {
|
||||
sc.setParameters("statuses", Status.Up);
|
||||
}
|
||||
|
||||
return listBy(sc);
|
||||
}
|
||||
|
||||
@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);
|
||||
|
||||
return result > 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
4
server/src/com/cloud/hypervisor/CloudZonesStartupProcessor.java
Normal file → Executable file
4
server/src/com/cloud/hypervisor/CloudZonesStartupProcessor.java
Normal file → Executable file
@ -134,6 +134,7 @@ public class CloudZonesStartupProcessor implements StartupCommandProcessor {
|
||||
}
|
||||
|
||||
protected boolean processHostStartup(StartupRoutingCommand startup) throws ConnectionException{
|
||||
/*
|
||||
boolean found = false;
|
||||
Type type = Host.Type.Routing;
|
||||
final Map<String, String> hostDetails = startup.getHostDetails();
|
||||
@ -170,6 +171,7 @@ public class CloudZonesStartupProcessor implements StartupCommandProcessor {
|
||||
s_logger.info("Old " + server.getType().toString()
|
||||
+ " host reconnected w/ id =" + server.getId());
|
||||
}
|
||||
*/
|
||||
return true;
|
||||
|
||||
|
||||
@ -396,6 +398,7 @@ public class CloudZonesStartupProcessor implements StartupCommandProcessor {
|
||||
|
||||
|
||||
protected boolean processStorageStartup(StartupStorageCommand startup) throws ConnectionException{
|
||||
/*
|
||||
if (startup.getResourceType() != Storage.StorageResourceType.LOCAL_SECONDARY_STORAGE) {
|
||||
return false;
|
||||
}
|
||||
@ -435,6 +438,7 @@ public class CloudZonesStartupProcessor implements StartupCommandProcessor {
|
||||
s_logger.info("Old " + server.getType().toString()
|
||||
+ " host reconnected w/ id =" + server.getId());
|
||||
}
|
||||
*/
|
||||
return true;
|
||||
|
||||
|
||||
|
||||
@ -48,6 +48,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.hypervisor.hyperv.resource.HypervDummyResourceBase;
|
||||
import com.cloud.resource.Discoverer;
|
||||
import com.cloud.resource.DiscovererBase;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.resource.ServerResource;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.nio.HandlerFactory;
|
||||
@ -65,6 +66,7 @@ public class HypervServerDiscoverer extends DiscovererBase implements Discoverer
|
||||
@Inject AlertManager _alertMgr;
|
||||
@Inject ClusterDetailsDao _clusterDetailsDao;
|
||||
@Inject HostDao _hostDao = null;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
Link _link;
|
||||
|
||||
@SuppressWarnings("static-access")
|
||||
@ -105,7 +107,7 @@ public class HypervServerDiscoverer extends DiscovererBase implements Discoverer
|
||||
String agentIp = ia.getHostAddress();
|
||||
String guid = UUID.nameUUIDFromBytes(agentIp.getBytes()).toString();
|
||||
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.");
|
||||
return null;
|
||||
}
|
||||
@ -204,7 +206,7 @@ public class HypervServerDiscoverer extends DiscovererBase implements Discoverer
|
||||
|
||||
private HostVO waitForHostConnect(long dcId, long podId, long clusterId, String guid) {
|
||||
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) {
|
||||
if (host.getGuid().equalsIgnoreCase(guid)) {
|
||||
return host;
|
||||
|
||||
@ -30,18 +30,23 @@ import javax.naming.ConfigurationException;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.agent.AgentManager;
|
||||
import com.cloud.agent.Listener;
|
||||
import com.cloud.agent.api.AgentControlAnswer;
|
||||
import com.cloud.agent.api.AgentControlCommand;
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.ShutdownCommand;
|
||||
import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.agent.api.StartupRoutingCommand;
|
||||
import com.cloud.configuration.Config;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.dc.ClusterVO;
|
||||
import com.cloud.dc.dao.ClusterDao;
|
||||
import com.cloud.exception.AgentUnavailableException;
|
||||
import com.cloud.exception.DiscoveredWithErrorException;
|
||||
import com.cloud.exception.DiscoveryException;
|
||||
import com.cloud.exception.OperationTimedoutException;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
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.resource.Discoverer;
|
||||
import com.cloud.resource.DiscovererBase;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.resource.ResourceStateAdapter;
|
||||
import com.cloud.resource.ServerResource;
|
||||
import com.cloud.resource.UnableDeleteHostException;
|
||||
import com.cloud.utils.component.ComponentLocator;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.script.Script;
|
||||
@ -62,7 +70,7 @@ import com.trilead.ssh2.Session;
|
||||
|
||||
@Local(value=Discoverer.class)
|
||||
public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
|
||||
Listener {
|
||||
Listener, ResourceStateAdapter {
|
||||
private static final Logger s_logger = Logger.getLogger(KvmServerDiscoverer.class);
|
||||
private String _setupAgentPath;
|
||||
private ConfigurationDao _configDao;
|
||||
@ -73,6 +81,8 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
|
||||
private String _kvmGuestNic;
|
||||
@Inject HostDao _hostDao = null;
|
||||
@Inject ClusterDao _clusterDao;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
@Inject AgentManager _agentMgr;
|
||||
|
||||
@Override
|
||||
public boolean processAnswers(long agentId, long seq, Answer[] answers) {
|
||||
@ -149,7 +159,7 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
|
||||
agentIp = ia.getHostAddress();
|
||||
String guid = UUID.nameUUIDFromBytes(agentIp.getBytes()).toString();
|
||||
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.");
|
||||
return null;
|
||||
}
|
||||
@ -221,7 +231,7 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
|
||||
|
||||
private HostVO waitForHostConnect(long dcId, long podId, long clusterId, String guid) {
|
||||
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) {
|
||||
if (host.getGuid().equalsIgnoreCase(guid)) {
|
||||
return host;
|
||||
@ -264,6 +274,7 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
|
||||
if (_hostIp == null) {
|
||||
throw new ConfigurationException("Can't get host IP");
|
||||
}
|
||||
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -289,5 +300,67 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer,
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -62,6 +62,7 @@ import com.cloud.org.Cluster.ClusterType;
|
||||
import com.cloud.secstorage.CommandExecLogDao;
|
||||
import com.cloud.serializer.GsonHelper;
|
||||
import com.cloud.storage.StorageLayer;
|
||||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||
import com.cloud.utils.FileUtil;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
import com.cloud.utils.Pair;
|
||||
@ -102,6 +103,7 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis
|
||||
@Inject ClusterManager _clusterMgr;
|
||||
@Inject CheckPointManager _checkPointMgr;
|
||||
@Inject VirtualNetworkApplianceManager _routerMgr;
|
||||
@Inject SecondaryStorageVmManager _ssvmMgr;
|
||||
|
||||
String _mountParent;
|
||||
StorageLayer _storage;
|
||||
@ -436,7 +438,7 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis
|
||||
|
||||
@Override
|
||||
public String getSecondaryStorageStoreUrl(long dcId) {
|
||||
List<HostVO> secStorageHosts = _hostDao.listSecondaryStorageHosts(dcId);
|
||||
List<HostVO> secStorageHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId);
|
||||
if(secStorageHosts.size() > 0)
|
||||
return secStorageHosts.get(0).getStorageUrl();
|
||||
|
||||
|
||||
@ -16,6 +16,8 @@ import javax.naming.ConfigurationException;
|
||||
|
||||
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.configuration.dao.ConfigurationDao;
|
||||
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.resource.Discoverer;
|
||||
import com.cloud.resource.DiscovererBase;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.resource.ResourceStateAdapter;
|
||||
import com.cloud.resource.ServerResource;
|
||||
import com.cloud.resource.UnableDeleteHostException;
|
||||
import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.cloud.storage.Storage.TemplateType;
|
||||
import com.cloud.storage.VMTemplateVO;
|
||||
@ -48,7 +53,7 @@ import com.vmware.vim25.ClusterDasConfigInfo;
|
||||
import com.vmware.vim25.ManagedObjectReference;
|
||||
|
||||
@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);
|
||||
|
||||
@Inject ClusterDao _clusterDao;
|
||||
@ -57,6 +62,7 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer
|
||||
@Inject VMTemplateDao _tmpltDao;
|
||||
@Inject ClusterDetailsDao _clusterDetailsDao;
|
||||
@Inject HostDao _hostDao;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
@Override
|
||||
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;
|
||||
}
|
||||
|
||||
List<HostVO> hosts = _hostDao.listByCluster(clusterId);
|
||||
List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(clusterId);
|
||||
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() + ")";
|
||||
s_logger.error(msg);
|
||||
@ -224,8 +230,10 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer
|
||||
|
||||
createVmwareToolsIso();
|
||||
|
||||
if(s_logger.isInfoEnabled())
|
||||
s_logger.info("VmwareServerDiscoverer has been successfully configured");
|
||||
if(s_logger.isInfoEnabled()) {
|
||||
s_logger.info("VmwareServerDiscoverer has been successfully configured");
|
||||
}
|
||||
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -245,6 +253,40 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer
|
||||
tmplt.setUrl(null);
|
||||
_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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -47,7 +47,11 @@ import com.cloud.alert.AlertManager;
|
||||
import com.cloud.configuration.Config;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
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.DataCenterDao;
|
||||
import com.cloud.dc.dao.HostPodDao;
|
||||
import com.cloud.exception.AgentUnavailableException;
|
||||
import com.cloud.exception.ConnectionException;
|
||||
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.resource.Discoverer;
|
||||
import com.cloud.resource.DiscovererBase;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.resource.ResourceStateAdapter;
|
||||
import com.cloud.resource.ServerResource;
|
||||
import com.cloud.resource.UnableDeleteHostException;
|
||||
import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.cloud.storage.Storage.TemplateType;
|
||||
import com.cloud.storage.VMTemplateVO;
|
||||
@ -88,7 +95,7 @@ import com.xensource.xenapi.Types.SessionAuthenticationFailed;
|
||||
import com.xensource.xenapi.Types.XenAPIException;
|
||||
|
||||
@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);
|
||||
protected String _publicNic;
|
||||
protected String _privateNic;
|
||||
@ -108,6 +115,9 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
||||
@Inject VMTemplateHostDao _vmTemplateHostDao;
|
||||
@Inject ClusterDao _clusterDao;
|
||||
@Inject protected ConfigurationDao _configDao;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
@Inject HostPodDao _podDao;
|
||||
@Inject DataCenterDao _dcDao;
|
||||
|
||||
protected XcpServerDiscoverer() {
|
||||
}
|
||||
@ -141,7 +151,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
||||
}
|
||||
|
||||
try {
|
||||
List<HostVO> eHosts = _hostDao.listByCluster(clusterId);
|
||||
List<HostVO> eHosts = _resourceMgr.listAllHostsInCluster(clusterId);
|
||||
if( eHosts.size() > 0 ) {
|
||||
HostVO eHost = eHosts.get(0);
|
||||
_hostDao.loadDetails(eHost);
|
||||
@ -170,7 +180,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
||||
if ( clu.getGuid()== null ) {
|
||||
clu.setGuid(poolUuid);
|
||||
} else {
|
||||
List<HostVO> clusterHosts = _hostDao.listByCluster(clusterId);
|
||||
List<HostVO> clusterHosts = _resourceMgr.listAllHostsInCluster(clusterId);
|
||||
if( clusterHosts != null && clusterHosts.size() > 0) {
|
||||
if (!clu.getGuid().equals(poolUuid)) {
|
||||
if (hosts.size() == 1) {
|
||||
@ -233,7 +243,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
||||
String hostOSVer = prodVersion;
|
||||
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.");
|
||||
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 {
|
||||
|
||||
List<HostVO> hosts;
|
||||
hosts = _hostDao.listByCluster(clusterId);
|
||||
hosts = _resourceMgr.listAllHostsInCluster(clusterId);
|
||||
|
||||
String masterIp = null;
|
||||
String username = null;
|
||||
@ -454,6 +464,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
||||
_agentMgr.registerForHostEvents(this, true, false, true);
|
||||
|
||||
createXsToolsISO();
|
||||
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -617,5 +628,43 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
||||
@Override
|
||||
public boolean processTimeout(long agentId, long seq) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
5
server/src/com/cloud/migration/Db21to22MigrationUtil.java
Normal file → Executable file
5
server/src/com/cloud/migration/Db21to22MigrationUtil.java
Normal file → Executable file
@ -43,6 +43,7 @@ import com.cloud.host.HostVO;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.hypervisor.xen.resource.XenServerConnectionPool;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.user.dao.AccountDao;
|
||||
import com.cloud.utils.PropertiesUtil;
|
||||
@ -68,6 +69,7 @@ public class Db21to22MigrationUtil {
|
||||
private InstanceGroupVMMapDao _groupVMMapDao;
|
||||
private ConfigurationDao _configurationDao;
|
||||
private DataCenterDao _zoneDao;
|
||||
private ResourceManager _resourceMgr;
|
||||
|
||||
private void doMigration() {
|
||||
setupComponents();
|
||||
@ -88,7 +90,7 @@ public class Db21to22MigrationUtil {
|
||||
XenServerConnectionPool _connPool = XenServerConnectionPool.getInstance();
|
||||
List<ClusterVO> clusters = _clusterDao.listByHyTypeWithoutGuid(HypervisorType.XenServer.toString());
|
||||
for (ClusterVO cluster : clusters) {
|
||||
List<HostVO> hosts = _hostDao.listByCluster(cluster.getId());
|
||||
List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cluster.getId());
|
||||
for (HostVO host : hosts) {
|
||||
String ip = host.getPrivateIpAddress();
|
||||
String username = host.getDetail("username");
|
||||
@ -179,6 +181,7 @@ public class Db21to22MigrationUtil {
|
||||
_groupVMMapDao = locator.getDao(InstanceGroupVMMapDao.class);
|
||||
_configurationDao = locator.getDao(ConfigurationDao.class);
|
||||
_zoneDao = locator.getDao(DataCenterDao.class);
|
||||
_resourceMgr = locator.getManager(ResourceManager.class);
|
||||
}
|
||||
|
||||
private void setupInstanceGroups() {
|
||||
|
||||
55
server/src/com/cloud/network/ExternalNetworkManagerImpl.java
Normal file → Executable file
55
server/src/com/cloud/network/ExternalNetworkManagerImpl.java
Normal file → Executable file
@ -37,6 +37,9 @@ import com.cloud.agent.AgentManager;
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer;
|
||||
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.LoadBalancerConfigCommand;
|
||||
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.offerings.NetworkOfferingVO;
|
||||
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.server.api.response.ExternalFirewallResponse;
|
||||
import com.cloud.server.api.response.ExternalLoadBalancerResponse;
|
||||
import com.cloud.user.Account;
|
||||
@ -121,7 +127,7 @@ import com.cloud.vm.dao.DomainRouterDao;
|
||||
import com.cloud.vm.dao.NicDao;
|
||||
|
||||
@Local(value = {ExternalNetworkManager.class})
|
||||
public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
|
||||
public class ExternalNetworkManagerImpl implements ExternalNetworkManager, ResourceStateAdapter {
|
||||
public enum ExternalNetworkResourceName {
|
||||
JuniperSrx,
|
||||
F5BigIp,
|
||||
@ -147,6 +153,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
|
||||
@Inject VpnUserDao _vpnUsersDao;
|
||||
@Inject InlineLoadBalancerNicMapDao _inlineLoadBalancerNicMapDao;
|
||||
@Inject AccountManager _accountMgr;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
ScheduledExecutorService _executor;
|
||||
int _externalNetworkStatsInterval;
|
||||
@ -161,6 +168,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
|
||||
if (_externalNetworkStatsInterval > 0){
|
||||
_executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("ExternalNetworkMonitor"));
|
||||
}
|
||||
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -174,6 +182,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
|
||||
|
||||
@Override
|
||||
public boolean stop() {
|
||||
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -192,7 +201,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
|
||||
s_logger.debug("Zone " + zone.getName() + " is not configured for external networking.");
|
||||
return null;
|
||||
} else {
|
||||
List<HostVO> externalNetworkAppliancesInZone = _hostDao.listBy(type, zoneId);
|
||||
List<HostVO> externalNetworkAppliancesInZone = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByType(type, zoneId);
|
||||
if (externalNetworkAppliancesInZone.size() != 1) {
|
||||
return null;
|
||||
} else {
|
||||
@ -216,7 +225,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
|
||||
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) {
|
||||
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());
|
||||
}
|
||||
|
||||
Host host = _agentMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails);
|
||||
Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails);
|
||||
if (host != null) {
|
||||
if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.F5BigIP.getName())) {
|
||||
zone.setLoadBalancerProvider(Network.Provider.F5BigIp.getName());
|
||||
@ -309,7 +318,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
|
||||
}
|
||||
|
||||
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());
|
||||
|
||||
if (zone.getNetworkType().equals(NetworkType.Advanced)) {
|
||||
@ -331,7 +340,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
|
||||
@Override
|
||||
public List<HostVO> listExternalLoadBalancers(ListExternalLoadBalancersCmd cmd) {
|
||||
long zoneId = cmd.getZoneId();
|
||||
return _hostDao.listByTypeDataCenter(Host.Type.ExternalLoadBalancer, zoneId);
|
||||
return _resourceMgr.listAllHostsInOneZoneByType(Host.Type.ExternalLoadBalancer, zoneId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -533,7 +542,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
|
||||
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) {
|
||||
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());
|
||||
}
|
||||
|
||||
Host externalFirewall = _agentMgr.addHost(zoneId, resource, Host.Type.ExternalFirewall, hostDetails);
|
||||
Host externalFirewall = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalFirewall, hostDetails);
|
||||
if (externalFirewall != null) {
|
||||
zone.setFirewallProvider(Network.Provider.JuniperSRX.getName());
|
||||
zone.setUserDataProvider(Network.Provider.DhcpServer.getName());
|
||||
@ -669,7 +678,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
|
||||
}
|
||||
|
||||
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());
|
||||
zone.setFirewallProvider(Network.Provider.VirtualRouter.getName());
|
||||
zone.setUserDataProvider(Network.Provider.VirtualRouter.getName());
|
||||
@ -708,7 +717,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
|
||||
@Override
|
||||
public List<HostVO> listExternalFirewalls(ListExternalFirewallsCmd cmd) {
|
||||
long zoneId = cmd.getZoneId();
|
||||
return _hostDao.listByTypeDataCenter(Host.Type.ExternalFirewall, zoneId);
|
||||
return _resourceMgr.listAllHostsInOneZoneByType(Host.Type.ExternalFirewall, zoneId);
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
}
|
||||
|
||||
6
server/src/com/cloud/network/NetworkDeviceManagerImpl.java
Normal file → Executable file
6
server/src/com/cloud/network/NetworkDeviceManagerImpl.java
Normal file → Executable file
@ -25,6 +25,7 @@ import com.cloud.exception.InvalidParameterValueException;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.server.api.response.NetworkDeviceResponse;
|
||||
import com.cloud.server.api.response.NwDeviceDhcpResponse;
|
||||
import com.cloud.server.api.response.PxePingResponse;
|
||||
@ -38,6 +39,7 @@ public class NetworkDeviceManagerImpl implements NetworkDeviceManager {
|
||||
@Inject ExternalDhcpManager _dhcpMgr;
|
||||
@Inject PxeServerManager _pxeMgr;
|
||||
@Inject HostDao _hostDao;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
|
||||
@Override
|
||||
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) {
|
||||
List<Host> res = new ArrayList<Host>();
|
||||
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) {
|
||||
res.add(devs.get(0));
|
||||
} else {
|
||||
s_logger.debug("List " + type + ": " + devs.size() + " found");
|
||||
}
|
||||
} else {
|
||||
List<HostVO> devs = _hostDao.listBy(type, zoneId);
|
||||
List<HostVO> devs = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByType(type, zoneId);
|
||||
res.addAll(devs);
|
||||
}
|
||||
|
||||
|
||||
44
server/src/com/cloud/network/NetworkUsageManagerImpl.java
Normal file → Executable file
44
server/src/com/cloud/network/NetworkUsageManagerImpl.java
Normal file → Executable file
@ -66,6 +66,10 @@ import com.cloud.network.Network.GuestIpType;
|
||||
import com.cloud.network.dao.IPAddressDao;
|
||||
import com.cloud.network.dao.NetworkDao;
|
||||
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.usage.UsageIPAddressVO;
|
||||
import com.cloud.user.AccountManager;
|
||||
@ -87,7 +91,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
|
||||
import com.cloud.utils.net.MacAddress;
|
||||
|
||||
@Local(value = {NetworkUsageManager.class})
|
||||
public class NetworkUsageManagerImpl implements NetworkUsageManager {
|
||||
public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceStateAdapter {
|
||||
public enum NetworkUsageResourceName {
|
||||
TrafficSentinel;
|
||||
}
|
||||
@ -104,6 +108,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
|
||||
@Inject HostDetailsDao _detailsDao;
|
||||
@Inject AccountManager _accountMgr;
|
||||
@Inject NetworkDao _networksDao = null;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
ScheduledExecutorService _executor;
|
||||
int _networkStatsInterval;
|
||||
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) {
|
||||
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("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;
|
||||
}
|
||||
|
||||
@ -178,9 +183,9 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
|
||||
throw new InvalidParameterValueException("Could not find an traffic monitor with ID: " + hostId);
|
||||
}
|
||||
|
||||
try {
|
||||
if (_agentMgr.maintain(hostId) && _agentMgr.deleteHost(hostId, false, false, caller)) {
|
||||
return true;
|
||||
try {
|
||||
if (_resourceMgr.maintain(hostId) && _resourceMgr.deleteHost(hostId, false, false)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
@ -193,7 +198,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
|
||||
@Override
|
||||
public List<HostVO> listTrafficMonitors(ListTrafficMonitorsCmd cmd) {
|
||||
long zoneId = cmd.getZoneId();
|
||||
return _hostDao.listByTypeDataCenter(Host.Type.TrafficMonitor, zoneId);
|
||||
return _resourceMgr.listAllHostsInOneZoneByType(Host.Type.TrafficMonitor, zoneId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -221,6 +226,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
|
||||
|
||||
_networkStatsInterval = NumbersUtil.parseInt(_configDao.getValue(Config.DirectNetworkStatsInterval.key()), 86400);
|
||||
_agentMgr.registerForHostEvents(new DirectNetworkStatsListener( _networkStatsInterval), true, false, false);
|
||||
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -231,6 +237,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager {
|
||||
|
||||
@Override
|
||||
public boolean stop() {
|
||||
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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.VlanMappingDao;
|
||||
import com.cloud.network.ovs.dao.VlanMappingVO;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.utils.component.ComponentLocator;
|
||||
import com.cloud.utils.component.Inject;
|
||||
|
||||
public class OvsListener implements Listener {
|
||||
@ -53,6 +55,7 @@ public class OvsListener implements Listener {
|
||||
GreTunnelDao _tunnelDao;
|
||||
VlanMappingDao _mappingDao;
|
||||
HostDao _hostDao;
|
||||
ResourceManager _resourceMgr;
|
||||
|
||||
public OvsListener(OvsNetworkManager ovsMgr, OvsWorkDao workDao, GreTunnelDao tunnelDao,
|
||||
VlanMappingDao mappingDao, HostDao hostDao) {
|
||||
@ -61,6 +64,8 @@ public class OvsListener implements Listener {
|
||||
this._tunnelDao = tunnelDao;
|
||||
this._mappingDao = mappingDao;
|
||||
this._hostDao = hostDao;
|
||||
ComponentLocator locator = ComponentLocator.getLocator("management-server");
|
||||
_resourceMgr = locator.getManager(ResourceManager.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -131,7 +136,7 @@ public class OvsListener implements Listener {
|
||||
}
|
||||
|
||||
try {
|
||||
List<HostVO> hosts = _hostDao.listByType(Host.Type.Routing);
|
||||
List<HostVO> hosts = _resourceMgr.listAllHostsInAllZonesByType(Host.Type.Routing);
|
||||
for (HostVO h : hosts) {
|
||||
if (h.getId() == host.getId()) {
|
||||
continue;
|
||||
|
||||
@ -38,15 +38,20 @@ import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.network.ovs.dao.GreTunnelVO;
|
||||
import com.cloud.network.ovs.dao.OvsTunnelDao;
|
||||
import com.cloud.network.ovs.dao.OvsTunnelVO;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.utils.component.ComponentLocator;
|
||||
|
||||
public class OvsTunnelListener implements Listener {
|
||||
public static final Logger s_logger = Logger.getLogger(OvsListener.class.getName());
|
||||
HostDao _hostDao;
|
||||
OvsTunnelDao _tunnelDao;
|
||||
ResourceManager _resourceMgr;
|
||||
|
||||
public OvsTunnelListener(OvsTunnelDao tunnelDao, HostDao hostDao) {
|
||||
this._hostDao = hostDao;
|
||||
this._tunnelDao = tunnelDao;
|
||||
ComponentLocator locator = ComponentLocator.getLocator("management-server");
|
||||
_resourceMgr = locator.getManager(ResourceManager.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -76,7 +81,7 @@ public class OvsTunnelListener implements Listener {
|
||||
}
|
||||
|
||||
try {
|
||||
List<HostVO> hosts = _hostDao.listByType(Host.Type.Routing);
|
||||
List<HostVO> hosts = _resourceMgr.listAllHostsInAllZonesByType(Host.Type.Routing);
|
||||
for (HostVO h : hosts) {
|
||||
if (h.getId() == host.getId()) {
|
||||
continue;
|
||||
|
||||
@ -17,7 +17,21 @@
|
||||
*/
|
||||
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.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
|
||||
@ -34,4 +48,62 @@ public interface ResourceManager {
|
||||
public void registerResourceEvent(Integer event, 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
47
server/src/com/cloud/resource/ResourceStateAdapter.java
Executable file
47
server/src/com/cloud/resource/ResourceStateAdapter.java
Executable 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;
|
||||
}
|
||||
5
server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java
Normal file → Executable file
5
server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java
Normal file → Executable file
@ -18,6 +18,7 @@ import com.cloud.configuration.Config;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.storage.secondary.SecondaryStorageManagerImpl;
|
||||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||
import com.cloud.utils.DateUtil;
|
||||
@ -45,6 +46,7 @@ public class PremiumSecondaryStorageManagerImpl extends SecondaryStorageManagerI
|
||||
@Inject SecondaryStorageVmDao _secStorageVmDao;
|
||||
@Inject CommandExecLogDao _cmdExecLogDao;
|
||||
@Inject HostDao _hostDao;
|
||||
@Inject ResourceManager _resourceMgr;
|
||||
protected SearchBuilder<CommandExecLogVO> ActiveCommandSearch;
|
||||
protected SearchBuilder<HostVO> HostSearch;
|
||||
|
||||
@ -68,7 +70,6 @@ public class PremiumSecondaryStorageManagerImpl extends SecondaryStorageManagerI
|
||||
|
||||
HostSearch.done();
|
||||
ActiveCommandSearch.done();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -135,7 +136,7 @@ public class PremiumSecondaryStorageManagerImpl extends SecondaryStorageManagerI
|
||||
for(Long vmId : vms) {
|
||||
SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(vmId);
|
||||
HostVO host;
|
||||
host = _hostDao.findByName(secStorageVm.getHostName());
|
||||
host = _resourceMgr.findHostByName(secStorageVm.getHostName());
|
||||
if(host != null && host.getStatus() == Status.Up)
|
||||
return new Pair<HostVO, SecondaryStorageVmVO>(host, secStorageVm);
|
||||
}
|
||||
|
||||
@ -171,6 +171,7 @@ import com.cloud.network.dao.LoadBalancerDao;
|
||||
import com.cloud.network.dao.NetworkDao;
|
||||
import com.cloud.projects.Project;
|
||||
import com.cloud.projects.ProjectManager;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.service.ServiceOfferingVO;
|
||||
import com.cloud.service.dao.ServiceOfferingDao;
|
||||
import com.cloud.storage.DiskOfferingVO;
|
||||
@ -310,6 +311,7 @@ public class ManagementServerImpl implements ManagementServer {
|
||||
private final HypervisorCapabilitiesDao _hypervisorCapabilitiesDao;
|
||||
private final Adapters<HostAllocator> _hostAllocators;
|
||||
@Inject ProjectManager _projectMgr;
|
||||
private final ResourceManager _resourceMgr;
|
||||
|
||||
private final KeystoreManager _ksMgr;
|
||||
|
||||
@ -375,6 +377,7 @@ public class ManagementServerImpl implements ManagementServer {
|
||||
_sshKeyPairDao = locator.getDao(SSHKeyPairDao.class);
|
||||
_itMgr = locator.getManager(VirtualMachineManager.class);
|
||||
_ksMgr = locator.getManager(KeystoreManager.class);
|
||||
_resourceMgr = locator.getManager(ResourceManager.class);
|
||||
|
||||
_hypervisorCapabilitiesDao = locator.getDao(HypervisorCapabilitiesDao.class);
|
||||
|
||||
@ -1378,7 +1381,7 @@ public class ManagementServerImpl implements ManagementServer {
|
||||
}
|
||||
List<HypervisorType> hypers = null;
|
||||
if( ! isIso ) {
|
||||
hypers = _hostDao.getAvailHypervisorInZone(null, null);
|
||||
hypers = _resourceMgr.listAvailHypervisorInZone(null, null);
|
||||
}
|
||||
Set<Pair<Long, Long>> templateZonePairSet = new HashSet<Pair<Long, Long>>();
|
||||
|
||||
@ -3412,7 +3415,7 @@ public class ManagementServerImpl implements ManagementServer {
|
||||
|
||||
String secondaryStorageURL = _storageMgr.getSecondaryStorageURL(zoneId);
|
||||
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);
|
||||
|
||||
List<UploadVO> extractURLList = _uploadDao.listByTypeUploadStatus(volumeId, Upload.Type.VOLUME, UploadVO.Status.DOWNLOAD_URL_CREATED);
|
||||
@ -3867,7 +3870,7 @@ public class ManagementServerImpl implements ManagementServer {
|
||||
}
|
||||
} else {
|
||||
// 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();
|
||||
txn.start();
|
||||
for (HostVO h : hosts) {
|
||||
|
||||
@ -46,6 +46,7 @@ import com.cloud.host.HostStats;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.resource.ResourceState;
|
||||
import com.cloud.storage.StorageManager;
|
||||
import com.cloud.storage.StoragePoolHostVO;
|
||||
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.StoragePoolHostDao;
|
||||
import com.cloud.storage.dao.VolumeDao;
|
||||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
import com.cloud.utils.component.ComponentLocator;
|
||||
import com.cloud.utils.concurrency.NamedThreadFactory;
|
||||
@ -83,7 +85,8 @@ public class StatsCollector {
|
||||
private final VolumeDao _volsDao;
|
||||
private final StoragePoolDao _storagePoolDao;
|
||||
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 final ConcurrentHashMap<Long, VmStats> _VmStats = new ConcurrentHashMap<Long, VmStats>();
|
||||
@ -111,7 +114,8 @@ public class StatsCollector {
|
||||
private StatsCollector(Map<String, String> configs) {
|
||||
ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name);
|
||||
_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);
|
||||
_userVmDao = locator.getDao(UserVmDao.class);
|
||||
_volsDao = locator.getDao(VolumeDao.class);
|
||||
@ -153,7 +157,8 @@ public class StatsCollector {
|
||||
s_logger.debug("HostStatsCollector is running...");
|
||||
|
||||
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.ConsoleProxy.toString());
|
||||
sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.SecondaryStorage.toString());
|
||||
@ -193,6 +198,7 @@ public class StatsCollector {
|
||||
|
||||
SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria();
|
||||
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.ConsoleProxy.toString());
|
||||
sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.SecondaryStorage.toString());
|
||||
@ -265,7 +271,7 @@ public class StatsCollector {
|
||||
s_logger.debug("StorageCollector is running...");
|
||||
}
|
||||
|
||||
List<HostVO> hosts = _hostDao.listSecondaryStorageHosts();
|
||||
List<HostVO> hosts = _ssvmMgr.listSecondaryStorageHostsInAllZones();
|
||||
ConcurrentHashMap<Long, StorageStats> storageStats = new ConcurrentHashMap<Long, StorageStats>();
|
||||
for (HostVO host : hosts) {
|
||||
if ( host.getStorageUrl() == null ) {
|
||||
|
||||
@ -28,6 +28,9 @@ import com.cloud.storage.dao.StoragePoolDao;
|
||||
import com.cloud.storage.dao.StoragePoolHostDao;
|
||||
import com.cloud.utils.Ternary;
|
||||
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;
|
||||
|
||||
@Local(value ={OCFS2Manager.class})
|
||||
@ -129,7 +132,12 @@ public class OCFS2ManagerImpl implements OCFS2Manager, ResourceListener {
|
||||
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()) {
|
||||
s_logger.debug("There is no host in cluster " + clusterId + ", no need to prepare OCFS2 nodes");
|
||||
return true;
|
||||
|
||||
@ -117,6 +117,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.network.NetworkManager;
|
||||
import com.cloud.network.router.VirtualNetworkApplianceManager;
|
||||
import com.cloud.org.Grouping;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.server.ManagementServer;
|
||||
import com.cloud.service.ServiceOfferingVO;
|
||||
import com.cloud.service.dao.ServiceOfferingDao;
|
||||
@ -289,6 +290,10 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
||||
protected OCFS2Manager _ocfs2Mgr;
|
||||
@Inject
|
||||
protected ResourceLimitService _resourceLimitMgr;
|
||||
@Inject
|
||||
protected SecondaryStorageVmManager _ssvmMgr;
|
||||
@Inject
|
||||
protected ResourceManager _resourceMgr;
|
||||
|
||||
@Inject(adapter = StoragePoolAllocator.class)
|
||||
protected Adapters<StoragePoolAllocator> _storagePoolAllocators;
|
||||
@ -361,7 +366,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
||||
List<StoragePoolVO> pools = _storagePoolDao.listAll();
|
||||
|
||||
// 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;
|
||||
} else {
|
||||
return true;
|
||||
@ -965,7 +970,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
||||
public Pair<String, String> getAbsoluteIsoPath(long templateId, long dataCenterId) {
|
||||
String isoPath = null;
|
||||
|
||||
List<HostVO> storageHosts = _hostDao.listAllBy(Host.Type.SecondaryStorage, dataCenterId);
|
||||
List<HostVO> storageHosts = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.SecondaryStorage, dataCenterId);
|
||||
if (storageHosts != null) {
|
||||
for (HostVO storageHost : storageHosts) {
|
||||
VMTemplateHostVO templateHostVO = _vmTemplateHostDao.findByHostTemplate(storageHost.getId(), templateId);
|
||||
@ -993,7 +998,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
||||
|
||||
@Override
|
||||
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) {
|
||||
return null;
|
||||
}
|
||||
@ -1008,7 +1013,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
||||
|
||||
@Override
|
||||
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) {
|
||||
return null;
|
||||
}
|
||||
@ -1034,9 +1039,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
||||
|
||||
@Override
|
||||
public HostVO getSecondaryStorageHost(long zoneId) {
|
||||
List<HostVO> hosts = _hostDao.listSecondaryStorageHosts(zoneId);
|
||||
List<HostVO> hosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
|
||||
if( hosts == null || hosts.size() == 0) {
|
||||
hosts = _hostDao.listLocalSecondaryStorageHosts(zoneId);
|
||||
hosts = _ssvmMgr.listLocalSecondaryStorageHostsInOneZone(zoneId);
|
||||
if (hosts.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
@ -1050,9 +1055,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
||||
|
||||
@Override
|
||||
public List<HostVO> getSecondaryStorageHosts(long zoneId) {
|
||||
List<HostVO> hosts = _hostDao.listSecondaryStorageHosts(zoneId);
|
||||
List<HostVO> hosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
|
||||
if( hosts == null || hosts.size() == 0) {
|
||||
hosts = _hostDao.listLocalSecondaryStorageHosts(zoneId);
|
||||
hosts = _ssvmMgr.listLocalSecondaryStorageHostsInOneZone(zoneId);
|
||||
if (hosts.isEmpty()) {
|
||||
return new ArrayList<HostVO>();
|
||||
}
|
||||
@ -1132,7 +1137,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
||||
}
|
||||
|
||||
// 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()) {
|
||||
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
|
||||
List<HostVO> hosts = _hostDao.listByDataCenter(zoneId);
|
||||
List<HostVO> hosts = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByType(Host.Type.Routing, zoneId);
|
||||
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) {
|
||||
@ -1934,7 +1939,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
||||
}
|
||||
|
||||
// Cleanup secondary storage hosts
|
||||
List<HostVO> secondaryStorageHosts = _hostDao.listSecondaryStorageHosts();
|
||||
List<HostVO> secondaryStorageHosts = _ssvmMgr.listSecondaryStorageHostsInAllZones();
|
||||
for (HostVO secondaryStorageHost : secondaryStorageHosts) {
|
||||
try {
|
||||
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 ) {
|
||||
primaryStorage.setStatus(StoragePoolStatus.Maintenance);
|
||||
_storagePoolDao.update(primaryStorageId, primaryStorage);
|
||||
@ -2260,7 +2265,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
||||
primaryStorage.setStatus(StoragePoolStatus.Up);
|
||||
_storagePoolDao.update(primaryStorageId, primaryStorage);
|
||||
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 ) {
|
||||
return _storagePoolDao.findById(primaryStorageId);
|
||||
}
|
||||
@ -3131,7 +3136,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
||||
long dcId = pool.getDataCenterId();
|
||||
Long podId = pool.getPodId();
|
||||
|
||||
List<HostVO> secHosts = _hostDao.listSecondaryStorageHosts(dcId);
|
||||
List<HostVO> secHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId);
|
||||
|
||||
//FIXME, for cloudzone, the local secondary storoge
|
||||
if (pool.isLocal() && pool.getPoolType() == StoragePoolType.Filesystem && secHosts.isEmpty()) {
|
||||
|
||||
@ -54,6 +54,7 @@ import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.cloud.storage.VMTemplateHostVO;
|
||||
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
||||
@ -104,6 +105,8 @@ public class DownloadMonitorImpl implements DownloadMonitor {
|
||||
SecondaryStorageVmDao _secStorageVmDao;
|
||||
@Inject
|
||||
AlertManager _alertMgr;
|
||||
@Inject
|
||||
SecondaryStorageVmManager _ssvmMgr;
|
||||
|
||||
@Inject
|
||||
private final DataCenterDao _dcDao = null;
|
||||
@ -125,6 +128,8 @@ public class DownloadMonitorImpl implements DownloadMonitor {
|
||||
private ClusterDao _clusterDao;
|
||||
@Inject
|
||||
private HostDao _hostDao;
|
||||
@Inject
|
||||
private ResourceManager _resourceMgr;
|
||||
|
||||
private String _name;
|
||||
private Boolean _sslCopy = new Boolean(false);
|
||||
@ -361,7 +366,7 @@ public class DownloadMonitorImpl implements DownloadMonitor {
|
||||
long templateId = template.getId();
|
||||
boolean isPublic = template.isFeatured() || template.isPublicTemplate();
|
||||
for ( DataCenterVO dc : dcs ) {
|
||||
List<HostVO> ssHosts = _hostDao.listAllSecondaryStorageHosts(dc.getId());
|
||||
List<HostVO> ssHosts = _ssvmMgr.listAllTypesSecondaryStorageHostsInOneZone(dc.getId());
|
||||
for ( HostVO ssHost : ssHosts ) {
|
||||
if (isTemplateUpdateable(templateId, ssHost.getId())) {
|
||||
initiateTemplateDownload(templateId, ssHost);
|
||||
@ -419,14 +424,14 @@ public class DownloadMonitorImpl implements DownloadMonitor {
|
||||
|
||||
@Override
|
||||
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();
|
||||
if (hypers.contains(hostHyper)) {
|
||||
return;
|
||||
}
|
||||
|
||||
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()) {
|
||||
return;
|
||||
}
|
||||
@ -481,7 +486,7 @@ public class DownloadMonitorImpl implements DownloadMonitor {
|
||||
|
||||
@Override
|
||||
public void handleTemplateSync(long dcId) {
|
||||
List<HostVO> ssHosts = _hostDao.listSecondaryStorageHosts(dcId);
|
||||
List<HostVO> ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId);
|
||||
for ( HostVO ssHost : ssHosts ) {
|
||||
handleTemplateSync(ssHost);
|
||||
}
|
||||
|
||||
@ -32,6 +32,7 @@ import javax.naming.ConfigurationException;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.agent.AgentManager;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status.Event;
|
||||
@ -78,6 +79,8 @@ public class SecondaryStorageDiscoverer extends DiscovererBase implements Discov
|
||||
protected VMTemplateDao _vmTemplateDao = null;
|
||||
@Inject
|
||||
protected ConfigurationDao _configDao = null;
|
||||
@Inject
|
||||
protected AgentManager _agentMgr = null;
|
||||
|
||||
protected SecondaryStorageDiscoverer() {
|
||||
}
|
||||
@ -290,7 +293,7 @@ public class SecondaryStorageDiscoverer extends DiscovererBase implements Discov
|
||||
public void postDiscovery(List<HostVO> hosts, long msId) {
|
||||
if (_useServiceVM) {
|
||||
for (HostVO h: hosts) {
|
||||
_hostDao.disconnect(h, Event.AgentDisconnected, msId);
|
||||
_agentMgr.agentStatusTransitTo(h, Event.AgentDisconnected, msId);
|
||||
}
|
||||
}
|
||||
for (HostVO h: hosts) {
|
||||
|
||||
@ -28,6 +28,7 @@ import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.agent.api.StartupSecondaryStorageCommand;
|
||||
import com.cloud.agent.api.StartupStorageCommand;
|
||||
import com.cloud.cluster.ManagementServerNode;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.Status.Event;
|
||||
@ -71,7 +72,6 @@ public class SecondaryStorageListener implements Listener {
|
||||
|
||||
@Override
|
||||
public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) {
|
||||
|
||||
if ((cmd instanceof StartupStorageCommand) ) {
|
||||
StartupStorageCommand scmd = (StartupStorageCommand)cmd;
|
||||
if (scmd.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE ) {
|
||||
@ -82,7 +82,6 @@ public class SecondaryStorageListener implements Listener {
|
||||
if(s_logger.isInfoEnabled()) {
|
||||
s_logger.info("Received a host startup notification " + cmd);
|
||||
}
|
||||
_agentMgr.updateStatus(agent, Event.Ready);
|
||||
_ssVmMgr.onAgentConnect(agent.getDataCenterId(), cmd);
|
||||
_ssVmMgr.generateSetupCommand(agent.getId());
|
||||
_ssVmMgr.generateFirewallConfiguration(agent.getId());
|
||||
@ -90,8 +89,6 @@ public class SecondaryStorageListener implements Listener {
|
||||
return;
|
||||
}
|
||||
return;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
156
server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
Normal file → Executable file
156
server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
Normal file → Executable file
@ -18,6 +18,8 @@
|
||||
package com.cloud.storage.secondary;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.Enumeration;
|
||||
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.SecStorageVMSetupCommand;
|
||||
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.check.CheckSshAnswer;
|
||||
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.Networks.TrafficType;
|
||||
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.dao.ServiceOfferingDao;
|
||||
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.VMTemplateDao;
|
||||
import com.cloud.storage.dao.VMTemplateHostDao;
|
||||
import com.cloud.storage.resource.DummySecondaryStorageResource;
|
||||
import com.cloud.storage.template.TemplateConstants;
|
||||
import com.cloud.user.Account;
|
||||
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.Inject;
|
||||
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.exception.CloudRuntimeException;
|
||||
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.UserVmDetailsDao;
|
||||
import com.cloud.vm.dao.VMInstanceDao;
|
||||
import com.cloud.storage.Storage;
|
||||
|
||||
//
|
||||
// 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
|
||||
//
|
||||
@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 int DEFAULT_CAPACITY_SCAN_INTERVAL = 30000; // 30
|
||||
@ -189,6 +202,10 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
|
||||
protected CapacityDao _capacityDao;
|
||||
@Inject
|
||||
UserVmDetailsDao _vmDetailsDao;
|
||||
@Inject
|
||||
protected ResourceManager _resourceMgr;
|
||||
@Inject
|
||||
protected SecondaryStorageVmManager _ssvmMgr;
|
||||
|
||||
private long _capacityScanInterval = DEFAULT_CAPACITY_SCAN_INTERVAL;
|
||||
|
||||
@ -248,7 +265,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
|
||||
return false;
|
||||
}
|
||||
|
||||
List<HostVO> ssHosts = _hostDao.listSecondaryStorageHosts(zoneId);
|
||||
List<HostVO> ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
|
||||
for( HostVO ssHost : ssHosts ) {
|
||||
String secUrl = ssHost.getStorageUrl();
|
||||
SecStorageSetupCommand setupCmd = new SecStorageSetupCommand(secUrl);
|
||||
@ -273,7 +290,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
|
||||
String secUrl = cssHost.getStorageUrl();
|
||||
SecStorageSetupCommand setupCmd = new SecStorageSetupCommand(secUrl);
|
||||
for ( SecondaryStorageVmVO ssVm : alreadyRunning ) {
|
||||
HostVO host = _hostDao.findByName(ssVm.getInstanceName());
|
||||
HostVO host = _resourceMgr.findHostByName(ssVm.getInstanceName());
|
||||
Answer answer = _agentMgr.easySend(host.getId(), setupCmd);
|
||||
if (answer != null && answer.getResult()) {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
@ -394,7 +411,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
|
||||
continue;
|
||||
}
|
||||
String instanceName = ssVm.getInstanceName();
|
||||
HostVO host = _hostDao.findByName(instanceName);
|
||||
HostVO host = _resourceMgr.findHostByName(instanceName);
|
||||
if ( host == null ) {
|
||||
continue;
|
||||
}
|
||||
@ -479,7 +496,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
|
||||
}
|
||||
|
||||
protected Map<String, Object> createSecStorageVmInstance(long dataCenterId, SecondaryStorageVm.Role role) {
|
||||
HostVO secHost = _hostDao.findSecondaryStorageHost(dataCenterId);
|
||||
HostVO secHost = findSecondaryStorageHost(dataCenterId);
|
||||
if (secHost == null) {
|
||||
String msg = "No secondary storage available in zone " + dataCenterId + ", cannot create secondary storage vm";
|
||||
s_logger.warn(msg);
|
||||
@ -665,7 +682,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
|
||||
ZoneHostInfo zoneHostInfo = zoneHostInfoMap.get(dataCenterId);
|
||||
if (zoneHostInfo != null && (zoneHostInfo.getFlags() & RunningHostInfoAgregator.ZoneHostInfo.ROUTING_HOST_MASK) != 0) {
|
||||
VMTemplateVO template = _templateDao.findSystemVMTemplate(dataCenterId);
|
||||
HostVO secHost = _hostDao.findSecondaryStorageHost(dataCenterId);
|
||||
HostVO secHost = _ssvmMgr.findSecondaryStorageHost(dataCenterId);
|
||||
if (secHost == null) {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
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() {
|
||||
_loadScanner.stop();
|
||||
_allocLock.releaseRef();
|
||||
_resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -807,6 +825,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
|
||||
if (s_logger.isInfoEnabled()) {
|
||||
s_logger.info("Secondary storage vm Manager is configured.");
|
||||
}
|
||||
_resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -949,7 +968,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
|
||||
Map<String, String> details = _vmDetailsDao.findDetails(vm.getId());
|
||||
vm.setDetails(details);
|
||||
|
||||
HostVO secHost = _hostDao.findSecondaryStorageHost(dest.getDataCenter().getId());
|
||||
HostVO secHost = _ssvmMgr.findSecondaryStorageHost(dest.getDataCenter().getId());
|
||||
assert (secHost != null);
|
||||
|
||||
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,
|
||||
State.Starting, State.Stopped, State.Stopping );
|
||||
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();
|
||||
if ( hostSize > vmSize ) {
|
||||
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() {
|
||||
}
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
|
||||
10
server/src/com/cloud/storage/secondary/SecondaryStorageVmManager.java
Normal file → Executable file
10
server/src/com/cloud/storage/secondary/SecondaryStorageVmManager.java
Normal file → Executable file
@ -17,6 +17,8 @@
|
||||
*/
|
||||
package com.cloud.storage.secondary;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.host.HostVO;
|
||||
@ -44,5 +46,11 @@ public interface SecondaryStorageVmManager extends Manager {
|
||||
|
||||
public Pair<HostVO, SecondaryStorageVmVO> assignSecStorageVm(long zoneId, Command cmd);
|
||||
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);
|
||||
}
|
||||
|
||||
@ -68,6 +68,7 @@ import com.cloud.host.dao.HostDetailsDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.projects.Project;
|
||||
import com.cloud.projects.ProjectManager;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.storage.Snapshot;
|
||||
import com.cloud.storage.Snapshot.Status;
|
||||
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.VMTemplateDao;
|
||||
import com.cloud.storage.dao.VolumeDao;
|
||||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.user.AccountManager;
|
||||
import com.cloud.user.AccountVO;
|
||||
@ -171,7 +173,10 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
|
||||
private SwiftDao _swiftDao;
|
||||
@Inject
|
||||
private ProjectManager _projectMgr;
|
||||
|
||||
@Inject
|
||||
private SecondaryStorageVmManager _ssvmMgr;
|
||||
@Inject
|
||||
private ResourceManager _resourceMgr;
|
||||
String _name;
|
||||
private int _totalRetries;
|
||||
private int _pauseInterval;
|
||||
@ -389,7 +394,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
|
||||
if (_volsDao.getHypervisorType(volume.getId()).equals(HypervisorType.KVM)) {
|
||||
StoragePoolVO storagePool = _storagePoolDao.findById(volume.getPoolId());
|
||||
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()) {
|
||||
HostVO host = hosts.get(0);
|
||||
if (!hostSupportSnapsthot(host)) {
|
||||
@ -1026,7 +1031,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
|
||||
continue;
|
||||
}
|
||||
|
||||
List<HostVO> ssHosts = _hostDao.listSecondaryStorageHosts(dcId);
|
||||
List<HostVO> ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId);
|
||||
for ( HostVO ssHost : ssHosts ) {
|
||||
DeleteSnapshotsDirCommand cmd = new DeleteSnapshotsDirCommand(primaryStoragePoolNameLabel, ssHost.getStorageUrl(), dcId, accountId, volumeId, volume.getPath());
|
||||
Answer answer = null;
|
||||
|
||||
@ -48,6 +48,7 @@ import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.cloud.storage.Upload;
|
||||
import com.cloud.storage.Upload.Mode;
|
||||
@ -95,6 +96,8 @@ public class UploadMonitorImpl implements UploadMonitor {
|
||||
private AgentManager _agentMgr;
|
||||
@Inject
|
||||
ConfigurationDao _configDao;
|
||||
@Inject
|
||||
ResourceManager _resourceMgr;
|
||||
|
||||
private String _name;
|
||||
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 ;
|
||||
|
||||
List<HostVO> storageServers = _serverDao.listByTypeDataCenter(Host.Type.SecondaryStorage, dataCenterId);
|
||||
List<HostVO> storageServers = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.SecondaryStorage, dataCenterId);
|
||||
HostVO sserver = storageServers.get(0);
|
||||
|
||||
UploadVO uploadTemplateObj = new UploadVO(sserver.getId(), template.getId(), new Date(),
|
||||
@ -264,7 +267,7 @@ public class UploadMonitorImpl implements UploadMonitor {
|
||||
String errorString = "";
|
||||
boolean success = false;
|
||||
try{
|
||||
List<HostVO> storageServers = _serverDao.listByTypeDataCenter(Host.Type.SecondaryStorage, dataCenterId);
|
||||
List<HostVO> storageServers = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.SecondaryStorage, dataCenterId);
|
||||
if(storageServers == null ){
|
||||
errorString = "No Storage Server found at the datacenter - " +dataCenterId;
|
||||
throw new CloudRuntimeException(errorString);
|
||||
|
||||
@ -29,6 +29,7 @@ import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
||||
import com.cloud.storage.VMTemplateVO;
|
||||
import com.cloud.storage.VMTemplateZoneVO;
|
||||
import com.cloud.storage.download.DownloadMonitor;
|
||||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.db.DB;
|
||||
@ -38,6 +39,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
|
||||
public class HyervisorTemplateAdapter extends TemplateAdapterBase implements TemplateAdapter {
|
||||
private final static Logger s_logger = Logger.getLogger(HyervisorTemplateAdapter.class);
|
||||
@Inject DownloadMonitor _downloadMonitor;
|
||||
@Inject SecondaryStorageVmManager _ssvmMgr;
|
||||
|
||||
private String validateUrl(String url) {
|
||||
try {
|
||||
@ -133,10 +135,10 @@ public class HyervisorTemplateAdapter extends TemplateAdapterBase implements Tem
|
||||
if (!template.isCrossZones() && zoneId != null) {
|
||||
DataCenterVO zone = _dcDao.findById(zoneId);
|
||||
zoneName = zone.getName();
|
||||
secondaryStorageHosts = _hostDao.listSecondaryStorageHosts(zoneId);
|
||||
secondaryStorageHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
|
||||
} else {
|
||||
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);
|
||||
@ -237,7 +239,7 @@ public class HyervisorTemplateAdapter extends TemplateAdapterBase implements Tem
|
||||
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.");
|
||||
}
|
||||
|
||||
@ -248,7 +250,7 @@ public class HyervisorTemplateAdapter extends TemplateAdapterBase implements Tem
|
||||
TemplateProfile profile = super.prepareDelete(cmd);
|
||||
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.");
|
||||
}
|
||||
|
||||
|
||||
@ -97,6 +97,7 @@ import com.cloud.storage.dao.VMTemplatePoolDao;
|
||||
import com.cloud.storage.dao.VMTemplateZoneDao;
|
||||
import com.cloud.storage.dao.VolumeDao;
|
||||
import com.cloud.storage.download.DownloadMonitor;
|
||||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||
import com.cloud.storage.upload.UploadMonitor;
|
||||
import com.cloud.template.TemplateAdapter.TemplateAdapterType;
|
||||
import com.cloud.user.Account;
|
||||
@ -163,6 +164,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
|
||||
@Inject HypervisorGuruManager _hvGuruMgr;
|
||||
@Inject AccountService _accountService;
|
||||
@Inject ResourceLimitService _resourceLimitMgr;
|
||||
@Inject SecondaryStorageVmManager _ssvmMgr;
|
||||
int _primaryStorageDownloadWait;
|
||||
protected SearchBuilder<VMTemplateHostVO> HostTemplateStatesSearch;
|
||||
|
||||
@ -517,7 +519,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
|
||||
@Override
|
||||
@DB
|
||||
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 dstZoneId = dstZone.getId();
|
||||
if (dstSecHosts == null || dstSecHosts.isEmpty() ) {
|
||||
@ -905,7 +907,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
|
||||
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.");
|
||||
}
|
||||
TemplateAdapter adapter = getAdapter(template.getHypervisorType());
|
||||
|
||||
@ -145,6 +145,7 @@ import com.cloud.org.Cluster;
|
||||
import com.cloud.org.Grouping;
|
||||
import com.cloud.projects.Project;
|
||||
import com.cloud.projects.ProjectManager;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.server.Criteria;
|
||||
import com.cloud.service.ServiceOfferingVO;
|
||||
import com.cloud.service.dao.ServiceOfferingDao;
|
||||
@ -349,6 +350,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
|
||||
protected FirewallManager _firewallMgr;
|
||||
@Inject
|
||||
protected ProjectManager _projectMgr;
|
||||
@Inject
|
||||
protected ResourceManager _resourceMgr;
|
||||
|
||||
protected ScheduledExecutorService _executor = null;
|
||||
protected int _expungeInterval;
|
||||
@ -3150,7 +3153,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
|
||||
sc.setParameters("hostIdEQ", hostId);
|
||||
} else {
|
||||
if (hostName != null) {
|
||||
List<HostVO> hosts = _hostDao.findHostsLike((String) hostName);
|
||||
List<HostVO> hosts = _resourceMgr.listHostsByNameLike((String) hostName);
|
||||
if (hosts != null & !hosts.isEmpty()) {
|
||||
Long[] hostIds = new Long[hosts.size()];
|
||||
for (int i = 0; i < hosts.size(); i++) {
|
||||
|
||||
@ -107,6 +107,7 @@ import com.cloud.network.NetworkManager;
|
||||
import com.cloud.network.NetworkVO;
|
||||
import com.cloud.offering.ServiceOffering;
|
||||
import com.cloud.org.Cluster;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.service.ServiceOfferingVO;
|
||||
import com.cloud.service.dao.ServiceOfferingDao;
|
||||
import com.cloud.storage.DiskOfferingVO;
|
||||
@ -225,6 +226,9 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene
|
||||
|
||||
@Inject(adapter = HostAllocator.class)
|
||||
protected Adapters<HostAllocator> _hostAllocators;
|
||||
|
||||
@Inject
|
||||
protected ResourceManager _resourceMgr;
|
||||
|
||||
Map<VirtualMachine.Type, VirtualMachineGuru<? extends VMInstanceVO>> _vmGurus = new HashMap<VirtualMachine.Type, VirtualMachineGuru<? extends VMInstanceVO>>();
|
||||
protected StateMachine2<State, VirtualMachine.Event, VirtualMachine> _stateMachine;
|
||||
@ -760,9 +764,9 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene
|
||||
StartAnswer startAnswer = cmds.getAnswer(StartAnswer.class);
|
||||
if (startAnswer != null && startAnswer.getResult()) {
|
||||
String host_guid = startAnswer.getHost_guid();
|
||||
if (host_guid != null) {
|
||||
HostVO finalHost = _hostDao.findByGuid(host_guid);
|
||||
if (finalHost == null) {
|
||||
if( host_guid != null ) {
|
||||
HostVO finalHost = _resourceMgr.findHostByGuid(host_guid);
|
||||
if ( finalHost == null ) {
|
||||
throw new CloudRuntimeException("Host Guid " + host_guid + " doesn't exist in DB, something wrong here");
|
||||
}
|
||||
destHostId = finalHost.getId();
|
||||
|
||||
105
server/test/com/cloud/agent/MockAgentManagerImpl.java
Normal file → Executable file
105
server/test/com/cloud/agent/MockAgentManagerImpl.java
Normal file → Executable file
@ -9,6 +9,7 @@ import javax.naming.ConfigurationException;
|
||||
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.agent.manager.AgentAttache;
|
||||
import com.cloud.agent.manager.Commands;
|
||||
import com.cloud.api.commands.UpdateHostPasswordCmd;
|
||||
@ -16,6 +17,7 @@ import com.cloud.dc.DataCenterVO;
|
||||
import com.cloud.dc.HostPodVO;
|
||||
import com.cloud.dc.PodCluster;
|
||||
import com.cloud.exception.AgentUnavailableException;
|
||||
import com.cloud.exception.ConnectionException;
|
||||
import com.cloud.exception.OperationTimedoutException;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.Host.Type;
|
||||
@ -115,12 +117,6 @@ public class MockAgentManagerImpl implements AgentManager {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disconnect(long hostId, Event event, boolean investigate) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public HostStats getHostStatistics(long hostId) {
|
||||
// TODO Auto-generated method stub
|
||||
@ -151,42 +147,12 @@ public class MockAgentManagerImpl implements AgentManager {
|
||||
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
|
||||
public Pair<HostPodVO, Long> findPod(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long userId, Set<Long> avoids) {
|
||||
// TODO Auto-generated method stub
|
||||
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
|
||||
public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException {
|
||||
// TODO Auto-generated method stub
|
||||
@ -194,7 +160,7 @@ public class MockAgentManagerImpl implements AgentManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean reconnect(long hostId) throws AgentUnavailableException {
|
||||
public boolean reconnect(long hostId) {
|
||||
// TODO Auto-generated method stub
|
||||
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
|
||||
public long sendToSecStorage(HostVO ssHost, Command cmd, Listener listener) {
|
||||
// TODO Auto-generated method stub
|
||||
@ -248,16 +201,52 @@ public class MockAgentManagerImpl implements AgentManager {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateStatus(HostVO host, Event event) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
@Override
|
||||
public boolean tapLoadingAgents(Long hostId, TapAgentsAction action) {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean disconnect(long hostId) {
|
||||
// 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
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disconnectWithoutInvestigation(long hostId, Event event) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disconnectWithInvestigation(long hostId, Event event) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
370
server/test/com/cloud/agent/manager/ResourceManagerTest.java
Executable file
370
server/test/com/cloud/agent/manager/ResourceManagerTest.java
Executable 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 {
|
||||
}
|
||||
|
||||
}
|
||||
83
server/test/com/cloud/agent/manager/SearchCriteria2Test.java
Executable file
83
server/test/com/cloud/agent/manager/SearchCriteria2Test.java
Executable 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 {
|
||||
}
|
||||
|
||||
}
|
||||
12
server/test/com/cloud/cluster/CheckPointManagerTest.java
Normal file → Executable file
12
server/test/com/cloud/cluster/CheckPointManagerTest.java
Normal file → Executable file
@ -379,6 +379,18 @@ public class CheckPointManagerTest extends TestCase {
|
||||
@Override
|
||||
public boolean isAgentRebalanceEnabled() {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
19
server/test/com/cloud/network/MockNetworkManagerImpl.java
Normal file → Executable file
19
server/test/com/cloud/network/MockNetworkManagerImpl.java
Normal file → Executable file
@ -93,12 +93,6 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getActiveNicsInNetwork(long networkId) {
|
||||
// TODO Auto-generated method stub
|
||||
@ -501,4 +495,17 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
6
server/test/com/cloud/vm/MockVirtualMachineManagerImpl.java
Normal file → Executable file
6
server/test/com/cloud/vm/MockVirtualMachineManagerImpl.java
Normal file → Executable file
@ -192,4 +192,10 @@ public class MockVirtualMachineManagerImpl implements VirtualMachineManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VMInstanceVO findById(long vmId) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -702,7 +702,8 @@ CREATE TABLE `cloud`.`host` (
|
||||
`disconnected` datetime COMMENT 'Time this was disconnected',
|
||||
`created` datetime COMMENT 'date the host first signed on',
|
||||
`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`),
|
||||
INDEX `i_host__removed`(`removed`),
|
||||
INDEX `i_host__last_ping`(`last_ping`),
|
||||
|
||||
0
tools/testClient/resourceMgrTest/__init__.py
Executable file
0
tools/testClient/resourceMgrTest/__init__.py
Executable file
73
tools/testClient/resourceMgrTest/setup.py
Executable file
73
tools/testClient/resourceMgrTest/setup.py
Executable 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)
|
||||
|
||||
94
tools/testClient/resourceMgrTest/testDeploy100Host.py
Executable file
94
tools/testClient/resourceMgrTest/testDeploy100Host.py
Executable 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)
|
||||
|
||||
@ -66,4 +66,5 @@ public interface SerialVersionUID {
|
||||
public static final long NoTransitionException = Base | 0x26;
|
||||
public static final long CloudExecutionException = Base | 0x27;
|
||||
public static final long CallFailedException = Base | 0x28;
|
||||
public static final long UnableDeleteHostException = Base | 0x29;
|
||||
}
|
||||
|
||||
14
utils/src/com/cloud/utils/db/DatabaseCallbackFilter.java
Normal file → Executable file
14
utils/src/com/cloud/utils/db/DatabaseCallbackFilter.java
Normal file → Executable file
@ -28,11 +28,25 @@ public class DatabaseCallbackFilter implements CallbackFilter {
|
||||
}
|
||||
|
||||
public static boolean checkAnnotation(Method method) {
|
||||
/*Check self*/
|
||||
DB db = method.getAnnotation(DB.class);
|
||||
if (db != null) {
|
||||
return db.txn();
|
||||
}
|
||||
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 {
|
||||
db = clazz.getAnnotation(DB.class);
|
||||
if (db != null) {
|
||||
|
||||
@ -253,5 +253,10 @@ public interface GenericDao<T, ID extends Serializable> {
|
||||
boolean unlockFromLockTable(String id);
|
||||
|
||||
public <K> K getRandomlyIncreasingNextInSequence(Class<K> clazz, String name);
|
||||
|
||||
}
|
||||
|
||||
<K> SearchCriteria2 createSearchCriteria2(Class<K> resultType);
|
||||
|
||||
SearchCriteria2 createSearchCriteria2();
|
||||
|
||||
public T findOneBy(final SearchCriteria<T> sc);
|
||||
}
|
||||
|
||||
@ -851,9 +851,10 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
|
||||
assert results.size() <= 1 : "Didn't the limiting worked?";
|
||||
return results.size() == 0 ? null : results.get(0);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@DB(txn=false)
|
||||
protected T findOneBy(final SearchCriteria<T> sc) {
|
||||
public T findOneBy(final SearchCriteria<T> sc) {
|
||||
if (_removed != null) {
|
||||
sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL);
|
||||
}
|
||||
@ -1726,5 +1727,22 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
|
||||
SearchBuilder<T> builder = createSearchBuilder();
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
40
utils/src/com/cloud/utils/db/GenericSearchBuilder.java
Normal file → Executable file
40
utils/src/com/cloud/utils/db/GenericSearchBuilder.java
Normal file → Executable file
@ -24,6 +24,8 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.persistence.Transient;
|
||||
|
||||
import net.sf.cglib.proxy.Factory;
|
||||
import net.sf.cglib.proxy.MethodInterceptor;
|
||||
import net.sf.cglib.proxy.MethodProxy;
|
||||
@ -154,24 +156,26 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
|
||||
@Override
|
||||
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
|
||||
String name = method.getName();
|
||||
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?";
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@ -115,7 +115,7 @@ public class SearchCriteria<K> {
|
||||
private final Map<String, Attribute> _attrs;
|
||||
private final ArrayList<Condition> _conditions;
|
||||
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 HashMap<String, JoinBuilder<SearchCriteria<?>>> _joins;
|
||||
private final ArrayList<Select> _selects;
|
||||
@ -139,6 +139,21 @@ public class SearchCriteria<K> {
|
||||
_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) {
|
||||
this._builder = null;
|
||||
this._attrs = sb._attrs;
|
||||
|
||||
197
utils/src/com/cloud/utils/db/SearchCriteria2.java
Executable file
197
utils/src/com/cloud/utils/db/SearchCriteria2.java
Executable 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);
|
||||
}
|
||||
|
||||
}
|
||||
13
utils/src/com/cloud/utils/db/SearchCriteriaService.java
Executable file
13
utils/src/com/cloud/utils/db/SearchCriteriaService.java
Executable 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();
|
||||
}
|
||||
@ -84,7 +84,9 @@ public class MockComponentLocator extends ComponentLocator {
|
||||
s_callbacks = new Callback[] { NoOp.INSTANCE, new DatabaseCallback()};
|
||||
s_callbackFilter = new DatabaseCallbackFilter();
|
||||
s_interceptors.clear();
|
||||
resetInterceptors(interceptors);
|
||||
if (interceptors != null) {
|
||||
resetInterceptors(interceptors);
|
||||
}
|
||||
s_tl.set(this);
|
||||
parse("fake file");
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user