def vm_action(tenant_id, region): if not tenant_id or not region: return jsonify({"code": 400, "msg": "Could not find tenant_id or region or server_id"}), 400 # 禁止跨项目操作 user = getUserProjByToken(tenant_id) if not user or tenant_id not in user.proj_dict.keys(): return jsonify({"code": 403, "msg": "project is not yours"}), 403 body = request.json server_ids = body.get('servers') try: instance = InstanceManager(token=user.token, endpoint=user.get_endpoint(region, 'nova')) code = 200 message = 'success' detail = [] for i in server_ids.split(','): resp = instance.do(body, i) if resp.status == 202: _result = {"code": 200, "msg": "success", "server_id": i} else: code = 400 message = 'failed' _result = openstack_error(resp) _result['server_id'] = i detail.append(_result) return jsonify({"code": code, "msg": message, "detail": detail}), code except MyError, e: logger.exception('MyError raised') return jsonify({"code": 400, "msg": '%s' % e.value}), 400
def pm(): """ :param project_id: 租户id :param region: 区域 :param f: 起始位置 :param t: 结束位置 :return: 返回物理机列表 """ tenant_id = request.args.get('tenant_id', None) # 禁止跨项目操作 user = apiUtil.getUserProjByToken(tenant_id) if tenant_id not in user.proj_dict.keys(): return jsonify({"code": 403, "msg": "无权限操作该项目".decode('utf-8')}), 403 region = request.args.get('region', None) f = request.args.get('f', None) f = int(f) if f else f t = request.args.get('t', None) t = int(t) if t else t logger.info('Request: get pm servers list ' 'tenant_id => %s ' 'region => %s ' 'from => %s ' 'to => %s' % (tenant_id, region, f, t)) try: result = apiUtil.get_pm(tenant_id, region, f, t) return jsonify(result) except: logger.exception('Error with get pm_servers') return jsonify({"code": 400, "msg": "Error with get pm_servers"}), 400
def vm_action(tenant_id, region): if not tenant_id or not region: return jsonify({ "code": 400, "msg": "Could not find tenant_id or region or server_id" }), 400 # 禁止跨项目操作 user = getUserProjByToken(tenant_id) if not user or tenant_id not in user.proj_dict.keys(): return jsonify({"code": 403, "msg": "project is not yours"}), 403 body = request.json server_ids = body.get('servers') try: instance = InstanceManager(token=user.token, endpoint=user.get_endpoint(region, 'nova')) code = 200 message = 'success' detail = [] for i in server_ids.split(','): resp = instance.do(body, i) if resp.status == 202: _result = {"code": 200, "msg": "success", "server_id": i} else: code = 400 message = 'failed' _result = openstack_error(resp) _result['server_id'] = i detail.append(_result) return jsonify({"code": code, "msg": message, "detail": detail}), code except MyError, e: logger.exception('MyError raised') return jsonify({"code": 400, "msg": '%s' % e.value}), 400
def get_vm_monitor_statics(metric, uuid, duration, region): user = getUserProjByToken(g.admin_proj) endpoint = user.get_endpoint(region, 'ceilometer') mana = InstanceManager(token=user.token, endpoint=user.get_endpoint(region, 'nova')) RTN = [] if "network" in metric: pass #ports=NetworkFlowManager().getNetInfoByUUID(UUID,NEUTRON_DB(region)) #for port in ports: #obj = {} #obj["name"] = port["ip_address"] #ifaceId = ifaceID(UUID,port["id"],int(vir.id)) #print "ifaceid:",ifaceId #obj["data"] = statistics(region, metric.replace("_", "."), duration, ifaceId) #RTN.append(obj) elif "disk" in metric: obj = {} obj["name"] = mana.nova_show(uuid).name obj["data"] = statistics(endpoint, metric.replace("_", "."), duration, uuid) RTN.append(obj) elif "cpu_util" == metric: obj = {} obj["name"] = mana.nova_show(uuid).name obj["data"] = statistics(endpoint, metric, duration, uuid) RTN.append(obj) return RTN
def get_vm_monitor_statics(metric, uuid, duration, region): user = getUserProjByToken(g.admin_proj) endpoint = user.get_endpoint(region, 'ceilometer') mana = InstanceManager(token=user.token, endpoint=user.get_endpoint(region, 'nova')) RTN=[] if "network" in metric: pass #ports=NetworkFlowManager().getNetInfoByUUID(UUID,NEUTRON_DB(region)) #for port in ports: #obj = {} #obj["name"] = port["ip_address"] #ifaceId = ifaceID(UUID,port["id"],int(vir.id)) #print "ifaceid:",ifaceId #obj["data"] = statistics(region, metric.replace("_", "."), duration, ifaceId) #RTN.append(obj) elif "disk" in metric: obj={} obj["name"] = mana.nova_show(uuid).name obj["data"] = statistics(endpoint, metric.replace("_", "."), duration, uuid) RTN.append(obj) elif "cpu_util" == metric: obj={} obj["name"] = mana.nova_show(uuid).name obj["data"] = statistics(endpoint, metric, duration, uuid) RTN.append(obj) return RTN
def get_region_tenant(): user = getUserProjByToken() result = { "code": 200, "msg": "", "regions": user.get_regions(), "tenants": user.get_tenants() } return jsonify(result), 200
def vm(): """ :param project_id: 租户id :param region: 区域 :param f: 起始位置 :param t: 结束位置 :return: 返回虚拟机列表 """ tenant_id = request.args.get('tenant_id', None) region = request.args.get('region', None) if not tenant_id or not region: return jsonify({"code": 400, "msg": "Could not find tenant_id or region"}), 400 # 禁止跨项目操作 user = getUserProjByToken(tenant_id) if not user or tenant_id not in user.proj_dict.keys(): return jsonify({"code": 403, "msg": "project is not yours"}), 403 f = request.args.get('f', None) f = int(f) if f else f t = request.args.get('t', None) t = int(t) if t else t logger.info('Request: get vm servers list ' 'tenant_id => %s ' 'region => %s ' 'from => %s ' 'to => %s' % (tenant_id, region, f, t)) try: client = InstanceManager(token=user.token, endpoint=user.get_endpoint(region, "nova")) instance_collection = client.nova_list(f, t) total_count = len(instance_collection) vm_servers = [] for i in instance_collection: instance = { "instance_name": i.name, "instance_id": i.id, "region": region, "cpu_num": i.cpu, "mem_size": i.mem, "disk_size": i.disk, "lan_ip_set": i.lan_ip, "wan_ip_set": i.wan_ip, "status": i.status, "create_at": i.create_at, "update_at": i.update_at } vm_servers.append(instance) return jsonify({"code": 200, "msg": "", "total_count": total_count, "vm_servers": vm_servers}) except MyError, e: logger.exception('MyError raised') return jsonify({"code": 400, "msg": '%s' % e.value}), 400
def chg_pwd(tenant_id, region, uuid, pwd): if not tenant_id or not region: return jsonify({"code": 400, "msg": "Could not find tenant_id or region"}), 400 # 禁止跨项目操作 user = getUserProjByToken(tenant_id) if not user or tenant_id not in user.proj_dict.keys(): return jsonify({"code": 403, "msg": "project is not yours"}), 403 try: client = InstanceManager(token=user.token, endpoint=user.get_endpoint(region, 'nova')) instance = client.nova_show(uuid) chg_linux_pwd(instance, pwd) chg_win_pwd(instance, pwd) except MyError, e: logger.exception('MyError raised') return jsonify({"code": 400, "msg": '%s' % e.value}), 400
def pm_bill(): tenant_id = request.args.get('tenant_id', None) if not tenant_id: return jsonify({"code": 400, "msg": "Bad request, tenant_id required"}), 400 # 禁止跨项目操作 user = apiUtil.getUserProjByToken(tenant_id) if tenant_id not in user.proj_dict.keys(): return jsonify({"code": 403, "msg": "project is not yours"}), 403 logger.info('Request: curl -i -H "X-Auth-Token: %s" ' '-X GET "http://api.scloudm.com/mana_api/pm_bill?tenant_id=%s"' % (g.token, tenant_id)) try: result = apiUtil.get_pm_accounts(tenant_id) return jsonify(result) except: logger.exception('Error with get pm_accounts') return jsonify({"code": 400, "msg": "Error with get pm_accounts"}), 400
def pm_refund(tenant_id): # 实体机退库 # 禁止跨项目操作 user = apiUtil.getUserProjByToken(tenant_id) if tenant_id not in user.proj_dict.keys(): return jsonify({"code": 403, "msg": "project is not yours"}), 403 data = request.json if not data: return jsonify({"code": 400, "msg": "Bad request, could not find json data"}), 400 logger.info('Request: refund pm server:' 'data => %s ' 'username => %s ' % (data, g.username)) try: result = apiUtil._pm_refund(data) return jsonify(result), result['code'] except MyError, e: logger.exception('MyError raise') return jsonify({"code": 400, "msg": '%s' % e.value}), 400
def pm_act(tenant_id): if not request.json: return jsonify({"error": "Bad request, no json data"}), 400 act = request.json.get('act', None) # act 只能是 on off reset username = request.json.get('username', None) snids = request.json.get('snids', None) if not act or not username or not snids or not tenant_id: return jsonify({"code": 400, "msg": "Bad request, no json data"}), 400 # 禁止跨项目操作 user = apiUtil.getUserProjByToken(tenant_id) if tenant_id not in user.proj_dict.keys(): return jsonify({"code": 403, "msg": "project is not yours"}), 403 all_pm_info = apiUtil.get_info_by_snid(snids=snids) logger.info('Request: execute pm action ' 'username => %s ' 'act => %s ' 'system_snid => %s ' 'tenant_id => %s' % (username, act, snids, tenant_id)) try: result = {"code": 200, "msg": "success", "detail": []} for a in all_pm_info: res = os.system('ipmitool -I lanplus -U %s -P %s -H %s power %s' % (a[0], a[1], a[2], act)) logger.info('ipmitool -I lanplus -U %s -P %s -H %s power %s' % (a[0], a[1], a[2], act)) if res != 0: result["code"] = 400 result["msg"] = "failed" result["detail"].append({"code": 400, "msg": "failed", "snid": a[3]}) else: result["detail"].append({"code": 200, "msg": "success", "snid": a[3]}) apiUtil.update_stat_after_act(act, a[3]) return jsonify(result) except: logger.exception('Error with execute act %s' % act) return jsonify({"code": 400, "msg": "Sys Error with execute act %s" % act}), 400
def pm_bill_detail(): tenant_id = request.args.get('tenant_id', None) region = request.args.get('region', None) month = request.args.get('month', None) if not month or not region or not tenant_id: return jsonify({"code": 400, "msg": "Bad request, lost params"}), 400 # 禁止跨项目操作 user = apiUtil.getUserProjByToken(tenant_id) if tenant_id not in user.proj_dict.keys(): return jsonify({"code": 403, "msg": "project is not yours"}), 403 logger.info('Request: get pm accounts detail' 'tenant_id => %s ' 'region => %s ' 'month => %s '% (tenant_id, region, month)) try: result = apiUtil.get_pm_accounts_detail(tenant_id, region, month) return jsonify(result) except: logger.exception('Error with get pm_accounts_detail') return jsonify({"code": 400, "msg": "Error with get pm_accounts_detail"}), 400
def vm(): """ :param project_id: 租户id :param region: 区域 :param f: 起始位置 :param t: 结束位置 :return: 返回虚拟机列表 """ tenant_id = request.args.get('tenant_id', None) region = request.args.get('region', None) if not tenant_id or not region: return jsonify({ "code": 400, "msg": "Could not find tenant_id or region" }), 400 # 禁止跨项目操作 user = getUserProjByToken(tenant_id) if not user or tenant_id not in user.proj_dict.keys(): return jsonify({"code": 403, "msg": "project is not yours"}), 403 f = request.args.get('f', None) f = int(f) if f else f t = request.args.get('t', None) t = int(t) if t else t logger.info('Request: get vm servers list ' 'tenant_id => %s ' 'region => %s ' 'from => %s ' 'to => %s' % (tenant_id, region, f, t)) try: client = InstanceManager(token=user.token, endpoint=user.get_endpoint(region, "nova")) instance_collection = client.nova_list(f, t) total_count = len(instance_collection) vm_servers = [] for i in instance_collection: instance = { "instance_name": i.name, "instance_id": i.id, "region": region, "cpu_num": i.cpu, "mem_size": i.mem, "disk_size": i.disk, "lan_ip_set": i.lan_ip, "wan_ip_set": i.wan_ip, "status": i.status, "create_at": i.create_at, "update_at": i.update_at } vm_servers.append(instance) return jsonify({ "code": 200, "msg": "", "total_count": total_count, "vm_servers": vm_servers }) except MyError, e: logger.exception('MyError raised') return jsonify({"code": 400, "msg": '%s' % e.value}), 400
def get_region_tenant(): user = getUserProjByToken() result = {"code": 200, "msg": "", "regions": user.get_regions(), "tenants": user.get_tenants()} return jsonify(result), 200