package org.zstack.test.tag;
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.configuration.DiskOfferingInventory;
import org.zstack.header.image.APIQueryImageMsg;
import org.zstack.header.image.APIQueryImageReply;
import org.zstack.header.image.ImageInventory;
import org.zstack.header.image.ImageVO;
import org.zstack.header.network.l3.L3NetworkInventory;
import org.zstack.header.query.QueryOp;
import org.zstack.header.storage.backup.BackupStorageInventory;
import org.zstack.header.tag.SystemTagVO;
import org.zstack.header.tag.SystemTagVO_;
import org.zstack.header.tag.TagDefinition;
import org.zstack.header.tag.TagInventory;
import org.zstack.header.vm.VmInstanceInventory;
import org.zstack.header.vm.VmInstanceVO;
import org.zstack.header.vm.VmInstanceVO_;
import org.zstack.tag.SystemTag;
import org.zstack.tag.TagSubQueryExtension;
import org.zstack.test.Api;
import org.zstack.test.ApiSenderException;
import org.zstack.test.DBUtil;
import org.zstack.test.WebBeanConstructor;
import org.zstack.test.deployer.Deployer;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
*/
public class TestQemuAgentSystemTag {
protected static final CLogger logger = Utils.getLogger(TestQemuAgentSystemTag.class);
Deployer deployer;
Api api;
ComponentLoader loader;
CloudBus bus;
DatabaseFacade dbf;
@TagDefinition
public static class TestSystemTags {
public static SystemTag qemu = new SystemTag("qemuga", ImageVO.class);
public static SystemTag qemu_failed = new SystemTag("qemuga::", ImageVO.class);
}
@Before
public void setUp() throws Exception {
DBUtil.reDeployDB();
WebBeanConstructor con = new WebBeanConstructor();
deployer = new Deployer("deployerXml/tag/TestQemuAgentTag.xml", con);
deployer.build();
api = deployer.getApi();
loader = deployer.getComponentLoader();
bus = loader.getComponent(CloudBus.class);
dbf = loader.getComponent(DatabaseFacade.class);
}
@Test
public void test() throws ApiSenderException {
ImageInventory image1 = deployer.images.get("Image_1");
TagInventory inv = api.createSystemTag(image1.getUuid(), TestSystemTags.qemu.getTagFormat(), ImageVO.class);
APIQueryImageMsg imsg = new APIQueryImageMsg();
imsg.addQueryCondition(TagSubQueryExtension.SYS_TAG_NAME, QueryOp.EQ, TestSystemTags.qemu.getTagFormat());
APIQueryImageReply ireply = api.query(imsg, APIQueryImageReply.class);
List<ImageInventory> images = ireply.getInventories();
Assert.assertEquals(1, images.size());
ImageInventory iinv = images.get(0);
Assert.assertEquals(image1.getUuid(), iinv.getUuid());
Assert.assertEquals(TestSystemTags.qemu.getTag(iinv.getUuid()), TestSystemTags.qemu.getTagFormat());
// make sure vm and image have the same system-tags
VmInstanceInventory testvm = createVmFromImage(deployer.vms.get("Vm_1"));
String tag = getResourceUuidTag(testvm.getUuid());
Assert.assertEquals(tag, TestSystemTags.qemu.getTagFormat());
// make sure vm and the generate-image carry off the SystemTags while clone vm
VmInstanceInventory clonevm = createVmFromClone(deployer.vms.get("Vm_1"));
tag = getResourceUuidTag(clonevm.getUuid());
// check the vm have tag
Assert.assertEquals(TestSystemTags.qemu.getTagFormat(), tag);
SimpleQuery<VmInstanceVO> pqv = dbf.createQuery(VmInstanceVO.class);
pqv.add(VmInstanceVO_.uuid, SimpleQuery.Op.EQ, clonevm.getUuid());
VmInstanceVO cloned = pqv.find();
String rootImageUuid = cloned.getRootVolume().getRootImageUuid();
// check the image have tag
tag = getResourceUuidTag(rootImageUuid);
Assert.assertEquals(TestSystemTags.qemu.getTagFormat(), tag);
BackupStorageInventory bs = deployer.backupStorages.get("sftp");
List<String> bsUuids = Collections.singletonList(bs.getUuid());
logger.debug(cloned.getRootVolume().getUuid());
// ImageInventory commitedImage = api.commitVolumeAsImage(testvm.getRootVolumeUuid(), "test-commit-image", bsUuids);
// // check the commited-image have tag
// tag = getResourceUuidTag(commitedImage.getUuid());
// Assert.assertEquals(TestSystemTags.qemu.getTagFormat(), tag);
api.deleteTag(inv.getUuid());
SystemTagVO tvo = dbf.findByUuid(inv.getUuid(), SystemTagVO.class);
Assert.assertNull(tvo);
}
String getResourceUuidTag(String resourceUuid) {
SimpleQuery<SystemTagVO> pq = dbf.createQuery(SystemTagVO.class);
pq.select(SystemTagVO_.tag);
pq.add(SystemTagVO_.resourceUuid, SimpleQuery.Op.EQ, resourceUuid);
String tag = pq.findValue();
return tag;
}
VmInstanceInventory createVmFromImage(VmInstanceInventory vm) throws ApiSenderException {
List<DiskOfferingInventory> dinvs = api.listDiskOffering(null);
List<L3NetworkInventory> nwinvs = api.listL3Network(null);
List<String> nws = new ArrayList<String>(nwinvs.size());
Assert.assertNotNull(vm);
nws.add(vm.getDefaultL3NetworkUuid());
List<String> disks = new ArrayList<String>(1);
disks.add(dinvs.get(1).getUuid());
Assert.assertNotNull(dinvs.get(0));
Assert.assertNotNull(nws.get(0));
Assert.assertNotNull(disks.get(0));
VmInstanceInventory testvm = api.createVmByFullConfig(vm, dinvs.get(0).getUuid(), nws, disks);
return testvm;
}
VmInstanceInventory createVmFromClone(VmInstanceInventory vm) throws ApiSenderException {
return api.createVmFromClone(vm);
}
}