mirror of
https://github.com/apache/cloudstack.git
synced 2025-11-02 20:02:29 +01:00
Cleanup of worker VMs left over from previous session in a reliable way
This commit is contained in:
parent
930cf13894
commit
ddda5fc431
@ -612,7 +612,8 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory,
|
|||||||
|
|
||||||
Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType.getType(cmd.getHypervisor());
|
Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType.getType(cmd.getHypervisor());
|
||||||
if (hypervisorType == null) {
|
if (hypervisorType == null) {
|
||||||
throw new InvalidParameterValueException("Please specify a valid hypervisor name");
|
s_logger.error("Unable to resolve " + cmd.getHypervisor() + " to a valid supported hypervisor type");
|
||||||
|
throw new InvalidParameterValueException("Unable to resolve " + cmd.getHypervisor() + " to a supported ");
|
||||||
}
|
}
|
||||||
|
|
||||||
Cluster.ClusterType clusterType = null;
|
Cluster.ClusterType clusterType = null;
|
||||||
@ -625,8 +626,8 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory,
|
|||||||
|
|
||||||
Discoverer discoverer = getMatchingDiscover(hypervisorType);
|
Discoverer discoverer = getMatchingDiscover(hypervisorType);
|
||||||
if (discoverer == null) {
|
if (discoverer == null) {
|
||||||
throw new InvalidParameterValueException(
|
|
||||||
"Please specify a valid hypervisor");
|
throw new InvalidParameterValueException("Could not find corresponding resource manager for " + cmd.getHypervisor());
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ClusterVO> result = new ArrayList<ClusterVO>();
|
List<ClusterVO> result = new ArrayList<ClusterVO>();
|
||||||
@ -664,8 +665,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory,
|
|||||||
uri = new URI(UriUtils.encodeURIComponent(url));
|
uri = new URI(UriUtils.encodeURIComponent(url));
|
||||||
if (uri.getScheme() == null) {
|
if (uri.getScheme() == null) {
|
||||||
throw new InvalidParameterValueException(
|
throw new InvalidParameterValueException(
|
||||||
"uri.scheme is null " + url
|
"uri.scheme is null " + url + ", add http:// as a prefix");
|
||||||
+ ", add http:// as a prefix");
|
|
||||||
} else if (uri.getScheme().equalsIgnoreCase("http")) {
|
} else if (uri.getScheme().equalsIgnoreCase("http")) {
|
||||||
if (uri.getHost() == null
|
if (uri.getHost() == null
|
||||||
|| uri.getHost().equalsIgnoreCase("")
|
|| uri.getHost().equalsIgnoreCase("")
|
||||||
|
|||||||
@ -8,7 +8,8 @@ import org.apache.log4j.Logger;
|
|||||||
import com.cloud.maid.dao.StackMaidDao;
|
import com.cloud.maid.dao.StackMaidDao;
|
||||||
import com.cloud.maid.dao.StackMaidDaoImpl;
|
import com.cloud.maid.dao.StackMaidDaoImpl;
|
||||||
import com.cloud.serializer.SerializerHelper;
|
import com.cloud.serializer.SerializerHelper;
|
||||||
import com.cloud.utils.ActionDelegate;
|
import com.cloud.utils.CleanupDelegate;
|
||||||
|
import com.cloud.utils.db.Transaction;
|
||||||
|
|
||||||
public class StackMaid {
|
public class StackMaid {
|
||||||
protected final static Logger s_logger = Logger.getLogger(StackMaid.class);
|
protected final static Logger s_logger = Logger.getLogger(StackMaid.class);
|
||||||
@ -43,6 +44,16 @@ public class StackMaid {
|
|||||||
public Object getContext(String key) {
|
public Object getContext(String key) {
|
||||||
return context.get(key);
|
return context.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void expungeMaidItem(long maidId) {
|
||||||
|
// this is a bit ugly, but when it is not loaded by component locator, this is just a workable way for now
|
||||||
|
Transaction txn = Transaction.open(Transaction.CLOUD_DB);
|
||||||
|
try {
|
||||||
|
maidDao.expunge(maidId);
|
||||||
|
} finally {
|
||||||
|
txn.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int push(String delegateClzName, Object context) {
|
public int push(String delegateClzName, Object context) {
|
||||||
assert(msid_setby_manager != 0) : "Fatal, make sure StackMaidManager is loaded";
|
assert(msid_setby_manager != 0) : "Fatal, make sure StackMaidManager is loaded";
|
||||||
@ -98,13 +109,15 @@ public class StackMaid {
|
|||||||
context.clear();
|
context.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void doCleanup(StackMaidVO maid) {
|
public static boolean doCleanup(StackMaidVO maid) {
|
||||||
if(maid.getDelegate() != null) {
|
if(maid.getDelegate() != null) {
|
||||||
try {
|
try {
|
||||||
Class<?> clz = Class.forName(maid.getDelegate());
|
Class<?> clz = Class.forName(maid.getDelegate());
|
||||||
Object delegate = clz.newInstance();
|
Object delegate = clz.newInstance();
|
||||||
if(delegate instanceof ActionDelegate) {
|
if(delegate instanceof CleanupDelegate) {
|
||||||
((ActionDelegate)delegate).action(SerializerHelper.fromSerializedString(maid.getContext()));
|
return ((CleanupDelegate)delegate).cleanup(SerializerHelper.fromSerializedString(maid.getContext()), maid);
|
||||||
|
} else {
|
||||||
|
assert(false);
|
||||||
}
|
}
|
||||||
} catch (final ClassNotFoundException e) {
|
} catch (final ClassNotFoundException e) {
|
||||||
s_logger.error("Unable to load StackMaid delegate class: " + maid.getDelegate(), e);
|
s_logger.error("Unable to load StackMaid delegate class: " + maid.getDelegate(), e);
|
||||||
@ -117,6 +130,9 @@ public class StackMaid {
|
|||||||
} catch (final IllegalAccessException e) {
|
} catch (final IllegalAccessException e) {
|
||||||
s_logger.error("Illegal access exception when loading resource: " + maid.getDelegate());
|
s_logger.error("Illegal access exception when loading resource: " + maid.getDelegate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -51,8 +51,8 @@ public class StackMaidManagerImpl implements StackMaidManager {
|
|||||||
|
|
||||||
private void cleanupLeftovers(List<StackMaidVO> l) {
|
private void cleanupLeftovers(List<StackMaidVO> l) {
|
||||||
for(StackMaidVO maid : l) {
|
for(StackMaidVO maid : l) {
|
||||||
StackMaid.doCleanup(maid);
|
if(StackMaid.doCleanup(maid))
|
||||||
_maidDao.expunge(maid.getId());
|
_maidDao.expunge(maid.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,13 +2,12 @@ package com.cloud.async;
|
|||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.utils.ActionDelegate;
|
public class CleanupDelegate implements com.cloud.utils.CleanupDelegate<String, Object> {
|
||||||
|
|
||||||
public class CleanupDelegate implements ActionDelegate<String> {
|
|
||||||
private static final Logger s_logger = Logger.getLogger(CleanupDelegate.class);
|
private static final Logger s_logger = Logger.getLogger(CleanupDelegate.class);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void action(String param) {
|
public boolean cleanup(String param, Object managerContext) {
|
||||||
s_logger.info("Action called with param: " + param);
|
s_logger.info("Action called with param: " + param);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
utils/src/com/cloud/utils/CleanupDelegate.java
Normal file
5
utils/src/com/cloud/utils/CleanupDelegate.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package com.cloud.utils;
|
||||||
|
|
||||||
|
public interface CleanupDelegate<T, M> {
|
||||||
|
boolean cleanup(T itemContext, M managerContext);
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user