Пример #1
0
    def obj_create(self, bundle, **kwargs):
        try:
            template_id = bundle.data.pop('template_id')
            project_id = bundle.data.pop('project__id')
            json.loads(bundle.data['data'])
        except Exception as e:
            message = 'create scheme params error: %s' % e
            logger.error(message)
            raise BadRequest(message)
        try:
            template = TaskTemplate.objects.get(pk=template_id,
                                                project_id=project_id)
        except TaskTemplate.DoesNotExist:
            message = 'flow template[id={template_id}] in project[id={project_id}] does not exist'.format(
                template_id=template_id, project_id=project_id)
            logger.error(message)
            raise BadRequest(message)

        verify_or_raise_immediate_response(
            principal_type='user',
            principal_id=bundle.request.user.username,
            resource=task_template_resource,
            action_ids=[task_template_resource.actions.edit.id],
            instance=template)

        bundle.data['name'] = name_handler(bundle.data['name'],
                                           TEMPLATE_NODE_NAME_MAX_LENGTH)
        kwargs['unique_id'] = '%s-%s' % (template_id, bundle.data['name'])
        if TemplateScheme.objects.filter(
                unique_id=kwargs['unique_id']).exists():
            raise BadRequest(
                'template scheme name has existed, please change the name')
        kwargs['template'] = template.pipeline_template
        return super(TemplateSchemeResource, self).obj_create(bundle, **kwargs)
Пример #2
0
    def obj_create(self, bundle, **kwargs):

        verify_or_raise_immediate_response(
            principal_type='user',
            principal_id=bundle.request.user.username,
            resource=admin_operate_resource,
            action_ids=[admin_operate_resource.actions.edit.id],
            instance=None)

        try:
            origins = bundle.data.pop('origins')
            caches = bundle.data.pop('caches')
        except KeyError:
            raise BadRequest('Invalid params, please check origins and caches')

        with transaction.atomic():
            # collect packages of all origin to cache
            cache_packages = {}
            for origin in origins:
                try:
                    jsonschema.validate(origin, ADD_SOURCE_SCHEMA)
                except jsonschema.ValidationError as e:
                    message = 'Invalid origin source params: %s' % e
                    logger.error(message)
                    raise BadRequest(message)
                cache_packages.update(origin['packages'])

            # create cache first if caches exist
            for cache in caches:
                try:
                    jsonschema.validate(cache, ADD_SOURCE_SCHEMA)
                except jsonschema.ValidationError as e:
                    message = 'Invalid cache source params: %s' % e
                    logger.error(message)
                    raise BadRequest(message)
                try:
                    CachePackageSource.objects.add_cache_source(
                        cache['name'], cache['type'], cache_packages,
                        cache.get('desc', ''), **cache['details'])
                except exceptions.GcloudExternalPluginsError as e:
                    message = 'Create cache source raise error: %s' % e
                    logger.error(message)
                    raise BadRequest(message)

            # create origins after
            for origin in origins:
                source_type = origin['type']
                details = origin['details']
                # divide details into two parts,base_kwargs mains fields in base model(e.g. fields of
                # pipeline.contrib.external_plugins.models.GitRepoSource)
                # original_kwargs mains field in origin model but not in base model(e.g. repo_address、desc)
                source_model = source_cls_factory[source_type]
                original_kwargs, base_kwargs = source_model.objects.divide_details_parts(
                    source_type, details)
                original_kwargs['desc'] = origin.get('desc', '')
                source_model.objects.add_original_source(
                    origin['name'], source_type, origin['packages'],
                    original_kwargs, **base_kwargs)
Пример #3
0
    def obj_get_list(self, bundle, **kwargs):
        verify_or_raise_immediate_response(
            principal_type='user',
            principal_id=bundle.request.user.username,
            resource=admin_operate_resource,
            action_ids=[admin_operate_resource.actions.view.id],
            instance=None)

        return super(SyncTaskResource, self).obj_get_list(bundle, **kwargs)
Пример #4
0
    def obj_delete(self, bundle, **kwargs):
        try:
            scheme_id = kwargs['pk']
            scheme = TemplateScheme.objects.get(pk=scheme_id)
            common_template = CommonTemplate.objects.get(pipeline_template=scheme.template)
        except Exception:
            raise BadRequest('common scheme or template does not exist')

        verify_or_raise_immediate_response(principal_type='user',
                                           principal_id=bundle.request.user.username,
                                           resource=common_template_resource,
                                           action_ids=[common_template_resource.actions.edit.id],
                                           instance=common_template)
        return super(CommonTemplateSchemeResource, self).obj_delete(bundle, **kwargs)
