package org.zstack.test.applianceVm; 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.identity.AccountInventory; import org.zstack.header.identity.Quota; import org.zstack.header.identity.QuotaInventory; import org.zstack.header.identity.SessionInventory; import org.zstack.header.storage.snapshot.VolumeSnapshotConstant; import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; import org.zstack.header.vm.VmInstanceInventory; import org.zstack.header.vm.VmNicVO; import org.zstack.header.vm.VmNicVO_; import org.zstack.header.volume.VolumeInventory; 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.test.identity.IdentityCreator; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; import org.zstack.utils.logging.CLogger; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Created by miao on 16-9-2. */ public class TestChangeOwnerOfVm { CLogger logger = Utils.getLogger(TestChangeOwnerOfVm.class); Deployer deployer; Api api; ComponentLoader loader; CloudBus bus; DatabaseFacade dbf; SessionInventory session; @Before public void setUp() throws Exception { DBUtil.reDeployDB(); WebBeanConstructor con = new WebBeanConstructor(); deployer = new Deployer("deployerXml/vm/TestChangeOwnerOfVm.xml", con); deployer.addSpringConfig("KVMRelated.xml"); deployer.build(); api = deployer.getApi(); loader = deployer.getComponentLoader(); bus = loader.getComponent(CloudBus.class); dbf = loader.getComponent(DatabaseFacade.class); session = api.loginAsAdmin(); } @Test public void test() throws ApiSenderException { IdentityCreator identityCreator = new IdentityCreator(api); AccountInventory test = identityCreator.useAccount("test"); VmInstanceInventory vm = deployer.vms.get("TestVm"); DiskOfferingInventory dinv = deployer.diskOfferings.get("TestDataDiskOffering1"); VolumeInventory vi = api.createDataVolume("data", dinv.getUuid()); api.attachVolumeToVm(vm.getUuid(), vi.getUuid()); // create volume snapshot String volUuid = vm.getRootVolumeUuid(); VolumeSnapshotInventory inv = api.createSnapshot(volUuid, identityCreator.getAccountSession()); // share resource ArrayList<String> sharedResources = new ArrayList<>(); ArrayList<String> accountList = new ArrayList<>(); accountList.add(deployer.accounts.get("test2").getUuid()); deployer.l3Networks.forEach( (s, l3NetworkInventory) -> sharedResources.add(l3NetworkInventory.getUuid())); api.shareResource(sharedResources, accountList, false); // List<Quota.QuotaUsage> usages = api.getQuotaUsage(test.getUuid(), null); { Quota.QuotaUsage snapshotNum = CollectionUtils.find(usages, new Function<Quota.QuotaUsage, Quota.QuotaUsage>() { @Override public Quota.QuotaUsage call(Quota.QuotaUsage arg) { return VolumeSnapshotConstant.QUOTA_VOLUME_SNAPSHOT_NUM.equals(arg.getName()) ? arg : null; } }); Assert.assertNotNull(snapshotNum); QuotaInventory quotaInventory = api.getQuota( VolumeSnapshotConstant.QUOTA_VOLUME_SNAPSHOT_NUM, test.getUuid(), identityCreator.getAccountSession()); Assert.assertEquals(quotaInventory.getValue(), snapshotNum.getTotal().longValue()); Assert.assertEquals(1, snapshotNum.getUsed().longValue()); } // change owner for the same account try { api.changeResourceOwner(vm.getUuid(), identityCreator.getAccountSession().getAccountUuid()); } catch (Exception e) { } // change owner for the different account identityCreator.useAccount("test2"); String targetAccountUuid = identityCreator.getAccountSession().getAccountUuid(); api.changeResourceOwner(vm.getUuid(), targetAccountUuid); ArrayList<String> resUuids = new ArrayList<>(); resUuids.add(vm.getRootVolumeUuid()); resUuids.add(vi.getUuid()); // add vmnics of vm SimpleQuery<VmNicVO> sq = dbf.createQuery(VmNicVO.class); sq.select(VmNicVO_.uuid); sq.add(VmNicVO_.vmInstanceUuid, SimpleQuery.Op.EQ, vm.getUuid()); List<String> vmnics = sq.listValue(); if (vmnics.isEmpty()) { return; } for (String vmnicUuid : vmnics) { logger.debug("VmNic:" + vmnicUuid); resUuids.add(vmnicUuid); } // Map<String, AccountInventory> resAccMap = api.getResourceAccount(resUuids); assert (resAccMap.size() == resUuids.size()); for (AccountInventory ai : resAccMap.values()) { logger.debug("begin"); logger.debug(ai.getUuid()); logger.debug(ai.getType()); logger.debug("targetAccountUuid:" + targetAccountUuid); logger.debug("end"); assert (ai.getUuid().equals(targetAccountUuid)); } } }