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/04/21 14:23:28 UTC

[15/17] make the module structure more relevant and simple

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/S3.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/S3.py b/tools/marvin/marvin/base/S3.py
new file mode 100644
index 0000000..c69f65c
--- /dev/null
+++ b/tools/marvin/marvin/base/S3.py
@@ -0,0 +1,45 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import addS3
+from marvin.cloudstackAPI import listS3s
+
+class S3(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def add(self, apiclient, secretkey, accesskey, bucket, **kwargs):
+        cmd = addS3.addS3Cmd()
+        cmd.id = self.id
+        cmd.accesskey = accesskey
+        cmd.bucket = bucket
+        cmd.secretkey = secretkey
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        s3 = apiclient.addS3(cmd)
+        return s3
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listS3s.listS3sCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        s3 = apiclient.listS3s(cmd)
+        return map(lambda e: S3(e.__dict__), s3)
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/SSHKeyPair.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/SSHKeyPair.py b/tools/marvin/marvin/base/SSHKeyPair.py
new file mode 100644
index 0000000..88bb12e
--- /dev/null
+++ b/tools/marvin/marvin/base/SSHKeyPair.py
@@ -0,0 +1,64 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createSSHKeyPair
+from marvin.cloudstackAPI import registerSSHKeyPair
+from marvin.cloudstackAPI import listSSHKeyPairs
+from marvin.cloudstackAPI import deleteSSHKeyPair
+
+class SSHKeyPair(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createSSHKeyPair.createSSHKeyPairCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        sshkeypair = apiclient.createSSHKeyPair(cmd)
+        return SSHKeyPair(sshkeypair.__dict__)
+
+
+    def register(self, apiclient, publickey, name, **kwargs):
+        cmd = registerSSHKeyPair.registerSSHKeyPairCmd()
+        cmd.id = self.id
+        cmd.name = name
+        cmd.publickey = publickey
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        sshkeypair = apiclient.registerSSHKeyPair(cmd)
+        return sshkeypair
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listSSHKeyPairs.listSSHKeyPairsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        sshkeypair = apiclient.listSSHKeyPairs(cmd)
+        return map(lambda e: SSHKeyPair(e.__dict__), sshkeypair)
+
+
+    def delete(self, apiclient, name, **kwargs):
+        cmd = deleteSSHKeyPair.deleteSSHKeyPairCmd()
+        cmd.id = self.id
+        cmd.name = name
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        sshkeypair = apiclient.deleteSSHKeyPair(cmd)
+        return sshkeypair
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/SecondaryStorage.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/SecondaryStorage.py b/tools/marvin/marvin/base/SecondaryStorage.py
new file mode 100644
index 0000000..332e1b0
--- /dev/null
+++ b/tools/marvin/marvin/base/SecondaryStorage.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.
+from marvin.base import CloudStackEntity
+from marvin.cloudstackAPI import addSecondaryStorage
+
+class SecondaryStorage(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def add(self, apiclient, url, **kwargs):
+        cmd = addSecondaryStorage.addSecondaryStorageCmd()
+        cmd.id = self.id
+        cmd.url = url
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        secondarystorage = apiclient.addSecondaryStorage(cmd)
+        return secondarystorage
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/SecurityGroup.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/SecurityGroup.py b/tools/marvin/marvin/base/SecurityGroup.py
new file mode 100644
index 0000000..ad2d3df
--- /dev/null
+++ b/tools/marvin/marvin/base/SecurityGroup.py
@@ -0,0 +1,82 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createSecurityGroup
+from marvin.cloudstackAPI import listSecurityGroups
+from marvin.cloudstackAPI import deleteSecurityGroup
+from marvin.cloudstackAPI import revokeSecurityGroupEgress
+from marvin.cloudstackAPI import revokeSecurityGroupIngress
+from marvin.cloudstackAPI import authorizeSecurityGroupEgress
+from marvin.cloudstackAPI import authorizeSecurityGroupIngress
+
+class SecurityGroup(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createSecurityGroup.createSecurityGroupCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        securitygroup = apiclient.createSecurityGroup(cmd)
+        return SecurityGroup(securitygroup.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listSecurityGroups.listSecurityGroupsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        securitygroup = apiclient.listSecurityGroups(cmd)
+        return map(lambda e: SecurityGroup(e.__dict__), securitygroup)
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteSecurityGroup.deleteSecurityGroupCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        securitygroup = apiclient.deleteSecurityGroup(cmd)
+        return securitygroup
+
+
+    def authorize(self, apiclient, ingress=True, **kwargs):
+        if ingress:
+            cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd()
+        else:
+            cmd = authorizeSecurityGroupEgress.authorizeSecurityGroupEgressCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        if ingress:
+            return apiclient.authorizeSecurityGroupIngress(cmd)
+        else:
+            return apiclient.authorizeSecurityGroupEgress(cmd)
+
+
+    def revoke(self, apiclient, ingress=True, **kwargs):
+        if ingress:
+            cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd()
+        else:
+            cmd = revokeSecurityGroupEgress.revokeSecurityGroupEgressCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        if ingress:
+            return apiclient.revokeSecurityGroupIngress(cmd)
+        else:
+            return apiclient.revokeSecurityGroupEgress(cmd)
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/ServiceForRouter.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/ServiceForRouter.py b/tools/marvin/marvin/base/ServiceForRouter.py
new file mode 100644
index 0000000..6c365f7
--- /dev/null
+++ b/tools/marvin/marvin/base/ServiceForRouter.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.
+from marvin.base import CloudStackEntity
+from marvin.cloudstackAPI import changeServiceForRouter
+
+class ServiceForRouter(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def change(self, apiclient, serviceofferingid, **kwargs):
+        cmd = changeServiceForRouter.changeServiceForRouterCmd()
+        cmd.id = self.id
+        cmd.serviceofferingid = serviceofferingid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        serviceforrouter = apiclient.changeServiceForRouter(cmd)
+        return serviceforrouter
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/ServiceForSystemVm.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/ServiceForSystemVm.py b/tools/marvin/marvin/base/ServiceForSystemVm.py
new file mode 100644
index 0000000..09ede6d
--- /dev/null
+++ b/tools/marvin/marvin/base/ServiceForSystemVm.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.
+from marvin.base import CloudStackEntity
+from marvin.cloudstackAPI import changeServiceForSystemVm
+
+class ServiceForSystemVm(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def change(self, apiclient, serviceofferingid, **kwargs):
+        cmd = changeServiceForSystemVm.changeServiceForSystemVmCmd()
+        cmd.id = self.id
+        cmd.serviceofferingid = serviceofferingid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        serviceforsystemvm = apiclient.changeServiceForSystemVm(cmd)
+        return serviceforsystemvm
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/ServiceForVirtualMachine.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/ServiceForVirtualMachine.py b/tools/marvin/marvin/base/ServiceForVirtualMachine.py
new file mode 100644
index 0000000..3998e0f
--- /dev/null
+++ b/tools/marvin/marvin/base/ServiceForVirtualMachine.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.
+from marvin.base import CloudStackEntity
+from marvin.cloudstackAPI import changeServiceForVirtualMachine
+
+class ServiceForVirtualMachine(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def change(self, apiclient, serviceofferingid, **kwargs):
+        cmd = changeServiceForVirtualMachine.changeServiceForVirtualMachineCmd()
+        cmd.id = self.id
+        cmd.serviceofferingid = serviceofferingid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        serviceforvirtualmachine = apiclient.changeServiceForVirtualMachine(cmd)
+        return serviceforvirtualmachine
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/ServiceOffering.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/ServiceOffering.py b/tools/marvin/marvin/base/ServiceOffering.py
new file mode 100644
index 0000000..9dc8f9a
--- /dev/null
+++ b/tools/marvin/marvin/base/ServiceOffering.py
@@ -0,0 +1,61 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createServiceOffering
+from marvin.cloudstackAPI import listServiceOfferings
+from marvin.cloudstackAPI import updateServiceOffering
+from marvin.cloudstackAPI import deleteServiceOffering
+
+class ServiceOffering(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createServiceOffering.createServiceOfferingCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        serviceoffering = apiclient.createServiceOffering(cmd)
+        return ServiceOffering(serviceoffering.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listServiceOfferings.listServiceOfferingsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        serviceoffering = apiclient.listServiceOfferings(cmd)
+        return map(lambda e: ServiceOffering(e.__dict__), serviceoffering)
+
+
+    def update(self, apiclient, **kwargs):
+        cmd = updateServiceOffering.updateServiceOfferingCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        serviceoffering = apiclient.updateServiceOffering(cmd)
+        return serviceoffering
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteServiceOffering.deleteServiceOfferingCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        serviceoffering = apiclient.deleteServiceOffering(cmd)
+        return serviceoffering
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/Simulator.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/Simulator.py b/tools/marvin/marvin/base/Simulator.py
new file mode 100644
index 0000000..a8be52e
--- /dev/null
+++ b/tools/marvin/marvin/base/Simulator.py
@@ -0,0 +1,35 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import configureSimulator
+
+class Simulator(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def configure(self, apiclient, name, value, **kwargs):
+        cmd = configureSimulator.configureSimulatorCmd()
+        cmd.id = self.id
+        cmd.name = name
+        cmd.value = value
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        simulator = apiclient.configureSimulator(cmd)
+        return simulator
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/Snapshot.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/Snapshot.py b/tools/marvin/marvin/base/Snapshot.py
new file mode 100644
index 0000000..962ad50
--- /dev/null
+++ b/tools/marvin/marvin/base/Snapshot.py
@@ -0,0 +1,52 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createSnapshot
+from marvin.cloudstackAPI import listSnapshots
+from marvin.cloudstackAPI import deleteSnapshot
+
+class Snapshot(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createSnapshot.createSnapshotCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        snapshot = apiclient.createSnapshot(cmd)
+        return Snapshot(snapshot.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listSnapshots.listSnapshotsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        snapshot = apiclient.listSnapshots(cmd)
+        return map(lambda e: Snapshot(e.__dict__), snapshot)
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteSnapshot.deleteSnapshotCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        snapshot = apiclient.deleteSnapshot(cmd)
+        return snapshot
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/SnapshotPolicy.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/SnapshotPolicy.py b/tools/marvin/marvin/base/SnapshotPolicy.py
new file mode 100644
index 0000000..5358bac
--- /dev/null
+++ b/tools/marvin/marvin/base/SnapshotPolicy.py
@@ -0,0 +1,52 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createSnapshotPolicy
+from marvin.cloudstackAPI import listSnapshotPolicies
+from marvin.cloudstackAPI import deleteSnapshotPolicies
+
+class SnapshotPolicy(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createSnapshotPolicy.createSnapshotPolicyCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        snapshotpolicy = apiclient.createSnapshotPolicy(cmd)
+        return SnapshotPolicy(snapshotpolicy.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, volumeid, **kwargs):
+        cmd = listSnapshotPolicies.listSnapshotPoliciesCmd()
+        cmd.volumeid = volumeid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        snapshotpolicies = apiclient.listSnapshotPolicies(cmd)
+        return map(lambda e: SnapshotPolicy(e.__dict__), snapshotpolicies)
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteSnapshotPolicies.deleteSnapshotPoliciesCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        snapshotpolicies = apiclient.deleteSnapshotPolicies(cmd)
+        return snapshotpolicies

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/StaticNat.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/StaticNat.py b/tools/marvin/marvin/base/StaticNat.py
new file mode 100644
index 0000000..076975c
--- /dev/null
+++ b/tools/marvin/marvin/base/StaticNat.py
@@ -0,0 +1,45 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import enableStaticNat
+from marvin.cloudstackAPI import disableStaticNat
+
+class StaticNat(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def enable(self, apiclient, ipaddressid, virtualmachineid, **kwargs):
+        cmd = enableStaticNat.enableStaticNatCmd()
+        cmd.id = self.id
+        cmd.ipaddressid = ipaddressid
+        cmd.virtualmachineid = virtualmachineid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        staticnat = apiclient.enableStaticNat(cmd)
+        return staticnat
+
+
+    def disable(self, apiclient, ipaddressid, **kwargs):
+        cmd = disableStaticNat.disableStaticNatCmd()
+        cmd.id = self.id
+        cmd.ipaddressid = ipaddressid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        staticnat = apiclient.disableStaticNat(cmd)
+        return staticnat
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/StaticRoute.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/StaticRoute.py b/tools/marvin/marvin/base/StaticRoute.py
new file mode 100644
index 0000000..d935444
--- /dev/null
+++ b/tools/marvin/marvin/base/StaticRoute.py
@@ -0,0 +1,52 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createStaticRoute
+from marvin.cloudstackAPI import listStaticRoutes
+from marvin.cloudstackAPI import deleteStaticRoute
+
+class StaticRoute(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createStaticRoute.createStaticRouteCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        staticroute = apiclient.createStaticRoute(cmd)
+        return StaticRoute(staticroute.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listStaticRoutes.listStaticRoutesCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        staticroute = apiclient.listStaticRoutes(cmd)
+        return map(lambda e: StaticRoute(e.__dict__), staticroute)
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteStaticRoute.deleteStaticRouteCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        staticroute = apiclient.deleteStaticRoute(cmd)
+        return staticroute
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/StorageNetworkIpRange.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/StorageNetworkIpRange.py b/tools/marvin/marvin/base/StorageNetworkIpRange.py
new file mode 100644
index 0000000..2419801
--- /dev/null
+++ b/tools/marvin/marvin/base/StorageNetworkIpRange.py
@@ -0,0 +1,61 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createStorageNetworkIpRange
+from marvin.cloudstackAPI import listStorageNetworkIpRange
+from marvin.cloudstackAPI import updateStorageNetworkIpRange
+from marvin.cloudstackAPI import deleteStorageNetworkIpRange
+
+class StorageNetworkIpRange(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createStorageNetworkIpRange.createStorageNetworkIpRangeCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        storagenetworkiprange = apiclient.createStorageNetworkIpRange(cmd)
+        return StorageNetworkIpRange(storagenetworkiprange.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listStorageNetworkIpRange.listStorageNetworkIpRangeCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        storagenetworkiprange = apiclient.listStorageNetworkIpRange(cmd)
+        return map(lambda e: StorageNetworkIpRange(e.__dict__), storagenetworkiprange)
+
+
+    def update(self, apiclient, **kwargs):
+        cmd = updateStorageNetworkIpRange.updateStorageNetworkIpRangeCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        storagenetworkiprange = apiclient.updateStorageNetworkIpRange(cmd)
+        return storagenetworkiprange
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteStorageNetworkIpRange.deleteStorageNetworkIpRangeCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        storagenetworkiprange = apiclient.deleteStorageNetworkIpRange(cmd)
+        return storagenetworkiprange
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/StoragePool.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/StoragePool.py b/tools/marvin/marvin/base/StoragePool.py
new file mode 100644
index 0000000..b6077e9
--- /dev/null
+++ b/tools/marvin/marvin/base/StoragePool.py
@@ -0,0 +1,79 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createStoragePool
+from marvin.cloudstackAPI import listStoragePools
+from marvin.cloudstackAPI import updateStoragePool
+from marvin.cloudstackAPI import deleteStoragePool
+from marvin.cloudstackAPI import cancelStorageMaintenance
+from marvin.cloudstackAPI import enableStorageMaintenance
+
+class StoragePool(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createStoragePool.createStoragePoolCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        storagepool = apiclient.createStoragePool(cmd)
+        return StoragePool(storagepool.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listStoragePools.listStoragePoolsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        storagepool = apiclient.listStoragePools(cmd)
+        return map(lambda e: StoragePool(e.__dict__), storagepool)
+
+
+    def update(self, apiclient, **kwargs):
+        cmd = updateStoragePool.updateStoragePoolCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        storagepool = apiclient.updateStoragePool(cmd)
+        return storagepool
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteStoragePool.deleteStoragePoolCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        storagepool = apiclient.deleteStoragePool(cmd)
+        return storagepool
+
+
+    def cancel_maintenance(self, apiclient, **kwargs):
+        cmd = cancelStorageMaintenance.cancelStorageMaintenanceCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        storagemaintenance = apiclient.cancelStorageMaintenance(cmd)
+        return storagemaintenance
+
+
+    def enable_maintenance(self, apiclient, **kwargs):
+        cmd = enableStorageMaintenance.enableStorageMaintenanceCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        storagemaintenance = apiclient.enableStorageMaintenance(cmd)
+        return storagemaintenance
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/StorageProviders.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/StorageProviders.py b/tools/marvin/marvin/base/StorageProviders.py
new file mode 100644
index 0000000..7dab8a6
--- /dev/null
+++ b/tools/marvin/marvin/base/StorageProviders.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.
+from marvin.base import CloudStackEntity
+from marvin.cloudstackAPI import listStorageProviders
+
+class StorageProviders(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def list(self, apiclient, type, **kwargs):
+        cmd = listStorageProviders.listStorageProvidersCmd()
+        cmd.type = type
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        storageproviders = apiclient.listStorageProviders(cmd)
+        return map(lambda e: StorageProviders(e.__dict__), storageproviders)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/SupportedNetworkServices.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/SupportedNetworkServices.py b/tools/marvin/marvin/base/SupportedNetworkServices.py
new file mode 100644
index 0000000..89cbeda
--- /dev/null
+++ b/tools/marvin/marvin/base/SupportedNetworkServices.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.
+from marvin.base import CloudStackEntity
+from marvin.cloudstackAPI import listSupportedNetworkServices
+
+class SupportedNetworkServices(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listSupportedNetworkServices.listSupportedNetworkServicesCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        supportednetworkservices = apiclient.listSupportedNetworkServices(cmd)
+        return map(lambda e: SupportedNetworkServices(e.__dict__), supportednetworkservices)
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/Swift.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/Swift.py b/tools/marvin/marvin/base/Swift.py
new file mode 100644
index 0000000..e4b18a2
--- /dev/null
+++ b/tools/marvin/marvin/base/Swift.py
@@ -0,0 +1,43 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import addSwift
+from marvin.cloudstackAPI import listSwifts
+
+class Swift(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def add(self, apiclient, url, **kwargs):
+        cmd = addSwift.addSwiftCmd()
+        cmd.id = self.id
+        cmd.url = url
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        swift = apiclient.addSwift(cmd)
+        return swift
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listSwifts.listSwiftsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        swift = apiclient.listSwifts(cmd)
+        return map(lambda e: Swift(e.__dict__), swift)
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/SystemVm.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/SystemVm.py b/tools/marvin/marvin/base/SystemVm.py
new file mode 100644
index 0000000..d27a679
--- /dev/null
+++ b/tools/marvin/marvin/base/SystemVm.py
@@ -0,0 +1,80 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import migrateSystemVm
+from marvin.cloudstackAPI import stopSystemVm
+from marvin.cloudstackAPI import listSystemVms
+from marvin.cloudstackAPI import rebootSystemVm
+from marvin.cloudstackAPI import startSystemVm
+from marvin.cloudstackAPI import destroySystemVm
+
+class SystemVm(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def migrate(self, apiclient, hostid, virtualmachineid, **kwargs):
+        cmd = migrateSystemVm.migrateSystemVmCmd()
+        cmd.id = self.id
+        cmd.hostid = hostid
+        cmd.virtualmachineid = virtualmachineid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        systemvm = apiclient.migrateSystemVm(cmd)
+        return systemvm
+
+
+    def stop(self, apiclient, **kwargs):
+        cmd = stopSystemVm.stopSystemVmCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        systemvm = apiclient.stopSystemVm(cmd)
+        return systemvm
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listSystemVms.listSystemVmsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        systemvm = apiclient.listSystemVms(cmd)
+        return map(lambda e: SystemVm(e.__dict__), systemvm)
+
+
+    def reboot(self, apiclient, **kwargs):
+        cmd = rebootSystemVm.rebootSystemVmCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        systemvm = apiclient.rebootSystemVm(cmd)
+        return systemvm
+
+
+    def start(self, apiclient, **kwargs):
+        cmd = startSystemVm.startSystemVmCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        systemvm = apiclient.startSystemVm(cmd)
+        return systemvm
+
+
+    def destroy(self, apiclient, **kwargs):
+        cmd = destroySystemVm.destroySystemVmCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        systemvm = apiclient.destroySystemVm(cmd)
+        return systemvm
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/Tags.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/Tags.py b/tools/marvin/marvin/base/Tags.py
new file mode 100644
index 0000000..08ff1a1
--- /dev/null
+++ b/tools/marvin/marvin/base/Tags.py
@@ -0,0 +1,54 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createTags
+from marvin.cloudstackAPI import listTags
+from marvin.cloudstackAPI import deleteTags
+
+class Tags(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createTags.createTagsCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        tags = apiclient.createTags(cmd)
+        return Tags(tags.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listTags.listTagsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        tags = apiclient.listTags(cmd)
+        return map(lambda e: Tags(e.__dict__), tags)
+
+
+    def delete(self, apiclient, resourcetype, resourceids, **kwargs):
+        cmd = deleteTags.deleteTagsCmd()
+        cmd.id = self.id
+        cmd.resourceids = resourceids
+        cmd.resourcetype = resourcetype
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        tags = apiclient.deleteTags(cmd)
+        return tags
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/Template.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/Template.py b/tools/marvin/marvin/base/Template.py
new file mode 100644
index 0000000..db527a2
--- /dev/null
+++ b/tools/marvin/marvin/base/Template.py
@@ -0,0 +1,106 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import prepareTemplate
+from marvin.cloudstackAPI import createTemplate
+from marvin.cloudstackAPI import registerTemplate
+from marvin.cloudstackAPI import listTemplates
+from marvin.cloudstackAPI import updateTemplate
+from marvin.cloudstackAPI import copyTemplate
+from marvin.cloudstackAPI import extractTemplate
+from marvin.cloudstackAPI import deleteTemplate
+
+class Template(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def prepare(self, apiclient, zoneid, templateid, **kwargs):
+        cmd = prepareTemplate.prepareTemplateCmd()
+        cmd.id = self.id
+        cmd.templateid = templateid
+        cmd.zoneid = zoneid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        template = apiclient.prepareTemplate(cmd)
+        return template
+
+
+    def template_of_vm(self, apiclient, name, displaytext, ostypeid, **kwargs):
+        cmd = createTemplate.createTemplateCmd()
+        cmd.id = self.id
+        cmd.name = name
+        cmd.displaytext = displaytext
+        cmd.ostypeid = ostypeid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        template = apiclient.createTemplate(cmd)
+        return Template(template.__dict__)
+
+
+    @classmethod
+    def create(self, apiclient, factory, **kwargs):
+        cmd = registerTemplate.registerTemplateCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        template = apiclient.registerTemplate(cmd)
+        return template
+
+
+    @classmethod
+    def list(self, apiclient, templatefilter, **kwargs):
+        cmd = listTemplates.listTemplatesCmd()
+        cmd.templatefilter = templatefilter
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        template = apiclient.listTemplates(cmd)
+        return map(lambda e: Template(e.__dict__), template)
+
+
+    def update(self, apiclient, **kwargs):
+        cmd = updateTemplate.updateTemplateCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        template = apiclient.updateTemplate(cmd)
+        return template
+
+
+    def copy(self, apiclient, sourcezoneid, destzoneid, **kwargs):
+        cmd = copyTemplate.copyTemplateCmd()
+        cmd.id = self.id
+        cmd.destzoneid = destzoneid
+        cmd.sourcezoneid = sourcezoneid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        template = apiclient.copyTemplate(cmd)
+        return template
+
+
+    def extract(self, apiclient, mode, **kwargs):
+        cmd = extractTemplate.extractTemplateCmd()
+        cmd.id = self.id
+        cmd.mode = mode
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        template = apiclient.extractTemplate(cmd)
+        return template
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteTemplate.deleteTemplateCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        template = apiclient.deleteTemplate(cmd)
+        return template
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/TemplatePermissions.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/TemplatePermissions.py b/tools/marvin/marvin/base/TemplatePermissions.py
new file mode 100644
index 0000000..e6b3ce9
--- /dev/null
+++ b/tools/marvin/marvin/base/TemplatePermissions.py
@@ -0,0 +1,42 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import listTemplatePermissions
+from marvin.cloudstackAPI import updateTemplatePermissions
+
+class TemplatePermissions(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listTemplatePermissions.listTemplatePermissionsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        templatepermissions = apiclient.listTemplatePermissions(cmd)
+        return map(lambda e: TemplatePermissions(e.__dict__), templatepermissions)
+
+
+    def update(self, apiclient, **kwargs):
+        cmd = updateTemplatePermissions.updateTemplatePermissionsCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        templatepermissions = apiclient.updateTemplatePermissions(cmd)
+        return templatepermissions
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/TrafficMonitor.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/TrafficMonitor.py b/tools/marvin/marvin/base/TrafficMonitor.py
new file mode 100644
index 0000000..62eb5c6
--- /dev/null
+++ b/tools/marvin/marvin/base/TrafficMonitor.py
@@ -0,0 +1,54 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import addTrafficMonitor
+from marvin.cloudstackAPI import listTrafficMonitors
+from marvin.cloudstackAPI import deleteTrafficMonitor
+
+class TrafficMonitor(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def add(self, apiclient, url, zoneid, **kwargs):
+        cmd = addTrafficMonitor.addTrafficMonitorCmd()
+        cmd.id = self.id
+        cmd.url = url
+        cmd.zoneid = zoneid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        trafficmonitor = apiclient.addTrafficMonitor(cmd)
+        return trafficmonitor
+
+
+    @classmethod
+    def list(self, apiclient, zoneid, **kwargs):
+        cmd = listTrafficMonitors.listTrafficMonitorsCmd()
+        cmd.zoneid = zoneid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        trafficmonitor = apiclient.listTrafficMonitors(cmd)
+        return map(lambda e: TrafficMonitor(e.__dict__), trafficmonitor)
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteTrafficMonitor.deleteTrafficMonitorCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        trafficmonitor = apiclient.deleteTrafficMonitor(cmd)
+        return trafficmonitor
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/TrafficType.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/TrafficType.py b/tools/marvin/marvin/base/TrafficType.py
new file mode 100644
index 0000000..a2c6245
--- /dev/null
+++ b/tools/marvin/marvin/base/TrafficType.py
@@ -0,0 +1,63 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import addTrafficType
+from marvin.cloudstackAPI import listTrafficTypes
+from marvin.cloudstackAPI import updateTrafficType
+from marvin.cloudstackAPI import deleteTrafficType
+
+class TrafficType(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def add(self, apiclient, traffictype, physicalnetworkid, **kwargs):
+        cmd = addTrafficType.addTrafficTypeCmd()
+        cmd.id = self.id
+        cmd.physicalnetworkid = physicalnetworkid
+        cmd.traffictype = traffictype
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        traffictype = apiclient.addTrafficType(cmd)
+        return traffictype
+
+
+    @classmethod
+    def list(self, apiclient, physicalnetworkid, **kwargs):
+        cmd = listTrafficTypes.listTrafficTypesCmd()
+        cmd.physicalnetworkid = physicalnetworkid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        traffictype = apiclient.listTrafficTypes(cmd)
+        return map(lambda e: TrafficType(e.__dict__), traffictype)
+
+
+    def update(self, apiclient, **kwargs):
+        cmd = updateTrafficType.updateTrafficTypeCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        traffictype = apiclient.updateTrafficType(cmd)
+        return traffictype
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteTrafficType.deleteTrafficTypeCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        traffictype = apiclient.deleteTrafficType(cmd)
+        return traffictype
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/TrafficTypeImplementors.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/TrafficTypeImplementors.py b/tools/marvin/marvin/base/TrafficTypeImplementors.py
new file mode 100644
index 0000000..80c3bce
--- /dev/null
+++ b/tools/marvin/marvin/base/TrafficTypeImplementors.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.
+from marvin.base import CloudStackEntity
+from marvin.cloudstackAPI import listTrafficTypeImplementors
+
+class TrafficTypeImplementors(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listTrafficTypeImplementors.listTrafficTypeImplementorsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        traffictypeimplementors = apiclient.listTrafficTypeImplementors(cmd)
+        return map(lambda e: TrafficTypeImplementors(e.__dict__), traffictypeimplementors)
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/UsageRecords.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/UsageRecords.py b/tools/marvin/marvin/base/UsageRecords.py
new file mode 100644
index 0000000..e9c2b70
--- /dev/null
+++ b/tools/marvin/marvin/base/UsageRecords.py
@@ -0,0 +1,46 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import listUsageRecords
+from marvin.cloudstackAPI import generateUsageRecords
+
+class UsageRecords(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def list(self, apiclient, startdate, enddate, **kwargs):
+        cmd = listUsageRecords.listUsageRecordsCmd()
+        cmd.enddate = enddate
+        cmd.startdate = startdate
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        usagerecords = apiclient.listUsageRecords(cmd)
+        return map(lambda e: UsageRecords(e.__dict__), usagerecords)
+
+
+    def generate(self, apiclient, startdate, enddate, **kwargs):
+        cmd = generateUsageRecords.generateUsageRecordsCmd()
+        cmd.id = self.id
+        cmd.enddate = enddate
+        cmd.startdate = startdate
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        usagerecords = apiclient.generateUsageRecords(cmd)
+        return usagerecords
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/UsageTypes.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/UsageTypes.py b/tools/marvin/marvin/base/UsageTypes.py
new file mode 100644
index 0000000..fe6893a
--- /dev/null
+++ b/tools/marvin/marvin/base/UsageTypes.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.
+from marvin.base import CloudStackEntity
+from marvin.cloudstackAPI import listUsageTypes
+
+class UsageTypes(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listUsageTypes.listUsageTypesCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        usagetypes = apiclient.listUsageTypes(cmd)
+        return map(lambda e: UsageTypes(e.__dict__), usagetypes)
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/User.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/User.py b/tools/marvin/marvin/base/User.py
new file mode 100644
index 0000000..86e86d7
--- /dev/null
+++ b/tools/marvin/marvin/base/User.py
@@ -0,0 +1,107 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import enableUser
+from marvin.cloudstackAPI import getUser
+from marvin.cloudstackAPI import lockUser
+from marvin.cloudstackAPI import createUser
+from marvin.cloudstackAPI import listUsers
+from marvin.cloudstackAPI import updateUser
+from marvin.cloudstackAPI import disableUser
+from marvin.cloudstackAPI import deleteUser
+from marvin.cloudstackAPI import registerUserKeys
+
+class User(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def enable(self, apiclient, **kwargs):
+        cmd = enableUser.enableUserCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        user = apiclient.enableUser(cmd)
+        return user
+
+
+    def get(self, apiclient, userapikey, **kwargs):
+        cmd = getUser.getUserCmd()
+        cmd.id = self.id
+        cmd.userapikey = userapikey
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        user = apiclient.getUser(cmd)
+        return user
+
+
+    def lock(self, apiclient, **kwargs):
+        cmd = lockUser.lockUserCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        user = apiclient.lockUser(cmd)
+        return user
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createUser.createUserCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        user = apiclient.createUser(cmd)
+        return User(user.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listUsers.listUsersCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        user = apiclient.listUsers(cmd)
+        return map(lambda e: User(e.__dict__), user)
+
+
+    def update(self, apiclient, **kwargs):
+        cmd = updateUser.updateUserCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        user = apiclient.updateUser(cmd)
+        return user
+
+
+    def disable(self, apiclient, **kwargs):
+        cmd = disableUser.disableUserCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        user = apiclient.disableUser(cmd)
+        return user
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteUser.deleteUserCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        user = apiclient.deleteUser(cmd)
+        return user
+
+
+    def register_userkeys(self, apiclient, **kwargs):
+        cmd = registerUserKeys.registerUserKeysCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        userkeys = apiclient.registerUserKeys(cmd)
+        return userkeys
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/VMPassword.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/VMPassword.py b/tools/marvin/marvin/base/VMPassword.py
new file mode 100644
index 0000000..abead14
--- /dev/null
+++ b/tools/marvin/marvin/base/VMPassword.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.
+from marvin.base import CloudStackEntity
+from marvin.cloudstackAPI import getVMPassword
+
+class VMPassword(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def get(self, apiclient, **kwargs):
+        cmd = getVMPassword.getVMPasswordCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vmpassword = apiclient.getVMPassword(cmd)
+        return vmpassword
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/VMSnapshot.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/VMSnapshot.py b/tools/marvin/marvin/base/VMSnapshot.py
new file mode 100644
index 0000000..1241f30
--- /dev/null
+++ b/tools/marvin/marvin/base/VMSnapshot.py
@@ -0,0 +1,53 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createVMSnapshot
+from marvin.cloudstackAPI import listVMSnapshot
+from marvin.cloudstackAPI import deleteVMSnapshot
+
+class VMSnapshot(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createVMSnapshot.createVMSnapshotCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vmsnapshot = apiclient.createVMSnapshot(cmd)
+        return VMSnapshot(vmsnapshot.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listVMSnapshot.listVMSnapshotCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vmsnapshot = apiclient.listVMSnapshot(cmd)
+        return map(lambda e: VMSnapshot(e.__dict__), vmsnapshot)
+
+
+    def delete(self, apiclient, vmsnapshotid, **kwargs):
+        cmd = deleteVMSnapshot.deleteVMSnapshotCmd()
+        cmd.id = self.id
+        cmd.vmsnapshotid = vmsnapshotid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vmsnapshot = apiclient.deleteVMSnapshot(cmd)
+        return vmsnapshot
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/VPC.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/VPC.py b/tools/marvin/marvin/base/VPC.py
new file mode 100644
index 0000000..ad2ad10
--- /dev/null
+++ b/tools/marvin/marvin/base/VPC.py
@@ -0,0 +1,70 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createVPC
+from marvin.cloudstackAPI import listVPCs
+from marvin.cloudstackAPI import updateVPC
+from marvin.cloudstackAPI import restartVPC
+from marvin.cloudstackAPI import deleteVPC
+
+class VPC(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createVPC.createVPCCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vpc = apiclient.createVPC(cmd)
+        return VPC(vpc.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listVPCs.listVPCsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vpc = apiclient.listVPCs(cmd)
+        return map(lambda e: VPC(e.__dict__), vpc)
+
+
+    def update(self, apiclient, **kwargs):
+        cmd = updateVPC.updateVPCCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vpc = apiclient.updateVPC(cmd)
+        return vpc
+
+
+    def restart(self, apiclient, **kwargs):
+        cmd = restartVPC.restartVPCCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vpc = apiclient.restartVPC(cmd)
+        return vpc
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteVPC.deleteVPCCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vpc = apiclient.deleteVPC(cmd)
+        return vpc
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/VPCOffering.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/VPCOffering.py b/tools/marvin/marvin/base/VPCOffering.py
new file mode 100644
index 0000000..4ab767b
--- /dev/null
+++ b/tools/marvin/marvin/base/VPCOffering.py
@@ -0,0 +1,61 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import createVPCOffering
+from marvin.cloudstackAPI import listVPCOfferings
+from marvin.cloudstackAPI import updateVPCOffering
+from marvin.cloudstackAPI import deleteVPCOffering
+
+class VPCOffering(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    @classmethod
+    def create(cls, apiclient, factory, **kwargs):
+        cmd = createVPCOffering.createVPCOfferingCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vpcoffering = apiclient.createVPCOffering(cmd)
+        return VPCOffering(vpcoffering.__dict__)
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listVPCOfferings.listVPCOfferingsCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vpcoffering = apiclient.listVPCOfferings(cmd)
+        return map(lambda e: VPCOffering(e.__dict__), vpcoffering)
+
+
+    def update(self, apiclient, **kwargs):
+        cmd = updateVPCOffering.updateVPCOfferingCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vpcoffering = apiclient.updateVPCOffering(cmd)
+        return vpcoffering
+
+
+    def delete(self, apiclient, **kwargs):
+        cmd = deleteVPCOffering.deleteVPCOfferingCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        vpcoffering = apiclient.deleteVPCOffering(cmd)
+        return vpcoffering
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd838d72/tools/marvin/marvin/base/VirtualMachine.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/base/VirtualMachine.py b/tools/marvin/marvin/base/VirtualMachine.py
new file mode 100644
index 0000000..24c2ab4
--- /dev/null
+++ b/tools/marvin/marvin/base/VirtualMachine.py
@@ -0,0 +1,178 @@
+# 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.base import CloudStackEntity
+from marvin.cloudstackAPI import restoreVirtualMachine
+from marvin.cloudstackAPI import scaleVirtualMachine
+from marvin.cloudstackAPI import deployVirtualMachine
+from marvin.cloudstackAPI import migrateVirtualMachine
+from marvin.cloudstackAPI import listVirtualMachines
+from marvin.cloudstackAPI import stopVirtualMachine
+from marvin.cloudstackAPI import rebootVirtualMachine
+from marvin.cloudstackAPI import updateVirtualMachine
+from marvin.cloudstackAPI import startVirtualMachine
+from marvin.cloudstackAPI import destroyVirtualMachine
+from marvin.cloudstackAPI import assignVirtualMachine
+from marvin.cloudstackAPI import addNicToVirtualMachine
+from marvin.cloudstackAPI import removeNicFromVirtualMachine
+from marvin.cloudstackAPI import resetPasswordForVirtualMachine
+from marvin.cloudstackAPI import resetSSHKeyForVirtualMachine
+from marvin.cloudstackAPI import updateDefaultNicForVirtualMachine
+
+class VirtualMachine(CloudStackEntity.CloudStackEntity):
+
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+
+    def restore(self, apiclient, virtualmachineid, **kwargs):
+        cmd = restoreVirtualMachine.restoreVirtualMachineCmd()
+        cmd.id = self.id
+        cmd.virtualmachineid = virtualmachineid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        virtualmachine = apiclient.restoreVirtualMachine(cmd)
+        return virtualmachine
+
+
+    def scale(self, apiclient, serviceofferingid, **kwargs):
+        cmd = scaleVirtualMachine.scaleVirtualMachineCmd()
+        cmd.id = self.id
+        cmd.serviceofferingid = serviceofferingid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        virtualmachine = apiclient.scaleVirtualMachine(cmd)
+        return virtualmachine
+
+
+    @classmethod
+    def deploy(cls, apiclient, factory, **kwargs):
+        cmd = deployVirtualMachine.deployVirtualMachineCmd()
+        [setattr(cmd, factoryKey, factoryValue) for factoryKey, factoryValue in factory.__dict__.iteritems()]
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        virtualmachine = apiclient.deployVirtualMachine(cmd)
+        return VirtualMachine(virtualmachine.__dict__)
+
+
+    def migrate(self, apiclient, virtualmachineid, **kwargs):
+        cmd = migrateVirtualMachine.migrateVirtualMachineCmd()
+        cmd.id = self.id
+        cmd.virtualmachineid = virtualmachineid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        virtualmachine = apiclient.migrateVirtualMachine(cmd)
+        return virtualmachine
+
+
+    @classmethod
+    def list(self, apiclient, **kwargs):
+        cmd = listVirtualMachines.listVirtualMachinesCmd()
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        virtualmachine = apiclient.listVirtualMachines(cmd)
+        return map(lambda e: VirtualMachine(e.__dict__), virtualmachine)
+
+
+    def stop(self, apiclient, **kwargs):
+        cmd = stopVirtualMachine.stopVirtualMachineCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        virtualmachine = apiclient.stopVirtualMachine(cmd)
+        return virtualmachine
+
+
+    def reboot(self, apiclient, **kwargs):
+        cmd = rebootVirtualMachine.rebootVirtualMachineCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        virtualmachine = apiclient.rebootVirtualMachine(cmd)
+        return virtualmachine
+
+
+    def update(self, apiclient, **kwargs):
+        cmd = updateVirtualMachine.updateVirtualMachineCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        virtualmachine = apiclient.updateVirtualMachine(cmd)
+        return virtualmachine
+
+
+    def start(self, apiclient, **kwargs):
+        cmd = startVirtualMachine.startVirtualMachineCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        virtualmachine = apiclient.startVirtualMachine(cmd)
+        return virtualmachine
+
+
+    def destroy(self, apiclient, **kwargs):
+        cmd = destroyVirtualMachine.destroyVirtualMachineCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        virtualmachine = apiclient.destroyVirtualMachine(cmd)
+        return virtualmachine
+
+
+    def assign(self, apiclient, account, domainid, virtualmachineid, **kwargs):
+        cmd = assignVirtualMachine.assignVirtualMachineCmd()
+        cmd.id = self.id
+        cmd.account = account
+        cmd.domainid = domainid
+        cmd.virtualmachineid = virtualmachineid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        virtualmachine = apiclient.assignVirtualMachine(cmd)
+        return virtualmachine
+
+    def remove_nic(self, apiclient, nicid, **kwargs):
+        cmd = removeNicFromVirtualMachine.removeNicFromVirtualMachineCmd()
+        cmd.virtualmachineid = self.id
+        cmd.nicid = nicid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        nicfromvirtualmachine = apiclient.removeNicFromVirtualMachine(cmd)
+        return nicfromvirtualmachine
+
+
+    def add_nic(self, apiclient, networkid, **kwargs):
+        cmd = addNicToVirtualMachine.addNicToVirtualMachineCmd()
+        cmd.virtualmachineid = self.id
+        cmd.networkid = networkid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        nictovirtualmachine = apiclient.addNicToVirtualMachine(cmd)
+        return nictovirtualmachine
+
+
+    def update_default_nic(self, apiclient, nicid, **kwargs):
+        cmd = updateDefaultNicForVirtualMachine.updateDefaultNicForVirtualMachineCmd()
+        cmd.virtualmachineid = self.id
+        cmd.nicid = nicid
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        defaultnicforvirtualmachine = apiclient.updateDefaultNicForVirtualMachine(cmd)
+        return defaultnicforvirtualmachine
+
+
+    def reset_password(self, apiclient, **kwargs):
+        cmd = resetPasswordForVirtualMachine.resetPasswordForVirtualMachineCmd()
+        cmd.id = self.id
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        passwordforvirtualmachine = apiclient.resetPasswordForVirtualMachine(cmd)
+        return passwordforvirtualmachine
+
+
+    def reset_sshkey(self, apiclient, keypair, **kwargs):
+        cmd = resetSSHKeyForVirtualMachine.resetSSHKeyForVirtualMachineCmd()
+        cmd.id = self.id
+        cmd.keypair = keypair
+        [setattr(cmd, key, value) for key,value in kwargs.iteritems()]
+        sshkeyforvirtualmachine = apiclient.resetSSHKeyForVirtualMachine(cmd)
+        return sshkeyforvirtualmachine
+