package org.zstack.test.compute.vm;
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.header.configuration.*;
import org.zstack.header.identity.AccountInventory;
import org.zstack.header.identity.SessionInventory;
import org.zstack.header.image.APIQueryImageMsg;
import org.zstack.header.image.APIQueryImageReply;
import org.zstack.header.image.ImageInventory;
import org.zstack.header.network.l3.APIQueryL3NetworkMsg;
import org.zstack.header.network.l3.APIQueryL3NetworkReply;
import org.zstack.header.network.l3.L3NetworkInventory;
import org.zstack.header.query.QueryCondition;
import org.zstack.test.Api;
import org.zstack.test.ApiSenderException;
import org.zstack.test.DBUtil;
import org.zstack.test.deployer.Deployer;
import org.zstack.test.identity.IdentityCreator;
import java.util.ArrayList;
import static org.zstack.utils.CollectionDSL.list;
/**
* 1. create resources with account1
* <p>
* confirm account 2 cannot see resources of the account 1
* <p>
* 2. share the resources to hte account 2
* <p>
* confirm account 2 can see resources of the account 1
*/
public class TestQueryVm6 {
Deployer deployer;
Api api;
ComponentLoader loader;
CloudBus bus;
DatabaseFacade dbf;
@Before
public void setUp() throws Exception {
DBUtil.reDeployDB();
deployer = new Deployer("deployerXml/vm/TestQueryVm.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 {
InstanceOfferingInventory iniov = deployer.instanceOfferings.get("TestInstanceOffering");
ImageInventory img = deployer.images.get("TestImage");
DiskOfferingInventory dov = deployer.diskOfferings.get("TestRootDiskOffering");
L3NetworkInventory l3 = deployer.l3Networks.get("TestL3Network1");
IdentityCreator identityCreator = new IdentityCreator(api);
AccountInventory a = identityCreator.createAccount("test1", "password");
SessionInventory session = identityCreator.getAccountSession();
APIQueryInstanceOfferingMsg qimsg = new APIQueryInstanceOfferingMsg();
qimsg.setConditions(new ArrayList<QueryCondition>());
APIQueryInstanceOfferingReply qir = api.query(qimsg, APIQueryInstanceOfferingReply.class, session);
Assert.assertEquals(0, qir.getInventories().size());
APIQueryDiskOfferingMsg qdmsg = new APIQueryDiskOfferingMsg();
qdmsg.setConditions(new ArrayList<QueryCondition>());
APIQueryDiskOfferingReply qdr = api.query(qdmsg, APIQueryDiskOfferingReply.class, session);
Assert.assertEquals(0, qdr.getInventories().size());
APIQueryImageMsg imgmsg = new APIQueryImageMsg();
imgmsg.setConditions(new ArrayList<QueryCondition>());
APIQueryImageReply imgr = api.query(imgmsg, APIQueryImageReply.class, session);
Assert.assertEquals(0, imgr.getInventories().size());
APIQueryL3NetworkMsg l3msg = new APIQueryL3NetworkMsg();
l3msg.setConditions(new ArrayList<QueryCondition>());
APIQueryL3NetworkReply l3r = api.query(l3msg, APIQueryL3NetworkReply.class, session);
Assert.assertEquals(0, l3r.getInventories().size());
SessionInventory sessionForAccount1 = api.loginByAccount("test", "password");
api.shareResource(list(iniov.getUuid(), img.getUuid(), dov.getUuid(), l3.getUuid()), list(a.getUuid()), false, sessionForAccount1);
qir = api.query(qimsg, APIQueryInstanceOfferingReply.class, session);
Assert.assertEquals(1, qir.getInventories().size());
qdr = api.query(qdmsg, APIQueryDiskOfferingReply.class, session);
Assert.assertEquals(1, qdr.getInventories().size());
imgr = api.query(imgmsg, APIQueryImageReply.class, session);
Assert.assertEquals(1, imgr.getInventories().size());
l3r = api.query(l3msg, APIQueryL3NetworkReply.class, session);
Assert.assertEquals(1, l3r.getInventories().size());
IdentityCreator identityCreator1 = new IdentityCreator(api);
identityCreator1.createAccount("test2", "password");
SessionInventory sessionForAccount2 = identityCreator1.getAccountSession();
qir = api.query(qimsg, APIQueryInstanceOfferingReply.class, sessionForAccount2);
Assert.assertEquals(0, qir.getInventories().size());
qdr = api.query(qdmsg, APIQueryDiskOfferingReply.class, sessionForAccount2);
Assert.assertEquals(0, qdr.getInventories().size());
imgr = api.query(imgmsg, APIQueryImageReply.class, sessionForAccount2);
Assert.assertEquals(0, imgr.getInventories().size());
l3r = api.query(l3msg, APIQueryL3NetworkReply.class, sessionForAccount2);
Assert.assertEquals(0, l3r.getInventories().size());
api.revokeAllResourceSharing(list(iniov.getUuid(), img.getUuid(), dov.getUuid(), l3.getUuid()), session);
api.shareResource(list(iniov.getUuid(), img.getUuid(), dov.getUuid(), l3.getUuid()), null, true, sessionForAccount1);
qir = api.query(qimsg, APIQueryInstanceOfferingReply.class, session);
Assert.assertEquals(1, qir.getInventories().size());
qdr = api.query(qdmsg, APIQueryDiskOfferingReply.class, session);
Assert.assertEquals(1, qdr.getInventories().size());
imgr = api.query(imgmsg, APIQueryImageReply.class, session);
Assert.assertEquals(1, imgr.getInventories().size());
l3r = api.query(l3msg, APIQueryL3NetworkReply.class, session);
Assert.assertEquals(1, l3r.getInventories().size());
qir = api.query(qimsg, APIQueryInstanceOfferingReply.class, sessionForAccount2);
Assert.assertEquals(1, qir.getInventories().size());
qdr = api.query(qdmsg, APIQueryDiskOfferingReply.class, sessionForAccount2);
Assert.assertEquals(1, qdr.getInventories().size());
imgr = api.query(imgmsg, APIQueryImageReply.class, sessionForAccount2);
Assert.assertEquals(1, imgr.getInventories().size());
l3r = api.query(l3msg, APIQueryL3NetworkReply.class, sessionForAccount2);
Assert.assertEquals(1, l3r.getInventories().size());
}
}