mirror of
https://github.com/ansible/awx.git
synced 2026-05-14 21:07:39 -02:30
Add a new ExecutionEnvironment model
This commit is contained in:
committed by
Shane McDonald
parent
0af7f046f0
commit
41613ff544
69
awx/main/migrations/0124_execution_environments.py
Normal file
69
awx/main/migrations/0124_execution_environments.py
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
# Generated by Django 2.2.11 on 2020-07-08 18:42
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.db.models.expressions
|
||||||
|
import taggit.managers
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('taggit', '0003_taggeditem_add_unique_index'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('main', '0123_drop_hg_support'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='unifiedjob',
|
||||||
|
name='pull',
|
||||||
|
field=models.BooleanField(default=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='unifiedjobtemplate',
|
||||||
|
name='pull',
|
||||||
|
field=models.BooleanField(default=True),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ExecutionEnvironment',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('created', models.DateTimeField(default=None, editable=False)),
|
||||||
|
('modified', models.DateTimeField(default=None, editable=False)),
|
||||||
|
('description', models.TextField(blank=True, default='')),
|
||||||
|
('image', models.CharField(help_text='The registry location where the container is stored.', max_length=1024, verbose_name='image location')),
|
||||||
|
('managed_by_tower', models.BooleanField(default=False, editable=False)),
|
||||||
|
('created_by', models.ForeignKey(default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="{'class': 'executionenvironment', 'model_name': 'executionenvironment', 'app_label': 'main'}(class)s_created+", to=settings.AUTH_USER_MODEL)),
|
||||||
|
('credential', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='executionenvironments', to='main.Credential')),
|
||||||
|
('modified_by', models.ForeignKey(default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="{'class': 'executionenvironment', 'model_name': 'executionenvironment', 'app_label': 'main'}(class)s_modified+", to=settings.AUTH_USER_MODEL)),
|
||||||
|
('organization', models.ForeignKey(blank=True, default=None, help_text='The organization used to determine access to this execution environment.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='executionenvironments', to='main.Organization')),
|
||||||
|
('tags', taggit.managers.TaggableManager(blank=True, help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'ordering': (django.db.models.expressions.OrderBy(django.db.models.expressions.F('organization_id'), nulls_first=True), 'image'),
|
||||||
|
'unique_together': {('organization', 'image')},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='activitystream',
|
||||||
|
name='execution_environment',
|
||||||
|
field=models.ManyToManyField(blank=True, to='main.ExecutionEnvironment'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='organization',
|
||||||
|
name='default_environment',
|
||||||
|
field=models.ForeignKey(blank=True, default=None, help_text='The default execution environment for jobs run by this organization.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='main.ExecutionEnvironment'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='unifiedjob',
|
||||||
|
name='execution_environment',
|
||||||
|
field=models.ForeignKey(blank=True, default=None, help_text='The container image to be used for execution.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unifiedjobs', to='main.ExecutionEnvironment'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='unifiedjobtemplate',
|
||||||
|
name='execution_environment',
|
||||||
|
field=models.ForeignKey(blank=True, default=None, help_text='The container image to be used for execution.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unifiedjobtemplates', to='main.ExecutionEnvironment'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -35,6 +35,7 @@ from awx.main.models.events import ( # noqa
|
|||||||
)
|
)
|
||||||
from awx.main.models.ad_hoc_commands import AdHocCommand # noqa
|
from awx.main.models.ad_hoc_commands import AdHocCommand # noqa
|
||||||
from awx.main.models.schedules import Schedule # noqa
|
from awx.main.models.schedules import Schedule # noqa
|
||||||
|
from awx.main.models.execution_environments import ExecutionEnvironment # noqa
|
||||||
from awx.main.models.activity_stream import ActivityStream # noqa
|
from awx.main.models.activity_stream import ActivityStream # noqa
|
||||||
from awx.main.models.ha import ( # noqa
|
from awx.main.models.ha import ( # noqa
|
||||||
Instance, InstanceGroup, TowerScheduleState,
|
Instance, InstanceGroup, TowerScheduleState,
|
||||||
@@ -45,7 +46,7 @@ from awx.main.models.rbac import ( # noqa
|
|||||||
ROLE_SINGLETON_SYSTEM_AUDITOR,
|
ROLE_SINGLETON_SYSTEM_AUDITOR,
|
||||||
)
|
)
|
||||||
from awx.main.models.mixins import ( # noqa
|
from awx.main.models.mixins import ( # noqa
|
||||||
CustomVirtualEnvMixin, ResourceMixin, SurveyJobMixin,
|
CustomVirtualEnvMixin, ExecutionEnvironmentMixin, ResourceMixin, SurveyJobMixin,
|
||||||
SurveyJobTemplateMixin, TaskManagerInventoryUpdateMixin,
|
SurveyJobTemplateMixin, TaskManagerInventoryUpdateMixin,
|
||||||
TaskManagerJobMixin, TaskManagerProjectUpdateMixin,
|
TaskManagerJobMixin, TaskManagerProjectUpdateMixin,
|
||||||
TaskManagerUnifiedJobMixin,
|
TaskManagerUnifiedJobMixin,
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ class ActivityStream(models.Model):
|
|||||||
team = models.ManyToManyField("Team", blank=True)
|
team = models.ManyToManyField("Team", blank=True)
|
||||||
project = models.ManyToManyField("Project", blank=True)
|
project = models.ManyToManyField("Project", blank=True)
|
||||||
project_update = models.ManyToManyField("ProjectUpdate", blank=True)
|
project_update = models.ManyToManyField("ProjectUpdate", blank=True)
|
||||||
|
execution_environment = models.ManyToManyField("ExecutionEnvironment", blank=True)
|
||||||
job_template = models.ManyToManyField("JobTemplate", blank=True)
|
job_template = models.ManyToManyField("JobTemplate", blank=True)
|
||||||
job = models.ManyToManyField("Job", blank=True)
|
job = models.ManyToManyField("Job", blank=True)
|
||||||
workflow_job_template_node = models.ManyToManyField("WorkflowJobTemplateNode", blank=True)
|
workflow_job_template_node = models.ManyToManyField("WorkflowJobTemplateNode", blank=True)
|
||||||
@@ -74,6 +75,7 @@ class ActivityStream(models.Model):
|
|||||||
ad_hoc_command = models.ManyToManyField("AdHocCommand", blank=True)
|
ad_hoc_command = models.ManyToManyField("AdHocCommand", blank=True)
|
||||||
schedule = models.ManyToManyField("Schedule", blank=True)
|
schedule = models.ManyToManyField("Schedule", blank=True)
|
||||||
custom_inventory_script = models.ManyToManyField("CustomInventoryScript", blank=True)
|
custom_inventory_script = models.ManyToManyField("CustomInventoryScript", blank=True)
|
||||||
|
execution_environment = models.ManyToManyField("ExecutionEnvironment", blank=True)
|
||||||
notification_template = models.ManyToManyField("NotificationTemplate", blank=True)
|
notification_template = models.ManyToManyField("NotificationTemplate", blank=True)
|
||||||
notification = models.ManyToManyField("Notification", blank=True)
|
notification = models.ManyToManyField("Notification", blank=True)
|
||||||
label = models.ManyToManyField("Label", blank=True)
|
label = models.ManyToManyField("Label", blank=True)
|
||||||
|
|||||||
37
awx/main/models/execution_environments.py
Normal file
37
awx/main/models/execution_environments.py
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
from django.db import models
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
from awx.main.models.base import PrimordialModel
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ['ExecutionEnvironment']
|
||||||
|
|
||||||
|
|
||||||
|
class ExecutionEnvironment(PrimordialModel):
|
||||||
|
class Meta:
|
||||||
|
unique_together = ('organization', 'image')
|
||||||
|
ordering = (models.F('organization_id').asc(nulls_first=True), 'image')
|
||||||
|
|
||||||
|
organization = models.ForeignKey(
|
||||||
|
'Organization',
|
||||||
|
null=True,
|
||||||
|
default=None,
|
||||||
|
blank=True,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
related_name='%(class)ss',
|
||||||
|
help_text=_('The organization used to determine access to this execution environment.'),
|
||||||
|
)
|
||||||
|
image = models.CharField(
|
||||||
|
max_length=1024,
|
||||||
|
verbose_name=_('image location'),
|
||||||
|
help_text=_("The registry location where the container is stored."),
|
||||||
|
)
|
||||||
|
managed_by_tower = models.BooleanField(default=False, editable=False)
|
||||||
|
credential = models.ForeignKey(
|
||||||
|
'Credential',
|
||||||
|
related_name='%(class)ss',
|
||||||
|
blank=True,
|
||||||
|
null=True,
|
||||||
|
default=None,
|
||||||
|
on_delete=models.SET_NULL,
|
||||||
|
)
|
||||||
@@ -34,7 +34,7 @@ logger = logging.getLogger('awx.main.models.mixins')
|
|||||||
|
|
||||||
__all__ = ['ResourceMixin', 'SurveyJobTemplateMixin', 'SurveyJobMixin',
|
__all__ = ['ResourceMixin', 'SurveyJobTemplateMixin', 'SurveyJobMixin',
|
||||||
'TaskManagerUnifiedJobMixin', 'TaskManagerJobMixin', 'TaskManagerProjectUpdateMixin',
|
'TaskManagerUnifiedJobMixin', 'TaskManagerJobMixin', 'TaskManagerProjectUpdateMixin',
|
||||||
'TaskManagerInventoryUpdateMixin', 'CustomVirtualEnvMixin']
|
'TaskManagerInventoryUpdateMixin', 'ExecutionEnvironmentMixin', 'CustomVirtualEnvMixin']
|
||||||
|
|
||||||
|
|
||||||
class ResourceMixin(models.Model):
|
class ResourceMixin(models.Model):
|
||||||
@@ -441,6 +441,22 @@ class TaskManagerInventoryUpdateMixin(TaskManagerUpdateOnLaunchMixin):
|
|||||||
abstract = True
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
|
class ExecutionEnvironmentMixin(models.Model):
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
|
execution_environment = models.ForeignKey(
|
||||||
|
'ExecutionEnvironment',
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
default=None,
|
||||||
|
on_delete=models.SET_NULL,
|
||||||
|
related_name='%(class)ss',
|
||||||
|
help_text=_('The container image to be used for execution.'),
|
||||||
|
)
|
||||||
|
pull = models.BooleanField(default=True)
|
||||||
|
|
||||||
|
|
||||||
class CustomVirtualEnvMixin(models.Model):
|
class CustomVirtualEnvMixin(models.Model):
|
||||||
class Meta:
|
class Meta:
|
||||||
abstract = True
|
abstract = True
|
||||||
|
|||||||
@@ -61,6 +61,15 @@ class Organization(CommonModel, NotificationFieldsModel, ResourceMixin, CustomVi
|
|||||||
blank=True,
|
blank=True,
|
||||||
related_name='%(class)s_notification_templates_for_approvals'
|
related_name='%(class)s_notification_templates_for_approvals'
|
||||||
)
|
)
|
||||||
|
default_environment = models.ForeignKey(
|
||||||
|
'ExecutionEnvironment',
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
default=None,
|
||||||
|
on_delete=models.SET_NULL,
|
||||||
|
related_name='+',
|
||||||
|
help_text=_('The default execution environment for jobs run by this organization.'),
|
||||||
|
)
|
||||||
|
|
||||||
admin_role = ImplicitRoleField(
|
admin_role = ImplicitRoleField(
|
||||||
parent_role='singleton:' + ROLE_SINGLETON_SYSTEM_ADMINISTRATOR,
|
parent_role='singleton:' + ROLE_SINGLETON_SYSTEM_ADMINISTRATOR,
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ from awx.main.models.base import (
|
|||||||
from awx.main.dispatch import get_local_queuename
|
from awx.main.dispatch import get_local_queuename
|
||||||
from awx.main.dispatch.control import Control as ControlDispatcher
|
from awx.main.dispatch.control import Control as ControlDispatcher
|
||||||
from awx.main.registrar import activity_stream_registrar
|
from awx.main.registrar import activity_stream_registrar
|
||||||
from awx.main.models.mixins import ResourceMixin, TaskManagerUnifiedJobMixin
|
from awx.main.models.mixins import ResourceMixin, TaskManagerUnifiedJobMixin, ExecutionEnvironmentMixin
|
||||||
from awx.main.utils import (
|
from awx.main.utils import (
|
||||||
camelcase_to_underscore, get_model_for_type,
|
camelcase_to_underscore, get_model_for_type,
|
||||||
encrypt_dict, decrypt_field, _inventory_updates,
|
encrypt_dict, decrypt_field, _inventory_updates,
|
||||||
@@ -59,7 +59,7 @@ logger_job_lifecycle = logging.getLogger('awx.analytics.job_lifecycle')
|
|||||||
# NOTE: ACTIVE_STATES moved to constants because it is used by parent modules
|
# NOTE: ACTIVE_STATES moved to constants because it is used by parent modules
|
||||||
|
|
||||||
|
|
||||||
class UnifiedJobTemplate(PolymorphicModel, CommonModelNameNotUnique, NotificationFieldsModel):
|
class UnifiedJobTemplate(PolymorphicModel, CommonModelNameNotUnique, ExecutionEnvironmentMixin, NotificationFieldsModel):
|
||||||
'''
|
'''
|
||||||
Concrete base class for unified job templates.
|
Concrete base class for unified job templates.
|
||||||
'''
|
'''
|
||||||
@@ -527,7 +527,7 @@ class StdoutMaxBytesExceeded(Exception):
|
|||||||
|
|
||||||
|
|
||||||
class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique,
|
class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique,
|
||||||
UnifiedJobTypeStringMixin, TaskManagerUnifiedJobMixin):
|
UnifiedJobTypeStringMixin, TaskManagerUnifiedJobMixin, ExecutionEnvironmentMixin):
|
||||||
'''
|
'''
|
||||||
Concrete base class for unified job run by the task engine.
|
Concrete base class for unified job run by the task engine.
|
||||||
'''
|
'''
|
||||||
|
|||||||
Reference in New Issue
Block a user