def get(_id): """ 查看某个 wmi 的信息. """ key = "wmi:" + _id client = redisoj.RedisClient().get(REDIS_DB_VM) return json.loads(client.get(key))
def gets(): """ 查看全部 wmi 的信息. """ client = redisoj.RedisClient().get(REDIS_DB_VM) def _get(key): import re _id = re.sub("^wmi:", "", key) return {"id": _id, "data": get(_id)} return map(_get, client.keys("wmi:*"))
def __init__(self, area, _type, wmi_id, auto_vmhs, vmhs, num, version, vcpu, mem, data_size, idc, usage, user_data, email): """ common_data 任务的公共数据; unique_data 每个宿主机任务的数据; code 装机任务返回值, 0 表示任务执行并成功, -1 表示任务未执行, 1表示任务执行但失败; error_message 表示失败信息. 对于每个宿主机上的任务, 也有 code 和 error_message, 0 表示成功, 1 表示失败. """ self.area = area self.type = _type self.wmi_id = wmi_id self.auto_vmhs = auto_vmhs self.vmhs = vmhs self.num = num self.version = version self.vcpu = vcpu self.mem = mem * 1024 # 这里以 M 计算. self.data_size = data_size self.idc = idc self.usage = usage self.user_data = user_data self.email = email self.vm_areas = VM_AREAS self.os_size = OS_SIZE self.locations = LOCATIONS self.kss = KSS self.network = NETMASK_DEFAULT self.bridge = BRIDGE_DEFAULT self.logger = log.LogHandler().logger self.client = redisoj.RedisClient().get(REDIS_DB_VM) self.client_user_data = redisoj.RedisClient().get(REDIS_DB_COMMON) # 初始化任务的 code 和 error_message. self.code = 0 self.error_message = None
def get_postcustom(key): """ 获取 post custom 脚本内容. """ from libs import redisoj from web.const import REDIS_DB_COMMON # REDIS_DB_COMMON 专门用于存储 user_data 信息. client = redisoj.RedisClient().get(REDIS_DB_COMMON) if client.exists(key): return json.loads(client.get(key)) else: return None
def __init__(self, _type, wmi_name, hostname, vmh, vmname, excludes, email): """ data 任务的公共数据; unique_data 每个宿主机任务的数据; code 装机任务返回值, 0 表示任务执行并成功, -1 表示任务未执行, 1表示任务执行但失败; error_message 表示失败信息. """ self.type = _type self.wmi_name = wmi_name self.hostname = hostname self.vmh = vmh self.vmname = vmname self.excludes = excludes self.email = email self.logger = log.LogHandler().logger self.client = redisoj.RedisClient().get(REDIS_DB_VM) # 初始化任务的 code 和 error_message. self.code = 0 self.error_message = None
#-*- coding: utf-8 -*- from libs import redisoj from settings import REDIS_DB_COMMON import ujson as json client_common = redisoj.RedisClient().get(REDIS_DB_COMMON) def get_user_data(hostname): """ 获取 user data. """ key = get_key(hostname) if client_common.exists(key): return json.loads(client_common.get(key)) else: return "" def set_user_data(hostname, user_data): """ 设置 user data. """ key = get_key(hostname) client_common.setex(key, json.dumps(user_data), 3600) def get_key(hostname):
import time import sys import os from multiprocessing.dummy import Pool as ThreadPool import ujson as json from web.const import (MAX_THREAD_NUM, PXELINUX_CFGS, REDIS_DB_PM, REDIS_DB_COMMON) from libs import redisoj, log, mail, asset_utils, dns_utils from libs import utils as common_utils from pm.libs import utils logger = log.LogHandler().logger client = redisoj.RedisClient().get(REDIS_DB_PM) client_user_data = redisoj.RedisClient().get(REDIS_DB_COMMON) def multi(common_data, email): # 取一个列表的 type 和 version, 一批机器的 type 和 version 相同. _type = common_data[0]["type"] version = common_data[0]["version"] # 因为手动安装是使用一个默认的配置文件, 如果多组机器同时安装, 配置文件需要在 # 所有的机器都安装完成之后删除, 所以用一个队列来保存正在安装的任务. default_key = "default:{type}:{version}".format(type=type, version=version) client.lpush(default_key, "") # 拷贝默认配置文件. # 不能同时安装两种类型的机器;
def delete(_id): """ 删除一个 wmi. """ client = redisoj.RedisClient().get(REDIS_DB_VM) client.delete("wmi:"+_id)
# -*- coding: utf-8 -*- import sys import os import ujson as json import tornado.web from libs import ldapauth, redisoj, utils from web.const import REDIS_DB_PM from pm.libs import check, create, create_man, tmessage client_pm = redisoj.RedisClient().get(REDIS_DB_PM) class CheckHandler(tornado.web.RequestHandler): @utils.authenticate_decorator def post(self): """ 检查物理机是否可以正常装机. 检查项包括: 1). 是否可以根据 SN 获取到 ILO IP. 2). 是否能够 获取到 ILO 的密码. 3). 是否能够设置第二块网卡支持 PXE 启动. 4). 是否能够设置启动顺序. """ data = json.loads(self.request.body) idc = data["idc"] device = data["device"] sns = data["sns"]
import os import ujson as json from concurrent.futures import ThreadPoolExecutor from functools import partial, wraps import tornado.web from tornado import gen from libs import utils as utils_common from libs import asset_utils from libs import ldapauth, redisoj from web.const import REDIS_DB_VM from vmmaster.libs import instance, wmi, utils redis_client_vm = redisoj.RedisClient().get(REDIS_DB_VM) EXECUTOR = ThreadPoolExecutor(max_workers=500) def unblock(f): @tornado.web.asynchronous @wraps(f) def wrapper(*args, **kwargs): self = args[0] def callback(future): self.write(future.result()) self.finish() EXECUTOR.submit(partial(f, *args, **kwargs)).add_done_callback(
import re import time import xmlrpclib import redis import requests import ujson as json from libs import asset_utils, log, mail, redisoj from web.const import (OS_SIZE, REDIS_DB_VM, VM_AREAS, OVER_CONFS, PUPPET_CA_HOST) logger = log.LogHandler().logger client = redisoj.RedisClient().get(REDIS_DB_VM) def get_uid(): """ 获取唯一 id. 能够保证 id 不重复. """ pipe = client.pipeline() while 1: try: pipe.watch('uid') current_id = pipe.get('uid') if current_id is None: