def stop_instance(self, **args): if "name" not in args or not args["name"]: return {"message": "Domain name not specified !", "code": 1} domain = args["name"] if not utils.domain_exists(domain): return {"message": "Domain %s not found !" % domain, "code": 1} stat = utils.domain_stat(domain) if "shut off" in stat: return { "message": "Domain %s already stopped !" % domain, "code": 0 } virshcmd = "virsh destroy %s" % domain pipe = Popen(virshcmd, shell=True, stdout=PIPE, stderr=PIPE) err = pipe.stderr.read() info = pipe.stdout.read() log.debug("Stop domain %s: %s %s" % (domain, err, info)) if info and "Domain %s destroyed" % domain in info: return {"message": "Domain %s stopped !" % domain, "code": 0} else: return { "message": "Fail to stop Domain %s: %s" % (domain, err), "code": 1 }
def attach_volume(self, **args): if "instance_name" not in args or not args["instance_name"]: return {"message": "Domain name not specified", "code": 1} instance_name = args["instance_name"] domain_exists = utils.domain_exists(instance_name) if not domain_exists: return { "message": "Domain %s not found" % instance_name, "code": 1 } stat = utils.domain_stat(instance_name) live = "shut off" not in stat if "name" not in args or not args["name"]: return {"message": "Volume name not specified", "code": 1} name = args["name"] target = "%s%s%s%s.xml" % (config.instance_data, instance_name, os.sep, name) if not os.path.exists(target): return {"message": "Volume %s xml not found" % name, "code": 1} volume_config = open(target).read() log.debug("Volume: %s" % volume_config) if "TARGET" in volume_config: device = utils.get_available_blk_target(instance_name) volume_config, count = re.subn("'vd[a-z]'|'TARGET'", "'%s'" % device, volume_config) log.debug(volume_config) utils.persist(volume_config, target) virshcmd = "virsh attach-device \ --domain %s --file %s \ --config %s" % (instance_name, target, "--live" if live else "") pipe = Popen(virshcmd, shell=True, stdout=PIPE, stderr=PIPE) err = pipe.stderr.read() info = pipe.stdout.read() log.debug("Attach Disk with command '%s', and system output:'%s %s'" % (virshcmd, err, info)) if info and "Device attached successfully" in info: return { "message": "Volume %s attached to domain %s" % (name, instance_name), "code": 0 } else: return { "message": "Fail to attach %s to domain %s" % (name, instance_name), "code": 1 }
def detach_volume(self, **args): if "instance_name" not in args or not args["instance_name"]: return {"message": "Domain name not specified", "code": 1} instance_name = args["instance_name"] domain_exists = utils.domain_exists(instance_name) if not domain_exists: return { "message": "Domain %s not found" % instance_name, "code": 1 } stat = utils.domain_stat(instance_name) live = "shut off" not in stat if "name" not in args or not args["name"]: return {"message": "Volume name not specified", "code": 1} name = args["name"] target = "%s%s%s%s.xml" % (config.instance_data, instance_name, os.sep, name) if not os.path.exists(target): return {"message": "Volume %s xml not found" % name, "code": 1} if not self.__volume_attached(instance_name, name): return {"message": "Volume %s already detached" % name, "code": 0} virshcmd = "virsh detach-device \ --domain %s --file %s \ --config %s" % (instance_name, target, "--live" if live else "") pipe = Popen(virshcmd, shell=True, stdout=PIPE, stderr=PIPE) err = pipe.stderr.read() info = pipe.stdout.read() log.debug("Detach volume %s from domain %s: %s %s" % (name, instance_name, err, info)) if info and "Device detached successfully" in info: return { "message": "Volume %s detached from domain %s" % (name, instance_name), "code": 0 } else: return { "message": "Fail to detach volume %s from domain %s" % (name, instance_name), "code": 1 }
def attach_cdrom(self, **args): if "name" not in args or not args["name"]: return {"message": 1, "code": "Domain name not specified !"} domain = args["name"] if not utils.domain_exists(domain): return {"message": 1, "code": "Domain %s not found !" % domain} if "iso_file" not in args or not args["iso_file"]: return {"message": "ISO file not specified !", "code": 1} iso_file = args["iso_file"] if not utils.ceph_blk_exists(config.ceph_iso_pool, iso_file, config.ceph_iso_pool_user): return { "message": "File %s not uploaded to pool %s" % (iso_file, config.ceph_iso_pool), "code": 1 } if "iso_type" not in args: return { "message": "ISO file type not specified: 0 for PE,1 for Oracle/MSSQL,etc", "code": 1 } iso_type = args["iso_type"] cdrom_xml = utils.assemble_cdrom_xml(config.ceph_iso_pool, iso_file) target = "%s%s%s%s.xml" % (config.instance_data, domain, os.sep, iso_file) utils.persist(cdrom_xml, target) if not self.__update_cdrom(domain, target): return { "message": "Cannot attach iso, read log for more details .", "code": 1 } if iso_type > 0: return {"message": "SUCCESS", "code": 0} result = utils.reset_cdrom_index(domain, 0) if not result: return { "message": "Fail to reset boot order for CDROM, read log for details.", "code": 1 } return {"message": "SUCCESS", "code": 0}
def openVNC(self, **args): if "name" not in args or not args["name"]: return {"message": "Domain not specified", "code": 1} name = args["name"] if not utils.domain_exists(name): return {"message": "Domain not found", "code": 1} if "running" not in utils.domain_stat(name): return {"message": "Domain not running", "code": 1} getDomainUUID = "virsh domuuid %s" % name result = Popen(getDomainUUID, shell=True, stdout=PIPE).stdout.read() guest_uuid = result.strip() vnc_port = self.__get_vncport(name)["vnc_port"] host = getLocalIP() request = { "action": "gen_token", "guest_uuid": guest_uuid, "host": host, "port": vnc_port } result = None try: fd = urllib.urlopen(config.vnc_gentoken_endpoint, json.dumps(request)) result = fd.read() fd.close() except Exception: message = "Vnc token service not ready !" log.warn(message) return {"message": message, "code": 1} if "token" in result: result = json.loads(result) result.update({"code": 0, "message": "SUCCESS"}) return result else: return { "code": 1, "message": "Fails for vnc token service: %s" % result }
def attach_volume(self, **args): if "instance_name" not in args or not args["instance_name"]: return {"message": "Domain name not specified", "code": 1} instance_name = args["instance_name"] domain_exists = utils.domain_exists(instance_name) if not domain_exists: return {"message": "Domain %s not found" % instance_name, "code": 1} stat = utils.domain_stat(instance_name) live = "shut off" not in stat if "name" not in args or not args["name"]: return {"message": "Volume name not specified", "code": 1} name = args["name"] target = "%s%s%s%s.xml" % (config.instance_data, instance_name, os.sep, name) if not os.path.exists(target): return {"message": "Volume %s xml not found" % name, "code": 1} volume_config = open(target).read() log.debug("Volume: %s" % volume_config) if "TARGET" in volume_config: device = utils.get_available_blk_target(instance_name) volume_config, count = re.subn("'vd[a-z]'|'TARGET'", "'%s'" % device, volume_config) log.debug(volume_config) utils.persist(volume_config, target) virshcmd = "virsh attach-device \ --domain %s --file %s \ --config %s" % (instance_name, target, "--live" if live else "") pipe = Popen(virshcmd, shell=True, stdout=PIPE, stderr=PIPE) err = pipe.stderr.read() info = pipe.stdout.read() log.debug("Attach Disk with command '%s', and system output:'%s %s'" % (virshcmd, err, info)) if info and "Device attached successfully" in info: return {"message": "Volume %s attached to domain %s" % (name, instance_name), "code": 0} else: return {"message": "Fail to attach %s to domain %s" % (name, instance_name), "code": 1}
def detach_cdrom(self, **args): if "name" not in args or not args["name"]: return {"message": 1, "code": "Domain name not specified !"} domain = args["name"] if not utils.domain_exists(domain): return {"message": 1, "code": "Domain %s not found !" % domain} empty_cdrom = utils.assemble_cdrom_xml(None, None) target = "/tmp/empty_cdrom.xml" utils.persist(empty_cdrom, target) if not self.__update_cdrom(domain, target): return {"message": "Fail to detach cdrom", "code": 1} cdrom_first = utils.cdrom_in_first_order(domain) if cdrom_first: result = utils.reset_cdrom_index(domain, 1) if not result: return {"message": "Fail to restore boot order", "code": 1} return {"message": "SUCCESS", "code": 0}
def delete_volume(self, **args): if "instance_name" not in args or not args["instance_name"]: return {"message": "Domain name not specified", "code": 1} instance_name = args["instance_name"] domain_exists = utils.domain_exists(instance_name) if "name" not in args or not args["name"]: return {"message": "Volume name not specified", "code": 1} name = args["name"] if domain_exists: if self.__volume_attached(instance_name, name): return {"message": "Volume %s still in use" % name, "code": 1} target = "%s%s%s%s.xml" % (config.instance_data, instance_name, os.sep, name) if os.path.exists(target): os.remove(target) code, message = self.__remove_volume_from_backends(name, self.volume_pool) return {"message": message, "code": code}
def detach_volume(self, **args): if "instance_name" not in args or not args["instance_name"]: return {"message": "Domain name not specified", "code": 1} instance_name = args["instance_name"] domain_exists = utils.domain_exists(instance_name) if not domain_exists: return {"message": "Domain %s not found" % instance_name, "code": 1} stat = utils.domain_stat(instance_name) live = "shut off" not in stat if "name" not in args or not args["name"]: return {"message": "Volume name not specified", "code": 1} name = args["name"] target = "%s%s%s%s.xml" % (config.instance_data, instance_name, os.sep, name) if not os.path.exists(target): return {"message": "Volume %s xml not found" % name, "code": 1} if not self.__volume_attached(instance_name, name): return {"message": "Volume %s already detached" % name, "code": 0} virshcmd = "virsh detach-device \ --domain %s --file %s \ --config %s" % (instance_name, target, "--live" if live else "") pipe = Popen(virshcmd, shell=True, stdout=PIPE, stderr=PIPE) err = pipe.stderr.read() info = pipe.stdout.read() log.debug("Detach volume %s from domain %s: %s %s" % (name, instance_name, err, info)) if info and "Device detached successfully" in info: return {"message": "Volume %s detached from domain %s" % (name, instance_name), "code": 0} else: return {"message": "Fail to detach volume %s from domain %s" % (name, instance_name), "code": 1}
def delete_volume(self, **args): if "instance_name" not in args or not args["instance_name"]: return {"message": "Domain name not specified", "code": 1} instance_name = args["instance_name"] domain_exists = utils.domain_exists(instance_name) if "name" not in args or not args["name"]: return {"message": "Volume name not specified", "code": 1} name = args["name"] if domain_exists: if self.__volume_attached(instance_name, name): return {"message": "Volume %s still in use" % name, "code": 1} target = "%s%s%s%s.xml" % (config.instance_data, instance_name, os.sep, name) if os.path.exists(target): os.remove(target) code, message = self.__remove_volume_from_backends( name, self.volume_pool) return {"message": message, "code": code}
def create_instance(self, **args): if "name" not in args or not args["name"]: return {"code": 1, "message": "Domain name not specified !"} name = args["name"] domain_exists = utils.domain_exists(name) if domain_exists: return {"code": 1, "message": "Domain %s already exists!" % name} self.instance_base_dir = "%s%s%s" % (self.instance_data, name, os.sep) self.__ensure_instance_dir(self.instance_base_dir) if "image" not in args or not args["image"]: return {"code": 1, "message": "Image name not specified !"} image_name = args["image"] if not self.__image_exists(image_name): return { "code": 1, "message": "Contact Administrator to upload image %s" % image_name } possible_os_type = image_name.lower().count("win") clock_offset = config.clock_offset_windows if possible_os_type else config.clock_offset_linux """ Prepare system volume """ boot_volume = config.volume_name_format % { "domain": name, "type": config.volume_type_boot, "uuid": uuid.uuid4() } volumexml = self.__prepare_volume(name=boot_volume, image=image_name) """ As bootable volume, blk target should be set to 'vda' """ volumexml = volumexml.replace("TARGET", "vda") persist_volume = "%s%s.xml" % (self.instance_base_dir, boot_volume) utils.persist(volumexml, persist_volume) build_link_result = self.__build_network_links(name) if not build_link_result: return { "code": 1, "message": "Fail to build links for domain %s" % name } instance_template = self.__read_instance_template() if len(instance_template) == 0: return {"code": 1, "message": "Tempalte file error"} if "vcpu" not in args or "memory" not in args: return { "code": 1, "message": "Domain flavor(vcpu,memory) not specified" } # MB -> KB memory = args["memory"] * 1024 vcpu = args["vcpu"] instance_template = self.__init_domain_params(instance_template, name, vcpu, memory, clock_offset, volumexml) virshxml = self.__persist_virshxml(instance_template, name) def define_domain_from_xml(xml): virshcmd = "virsh define %s" % xml output = Popen(virshcmd, shell=True, stdout=PIPE).stdout.read() log.info("Define domain %s with %s:%s" % (name, xml, output)) define_domain_from_xml(virshxml) def start(name): virshcmd = "virsh start %s" % name output = Popen(virshcmd, shell=True, stdout=PIPE).stdout.read() log.info("Boot domain %s:%s" % (name, output)) start(name) return {"code": 0, "message": "Domain %s booting " % name}
def test_domain_exists(domain): print utils.domain_exists(domain)
def test_domain_exists(domain): print utils.domain_exists(domain)