def get(self, args): ''' 以应用维度查询资源信息 ''' mould_ids = args.pop('mould_ids', []) q = args.pop('q', None) if mould_ids: args.update({'mould__in': mould_ids}) Instance.fetch_one() instances, total = Instance.pagination(**args) return BaseResource.pagination( instances_detail_schema.dump(instances).data, total, args.get('per_page'))
def get(self, args, mould_id): mould = self.record page = args.get('page', 1) per_page = args.get('per_page', 20) instances, total = Instance.pagination(page, per_page, mould=mould) return BaseResource.pagination( instances_detail_schema.dump(instances).data, total, args.get('per_page'))
def get(self, layer_id): if not validate_valid_layer_id(layer_id): error(InterfaceTips.INVALID_LAYER_ID) instances = Instance.get_ancestors(layer_id) children = instance_nodes_schema.dump(instances).data layer_data = LAYERS_CONFIG.get(layer_id) instance_info = layer_data.get('instance_info') if children: instance_info.update({ 'has_children': bool(children), 'children': children }) return instance_info
def post(self, args, mould_id): mould = self.record success, error_message = mould.validate_abilities( args.get('abilities', {})) if not success: return error_message, 422 parent_id = args.pop('parent_id', None) if mould.parent: if parent_id: parent = Instance.find_by_pk(parent_id) if not parent: error(InterfaceTips.PARENT_DATA_NOT_EXISTED) args.update({'parent': parent}) else: error(InterfaceTips.PARENT_ID_IS_REQUIRED) # TODO check record is existed # if Mould.existed_record(**args): # error(InterfaceTips.RECORD_HAS_EXISTED) instance = Instance.create(mould=mould, **args) return instance_detail_schema.dump(instance).data, 201
def put(self, args, instance_id): layer_id = args.get('layer_id', None) if layer_id and not validate_valid_layer_id(layer_id): error(InterfaceTips.INVALID_LAYER_ID) instance = self.record success, error_message = instance.mould.validate_abilities( args.get('abilities', {})) if not success: return error_message, 422 parent_id = args.pop('parent_id', None) if instance.mould.parent: if parent_id: parent = Instance.find_by_pk(parent_id) if not parent: error(InterfaceTips.PARENT_DATA_NOT_EXISTED) args.update({'parent': parent}) else: error(InterfaceTips.PARENT_ID_IS_REQUIRED) # if Mould.existed_record(instance, **args): # error(InterfaceTips.RECORD_HAS_EXISTED) instance = instance.update(**args) return instance_detail_schema.dump(instance).data
def get(self, args): ''' 以模型维统计资源信息 :param args: :return: ''' instances = Instance.fetch_all(**args) instance_aggregation = instances.aggregate(*[{ '$group': { '_id': '$mould', 'count': { '$sum': 1 } } }]) moulds = Mould.fetch_all(**args) moulds_data = {} for mould in moulds: moulds_data.update({mould.id: mould_base_schema.dump(mould).data}) mould_instances_stats = [] for stats in instance_aggregation: stats.update({'mould': moulds_data.get(stats.get('_id'), {})}) mould_instances_stats.append(stats) return mould_instances_stats
def start_instance(request): """ Starts a Instance :param request: :param pk: :return: """ request = json.loads(request.body.decode('UTF-8')) try: user = User.objects.get(username=request['username']) slaves = Slave.objects.all() image = Image.objects.get(id=request["image"]) # Write a decide function to choose slave. print(request) slave = decide(slaves, request['cpu'], request['memory']) print(slave) if slave is None: return JsonResponse( {"message": "No resources left to run instance"}, status=500) # elif slave == -1: # return JsonResponse({"message": "Internal Server Error"}, status=500) # elif slave == -2: # return JsonResponse({"message": "RAM not numeric"}, status=500) new_instance = Instance(slave_id=slave.id, user=user) new_instance.status = 'CR' new_instance.name = request['name'] new_instance.RAM = int(request['memory']) new_instance.CPU = int(request['cpu']) new_instance.image = image new_instance.save() slave_response = req.post('http://{}/lc_slave/start_instance/'.format( slave.URL), data=json.dumps({ 'instance_id': new_instance.id, 'image': image.actual_name, 'cpu': request['cpu'], 'memory': request['memory'] }), headers={'content-type': 'application/json'}) # slave_response = req.get('http://localhost:8001/lc_slave/start_instance/{}'.format(1)) print(slave_response) if slave_response.status_code != 200: new_instance.delete() return JsonResponse({"message": "Slave response not correct"}, status=500) slave_response = slave_response.json() # print(slave_response) try: slave_ssh = int(slave_response['ssh_port']) except KeyError: new_instance.delete() return JsonResponse({"message": "Slave Response not correct"}, status=500) new_instance.IP = slave.IP new_instance.slave_id = slave.id new_instance.ssh_port = slave_ssh new_instance.status = 'RU' new_instance.save() slave.cpu_remaining -= request['cpu'] slave.memory_used += request['memory'] slave.save() except KeyError: return JsonResponse({"message": "Instance Details not correct."}, status=400) except User.DoesNotExist: return JsonResponse({"message": "requested user does not exists."}, status=400) return JsonResponse( { "message": "Instance stated successfully", "instance_id": new_instance.id }, status=200)