package org.zstack.network.service.flat;
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.kvm.KvmCommandSender;
import org.zstack.kvm.KvmResponseWrapper;
import static org.zstack.core.Platform.operr;
/**
* Created by xing5 on 2017/3/6.
*/
public class FlatDHCPDeleteNamespaceGC extends EventBasedGarbageCollector {
@GC
public FlatDhcpBackend.DeleteNamespaceCmd command;
@GC
public String hostUuid;
@Override
protected void triggerNow(GCCompletion completion) {
if (!dbf.isExist(hostUuid, HostVO.class)) {
// the host is deleted;
completion.cancel();
return;
}
new KvmCommandSender(hostUuid).send(command, FlatDhcpBackend.DHCP_DELETE_NAMESPACE_PATH,
wrapper -> {
FlatDhcpBackend.DeleteNamespaceRsp rsp = wrapper.getResponse(FlatDhcpBackend.DeleteNamespaceRsp.class);
return rsp.isSuccess() ? null : operr(rsp.getError());
},
new ReturnValueCompletion<KvmResponseWrapper>(completion) {
@Override
public void success(KvmResponseWrapper w) {
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 hostUuid.equals(d.getHostUuid()) && d.getNewStatus().equals(HostStatus.Connected.toString());
}));
onEvent(HostCanonicalEvents.HOST_DELETED_PATH, ((tokens, data) -> {
HostCanonicalEvents.HostDeletedData d = (HostCanonicalEvents.HostDeletedData) data;
return hostUuid.equals(d.getHostUuid());
}));
}
}