Пример #5
0
    def obj_delete(self, bundle, **kwargs):
        try:
            obj = TemplateScheme.objects.get(id=kwargs['pk'])
        except TemplateScheme.DoesNotExist:
            raise BadRequest('scheme does not exist')

        try:
            template = TaskTemplate.objects.get(pipeline_template=obj.template)
        except TaskTemplate.DoesNotExist:
            raise BadRequest(
                'flow template the deleted scheme belongs to does not exist')

        verify_or_raise_immediate_response(
            principal_type='user',
            principal_id=bundle.request.user.username,
            resource=task_template_resource,
            action_ids=[task_template_resource.actions.edit.id],
            instance=template)
        return super(TemplateSchemeResource, self).obj_delete(bundle, **kwargs)
Пример #6
0
    def obj_create(self, bundle, **kwargs):
        try:
            project_id = bundle.data.pop('project__id')
            template_id = bundle.data.pop('template_id')
            common_template = CommonTemplate.objects.get(pk=template_id)
        except Exception:
            raise BadRequest('common template does not exist')

        verify_or_raise_immediate_response(principal_type='user',
                                           principal_id=bundle.request.user.username,
                                           resource=common_template_resource,
                                           action_ids=[common_template_resource.actions.edit.id],
                                           instance=common_template)

        bundle.data['name'] = name_handler(bundle.data['name'], TEMPLATE_NODE_NAME_MAX_LENGTH)
        kwargs['unique_id'] = '%s-%s-%s' % (project_id, template_id, bundle.data['name'])
        if TemplateScheme.objects.filter(unique_id=kwargs['unique_id']).exists():
            raise BadRequest('common template scheme name has existed, please change the name')
        kwargs['template'] = common_template.pipeline_template
        return super(CommonTemplateSchemeResource, self).obj_create(bundle, **kwargs)
Пример #7
0
    def obj_delete_list(self, bundle, **kwargs):

        verify_or_raise_immediate_response(
            principal_type='user',
            principal_id=bundle.request.user.username,
            resource=admin_operate_resource,
            action_ids=[admin_operate_resource.actions.edit.id],
            instance=None)

        with transaction.atomic():
            caches = CachePackageSource.objects.all()
            # 需要单独调用自定义 delete 方法
            for cache in caches:
                cache.delete()

            for origin_type, origin_model in source_cls_factory.items():
                origins = origin_model.objects.all()
                # 需要单独调用自定义 delete 方法
                for origin in origins:
                    origin.delete()
Пример #8
0
    def obj_create(self, bundle, **kwargs):

        verify_or_raise_immediate_response(
            principal_type='user',
            principal_id=bundle.request.user.username,
            resource=admin_operate_resource,
            action_ids=[admin_operate_resource.actions.edit.id],
            instance=None)

        model = bundle.obj.__class__
        if model.objects.filter(status=RUNNING).exists():
            raise BadRequest(
                'There is already a running sync task, please wait for it to complete and try again'
            )
        if not CachePackageSource.objects.all().exists():
            raise BadRequest(
                'No cache package found, please add cache package in Backend Manage'
            )
        if len(PackageSourceResource.get_all_source_objects()) <= 1:
            raise BadRequest(
                'No original packages found, please add original packages in Backend Manage'
            )
        return super(SyncTaskResource, self).obj_create(bundle, **kwargs)
Пример #9
0
    def obj_get_list(self, bundle, **kwargs):

        verify_or_raise_immediate_response(
            principal_type='user',
            principal_id=bundle.request.user.username,
            resource=admin_operate_resource,
            action_ids=[admin_operate_resource.actions.view.id],
            instance=None)

        filters = {}

        if hasattr(bundle.request, 'GET'):
            # Grab a mutable copy.
            filters = bundle.request.GET.copy()

        # Update with the provided kwargs.
        filters.update(kwargs)
        applicable_filters = self.build_filters(filters=filters)

        try:
            objects = self.apply_filters(bundle.request, applicable_filters)
            return self.authorized_read_list(objects, bundle)
        except ValueError:
            raise BadRequest('Invalid resource lookup params provided')
