package io.cattle.platform.storage.simulator.process;
import static io.cattle.platform.core.model.tables.StoragePoolTable.*;
import io.cattle.platform.core.model.StoragePool;
import io.cattle.platform.engine.handler.HandlerResult;
import io.cattle.platform.engine.process.ProcessInstance;
import io.cattle.platform.engine.process.ProcessState;
import io.cattle.platform.lock.LockCallbackNoReturn;
import io.cattle.platform.lock.LockManager;
import io.cattle.platform.object.meta.ObjectMetaDataManager;
import io.cattle.platform.object.process.StandardProcess;
import io.cattle.platform.process.common.handler.AbstractObjectProcessHandler;
import io.cattle.platform.storage.simulator.lock.SimExtPoolCreateLock;
import javax.inject.Inject;
public class SimulatorPoolCreate extends AbstractObjectProcessHandler {
private static final String EXT_UUID = "sim-ext-pool";
private static final String KIND = "sim";
LockManager lockManager;
@Override
public String[] getProcessNames() {
return new String[] { "storagepool.create" };
}
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
final StoragePool pool = (StoragePool) state.getResource();
if (!KIND.equals(pool.getKind()) || EXT_UUID.equals(pool.getUuid())) {
return null;
}
StoragePool extPool = getExtPool();
if (extPool == null) {
lockManager.lock(new SimExtPoolCreateLock(), new LockCallbackNoReturn() {
@Override
public void doWithLockNoResult() {
StoragePool extPool = getExtPool();
if (extPool == null) {
extPool = getObjectManager().create(StoragePool.class, ObjectMetaDataManager.UUID_FIELD, EXT_UUID, ObjectMetaDataManager.KIND_FIELD,
KIND, STORAGE_POOL.ACCOUNT_ID, pool.getAccountId(), STORAGE_POOL.EXTERNAL, true);
getObjectProcessManager().executeStandardProcess(StandardProcess.CREATE, extPool, null);
}
}
});
} else {
getObjectProcessManager().executeStandardProcess(StandardProcess.CREATE, extPool, null);
}
return null;
}
protected StoragePool getExtPool() {
return getObjectManager().findOne(StoragePool.class, ObjectMetaDataManager.UUID_FIELD, EXT_UUID);
}
public LockManager getLockManager() {
return lockManager;
}
@Inject
public void setLockManager(LockManager lockManager) {
this.lockManager = lockManager;
}
}