package io.cattle.platform.process.volume; import static io.cattle.platform.core.model.tables.StorageDriverTable.*; import static io.cattle.platform.core.model.tables.VolumeTable.*; import io.cattle.platform.core.constants.VolumeConstants; import io.cattle.platform.core.dao.StoragePoolDao; import io.cattle.platform.core.model.StorageDriver; import io.cattle.platform.core.model.Volume; 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.object.process.StandardProcess; import io.cattle.platform.object.util.DataAccessor; import io.cattle.platform.process.common.handler.AbstractObjectProcessHandler; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.lang3.StringUtils; @Named public class VolumeCreateUpdate extends AbstractObjectProcessHandler { @Inject StoragePoolDao storagePoolDao; @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Volume volume = (Volume) state.getResource(); String driver = DataAccessor.fieldString(volume, VolumeConstants.FIELD_VOLUME_DRIVER); Long driverId = volume.getStorageDriverId(); Integer deviceNum = volume.getDeviceNumber(); StorageDriver storageDriver = objectManager.loadResource(StorageDriver.class, driverId); if (storageDriver == null && StringUtils.isNotBlank(driver)) { storageDriver = objectManager.findAny(StorageDriver.class, STORAGE_DRIVER.ACCOUNT_ID, volume.getAccountId(), STORAGE_DRIVER.REMOVED, null, STORAGE_DRIVER.NAME, driver); } if (storageDriver != null) { driver = storageDriver.getName(); driverId = storageDriver.getId(); deviceNum = -1; } HandlerResult result = new HandlerResult(VolumeConstants.FIELD_VOLUME_DRIVER, driver, VOLUME.DEVICE_NUMBER, deviceNum, VOLUME.STORAGE_DRIVER_ID, driverId); Long hostId = volume.getHostId(); if (storageDriver != null && hostId != null) { if (storagePoolDao.associateVolumeToPool(volume.getId(), storageDriver.getId(), hostId) != null) { result.withShouldContinue(false) .withChainProcessName(objectProcessManager.getStandardProcessName(StandardProcess.DEACTIVATE, volume)); } } return result; } @Override public String[] getProcessNames() { return new String[] {VolumeConstants.PROCESS_CREATE, VolumeConstants.PROCESS_UPDATE}; } }