You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ts...@apache.org on 2013/11/18 09:50:12 UTC

[05/50] [abbrv] git commit: updated refs/heads/marvin_refactor to b784012

marvin_refactor: Some renames to organize data and entities

Signed-off-by: Prasanna Santhanam <ts...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/526a9d60
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/526a9d60
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/526a9d60

Branch: refs/heads/marvin_refactor
Commit: 526a9d6043c97b1dc6f3f4864bff9ea9aa3c71b8
Parents: 6a260ce
Author: Prasanna Santhanam <ts...@apache.org>
Authored: Tue Sep 3 21:55:57 2013 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Thu Oct 31 13:54:21 2013 +0530

----------------------------------------------------------------------
 tools/marvin/marvin/base/CloudStackEntity.py    | 25 -------
 tools/marvin/marvin/base/__init__.py            | 16 -----
 tools/marvin/marvin/codegenerator.py            |  2 +-
 tools/marvin/marvin/cs_entity_generator.py      | 45 +++++-------
 tools/marvin/marvin/data/__init__.py            | 16 -----
 tools/marvin/marvin/data/account.py             | 38 ----------
 tools/marvin/marvin/data/cluster.py             | 30 --------
 tools/marvin/marvin/data/diskoffering.py        | 34 ---------
 tools/marvin/marvin/data/firewallrule.py        | 30 --------
 tools/marvin/marvin/data/host.py                | 31 ---------
 tools/marvin/marvin/data/networkoffering.py     | 73 --------------------
 tools/marvin/marvin/data/serviceoffering.py     | 27 --------
 tools/marvin/marvin/data/template.py            | 25 -------
 tools/marvin/marvin/data/user.py                | 50 --------------
 tools/marvin/marvin/data/vm.py                  | 34 ---------
 tools/marvin/marvin/data/zone.py                | 33 ---------
 tools/marvin/marvin/entity/__init__.py          | 16 +++++
 tools/marvin/marvin/entity/cloudstackentity.py  | 25 +++++++
 tools/marvin/marvin/factory/data/__init__.py    | 16 +++++
 tools/marvin/marvin/factory/data/account.py     | 38 ++++++++++
 tools/marvin/marvin/factory/data/cluster.py     | 30 ++++++++
 .../marvin/marvin/factory/data/diskoffering.py  | 34 +++++++++
 .../marvin/marvin/factory/data/firewallrule.py  | 30 ++++++++
 tools/marvin/marvin/factory/data/host.py        | 31 +++++++++
 .../marvin/factory/data/networkoffering.py      | 73 ++++++++++++++++++++
 .../marvin/factory/data/serviceoffering.py      | 27 ++++++++
 tools/marvin/marvin/factory/data/template.py    | 25 +++++++
 tools/marvin/marvin/factory/data/user.py        | 50 ++++++++++++++
 tools/marvin/marvin/factory/data/vm.py          | 34 +++++++++
 tools/marvin/marvin/factory/data/zone.py        | 33 +++++++++
 tools/marvin/marvin/test/test_factories.py      | 42 ++++-------
 tools/marvin/marvin/utils.py                    |  2 +-
 tools/marvin/pom.xml                            |  2 +-
 tools/marvin/setup.py                           |  3 +-
 34 files changed, 498 insertions(+), 522 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/base/CloudStackEntity.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/CloudStackEntity.py b/tools/marvin/marvin/base/CloudStackEntity.py
deleted file mode 100644
index b7091de..0000000
--- a/tools/marvin/marvin/base/CloudStackEntity.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-cloudstack_version = "4.2.0"
-
-class CloudStackEntity(object):
-
-    __version__ = cloudstack_version
-
-    def getVersion(self):
-        return self.__version__

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/base/__init__.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/__init__.py b/tools/marvin/marvin/base/__init__.py
deleted file mode 100644
index 13a8339..0000000
--- a/tools/marvin/marvin/base/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/codegenerator.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/codegenerator.py b/tools/marvin/marvin/codegenerator.py
index 3607436..2a6f50d 100644
--- a/tools/marvin/marvin/codegenerator.py
+++ b/tools/marvin/marvin/codegenerator.py
@@ -487,4 +487,4 @@ response=json' % options.endpoint
 
     if options.entity:
         entities = get_actionable_entities()
-        write_entity_classes(entities, "base")
+        write_entity_classes(entities, "entity")

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/cs_entity_generator.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/cs_entity_generator.py b/tools/marvin/marvin/cs_entity_generator.py
index b2cf3c5..c3cda0c 100644
--- a/tools/marvin/marvin/cs_entity_generator.py
+++ b/tools/marvin/marvin/cs_entity_generator.py
@@ -261,9 +261,8 @@ def write_entity_classes(entities, module=None):
     for entity, actions in entities.iteritems():
         body = []
         imports = []
