Ejemplo n.º 1
0
    def prepare(self):
        ''' 获取用户信息 && 获取请求的参数

            Usage:
                >>> self.current_user['id']
                >>> self.params['x']
        '''
        with catch(self):
            self.params = {}

            user_id, token = self._with_token()

            if user_id:
                self.current_user = self.get_session(user_id)

            if self.request.headers.get('Content-Type', '').startswith(
                    'application/json') and self.request.body != '':
                self.params = json_loads(self.request.body.decode('utf-8'))
            else:
                self.params = self.request.arguments.copy()
                self._decode_params()

            # 从这开始,才对self.params修改
            if self.request.headers.get('Cid'):
                self.params['cid'] = int(self.request.headers['Cid'])

            self.params['token'] = token
Ejemplo n.º 2
0
    def get_brief_list(self, **cond):
        ''' 集群详情中获取主机列表
        '''
        arg = []
        extra = ''

        if len(cond) > 1: # 暂时保留cluster_id,但实际没用到
            extra = 'WHERE '
            e = []

            if cond.get('provider'):
                e.append(get_in_formats(field='i.provider', contents=cond['provider']))
                if isinstance(cond['provider'], list):
                    arg.extend(cond['provider'])
                else:
                    arg.append(cond['provider'])

            if cond.get('region'):
                e.append(get_in_formats(field='i.region_name', contents=cond['region']))
                if isinstance(cond['region'], list):
                    arg.extend(cond['region'])
                else:
                    arg.append(cond['region'])

            if cond.get('cluster_id'):
                e.append('s.cluster_id=%s')
                arg.append(cond['cluster_id'])

            if cond.get('lord'):
                e.append('s.lord=%s')
                arg.append(cond['lord'])

            if cond.get('form'):
                e.append('s.form=%s')
                arg.append(cond['form'])

            extra += ' AND '.join(e)

        sql = """
            SELECT s.id, s.name, s.public_ip, s.cluster_id, i.instance_id, i.provider, i.instance_name, i.region_name AS address, i.status AS machine_status
            FROM server s
            JOIN instance i USING(instance_id)
            """+"""
            {where}
            ORDER BY i.provider
        """.format(where=extra)

        cur = yield self.db.execute(sql, arg)
        data = cur.fetchall()

        # 添加最新上报信息
        report_info = self.redis.hgetall(SERVERS_REPORT_INFO)
        for d in data:
            info = fake_report_info() if is_faker(d['instance_id']) else json_loads(report_info.get(d['public_ip']))
            d.update(info)

        data = sorted(data, key=lambda x: x['name'], reverse=True)
        return data
Ejemplo n.º 3
0
    def is_latest_token(self):
        ''' 判断token是否最新
        '''
        data = json_loads(
            self.redis.hget(USER_LATEST_TOKEN, str(self.current_user['id'])))

        flag = True if data and data.get('token',
                                         '') == self.params['token'] else False

        return flag, data
Ejemplo n.º 4
0
    def on_message(self, message):
        self.params.update(json_loads(message))

        # 参数认证
        try:
            args = ['cluster_id', 'name', 'public_ip', 'username', 'passwd']

            self.guarantee(*args)

            for i in args[1:]:
                self.params[i] = self.params[i].strip()

            validate_ip(self.params['public_ip'])

            self.params.update(self.get_lord())
            self.params.update({'owner': self.current_user['id']})
        except Exception as e:
            self.write_message(str(e))
            self.close()
            return

        IOLoop.current().spawn_callback(
            callback=self.handle_msg)  # on_message不能异步, 要实现异步需spawn_callback
Ejemplo n.º 5
0
    def get_session(self, user_id):
        ''' 获取 Session
        '''
        data = self.redis.get(SESSION_KEY.format(user_id=user_id))

        return json_loads(data)
