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
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
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)
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)
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
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)
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)
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)
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)
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
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
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)
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"})
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"})
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)
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)
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
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