You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2012/02/20 07:19:30 UTC

svn commit: r1291129 - in /libcloud/trunk/libcloud/compute: drivers/libvirt_driver.py providers.py types.py

Author: tomaz
Date: Mon Feb 20 06:19:29 2012
New Revision: 1291129

URL: http://svn.apache.org/viewvc?rev=1291129&view=rev
Log:
Start working on libvirt driver.

Added:
    libcloud/trunk/libcloud/compute/drivers/libvirt_driver.py
Modified:
    libcloud/trunk/libcloud/compute/providers.py
    libcloud/trunk/libcloud/compute/types.py

Added: libcloud/trunk/libcloud/compute/drivers/libvirt_driver.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/libvirt_driver.py?rev=1291129&view=auto
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/libvirt_driver.py (added)
+++ libcloud/trunk/libcloud/compute/drivers/libvirt_driver.py Mon Feb 20 06:19:29 2012
@@ -0,0 +1,116 @@
+# 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 libcloud.compute.base import NodeDriver, NodeSize, Node
+from libcloud.compute.base import NodeImage, NodeState
+from libcloud.compute.types import Provider
+
+try:
+    import libvirt
+    have_libvirt = True
+except ImportError:
+    have_libvirt = False
+
+
+class LibvirtNodeDriver(NodeDriver):
+    """
+    Libvirt (http://libvirt.org/) node driver.
+
+    Usage: LibvirtNodeDriver(uri='vbox:///session').
+    To enable debug mode, set LIBVIR_DEBUG environment variable.
+    """
+
+    type = Provider.LIBVIRT
+
+    NODE_STATE_MAP = {
+        0: NodeState.TERMINATED,
+        1: NodeState.RUNNING,
+        2: NodeState.PENDING,
+        3: NodeState.TERMINATED, # paused
+        4: NodeState.TERMINATED, # shutting down
+        5: NodeState.TERMINATED,
+        6: NodeState.UNKNOWN, # crashed
+        7: NodeState.UNKNOWN, # last
+    }
+
+    def __init__(self, uri):
+        if not have_libvirt:
+            raise RuntimeError('Libvirt driver requires \'libvirt\' Python package')
+
+        self._uri = uri
+        self.connection = libvirt.open(uri)
+
+    def list_nodes(self):
+       domain_ids = self.connection.listDomainsID()
+       domains = [self.connection.lookupByID(id) for id in domain_ids]
+
+       nodes = []
+       for domain in domains:
+           states = [state for state in domain.state(flags=0) if state != 0]
+
+           if len(states) >= 1:
+               state = self.NODE_STATE_MAP[states[0]]
+           else:
+               state = NodeState.UNKNOWN
+
+           # TODO: Use XML config to get Mac address and then parse ips
+           extra = {'uuid': domain.UUIDString(), 'os_type': domain.OSType(),
+                    'types': self.connection.getType()}
+           node = Node(id=domain.ID(), name=domain.name(), state=state,
+                       public_ips=[], private_ips=[], driver=self,
+                       extra=extra)
+           nodes.append(node)
+
+       return nodes
+
+    def reboot_node(self, node):
+        domain = self._get_domain_for_node(node=node)
+        return domain.reboot(flags=0) == 0
+
+    def destroy_node(self, node):
+        domain = self._get_domain_for_node(node=node)
+        return domain.destroy(flags=0) == 0
+
+    def ex_start(self, node):
+        """
+        Start a stopped node.
+        """
+        domain = self._get_domain_for_node(node=node)
+        return domain.create() == 0
+
+    def ex_shutdown(self, node):
+        """
+        Shutdown a running node.
+        """
+        domain = self._get_domain_for_node(node=node)
+        return domain.shutdown() == 0
+
+    def ex_suspend(self, node):
+        """
+        Suspend a running node.
+        """
+        domain = self._get_domain_for_node(node=node)
+        return domain.suspend() == 0
+
+    def ex_resume(self, node):
+        """
+        Resume a suspended node.
+        """
+        domain = self._get_domain_for_node(node=node)
+        return domain.resume() == 0
+
+    def _get_domain_for_node(self, node):
+        domain = self.connection.lookupByID(int(node.id))
+        return domain

Modified: libcloud/trunk/libcloud/compute/providers.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/providers.py?rev=1291129&r1=1291128&r2=1291129&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/providers.py (original)
+++ libcloud/trunk/libcloud/compute/providers.py Mon Feb 20 06:19:29 2012
@@ -104,7 +104,9 @@ DRIVERS = {
     Provider.RACKSPACE_NOVA_BETA:
         ('libcloud.compute.drivers.rackspacenova', 'RackspaceNovaBetaNodeDriver'),
     Provider.RACKSPACE_NOVA_DFW:
-        ('libcloud.compute.drivers.rackspacenova', 'RackspaceNovaDfwNodeDriver')
+        ('libcloud.compute.drivers.rackspacenova', 'RackspaceNovaDfwNodeDriver'),
+    Provider.LIBVIRT:
+        ('libcloud.compute.drivers.libvirt_driver', 'LinodeNodeDriver')
 }
 
 

Modified: libcloud/trunk/libcloud/compute/types.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/types.py?rev=1291129&r1=1291128&r2=1291129&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/types.py (original)
+++ libcloud/trunk/libcloud/compute/types.py Mon Feb 20 06:19:29 2012
@@ -62,6 +62,7 @@ class Provider(object):
     @cvar CLOUDSTACK: CloudStack
     @cvar CLOUDSIGMA_US: CloudSigma US Las Vegas
     @cvar RACKSPACE_NOVA_BETA: Rackspace Nova Private Beta (ORD)
+    @cvar LIBVIRT: Libvirt driver
     """
     DUMMY = 0
     EC2 = 1  # deprecated name
@@ -107,6 +108,7 @@ class Provider(object):
     EC2_SA_EAST = 39
     RACKSPACE_NOVA_BETA = 40
     RACKSPACE_NOVA_DFW = 41
+    LIBVIRT= 42
 
 
 class NodeState(object):