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 __update_cdrom(self, domain, cdrom): domain_stat = utils.domain_stat(domain) live = "shut off" not in domain_stat virshcmd = "virsh update-device \ --domain %s \ --file %s --config %s" % (domain, cdrom, "--live" if live else "") pipe = Popen(virshcmd, shell=True, stdout=PIPE, stderr=PIPE) info = pipe.stdout.read() erro = pipe.stderr.read() if info and "Device updated successfully" in info: return True else: log.warn("Fail to update %s with %s: %s" % (domain, cdrom, erro)) return False
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_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 test_domain_stat(domain): print utils.domain_stat(domain)