Ejemplo n.º 6
0
    def get(self, sid):
        """
        @api {get} /api/server/(\d+)/systemload 服务器负载
        @apiName SystemLoadHandler
        @apiGroup Server

        @apiParam {number} sid 服务器id

        @apiSuccessExample {json} Success-Response:
        HTTP/1.1 200 OK
        {
            "status": 0,
            "msg": "success",
            "data": {
                "date": "2018-03-08 14:23:30"
                "run_time": "6天6小时30分钟"
                "login_users": 1,
                "one_minute_load": 0.14
                "five_minute_load": 0.34
                "fifteen_minute_load:" 0.24
                "monitor": object
            }
        }
        """
        with catch(self):
            sid = int(sid)
            instance_info = yield self.server_service.fetch_instance_info(sid)
            server_info = yield self.server_service.select(conds={'id': sid},
                                                           fields='name',
                                                           one=True)
            if instance_info and is_faker(instance_info['instance_id']):
                self.success(
                    fake_systemload({
                        'sid': int(sid),
                        'name': server_info['name']
                    }))
                return

            ip = yield self.server_service.fetch_public_ip(int(sid))
            info = json_loads(self.redis.hget(SERVERS_REPORT_INFO,
                                              ip))['system_load']

            data = yield self.server_service.get_monitor_data([sid])
            resp = {
                'serverID': '',
                'name': '',
                'colorType': '',
                'cpuUsageRate': '',
                'memUsageRate': '',
                'diskUsageRate': '',
                'diskUtilize': '',
                'netUsageRate': '',
                'netDownload': '',
                'netUpload': '',
                "netInputMax": '',
                "netOutputMax": ''
            }
            monitor_data = data[0] if data else resp

            info.update({'monitor': monitor_data})
            self.success(info)
Ejemplo n.º 7
0
    def get(self, id):
        """
        @api {get} /api/server/(\d+) 主机详情
        @apiName ServerDetailHandler
        @apiGroup Server

        @apiParam {Number} id 主机ID

        @apiSuccessExample {json} Success-Response:
            HTTP/1.1 200 OK
            {
            "status": 0,
            "msg": "success",
            "data": {
                "basic_info": {
                    "id": int,
                    "name": str,
                    "cluster_id": int,
                    "cluster_name": str,
                    "address": str,
                    "public_ip": str,
                    "machine_status": str,
                    "business_status": str,
                    "region_id": str,
                    "instance_id": str
                },
                "system_info": {
                    "config": {
                        "cpu": int,
                        "memory": str,
                        "os_name": str,
                        "os_type": str,
                        "security_group_ids": [],
                        "instance_network_type": str,
                        "internetMaxBandwidthIn": str,
                        "internetMaxBandwidthOut": str,
                        "image_info":[
                            {
                                "image_id": str,
                                "image_name": str,
                                "image_version": str
                            }
                            ...
                        ],
                        "disk_info":[
                            {
                                "system_disk_id": str,
                                "system_disk_type": str,
                                "system_disk_size": str,
                                "image_id": str,
                                "image_version": str,
                                "image_name": str
                            }
                            ...
                        ]
                    }
                },
                "business_info": {
                    "provider": str,
                    "contract": {
                        "create_time": str,
                        "expired_time": str,
                        "instance_charge_type": str,
                        "instance_internet_charge_type": str
                    }
                },
            }
            }
        """
        with catch(self):
            data = yield self.server_service.get_detail(int(id))
            result = dict()

            result['basic_info'] = {
                'id': data['id'],
                'name': data['name'],
                'cluster_id': data['cluster_id'],
                'cluster_name': data['cluster_name'],
                'address': data['region_name'],
                'public_ip': data['public_ip'],
                'machine_status': data['machine_status'],
                'business_status': data['business_status'],
                'region_id': data['region_id'],
                'instance_id': data['instance_id'],
                'created_time': data['server_created_time']
            }

            disk_info = list()
            for i in json_loads(data.get('disk_info', '')):
                one = dict()
                one['system_disk_id'] = i['DiskId']
                one['system_disk_type'] = i['DiskCategory']
                one['system_disk_size'] = str(i['DiskSize']) + "G"
                disk_info.append(one)

            image_info = list()
            for i in json_loads(data.get('image_info', '')):
                one = dict()
                one['image_id'] = i['ImageId']
                one['image_name'] = i['ImageName']
                one['image_version'] = i['ImageVersion']
                image_info.append(one)

            result['system_info'] = {
                'config': {
                    'cpu':
                    data['cpu'],
                    'memory':
                    data['memory'],
                    'os_name':
                    data['os_name'],
                    'os_type':
                    data['os_type'],
                    "security_group_ids":
                    data['security_group_ids'],
                    "instance_network_type":
                    data['instance_network_type'],
                    "internet_max_bandwidth_in":
                    data['internet_max_bandwidth_in'] + "Mbps",
                    "internet_max_bandwidth_out":
                    data['internet_max_bandwidth_out'] + "Mbps",
                    'disk_info':
                    disk_info,
                    'image_info':
                    image_info
                }
            }

            result['business_info'] = {
                'provider': data['provider'],
                'contract': {
                    'create_time':
                    data['create_time'],
                    'expired_time':
                    data['expired_time'],
                    'instance_internet_charge_type':
                    data['instance_internet_charge_type'],
                    'instance_charge_type':
                    data['instance_charge_type']
                }
            }

            self.success(result)
