Exemplo n.º 1
0
    def __init__(self, poolinfo):
        self.connection = False
        self.libvirt_connection = False
        self.poolinfo = poolinfo
        self.format_for = Formatter()

        self.connect()
Exemplo n.º 2
0
 def __init__(self):
     self.connection = False
     self.format_for = Formatter()
Exemplo n.º 3
0
class SimpleStack(object):
    """
    This module is the base implementation for all hypervisors available.

    It uses libvirt as the fallback implementation and throw an error
    (FeatureNotImplemented) if the hypervisor doesn't have an implementation
    for the given method and doesn't support libvirt also.
    """
    def __init__(self):
        self.connection = False
        self.format_for = Formatter()

    def libvirt_connect(self):
        return libvirt.open(self.libvirt_connection_path())

    def libvirt_connection_path(self):
        proto = config.get("libvirt", "transport")

        if proto == "ssh":
            keyfile = config.get("libvirt", "ssh_keyfile")

            if os.path.exists(keyfile):
                params = "keyfile=%s" % keyfile
            else:
                raise SSHKeyNotFound
        else:
            params = "no_verify=1"

        conn_str = "qemu+%(proto)s://%(username)s@%(server)s/system?%(params)s"

        return (conn_str % {
            "params": params,
            "proto": proto,
            "server": self.poolinfo.get("api_server"),
            "username": self.poolinfo.get("username"),
        })

    def connect(self):
        """
        Each hypervisor should implement this method to return its own connection
        object or just use the libvirt_connect() here.
        """
        raise FeatureNotImplemented()

    @require_libvirt(True)
    def pool_info(self):
        free = self.libvirt_connection.getFreeMemory() / 1024 / 1024
        total = self.libvirt_connection.getInfo()[1]
        address = self.poolinfo.get("api_server").split(":")[0]

        return self.format_for.pool(total - free, free, address)

    @require_libvirt(True)
    def host_list(self):
        hosts = []
        hosts.append(
            {"id": "libvirt:" + self.poolinfo.get("api_server").split(":")[0]})
        return hosts

    @require_libvirt(True)
    def host_info(self, host_id):
        return (self.format_for.host(
            "libvirt:" + self.poolinfo.get("api_server").split(":")[0],
            self.poolinfo.get("api_server").split(":")[0],
            self.poolinfo.get("api_server").split(":")[0],
        ))

    @require_libvirt(True)
    def storage_list(self):
        storages = []

        for storage in self.libvirt_connection.listAllStoragePools(0):
            storages.append({"id": storage.UUIDString()})

        return storages

    @require_libvirt(True)
    def storage_info(self, storage_id):
        s = self.libvirt_connection.storagePoolLookupByUUIDString(storage_id)
        info = s.info()
        return (self.format_for.storage(
            storage_id,
            s.name(),
            "Not defined for Libvirt",
            int(info[2]),
            int(info[2]),
            int(info[1]),
        ))

    @require_libvirt(True)
    def guest_list(self):
        not_running = [
            self.libvirt_vm_info(self.libvirt_connection.lookupByName(vm_name))
            for vm_name in self.libvirt_connection.listDefinedDomains()
        ]
        running = [
            self.libvirt_vm_info(self.libvirt_connection.lookupByID(vm_id))
            for vm_id in self.libvirt_connection.listDomainsID()
        ]
        return not_running + running

    def guest_create(self, guestdata):
        raise FeatureNotImplemented()

    def guest_clone(self, guest_id, guestdata):
        raise FeatureNotImplemented()

    def guest_import(self, gueststream, guestsize, storage_id=None):
        raise FeatureNotImplemented()

    def guest_export(self, guest_id):
        raise FeatureNotImplemented()

    @require_libvirt(True)
    def guest_info(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        return self.libvirt_vm_info(dom)

    @require_libvirt(True)
    def guest_shutdown(self, guest_id, force=False):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        if force:
            return dom.destroy()
        else:
            return dom.shutdown()

    @require_libvirt(True)
    def guest_start(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        dom.create()

    @require_libvirt(True)
    def guest_suspend(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        return dom.suspend()

    @require_libvirt(True)
    def guest_resume(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        return dom.resume()

    @require_libvirt(True)
    def guest_reboot(self, guest_id, force=False):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        if force:
            return vm.reset(0)
        else:
            return vm.reboot(0)

    def guest_update(self, guest_id, guestdata):
        raise FeatureNotImplemented()

    @require_libvirt(True)
    def guest_delete(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        dom.undefine()
        dom.destroy()

    def disk_list(self, guest_id):
        raise FeatureNotImplemented()

    def disk_create(self, guest_id, data):
        raise FeatureNotImplemented()

    def disk_info(self, guest_id, disk_id):
        raise FeatureNotImplemented()

    def disk_update(self, guest_id, disk_id, data):
        raise FeatureNotImplemented()

    def disk_delete(self, guest_id, disk_id):
        raise FeatureNotImplemented()

    def media_mount(self, guest_id, media_data):
        raise FeatureNotImplemented()

    def media_info(self, guest_id):
        raise FeatureNotImplemented()

    def media_unmount(self, guest_id):
        raise FeatureNotImplemented()

    @require_libvirt(True)
    def network_interface_list(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        root = et.fromstring(dom.XMLDesc(0))

        interfaces = []

        for iface in root.iter("interface"):
            iface_param = {}
            for i in iface.getchildren():
                key = i.attrib.keys()[0]
                iface_param[key] = i.attrib[key]

            # Keeping the contract for id values
            iface_param["id"] = iface_param["address"]
            interfaces.append(iface_param)

        return interfaces

    @require_libvirt(True)
    def network_interface_create(self, guest_id, data):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        root = et.fromstring(dom.XMLDesc(0))

        interface = et.Element('interface')
        interface.set("type", "network")

        model = et.SubElement(interface, 'model')
        model.set("type", "virtio")

        if data.get("mac"):
            mac = et.SubElement(interface, 'mac')
            mac.set("address", str(data["mac"]))

        if data.get("network"):
            mac = et.SubElement(interface, 'source')
            mac.set("network", str(data["network"]))

        if data.get("name"):
            mac = et.SubElement(interface, 'alias')
            mac.set("name", str(data["name"]))

        dom.attachDeviceFlags(et.tostring(interface), 2)

        nw_interfaces = self.network_interface_list(guest_id)

        return {"id": nw_interfaces[-1]["id"]}

    @require_libvirt(True)
    def network_interface_info(self, guest_id, network_interface_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        root = et.fromstring(dom.XMLDesc(0))

        nw_interfaces = self.network_interface_list(guest_id)

        for iface in nw_interfaces:
            if iface["id"] == network_interface_id:
                return iface

        raise EntityNotFound("Network interface", network_interface_id)

    def network_interface_update(self, guest_id, network_interface_id, data):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        root = et.fromstring(dom.XMLDesc(0))

        # For each children of each interface, set the attributes to data
        # if the mac is the same of network_interface_id
        for iface in root.iter("interface"):
            for i in iface.getchildren():
                if i.attrib.get("mac") == network_interface_id:
                    for k, v in data:
                        data.set(k, v)

                    dom.updateDeviceFlags(et.tostring(iface), 2)

    def network_interface_delete(self, guest_id, network_interface_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        root = et.fromstring(dom.XMLDesc(0))

        iface_id = "address"  # defining the simplestack's libvirt id

        for iface in root.iter("interface"):
            for i in iface.getchildren():
                if i.attrib.get(iface_id) == network_interface_id:
                    dom.detachDeviceFlags(et.tostring(iface), 2)
                    return {"id": network_interface_id}

        raise EntityNotFound("Network interface", network_interface_id)

    @require_libvirt(True)
    def snapshot_list(self, guest_id):
        dom = self.libvirt_connection.lookupByID(guest_id)
        snaps = [
            self.libvirt_snapshot_info(s) for s in dom.snapshotListNames()
        ]
        return snaps

    def snapshot_create(self, guestname, name=None):
        raise FeatureNotImplemented()

    @require_libvirt(True)
    def snapshot_info(self, guestname, snapshot_name):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        snap = self.libvirt_get_snapshot(dom, snapshot_id)
        if snap:
            return self.libvirt_snapshot_info(snap)
        else:
            raise EntityNotFound("Snapshot", snapshot_id)

    @require_libvirt(True)
    def snapshot_delete(self, guest_id, snapshot_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        snap = self.libvirt_get_snapshot(dom, snapshot_id)
        snap.delete(0)

    @require_libvirt(True)
    def snapshot_revert(self, guest_id, snapshot_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        snap = self.libvirt_get_snapshot(dom, snapshot_id)
        dom.revertToSnapshot(snap)

    def tag_list(self, guest_id):
        raise FeatureNotImplemented()

    def tag_create(self, guest_id, tag_name):
        raise FeatureNotImplemented()

    def tag_delete(self, guest_id, tag_name):
        raise FeatureNotImplemented()

    def libvirt_vm_info(self, dom):
        infos = dom.info()
        return (self.format_for.guest(dom.UUIDString(), dom.name(), infos[3],
                                      infos[1] / 1024, None, None, None, None,
                                      self.state_translation[infos[0]], None))

    def libvirt_snapshot_info(self, snapshot):
        return (self.format_for.snapshot(snapshot.get_description(),
                                         snapshot.name(), snapshot.get_state(),
                                         snapshot.get_path(),
                                         snapshot.get_create_time()))

    def libvirt_get_snapshot(self, dom, snapshot_id):
        pass
Exemplo n.º 4
0
class Stack(SimpleStack):

    state_translation = {"POWERED ON": "STARTED", "POWERED OFF": "STOPPED", "SUSPENDED": "PAUSED"}

    def __init__(self, poolinfo):
        self.connection = False
        self.poolinfo = poolinfo
        self.format_for = Formatter()
        self.connect()

    def libvirt_connect(self):
        self.libvirt_connection = libvirt.open(
            "esx://%s@%s/" % (self.poolinfo.get("username"), self.poolinfo.get("api_server"))
        )

    def connect(self):
        self.connection = VIServer()
        self.connection.connect(
            self.poolinfo.get("api_server"), self.poolinfo.get("username"), self.poolinfo.get("password")
        )
        return

    def pool_info(self):
        return self.format_for.pool(0, 0, self.poolinfo.get("api_server"))

    def guest_list(self):
        return [
            {"id": self.connection.get_vm_by_path(path).properties.name}
            for path in self.connection.get_registered_vms(cluster=self.poolinfo.get("cluster"))
        ]

    def guest_info(self, guest_id):
        vm = self._vm_ref(guest_id)
        return self._vm_info(vm)

    def guest_shutdown(self, guest_id, force=False):
        vm = self._vm_ref(guest_id)
        if force:
            return vm.power_off()
        else:
            return vm.shutdown_guest()

    def guest_start(self, guest_id):
        vm = self._vm_ref(guest_id)
        return vm.power_on()

    def guest_reboot(self, guest_id, force=False):
        vm = self._vm_ref(guest_id)
        if force:
            return vm.reset()
        else:
            return vm.reboot_guest()

    def guest_suspend(self, guest_id):
        vm = self._vm_ref(guest_id)
        return vm.suspend()

    def guest_resume(self, guest_id):
        return self.guest_start(guest_id)

    def guest_update(self, guest_id, guestdata):
        vm = self._vm_ref(guest_id)
        vmware.update_vm(self.connection, vm, guestdata)
        return self._vm_info(self._vm_ref(guest_id))

    def guest_delete(self, guest_id):
        vm = self._vm_ref(guest_id)
        vmware.delete_vm(self.connection, vm)

    def media_mount(self, guest_id, media_data):
        vm = self._vm_ref(guest_id)
        vmware.update_vm(self.connection, vm, {"iso": media_data})

    def media_info(self, guest_id):
        vm = self._vm_ref(guest_id)
        media = vmware.get_cd(vm)
        if media.connectable.connected:
            return {"name": media.backing.fileName}
        else:
            return {"name": None}

    def network_interface_list(self, guest_id):
        vm = self._vm_ref(guest_id)
        vifs = vmware.get_network_interfaces(vm)
        return [self._network_interface_info(n) for n in vifs]

    def network_interface_info(self, guest_id, network_interface_id):
        vm = self._vm_ref(guest_id)
        vifs = vmware.get_network_interfaces(vm)

        for vif in vifs:
            if vif.macAddress == network_interface_id:
                return self._network_interface_info(vif)

        entity_info = "%s - on Guest %s" % (network_interface_id, guest_id)
        raise EntityNotFound("NetworkInterface", entity_info)

    def snapshot_list(self, guest_id):
        vm = self._vm_ref(guest_id)
        snaps = [self._snapshot_info(s) for s in vm.get_snapshots()]
        return snaps

    def snapshot_create(self, guest_id, snapshot_name=None):
        if not snapshot_name:
            snapshot_name = str(datetime.datetime.now())
        vm = self._vm_ref(guest_id)
        snap = vmware.create_snapshot(self.connection, vm, snapshot_name)
        return self._snapshot_info(snap)

    def snapshot_info(self, guest_id, snapshot_id):
        vm = self._vm_ref(guest_id)
        snap = vmware.get_snapshot(vm, snapshot_id)
        if snap:
            return self._snapshot_info(snap)
        else:
            raise EntityNotFound("Snapshot", snapshot_id)

    def snapshot_revert(self, guest_id, snapshot_id):
        vm = self._vm_ref(guest_id)
        snap = vmware.get_snapshot(vm, snapshot_id)
        vmware.revert_to_snapshot(self.connection, vm, snap)

    def snapshot_delete(self, guest_id, snapshot_id):
        vm = self._vm_ref(guest_id)
        snap = vmware.get_snapshot(vm, snapshot_id)
        vmware.delete_snapshot(self.connection, vm, snap)

    def tag_list(self, guest_id):
        vm = self._vm_ref(guest_id)
        return vmware.get_tags(vm)

    def tag_create(self, guest_id, tag_name):
        vm = self._vm_ref(guest_id)
        tags = vmware.create_tag(tag_name, vm)
        vmware.update_vm(self.connection, vm, {"tags": tags})
        return tags

    def tag_delete(self, guest_id, tag_name):
        vm = self._vm_ref(guest_id)
        tags = vmware.delete_tag(tag_name, vm)
        vmware.update_vm(self.connection, vm, {"tags": tags})
        return tags

    def _vm_ref(self, vm_id):
        regex = r"[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"
        if re.match(regex, vm_id, re.I):
            return vmware.get_vm_by_uuid(self.connection, vm_id)
        else:
            return self.connection.get_vm_by_name(vm_id)

    def _vm_info(self, vm):
        vm_info = vm.get_properties()
        return self.format_for.guest(
            vm.properties.config.uuid,
            vm_info.get("name"),
            vm_info.get("num_cpu"),
            vm_info.get("memory_mb"),
            vmware.get_disk_size(vm) / (1024 * 1024),
            vmware.get_vmi_driver(vm) is not None,
            vm.properties.guest.toolsStatus == "toolsOk",
            None,
            self.state_translation[vm.get_status()],
            None,
        )

    def _network_interface_info(self, vif):
        return self.format_for.network_interface(
            vif.macAddress, vif.unitNumber, vif.macAddress, "", "", "", vif.backing.network.name
        )

    def _snapshot_info(self, snapshot):
        return self.format_for.snapshot(
            snapshot.get_description(),
            snapshot.get_name(),
            snapshot.get_state(),
            snapshot.get_path(),
            snapshot.get_create_time(),
        )
Exemplo n.º 5
0
 def __init__(self, poolinfo):
     self.connection = False
     self.poolinfo = poolinfo
     self.format_for = Formatter()
     self.connect()
Exemplo n.º 6
0
class Stack(SimpleStack):
    """
    Mock hypervisor defines the interface for the hypervisors.

    This module will be the first to receive new methods and validate
    the code interface for the other hypervisors.
    """

    default_guest_data = {
        "cd": None,
        "cpus": "4",
        "disks": [
            {"id": 1, "name": "disk1", "size":100}
        ],
        "host": "localhost",
        "ip": None,
        "memory": "1024",
        "network_interfaces": {
            "00:11:22:33:44:55": {
                "id": "00:11:22:33:44:55",
                "number": "0",
                "mac": "00:11:22:33:44:55",
                "network": "network1"
            }
        },
        "paravirtualized": True,
        "snapshots": {},
        "state": "STARTED",
        "tags": [],
        "tools_up_to_date": False,
    }

    guests = {}
    hosts = [
        {"id": 1, "name": "host1", "address": "127.0.0.1"}
    ]
    storages = [
        {"id": 1, "name": "storage1", "type": "NFS", "allocated_space": 100}
    ]

    def __init__(self, poolinfo):
        self.connection = False
        self.poolinfo = poolinfo
        self.format_for = Formatter()

    def connect(self):
        pass

    def pool_info(self):
        return self.format_for.pool(1024, 64, "127.0.0.1")

    def guest_list(self):
        return self.guests.values()

    def guest_info(self, guest_id):
        return self.guests.get(guest_id)

    def guest_shutdown(self, guest_id, force=False):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        self.guests[guest_id]['state'] = "STOPPED"

    def guest_start(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        self.guests[guest_id]['state'] = "STARTED"

    def guest_reboot(self, guest_id, force=False):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        self.guests[guest_id]['state'] = "STARTED"

    def guest_suspend(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        self.guests[guest_id]['state'] = "PAUSED"

    def guest_resume(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        self.guests[guest_id]['state'] = "STARTED"

    def guest_create(self, guestdata):
        guest = self.default_guest_data.copy()
        guest["id"] = str(uuid.uuid4())
        self.guests[guest["id"]] = guest
        return guest

    def guest_delete(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        del self.guests[guest_id]

    def guest_update(self, guest_id, guestdata):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)

        self.guests[guest_id].update(guestdata)

        return self.guests[guest_id]

    def media_mount(self, guest_id, media_data):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)

        self.guests[guest_id]["cd"] = media_data.get("name")

    def media_info(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        return {"name": self.guests[guest_id]["cd"]}

    def network_interface_list(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)

        return self.guests[guest_id]['network_interfaces'].values()

    def network_interface_create(self, guest_id, data):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        mac = "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x" % (
            random.randint(0, 255), random.randint(0, 255),
            random.randint(0, 255), random.randint(0, 255),
            random.randint(0, 255), random.randint(0, 255),
            random.randint(0, 255), random.randint(0, 255)
        )
        self.guests[guest_id]['network_interfaces'][mac] = {
            "id": mac,
            "number": "0",
            "mac": mac,
            "network": "network1"
        }

        return self.guests[guest_id]['network_interfaces'][mac]

    def network_interface_info(self, guest_id, interface_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)

        return self.guests[guest_id]['network_interfaces'][interface_id]

    def network_interface_update(self, guest_id, interface_id, data):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)

        nw_int = self.guests[guest_id]['network_interfaces'][interface_id]
        if data.get("network"):
            nw_int["network"] = data["network"]
        return nw_int

    def network_interface_delete(self, guest_id, interface_id):
        del self.guests[guest_id]['network_interfaces'][interface_id]

    def snapshot_list(self, guest_id):
        return self.guests[guest_id]['snapshots'].values()

    def snapshot_create(self, guest_id, name=None):
        if not name:
            name = str(datetime.datetime.now())
        snapshot_id = str(uuid.uuid4())

        snapshot = {
            'id': snapshot_id,
            'name': name,
            'created': str(datetime.datetime.now())
        }

        self.guests[guest_id]['snapshots'][snapshot_id] = snapshot
        return snapshot

    def snapshot_info(self, guest_id, snapshot_id):
        return self.guests[guest_id]['snapshots'][snapshot_id]

    def snapshot_revert(self, guest_id, snapshot_id):
        pass

    def snapshot_delete(self, guest_id, snapshot_id):
        del self.guests[guest_id]['snapshots'][snapshot_id]

    def tag_list(self, guest_id):
        return self.guests[guest_id]['tags']

    def tag_create(self, guest_id, tag_name):
        self.guests[guest_id]['tags'].append(tag_name)
        return self.guests[guest_id]['tags']

    def tag_delete(self, guest_id, tag_name):
        for tag in self.guests[guest_id]['tags'][:]:
            if tag == tag_name:
                self.guests[guest_id]['tags'].remove(tag_name)

        return self.guests[guest_id]['tags']


    def disk_create(self, guest_id, data):
        data["id"] = str(randint(1,10000))
        self.guests[guest_id]["disks"].append(data)
        return data

    def disk_list(self, guest_id):
        return self.guests[guest_id]["disks"]

    def disk_info(self, guest_id, disk_id):
        return [
            disk
            for disk in self.guests[guest_id]["disks"]
            if disk["id"] == disk_id
        ][0]

    def disk_update(self, guest_id, disk_id, data):
        disk = self.disk_info(guest_id, disk_id)
        self.guests[guest_id]["disks"] = [
            disk
            for disk in self.guests[guest_id]["disks"]
            if disk["id"] != disk_id
        ]
        data["id"] = disk["id"]
        self.guests[guest_id]["disks"].append(data)
        return data


    def host_info(self, host_id):
        return [i for i in self.hosts if i["id"] == host_id][0]

    def host_list(self):
        return self.hosts

    def storage_info(self, storage_id):
        return [i for i in self.storages if i["id"] == storage_id][0]

    def storage_list(self):
        return self.storages
Exemplo n.º 7
0
 def __init__(self):
     self.connection = False
     self.format_for = Formatter()
Exemplo n.º 8
0
class SimpleStack(object):
    """
    This module is the base implementation for all hypervisors available.

    It uses libvirt as the fallback implementation and throw an error
    (FeatureNotImplemented) if the hypervisor doesn't have an implementation
    for the given method and doesn't support libvirt also.
    """

    def __init__(self):
        self.connection = False
        self.format_for = Formatter()

    def libvirt_connect(self):
        return libvirt.open(self.libvirt_connection_path())

    def libvirt_connection_path(self):
        proto = config.get("libvirt", "transport")

        if proto == "ssh":
            keyfile = config.get("libvirt", "ssh_keyfile")

            if os.path.exists(keyfile):
                params = "keyfile=%s" % keyfile
            else:
                raise SSHKeyNotFound
        else:
            params = "no_verify=1"

        conn_str = "qemu+%(proto)s://%(username)s@%(server)s/system?%(params)s"

        return(conn_str % {
            "params": params,
            "proto" : proto,
            "server": self.poolinfo.get("api_server"),
            "username": self.poolinfo.get("username"),
        })

    def connect(self):
        """
        Each hypervisor should implement this method to return its own connection
        object or just use the libvirt_connect() here.
        """
        raise FeatureNotImplemented()

    @require_libvirt(True)
    def pool_info(self):
        free = self.libvirt_connection.getFreeMemory()/1024/1024
        total = self.libvirt_connection.getInfo()[1]
        address = self.poolinfo.get("api_server").split(":")[0]

        return self.format_for.pool(total - free, free, address)

    @require_libvirt(True)
    def host_list(self):
        hosts = []
        hosts.append(
            {"id": "libvirt:" + self.poolinfo.get("api_server").split(":")[0]}
        )
        return hosts

    @require_libvirt(True)
    def host_info(self, host_id):
        return(
            self.format_for.host(
                "libvirt:" + self.poolinfo.get("api_server").split(":")[0],
                self.poolinfo.get("api_server").split(":")[0],
                self.poolinfo.get("api_server").split(":")[0],
            )
        )

    @require_libvirt(True)
    def storage_list(self):
        storages = []

        for storage in self.libvirt_connection.listAllStoragePools(0):
            storages.append({"id": storage.UUIDString()})

        return storages

    @require_libvirt(True)
    def storage_info(self, storage_id):
        s = self.libvirt_connection.storagePoolLookupByUUIDString(storage_id)
        info = s.info()
        return(
            self.format_for.storage(
                storage_id,
                s.name(),
                "Not defined for Libvirt",
                int(info[2]),
                int(info[2]),
                int(info[1]),
            )
        )

    @require_libvirt(True)
    def guest_list(self):
        not_running = [
            self.libvirt_vm_info(self.libvirt_connection.lookupByName(vm_name))
            for vm_name in self.libvirt_connection.listDefinedDomains()
        ]
        running = [
            self.libvirt_vm_info(self.libvirt_connection.lookupByID(vm_id))
            for vm_id in self.libvirt_connection.listDomainsID()
        ]
        return not_running + running

    def guest_create(self, guestdata):
        raise FeatureNotImplemented()

    def guest_clone(self, guest_id, guestdata):
        raise FeatureNotImplemented()

    def guest_import(self, gueststream, guestsize, storage_id=None):
        raise FeatureNotImplemented()

    def guest_export(self, guest_id):
        raise FeatureNotImplemented()

    @require_libvirt(True)
    def guest_info(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        return self.libvirt_vm_info(dom)

    @require_libvirt(True)
    def guest_shutdown(self, guest_id, force=False):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        if force:
            return dom.destroy()
        else:
            return dom.shutdown()

    @require_libvirt(True)
    def guest_start(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        dom.create()

    @require_libvirt(True)
    def guest_suspend(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        return dom.suspend()

    @require_libvirt(True)
    def guest_resume(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        return dom.resume()

    @require_libvirt(True)
    def guest_reboot(self, guest_id, force=False):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        if force:
            return vm.reset(0)
        else:
            return vm.reboot(0)

    def guest_update(self, guest_id, guestdata):
        raise FeatureNotImplemented()

    @require_libvirt(True)
    def guest_delete(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        dom.undefine()
        dom.destroy()

    def disk_list(self, guest_id):
        raise FeatureNotImplemented()

    def disk_create(self, guest_id, data):
        raise FeatureNotImplemented()

    def disk_info(self, guest_id, disk_id):
        raise FeatureNotImplemented()

    def disk_update(self, guest_id, disk_id, data):
        raise FeatureNotImplemented()

    def disk_delete(self, guest_id, disk_id):
        raise FeatureNotImplemented()

    def media_mount(self, guest_id, media_data):
        raise FeatureNotImplemented()

    def media_info(self, guest_id):
        raise FeatureNotImplemented()

    def media_unmount(self, guest_id):
        raise FeatureNotImplemented()

    @require_libvirt(True)
    def network_interface_list(self, guest_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        root = et.fromstring(dom.XMLDesc(0))

        interfaces = []

        for iface in root.iter("interface"):
            iface_param = {}
            for i in iface.getchildren():
                key = i.attrib.keys()[0]
                iface_param[key] = i.attrib[key]

            # Keeping the contract for id values
            iface_param["id"] = iface_param["address"]
            interfaces.append(iface_param)

        return interfaces

    @require_libvirt(True)
    def network_interface_create(self, guest_id, data):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        root = et.fromstring(dom.XMLDesc(0))

        interface = et.Element('interface')
        interface.set("type", "network")

        model = et.SubElement(interface, 'model')
        model.set("type", "virtio")

        if data.get("mac"):
            mac = et.SubElement(interface, 'mac')
            mac.set("address", str(data["mac"]))

        if data.get("network"):
            mac = et.SubElement(interface, 'source')
            mac.set("network", str(data["network"]))

        if data.get("name"):
            mac = et.SubElement(interface, 'alias')
            mac.set("name", str(data["name"]))

        dom.attachDeviceFlags(et.tostring(interface), 2)

        nw_interfaces = self.network_interface_list(guest_id)

        return {"id": nw_interfaces[-1]["id"]}

    @require_libvirt(True)
    def network_interface_info(self, guest_id, network_interface_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        root = et.fromstring(dom.XMLDesc(0))

        nw_interfaces = self.network_interface_list(guest_id)

        for iface in nw_interfaces:
            if iface["id"] == network_interface_id:
                return iface

        raise EntityNotFound("Network interface", network_interface_id)

    def network_interface_update(self, guest_id, network_interface_id, data):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        root = et.fromstring(dom.XMLDesc(0))

        # For each children of each interface, set the attributes to data
        # if the mac is the same of network_interface_id
        for iface in root.iter("interface"):
            for i in iface.getchildren():
                if i.attrib.get("mac") == network_interface_id:
                    for k,v in data:
                        data.set(k,v)

                    dom.updateDeviceFlags(et.tostring(iface), 2)


    def network_interface_delete(self, guest_id, network_interface_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        root = et.fromstring(dom.XMLDesc(0))

        iface_id = "address"  # defining the simplestack's libvirt id

        for iface in root.iter("interface"):
            for i in iface.getchildren():
                if i.attrib.get(iface_id) == network_interface_id:
                    dom.detachDeviceFlags(et.tostring(iface), 2)
                    return {"id": network_interface_id}

        raise EntityNotFound("Network interface", network_interface_id)

    @require_libvirt(True)
    def snapshot_list(self, guest_id):
        dom = self.libvirt_connection.lookupByID(guest_id)
        snaps = [
            self.libvirt_snapshot_info(s)
            for s in dom.snapshotListNames()
        ]
        return snaps

    def snapshot_create(self, guestname, name=None):
        raise FeatureNotImplemented()

    @require_libvirt(True)
    def snapshot_info(self, guestname, snapshot_name):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        snap = self.libvirt_get_snapshot(dom, snapshot_id)
        if snap:
            return self.libvirt_snapshot_info(snap)
        else:
            raise EntityNotFound("Snapshot", snapshot_id)

    @require_libvirt(True)
    def snapshot_delete(self, guest_id, snapshot_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        snap = self.libvirt_get_snapshot(dom, snapshot_id)
        snap.delete(0)

    @require_libvirt(True)
    def snapshot_revert(self, guest_id, snapshot_id):
        dom = self.libvirt_connection.lookupByUUIDString(guest_id)
        snap = self.libvirt_get_snapshot(dom, snapshot_id)
        dom.revertToSnapshot(snap)

    def tag_list(self, guest_id):
        raise FeatureNotImplemented()

    def tag_create(self, guest_id, tag_name):
        raise FeatureNotImplemented()

    def tag_delete(self, guest_id, tag_name):
        raise FeatureNotImplemented()

    def libvirt_vm_info(self, dom):
        infos = dom.info()
        return (
            self.format_for.guest(
                dom.UUIDString(),
                dom.name(),
                infos[3],
                infos[1] / 1024,
                None,
                None,
                None,
                None,
                self.state_translation[infos[0]],
                None
            )
        )

    def libvirt_snapshot_info(self, snapshot):
        return (
            self.format_for.snapshot(
                snapshot.get_description(),
                snapshot.name(),
                snapshot.get_state(),
                snapshot.get_path(),
                snapshot.get_create_time()
            )
        )

    def libvirt_get_snapshot(self, dom, snapshot_id):
        pass
Exemplo n.º 9
0
class Stack(SimpleStack):
    """
    Mock hypervisor defines the interface for the hypervisors.

    This module will be the first to receive new methods and validate
    the code interface for the other hypervisors.
    """

    default_guest_data = {
        "cd": None,
        "cpus": "4",
        "disks": [{
            "id": 1,
            "name": "disk1",
            "size": 100
        }],
        "host": "localhost",
        "ip": None,
        "memory": "1024",
        "network_interfaces": {
            "00:11:22:33:44:55": {
                "id": "00:11:22:33:44:55",
                "number": "0",
                "mac": "00:11:22:33:44:55",
                "network": "network1"
            }
        },
        "paravirtualized": True,
        "snapshots": {},
        "state": "STARTED",
        "tags": [],
        "tools_up_to_date": False,
    }

    guests = {}
    hosts = [{"id": 1, "name": "host1", "address": "127.0.0.1"}]
    storages = [{
        "id": 1,
        "name": "storage1",
        "type": "NFS",
        "allocated_space": 100
    }]

    def __init__(self, poolinfo):
        self.connection = False
        self.poolinfo = poolinfo
        self.format_for = Formatter()

    def connect(self):
        pass

    def pool_info(self):
        return self.format_for.pool(1024, 64, "127.0.0.1")

    def guest_list(self):
        return self.guests.values()

    def guest_info(self, guest_id):
        return self.guests.get(guest_id)

    def guest_shutdown(self, guest_id, force=False):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        self.guests[guest_id]['state'] = "STOPPED"

    def guest_start(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        self.guests[guest_id]['state'] = "STARTED"

    def guest_reboot(self, guest_id, force=False):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        self.guests[guest_id]['state'] = "STARTED"

    def guest_suspend(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        self.guests[guest_id]['state'] = "PAUSED"

    def guest_resume(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        self.guests[guest_id]['state'] = "STARTED"

    def guest_create(self, guestdata):
        guest = self.default_guest_data.copy()
        guest["id"] = str(uuid.uuid4())
        self.guests[guest["id"]] = guest
        return guest

    def guest_delete(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        del self.guests[guest_id]

    def guest_update(self, guest_id, guestdata):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)

        self.guests[guest_id].update(guestdata)

        return self.guests[guest_id]

    def media_mount(self, guest_id, media_data):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)

        self.guests[guest_id]["cd"] = media_data.get("name")

    def media_info(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        return {"name": self.guests[guest_id]["cd"]}

    def network_interface_list(self, guest_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)

        return self.guests[guest_id]['network_interfaces'].values()

    def network_interface_create(self, guest_id, data):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)
        mac = "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x" % (random.randint(
            0, 255), random.randint(0, 255), random.randint(
                0, 255), random.randint(0, 255), random.randint(
                    0, 255), random.randint(0, 255), random.randint(
                        0, 255), random.randint(0, 255))
        self.guests[guest_id]['network_interfaces'][mac] = {
            "id": mac,
            "number": "0",
            "mac": mac,
            "network": "network1"
        }

        return self.guests[guest_id]['network_interfaces'][mac]

    def network_interface_info(self, guest_id, interface_id):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)

        return self.guests[guest_id]['network_interfaces'][interface_id]

    def network_interface_update(self, guest_id, interface_id, data):
        if not self.guests.get(guest_id):
            raise EntityNotFound("Guest", guest_id)

        nw_int = self.guests[guest_id]['network_interfaces'][interface_id]
        if data.get("network"):
            nw_int["network"] = data["network"]
        return nw_int

    def network_interface_delete(self, guest_id, interface_id):
        del self.guests[guest_id]['network_interfaces'][interface_id]

    def snapshot_list(self, guest_id):
        return self.guests[guest_id]['snapshots'].values()

    def snapshot_create(self, guest_id, name=None):
        if not name:
            name = str(datetime.datetime.now())
        snapshot_id = str(uuid.uuid4())

        snapshot = {
            'id': snapshot_id,
            'name': name,
            'created': str(datetime.datetime.now())
        }

        self.guests[guest_id]['snapshots'][snapshot_id] = snapshot
        return snapshot

    def snapshot_info(self, guest_id, snapshot_id):
        return self.guests[guest_id]['snapshots'][snapshot_id]

    def snapshot_revert(self, guest_id, snapshot_id):
        pass

    def snapshot_delete(self, guest_id, snapshot_id):
        del self.guests[guest_id]['snapshots'][snapshot_id]

    def tag_list(self, guest_id):
        return self.guests[guest_id]['tags']

    def tag_create(self, guest_id, tag_name):
        self.guests[guest_id]['tags'].append(tag_name)
        return self.guests[guest_id]['tags']

    def tag_delete(self, guest_id, tag_name):
        for tag in self.guests[guest_id]['tags'][:]:
            if tag == tag_name:
                self.guests[guest_id]['tags'].remove(tag_name)

        return self.guests[guest_id]['tags']

    def disk_create(self, guest_id, data):
        data["id"] = str(randint(1, 10000))
        self.guests[guest_id]["disks"].append(data)
        return data

    def disk_list(self, guest_id):
        return self.guests[guest_id]["disks"]

    def disk_info(self, guest_id, disk_id):
        return [
            disk for disk in self.guests[guest_id]["disks"]
            if disk["id"] == disk_id
        ][0]

    def disk_update(self, guest_id, disk_id, data):
        disk = self.disk_info(guest_id, disk_id)
        self.guests[guest_id]["disks"] = [
            disk for disk in self.guests[guest_id]["disks"]
            if disk["id"] != disk_id
        ]
        data["id"] = disk["id"]
        self.guests[guest_id]["disks"].append(data)
        return data

    def host_info(self, host_id):
        return [i for i in self.hosts if i["id"] == host_id][0]

    def host_list(self):
        return self.hosts

    def storage_info(self, storage_id):
        return [i for i in self.storages if i["id"] == storage_id][0]

    def storage_list(self):
        return self.storages
Exemplo n.º 10
0
class Stack(SimpleStack):

    state_translation = {
        "POWERED ON": "STARTED",
        "POWERED OFF": "STOPPED",
        "SUSPENDED": "PAUSED"
    }

    def __init__(self, poolinfo):
        self.connection = False
        self.poolinfo = poolinfo
        self.format_for = Formatter()
        self.connect()

    def libvirt_connect(self):
        self.libvirt_connection = libvirt.open(
            "esx://%s@%s/" %
            (self.poolinfo.get("username"), self.poolinfo.get("api_server")))

    def connect(self):
        self.connection = VIServer()
        self.connection.connect(self.poolinfo.get("api_server"),
                                self.poolinfo.get("username"),
                                self.poolinfo.get("password"))
        return

    def pool_info(self):
        return (self.format_for.pool(0, 0, self.poolinfo.get("api_server")))

    def guest_list(self):
        return [{
            "id": self.connection.get_vm_by_path(path).properties.name
        } for path in self.connection.get_registered_vms(
            cluster=self.poolinfo.get('cluster'))]

    def guest_info(self, guest_id):
        vm = self._vm_ref(guest_id)
        return self._vm_info(vm)

    def guest_shutdown(self, guest_id, force=False):
        vm = self._vm_ref(guest_id)
        if force:
            return vm.power_off()
        else:
            return vm.shutdown_guest()

    def guest_start(self, guest_id):
        vm = self._vm_ref(guest_id)
        return vm.power_on()

    def guest_reboot(self, guest_id, force=False):
        vm = self._vm_ref(guest_id)
        if force:
            return vm.reset()
        else:
            return vm.reboot_guest()

    def guest_suspend(self, guest_id):
        vm = self._vm_ref(guest_id)
        return vm.suspend()

    def guest_resume(self, guest_id):
        return self.guest_start(guest_id)

    def guest_update(self, guest_id, guestdata):
        vm = self._vm_ref(guest_id)
        vmware.update_vm(self.connection, vm, guestdata)
        return self._vm_info(self._vm_ref(guest_id))

    def guest_delete(self, guest_id):
        vm = self._vm_ref(guest_id)
        vmware.delete_vm(self.connection, vm)

    def media_mount(self, guest_id, media_data):
        vm = self._vm_ref(guest_id)
        vmware.update_vm(self.connection, vm, {"iso": media_data})

    def media_info(self, guest_id):
        vm = self._vm_ref(guest_id)
        media = vmware.get_cd(vm)
        if media.connectable.connected:
            return {"name": media.backing.fileName}
        else:
            return {"name": None}

    def network_interface_list(self, guest_id):
        vm = self._vm_ref(guest_id)
        vifs = vmware.get_network_interfaces(vm)
        return [self._network_interface_info(n) for n in vifs]

    def network_interface_info(self, guest_id, network_interface_id):
        vm = self._vm_ref(guest_id)
        vifs = vmware.get_network_interfaces(vm)

        for vif in vifs:
            if vif.macAddress == network_interface_id:
                return self._network_interface_info(vif)

        entity_info = "%s - on Guest %s" % (network_interface_id, guest_id)
        raise EntityNotFound("NetworkInterface", entity_info)

    def snapshot_list(self, guest_id):
        vm = self._vm_ref(guest_id)
        snaps = [self._snapshot_info(s) for s in vm.get_snapshots()]
        return snaps

    def snapshot_create(self, guest_id, snapshot_name=None):
        if not snapshot_name:
            snapshot_name = str(datetime.datetime.now())
        vm = self._vm_ref(guest_id)
        snap = vmware.create_snapshot(self.connection, vm, snapshot_name)
        return self._snapshot_info(snap)

    def snapshot_info(self, guest_id, snapshot_id):
        vm = self._vm_ref(guest_id)
        snap = vmware.get_snapshot(vm, snapshot_id)
        if snap:
            return self._snapshot_info(snap)
        else:
            raise EntityNotFound("Snapshot", snapshot_id)

    def snapshot_revert(self, guest_id, snapshot_id):
        vm = self._vm_ref(guest_id)
        snap = vmware.get_snapshot(vm, snapshot_id)
        vmware.revert_to_snapshot(self.connection, vm, snap)

    def snapshot_delete(self, guest_id, snapshot_id):
        vm = self._vm_ref(guest_id)
        snap = vmware.get_snapshot(vm, snapshot_id)
        vmware.delete_snapshot(self.connection, vm, snap)

    def tag_list(self, guest_id):
        vm = self._vm_ref(guest_id)
        return vmware.get_tags(vm)

    def tag_create(self, guest_id, tag_name):
        vm = self._vm_ref(guest_id)
        tags = vmware.create_tag(tag_name, vm)
        vmware.update_vm(self.connection, vm, {"tags": tags})
        return tags

    def tag_delete(self, guest_id, tag_name):
        vm = self._vm_ref(guest_id)
        tags = vmware.delete_tag(tag_name, vm)
        vmware.update_vm(self.connection, vm, {"tags": tags})
        return tags

    def _vm_ref(self, vm_id):
        regex = r'[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}'
        if re.match(regex, vm_id, re.I):
            return vmware.get_vm_by_uuid(self.connection, vm_id)
        else:
            return self.connection.get_vm_by_name(vm_id)

    def _vm_info(self, vm):
        vm_info = vm.get_properties()
        return (self.format_for.guest(
            vm.properties.config.uuid, vm_info.get('name'),
            vm_info.get('num_cpu'), vm_info.get('memory_mb'),
            vmware.get_disk_size(vm) / (1024 * 1024),
            vmware.get_vmi_driver(vm) is not None,
            vm.properties.guest.toolsStatus == "toolsOk", None,
            self.state_translation[vm.get_status()], None))

    def _network_interface_info(self, vif):
        return (self.format_for.network_interface(vif.macAddress,
                                                  vif.unitNumber,
                                                  vif.macAddress, '', '', '',
                                                  vif.backing.network.name))

    def _snapshot_info(self, snapshot):
        return (self.format_for.snapshot(snapshot.get_description(),
                                         snapshot.get_name(),
                                         snapshot.get_state(),
                                         snapshot.get_path(),
                                         snapshot.get_create_time()))