コード例 #1
0
    def clone(self, old, new, full=False, start=False):
        """

        :param old:
        :param new:
        :param full:
        :param start:
        """
        conn = self.conn
        tree = ''
        uuid = tree.getiterator('uuid')[0]
        tree.remove(uuid)
        for vmname in tree.getiterator('name'):
            vmname.text = new
        firstdisk = True
        for disk in tree.getiterator('disk'):
            if firstdisk or full:
                source = disk.find('source')
                oldpath = source.get('file')
                backingstore = disk.find('backingStore')
                backing = None
                for b in backingstore.getiterator():
                    backingstoresource = b.find('source')
                    if backingstoresource is not None:
                        backing = backingstoresource.get('file')
                newpath = oldpath.replace(old, new)
                source.set('file', newpath)
                oldvolume = conn.storageVolLookupByPath(oldpath)
                oldinfo = oldvolume.info()
                oldvolumesize = (float(oldinfo[1]) / 1024 / 1024 / 1024)
                newvolumexml = self._xmlvolume(newpath, oldvolumesize, backing)
                pool = oldvolume.storagePoolLookupByVolume()
                pool.createXMLFrom(newvolumexml, oldvolume, 0)
                firstdisk = False
            else:
                devices = tree.getiterator('devices')[0]
                devices.remove(disk)
        for interface in tree.getiterator('interface'):
            mac = interface.find('mac')
            interface.remove(mac)
        if self.host not in ['127.0.0.1', 'localhost']:
            for serial in tree.getiterator('serial'):
                source = serial.find('source')
                source.set('service', str(common.get_free_port()))
        vm = conn.lookupByName(new)
        if start:
            vm.setAutostart(1)
        vm.create()
コード例 #2
0
def vmconsole(name):
    """
    Get url for console
    """
    config = Kconfig()
    k = config.k
    password = ''
    scheme = 'ws://'
    if find_executable('websockify') is None:
        return Response(status=404)
    consoleurl = k.console(name, tunnel=config.tunnel, web=True)
    if consoleurl.startswith('spice') or consoleurl.startswith('vnc'):
        protocol = 'spice' if consoleurl.startswith('spice') else 'vnc'
        websocketport = get_free_port()
        host, port = consoleurl.replace('%s://' % protocol, '').split(':')
        websocketcommand = "websockify %s -vD --idle-timeout=30 %s:%s" % (
            websocketport, host, port)
        if config.type == 'ovirt':
            port, password = port.split('+')
            if protocol == 'spice':
                scheme = 'ws://'
                cert = os.path.expanduser('~/.kcli/websockify.pem')
                if not os.path.exists(cert):
                    with open(cert, 'w') as f:
                        f.write(WEBSOCKIFYCERT)
                websocketcommand = "websockify %s -vD --idle-timeout=30 --cert %s --ssl-target %s:%s" % (
                    websocketport, cert, host, port)
            else:
                websocketcommand = "websockify %s -vD --idle-timeout=30 %s:%s" % (
                    websocketport, host, port)
        os.popen(websocketcommand)
        sleep(5)
        return render_template('%s.html' % protocol,
                               title='Vm console',
                               port=websocketport,
                               password=password,
                               scheme=scheme)
    elif consoleurl is not None:
        return redirect(consoleurl)
    else:
        return Response(status=404)
