def attach(caller_id, storage_image_id, vm_id): # vm_id, img_id, destination='usb', check=True/False """ Attaches selected storage disk to specified Virtual Machine. Such disk may be mounted to VM so that data generated by VM may be stored on it. VM also gains access to data already stored on that storage disk. @cmview_user @parameter{storage_image_id,int} id of block device (should be Storage type) - Disk Volume Image @parameter{vm_id,int} id of the VM which Storage Image should be attached to @response{None} """ vm = VM.get(caller_id, vm_id) disk = StorageImage.get(caller_id, storage_image_id) # Check if disk is already attached to a vm if disk.vm: raise CMException('image_attached') disk.attach(vm) try: disk.save() except: raise CMException('storage_image_attach')
def get_by_id(caller_id, storage_image_id): """ @cmview_user @param_post{storage_image_id,int} id of the requested StorageImage @response{dict} StorageImage.dict property of the requested StorageImage """ return StorageImage.get(caller_id, storage_image_id).dict
def get_by_id(caller_id, storage_image_id): """ @cmview_user @parameter{storage_image_id,int} id of the Image to get @response{dict} extended information about specified Image """ return StorageImage.get(caller_id, storage_image_id).dict
def convert_to_system_image(caller_id, storage_image_id, platform, disk_controller, network_device, video_device): """ @cmview_user """ image = StorageImage.get(caller_id, storage_image_id) image.platform = platform image.disk_controller = disk_controller image.network_device = network_device image.video_device = video_device try: image.recast('cm.systemimage') image.save() except Exception: raise CMException('image_change_type')
def delete(caller_id, storage_image_id): """ Deletes given Image @cmview_user @parameter{storage_image_id} id of the Image to delete """ image = StorageImage.get(caller_id, storage_image_id) if image.state != image_states['ok']: raise CMException('image_delete') image.check_attached() try: subprocess.call(['rm', image.path]) except Exception, e: raise CMException('image_delete')
def detach(caller_id, storage_image_id, vm_id): """ Detaches specified StorageImage from specified VM. @cmview_user @param_post{vm_id,int} id of the VM StorageImage should be detached from @param_post{storage_image_id,int} id of the StorageImage to detach """ vm = VM.get(caller_id, vm_id) disk = StorageImage.get(caller_id, storage_image_id) disk.detach(vm) try: disk.save() except: raise CMException('storage_image_attach')
def delete(caller_id, storage_image_id): """ Deletes given StorageImage from CM storage space. Such an StorageImage can in no way be restored. It's also deleted from database. @cmview_user @param_post{storage_image_ids,list(int)} id of the StorageImage to delete """ image = StorageImage.get(caller_id, storage_image_id) if image.state != image_states['ok']: raise CMException('image_delete') image.check_attached() try: subprocess.call(['rm', image.path]) except Exception, e: raise CMException('image_delete')
def detach(caller_id, storage_image_id, vm_id): """ Detaches specified storage disk from specified VM. @cmview_user @parameter{vm_id,int} id of the VM from which to detach Image @parameter{storage_image_id,int} id of the Storage Image to detach - Disk Volume Image @response{None} """ vm = VM.get(caller_id, vm_id) disk = StorageImage.get(caller_id, storage_image_id) disk.detach(vm) try: disk.save() except: raise CMException('storage_image_attach')
def edit(caller_id, storage_image_id, name, description, disk_controller): """ Sets Image's new attributes. Those should be get by src.cm.manager.image.get_by_id(). @cmview_user @parameter{storage_image_id,int} id of the Image to edit @parameter{name,string} new Image name @parameter{description,string} new Image description @parameter{disk_controller} new Image controller optional """ image = StorageImage.get(caller_id, storage_image_id) if not image.state in [image_states['ok'], image_states['adding']]: raise CMException('image_edit') image.name = name image.description = description image.disk_controller = disk_controller try: image.save(update_fields=['name', 'description', 'disk_controller']) except: raise CMException('image_edit')
def convert_to_system_image(caller_id, storage_image_id, platform, disk_controller, network_device, video_device): """ Converts StorageImage to SystemImage so that it may be selected as os container when creating new VM. @cmview_user @param_post{storage_image_id,int} @param_post{platform} @param_post{disk_controller} @param_post{network_device} @param_post{video_device} """ image = StorageImage.get(caller_id, storage_image_id) image.platform = platform image.disk_controller = disk_controller image.network_device = network_device image.video_device = video_device try: image.recast('cm.systemimage') image.save() except Exception: raise CMException('image_change_type')
def edit(caller_id, storage_image_id, name, description, disk_controller): """ Sets Image's new attributes. Those should be get by src.cm.manager.image.get_by_id(). @cmview_user @param_post{storage_image_id,int} id of the Image to edit @param_post{name,string} new Image name @param_post{description,string} new Image description @param_post{disk_controller} new Image controller optional """ image = StorageImage.get(caller_id, storage_image_id) if not image.state in [image_states['ok'], image_states['adding']]: raise CMException('image_edit') image.name = name image.description = description image.disk_controller = disk_controller try: image.save(update_fields=['name', 'description', 'disk_controller']) except: raise CMException('image_edit')
def attach(caller_id, storage_image_id, vm_id): # vm_id, img_id, destination='usb', check=True/False """ Attaches selected StorageImage to specified VM. Such a disk may be mounted to VM so that data generated by VM could be stored on it. VM also has access to data already stored on that attached StorageImage. @cmview_user @param_post{storage_image_id,int} id of a StorageImage block device - Disk Volume Image @param_post{vm_id,int} id of the VM which StorageImage should be attached to """ vm = VM.get(caller_id, vm_id) disk = StorageImage.get(caller_id, storage_image_id) # Check if disk is already attached to a vm if disk.vm: raise CMException('image_attached') disk.attach(vm) try: disk.save() except: raise CMException('storage_image_attach')
def create(user, name, description, image_id, template_id, public_ip_id, iso_list, disk_list, vnc, groups, ssh_key=None, ssh_username=None, count=1, farm=None, head_template_id=None, node_id=False, lease_id=None, user_data=None): from cm.models.storage_image import StorageImage from cm.utils.threads.vm import VMThread template = Template.get(template_id) image = SystemImage.get(user.id, image_id, groups) if image.state != image_states['ok']: raise CMException('image_unavailable') if farm: head_template = Template.get(head_template_id) wn_template = template user.check_quota([(head_template, 1), (wn_template, count)]) count += 1 else: user.check_quota([(template, count)]) vms = [] reservation_id = None for i in range(count): # create VM instance log.debug(user.id, "Looking for node") node = Node.get_free_node(head_template, image, node_id) if farm and i == 0 else Node.get_free_node(template, image, node_id) log.info(user.id, 'Selected node: %d' % node.id) vm = VM() vm.libvirt_id = -1 if farm: if i == 0: vm.name = '%s-head' % name vm.description = 'Farm head' vm.template = head_template else: vm.name = '%s-wn%d' % (name, i) vm.description = 'Worker Node' vm.template = wn_template else: vm.template = template vm.description = description if count > 1: vm.name = '%s_%d' % (name, i + 1) else: vm.name = name vm.user = user vm.state = vm_states['init'] vm.start_time = datetime.now() vm.system_image = image vm.node = node vm.save_vm = True if farm: vm.farm = farm # Find first free vnc port used_ports = VM.objects.exclude(state__in=[vm_states['closed'], vm_states['erased']]).values_list('vnc_port', flat=True) for new_vnc_port in xrange(VNC_PORTS['START'], VNC_PORTS['END'] + 1): if new_vnc_port not in used_ports and new_vnc_port not in VNC_PORTS['EXCLUDE']: break else: raise CMException('vm_vnc_not_found') log.debug(user.id, "Found vnc port: %d" % new_vnc_port) vm.vnc_port = new_vnc_port # Find first free novnc port used_ports = VM.objects.exclude(state__in=[vm_states['closed'], vm_states['erased']]).values_list('novnc_port', flat=True) for new_novnc_port in xrange(NOVNC_PORTS['START'], NOVNC_PORTS['END'] + 1): if new_novnc_port not in used_ports and new_novnc_port not in NOVNC_PORTS['EXCLUDE']: break else: raise CMException('vm_novnc_not_found') log.debug(user.id, "Found novnc port: %d" % new_novnc_port) vm.novnc_port = new_novnc_port if vnc: vm.attach_vnc() vm.vnc_passwd = password_gen(13, chars=['letters', 'digits'], extra_chars='!@#$%^&*()') vm.ssh_key = ssh_key vm.ssh_username = ssh_username vm.user_data = user_data vm.save() if not reservation_id: reservation_id = vm.id vm.reservation_id = reservation_id vm.save() if farm and i == 0: farm.head = vm vms.append(vm) log.debug(user.id, "Attaching disks") disk_devs = [] if i == 0 and disk_list: for disk_id in disk_list: log.debug(user.id, 'Attaching disks to first VM') disk = StorageImage.get(user.id, disk_id) if disk.vm != None: raise CMException('image_attached') while disk.disk_dev in disk_devs: disk.disk_dev += 1 disk_devs.append(disk.disk_dev) disk.vm = vm disk.save() log.debug(user.id, "Attaching CD") if i == 0 and iso_list: for iso_id in iso_list: log.debug(user.id, 'Attaching iso to first VM') # cd image have not be attached to any other vm iso = IsoImage.get(user.id, iso_id) iso.check_attached() vm.iso_image = iso vm.save() for i, vm in enumerate(vms): if lease_id != None: lease = Lease.objects.get(id=lease_id) if lease.user_network.user != user: raise CMException('lease_permission') if lease.vm != None: raise CMException('lease_attached') lease.vm = vm log.debug(user.id, "Attached ip: %s" % lease.address) else: lease = AvailableNetwork.get_lease(user) lease.vm = vm lease.save() log.debug(user.id, "Attached ip: %s" % lease.address) if i == 0 and public_ip_id > 0: log.debug(user.id, "Attaching PublicIP") try: publicip = PublicIP.objects.filter(user=user).get(id=public_ip_id) publicip.assign(lease) publicip.save() except Exception, e: log.exception(user.id, str(e)) raise CMException("lease_not_found")
def create(user, name, description, image_id, template_id, public_ip_id, iso_list, disk_list, vnc, groups, ssh_key=None, ssh_username=None, count=1, farm=None, head_template_id=None, node_id=False, lease_id=None, user_data=None): from cm.models.storage_image import StorageImage from cm.utils.threads.vm import VMThread template = Template.get(template_id) image = SystemImage.get(user.id, image_id, groups) if image.state != image_states['ok']: raise CMException('image_unavailable') if farm: head_template = Template.get(head_template_id) wn_template = template user.check_quota([(head_template, 1), (wn_template, count)]) count += 1 else: user.check_quota([(template, count)]) vms = [] reservation_id = None for i in range(count): # create VM instance log.debug(user.id, "Looking for node") node = Node.get_free_node( head_template, image, node_id) if farm and i == 0 else Node.get_free_node( template, image, node_id) log.info(user.id, 'Selected node: %d' % node.id) vm = VM() vm.libvirt_id = -1 if farm: if i == 0: vm.name = '%s-head' % name vm.description = 'Farm head' vm.template = head_template else: vm.name = '%s-wn%d' % (name, i) vm.description = 'Worker Node' vm.template = wn_template else: vm.template = template vm.description = description if count > 1: vm.name = '%s_%d' % (name, i + 1) else: vm.name = name vm.user = user vm.state = vm_states['init'] vm.start_time = datetime.now() vm.system_image = image vm.node = node vm.save_vm = True if farm: vm.farm = farm # Find first free vnc port used_ports = VM.objects.exclude( state__in=[vm_states['closed'], vm_states['erased'] ]).values_list('vnc_port', flat=True) for new_vnc_port in xrange(VNC_PORTS['START'], VNC_PORTS['END'] + 1): if new_vnc_port not in used_ports and new_vnc_port not in VNC_PORTS[ 'EXCLUDE']: break else: raise CMException('vm_vnc_not_found') log.debug(user.id, "Found vnc port: %d" % new_vnc_port) vm.vnc_port = new_vnc_port # Find first free novnc port used_ports = VM.objects.exclude( state__in=[vm_states['closed'], vm_states['erased'] ]).values_list('novnc_port', flat=True) for new_novnc_port in xrange(NOVNC_PORTS['START'], NOVNC_PORTS['END'] + 1): if new_novnc_port not in used_ports and new_novnc_port not in NOVNC_PORTS[ 'EXCLUDE']: break else: raise CMException('vm_novnc_not_found') log.debug(user.id, "Found novnc port: %d" % new_novnc_port) vm.novnc_port = new_novnc_port if vnc: vm.attach_vnc() vm.vnc_passwd = password_gen(13, chars=['letters', 'digits'], extra_chars='!@#$%^&*()') vm.ssh_key = ssh_key vm.ssh_username = ssh_username vm.user_data = user_data vm.save() if not reservation_id: reservation_id = vm.id vm.reservation_id = reservation_id vm.save() if farm and i == 0: farm.head = vm vms.append(vm) log.debug(user.id, "Attaching disks") disk_devs = [] if i == 0 and disk_list: for disk_id in disk_list: log.debug(user.id, 'Attaching disks to first VM') disk = StorageImage.get(user.id, disk_id) if disk.vm != None: raise CMException('image_attached') while disk.disk_dev in disk_devs: disk.disk_dev += 1 disk_devs.append(disk.disk_dev) disk.vm = vm disk.save() log.debug(user.id, "Attaching CD") if i == 0 and iso_list: for iso_id in iso_list: log.debug(user.id, 'Attaching iso to first VM') # cd image have not be attached to any other vm iso = IsoImage.get(user.id, iso_id) iso.check_attached() vm.iso_image = iso vm.save() for i, vm in enumerate(vms): if lease_id != None: lease = Lease.objects.get(id=lease_id) if lease.user_network.user != user: raise CMException('lease_permission') if lease.vm != None: raise CMException('lease_attached') lease.vm = vm log.debug(user.id, "Attached ip: %s" % lease.address) else: lease = AvailableNetwork.get_lease(user) lease.vm = vm lease.save() log.debug(user.id, "Attached ip: %s" % lease.address) if i == 0 and public_ip_id > 0: log.debug(user.id, "Attaching PublicIP") try: publicip = PublicIP.objects.filter(user=user).get( id=public_ip_id) publicip.assign(lease) publicip.save() except Exception, e: log.exception(user.id, str(e)) raise CMException("lease_not_found")