package io.cattle.platform.process.volume;
import static io.cattle.platform.core.model.tables.ImageStoragePoolMapTable.*;
import io.cattle.platform.core.dao.GenericMapDao;
import io.cattle.platform.core.model.Image;
import io.cattle.platform.core.model.ImageStoragePoolMap;
import io.cattle.platform.core.model.StoragePool;
import io.cattle.platform.core.model.Volume;
import io.cattle.platform.core.model.VolumeStoragePoolMap;
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.LockCallback;
import io.cattle.platform.lock.LockManager;
import io.cattle.platform.process.base.AbstractDefaultProcessHandler;
import io.cattle.platform.process.lock.ImageAssociateLock;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class VolumeActivate extends AbstractDefaultProcessHandler {
GenericMapDao mapDao;
LockManager lockManager;
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
Volume volume = (Volume) state.getResource();
Set<Long> pools = new HashSet<Long>();
for (VolumeStoragePoolMap map : mapDao.findNonRemoved(VolumeStoragePoolMap.class, Volume.class, volume.getId())) {
activatePool(volume, map, state.getData());
pools.add(map.getStoragePoolId());
}
return new HandlerResult("_activatedPools", pools);
}
protected void activatePool(Volume volume, VolumeStoragePoolMap map, Map<String, Object> data) {
Image image = getObjectManager().loadResource(Image.class, volume.getImageId());
activateImageInPool(volume, image, map.getStoragePoolId(), data);
createThenActivate(map, data);
}
protected void activateImageInPool(Volume volume, final Image image, final long poolId, Map<String, Object> data) {
if (image == null) {
return;
}
activate(image, data);
ImageStoragePoolMap map = getMap(image, poolId);
if (map == null) {
map = lockManager.lock(new ImageAssociateLock(image.getId(), poolId), new LockCallback<ImageStoragePoolMap>() {
@Override
public ImageStoragePoolMap doWithLock() {
return associate(image, poolId);
}
});
}
create(map, data);
activate(map, data);
}
protected ImageStoragePoolMap associate(Image image, long poolId) {
ImageStoragePoolMap map = getMap(image, poolId);
if (map == null) {
map = getObjectManager().create(ImageStoragePoolMap.class, IMAGE_STORAGE_POOL_MAP.STORAGE_POOL_ID, poolId, IMAGE_STORAGE_POOL_MAP.IMAGE_ID,
image.getId());
}
return map;
}
protected ImageStoragePoolMap getMap(Image image, long poolId) {
return mapDao.findNonRemoved(ImageStoragePoolMap.class, Image.class, image.getId(), StoragePool.class, poolId);
}
public GenericMapDao getMapDao() {
return mapDao;
}
@Inject
public void setMapDao(GenericMapDao mapDao) {
this.mapDao = mapDao;
}
public LockManager getLockManager() {
return lockManager;
}
@Inject
public void setLockManager(LockManager lockManager) {
this.lockManager = lockManager;
}
}