예제 #1
0
 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'))
예제 #2
0
 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'))
예제 #3
0
 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
예제 #4
0
    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
예제 #5
0
    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
예제 #6
0
 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
예제 #7
0
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)