-        imports.append('from CloudStackEntity import CloudStackEntity')
+        imports.append('from cloudstackentity import CloudStackEntity')
         body.append('class %s(CloudStackEntity):' % entity)
-        #TODO: Add docs for entity
         body.append('\n\n')
         body.append(tabspace + 'def __init__(self, items):')
         body.append(tabspace * 2 + 'self.__dict__.update(items)')
@@ -280,6 +279,7 @@ def write_entity_classes(entities, module=None):
                         action, ', '.join(list(set(no_id_args)))))
                 else:
                     body.append(tabspace + 'def %s(self, apiclient, **kwargs):' % (action))
+                #TODO: Add docs for entity
                 # doc to explain what possible args go into **kwargs
                 body.append(tabspace * 2 + '"""Placeholder for docstring')
                 body.append(tabspace * 2 + 'optional arguments (**kwargs): [%s]"""' % ', '.join(details['optionals']))
@@ -335,7 +335,7 @@ def write_entity_classes(entities, module=None):
             os.makedirs("%s" % module_path)
         with open("%s/__init__.py" % (module_path), "w") as writer:
             writer.write(LICENSE)
-        with open("%s/%s.py" % (module_path, entity), "w") as writer:
+        with open("%s/%s.py" % (module_path, entity.lower()), "w") as writer:
             writer.write(LICENSE)
             writer.write(code)
 
@@ -365,31 +365,20 @@ def write_entity_factory(entity, actions, module=None):
     if not os.path.exists(module_path):
         os.makedirs(module_path)
 
-    if os.path.exists("%s/%sFactory.py" % (module_path, entity)):
-        for arg in factory_defaults:
-            code += tabspace + '%s = None\n' % arg
-        with open("%s/%sFactory.py" % (module_path, entity), "r") as reader:
-            rcode = reader.read()
-            if rcode.find(code) > 0:
-                return
-        with open("%s/%sFactory.py" % (module_path, entity), "a") as writer:
-            writer.write(code)
-    else:
-        code += 'import factory\n'
-        code += 'from marvin.base import %s\n' % entity
-        code += 'from CloudStackBaseFactory import CloudStackBaseFactory'
-        code += '\n'
-        code += 'class %sFactory(CloudStackBaseFactory):' % entity
-        code += '\n\n'
-        code += tabspace + 'FACTORY_FOR = %s.%s\n\n' % (entity, entity)
-        for arg in factory_defaults:
-            code += tabspace + '%s = None\n' % arg
-        with open("%s/__init__.py" % (module_path), "w") as writer:
-            writer.write(LICENSE)
-        with open("%s/%sFactory.py" % (module_path, entity), "w") as writer:
-            writer.write(LICENSE)
-            writer.write(code)
+    code += 'from marvin.entity.%s import %s\n' % (entity.lower(), entity)
+    code += 'from cloudstackbasefactory import CloudStackBaseFactory'
+    code += '\n'
+    code += 'class %sFactory(CloudStackBaseFactory):' % entity
+    code += '\n\n'
+    code += tabspace + 'FACTORY_FOR = %s\n\n' % entity
+    for arg in factory_defaults:
+        code += tabspace + '%s = None\n' % arg
+    with open("%s/__init__.py" % (module_path), "w") as writer:
+        writer.write(LICENSE)
+    with open("%s/%s.py" % (module_path, entity.lower()), "w") as writer:
+        writer.write(LICENSE)
+        writer.write(code)
 
 if __name__ == '__main__':
     entities = get_actionable_entities()