コード例 #3
0
    def create(self, name, virttype='vbox', profile='kvirt', flavor=None, plan='kvirt', cpumodel='', cpuflags=[],
               cpupinning=[], numcpus=2, memory=512, guestid='Linux_64', pool='default', image=None,
               disks=[{'size': 10}], disksize=10, diskthin=True, diskinterface='virtio', nets=['default'], iso=None,
               vnc=False, cloudinit=True, reserveip=False, reservedns=False, reservehost=False, start=True, keys=None,
               cmds=[], ips=None, netmasks=None, gateway=None, nested=True, dns=None, domain=None, tunnel=False,
               files=[], enableroot=True, alias=[], overrides={}, tags=None, dnsclient=None, autostart=False,
               cpuhotplug=False, memoryhotplug=False, numamode=None, numa=[]):
        """

        :param name:
        :param virttype:
        :param profile:
        :param flavor:
        :param plan:
        :param cpumodel:
        :param cpuflags:
        :param cpupinning:
        :param numcpus:
        :param memory:
        :param guestid:
        :param pool:
        :param image:
        :param disks:
        :param disksize:
        :param diskthin:
        :param diskinterface:
        :param nets:
        :param iso:
        :param vnc:
        :param cloudinit:
        :param reserveip:
        :param reservedns:
        :param reservehost:
        :param start:
        :param keys:
        :param cmds:
        :param ips:
        :param netmasks:
        :param gateway:
        :param nested:
        :param dns:
        :param domain:
        :param tunnel:
        :param files:
        :param enableroot:
        :param alias:
        :param overrides:
        :param tags:
        :param cpuhotplug:
        :param memoryhotplug:
        :param numamode:
        :param numa:
        :return:
        """
        if self.exists(name):
            return {'result': 'failure', 'reason': "VM %s already exists" % name}
        guestid = 'Linux_64'
        default_diskinterface = diskinterface
        default_diskthin = diskthin
        default_disksize = disksize
        default_pool = pool
        default_poolpath = '/tmp'
        conn = self.conn
        vm = conn.create_machine("", name, [], guestid, "")
        vm.cpu_count = numcpus
        vm.add_storage_controller('SATA', library.StorageBus(2))
        vm.add_storage_controller('IDE', library.StorageBus(1))
        vm.memory_size = memory
        vm.description = plan
        vm.set_extra_data('profile', profile)
        creationdate = time.strftime("%d-%m-%Y %H:%M", time.gmtime())
        vm.set_extra_data('creationdate', creationdate)
        serial = vm.get_serial_port(0)
        serial.server = True
        serial.enabled = True
        serial.path = str(common.get_free_port())
        serial.host_mode = library.PortMode.tcp
        nat_networks = [network.network_name for network in conn.nat_networks]
        internal_networks = [network for network in conn.internal_networks]
        for index, net in enumerate(nets):
            ip = None
            nic = vm.get_network_adapter(index)
            nic.adapter_type = library.NetworkAdapterType.virtio
            nic.enabled = True
            if isinstance(net, str):
                network = net
            elif isinstance(net, dict) and 'name' in net:
                network = net['name']
                if ips and len(ips) > index and ips[index] is not None:
                    ip = ips[index]
                    vm.set_extra_data('ip', ip)
                    nets[index]['ip'] = ip
                elif 'ip' in nets[index]:
                    ip = nets[index]['ip']
                    vm.set_extra_data('ip', ip)
                if 'mac' in nets[index]:
                    nic.mac_address = nets[index]['mac'].replace(':', '')
            if network in internal_networks:
                nic.attachment_type = library.NetworkAttachmentType.internal
                nic.internal_network = network
            elif network in nat_networks:
                nic.attachment_type = library.NetworkAttachmentType.nat_network
                nic.nat_network = network
                if index == 0:
                    natengine = nic.nat_engine
                    nat_network = [n for n in conn.nat_networks if n.network_name == network][0]
                    nat_network.add_port_forward_rule(False, 'ssh_%s' % name, library.NATProtocol.tcp, '',
                                                      common.get_free_port(), '', 22)
            else:
                nic.attachment_type = library.NetworkAttachmentType.nat
                if index == 0:
                    natengine = nic.nat_engine
                    natengine.add_redirect('ssh_%s' % name, library.NATProtocol.tcp, '', common.get_free_port(), '', 22)
        vm.save_settings()
        conn.register_machine(vm)
        session = Session()
        vm.lock_machine(session, library.LockType.write)
        machine = session.machine
        if iso is None and cloudinit:
            if image is not None:
                guestcmds = self.guestinstall(image)
                if not cmds:
                    cmds = guestcmds
                elif 'rhel' in image:
                    register = [c for c in cmds if 'subscription-manager' in c]
                    if register:
                        index = cmds.index(register[-1])
                        cmds[index + 1:index + 1] = guestcmds
                    else:
                        cmds = guestcmds + cmds
                else:
                    cmds = guestcmds + cmds
                cmds = cmds + ['reboot']
            common.cloudinit(name=name, keys=keys, cmds=cmds, nets=nets, gateway=gateway, dns=dns, domain=domain,
                             reserveip=reserveip, files=files, enableroot=enableroot)
            medium = conn.create_medium('RAW', '/tmp/%s.ISO' % name, library.AccessMode.read_only,
                                        library.DeviceType.dvd)
            progress = medium.create_base_storage(368, [library.MediumVariant.fixed])
            progress.wait_for_completion()
            dvd = conn.open_medium('/tmp/%s.ISO' % name, library.DeviceType.dvd, library.AccessMode.read_only, False)
            machine.attach_device("IDE", 0, 0, library.DeviceType.dvd, dvd)
        for index, disk in enumerate(disks):
            if disk is None:
                disksize = default_disksize
                diskthin = default_diskthin
                diskinterface = default_diskinterface
                diskpool = default_pool
                # diskpoolpath = default_poolpath
            elif isinstance(disk, int):
                disksize = disk
                diskthin = default_diskthin
                diskinterface = default_diskinterface
                diskpool = default_pool
                # diskpoolpath = default_poolpath
            elif isinstance(disk, str) or disk.isdigit():
                disksize = int(disk)
                diskthin = default_diskthin
                diskinterface = default_diskinterface
                diskpool = default_pool
                # diskpoolpath = default_poolpath
            elif isinstance(disk, dict):
                disksize = disk.get('size', default_disksize)
                diskthin = disk.get('thin', default_diskthin)
                diskinterface = disk.get('interface', default_diskinterface)
                diskpool = disk.get('pool', default_pool)
                # diskpoolpath = default_poolpath
            else:
                return {'result': 'failure', 'reason': "Invalid disk entry"}
            diskname = "%s_%d" % (name, index)
            if image is not None and index == 0:
                diskpath = self.create_disk(diskname, disksize, pool=diskpool, thin=diskthin, image=image)
                machine.set_extra_data('image', image)
                # return {'result': 'failure', 'reason': "Invalid image %s" % image}
            else:
                diskpath = self.create_disk(diskname, disksize, pool=diskpool, thin=diskthin, image=None)
            disk = conn.open_medium(diskpath, library.DeviceType.hard_disk, library.AccessMode.read_write, False)
            disksize = disksize * 1024 * 1024 * 1024
            progress = disk.resize(disksize)
            progress.wait_for_completion()
            machine.attach_device("SATA", index, 0, library.DeviceType.hard_disk, disk)
        poolpath = default_poolpath
        for p in self._pool_info():
            poolname = p['name']
            if poolname == pool:
                poolpath = p['path']
        if iso is not None:
            if not os.path.isabs(iso):
                iso = "%s/%s" % (poolpath, iso)
            if not os.path.exists(iso):
                return {'result': 'failure', 'reason': "Invalid iso %s" % iso}
            medium = conn.create_medium('RAW', iso, library.AccessMode.read_only, library.DeviceType.dvd)
            Gb = 1 * 1024 * 1024 * 1024
            progress = medium.create_base_storage(Gb, [library.MediumVariant.fixed])
            progress.wait_for_completion()
            dvd = conn.open_medium(iso, library.DeviceType.dvd, library.AccessMode.read_only, False)
            machine.attach_device("IDE", 0, 0, library.DeviceType.dvd, dvd)
        # if nested and virttype == 'kvm':
        #    print "prout"
        # else:
        #    print "prout"
        # if reserveip:
        #    vmxml = ''
        #    macs = []
        #    for element in vmxml.getiterator('interface'):
        #        mac = element.find('mac').get('address')
        #        macs.append(mac)
        #    self._reserve_ip(name, nets, macs)
        # if reservedns:
        #    self.reserve_dns(name, nets, domain)
        machine.save_settings()
        session.unlock_machine()
        if start:
            self.start(name)
        # if reservehost:
        #    common.reserve_host(name, nets, domain)
        return {'result': 'success'}
