示例#1
0
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:
示例#2
0
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
示例#3
0
    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
示例#4
0
    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
示例#5
0
            # 装失败了, 在资产系统中删除.
            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
示例#6
0
    # 设置机器从 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))