-    write_entity_classes(entities, 'base')
+    write_entity_classes(entities, 'entity')

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/__init__.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/__init__.py b/tools/marvin/marvin/data/__init__.py
deleted file mode 100644
index d216be4..0000000
--- a/tools/marvin/marvin/data/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/account.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/account.py b/tools/marvin/marvin/data/account.py
deleted file mode 100644
index 1041cfe..0000000
--- a/tools/marvin/marvin/data/account.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import factory
-from marvin.factory.AccountFactory import AccountFactory
-from marvin.utils import random_gen
-
-class UserAccountFactory(AccountFactory):
-
-    accounttype = 0
-    firstname = factory.Sequence(lambda n: random_gen())
-    lastname = factory.Sequence(lambda n: random_gen())
-    email = factory.LazyAttribute(lambda e: '{0}.{1}@cloudstack.org'.format(e.firstname, e.lastname).lower())
-    username = factory.Sequence(lambda n: random_gen())
-    password = 'password'
-
-
-class AdminAccountFactory(UserAccountFactory):
-    accounttype = 1
-
-
-class DomainAdminFactory(UserAccountFactory):
-    accounttype = 2
-    domainid = None

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/cluster.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/cluster.py b/tools/marvin/marvin/data/cluster.py
deleted file mode 100644
index f4641cf..0000000
--- a/tools/marvin/marvin/data/cluster.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import factory
-from marvin.utils import random_gen
-from marvin.factory.ClusterFactory import ClusterFactory
-
-class XenClusterFactory(ClusterFactory):
-    clustername = factory.Sequence(lambda n: "xencluster" + random_gen())
-    clustertype = "XenServer"
-    hypervisor = "XenServer"
-
-class KvmClusterFactory(ClusterFactory):
-    clustername = factory.Sequence(lambda n: "kvmcluster" + random_gen())
-    clustertype = "KVM"
-    hypervisor = "KVM"

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/diskoffering.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/diskoffering.py b/tools/marvin/marvin/data/diskoffering.py
deleted file mode 100644
index 88ae7cb..0000000
--- a/tools/marvin/marvin/data/diskoffering.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import factory
-from marvin.factory.DiskOfferingFactory import DiskOfferingFactory
-from marvin.utils import random_gen
-
-class SharedDiskOfferingFactory(DiskOfferingFactory):
-
-    displaytext = "SharedDiskOffering"
-    name = factory.Sequence(lambda n : "SharedDiskOffering" + random_gen())
-    storagetype = "shared"
-    disksize = 10 #MB
-
-class LocalDiskOfferingFactory(DiskOfferingFactory):
-
-    displaytext = "LocalDiskOffering"
-    name = factory.Sequence(lambda n : "LocalDiskOffering" + random_gen())
-    storagetype = "local"
-    disksize = 10 #MB

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/firewallrule.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/firewallrule.py b/tools/marvin/marvin/data/firewallrule.py
deleted file mode 100644
index 1707347..0000000
--- a/tools/marvin/marvin/data/firewallrule.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-from marvin.factory.FirewallRuleFactory import FirewallRuleFactory
-
-class SshFirewallRuleFactory(FirewallRuleFactory):
-    protocol = 'tcp'
-    startport = 22
-    endport = 22
-    cidrlist = '0.0.0.0/0'
-
-class HttpFirewallRuleFactory(FirewallRuleFactory):
-    protocol = 'tcp'
-    startport = 80
-    endport = 80
-    cidrlist = '0.0.0.0/0'

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/host.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/host.py b/tools/marvin/marvin/data/host.py
deleted file mode 100644
index c8b4ab7..0000000
--- a/tools/marvin/marvin/data/host.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-from marvin.factory.HostFactory import HostFactory
-
-class XenserverHostFactory(HostFactory):
-
-    hypervisor = 'XenServer'
-    password = 'password'
-    username = 'root'
-
-
-class KvmHostFactory(HostFactory):
-
-    hypervisor = 'KVM'
-    password = 'password'
-    username = 'root'

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/networkoffering.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/networkoffering.py b/tools/marvin/marvin/data/networkoffering.py
deleted file mode 100644
index 8d80631..0000000
--- a/tools/marvin/marvin/data/networkoffering.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import factory
-from marvin.factory.NetworkOfferingFactory import NetworkOfferingFactory
-from marvin.utils import random_gen
-
-
-class DefaultIsolatedNetworkOfferingWithSourceNatServiceFactory(NetworkOfferingFactory):
-    #FIXME: Service Capability Lists with CapabilityTypes (ElasticIP, RvR etc) needs handling
-
-    displaytext = factory.Sequence(lambda n : "DefaultIsolatedNetworkOfferingWithSourceNatService" + random_gen())
-    name = factory.Sequence(lambda n : "DefaultIsolatedNetworkOfferingWithSourceNatService" + random_gen())
-    supportedservices = "Lb,Dns,PortForwarding,StaticNat,Dhcp,Firewall,Vpn,UserData,SourceNat"
-    traffictype = "GUEST"
-    availability = "Optional"
-    guestiptype = "Isolated"
-
-    specifyVlan = False
-    specifyIpRanges = False
-    isPersistent = False
-    conserveMode = True
-
-    serviceProviderList = []
-    for service in map(lambda l: l.strip(' '), supportedservices.split(',')):
-        serviceProviderList.append(
-            {
-                'service': service,
-                'provider': 'VirtualRouter'
-            }
-        )
-
-
-class DefaultSharedNetworkOfferingWithSGServiceFactory(NetworkOfferingFactory):
-
-    displaytext = factory.Sequence(lambda n : "DefaultSharedNetworkOfferingWithSGService" + random_gen())
-    name = factory.Sequence(lambda n : "DefaultSharedNetworkOfferingWithSGService" + random_gen())
-    availability = "Optional"
-    supportedservices = "SecurityGroup,Dns,Dhcp,UserData"
-    guestiptype = "Shared"
-    traffictype = "GUEST"
-
-    specifyVlan = True
-    specifyIpRanges = True
-    isPersistent = False
-    conserveMode = True
-
-    serviceProviderList = []
-    for service in map(lambda l: l.strip(' '), supportedservices.split(',')):
-        if service == 'SecurityGroup':
-            provider = 'SecurityGroupProvider'
-        else:
-            provider = 'VirtualRouter'
-        serviceProviderList.append(
-            {
-                'service': service,
-                'provider': provider
-            }
-        )

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/serviceoffering.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/serviceoffering.py b/tools/marvin/marvin/data/serviceoffering.py
deleted file mode 100644
index a56d4e5..0000000
--- a/tools/marvin/marvin/data/serviceoffering.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import factory
-from marvin.factory.ServiceOfferingFactory import ServiceOfferingFactory
-from marvin.utils import random_gen
-
-class SmallServiceOfferingFactory(ServiceOfferingFactory):
-    cpunumber = 1
-    cpuspeed = 100 #Mhz
-    memory = 100 #MB
-    displaytext = "Small Service Offering"
-    name = factory.Sequence(lambda n: "SmallServiceOffering" + random_gen())

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/template.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/template.py b/tools/marvin/marvin/data/template.py
deleted file mode 100644
index 033835b..0000000
--- a/tools/marvin/marvin/data/template.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-from marvin.factory.TemplateFactory import TemplateFactory
-
-class DefaultBuiltInTemplateFactory(TemplateFactory):
-    ostype = 'CentOS 5.3 (64-bit)'
-    displaytext = 'CentOS 5.3 (64-bit)'
-    name = 'CentOS 5.3 (64-bit)'
-    format = 'VHD'
-    hypervisor = 'XenServer'

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/user.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/user.py b/tools/marvin/marvin/data/user.py
deleted file mode 100644
index 13c4db2..0000000
--- a/tools/marvin/marvin/data/user.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import factory
-from marvin.factory.UserFactory import UserFactory
-from marvin.data.account import UserAccountFactory
-from marvin.utils import random_gen
-
-class UserFactory(UserFactory):
-
-    firstname = factory.Sequence(lambda n: random_gen())
-    lastname = factory.Sequence(lambda n: random_gen())
-    email = factory.LazyAttribute(lambda e: '{0}.{1}@cloudstack.org'.format(e.firstname, e.lastname).lower())
-    username = factory.Sequence(lambda n: random_gen())
-    password = 'password'
-    account = factory.SubFactory(UserAccountFactory,
-        apiclient=factory.SelfAttribute('..apiclient'),
-        accounttype=0,
-        firstname=factory.SelfAttribute('..firstname'),
-        lastname=factory.SelfAttribute('..lastname'),
-        email=factory.SelfAttribute('..email'),
-        password=factory.SelfAttribute('..password'),
-        username=factory.SelfAttribute('..username'),
-    )
-
-class AdminUserFactory(UserFactory):
-
-    account = factory.SubFactory(UserAccountFactory,
-        apiclient=factory.SelfAttribute('..apiclient'),
-        accounttype=1,
-        firstname=factory.SelfAttribute('..firstname'),
-        lastname=factory.SelfAttribute('..lastname'),
-        email=factory.SelfAttribute('..email'),
-        password=factory.SelfAttribute('..password'),
-        username=factory.SelfAttribute('..username'),
-    )

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/vm.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/vm.py b/tools/marvin/marvin/data/vm.py
deleted file mode 100644
index 66f15a3..0000000
--- a/tools/marvin/marvin/data/vm.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import factory
-from marvin.factory.VirtualMachineFactory import VirtualMachineFactory
-from marvin.utils import random_gen
-
-
-class VirtualMachineIsolatedNetwork(VirtualMachineFactory):
-    """
-    Create a virtualmachine in an isolated network typically in an advanced zone
-
-    Uses a serviceoffering of tinyInstance
-    Uses a builtin template available
-    Deploys in the first zone available
-    """
-
-    serviceofferingid = None
-    templateid = None
-    zoneid = None

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/data/zone.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/data/zone.py b/tools/marvin/marvin/data/zone.py
deleted file mode 100644
index f4a278a..0000000
--- a/tools/marvin/marvin/data/zone.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import factory
-from marvin.factory.ZoneFactory import ZoneFactory
-from marvin.utils import random_gen
-
-class AdvancedZoneFactory(ZoneFactory):
-    name = factory.Sequence(lambda n: "advzone" + random_gen())
-    networktype = "Advanced"
-    dns1 = "8.8.8.8"
-    internaldns1 = "8.8.8.8"
-
-
-class BasicZoneFactory(ZoneFactory):
-    name = factory.Sequence(lambda n: "basiczone" + random_gen())
-    networktype = "Basic"
-    dns1 = "8.8.8.8"
-    internaldns1 = "8.8.8.8"
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/entity/__init__.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/entity/__init__.py b/tools/marvin/marvin/entity/__init__.py
new file mode 100644
index 0000000..13a8339
--- /dev/null
+++ b/tools/marvin/marvin/entity/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/entity/cloudstackentity.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/entity/cloudstackentity.py b/tools/marvin/marvin/entity/cloudstackentity.py
new file mode 100644
index 0000000..b7091de
--- /dev/null
+++ b/tools/marvin/marvin/entity/cloudstackentity.py
@@ -0,0 +1,25 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+cloudstack_version = "4.2.0"
+
+class CloudStackEntity(object):
+
+    __version__ = cloudstack_version
+
+    def getVersion(self):
+        return self.__version__

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/__init__.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/__init__.py b/tools/marvin/marvin/factory/data/__init__.py
new file mode 100644
index 0000000..d216be4
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/account.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/account.py b/tools/marvin/marvin/factory/data/account.py
new file mode 100644
index 0000000..1041cfe
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/account.py
@@ -0,0 +1,38 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import factory
+from marvin.factory.AccountFactory import AccountFactory
+from marvin.utils import random_gen
+
+class UserAccountFactory(AccountFactory):
+
+    accounttype = 0
+    firstname = factory.Sequence(lambda n: random_gen())
+    lastname = factory.Sequence(lambda n: random_gen())
+    email = factory.LazyAttribute(lambda e: '{0}.{1}@cloudstack.org'.format(e.firstname, e.lastname).lower())
+    username = factory.Sequence(lambda n: random_gen())
+    password = 'password'
+
+
+class AdminAccountFactory(UserAccountFactory):
+    accounttype = 1
+
+
+class DomainAdminFactory(UserAccountFactory):
+    accounttype = 2
+    domainid = None

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/cluster.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/cluster.py b/tools/marvin/marvin/factory/data/cluster.py
new file mode 100644
index 0000000..f4641cf
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/cluster.py
@@ -0,0 +1,30 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import factory
+from marvin.utils import random_gen
+from marvin.factory.ClusterFactory import ClusterFactory
+
+class XenClusterFactory(ClusterFactory):
+    clustername = factory.Sequence(lambda n: "xencluster" + random_gen())
+    clustertype = "XenServer"
+    hypervisor = "XenServer"
+
+class KvmClusterFactory(ClusterFactory):
+    clustername = factory.Sequence(lambda n: "kvmcluster" + random_gen())
+    clustertype = "KVM"
+    hypervisor = "KVM"

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/diskoffering.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/diskoffering.py b/tools/marvin/marvin/factory/data/diskoffering.py
new file mode 100644
index 0000000..88ae7cb
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/diskoffering.py
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import factory
+from marvin.factory.DiskOfferingFactory import DiskOfferingFactory
+from marvin.utils import random_gen
+
+class SharedDiskOfferingFactory(DiskOfferingFactory):
+
+    displaytext = "SharedDiskOffering"
+    name = factory.Sequence(lambda n : "SharedDiskOffering" + random_gen())
+    storagetype = "shared"
+    disksize = 10 #MB
+
+class LocalDiskOfferingFactory(DiskOfferingFactory):
+
+    displaytext = "LocalDiskOffering"
+    name = factory.Sequence(lambda n : "LocalDiskOffering" + random_gen())
+    storagetype = "local"
+    disksize = 10 #MB

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/firewallrule.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/firewallrule.py b/tools/marvin/marvin/factory/data/firewallrule.py
new file mode 100644
index 0000000..1707347
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/firewallrule.py
@@ -0,0 +1,30 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+from marvin.factory.FirewallRuleFactory import FirewallRuleFactory
+
+class SshFirewallRuleFactory(FirewallRuleFactory):
+    protocol = 'tcp'
+    startport = 22
+    endport = 22
+    cidrlist = '0.0.0.0/0'
+
+class HttpFirewallRuleFactory(FirewallRuleFactory):
+    protocol = 'tcp'
+    startport = 80
+    endport = 80
+    cidrlist = '0.0.0.0/0'

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/host.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/host.py b/tools/marvin/marvin/factory/data/host.py
new file mode 100644
index 0000000..c8b4ab7
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/host.py
@@ -0,0 +1,31 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+from marvin.factory.HostFactory import HostFactory
+
+class XenserverHostFactory(HostFactory):
+
+    hypervisor = 'XenServer'
+    password = 'password'
+    username = 'root'
+
+
+class KvmHostFactory(HostFactory):
+
+    hypervisor = 'KVM'
+    password = 'password'
+    username = 'root'

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/networkoffering.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/networkoffering.py b/tools/marvin/marvin/factory/data/networkoffering.py
new file mode 100644
index 0000000..8d80631
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/networkoffering.py
@@ -0,0 +1,73 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import factory
+from marvin.factory.NetworkOfferingFactory import NetworkOfferingFactory
+from marvin.utils import random_gen
+
+
+class DefaultIsolatedNetworkOfferingWithSourceNatServiceFactory(NetworkOfferingFactory):
+    #FIXME: Service Capability Lists with CapabilityTypes (ElasticIP, RvR etc) needs handling
+
+    displaytext = factory.Sequence(lambda n : "DefaultIsolatedNetworkOfferingWithSourceNatService" + random_gen())
+    name = factory.Sequence(lambda n : "DefaultIsolatedNetworkOfferingWithSourceNatService" + random_gen())
+    supportedservices = "Lb,Dns,PortForwarding,StaticNat,Dhcp,Firewall,Vpn,UserData,SourceNat"
+    traffictype = "GUEST"
+    availability = "Optional"
+    guestiptype = "Isolated"
+
+    specifyVlan = False
+    specifyIpRanges = False
+    isPersistent = False
+    conserveMode = True
+
+    serviceProviderList = []
+    for service in map(lambda l: l.strip(' '), supportedservices.split(',')):
+        serviceProviderList.append(
+            {
+                'service': service,
+                'provider': 'VirtualRouter'
+            }
+        )
+
+
+class DefaultSharedNetworkOfferingWithSGServiceFactory(NetworkOfferingFactory):
+
+    displaytext = factory.Sequence(lambda n : "DefaultSharedNetworkOfferingWithSGService" + random_gen())
+    name = factory.Sequence(lambda n : "DefaultSharedNetworkOfferingWithSGService" + random_gen())
+    availability = "Optional"
+    supportedservices = "SecurityGroup,Dns,Dhcp,UserData"
+    guestiptype = "Shared"
+    traffictype = "GUEST"
+
+    specifyVlan = True
+    specifyIpRanges = True
+    isPersistent = False
+    conserveMode = True
+
+    serviceProviderList = []
+    for service in map(lambda l: l.strip(' '), supportedservices.split(',')):
+        if service == 'SecurityGroup':
+            provider = 'SecurityGroupProvider'
+        else:
+            provider = 'VirtualRouter'
+        serviceProviderList.append(
+            {
+                'service': service,
+                'provider': provider
+            }
+        )

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/serviceoffering.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/serviceoffering.py b/tools/marvin/marvin/factory/data/serviceoffering.py
new file mode 100644
index 0000000..a56d4e5
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/serviceoffering.py
@@ -0,0 +1,27 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import factory
+from marvin.factory.ServiceOfferingFactory import ServiceOfferingFactory
+from marvin.utils import random_gen
+
+class SmallServiceOfferingFactory(ServiceOfferingFactory):
+    cpunumber = 1
+    cpuspeed = 100 #Mhz
+    memory = 100 #MB
+    displaytext = "Small Service Offering"
+    name = factory.Sequence(lambda n: "SmallServiceOffering" + random_gen())

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/template.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/template.py b/tools/marvin/marvin/factory/data/template.py
new file mode 100644
index 0000000..033835b
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/template.py
@@ -0,0 +1,25 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+from marvin.factory.TemplateFactory import TemplateFactory
+
+class DefaultBuiltInTemplateFactory(TemplateFactory):
+    ostype = 'CentOS 5.3 (64-bit)'
+    displaytext = 'CentOS 5.3 (64-bit)'
+    name = 'CentOS 5.3 (64-bit)'
+    format = 'VHD'
+    hypervisor = 'XenServer'

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/user.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/user.py b/tools/marvin/marvin/factory/data/user.py
new file mode 100644
index 0000000..ee84644
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/user.py
@@ -0,0 +1,50 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import factory
+from marvin.factory.UserFactory import UserFactory
+from marvin.factory.data.account import UserAccountFactory
+from marvin.utils import random_gen
+
+class UserFactory(UserFactory):
+
+    firstname = factory.Sequence(lambda n: random_gen())
+    lastname = factory.Sequence(lambda n: random_gen())
+    email = factory.LazyAttribute(lambda e: '{0}.{1}@cloudstack.org'.format(e.firstname, e.lastname).lower())
+    username = factory.Sequence(lambda n: random_gen())
+    password = 'password'
+    account = factory.SubFactory(UserAccountFactory,
+        apiclient=factory.SelfAttribute('..apiclient'),
+        accounttype=0,
+        firstname=factory.SelfAttribute('..firstname'),
+        lastname=factory.SelfAttribute('..lastname'),
+        email=factory.SelfAttribute('..email'),
+        password=factory.SelfAttribute('..password'),
+        username=factory.SelfAttribute('..username'),
+    )
+
+class AdminUserFactory(UserFactory):
+
+    account = factory.SubFactory(UserAccountFactory,
+        apiclient=factory.SelfAttribute('..apiclient'),
+        accounttype=1,
+        firstname=factory.SelfAttribute('..firstname'),
+        lastname=factory.SelfAttribute('..lastname'),
+        email=factory.SelfAttribute('..email'),
+        password=factory.SelfAttribute('..password'),
+        username=factory.SelfAttribute('..username'),
+    )

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/vm.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/vm.py b/tools/marvin/marvin/factory/data/vm.py
new file mode 100644
index 0000000..66f15a3
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/vm.py
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import factory
+from marvin.factory.VirtualMachineFactory import VirtualMachineFactory
+from marvin.utils import random_gen
+
+
+class VirtualMachineIsolatedNetwork(VirtualMachineFactory):
+    """
+    Create a virtualmachine in an isolated network typically in an advanced zone
+
+    Uses a serviceoffering of tinyInstance
+    Uses a builtin template available
+    Deploys in the first zone available
+    """
+
+    serviceofferingid = None
+    templateid = None
+    zoneid = None

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/factory/data/zone.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/factory/data/zone.py b/tools/marvin/marvin/factory/data/zone.py
new file mode 100644
index 0000000..f4a278a
--- /dev/null
+++ b/tools/marvin/marvin/factory/data/zone.py
@@ -0,0 +1,33 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import factory
+from marvin.factory.ZoneFactory import ZoneFactory
+from marvin.utils import random_gen
+
+class AdvancedZoneFactory(ZoneFactory):
+    name = factory.Sequence(lambda n: "advzone" + random_gen())
+    networktype = "Advanced"
+    dns1 = "8.8.8.8"
+    internaldns1 = "8.8.8.8"
+
+
+class BasicZoneFactory(ZoneFactory):
+    name = factory.Sequence(lambda n: "basiczone" + random_gen())
+    networktype = "Basic"
+    dns1 = "8.8.8.8"
+    internaldns1 = "8.8.8.8"
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/test/test_factories.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/test/test_factories.py b/tools/marvin/marvin/test/test_factories.py
index 23a6580..5ce8c13 100644
--- a/tools/marvin/marvin/test/test_factories.py
+++ b/tools/marvin/marvin/test/test_factories.py
@@ -20,22 +20,22 @@ import logging
 
 from marvin.cloudstackTestClient import cloudstackTestClient
 