コード例 #4
0
ファイル: __init__.py プロジェクト: goffinet/kcli
 def create(self, name, virttype='vbox', title='', description='kvirt', numcpus=2, memory=512, guestid='Linux_64', pool='default', template=None, disks=[{'size': 10}], disksize=10, diskthin=True, diskinterface='virtio', nets=['default'], iso=None, vnc=False, cloudinit=True, reserveip=False, reservedns=False, start=True, keys=None, cmds=None, ips=None, netmasks=None, gateway=None, nested=True, dns=None, domain=None, tunnel=False, files=[]):
     guestid = 'Linux_64'
     default_diskinterface = diskinterface
     default_diskthin = diskthin
     default_disksize = disksize
     default_pool = pool
     default_poolpath = '/tmp'
     conn = self.conn
     vm = conn.create_machine("", name, [], guestid, "")
     vm.cpu_count = numcpus
     vm.add_storage_controller('SATA', library.StorageBus(2))
     vm.add_storage_controller('IDE', library.StorageBus(1))
     vm.memory_size = memory
     vm.description = description
     vm.set_extra_data('profile', title)
     serial = vm.get_serial_port(0)
     serial.server = True
     serial.enabled = True
     serial.path = str(common.get_free_port())
     serial.host_mode = library.PortMode.tcp
     for index, net in enumerate(nets):
         nic = vm.get_network_adapter(index)
         nic.enabled = True
         nic.attachment_type = library.NetworkAttachmentType.nat
         if index == 0:
             natengine = nic.nat_engine
             natengine.add_redirect('ssh', library.NATProtocol.tcp, '', common.get_free_port(), '', 22)
         if isinstance(net, str):
             # nic.attachment_type = library.NetworkAttachmentType.internal
             # nic.attachment_type = library.NetworkAttachmentType.nat
             # nic.attachment_type = library.NetworkAttachmentType.nat_network
             # nic.internal_network = net
             # nic.nat_network = net
             continue
         elif isinstance(net, dict) and 'name' in net:
             # nic.internal_network = net['name']
             # nic.nat_network = net['name']
             ip = None
             if ips and len(ips) > index and ips[index] is not None:
                 ip = ips[index]
                 nets[index]['ip'] = ip
             elif 'ip' in nets[index]:
                 ip = nets[index]['ip']
             if 'mac' in nets[index]:
                 nic.mac_address = nets[index]['mac'].replace(':', '')
     vm.save_settings()
     conn.register_machine(vm)
     session = Session()
     vm.lock_machine(session, library.LockType.write)
     machine = session.machine
     if cloudinit:
         common.cloudinit(name=name, keys=keys, cmds=cmds, nets=nets, gateway=gateway, dns=dns, domain=domain, reserveip=reserveip, files=files)
         medium = conn.create_medium('RAW', '/tmp/%s.iso' % name, library.AccessMode.read_only, library.DeviceType.dvd)
         progress = medium.create_base_storage(368, [library.MediumVariant.fixed])
         progress.wait_for_completion()
         dvd = conn.open_medium('/tmp/%s.iso' % name, library.DeviceType.dvd, library.AccessMode.read_only, False)
         machine.attach_device("IDE", 0, 0, library.DeviceType.dvd, dvd)
     for index, disk in enumerate(disks):
         if disk is None:
             disksize = default_disksize
             diskthin = default_diskthin
             diskinterface = default_diskinterface
             diskpool = default_pool
             # diskpoolpath = default_poolpath
         elif isinstance(disk, int):
             disksize = disk
             diskthin = default_diskthin
             diskinterface = default_diskinterface
             diskpool = default_pool
             # diskpoolpath = default_poolpath
         elif isinstance(disk, dict):
             disksize = disk.get('size', default_disksize)
             diskthin = disk.get('thin', default_diskthin)
             diskinterface = disk.get('interface', default_diskinterface)
             diskpool = disk.get('pool', default_pool)
             # diskpoolpath = default_poolpath
         else:
             return {'result': 'failure', 'reason': "Invalid disk entry"}
         diskname = "%s_%d" % (name, index)
         if template is not None and index == 0:
             diskpath = self.create_disk(diskname, disksize, pool=diskpool, thin=diskthin, template=template)
             machine.set_extra_data('template', template)
             # return {'result': 'failure', 'reason': "Invalid template %s" % template}
         else:
             diskpath = self.create_disk(diskname, disksize, pool=diskpool, thin=diskthin, template=None)
         disk = conn.open_medium(diskpath, library.DeviceType.hard_disk, library.AccessMode.read_write, False)
         print disksize
         disksize = disksize * 1024 * 1024 * 1024
         progress = disk.resize(disksize)
         progress.wait_for_completion()
         machine.attach_device("SATA", index, 0, library.DeviceType.hard_disk, disk)
     machine.save_settings()
     session.unlock_machine()
     if start:
         self.start(name)
     return {'result': 'success'}
     if iso is None:
         if cloudinit:
             iso = "%s/%s.iso" % (default_poolpath, name)
         else:
             iso = ''
     else:
         try:
             if os.path.isabs(iso):
                 shortiso = os.path.basename(iso)
             else:
                 shortiso = iso
             # iso = "%s/%s" % (default_poolpath, iso)
             # iso = "%s/%s" % (isopath, iso)
             print shortiso
         except:
             return {'result': 'failure', 'reason': "Invalid iso %s" % iso}
     # if nested and virttype == 'kvm':
     #    print "prout"
     # else:
     #    print "prout"
     # if reserveip:
     #    vmxml = ''
     #    macs = []
     #    for element in vmxml.getiterator('interface'):
     #        mac = element.find('mac').get('address')
     #        macs.append(mac)
     #    self._reserve_ip(name, nets, macs)
     # if reservedns:
     #    self._reserve_dns(name, nets, domain)
     return {'result': 'success'}
