def wait_result(oj): """ 等待安装, 并获取结果. """ # 如果机器在资产系统中, 删掉机器(post 阶段脚本会向资产系统申请 # hostname 和 ip, 并且进行初始化机器, 初始化之后 status 是 # creating). # 放在 reboot 之后的原因是防止删除之后 agent 继续上报. if asset_utils.is_exist_for_sn(oj.sn): asset_utils.delete_from_sn(oj.sn) # 安装信息进 redis. client.hset(oj.sn, "idc", json.dumps(oj.idc)) client.hset(oj.sn, "usage", json.dumps(oj.usage)) client.hset(oj.sn, "hostname", json.dumps("")) client.hset(oj.sn, "ip", json.dumps("")) # 循环等待安装完成. timeout = 1500 interval = 15 timetotal = 0 installed = False in_asset = False while timetotal < timeout: if not installed: hostname = json.loads(client.hget(oj.sn, "hostname")) ip = json.loads(client.hget(oj.sn, "ip")) if "" in [hostname, ip]: time.sleep(interval) timetotal += interval else: installed = True # 设置 hostname, ip oj.hostname = hostname oj.ip = ip # 清除 puppet 证书. puppet.check_puppet_cert(oj.hostname) # 设置 user_data, 装机之后机器会获取并执行 user_data 中的内容. user_data.set_user_data(oj.hostname, oj.user_data) # 设置 node id, 配置机器会使用. node.set_node_id(oj.hostname, oj.node_id) # 增加 DNS. if dns_utils.record_exist(oj.hostname): dns_utils.record_delete(oj.hostname) dns_utils.record_add(oj.hostname, oj.ip) elif installed and not in_asset: try: status = asset_utils.get_value_from_sn(oj.sn, "status") if status == "online": in_asset = True break except Exception, e: pass finally:
def one(data): """ 单台机器安装. """ idc = data["idc"] sn = data["sn"] _type = data["type"] version = data["version"] usage = data["usage"] user_data = data["user_data"] # 如果机器在资产系统中, 删掉机器(post 阶段脚本会向资产系统申请 # hostname 和 ip, 并且进行初始化机器, 初始化之后 status 是 # creating). # 有一个问题: # 此种安装方式是手动安装, 为了防止删除之后 agent 继续上报, # 应该在安装前手动把机器关机. if asset_utils.is_exist_for_sn(sn): asset_utils.delete_from_sn(sn) # 安装系统进入 redis. client.hset(sn, "idc", json.dumps(idc)) client.hset(sn, "usage", json.dumps(usage)) client.hset(sn, "hostname", json.dumps("")) client.hset(sn, "ip", json.dumps("")) # 设置 user_data, 装机之后机器会获取并执行 user_data 中的内容. if user_data is None: client_user_data.exists(sn) and client_user_data.delete(sn) else: client_user_data.set(sn, json.dumps(user_data)) # 循环等待安装完成. installed, in_asset, hostname, ip = utils.wait(sn) # 检查安装完成情况. if not installed: raise Exception("install timeout") elif installed and not in_asset: raise Exception("install success,but not uploaded to asset sys") else: # 检查 hostname 是否已经成功添加 DNS. recordred = dns_utils.record_exist(hostname) if not recordred: raise Exception("dns add fail") data["hostname"] = hostname data["ip"] = ip return data
def one(self, data): """ 单个虚拟机创建函数. """ rpc_client = data["rpc_client"] try: rpc_client.instance_create(data) except Exception, e: # 装失败了, 在资产系统中删除. asset_utils.delete_from_sn(data["sn"]) error_message = traceback.format_exc() self.logger.warning(error_message) data["code"] = 1 data["error_message"] = error_message return data
def one(self, data): """ 单个虚拟机创建函数. """ rpc_client = data["rpc_client"] try: rpc_client.instance_create(data) utils.wait_status(data["sn"]) asset_utils.bind_server_to_node(data["node_id"], [data["hostname"]]) except Exception, e: # 装失败了, 清理工作. asset_utils.delete_from_sn(data["sn"]) dns_utils.record_delete(data["hostname"]) error_message = traceback.format_exc() self.logger.warning(error_message) data["code"] = 1 data["error_message"] = error_message return data
# 装失败了, 在资产系统中删除. asset_utils.delete_from_sn(data["sn"]) error_message = traceback.format_exc() self.logger.warning(error_message) data["code"] = 1 data["error_message"] = error_message return data if not utils.wait_status(data["sn"]): error_message = "not uploaded to asset sys" self.logger.warning(error_message) # 装失败了, 在资产系统中删除. if asset_utils.is_exist_for_sn(data["sn"]): asset_utils.delete_from_sn(data["sn"]) data["code"] = 1 data["error_message"] = error_message utils.update_info_from_rpc(data["vmh"]) return data if not dns_utils.record_exist(data["hostname"]): error_message = "dns record not added" self.logger.warning(error_message) # 装失败了, 在资产系统中删除. if asset_utils.is_exist_for_sn(data["sn"]): asset_utils.delete_from_sn(data["sn"]) data["code"] = 1
# 设置机器从 PXE 启动一次. ilo_oj.setup_pxeboot_once() # 拷贝 pxelinux 配置文件. mac = ilo_oj.get_mac(nic) ilo_oj.constract_tftp(_type, version, mac) # 重启. ilo_oj.reboot() # 如果机器在资产系统中, 删掉机器(post 阶段脚本会向资产系统申请 # hostname 和 ip, 并且进行初始化机器, 初始化之后 status 是 # creating). # 放在 reboot 之后的原因是防止删除之后 agent 继续上报. if asset_utils.is_exist_for_sn(sn): asset_utils.delete_from_sn(sn) logger.info("{sn} deleted in asset".format(sn=sn)) # 安装信息进 redis. client.hset(sn, "idc", json.dumps(idc)) client.hset(sn, "usage", json.dumps(usage)) client.hset(sn, "hostname", json.dumps("")) client.hset(sn, "ip", json.dumps("")) # 设置 user_data, 装机之后机器会获取并执行 user_data 中的内容. if user_data is None: client_user_data.exists(sn) and client_user_data.delete(sn) else: client_user_data.set(sn, json.dumps(user_data))