package org.zstack.test.deployer; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.identity.SessionInventory; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.vm.VmInstanceInventory; import org.zstack.header.vm.VmNicInventory; import org.zstack.network.service.lb.LoadBalancerInventory; import org.zstack.network.service.lb.LoadBalancerListenerInventory; import org.zstack.network.service.vip.VipInventory; import org.zstack.sdk.AddVmNicToLoadBalancerAction; import org.zstack.sdk.CreateLoadBalancerAction; import org.zstack.sdk.CreateLoadBalancerListenerAction; import org.zstack.sdk.CreateVipAction; import org.zstack.test.Api; import org.zstack.test.ApiSenderException; import org.zstack.test.deployer.schema.DeployerConfig; import org.zstack.test.deployer.schema.LbConfig; import org.zstack.test.deployer.schema.LbListenerConfig; import org.zstack.utils.gson.JSONObjectUtil; import java.util.List; import static org.codehaus.groovy.runtime.InvokerHelper.asList; /** * Created by frank on 8/10/2015. */ public class DefaultLbDeployer implements LbDeployer<LbConfig> { @Override public void deploy(List<LbConfig> lbs, DeployerConfig config, Deployer deployer) throws ApiSenderException { Api api = deployer.getApi(); for (LbConfig lb : lbs) { L3NetworkInventory pl3 = deployer.l3Networks.get(lb.getPublicL3NetworkRef()); assert pl3 != null; SessionInventory session = lb.getAccountRef() == null ? deployer.getApi().getAdminSession() : deployer.loginByAccountRef(lb.getAccountRef(), config); CreateVipAction vaction = new CreateVipAction(); vaction.name = "vip"; vaction.sessionId = session.getUuid(); vaction.l3NetworkUuid = pl3.getUuid(); CreateVipAction.Result res = vaction.call().throwExceptionIfError(); VipInventory vip = JSONObjectUtil.rehashObject(res.value.getInventory(), VipInventory.class); CreateLoadBalancerAction laction = new CreateLoadBalancerAction(); laction.name = lb.getName(); laction.vipUuid = vip.getUuid(); laction.systemTags = lb.getTag(); laction.sessionId = session.getUuid(); CreateLoadBalancerAction.Result lres = laction.call().throwExceptionIfError(); LoadBalancerInventory lbinv = JSONObjectUtil.rehashObject(lres.value.getInventory(), LoadBalancerInventory.class); deployer.loadBalancers.put(lbinv.getName(), lbinv); for (LbListenerConfig lcfg : lb.getListener()) { CreateLoadBalancerListenerAction a = new CreateLoadBalancerListenerAction(); a.name = lcfg.getName(); a.description = lcfg.getDescription(); a.loadBalancerUuid = lbinv.getUuid(); a.protocol = lcfg.getProtocol(); a.instancePort = lcfg.getInstancePort().intValue(); a.loadBalancerPort = lcfg.getLoadBalancerPort().intValue(); a.sessionId = session.getUuid(); CreateLoadBalancerListenerAction.Result llres = a.call().throwExceptionIfError(); LoadBalancerListenerInventory inv = JSONObjectUtil.rehashObject(llres.value.getInventory(), LoadBalancerListenerInventory.class); deployer.loadBalancerListeners.put(inv.getName(), inv); for (String nicRef : lcfg.getVmNicRef()) { if (!nicRef.contains(":")) { throw new CloudRuntimeException(String.format("nicRef[%s] must be in format vmName:L3Ref", nicRef)); } String[] refs = nicRef.split(":"); String vmName = refs[0]; String l3Name = refs[1]; L3NetworkInventory l3 = deployer.l3Networks.get(l3Name); assert l3 != null : String.format("cannot find l3Network[name:%s]", l3Name); VmInstanceInventory vm = deployer.vms.get(vmName); assert vm != null : String.format("cannot find vm[name:%s]", vmName); VmNicInventory nic = vm.findNic(l3.getUuid()); assert nic != null : String.format("cannot find nic[l3name: %s] of vm[name:%s]", l3Name, vmName); AddVmNicToLoadBalancerAction av = new AddVmNicToLoadBalancerAction(); av.listenerUuid = inv.getUuid(); av.vmNicUuids = asList(nic.getUuid()); av.sessionId = session.getUuid(); AddVmNicToLoadBalancerAction.Result avres = av.call().throwExceptionIfError(); inv = JSONObjectUtil.rehashObject(avres.value.getInventory(), LoadBalancerListenerInventory.class); deployer.loadBalancerListeners.put(inv.getName(), inv); } deployer.loadBalancers.put(lbinv.getName(), lbinv); } } } @Override public Class getSupportedDeployerClassType() { return LbConfig.class; } }