package io.cattle.platform.docker.process.dao.impl; import static io.cattle.platform.core.model.tables.VolumeStoragePoolMapTable.*; import static io.cattle.platform.core.model.tables.VolumeTable.*; import io.cattle.platform.core.constants.CommonStatesConstants; import io.cattle.platform.core.constants.VolumeConstants; 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.core.model.tables.VolumeTable; import io.cattle.platform.core.model.tables.records.VolumeRecord; import io.cattle.platform.core.util.VolumeUtils; import io.cattle.platform.db.jooq.dao.impl.AbstractJooqDao; import io.cattle.platform.docker.process.dao.DockerComputeDao; import io.cattle.platform.object.ObjectManager; import io.cattle.platform.object.util.DataAccessor; import java.util.List; import javax.inject.Inject; import org.apache.commons.lang3.StringUtils; import org.jooq.Condition; public class DockerComputeDaoImpl extends AbstractJooqDao implements DockerComputeDao { ObjectManager objectManager; @Override public Volume getDockerVolumeInPool(String volumeUri, String externalId, StoragePool storagePool) { if ( StringUtils.isEmpty(volumeUri) || storagePool == null ) throw new IllegalArgumentException("Volume URI and storage pool must have values."); Condition condition = VOLUME.URI.eq(volumeUri); if (externalId != null) { condition = condition.or(VOLUME.EXTERNAL_ID.eq(externalId).or(VOLUME.NAME.eq(externalId)).or(VOLUME.EXTERNAL_ID.eq(VolumeUtils.externalId(externalId)))); } List<VolumeRecord> volumes = create() .select(VolumeTable.VOLUME.fields()) .from(VOLUME_STORAGE_POOL_MAP) .join(VOLUME) .on(VOLUME_STORAGE_POOL_MAP.VOLUME_ID.eq(VOLUME.ID)) .where(VOLUME_STORAGE_POOL_MAP.STORAGE_POOL_ID.eq(storagePool.getId()) .and(VOLUME.REMOVED.isNull()) .and(VOLUME.STATE.ne(CommonStatesConstants.REMOVING)) .and(condition) .and(VOLUME_STORAGE_POOL_MAP.REMOVED.isNull())) .fetchInto(VolumeRecord.class); if ( volumes.isEmpty() ) return null; else if ( volumes.size() == 1 ) return volumes.get(0); else throw new IllegalStateException(String.format( "More than one volume exists for volume URI [%s] or name/externalId [%s] and storage pool [%s].", volumeUri, externalId, storagePool.getId())); } @Override public Volume createDockerVolumeInPool(Long accountId, String name, String volumeUri, String externalId, String driver, StoragePool storagePool, boolean isHostPath, boolean isNative) { Volume volume = getDockerVolumeInPool(volumeUri, externalId, storagePool); if (volume != null) { return volume; } volume = objectManager.create(Volume.class, VOLUME.ACCOUNT_ID, accountId, VOLUME.NAME, name, VOLUME.ATTACHED_STATE, CommonStatesConstants.INACTIVE, VOLUME.DEVICE_NUMBER, -1, VOLUME.ALLOCATION_STATE, CommonStatesConstants.ACTIVE, VOLUME.URI, volumeUri, VOLUME.EXTERNAL_ID, VolumeUtils.externalId(externalId)); DataAccessor.fields(volume).withKey(VolumeConstants.FIELD_DOCKER_IS_NATIVE).set(isNative); DataAccessor.fields(volume).withKey(VolumeConstants.FIELD_DOCKER_IS_HOST_PATH).set(isHostPath); DataAccessor.fields(volume).withKey(VolumeConstants.FIELD_VOLUME_DRIVER).set(driver); objectManager.persist(volume); objectManager.create(VolumeStoragePoolMap.class, VOLUME_STORAGE_POOL_MAP.VOLUME_ID, volume.getId(), VOLUME_STORAGE_POOL_MAP.STORAGE_POOL_ID, storagePool.getId()); return volume; } public ObjectManager getObjectManager() { return objectManager; } @Inject public void setObjectManager(ObjectManager objectManager) { this.objectManager = objectManager; } }