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
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
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
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
def get_session(self, user_id): ''' 获取 Session ''' data = self.redis.get(SESSION_KEY.format(user_id=user_id)) return json_loads(data)
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)
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)
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()