示例#1
0
    def download(self, request, *args, **kwargs):
        """
        Download the volume data.
        """
        volume = self.get_object()

        # Check whether project is corresponding to the user
        user = request.user
        if not check_member_in_project(volume.project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, volume.project.name))

        logger.info("User {} download the data of volume {}-{}.".format(
            request.user.username, volume.project.name, volume.name))

        # Copy file to local first
        volume_dir = get_volume_direction_on_nfs(volume)
        filename = get_upload_volume_filename(volume, request.user)
        client = NFSLocalClient()
        client.tar_and_copy_to_local(volume_dir, filename)

        response = StreamingHttpResponse(big_file_iterator(filename))
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="{}"'.format(
            os.path.basename(filename))

        return response
示例#2
0
    def get_object(self):
        """
        Returns the object the view is displaying.
        """
        user = self.request.user

        assert 'pid' in self.kwargs
        assert 'aid' in self.kwargs
        pid = self.kwargs['pid']
        aid = self.kwargs['aid']

        assert 'pk' in self.kwargs
        id = self.kwargs['pk']
        obj = AutoScaler.objects.get(app__image__project__id=pid, app__id=aid,
            id=id)

        project = Project.objects.get(id=pid)
        # Check user permission
        if not check_member_in_project(project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, project.name))

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj
示例#3
0
    def get_queryset(self):
        user = self.request.user

        assert 'pid' in self.kwargs
        pid = self.kwargs['pid']

        project = Project.objects.get(id=pid)

        if not check_member_in_project(project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, project.name))

        return Volume.objects.filter(project__id=pid)
示例#4
0
    def get_queryset(self):
        user = self.request.user

        if 'pid' not in self.kwargs:
            return Application.objects.all()

        pid = self.kwargs['pid']
        project = Project.objects.get(id=pid)

        if not check_member_in_project(project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, project.name))

        return Application.objects.filter(image__project__id=pid)
示例#5
0
    def create(self, request, *args, **kwargs):
        """
        Create an application instance.
        """
        user = request.user

        logger.info("user {} will create an volume.".format(
            user.username))

        assert 'pid' in self.kwargs
        pid = int(self.kwargs['pid'])

        # Check whether project is corresponding to the user
        project = Project.objects.get(id=pid)
        if not check_member_in_project(project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, project.name))

        # Check whether or not exists the same name volume in the project
        volumes = Volume.objects.filter(project__id=pid,
            name=request.data.get('name', ''))
        if volumes:
            raise ValidationError(
                detail="Already has an volume called {} in this project."
                .format(request.data.get('name', '')))

        app = request.data.get('app', None)
        if app:
            raise ValidationError(detail="Shouldn't contain app attribute.")

        data = request.data.copy()
        data['user'] = user.id

        # create volume metadata
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        response = Response(serializer.data, status=status.HTTP_201_CREATED,
            headers=headers)

        volume = Volume.objects.get(id=serializer.data['id'])
        # logger.debug(volume)

        # create volume instance
        builder = VolumeBuilder(volume)
        builder.create_volume()

        return response
示例#6
0
    def get_volume_username(self, request, *args, **kwargs):
        """
        Get the username of this volume.
        """
        volume = self.get_object()

        # Check whether project is corresponding to the user
        user = request.user
        if not check_member_in_project(volume.project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, volume.project.name))

        username = volume.user.username

        return Response(username, status=status.HTTP_200_OK)
示例#7
0
    def get_queryset(self):
        user = self.request.user

        assert 'pid' in self.kwargs
        assert 'aid' in self.kwargs
        pid = self.kwargs['pid']
        aid = self.kwargs['aid']

        project = Project.objects.get(id=pid)

        # Check user permission
        if not check_member_in_project(project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, project.name))

        return Port.objects.filter(app__image__project__id=pid, app__id=aid)
示例#8
0
    def get_queryset(self):
        user = self.request.user

        assert 'pid' in self.kwargs
        assert 'aid' in self.kwargs
        pid = self.kwargs['pid']
        aid = self.kwargs['aid']

        project = Project.objects.get(id=pid)

        # Check user permission
        if not check_member_in_project(project, user):
            raise PermissionDenied(
                detail="User {} is not in project {}.".format(
                    user.username, project.name))

        return Port.objects.filter(app__image__project__id=pid, app__id=aid)
