Example #1
0
def single(install_list):
    """ 单台机器安装.

    """

    idc = install_list["idc"]
    sn = install_list["sn"]
    _type = install_list["type"]
    version = install_list["version"]
    usage = install_list["usage"]
    product = install_list["product"]
    cabinet = install_list["cabinet"]
    user_data = install_list["user_data"]

    message = "start to install %s." % sn
    logger.info(message)

    # 安装系统进入 redis.
    client.hset(sn, "idc", idc)
    client.hset(sn, "usage", usage)

    client.hset(sn, "hostname", "")
    client.hset(sn, "ip", "")

    message = "set %s's idc, usage, hostname, ip to redis success" % sn
    logger.info(message)

    # 设置 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, user_data)

    # 循环等待安装完成.
    timeout = 2700
    interval = 30
    timetotal = 0

    installed = False
    inasset = False

    while timetotal < timeout:
        if not installed:
            hostname = client.hget(sn, "hostname")
            ip = client.hget(sn, "ip")

            if "" in [hostname, ip]:
                time.sleep(interval)
                timetotal += interval
            else:
                installed = True
        elif installed and not inasset:
            try:            
                ret = server.get("sn", sn)
                if not isinstance(ret, dict):
                    time.sleep(interval)
                    timetotal += interval
                elif "hostname" not in ret:
                    time.sleep(interval)
                    timetotal += interval
                elif ret["hostname"] != hostname:               
                    time.sleep(interval)
                    timetotal += interval
                else:
                    inasset = True
            except Exception, e:
                message = traceback.format_exc()
                logger.error(message)  
                time.sleep(interval)
                timetotal += interval                    
        else:
            break
Example #2
0
def single(install_list):
    """ 单台机器安装.

    """
    idc = install_list["idc"]
    sn = install_list["sn"]
    _type = install_list["type"]
    version = install_list["version"]
    usage = install_list["usage"]
    device = install_list["device"]
    product = install_list["product"]
    cabinet = install_list["cabinet"]
    user_data = install_list["user_data"]

    message = "start to install %s." % sn
    logger.info(message)

    # 查询控制卡 ip.
    ip = ilo_info.ip(idc, sn)
    if not ip or not utils.is_valid_ip(ip):
        result = "failed"
        message = "get ilo ip failed"
        install_list["result"] = result
        install_list["message"] = message
        return install_list
    message = "get %s ilo ip: %s" % (sn, ip)
    logger.info(message)

    # 拿到密码.
    passwd = ilo_info.passwd(idc, ip, sn)
    if not passwd:
        result = "failed"
        message = "get ilo passwd failed"
        install_list["result"] = result
        install_list["message"] = message
        return install_list
    passwd = passwd.strip()
    message = "get %s ilo passwd: %s" % (sn, passwd)
    logger.info(message)

    # 获取 ilo 对象.
    oj = ilo_oper.generate(idc, ip, passwd)
    message = "get %s ilo object" % (sn)
    logger.info(message)

    # 检查 SN 是否一致.
    curr_sn = oj.get_sn()
    if sn != curr_sn:
        result = "failed"
        message = "check sn failed"
        install_list["result"] = result
        install_list["message"] = message
        return install_list
    message = "check %s sn consistency success" % (sn)
    logger.info(message)

    # 查询网卡名称.
    nic = oj.get_nic_name(device)
    if not nic:
        logger.error("cann't get nic name")
        result = "failed"
        message = "cann't get nic name"
        install_list["result"] = result
        install_list["message"] = message
        return install_list
    message = "get %s nic name: %s" % (sn, nic)
    logger.info(message)

    # 设置网卡支持 PXE 启动.
    if not oj.get_nic_pxeboot(nic):
        if not oj.setup_nic_pxeboot(nic):
            result = "failed"
            message = "setup network device to support pxe boot failed"
            install_list["result"] = result
            install_list["message"] = message
            return install_list
    message = "set %s nic pxe boot success" % sn
    logger.info(message)

    # 设置启动顺序.
    nic_seq = oj.get_boot_order(nic)
    if not oj.check_boot_order(nic_seq):
        if not oj.setup_boot_order(nic_seq):
            result = "failed"
            message = "can't setup right bootseq - %s" % nic_seq
            install_list["result"] = result
            install_list["message"] = message
            return install_list
    message = "set %s nic support pxe boot success" % sn
    logger.info(message)

    # 设置机器从 PXE 启动一次.
    if not oj.setup_pxeboot_once():
        result = "failed"
        message = "setup pxe once boot failed"
        install_list["result"] = result
        install_list["message"] = message
        return install_list
    message = "set %s nic pxe boot once success" % sn
    logger.info(message)

    # 拷贝 pxelinux 配置文件.
    mac = oj.get_mac(nic)
    if not oj.constract_tftp(_type, version, mac):
        result = "failed"
        message = "copy pxelinux cfg failed"
        install_list["result"] = result
        install_list["message"] = message
        return install_list
    message = "copy %s pxelinux cfg success" % sn
    logger.info(message)

    # 重启.
    if not oj.reboot():
        result = "failed"
        message = "restart server failed"
        install_list["result"] = result
        install_list["message"] = message
        return install_list
    message = "reboot %s success" % sn
    logger.info(message)

    # 安装信息进 redis.
    client.hset(sn, "idc", idc)
    client.hset(sn, "usage", usage)

    client.hset(sn, "hostname", "")
    client.hset(sn, "ip", "")

    message = "set %s's idc, usage, hostname, ip to redis success" % sn
    logger.info(message)

    # 设置 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, user_data)

    # 循环等待安装完成.
    timeout = 2700
    interval = 30
    timetotal = 0

    installed = False
    inasset = False

    while timetotal < timeout:
        if not installed:
            hostname = client.hget(sn, "hostname")
            ip = client.hget(sn, "ip")

            if "" in [hostname, ip]:
                time.sleep(interval)
                timetotal += interval
            else:
                installed = True
        elif installed and not inasset:
            try:
                ret = server.get("sn", sn)
                if not isinstance(ret, dict):
                    time.sleep(interval)
                    timetotal += interval
                elif "hostname" not in ret:
                    time.sleep(interval)
                    timetotal += interval
                elif ret["hostname"] != hostname:
                    time.sleep(interval)
                    timetotal += interval
                else:
                    inasset = True
            except Exception, e:
                message = traceback.format_exc()
                logger.error(message)
                time.sleep(interval)
                timetotal += interval
        else:
            break
