one shot creation of factories Build phase will init the bare minimum object required to make the web request to the mgmt server
Create phase will make the actual request and fill the attributes of the entity after recieving the response This allows for one shot creation of the entity using: EntityFactory.create(apiclient) over two steps: factory = EntityFactory() entity = Entity.create(apiclient, factory) TODO: Figure out howto perform related factory creation. eg: UserFactory.create() inits AccountFactory.create() Signed-off-by: Prasanna Santhanam <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3814eb32 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3814eb32 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3814eb32 Branch: refs/heads/marvin_refactor Commit: 3814eb323128770e8bedc061daa586f6fc1b2802 Parents: d915fb2 Author: Prasanna Santhanam <[email protected]> Authored: Fri Apr 19 16:49:16 2013 +0530 Committer: Prasanna Santhanam <[email protected]> Committed: Fri Apr 19 16:49:16 2013 +0530 ---------------------------------------------------------------------- .../integration/lib/factory/AccountFactory.py | 1 + .../lib/factory/CloudStackBaseFactory.py | 24 ++++- .../marvin/integration/lib/factory/UserFactory.py | 4 +- .../integration/lib/factory/test/testFactories.py | 81 ++++++++------- 4 files changed, 71 insertions(+), 39 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3814eb32/tools/marvin/marvin/integration/lib/factory/AccountFactory.py ---------------------------------------------------------------------- diff --git a/tools/marvin/marvin/integration/lib/factory/AccountFactory.py b/tools/marvin/marvin/integration/lib/factory/AccountFactory.py index 7306073..00399e4 100644 --- a/tools/marvin/marvin/integration/lib/factory/AccountFactory.py +++ b/tools/marvin/marvin/integration/lib/factory/AccountFactory.py @@ -20,6 +20,7 @@ from marvin.integration.lib.factory.CloudStackBaseFactory import * from marvin.integration.lib.base import Account from marvin.integration.lib.utils import random_gen [email protected]_strategy(new_strategy=factory.BUILD_STRATEGY) class AccountFactory(CloudStackBaseFactory): FACTORY_FOR = Account.Account http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3814eb32/tools/marvin/marvin/integration/lib/factory/CloudStackBaseFactory.py ---------------------------------------------------------------------- diff --git a/tools/marvin/marvin/integration/lib/factory/CloudStackBaseFactory.py b/tools/marvin/marvin/integration/lib/factory/CloudStackBaseFactory.py index 57d7779..ff10754 100644 --- a/tools/marvin/marvin/integration/lib/factory/CloudStackBaseFactory.py +++ b/tools/marvin/marvin/integration/lib/factory/CloudStackBaseFactory.py @@ -16,12 +16,34 @@ # under the License. import factory +import inspect + +CREATORS = ["create", "deploy"] + class CloudStackBaseFactory(factory.Factory): ABSTRACT_FACTORY = True @classmethod - def _create(cls, target_class, *args, **kwargs): + def _build(cls, target_class, *args, **kwargs): if len(args) == 0: return target_class(kwargs) return target_class(*args, **kwargs) + + @classmethod + def _create(cls, target_class, *args, **kwargs): + if "apiclient" in kwargs: + members = inspect.getmembers(target_class, + predicate=inspect.ismethod) + creators = filter(lambda x: x[0] in CREATORS, members) + assert creators, "How do I bring this guy into existence?" + assert inspect.ismethod(creators[0][1]) + creator = creators[0][1] + apiclient = kwargs["apiclient"] + clean_kwargs = dict((k, v) for k, v in kwargs.iteritems() + if k != "apiclient") + return creator(apiclient, factory=cls._build(target_class, + *args, **clean_kwargs) + ) + else: + cls._build(target_class, *args, **kwargs) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3814eb32/tools/marvin/marvin/integration/lib/factory/UserFactory.py ---------------------------------------------------------------------- diff --git a/tools/marvin/marvin/integration/lib/factory/UserFactory.py b/tools/marvin/marvin/integration/lib/factory/UserFactory.py index 1b13b8b..84218c1 100644 --- a/tools/marvin/marvin/integration/lib/factory/UserFactory.py +++ b/tools/marvin/marvin/integration/lib/factory/UserFactory.py @@ -23,7 +23,7 @@ class UserFactory(CloudStackBaseFactory): FACTORY_FOR = User.User - account = factory.SubFactory(AccountFactory).factory() + account = factory.RelatedFactory(AccountFactory).factory() email = account.email firstname = account.firstname lastname = account.lastname @@ -31,4 +31,4 @@ class UserFactory(CloudStackBaseFactory): username = account.username class AdminUserFactory(UserFactory): - account = factory.SubFactory(AccountFactory, accounttype=1).factory() + account = factory.RelatedFactory(AccountFactory, accounttype=1).factory() http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3814eb32/tools/marvin/marvin/integration/lib/factory/test/testFactories.py ---------------------------------------------------------------------- diff --git a/tools/marvin/marvin/integration/lib/factory/test/testFactories.py b/tools/marvin/marvin/integration/lib/factory/test/testFactories.py index cb7165f..41217d2 100644 --- a/tools/marvin/marvin/integration/lib/factory/test/testFactories.py +++ b/tools/marvin/marvin/integration/lib/factory/test/testFactories.py @@ -39,34 +39,46 @@ from marvin.integration.lib.base.VirtualMachine import VirtualMachine from marvin.integration.lib.factory.UserFactory import * from marvin.integration.lib.base.User import User -class AccountFactoryTest(unittest.TestCase): + +class BuildVsCreateStrategyTest(unittest.TestCase): def setUp(self): self.apiClient = cloudstackTestClient(mgtSvr='localhost', logging=logging.getLogger('factories.cloudstack')).getApiClient() - def test_userAccountFactory(self): + def tearDown(self): + pass + + def test_buildAccountFactory(self): af = AccountFactory() - accnt = Account.create(apiclient=self.apiClient, AccountFactory=af) - self.assertTrue(accnt is not None, msg="no account created by factory") - self.assertEqual(accnt.name, af.username, msg="account names are not same") + self.assert_(af.username is not None, msg="Acount factory didn't initialize") + + def test_createAccountFactory(self): + af = AccountFactory.create(apiclient=self.apiClient) + self.assert_(isinstance(af, Account)) + self.assert_(af.account.id is not None, msg="Account creation failed") + self.assert_(af.account.domain is not None, msg="Account belongs to no domain") + + +class AccountFactoryTest(unittest.TestCase): + def setUp(self): + self.apiClient = cloudstackTestClient(mgtSvr='localhost', logging=logging.getLogger('factories.cloudstack')).getApiClient() def test_adminAccountFactory(self): - af = AdminAccountFactory() - accnt = Account.create(apiclient=self.apiClient, AccountFactory=af) - self.assertTrue(accnt is not None, msg="no account created by factory") - self.assertEqual(accnt.name, af.username, msg="account names are not same") + accnt = AdminAccountFactory.create(apiclient=self.apiClient) + self.assert_(accnt is not None, msg="no account created by factory") + self.assert_(accnt.account.name is not None) def test_userAccountFactoryCustomArgs(self): - af = AccountFactory(firstname='test', lastname='test') - accnt = Account.create(apiclient=self.apiClient, AccountFactory=af) - self.assertTrue(accnt is not None, msg="no account created by factory") - self.assertEqual(accnt.name, af.username, msg="account names are not same") + accnt = AccountFactory.create(apiclient=self.apiClient, firstname='test', lastname='test') + a = accnt.list(apiclient=self.apiClient, account=accnt.account.username, domainid=accnt.account.domainid) + self.assert_(accnt is not None, msg="no account created by factory") + self.assert_(accnt.account.name is not None) @unittest.skip("Job Queue gets stuck on this") def test_disableAccountPostFactoryGeneration(self): af = DomainAdminFactory() - domadmin = Account.create(apiclient=self.apiClient, AccountFactory=af) - self.assertTrue(domadmin is not None, msg="no account was created") - self.assertEqual(domadmin.name, af.username, msg = "account names don't match") + domadmin = DomainAdminFactory.create(apiclient=self.apiClient, factory=af) + self.assert_(domadmin is not None, msg="no account was created") + self.assert_(domadmin.account.name, af.username, msg = "account names don't match") domadmin.disable(self.apiClient, lock=True) def tearDown(self): @@ -78,10 +90,9 @@ class ServiceOfferingFactoryTest(unittest.TestCase): self.apiClient = cloudstackTestClient(mgtSvr='localhost', logging=logging.getLogger('factories.cloudstack')).getApiClient() def test_serviceOfferingFactory(self): - sf = ServiceOfferingFactory() - soffering = ServiceOffering.create(apiclient=self.apiClient, ServiceOfferingFactory=sf) - self.assertTrue(soffering is not None, msg="no service offering was created") - self.assertEqual(soffering.name, sf.name, msg="error in service offering factory creation") + soffering = ServiceOfferingFactory.create(apiclient=self.apiClient) + self.assert_(soffering is not None, msg="no service offering was created") + self.assert_(soffering.name is not None, msg="error in service offering factory creation") def tearDown(self): @@ -93,19 +104,18 @@ class NetworkOfferingFactoryTest(unittest.TestCase): self.apiClient = cloudstackTestClient(mgtSvr='localhost', logging=logging.getLogger('factories.cloudstack')).getApiClient() def test_defaultSourceNatOfferingFactory(self): - snatOfferingFactory = DefaultIsolatedNetworkOfferingWithSourceNatServiceFactory() - snatOffering = NetworkOffering.create(apiclient=self.apiClient, NetworkOfferingFactory=snatOfferingFactory) - self.assertTrue(snatOffering is not None, msg = "no network offering was created") - self.assertEqual(snatOffering.name, snatOfferingFactory.name, msg="error in network offering factory creation") + snatOffering = DefaultIsolatedNetworkOfferingWithSourceNatServiceFactory.create(apiclient=self.apiClient) + self.assert_(snatOffering is not None, msg = "no network offering was created") + self.assert_(snatOffering.name is not None, msg="error in network offering creation") def test_defaultSGOfferingEnable(self): - sgOfferingFactory = DefaultSharedNetworkOfferingWithSGServiceFactory() - sgOffering = NetworkOffering.create(apiclient=self.apiClient, NetworkOfferingFactory=sgOfferingFactory) + sgOffering = DefaultSharedNetworkOfferingWithSGServiceFactory.create(apiclient=self.apiClient) sgOffering.update(self.apiClient, state='Enabled') def tearDown(self): pass + class VirtualMachineFactoryTest(unittest.TestCase): def setUp(self): self.apiClient = cloudstackTestClient(mgtSvr='localhost', logging=logging.getLogger('factories.cloudstack')).getApiClient() @@ -114,13 +124,14 @@ class VirtualMachineFactoryTest(unittest.TestCase): pass def test_virtualMachineDeploy(self): - sf = ServiceOfferingFactory() + sf = SmallServiceOfferingFactory() tf = DefaultBuiltInTemplateFactory() + service = ServiceOffering.create(apiclient=self.apiClient, factory=sf) zones = Zone.list(apiclient=self.apiClient) template = get_template(apiclient=self.apiClient, zoneid = zones[0].id, ostype=tf.ostype) - vmf = VirtualMachineFactory(serviceofferingid = sf.id, templateid = template.id, zoneid = zones[0].id) + vmf = VirtualMachineFactory(serviceofferingid = service.id, templateid = template.id, zoneid = zones[0].id) + vm = VirtualMachine.deploy(apiclient=self.apiClient, factory=vmf) - vm = VirtualMachine.create(apiclient=self.apiClient, VirtualMachineFactory=vmf) class UserFactorySubFactoryTest(unittest.TestCase): def setUp(self): @@ -130,10 +141,8 @@ class UserFactorySubFactoryTest(unittest.TestCase): pass def test_userSubFactory(self): - uf = UserFactory() - account = AccountFactory.create(apiclient=self.apiClient, AccountFactory=uf.account) - self.assertTrue(account is not None, msg="no account was created") - users = User.list(apiclient=self.apiClient, account=account.name) - self.assertTrue(users is not None, msg="no users were found in the account") - self.assertTrue(len(users) > 0, msg="user list is empty") - self.assertEqual(users[0].username, uf.username, msg="usernames are not same") + uf = UserFactory.create(apiclient=self.apiClient) + user = User.list(apiclient=self.apiClient, username=uf.username) + self.assert_(uf.username == user[0].username, msg="Usernames don't match") + +
