def get_unique_data(self): """ 当 type 是 hostname, 重新生成 data. data 中每个元素是个 dict, 每个 dict 有一个字段: hostname. 本函数输出新的 data, 每个 dict 加入 hostname 所在的 vmh 和 vmname. """ unique_data = list() if self.type == "hostname": for d in self.unique_data: hostname = d["hostname"] data = utils.get_vmname_from_hostname(hostname) data["sn"] = asset_utils.get_sn_from_hostname(hostname) data["rpc_client"] = utils.get_rpc_client(data["vmh"]) unique_data.append(data) else: for d in self.unique_data: data = copy.deepcopy(d) data["rpc_client"] = utils.get_rpc_client(data["vmh"]) unique_data.append(data) self.unique_data = unique_data
def get_data(self): """ 当 type 是 hostname, 生成 vmh 和 vmname. """ data = { "type": self.type, "hostname": self.hostname, "vmh": self.vmh, "vmname": self.vmname, "wmi_name": self.wmi_name, "excludes": self.excludes, "email": self.email } if self.type == "hostname": x = utils.get_vmname_from_hostname(self.hostname) data["vmh"] = x["vmh"] data["vmname"] = x["vmname"] # 生成 wmi id, 作为 wmi 的资源标识. # 随机生成的10位字符串是有几率重复, 只 # 不过几率很小, 此是一坑. data["wmi_id"] = common_utils.random_id() data["rpc_client"] = utils.get_rpc_client(data["vmh"]) self.data = data
def get_unique_data(self): """ 获取每个装机任务需要的信息. """ self.unique_data = list() for vmh in self.vmhs: # 拷贝一份 common data. data = copy.deepcopy(self.common_data) # 保存宿主机. data["vmh"] = vmh # 保存 rpc_client. data["rpc_client"] = utils.get_rpc_client(data["vmh"]) # 更新宿主机资源. for item in ("vcpu", "mem", "space"): x = utils.get_info(data["vmh"], item) if item == "space": x["free"] = x["free"] - self.os_size - self.data_size else: x["free"] = x["free"] - getattr(self, item) utils.update_info(data["vmh"], item, x) # 获取 vmname 并更新 vmname. data["vmname"] = utils.get_vmname(data["vmh"]) utils.update_vmname(data["vmh"], data["vmname"]) # 生成虚拟机的 uuid, 并且当做虚拟机的 sn. data["sn"] = data["uuid"] = utils_common.random_uuid() # 获取 hostname, ip, network 和 gateway 信息. # 获取 hostname, ip 成功后, 会自动在资产系统中创建记录, status 为 # creating, 等待 agent 上报资产后, 变成 online. network = utils.get_network(data["vmh"]) hostname, ip = asset_utils.apply_hostname_ip( data["sn"], "vm", data["usage"], data["idc"], network) gateway = utils.get_gateway_from_ip(ip) data["hostname"] = hostname data["ip"] = ip data["network"] = network data["gateway"] = gateway # 清除 puppet 证书. for h in [hostname, hostname + ".nosa.me"]: if utils.get_puppet_cert(h) == 200: if utils.delete_puppet_cert(h) == 200: self.logger.info( "{hostname} cert deleted".format(hostname=h)) else: self.logger.info( "{hostname} cert delete failed".format(hostname=h)) # 如果 dns 里面已经有 hostname 解析, 删除. if dns_utils.record_exist(data["hostname"]): dns_utils.record_delete(data["hostname"]) # 不同的 type 要有不同的处理. if self.type == "wmi": # 当 type 等于 wmi 时, agent 会修改镜像的 ip 和 hostname. pass else: # 如果不是 wmi, 装机 post 脚本会来请求拿到 hostname. self.client.set(data["ip"], data["hostname"]) # 记录 hostname 和 ip. self.logger.info("hostname:{hostname}, ip:{ip}".format( hostname=data["hostname"], ip=data["ip"])) # 设置 user data, 机器装好之后会取数据. self.set_user_data(data["hostname"]) # 保存 data. self.unique_data.append(data)