背景:ovirt平台数据库故障,数据库恢复成两个月前的数据,平台数据管理虚拟机变少,出现很多野虚拟机-------脱离平台管理,在数据域下有许多磁盘文件目录,需要统计数据整合。
1、存储域下目录文件整合
目录下有磁盘目录928个,每个目录下至少有3个文件
其中meta文件中有disk的一些信息,可以做分类
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import json
import xlwt
DomainDir = "/xxxxxxxxxx/"
class ImageInfo(object):
# 获取目录下文件
@staticmethod
def find_all_image_file(file_path):
images_list = []
three_file_list = []
for root, dirs, files in os.walk(file_path, topdown=False):
image_dict = {}
image_dict["image_id"] = root.split(file_path)[-1]
files.sort()
image_dict["files_list"] = files
images_list.append(image_dict)
if len(files) == 3:
three_file_list.append(image_dict)
# with open('/home/test_data', 'w') as dict_file:
# dict_file.writelines(str(line) + '\n' for line in images_list)
# with open('/home/test_data2', 'w') as dict_file:
# dict_file.writelines(str(line) + '\n' for line in three_file_list)
return images_list, three_file_list
# 读取meta文件,分类信息
@staticmethod
def get_image_detail(image_info_list):
detail_info = []
for file_info in image_info_list:
meta_file = DomainDir + file_info.get('image_id') + '/' + file_info.get('files_list')[-1]
with open(meta_file, 'r') as file_to_read:
for line in file_to_read.readlines():
if "DESCRIPTION" in line:
try:
file_info["DiskAlias"] = json.loads(line.strip('\n').split("=")[-1]).get('DiskAlias') if "DiskAlias" in line else None
except:
file_info["DiskAlias"] = None
try:
file_info["DiskDescription"] = json.loads(line.strip('\n').split("=")[-1]).get('DiskDescription') if "DiskDescription" in line else None
except:
file_info["DiskDescription"] = None
if "DISKTYPE" in line:
file_info["DISKTYPE"] = line.strip('\n').split("=")[-1]
if "VOLTYPE" in line:
file_info["VOLTYPE "] = line.strip('\n').split("=")[-1]
detail_info.append(file_info)
file_info["files_list"] = file_info.get("files_list")[0]
# with open('/home/test_data3', 'w') as dict_file:
# dict_file.writelines(str(line) + '\n' for line in detail_info)
return detail_info
if __name__ == '__main__':
all_image_info, three_file_info = ImageInfo.find_all_image_file(DomainDir)
image_detail_info = ImageInfo.get_image_detail(three_file_info)
# 信息写入xls文件中
wb = xlwt.Workbook(encoding='utf-8')
ws = wb.add_sheet('image_info', cell_overwrite_ok=True)
columns = list(image_detail_info[0].keys())
for j, col in enumerate(columns):
ws.write(0, j, col)
for i, row in enumerate(image_detail_info, 1):
for j, col in enumerate(columns):
ws.write(i, j, row[col])
wb.save('data.xls')
2、目录下文件获取后,简单过滤下目录下有三个文件的目录,然后和之前的迁移列表匹配,过滤出可以恢复的虚拟机写入表格
# !/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import xlrd
import xlwt
DomainDir = "/XXX/"
def read_xlsx(book, i):
sheet = book.sheets()[i]
nor = sheet.nrows
nol = sheet.ncols
info_list = []
for i in range(1, nor):
dict_info = {}
for j in range(nol):
title = sheet.cell_value(0, j).encode('utf-8')
value = sheet.cell_value(i, j).encode('utf-8')
dict_info[title] = value
info_list.append(dict_info)
return info_list
if __name__ == '__main__':
book = xlrd.open_workbook("upload_disk.xlsx")
vm_upload_info_list = read_xlsx(book, 0)
vm_migration_list = read_xlsx(book, 1)
vm_merge_info = {}
vm_not_merge_info = {}
for vm_migration in vm_migration_list:
vm_disk_list=[]
for vm_upload_info in vm_upload_info_list:
vm_upload_disk_name = vm_upload_info.get("DiskAlias")
vm_name = None
if "systemdisk" in vm_upload_disk_name:
vm_name = vm_upload_disk_name.split("_systemdis")[0]
if "datadisk" in vm_upload_disk_name:
vm_name = vm_upload_disk_name.split("_datadis")[0]
if vm_migration.get("迁移后VM名称") == vm_name:
vm_disk_list.append(vm_upload_info)
if len(vm_disk_list) > 0:
vm_merge_info[vm_migration.get("迁移后VM名称")] = vm_disk_list
vm_merge_info_list = []
for key, value in vm_merge_info.items():
value[0]["vm_name"] = key
vm_merge_info_list.append(value[0])
print (vm_merge_info_list[0])
wb = xlwt.Workbook(encoding='utf-8')
ws = wb.add_sheet('image_info', cell_overwrite_ok=True)
columns = list(vm_merge_info_list[0].keys())
for j, col in enumerate(columns):
ws.write(0, j, col)
for i, row in enumerate(vm_merge_info_list, 1):
for j, col in enumerate(columns):
ws.write(i, j, row[col])
wb.save('merge_info.xls')
3、后续根据过滤的虚拟机,调用ovirt sdk接口,upload磁盘,创建vm,挂盘与之前迁移脚本雷同,不再累述。