-from marvin.data.account import UserAccountFactory, AdminAccountFactory, DomainAdminFactory
-from marvin.data.serviceoffering import *
-from marvin.data.template import *
-from marvin.data.user import *
-from marvin.data.networkoffering import *
+from marvin.factory.data.account import UserAccountFactory, AdminAccountFactory, DomainAdminFactory
+from marvin.factory.data.serviceoffering import *
+from marvin.factory.data.template import *
+from marvin.factory.data.user import *
+from marvin.factory.data.networkoffering import *
 
 from marvin.factory.VirtualMachineFactory import *
 
-from marvin.base.ServiceOffering import ServiceOffering
-from marvin.base.Zone import Zone
-from marvin.base.Account import Account
-from marvin.base.Template import Template
-from marvin.base.User import User
-from marvin.base.Network import Network
+from marvin.entity.serviceoffering import ServiceOffering
+from marvin.entity.zone import Zone
+from marvin.entity.account import Account
+from marvin.entity.template import Template
+from marvin.entity.user import User
+from marvin.entity.network import Network
 
-from marvin.base.IpAddress import IpAddress
+from marvin.entity.ipaddress import IpAddress
 class BuildVsCreateStrategyTest(unittest.TestCase):
     def setUp(self):
         self.apiClient = cloudstackTestClient(mgtSvr='localhost', logging=logging.getLogger('factory.cloudstack')).getApiClient()
