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)
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)
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)
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)
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)
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)
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()
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)
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')
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
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
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)