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
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)
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()
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
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)
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)