Ejemplo n.º 8
0
    def post(self):
        """
        @api {post} /remote/server/report 监控上报
        @apiName ServerReport
        @apiGroup Server

        @apiParam {String} public_ip 公共ip
        @apiParam {Number} time 时间戳
        @apiParam {map[Number]Object} docker 容器
        @apiParam {Object} cpu CPU
        @apiParam {Object} memory Memory
        @apiParam {Object} disk Disk
        @apiParam {Object} net Net
        @apiParam {Object} system_load 负载

        @apiUse Success
        """
        with catch(self):
            deploying_msg = self.redis.hget(DEPLOYING,
                                            self.params['public_ip'])
            is_deployed = self.redis.hget(DEPLOYED, self.params['public_ip'])

            if not deploying_msg and not is_deployed:
                raise ValueError('%s not in deploying/deployed' %
                                 self.params['public_ip'])

            if deploying_msg:
                data = json_loads(deploying_msg)
                self.params.update({
                    'name': data['name'],
                    'cluster_id': data['cluster_id'],
                    'lord': data['lord'],
                    'form': data['form']
                })

                yield self.server_service.add_server(self.params)
                yield self.server_service.save_server_account({
                    'username':
                    data['username'],
                    'passwd':
                    data['passwd'],
                    'public_ip':
                    data['public_ip']
                })
                self.redis.hdel(DEPLOYING, self.params['public_ip'])
                self.redis.hset(DEPLOYED, self.params['public_ip'],
                                DEPLOYED_FLAG)

                # 通知服务器创建成功消息
                server_id = yield self.server_service.fetch_server_id(
                    self.params['public_ip'])
                instance_info = yield self.server_service.fetch_instance_info(
                    server_id)
                message = {
                    'owner':
                    data.get('owner'),
                    'ip':
                    self.params.get('public_ip'),
                    'provider':
                    instance_info['provider'],
                    'tip':
                    '{}'.format(data['lord'] if data['form'] ==
                                FORM_COMPANY else 0)
                }

                # 添加非个人机器时给添加者授予新增主机的数据权限,并且也通知到管理员
                if self.params['form'] == FORM_COMPANY:
                    arg = {
                        'cid': self.params['lord'],
                        'uid': data.get('owner'),
                        'sid': server_id
                    }
                    yield self.user_access_server_service.add(arg)

                    admin = yield self.company_employee_service.select(
                        conds={
                            'cid': self.params['lord'],
                            'is_admin': 1
                        },
                        one=True)
                    if data.get('owner') != admin['uid']:
                        message['admin'] = admin['uid']

                yield self.message_service.notify_server_added(message)

            yield self.server_service.save_report(self.params)

            # 将上报的k8s资源刷新到各个具体的对象表中
            yield self.update_k8s_resource(self.params)

            self.success()