Esempio n. 1
0
    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
            }
Esempio n. 2
0
    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
            }
Esempio n. 3
0
    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
            }
Esempio n. 4
0
    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
Esempio n. 5
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
            }
Esempio n. 6
0
    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}
Esempio n. 7
0
    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}
Esempio n. 8
0
def test_domain_stat(domain):
    print utils.domain_stat(domain)
Esempio n. 9
0
def test_domain_stat(domain):
    print utils.domain_stat(domain)