Exemple #1
0
    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
Exemple #2
0
    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
Exemple #3
0
    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)