Beispiel #1
0
 def modify_guest_meta(self, disk_file, network_info=None):
     nbd_id = self.thread_id % 16
     mount_point = '/mnt/%s' % nbd_id
     try:
         utils.ensure_tree(mount_point)
     except:
         pass
     nbd_device = '/dev/nbd%s' % nbd_id
     logging.info("modify guest info start, nbd_device:%s, mount_point:%s",
                  nbd_device, mount_point)
     try:
         self.disconnect_nbd(nbd_device, mount_point)
     except:
         pass
     try:
         # connect the virtual disk file with nbd
         self._connect(nbd_device, disk_file, mount_point)
         if constants.OS_TYPE_WINDOWS == self.instance['os_type']:
             logging.info('start modify[%s] reg' % self.instance['uuid'])
             self._set_hostname(mount_point)
             self._set_ip_address(mount_point, network_info)
             logging.info('end modify[%s] reg' % self.instance['uuid'])
     except Exception as e:
         logging.error("modify the guest metadata failed:%s", e)
     finally:
         try:
             self.disconnect_nbd(nbd_device, mount_point)
         except:
             pass
Beispiel #2
0
 def _add_file(self, basedir, path, data):
     filepath = os.path.join(basedir, path)
     dirname = os.path.dirname(filepath)
     utils.ensure_tree(dirname)
     with open(filepath, 'wb') as f:
         # the given data can be either text or bytes. we can only write
         # bytes into files.
         if isinstance(data, six.text_type):
             data = data.encode('utf-8')
         f.write(data)
Beispiel #3
0
    def download(self, url, image, dest_path, task_id=None):
        try:
            logging.info("sync the image, info:%s", image)
            # the stream args must be true, otherwise the download will be failed
            url = '%s?image_id=%s&image_path=%s&s' % (url, image['image_id'],
                                                      image['disk_file'])
            if task_id:
                url = "%s&task_id=%s" % (url, task_id)
            resp, image_chunks = self.http_client.get(url)
        except Exception as e:
            logging.error("sync error:%s", e)
            raise

        logging.info("data is none, open the dst_path:%s", dest_path)
        utils.ensure_tree(os.path.dirname(dest_path))
        data = open(dest_path, 'wb')
        close_file = True

        if data is None:
            return image_chunks
        else:
            md5_sum = hashlib.md5()
            try:
                for chunk in image_chunks:
                    md5_sum.update(chunk)
                    data.write(chunk)
                if image.get('md5_sum', None):
                    logging.info("check md5, image:%s, file:%s",
                                 image['md5_sum'], md5_sum.hexdigest())
                    if md5_sum.hexdigest() != image['md5_sum']:
                        logging.error(
                            "the image md5_sum:%s, the receive md5_sum:%s",
                            image['md5_sum'], md5_sum.hexdigest())
                        raise Exception("the image md5 sum check failed")
            except Exception as ex:
                logging.error("Error writing to %(path)s: %(exception)s", {
                    'path': dest_path,
                    'exception': ex
                })
                try:
                    os.remove(dest_path)
                except:
                    pass
                raise ex
            finally:
                if close_file:
                    # Ensure that the data is pushed all the way down to
                    # persistent storage. This ensures that in the event of a
                    # subsequent host crash we don't have running instances
                    # using a corrupt backing file.
                    data.flush()
                    self._safe_fsync(data)
                    data.close()
