mirror of https://github.com/jumpserver/jumpserver
feat: job 增加组织限制
parent
075cadb1ab
commit
fa948f7327
|
@ -1,4 +1,3 @@
|
||||||
from django.shortcuts import get_object_or_404
|
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
|
|
||||||
from ops.models import Job, JobExecution
|
from ops.models import Job, JobExecution
|
||||||
|
@ -7,14 +6,17 @@ from ops.serializers.job import JobSerializer, JobExecutionSerializer
|
||||||
__all__ = ['JobViewSet', 'JobExecutionViewSet']
|
__all__ = ['JobViewSet', 'JobExecutionViewSet']
|
||||||
|
|
||||||
from ops.tasks import run_ops_job, run_ops_job_executions
|
from ops.tasks import run_ops_job, run_ops_job_executions
|
||||||
|
from orgs.mixins.api import OrgBulkModelViewSet
|
||||||
|
|
||||||
|
|
||||||
class JobViewSet(viewsets.ModelViewSet):
|
class JobViewSet(OrgBulkModelViewSet):
|
||||||
serializer_class = JobSerializer
|
serializer_class = JobSerializer
|
||||||
queryset = Job.objects.all()
|
model = Job
|
||||||
|
permission_classes = ()
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return self.queryset.filter(instant=False)
|
query_set = super().get_queryset()
|
||||||
|
return query_set.filter(instant=False)
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
instance = serializer.save()
|
instance = serializer.save()
|
||||||
|
@ -22,20 +24,20 @@ class JobViewSet(viewsets.ModelViewSet):
|
||||||
run_ops_job.delay(instance.id)
|
run_ops_job.delay(instance.id)
|
||||||
|
|
||||||
|
|
||||||
class JobExecutionViewSet(viewsets.ModelViewSet):
|
class JobExecutionViewSet(OrgBulkModelViewSet):
|
||||||
serializer_class = JobExecutionSerializer
|
serializer_class = JobExecutionSerializer
|
||||||
queryset = JobExecution.objects.all()
|
|
||||||
http_method_names = ('get', 'post', 'head', 'options',)
|
http_method_names = ('get', 'post', 'head', 'options',)
|
||||||
|
# filter_fields = ('type',)
|
||||||
|
permission_classes = ()
|
||||||
|
model = JobExecution
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
instance = serializer.save()
|
instance = serializer.save()
|
||||||
run_ops_job_executions.delay(instance.id)
|
run_ops_job_executions.delay(instance.id)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
|
query_set = super().get_queryset()
|
||||||
job_id = self.request.query_params.get('job_id')
|
job_id = self.request.query_params.get('job_id')
|
||||||
job_type = self.request.query_params.get('type')
|
|
||||||
if job_id:
|
if job_id:
|
||||||
self.queryset = self.queryset.filter(job_id=job_id)
|
self.queryset = query_set.filter(job_id=job_id)
|
||||||
if job_type:
|
return query_set
|
||||||
self.queryset = self.queryset.filter(job__type=job_type)
|
|
||||||
return self.queryset
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 3.2.14 on 2022-11-23 09:45
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ops', '0033_auto_20221118_1431'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='job',
|
||||||
|
name='org_id',
|
||||||
|
field=models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 3.2.14 on 2022-11-23 10:22
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ops', '0034_job_org_id'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='jobexecution',
|
||||||
|
name='org_id',
|
||||||
|
field=models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -9,16 +9,14 @@ from django.utils.translation import gettext_lazy as _
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from celery import current_task
|
from celery import current_task
|
||||||
|
|
||||||
from common.const.choices import Trigger
|
|
||||||
from common.db.models import BaseCreateUpdateModel
|
|
||||||
|
|
||||||
__all__ = ["Job", "JobExecution"]
|
__all__ = ["Job", "JobExecution"]
|
||||||
|
|
||||||
from ops.ansible import JMSInventory, AdHocRunner, PlaybookRunner
|
from ops.ansible import JMSInventory, AdHocRunner, PlaybookRunner
|
||||||
from ops.mixin import PeriodTaskModelMixin
|
from ops.mixin import PeriodTaskModelMixin
|
||||||
|
from orgs.mixins.models import JMSOrgBaseModel
|
||||||
|
|
||||||
|
|
||||||
class Job(BaseCreateUpdateModel, PeriodTaskModelMixin):
|
class Job(JMSOrgBaseModel, PeriodTaskModelMixin):
|
||||||
class Types(models.TextChoices):
|
class Types(models.TextChoices):
|
||||||
adhoc = 'adhoc', _('Adhoc')
|
adhoc = 'adhoc', _('Adhoc')
|
||||||
playbook = 'playbook', _('Playbook')
|
playbook = 'playbook', _('Playbook')
|
||||||
|
@ -94,7 +92,7 @@ class Job(BaseCreateUpdateModel, PeriodTaskModelMixin):
|
||||||
return self.executions.create()
|
return self.executions.create()
|
||||||
|
|
||||||
|
|
||||||
class JobExecution(BaseCreateUpdateModel):
|
class JobExecution(JMSOrgBaseModel):
|
||||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||||
task_id = models.UUIDField(null=True)
|
task_id = models.UUIDField(null=True)
|
||||||
status = models.CharField(max_length=16, verbose_name=_('Status'), default='running')
|
status = models.CharField(max_length=16, verbose_name=_('Status'), default='running')
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
from django.db import transaction
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from common.drf.fields import ReadableHiddenField
|
from common.drf.fields import ReadableHiddenField
|
||||||
from ops.mixin import PeriodTaskSerializerMixin
|
from ops.mixin import PeriodTaskSerializerMixin
|
||||||
from ops.models import Job, JobExecution
|
from ops.models import Job, JobExecution
|
||||||
|
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
|
||||||
|
|
||||||
_all_ = []
|
_all_ = []
|
||||||
|
|
||||||
|
|
||||||
class JobSerializer(serializers.ModelSerializer, PeriodTaskSerializerMixin):
|
class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin):
|
||||||
owner = ReadableHiddenField(default=serializers.CurrentUserDefault())
|
owner = ReadableHiddenField(default=serializers.CurrentUserDefault())
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -10,6 +10,7 @@ from django.utils import timezone
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from common.utils import get_logger, get_object_or_none, get_log_keep_day
|
from common.utils import get_logger, get_object_or_none, get_log_keep_day
|
||||||
|
from orgs.utils import tmp_to_org
|
||||||
from .celery.decorator import (
|
from .celery.decorator import (
|
||||||
register_as_period_task, after_app_shutdown_clean_periodic,
|
register_as_period_task, after_app_shutdown_clean_periodic,
|
||||||
after_app_ready_start
|
after_app_ready_start
|
||||||
|
@ -27,28 +28,30 @@ logger = get_logger(__file__)
|
||||||
@shared_task(soft_time_limit=60, queue="ansible", verbose_name=_("Run ansible task"))
|
@shared_task(soft_time_limit=60, queue="ansible", verbose_name=_("Run ansible task"))
|
||||||
def run_ops_job(job_id):
|
def run_ops_job(job_id):
|
||||||
job = get_object_or_none(Job, id=job_id)
|
job = get_object_or_none(Job, id=job_id)
|
||||||
execution = job.create_execution()
|
with tmp_to_org(job.org):
|
||||||
try:
|
execution = job.create_execution()
|
||||||
execution.start()
|
try:
|
||||||
except SoftTimeLimitExceeded:
|
execution.start()
|
||||||
execution.set_error('Run timeout')
|
except SoftTimeLimitExceeded:
|
||||||
logger.error("Run adhoc timeout")
|
execution.set_error('Run timeout')
|
||||||
except Exception as e:
|
logger.error("Run adhoc timeout")
|
||||||
execution.set_error(e)
|
except Exception as e:
|
||||||
logger.error("Start adhoc execution error: {}".format(e))
|
execution.set_error(e)
|
||||||
|
logger.error("Start adhoc execution error: {}".format(e))
|
||||||
|
|
||||||
|
|
||||||
@shared_task(soft_time_limit=60, queue="ansible", verbose_name=_("Run ansible task execution"))
|
@shared_task(soft_time_limit=60, queue="ansible", verbose_name=_("Run ansible task execution"))
|
||||||
def run_ops_job_executions(execution_id, **kwargs):
|
def run_ops_job_executions(execution_id, **kwargs):
|
||||||
execution = get_object_or_none(JobExecution, id=execution_id)
|
execution = get_object_or_none(JobExecution, id=execution_id)
|
||||||
try:
|
with tmp_to_org(execution.org):
|
||||||
execution.start()
|
try:
|
||||||
except SoftTimeLimitExceeded:
|
execution.start()
|
||||||
execution.set_error('Run timeout')
|
except SoftTimeLimitExceeded:
|
||||||
logger.error("Run adhoc timeout")
|
execution.set_error('Run timeout')
|
||||||
except Exception as e:
|
logger.error("Run adhoc timeout")
|
||||||
execution.set_error(e)
|
except Exception as e:
|
||||||
logger.error("Start adhoc execution error: {}".format(e))
|
execution.set_error(e)
|
||||||
|
logger.error("Start adhoc execution error: {}".format(e))
|
||||||
|
|
||||||
|
|
||||||
@shared_task(verbose_name=_('Periodic clear celery tasks'))
|
@shared_task(verbose_name=_('Periodic clear celery tasks'))
|
||||||
|
|
Loading…
Reference in New Issue