Example #3
0
    def post(self):
        """ 安装物理机.

        步骤包括:
        1). 根据 SN 获取到 ILO IP.
        2). 获取到 ILO 的密码.
        3). 设置第二块网卡支持 PXE 启动.
        4). 设置系统启动顺序.
        5). 设置系统 PXE 启动一次.
        6). 拷贝 pxelinux 配置文件.
        7). 重启.
        8). 等待安装完成.
        9). 删除 pxelinux 配置文件.
        10). 在资产系统里设置 product 和 cabinet 等.

        type 表示支持安装的物理机类型, 目前支持三种, 分别是:
        raw, kvm, docker;

        version 表示支持的操作系统版本, 目前有:
        centos6, centos7

        """
        idc = _get_argument_json(self, "idc", False, loads=True)
        _type = _get_argument_json(self, "type", False, loads=True)
        version = _get_argument_json(self, "version", True, "centos6", loads=True)
        usage = _get_argument_json(self, "usage", False, loads=True)
        product = _get_argument_json(self, "product", False, loads=True)
        device = _get_argument_json(self, "device", False, loads=True)
        force = _get_argument_json(self, "force", True, False, loads=True)
        sns = _get_argument_json(self, "sns", False, loads=True)
        user_data = _get_argument_json(self, "user_data", True, None, loads=True)
        email = _get_argument_json(self, "email", True, None, loads=True)

        install_lists = list()
        for i in sns:
            item = {
                "idc": idc, 
                "type": _type,
                "version": version,                    
                "usage": usage, 
                "product": product, 
                "device": device, 
                "sn": i["sn"], 
                "cabinet": i["cabinet"],
                "user_data": user_data
            }
            install_lists.append(item)

        # 是否强制安装.
        inasset_lists = list()
        if force != True:
            for item in install_lists:
                sn = item["sn"]
                if server.get("sn", sn, "hostname"):
                    inasset_lists.append(sn)
            if inasset_lists != []:
                message = "servers have in asset, can't install:{0}".format(
                    inasset_lists)
                ret = {
                    "status": "failed", 
                    "message": message
                }
                self.write(json.dumps(ret))
                self.finish()

        # 生成创建任务 id.
        task_key = "physical:create"
        task_id = "%s:%s" % (task_key, global_id.get())

        queue_dict = {
            "install_lists": install_lists, 
            "task_id": task_id,
            "email": email
        }
        redis_client_pm.lpush("queue:create", queue_dict)

        _url = "%s/%s" % (PM_TASK_BASE_URL, task_id)
        ret = {
            "status": "creating", 
            "message": _url
        }
        self.write(json.dumps(ret))