Beispiel #4
0
    def _prepare_voi_disk(self, disk):
        logging.info("prepare disk for voi, disk:%s", disk)
        # system disk and data disk in different position
        base_path = disk['base_path']
        backing_dir = os.path.join(base_path, constants.IMAGE_CACHE_DIRECTORY_NAME)
        if not os.path.isdir(backing_dir):
            utils.ensure_tree(backing_dir)
        version = disk.get('image_version', 0)
        dest_file_name = constants.VOI_BASE_PREFIX % str(version) + disk['uuid']
        if version > constants.IMAGE_COMMIT_VERSION:
            dest_file_name = constants.VOI_BASE_PREFIX % str(constants.IMAGE_COMMIT_VERSION) + disk['uuid']

        dest_file = os.path.join(backing_dir, dest_file_name)
        if os.path.exists(dest_file):
            logging.info("the file %s already exist", dest_file)
            disk_file = "%s/%s%s" % (base_path, constants.VOI_FILE_PREFIX, disk['uuid'])
            cmdutils.execute('qemu-img', 'create', '-f', 'qcow2', disk_file, '-o',
                             'backing_file=%s' % dest_file, run_as_root=True)
            logging.info("create the diff disk %s success", disk_file)
            return disk_file
        # 第一步是生成base镜像文件
        # 终端样机上传
        if disk.get('upload', None):
            logging.info("move % to %s", disk['upload'], dest_file)
            shutil.move(disk['upload'], dest_file)
            logging.info("move the image %s to %s success", disk['upload'], dest_file)
        # 基于基础镜像创建
        elif disk.get('image_id', None):
            source_file = utils.get_backing_file(version, disk['image_id'], base_path)
            logging.info("copy %s to %s", source_file, dest_file)
            shutil.copy(source_file, dest_file)
            logging.info("copy the image %s to %s success", source_file, dest_file)
        # ISO全新创建
        else:
            cmdutils.execute('qemu-img', 'create', '-f', 'qcow2', dest_file, disk['size'], run_as_root=True)
            logging.info("create the backing disk %s success", dest_file)
        # 第二步是建立差异磁盘文件
        disk_file = "%s/%s%s" % (base_path, constants.VOI_FILE_PREFIX, disk['uuid'])
        cmdutils.execute('qemu-img', 'create', '-f', 'qcow2', disk_file, '-o',
                         'backing_file=%s' % dest_file, run_as_root=True)
        logging.info("create the diff disk %s success", disk_file)
        return disk_file
Beispiel #5
0
    def _set_ip_address(self, mount_point, network_info=None):
        """
        [setting]
        --网卡数量
        mac_number=2

        ------------1号网卡参数-----------
        --网卡MAC地址
        mac_1=00-0C-29-C0-A5-52
        --是否开启DHCP
        dhcp_1=1
        --1号网卡IP数量
        ip_number_1=2
        --1号网卡类型,1为IPV6
        ip_type_1=0
        --1号网卡1号IP
        ip_1_1=192.168.182.110
        --1号网卡1号子网掩码
        netmask_1_1=255.255.255.0
        --1号网卡1号默认网关
        gateway_1_1=192.168.182.1
        --1号网卡2号IP
        ip_1_2=192.168.182.111
        --1号网卡2号子网掩码
        netmask_1_2=255.255.255.0
        --1号网卡2号默认网关
        gateway_1_2=192.168.182.2
        ---------2号网卡参数------------
        mac_2=00-0C-29-C0-A5-53
        ip_number_2=1
        ip_type_2=0
        ip_1_2=192.168.182.110
        netmask_1_2=255.255.255.0
        gateway_1_2=192.168.182.1
        --DNS数量
        dns_number=2
        dns_1=8.8.8.8
        dns_2=9.9.9.9
        """
        try:
            if not network_info:
                return
            ip_info = network_info[0]
            if not ip_info.get('fixed_ip', None):
                return

            # reg_file = '%s.reg' % uuid.uuid1()
            # para_path = '\\ControlSet001\\services\\Tcpip\\Parameters'
            # export_cmd = "hivexregedit --export --prefix 'HKEY_LOCAL_MACHINE\\SYSTEM' " \
            #       "%s/%s '%s' > %s" % (mount_point, self._get_reg_location(), para_path, reg_file)
            # logging.info("export tcpip info to reg_file:%s", reg_file)
            # cmdutils.execute(export_cmd, run_as_root=True, shell=True)
            #
            # logging.info("set fixip mode")
            # winreg = WinRegedit()
            # winreg.set_fix_ip(reg_file)
            # logging.info("merge the regedit")
            # merge_cmd = "hivexregedit --merge %s/%s --prefix 'HKEY_LOCAL_MACHINE\SYSTEM' %s" % \
            #             (mount_point, self._get_reg_location(), reg_file)
            # cmdutils.execute(merge_cmd, run_as_root=True, shell=True)
            #
            # try:
            #     os.remove(reg_file)
            #     logging.info("remove ip reg file")
            # except:
            #     pass

            logging.info("set the network info to ip file")
            ip_file_path = os.path.join(mount_point, 'ipinfo')
            ip_file = os.path.join(ip_file_path, 'ip.ini')
            utils.ensure_tree(ip_file_path)
            # cmdutils.execute('crudini', '--set', ip_file, "setting", "iptype", "FIX", run_as_root=True)
            # cmdutils.execute('crudini', '--set', ip_file, "setting", "complete", "NO", run_as_root=True)
            # cmdutils.execute('crudini', '--set', ip_file, "setting", "os", self.instance['os_type'],
            #                  run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "mac_number",
                             1,
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "mac_1",
                             ip_info.get('mac_addr'),
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "dhcp_1",
                             0,
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "ip_number_1",
                             1,
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "ip_type_1",
                             0,
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "ip_1_1",
                             ip_info.get('fixed_ip'),
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "netmask_1_1",
                             ip_info.get('netmask'),
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "gateway_1_1",
                             ip_info.get('gateway'),
                             run_as_root=True)
            dns_server = ip_info.get('dns_server', [])
            if dns_server:
                cmdutils.execute('crudini',
                                 '--set',
                                 ip_file,
                                 "setting",
                                 "dns_number_1",
                                 len(dns_server),
                                 run_as_root=True)
                for index, dns in enumerate(dns_server):
                    key = 'dns_1_%s' % (index + 1)
                    cmdutils.execute('crudini',
                                     '--set',
                                     ip_file,
                                     "setting",
                                     key,
                                     dns,
                                     run_as_root=True)
        except Exception as e:
            message = 'instance_uuid[%s] set ip info error:%s' % (
                self.instance['uuid'], e)
            logging.error(message)
            raise exception.SetIPAddressException(message)
