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.KVMAgentCommands;
import org.zstack.kvm.KvmCommandFailureChecker;
import org.zstack.kvm.KvmCommandSender;
import org.zstack.kvm.KvmResponseWrapper;
import static org.zstack.core.Platform.operr;
import java.util.List;
/**
* Created by xing5 on 2017/3/6.
*/
public class FlatEipGC extends EventBasedGarbageCollector {
@GC
public List<FlatEipBackend.EipTO> eips;
@GC
public String hostUuid;
@Override
protected void triggerNow(GCCompletion completion) {
if (!dbf.isExist(hostUuid, HostVO.class)) {
completion.cancel();
return;
}
FlatEipBackend.BatchDeleteEipCmd cmd = new FlatEipBackend.BatchDeleteEipCmd();
cmd.eips = eips;
new KvmCommandSender(hostUuid).send(cmd, FlatEipBackend.BATCH_DELETE_EIP_PATH,
new KvmCommandFailureChecker() {
@Override
public ErrorCode getError(KvmResponseWrapper wrapper) {
KVMAgentCommands.AgentResponse rsp = wrapper.getResponse(KVMAgentCommands.AgentResponse.class);
return rsp.isSuccess() ? null : operr(rsp.getError());
}
},
new ReturnValueCompletion<KvmResponseWrapper>(completion) {
@Override
public void success(KvmResponseWrapper returnValue) {
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());
}));
}
}