示例#9
0
文件: views.py 项目: Huangu0/hummer
    def get_queryset(self):
        """
        This view should return a list of all the images for the current
        project.
        """
        user = self.request.user

        # if 'pid' not in self.kwargs:
        #     return Image.objects.all()
        assert 'pid' in self.kwargs
        pid = self.kwargs['pid']

        project = Project.objects.get(id=pid)

        if not check_member_in_project(project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, project.name))

        return Image.objects.filter(project__id=pid)
示例#10
0
    def get_queryset(self):
        """
        This view should return a list of all the images for the current
        project.
        """
        user = self.request.user

        # if 'pid' not in self.kwargs:
        #     return Image.objects.all()
        assert 'pid' in self.kwargs
        pid = self.kwargs['pid']

        project = Project.objects.get(id=pid)

        if not check_member_in_project(project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, project.name))

        return Image.objects.filter(project__id=pid)
示例#11
0
    def get_object(self):
        """
        Returns the object the view is displaying.
        """
        user = self.request.user

        assert 'pid' in self.kwargs
        pid = self.kwargs['pid']

        assert 'pk' in self.kwargs
        id = self.kwargs['pk']
        obj = Image.objects.get(project__id=pid, id=id)

        # Check user permission
        if not check_member_in_project(obj.project, user):
            raise PermissionDenied()

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj
示例#12
0
文件: views.py 项目: Huangu0/hummer
    def get_object(self):
        """
        Returns the object the view is displaying.
        """
        user = self.request.user

        assert 'pid' in self.kwargs
        pid = self.kwargs['pid']

        assert 'pk' in self.kwargs
        id = self.kwargs['pk']
        obj = Volume.objects.get(project__id=pid, id=id)

        if not check_member_in_project(obj.project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, obj.project.name))

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj
示例#13
0
    def destroy(self, request, *args, **kwargs):
        """
        Destroy volume metadata and instance.
        """
        volume = self.get_object()

        # Check whether project is corresponding to the user
        user = request.user
        if not check_member_in_project(volume.project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, volume.project.name))

        if volume.app:
            raise ValidationError(detail="The volume is being used by \
application {}, delete the application first.".format(volume.app.name))

        # Delete the volume instance
        destroyer = VolumeDestroyer(volume=volume)
        destroyer.destroy_volume()

        return Response(status=status.HTTP_204_NO_CONTENT)
示例#14
0
文件: views.py 项目: Huangu0/hummer
    def destroy(self, request, *args, **kwargs):
        """
        Destroy volume metadata and instance.
        """
        volume = self.get_object()

        # Check whether project is corresponding to the user
        user = request.user
        if not check_member_in_project(volume.project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, volume.project.name))

        if volume.app:
            raise ValidationError(detail="The volume is being used by \
application {}, delete the application first.".format(volume.app.name))

        # Delete the volume instance
        destroyer = VolumeDestroyer(volume=volume)
        destroyer.destroy_volume()

        return Response(status=status.HTTP_204_NO_CONTENT)
示例#15
0
    def get_object(self):
        """
        Returns the object the view is displaying.
        """
        user = self.request.user

        assert 'pid' in self.kwargs
        pid = self.kwargs['pid']

        assert 'pk' in self.kwargs
        id = self.kwargs['pk']
        obj = Volume.objects.get(project__id=pid, id=id)

        if not check_member_in_project(obj.project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, obj.project.name))

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj
示例#16
0
    def get_object(self):
        """
        Returns the object the view is displaying.
        """
        user = self.request.user

        assert 'pid' in self.kwargs
        pid = self.kwargs['pid']

        assert 'pk' in self.kwargs
        id = self.kwargs['pk']
        obj = Image.objects.get(project__id=pid, id=id)

        # Check user permission
        if not check_member_in_project(obj.project, user):
            raise PermissionDenied()

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj
示例#17
0
def upload_volume(request, *args, **kwargs):
    """
    User upload volume data, delete the original data first.
    """
    if not (request.user and request.user.is_authenticated()):
        raise PermissionDenied()

    user = request.user

    assert 'pid' in kwargs
    pid = kwargs['pid']

    assert 'pk' in kwargs
    id = kwargs['pk']
    volume = Volume.objects.get(project__id=pid, id=id)

    # Check whether the user is the member of this project
    if not check_member_in_project(volume.project, user):
        raise PermissionDenied(detail="User {} is not in project {}.".format(
            user.username, volume.project.name))

    if not request.FILES.get('file'):
        raise ParseError(detail="There is no upload file.")

    logger.info("User {} upload files to volume {}-{}.".format(
        user.username, volume.project.name, volume.name))

    filename = get_upload_volume_filename(volume, user)
    save_upload_file_to_disk(request.FILES['file'], filename)

    client = NFSLocalClient()
    volume_dir = get_volume_direction_on_nfs(volume)
    # Clear the dir first
    client.removedir(volume_dir)
    client.makedir(volume_dir)

    client.copy_file_to_remote_and_untar(filename, volume_dir)
    remove_file_from_disk(filename)

    return JsonResponse({"detail": "success"})
