package org.zstack.storage.primary.local;
import org.zstack.core.db.Q;
import org.zstack.core.gc.EventBasedGarbageCollector;
import org.zstack.core.gc.GC;
import org.zstack.core.gc.GCCompletion;
import org.zstack.header.core.ReturnValueCompletion;
import org.zstack.header.errorcode.ErrorCode;
import org.zstack.header.host.HostCanonicalEvents;
import org.zstack.header.host.HostStatus;
import org.zstack.header.host.HostVO;
import org.zstack.header.host.HostVO_;
import org.zstack.header.storage.primary.PrimaryStorageCanonicalEvent;
import org.zstack.header.storage.primary.PrimaryStorageVO;
import org.zstack.header.storage.primary.PrimaryStorageVO_;
import org.zstack.kvm.KvmCommandFailureChecker;
import org.zstack.kvm.KvmCommandSender;
import org.zstack.kvm.KvmResponseWrapper;
import static org.zstack.core.Platform.operr;
/**
* Created by xing5 on 2017/3/5.
*/
public class LocalStorageDeleteBitsGC extends EventBasedGarbageCollector {
@GC
public String primaryStorageUuid;
@GC
public String hostUuid;
@GC
public String installPath;
@GC
public boolean isDir;
@Override
protected void triggerNow(GCCompletion completion) {
if (!dbf.isExist(primaryStorageUuid, PrimaryStorageVO.class)) {
completion.cancel();
return;
}
if (!dbf.isExist(hostUuid, HostVO.class)) {
completion.cancel();
return;
}
LocalStorageKvmBackend.DeleteBitsCmd cmd = new LocalStorageKvmBackend.DeleteBitsCmd();
cmd.setPath(installPath);
cmd.setHostUuid(hostUuid);
cmd.storagePath = Q.New(PrimaryStorageVO.class).
eq(PrimaryStorageVO_.uuid, primaryStorageUuid).
select(PrimaryStorageVO_.url).
findValue();
String path = isDir ? LocalStorageKvmBackend.DELETE_DIR_PATH : LocalStorageKvmBackend.DELETE_BITS_PATH;
new KvmCommandSender(hostUuid).send(cmd, path,
new KvmCommandFailureChecker() {
@Override
public ErrorCode getError(KvmResponseWrapper wrapper) {
LocalStorageKvmBackend.DeleteBitsRsp rsp = wrapper.getResponse(LocalStorageKvmBackend.DeleteBitsRsp.class);
return rsp.isSuccess() ? null : operr(rsp.getError());
}
},
new ReturnValueCompletion<KvmResponseWrapper>(completion) {
@Override
public void success(KvmResponseWrapper ret) {
completion.success();
}
@Override
public void fail(ErrorCode errorCode) {
completion.fail(errorCode);
}
}
);
}
@Override
protected void setup() {
onEvent(HostCanonicalEvents.HOST_STATUS_CHANGED_PATH, ((tokens, data) -> {
HostCanonicalEvents.HostStatusChangedData d = (HostCanonicalEvents.HostStatusChangedData) data;
return d.getHostUuid().equals(hostUuid) && d.getNewStatus().equals(HostStatus.Connected.toString());
}));
onEvent(HostCanonicalEvents.HOST_DELETED_PATH, ((tokens, data) -> {
HostCanonicalEvents.HostDeletedData d = (HostCanonicalEvents.HostDeletedData) data;
return d.getHostUuid().equals(hostUuid);
}));
onEvent(PrimaryStorageCanonicalEvent.PRIMARY_STORAGE_DELETED_PATH, ((tokens, data) -> {
PrimaryStorageCanonicalEvent.PrimaryStorageDeletedData d = (PrimaryStorageCanonicalEvent.PrimaryStorageDeletedData) data;
return d.getPrimaryStorageUuid().equals(primaryStorageUuid);
}));
}
}