Пример #10
0
    def obj_create(self, bundle, **kwargs):
        try:
            template_id = bundle.data.pop('template_id')
            name = bundle.data.pop('name')
            cron = json.loads(bundle.data.pop('cron'))
            pipeline_tree = json.loads(bundle.data.pop('pipeline_tree'))
            project_path = bundle.data['project']
        except (KeyError, ValueError) as e:
            raise BadRequest(e.message)

        # XSS handle
        name = name_handler(name, PERIOD_TASK_NAME_MAX_LENGTH)
        creator = bundle.request.user.username

        # validate pipeline tree
        try:
            validate_web_pipeline_tree(pipeline_tree)
        except PipelineException as e:
            raise BadRequest(e.message)

        try:
            template = TaskTemplate.objects.get(id=template_id)
            kwargs['template_id'] = template.id
        except TaskTemplate.DoesNotExist:
            raise BadRequest('template[id=%s] does not exist' % template_id)

        verify_or_raise_immediate_response(
            principal_type='user',
            principal_id=creator,
            resource=task_template_resource,
            action_ids=[
                task_template_resource.actions.create_periodic_task.id
            ],
            instance=template)

        try:
            replace_template_id(TaskTemplate, pipeline_tree)
        except TaskTemplate.DoesNotExist:
            raise BadRequest(
                'invalid subprocess, check subprocess node please')

        if not isinstance(cron, dict):
            raise BadRequest('cron must be a object json string')

        try:
            project = Project.objects.get(id=int(project_path.split('/')[-2]))
        except Exception as e:
            raise BadRequest(e.message)

        try:
            kwargs['task'] = PeriodicTask.objects.create_pipeline_task(
                project=project,
                template=template,
                name=name,
                cron=cron,
                pipeline_tree=pipeline_tree,
                creator=creator)
        except Exception as e:
            logger.warning(traceback.format_exc())
            raise BadRequest(e.message)

        response = super(PeriodicTaskResource,
                         self).obj_create(bundle, **kwargs)
        response.obj.set_enabled(True)

        return response
Пример #11
0
    def obj_create(self, bundle, **kwargs):
        model = bundle.obj.__class__
        try:
            template_id = bundle.data['template_id']
            template_source = bundle.data.get('template_source', PROJECT)
            creator = bundle.request.user.username
            pipeline_instance_kwargs = {
                'name': bundle.data.pop('name'),
                'creator': creator,
                'pipeline_tree': json.loads(bundle.data.pop('pipeline_tree')),
            }
            if 'description' in bundle.data:
                pipeline_instance_kwargs['description'] = bundle.data.pop(
                    'description')
        except (KeyError, ValueError) as e:
            raise BadRequest(e.message)
        # XSS handle
        self.handle_task_name_attr(pipeline_instance_kwargs)
        # validate pipeline tree
        try:
            validate_web_pipeline_tree(
                pipeline_instance_kwargs['pipeline_tree'])
        except PipelineException as e:
            raise BadRequest(e.message)

        if template_source == PROJECT:
            try:
                template = TaskTemplate.objects.get(pk=template_id)
            except TaskTemplate.DoesNotExist:
                raise BadRequest('template[pk=%s] does not exist' %
                                 template_id)

            create_method = bundle.data['create_method']

            if create_method == 'app_maker':
                app_maker_id = bundle.data['create_info']
                try:
                    app_maker = AppMaker.objects.get(id=app_maker_id)
                except AppMaker.DoesNotExist:
                    raise BadRequest('app_maker[pk=%s] does not exist' %
                                     app_maker_id)

                verify_or_raise_immediate_response(
                    principal_type='user',
                    principal_id=creator,
                    resource=mini_app_resource,
                    action_ids=[mini_app_resource.actions.create_task.id],
                    instance=app_maker)

            else:
                verify_or_raise_immediate_response(
                    principal_type='user',
                    principal_id=creator,
                    resource=task_template_resource,
                    action_ids=[task_template_resource.actions.create_task.id],
                    instance=template)

        else:
            try:
                template = CommonTemplate.objects.get(pk=str(template_id),
                                                      is_deleted=False)
            except CommonTemplate.DoesNotExist:
                raise BadRequest('common template[pk=%s] does not exist' %
                                 template_id)

            try:
                project = ProjectResource().get_via_uri(
                    bundle.data.get('project'), request=bundle.request)
            except NotFound:
                raise BadRequest('project with uri(%s) does not exist' %
                                 bundle.data.get('project'))

            perms_tuples = [
                (project_resource,
                 [project_resource.actions.use_common_template.id], project),
                (common_template_resource,
                 [common_template_resource.actions.create_task.id], template)
            ]
            batch_verify_or_raise_immediate_response(principal_type='user',
                                                     principal_id=creator,
                                                     perms_tuples=perms_tuples)

        try:
            pipeline_instance = model.objects.create_pipeline_instance(
                template, **pipeline_instance_kwargs)
        except PipelineException as e:
            raise BadRequest(e.message)
        kwargs['category'] = template.category
        if bundle.data['flow_type'] == 'common_func':
            kwargs['current_flow'] = 'func_claim'
        else:
            kwargs['current_flow'] = 'execute_task'
        kwargs['pipeline_instance_id'] = pipeline_instance.id
        super(TaskFlowInstanceResource, self).obj_create(bundle, **kwargs)
        return bundle