示例#18
0
def upload_volume(request, *args, **kwargs):
    """
    User upload volume data, delete the original data first.
    """
    if not (request.user and request.user.is_authenticated()):
        raise PermissionDenied()

    user = request.user

    assert 'pid' in kwargs
    pid = kwargs['pid']

    assert 'pk' in kwargs
    id = kwargs['pk']
    volume = Volume.objects.get(project__id=pid, id=id)

    # Check whether the user is the member of this project
    if not check_member_in_project(volume.project, user):
        raise PermissionDenied(detail="User {} is not in project {}."
            .format(user.username, volume.project.name))

    if not request.FILES.get('file'):
        raise ParseError(detail="There is no upload file.")

    logger.info("User {} upload files to volume {}-{}.".format(
        user.username, volume.project.name, volume.name))

    filename = get_upload_volume_filename(volume, user)
    save_upload_file_to_disk(request.FILES['file'], filename)

    client = NFSLocalClient()
    volume_dir = get_volume_direction_on_nfs(volume)
    # Clear the dir first
    client.removedir(volume_dir)
    client.makedir(volume_dir)

    client.copy_file_to_remote_and_untar(filename, volume_dir)
    remove_file_from_disk(filename)

    return JsonResponse({"detail": "success"})
示例#19
0
    def clear_volume(self, request, *args, **kwargs):
        """
        Clear volume.
        """
        volume = self.get_object()

        # Check whether project is corresponding to the user
        user = request.user
        if not check_member_in_project(volume.project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, volume.project.name))

        logger.info("User {} clear volume {}-{}.".format(user.username,
            volume.project.name, volume.name))

        client = NFSLocalClient()
        volume_dir = get_volume_direction_on_nfs(volume)
        # Clear the dir
        client.removedir(volume_dir)
        client.makedir(volume_dir)

        return Response(status=status.HTTP_200_OK)
示例#20
0
文件: views.py 项目: Huangu0/hummer
    def clear_volume(self, request, *args, **kwargs):
        """
        Clear volume.
        """
        volume = self.get_object()

        # Check whether project is corresponding to the user
        user = request.user
        if not check_member_in_project(volume.project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, volume.project.name))

        logger.info("User {} clear volume {}-{}.".format(user.username,
            volume.project.name, volume.name))

        client = NFSLocalClient()
        volume_dir = get_volume_direction_on_nfs(volume)
        # Clear the dir
        client.removedir(volume_dir)
        client.makedir(volume_dir)

        return Response(status=status.HTTP_200_OK)
示例#21
0
文件: views.py 项目: Huangu0/hummer
    def logs_pod(self, request, *args, **kwargs):
        """
        Return the tail n lines logs of pod.
        """
        user = request.user

        assert 'pid' in self.kwargs
        pid = self.kwargs['pid']
        project = Project.objects.get(id=pid)

        if not check_member_in_project(project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, project.name))

        assert 'pod' in self.kwargs
        pod = self.kwargs['pod']
        tailLine = int(request.query_params['tail'])

        kubeclient = KubeClient("http://{}:{}{}".format(settings.MASTER_IP,
            settings.K8S_PORT, settings.K8S_API_PATH))
        logs = kubeclient.get_logs_of_pod(project.name, pod, tailLine)
        # print(logs)

        return Response(data=logs, status=status.HTTP_200_OK)
示例#22
0
    def logs_pod(self, request, *args, **kwargs):
        """
        Return the tail n lines logs of pod.
        """
        user = request.user

        assert 'pid' in self.kwargs
        pid = self.kwargs['pid']
        project = Project.objects.get(id=pid)

        if not check_member_in_project(project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, project.name))

        assert 'pod' in self.kwargs
        pod = self.kwargs['pod']
        tailLine = int(request.query_params['tail'])

        kubeclient = KubeClient("http://{}:{}{}".format(settings.MASTER_IP,
            settings.K8S_PORT, settings.K8S_API_PATH))
        logs = kubeclient.get_logs_of_pod(project.name, pod, tailLine)
        # print(logs)

        return Response(data=logs, status=status.HTTP_200_OK)