コード例 #5
0
ファイル: __init__.py プロジェクト: openpabz/kcli
    def console(self, name, tunnel=False):
        """

        :param name:
        :param tunnel:
        :return:
        """
        tunnel = False
        vmsearch = self.vms_service.list(search='name=%s' % name)
        if not vmsearch:
            common.pprint("VM %s not found" % name, color='red')
            return {'result': 'failure', 'reason': "VM %s not found" % name}
        vm = vmsearch[0]
        vm_service = self.vms_service.vm_service(vm.id)
        consoles_service = vm_service.graphics_consoles_service()
        consoles = consoles_service.list(current=True)
        for c in consoles:
            if str(c.protocol) == 'spice':
                console_service = consoles_service.console_service(c.id)
                ticket = console_service.ticket()
                ocacontent = open(self.ca_file).read().replace('\n', '\\n')
                subject = 'O=%s,CN=%s' % (self.org, c.address)
                if tunnel:
                    localport1 = common.get_free_port()
                    localport2 = common.get_free_port()
                    command = "ssh -o LogLevel=QUIET -f -p %s -L %s:127.0.0.1:%s -L %s:127.0.0.1:%s %s@%s sleep 10"\
                        % (self.port, localport1, c.port, localport2, c.tls_port, self.ssh_user, self.host)
                    os.popen(command)
                address = '127.0.0.1' if tunnel else c.address
                port = localport1 if tunnel else c.port
                sport = localport2 if tunnel else c.tls_port
                connectiondetails = """[virt-viewer]
type=spice
host={address}
port={port}
password={ticket}
tls-port={sport}
fullscreen=0
title={name}:%d
enable-smartcard=0
enable-usb-autoshare=1
delete-this-file=0
usb-filter=-1,-1,-1,-1,0
tls-ciphers=DEFAULT
host-subject={subject}
ca={ocacontent}
toggle-fullscreen=shift+f11
release-cursor=shift+f12
secure-attention=ctrl+alt+end
secure-channels=main;inputs;cursor;playback;record;display;usbredir;smartcard""".format(
                    subject=subject,
                    ocacontent=ocacontent,
                    address=address,
                    port=port,
                    sport=sport,
                    ticket=ticket.value,
                    name=name)
            elif str(c.protocol) == 'vnc':
                if tunnel:
                    localport1 = common.get_free_port()
                    command = "ssh -o LogLevel=QUIET -f -p %s -L %s:127.0.0.1:%s %s@%s sleep 10"\
                        % (self.port, localport1, c.port, self.ssh_user, self.host)
                    os.popen(command)
                port = localport1 if tunnel else c.port
                connectiondetails = """[virt-viewer]
type=vnc
host={address}
port={port}
password={ticket}
title={name}:%d
delete-this-file=0
toggle-fullscreen=shift+f11
release-cursor=shift+f12""".format(address=c.address,
                                   port=port,
                                   ticket=ticket.value,
                                   name=name)
        with open("/tmp/console.vv", "w") as f:
            f.write(connectiondetails)
        os.popen("remote-viewer /tmp/console.vv &")
        return