package org.zstack.test.cascade;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.zstack.core.cloudbus.CloudBus;
import org.zstack.core.componentloader.ComponentLoader;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.core.db.SimpleQuery;
import org.zstack.header.network.l3.IpRangeInventory;
import org.zstack.header.network.l3.IpRangeVO;
import org.zstack.header.network.l3.IpRangeVO_;
import org.zstack.header.network.l3.UsedIpVO;
import org.zstack.header.vm.VmInstanceInventory;
import org.zstack.header.vm.VmNicInventory;
import org.zstack.header.vm.VmNicVO;
import org.zstack.test.Api;
import org.zstack.test.ApiSenderException;
import org.zstack.test.DBUtil;
import org.zstack.test.deployer.Deployer;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* 1. delete ip range
* 2. add a new ip range
* 3. start vm
* <p>
* confirm the nic on deleted IP range gets a new IP, but other nics keep old IPs
*/
public class TestCascadeDeletion35 {
Deployer deployer;
Api api;
ComponentLoader loader;
CloudBus bus;
DatabaseFacade dbf;
@Before
public void setUp() throws Exception {
DBUtil.reDeployDB();
deployer = new Deployer("deployerXml/vm/TestCreateVm.xml");
deployer.build();
api = deployer.getApi();
loader = deployer.getComponentLoader();
bus = loader.getComponent(CloudBus.class);
dbf = loader.getComponent(DatabaseFacade.class);
}
@Test
public void test() throws ApiSenderException, InterruptedException {
SimpleQuery<IpRangeVO> q = dbf.createQuery(IpRangeVO.class);
q.add(IpRangeVO_.name, SimpleQuery.Op.EQ, "TestIpRange1");
final IpRangeVO ipr = q.find();
VmInstanceInventory vm = deployer.vms.get("TestVm");
List<VmNicVO> nics = dbf.listByPrimaryKeys(vm.getVmNics().stream().map(VmNicInventory::getUuid).collect(Collectors.toList()),
VmNicVO.class);
int nicNum = nics.size();
Optional<VmNicVO> opt = nics.stream().filter(arg -> {
UsedIpVO ip = dbf.findByUuid(arg.getUsedIpUuid(), UsedIpVO.class);
return ip.getIpRangeUuid().equals(ipr.getUuid());
}).findFirst();
Assert.assertTrue(opt.isPresent());
VmNicVO nic = opt.get();
api.deleteIpRange(ipr.getUuid());
IpRangeInventory newIpr = api.addIpRangeByCidr(ipr.getL3NetworkUuid(), "172.16.2.0/24");
VmInstanceInventory vm1 = api.startVmInstance(vm.getUuid());
Assert.assertEquals(nicNum, vm1.getVmNics().size());
for (VmNicInventory n : vm1.getVmNics()) {
if (n.getIp().equals(nic.getIp())) {
Assert.fail(String.format("VM still get an old IP(%s)", nic.getIp()));
}
}
b1:
for (VmNicInventory n : vm.getVmNics()) {
if (n.getUuid().equals(nic.getUuid())) {
continue;
}
for (VmNicInventory n1 : vm1.getVmNics()) {
if (n1.getIp().equals(n.getIp())) {
break b1;
}
}
Assert.fail(String.format("nic[uuid:%s] incorrectly lost its old IP[%s]", n.getUuid(), n.getIp()));
}
}
}