示例#23
0
    def create(self, request, *args, **kwargs):
        """
        Create an application instance.
        """
        user = request.user

        logger.info("user {} will create an application.".format(
            user.username))

        assert 'pid' in self.kwargs

        # Check whether image is corresponding to the project
        image_id = request.data.get('image', None)
        pid = int(self.kwargs['pid'])
        image = Image.objects.get(id=image_id)
        if not image or image.project.id != pid:
            raise NotFound(
                detail="Image {} isn't in project {}.".format(image_id, pid))

        # Check whether project is corresponding to the user
        project = Project.objects.get(id=pid)

        if not check_member_in_project(project, user):
            raise PermissionDenied(
                detail="User {} is not in project {}.".format(
                    user.username, project.name))

        applications = Application.objects.filter(
            image__project=project, name=request.data.get('name'))
        if applications:
            raise ValidationError(
                detail="Already has an application called {}.".format(
                    request.data.get('name')))

        volumes = request.data.get('volumes', [])
        for volume in volumes:
            volume = Volume.objects.get(id=volume['volume'])
            if volume.app or volume.mount_path:
                raise ValidationError(detail="Volume {} is being used by \
application {}.".format(volume.name, volume.app.name))

        data = request.data.copy()
        data['user'] = user.id
        # create application metadata
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        response = Response(serializer.data,
                            status=status.HTTP_201_CREATED,
                            headers=headers)

        application = Application.objects.get(id=serializer.data['id'])
        logger.debug(application)

        image_name = "{}/{}/{}-{}:{}".format(settings.IMAGE_REGISTRY,
                                             image.user.username,
                                             image.project.name, image.name,
                                             image.version)
        logger.debug(image_name)
        ports = request.data.get('ports', None)

        # create a true application instance

        builder = ApplicationBuilder(
            application=application,
            image_name=image_name,
            tcp_ports=get_ports_by_protocol('TCP', ports),
            udp_ports=get_ports_by_protocol('UDP', ports),
            commands=request.data.get('commands', None),
            args=request.data.get('args', None),
            envs=request.data.get('envs', None),
            is_public=request.data.get('is_public', False),
            volumes=request.data.get('volumes', None),
            min_replicas=request.data.get('min_replicas', -1),
            max_replicas=request.data.get('max_replicas', -1),
            cpu_target=request.data.get('cpu_target', -1),
        )
        builder.create_application()

        return response
示例#24
0
    def create(self, request, *args, **kwargs):
        """
        Create an application instance.
        """
        user = request.user

        logger.info("user {} will create an application.".format(
            user.username))

        assert 'pid' in self.kwargs

        # Check whether image is corresponding to the project
        image_id = request.data.get('image', None)
        pid = int(self.kwargs['pid'])
        image = Image.objects.get(id=image_id)
        if not image or image.project.id != pid:
            raise NotFound(detail="Image {} isn't in project {}.".format(
                image_id, pid))

        # Check whether project is corresponding to the user
        project = Project.objects.get(id=pid)

        if not check_member_in_project(project, user):
            raise PermissionDenied(detail="User {} is not in project {}."
                .format(user.username, project.name))

        applications = Application.objects.filter(image__project=project,
            name=request.data.get('name'))
        if applications:
            raise ValidationError(detail="Already has an application called {}."
                .format(request.data.get('name')))

        volumes = request.data.get('volumes', [])
        for volume in volumes:
            volume = Volume.objects.get(id=volume['volume'])
            if volume.app or volume.mount_path:
                raise ValidationError(detail="Volume {} is being used by \
application {}.".format(volume.name, volume.app.name))

        data = request.data.copy()
        data['user'] = user.id
        # create application metadata
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        response = Response(serializer.data, status=status.HTTP_201_CREATED,
            headers=headers)

        application = Application.objects.get(id=serializer.data['id'])
        logger.debug(application)

        image_name = "{}/{}/{}-{}:{}".format(settings.IMAGE_REGISTRY,
            image.user.username, image.project.name, image.name, image.version)
        logger.debug(image_name)
        ports = request.data.get('ports', None)

        # create a true application instance

        builder = ApplicationBuilder(
            application=application,
            image_name=image_name,
            tcp_ports=get_ports_by_protocol('TCP', ports),
            udp_ports=get_ports_by_protocol('UDP', ports),
            commands=request.data.get('commands', None),
            args=request.data.get('args', None),
            envs=request.data.get('envs', None),
            is_public=request.data.get('is_public', False),
            volumes=request.data.get('volumes', None),
            min_replicas=request.data.get('min_replicas', -1),
            max_replicas=request.data.get('max_replicas', -1),
            cpu_target=request.data.get('cpu_target', -1),
        )
        builder.create_application()

        return response