Exemple #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
            }
Exemple #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
            }
Exemple #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
            }
Exemple #4
0
    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}
Exemple #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
            }
Exemple #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}
Exemple #7
0
    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}
Exemple #8
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} 
Exemple #9
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}
Exemple #10
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}
Exemple #11
0
    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}
Exemple #12
0
def test_domain_exists(domain):
    print utils.domain_exists(domain)
Exemple #13
0
def test_domain_exists(domain):
    print utils.domain_exists(domain)