@@ -160,7 +160,7 @@ class IpAddressFactoryTest(unittest.TestCase):
         self.apiClient = cloudstackTestClient(mgtSvr='localhost', logging=logging.getLogger('factory.cloudstack')).getApiClient()
 
     def tearDown(self):
-        pass
+        self.vm.destroy(apiclient=self.apiClient)
 
     def test_associateIpAddressToNetwork(self):
         accnt = UserAccountFactory.create(apiclient=self.apiClient)
@@ -171,7 +171,7 @@ class IpAddressFactoryTest(unittest.TestCase):
         template = Template.list(apiclient=self.apiClient, templatefilter="featured")
         self.assert_(len(template) > 0)
         zones = Zone.list(apiclient=self.apiClient)
-        vm = VirtualMachineFactory.create(
+        self.vm = VirtualMachineFactory.create(
             apiclient=self.apiClient,
             serviceofferingid = service[0].id,
             templateid = template[0].id,
@@ -182,18 +182,4 @@ class IpAddressFactoryTest(unittest.TestCase):
         firstip = all_ips[0]
         networks = Network.list(apiclient=self.apiClient, account = accnt.name, domainid = accnt.domainid)
         firstip.associate(apiclient=self.apiClient, networkid = networks[0].id)
-        vm.destroy(apiclient=self.apiClient)
-
-
-class VirtualMachineTest(unittest.TestCase):
-    """
-    Test virtualmachine lifecycle using factories
-    """
-    def setUp(self):
-        self.apiClient = cloudstackTestClient(mgtSvr='localhost', logging=logging.getLogger('factory.cloudstack')).getApiClient()
-
-    def tearDown(self):
-        pass
 
-    def test_virtualmachinedeploy(self):
-        pass
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/marvin/utils.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/utils.py b/tools/marvin/marvin/utils.py
index 3170ea7..fcfa338 100644
--- a/tools/marvin/marvin/utils.py
+++ b/tools/marvin/marvin/utils.py
@@ -242,7 +242,7 @@ def is_snapshot_on_nfs(apiclient, dbconn, config, zoneid, snapshotid):
     @return: True if snapshot is found, False otherwise
     """
 
-    from base import ImageStore, Snapshot
+    from entity import ImageStore, Snapshot
     secondaryStores = ImageStore.list(apiclient, zoneid=zoneid)
 
     assert isinstance(secondaryStores, list), "Not a valid response for listImageStores"

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/pom.xml
----------------------------------------------------------------------
diff --git a/tools/marvin/pom.xml b/tools/marvin/pom.xml
index 2b4f360..25909b3 100644
--- a/tools/marvin/pom.xml
+++ b/tools/marvin/pom.xml
@@ -142,7 +142,7 @@
                     <argument>install</argument>
                     <argument>--upgrade</argument>
                     <!-- TODO: Fix Marvin versioning here -->
-                    <argument>Marvin-0.1.0.tar.gz</argument>
+                    <argument>Marvin-0.2.0.tar.gz</argument>
                   </arguments>
                 </configuration>
               </execution>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/526a9d60/tools/marvin/setup.py
----------------------------------------------------------------------
diff --git a/tools/marvin/setup.py b/tools/marvin/setup.py
index 5e9b125..b499671 100644
--- a/tools/marvin/setup.py
+++ b/tools/marvin/setup.py
@@ -42,7 +42,8 @@ setup(name="Marvin",
     maintainer_email="tsp@apache.org",
     long_description="Marvin is the Apache CloudStack python client written around the unittest framework",
     platforms=("Any",),
-    packages=["marvin", "marvin.cloudstackAPI", "marvin.base", "marvin.factory",
+    packages=["marvin", "marvin.cloudstackAPI", "marvin.entity", "marvin.factory", "marvin.factory.data",
+              "marvin.docs", "marvin.generate", "marvin.legacy", "marvin.sandbox",
               "marvin.sandbox.advanced", "marvin.sandbox.advancedsg", "marvin.sandbox.basic"],
     license="LICENSE.txt",
     install_requires=[