Beispiel #6
0
    def _write_md_files(self, basedir):
        try:
            if not self.network_info:
                return
            ip_info = self.network_info[0]
            if not ip_info.get('fixed_ip', None):
                return

            logging.info("set the network info to ip file")
            ip_file = os.path.join(basedir, 'ipinfo/ip.ini')
            dirname = os.path.dirname(ip_file)
            utils.ensure_tree(dirname)
            # cmdutils.execute('crudini', '--set', ip_file, "setting", "iptype", "FIX", run_as_root=True)
            # cmdutils.execute('crudini', '--set', ip_file, "setting", "complete", "NO", run_as_root=True)
            # cmdutils.execute('crudini', '--set', ip_file, "setting", "os", self.instance['os_type'],
            #                  run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "computer",
                             self.instance['name'],
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "mac_number",
                             1,
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "mac_1",
                             ip_info.get('mac_addr'),
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "dhcp_1",
                             0,
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "ip_number_1",
                             1,
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "ip_type_1",
                             0,
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "ip_1_1",
                             ip_info.get('fixed_ip'),
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "netmask_1_1",
                             ip_info.get('netmask'),
                             run_as_root=True)
            cmdutils.execute('crudini',
                             '--set',
                             ip_file,
                             "setting",
                             "gateway_1_1",
                             ip_info.get('gateway'),
                             run_as_root=True)
            dns_server = ip_info.get('dns_server', [])
            if dns_server:
                cmdutils.execute('crudini',
                                 '--set',
                                 ip_file,
                                 "setting",
                                 "dns_number_1",
                                 len(dns_server),
                                 run_as_root=True)
                for index, dns in enumerate(dns_server):
                    key = 'dns_1_%s' % (index + 1)
                    cmdutils.execute('crudini',
                                     '--set',
                                     ip_file,
                                     "setting",
                                     key,
                                     dns,
                                     run_as_root=True)
        except Exception as e:
            message = 'instance_uuid[%s] set ip info error:%s' % (
                self.instance['uuid'], e)
            logging.error(message)
            raise exception.SetIPAddressException(message)