package io.cattle.platform.storage.service.impl;
import static io.cattle.platform.core.model.tables.StoragePoolHostMapTable.*;
import static io.cattle.platform.core.model.tables.StoragePoolTable.*;
import io.cattle.platform.core.constants.StorageDriverConstants;
import io.cattle.platform.core.constants.StoragePoolConstants;
import io.cattle.platform.core.dao.GenericResourceDao;
import io.cattle.platform.core.dao.StoragePoolDao;
import io.cattle.platform.core.model.Image;
import io.cattle.platform.core.model.StorageDriver;
import io.cattle.platform.core.model.StoragePool;
import io.cattle.platform.core.model.StoragePoolHostMap;
import io.cattle.platform.lock.LockCallbackNoReturn;
import io.cattle.platform.lock.LockManager;
import io.cattle.platform.object.ObjectManager;
import io.cattle.platform.object.util.DataAccessor;
import io.cattle.platform.storage.pool.StoragePoolDriver;
import io.cattle.platform.storage.service.StorageService;
import io.cattle.platform.storage.service.dao.ImageDao;
import io.cattle.platform.util.type.CollectionUtils;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
public class StorageServiceImpl implements StorageService {
@Inject
ObjectManager objectManager;
List<StoragePoolDriver> drivers;
@Inject
GenericResourceDao genericResourceDao;
@Inject
ImageDao imageDao;
@Inject
LockManager lockManager;
@Inject
StoragePoolDao storagePoolDao;
@Override
public Image registerRemoteImage(final String uuid) {
if (uuid == null) {
return null;
}
return populateNewRecord(uuid);
}
@Override
public boolean isValidUUID(String uuid) {
Image image = objectManager.newRecord(Image.class);
for (StoragePoolDriver driver : drivers) {
if (driver.populateImage(uuid, image)) {
return true;
}
}
return false;
}
protected Image populateNewRecord(String uuid) {
Image image = objectManager.newRecord(Image.class);
for (StoragePoolDriver driver : drivers) {
if (driver.populateImage(uuid, image)) {
break;
}
}
return genericResourceDao.createAndSchedule(image);
}
public List<StoragePoolDriver> getDrivers() {
return drivers;
}
@Inject
public void setDrivers(List<StoragePoolDriver> drivers) {
this.drivers = drivers;
}
@Override
public void setupPools(final StorageDriver storageDriver) {
String scope = DataAccessor.fieldString(storageDriver, StorageDriverConstants.FIELD_SCOPE);
if (StorageDriverConstants.SCOPE_CUSTOM.equals(scope)) {
return;
}
lockManager.lock(new StorageDriverLock(storageDriver), new LockCallbackNoReturn() {
@Override
public void doWithLockNoResult() {
setupPoolsWithLock(storageDriver);
}
});
}
protected Map<String, Object> getStoragePoolProperties(StorageDriver storageDriver) {
return objectManager.convertToPropertiesFor(StoragePool.class, CollectionUtils.asMap((Object)
STORAGE_POOL.ACCOUNT_ID, storageDriver.getAccountId(),
STORAGE_POOL.NAME, storageDriver.getName(),
STORAGE_POOL.DRIVER_NAME, storageDriver.getName(),
STORAGE_POOL.STORAGE_DRIVER_ID, storageDriver.getId(),
STORAGE_POOL.VOLUME_ACCESS_MODE,
DataAccessor.fieldString(storageDriver, StorageDriverConstants.FIELD_VOLUME_ACCESS_MODE),
StoragePoolConstants.FIELD_VOLUME_CAPABILITIES,
DataAccessor.fieldString(storageDriver, StoragePoolConstants.FIELD_VOLUME_CAPABILITIES)));
}
protected void setupPoolsWithLock(StorageDriver storageDriver) {
boolean localScope = StorageDriverConstants.SCOPE_LOCAL.equals(DataAccessor.fieldString(storageDriver, StorageDriverConstants.FIELD_SCOPE));
StoragePool globalPool = objectManager.findAny(StoragePool.class,
STORAGE_POOL.STORAGE_DRIVER_ID, storageDriver.getId(),
STORAGE_POOL.REMOVED, null);
Map<Long, Long> hostToPool = storagePoolDao.findStoragePoolHostsByDriver(storageDriver.getAccountId(),
storageDriver.getId());
for (Map.Entry<Long, Long> entry : hostToPool.entrySet()) {
Long hostId = entry.getKey();
Long storagePoolId = entry.getValue();
if (storagePoolId != null) {
continue;
}
if (localScope) {
storagePoolDao.mapNewPool(hostId, getStoragePoolProperties(storageDriver));
} else {
if (globalPool == null) {
globalPool = storagePoolDao.mapNewPool(hostId, getStoragePoolProperties(storageDriver));
} else {
genericResourceDao.createAndSchedule(StoragePoolHostMap.class,
STORAGE_POOL_HOST_MAP.HOST_ID, hostId,
STORAGE_POOL_HOST_MAP.STORAGE_POOL_ID, globalPool.getId());
}
}
}
}
}