package io.cattle.platform.iaas.api.snapshot;
import io.cattle.platform.api.action.ActionHandler;
import io.cattle.platform.core.constants.CommonStatesConstants;
import io.cattle.platform.core.model.Backup;
import io.cattle.platform.core.model.BackupTarget;
import io.cattle.platform.core.model.Snapshot;
import io.cattle.platform.object.ObjectManager;
import io.cattle.platform.object.process.ObjectProcessManager;
import io.cattle.platform.object.process.StandardProcess;
import io.cattle.platform.object.util.DataAccessor;
import io.github.ibuildthecloud.gdapi.exception.ClientVisibleException;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import io.github.ibuildthecloud.gdapi.util.ResponseCodes;
import io.github.ibuildthecloud.gdapi.validation.ValidationErrorCodes;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
public class SnapshotBackupActionHandler implements ActionHandler {
@Inject
ObjectManager objectManager;
@Inject
ObjectProcessManager processManager;
@Override
public String getName() {
return "snapshot.backup";
}
@Override
public Object perform(String name, Object obj, ApiRequest request) {
if (!(obj instanceof Snapshot)) {
return null;
}
Long targetId = DataAccessor.fromMap(request.getRequestObject()).withKey("backupTargetId").as(Long.class);
BackupTarget target = objectManager.loadResource(BackupTarget.class, targetId);
if (!CommonStatesConstants.CREATED.equalsIgnoreCase(target.getState())) {
throw new ClientVisibleException(ResponseCodes.UNPROCESSABLE_ENTITY, ValidationErrorCodes.INVALID_REFERENCE,
"BackupTarget must be in created state.", null);
}
Snapshot snapshot = (Snapshot)obj;
Backup backup = objectManager.newRecord(Backup.class);
String backupName = DataAccessor.fromMap(request.getRequestObject()).withKey("name").as(String.class);
if (StringUtils.isNotBlank(backupName)) {
backup.setName(backupName);
}
backup.setKind("backup");
backup.setAccountId(snapshot.getAccountId());
backup.setSnapshotId(snapshot.getId());
backup.setVolumeId(snapshot.getVolumeId());
backup.setBackupTargetId(targetId);
backup = objectManager.create(backup);
processManager.scheduleStandardProcess(StandardProcess.CREATE, backup, null);
return objectManager.reload(backup);
}
}