Example #1
0
def get(_id):
    """ 查看某个 wmi 的信息.

    """
    key = "wmi:" + _id
    client = redisoj.RedisClient().get(REDIS_DB_VM)
    return json.loads(client.get(key))
Example #2
0
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:*"))
Example #3
0
    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
Example #4
0
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
Example #5
0
    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
Example #6
0
#-*- 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):
Example #7
0
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, "")

    # 拷贝默认配置文件.
    # 不能同时安装两种类型的机器;
Example #8
0
def delete(_id):
    """ 删除一个 wmi.

    """    
    client = redisoj.RedisClient().get(REDIS_DB_VM)
    client.delete("wmi:"+_id)
Example #9
0
# -*- 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"]
Example #10
0
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(
Example #11
0
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: