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()
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)
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'}
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'}
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