Пример #12
0
    def obj_update(self, bundle, skip_errors=False, **kwargs):

        verify_or_raise_immediate_response(
            principal_type='user',
            principal_id=bundle.request.user.username,
            resource=admin_operate_resource,
            action_ids=[admin_operate_resource.actions.edit.id],
            instance=None)

        try:
            origins = bundle.data.pop('origins')
            caches = bundle.data.pop('caches')
        except KeyError:
            raise BadRequest('Invalid params, please check origins and caches')

        with transaction.atomic():
            # collect packages of all origin to cache
            if caches:
                cache_packages = {}
                for origin_type, origin_model in source_cls_factory.items():
                    origins_from_db = origin_model.objects.all().values(
                        'packages')
                    for origin in origins_from_db:
                        cache_packages.update(origin['packages'])

                for origin in origins:
                    try:
                        jsonschema.validate(origin, UPDATE_SOURCE_SCHEMA)
                    except jsonschema.ValidationError as e:
                        message = 'Invalid origin source params: %s' % e
                        logger.error(message)
                        raise BadRequest(message)
                    cache_packages.update(origin['packages'])

                # create or update cache first
                caches_to_update = [
                    cache['id'] for cache in caches if 'id' in cache
                ]
                # delete caches whom id not in param caches
                CachePackageSource.objects.exclude(
                    id__in=caches_to_update).delete()
                for cache in caches:
                    try:
                        jsonschema.validate(cache, UPDATE_SOURCE_SCHEMA)
                    except jsonschema.ValidationError as e:
                        message = 'Invalid cache source params: %s' % e
                        logger.error(message)
                        raise BadRequest(message)
                    if 'id' in cache:
                        try:
                            CachePackageSource.objects.update_base_source(
                                cache['id'], cache['type'], cache_packages,
                                **cache['details'])
                        except CachePackageSource.DoesNotExist:
                            message = 'Invalid cache source id: %s, which cannot be found' % cache[
                                'id']
                            logger.error(message)
                            raise BadRequest(message)
                        if cache.get('desc', ''):
                            CachePackageSource.objects.filter(
                                id=cache['id']).update(desc=cache['desc'])
                    else:
                        try:
                            CachePackageSource.objects.add_cache_source(
                                cache['name'], cache['type'], cache_packages,
                                cache.get('desc', ''), **cache['details'])
                        except exceptions.GcloudExternalPluginsError as e:
                            message = 'Create cache source raise error: %s' % e.message
                            logger.error(message)
                            raise BadRequest(message)
            else:
                CachePackageSource.objects.all().delete()

            # delete origins whom id not in param origins
            for origin_type, origin_model in source_cls_factory.items():
                origins_to_update = [
                    origin['id'] for origin in origins
                    if 'id' in origin and origin['type'] == origin_type
                ]
                origin_model.objects.exclude(id__in=origins_to_update).delete()
            # create origins after
            for origin in origins:
                source_type = origin['type']
                details = origin['details']
                # divide details into two parts,base_kwargs mains fields in base model(e.g. fields of
                # pipeline.contrib.external_plugins.models.GitRepoSource)
                # original_kwargs mains field in origin model but not in base model(e.g. repo_address、desc)
                source_model = source_cls_factory[source_type]
                original_kwargs, base_kwargs = source_model.objects.divide_details_parts(
                    source_type, details)
                if origin.get('desc', ''):
                    original_kwargs['desc'] = origin['desc']
                if 'id' in origin:
                    source_model.objects.update_original_source(
                        origin['id'], origin['packages'], original_kwargs,
                        **base_kwargs)
                else:
                    source_model.objects.add_original_source(
                        origin['name'], source_type, origin['packages'],
                        original_kwargs, **base_kwargs)