package org.zstack.network.service.vip;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.zstack.core.cloudbus.CloudBus;
import org.zstack.core.cloudbus.CloudBusCallBack;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.header.core.Completion;
import org.zstack.header.core.ReturnValueCompletion;
import org.zstack.header.errorcode.OperationFailureException;
import org.zstack.header.message.MessageReply;
import org.zstack.utils.DebugUtils;
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE)
public class Vip {
@Autowired
private CloudBus bus;
@Autowired
private DatabaseFacade dbf;
public Vip(String uuid) {
this.uuid = uuid;
}
private String uuid;
private String serviceProvider;
private String useFor;
private String peerL3NetworkUuid;
public String getServiceProvider() {
return serviceProvider;
}
public void setServiceProvider(String serviceProvider) {
this.serviceProvider = serviceProvider;
}
public String getUseFor() {
return useFor;
}
public void setUseFor(String useFor) {
this.useFor = useFor;
}
public String getPeerL3NetworkUuid() {
return peerL3NetworkUuid;
}
public void setPeerL3NetworkUuid(String peerL3NetworkUuid) {
this.peerL3NetworkUuid = peerL3NetworkUuid;
}
public void acquire(boolean createOnBackend, Completion completion) {
if (createOnBackend) {
DebugUtils.Assert(serviceProvider != null, "serviceProvider cannot be null");
DebugUtils.Assert(peerL3NetworkUuid != null, "peerL3NetworkUuid cannot be null");
}
AcquireVipMsg msg = new AcquireVipMsg();
msg.setVipUuid(uuid);
msg.setServiceProvider(serviceProvider);
msg.setPeerL3NetworkUuid(peerL3NetworkUuid);
msg.setCreateOnBackend(createOnBackend);
if (useFor != null) {
msg.setUseFor(useFor);
}
bus.makeTargetServiceIdByResourceUuid(msg, VipConstant.SERVICE_ID, uuid);
bus.send(msg, new CloudBusCallBack(completion) {
@Override
public void run(MessageReply reply) {
if (!reply.isSuccess()) {
throw new OperationFailureException(reply.getError());
}
completion.success();
}
});
}
public void acquire(Completion completion) {
acquire(true, completion);
}
public void release(Completion completion) {
release(true, completion);
}
public void release(boolean deleteOnBackend, Completion completion) {
ReleaseVipMsg msg = new ReleaseVipMsg();
msg.setVipUuid(uuid);
msg.setPeerL3NetworkUuid(null);
msg.setUseFor(null);
if (!deleteOnBackend) {
msg.setServiceProvider(null);
}
msg.setDeleteOnBackend(deleteOnBackend);
bus.makeTargetServiceIdByResourceUuid(msg, VipConstant.SERVICE_ID, uuid);
bus.send(msg, new CloudBusCallBack(completion) {
@Override
public void run(MessageReply reply) {
if (!reply.isSuccess()) {
throw new OperationFailureException(reply.getError());
}
completion.success();
}
});
}
public void deleteFromBackend(Completion completion) {
DeleteVipFromBackendMsg msg = new DeleteVipFromBackendMsg();
msg.setVipUuid(uuid);
bus.makeTargetServiceIdByResourceUuid(msg, VipConstant.SERVICE_ID, uuid);
bus.send(msg, new CloudBusCallBack(completion) {
@Override
public void run(MessageReply reply) {
if (!reply.isSuccess()) {
completion.fail(reply.getError());
} else {
completion.success();
}
}
});
}
public void modify(ModifyVipAttributesStruct s, ReturnValueCompletion<UnmodifyVip> completion) {
ModifyVipAttributesMsg msg = new ModifyVipAttributesMsg();
msg.setStruct(s);
msg.setVipUuid(uuid);
bus.makeTargetServiceIdByResourceUuid(msg, VipConstant.SERVICE_ID, uuid);
bus.send(msg, new CloudBusCallBack(completion) {
@Override
public void run(MessageReply reply) {
if (!reply.isSuccess()) {
throw new OperationFailureException(reply.getError());
}
ModifyVipAttributesReply r = reply.castReply();
UnmodifyVip ret = c -> {
ModifyVipAttributesMsg umsg = new ModifyVipAttributesMsg();
umsg.setStruct(r.getStruct());
umsg.setVipUuid(uuid);
bus.makeTargetServiceIdByResourceUuid(umsg, VipConstant.SERVICE_ID, uuid);
bus.send(umsg, new CloudBusCallBack(c) {
@Override
public void run(MessageReply reply1) {
if (!reply1.isSuccess()) {
c.fail(reply1.getError());
return;
}
c.success();
}
});
};
completion.success(ret);
}
});
}
}