1
0
mirror of https://github.com/ansible/awx.git synced 2024-11-01 08:21:15 +03:00
awx/lib/main/models/__init__.py

217 lines
7.5 KiB
Python
Raw Normal View History

from django.db import models
2013-03-14 00:29:51 +04:00
from django.db.models import CASCADE, SET_NULL, PROTECT
2013-03-14 01:57:25 +04:00
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
2013-03-14 00:29:51 +04:00
# TODO: jobs and events model TBD
# TODO: reporting model TBD
2013-03-13 21:09:36 +04:00
class CommonModel(models.Model):
2013-03-13 21:09:36 +04:00
'''
common model for all object types that have these standard fields
'''
class Meta:
abstract = True
2013-03-18 23:49:40 +04:00
name = models.CharField(max_length=512, unique=True)
2013-03-13 21:09:36 +04:00
description = models.TextField()
creation_date = models.DateField(auto_now_add=True)
tags = models.ManyToManyField('Tag', related_name='%(class)s_tags', blank=True)
audit_trail = models.ManyToManyField('AuditTrail', related_name='%(class)s_audit_trails', blank=True)
2013-03-14 00:29:51 +04:00
active = models.BooleanField(default=True)
def __unicode__(self):
return unicode(self.name)
2013-03-13 23:15:35 +04:00
class Tag(models.Model):
'''
any type of object can be given a search tag
'''
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
2013-03-13 21:09:36 +04:00
name = models.CharField(max_length=512)
def __unicode__(self):
return unicode(self.name)
2013-03-13 21:09:36 +04:00
class AuditTrail(CommonModel):
'''
changing any object records the change
'''
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
2013-03-13 21:09:36 +04:00
resource_type = models.CharField(max_length=64)
modified_by = models.ForeignKey('auth.User', on_delete=SET_NULL, null=True, blank=True)
2013-03-13 23:15:35 +04:00
delta = models.TextField() # FIXME: switch to JSONField
2013-03-13 21:09:36 +04:00
detail = models.TextField()
comment = models.TextField()
# FIXME: this looks like this should be a ManyToMany
tag = models.ForeignKey('Tag', on_delete=SET_NULL, null=True, blank=True)
2013-03-13 21:09:36 +04:00
class Organization(CommonModel):
'''
organizations are the basic unit of multi-tenancy divisions
'''
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
2013-03-13 21:09:36 +04:00
users = models.ManyToManyField('auth.User', blank=True, related_name='organizations')
admins = models.ManyToManyField('auth.User', blank=True, related_name='admin_of_organizations')
projects = models.ManyToManyField('Project', blank=True, related_name='organizations')
2013-03-13 21:09:36 +04:00
def get_absolute_url(self):
import lib.urls
return reverse(lib.urls.views_OrganizationsDetail, args=(self.pk,))
2013-03-13 21:09:36 +04:00
class Inventory(CommonModel):
'''
an inventory source contains lists and hosts.
'''
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
2013-03-14 01:57:25 +04:00
verbose_name_plural = _('inventories')
2013-03-13 21:09:36 +04:00
2013-03-14 00:29:51 +04:00
organization = models.ForeignKey(Organization, null=True, on_delete=SET_NULL, related_name='inventories')
2013-03-13 21:09:36 +04:00
class Host(CommonModel):
'''
A managed node
'''
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
2013-03-13 21:09:36 +04:00
2013-03-14 00:29:51 +04:00
inventory = models.ForeignKey('Inventory', null=True, on_delete=SET_NULL, related_name='hosts')
2013-03-13 21:09:36 +04:00
class Group(CommonModel):
'''
A group of managed nodes. May belong to multiple groups
'''
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
2013-03-13 21:09:36 +04:00
2013-03-14 00:29:51 +04:00
inventory = models.ForeignKey('Inventory', null=True, on_delete=SET_NULL, related_name='groups')
parents = models.ManyToManyField('self', related_name='children', blank=True)
2013-03-15 19:26:32 +04:00
hosts = models.ManyToManyField('Host', related_name='groups', blank=True)
2013-03-13 21:09:36 +04:00
2013-03-13 23:15:35 +04:00
# FIXME: audit nullables
# FIXME: audit cascades
2013-03-13 21:09:36 +04:00
2013-03-13 23:15:35 +04:00
class VariableData(CommonModel):
2013-03-13 21:09:36 +04:00
'''
2013-03-13 23:15:35 +04:00
A set of host or group variables
2013-03-13 21:09:36 +04:00
'''
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
2013-03-14 01:57:25 +04:00
verbose_name_plural = _('variable data')
2013-03-13 21:09:36 +04:00
2013-03-14 00:29:51 +04:00
host = models.ForeignKey('Host', null=True, default=None, blank=True, on_delete=CASCADE, related_name='variable_data')
group = models.ForeignKey('Group', null=True, default=None, blank=True, on_delete=CASCADE, related_name='variable_data')
2013-03-13 23:15:35 +04:00
data = models.TextField() # FIXME: JsonField
2013-03-13 21:09:36 +04:00
class Credential(CommonModel):
'''
A credential contains information about how to talk to a remote set of hosts
Usually this is a SSH key location, and possibly an unlock password.
If used with sudo, a sudo password should be set if required.
'''
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
2013-03-13 21:09:36 +04:00
user = models.ForeignKey('auth.User', null=True, default=None, blank=True, on_delete=SET_NULL, related_name='credentials')
2013-03-14 00:29:51 +04:00
project = models.ForeignKey('Project', null=True, default=None, blank=True, on_delete=SET_NULL, related_name='credentials')
team = models.ForeignKey('Team', null=True, default=None, blank=True, on_delete=SET_NULL, related_name='credentials')
2013-03-13 23:15:35 +04:00
ssh_key_path = models.CharField(blank=True, default='', max_length=4096)
2013-03-13 23:15:35 +04:00
ssh_key_data = models.TextField(blank=True, default='') # later
ssh_key_unlock = models.CharField(blank=True, default='', max_length=1024)
ssh_password = models.CharField(blank=True, default='', max_length=1024)
sudo_password = models.CharField(blank=True, default='', max_length=1024)
2013-03-13 21:09:36 +04:00
class Team(CommonModel):
'''
A team is a group of users that work on common projects.
'''
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
projects = models.ManyToManyField('Project', blank=True, related_name='teams')
users = models.ManyToManyField('auth.User', blank=True, related_name='teams')
2013-03-13 23:15:35 +04:00
organization = models.ManyToManyField('Organization', related_name='teams')
2013-03-13 21:09:36 +04:00
class Project(CommonModel):
'''
A project represents a playbook git repo that can access a set of inventories
'''
2013-03-14 00:29:51 +04:00
inventories = models.ManyToManyField('Inventory', blank=True, related_name='projects')
local_repository = models.CharField(max_length=1024)
scm_type = models.CharField(max_length=64)
default_playbook = models.CharField(max_length=1024)
2013-03-13 21:09:36 +04:00
def get_absolute_url(self):
import lib.urls
return reverse(lib.urls.views_ProjectsDetail, args=(self.pk,))
2013-03-13 21:09:36 +04:00
class Permission(CommonModel):
'''
A permission allows a user, project, or team to be able to use an inventory source.
'''
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
2013-03-13 21:09:36 +04:00
user = models.ForeignKey('auth.User', null=True, on_delete=SET_NULL, blank=True, related_name='permissions')
project = models.ForeignKey('Project', null=True, on_delete=SET_NULL, blank=True, related_name='permissions')
team = models.ForeignKey('Team', null=True, on_delete=SET_NULL, blank=True, related_name='permissions')
job_type = models.CharField(max_length=64)
2013-03-13 21:09:36 +04:00
2013-03-13 23:15:35 +04:00
# TODO: other job types (later)
2013-03-13 21:09:36 +04:00
class LaunchJob(CommonModel):
2013-03-13 23:15:35 +04:00
'''
a launch job is a request to apply a project to an inventory source with a given credential
'''
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
2013-03-13 21:09:36 +04:00
2013-03-14 00:29:51 +04:00
inventory = models.ForeignKey('Inventory', on_delete=SET_NULL, null=True, default=None, blank=True, related_name='launch_jobs')
credential = models.ForeignKey('Credential', on_delete=SET_NULL, null=True, default=None, blank=True, related_name='launch_jobs')
project = models.ForeignKey('Project', on_delete=SET_NULL, null=True, default=None, blank=True, related_name='launch_jobs')
user = models.ForeignKey('auth.User', on_delete=SET_NULL, null=True, default=None, blank=True, related_name='launch_jobs')
job_type = models.CharField(max_length=64)
2013-03-13 23:15:35 +04:00
2013-03-13 21:09:36 +04:00
# TODO: Events
2013-03-13 23:15:35 +04:00
class LaunchJobStatus(CommonModel):
2013-03-14 00:29:51 +04:00
class Meta:
app_label = 'main'
2013-03-14 01:57:25 +04:00
verbose_name_plural = _('launch job statuses')
2013-03-13 23:15:35 +04:00
2013-03-14 00:29:51 +04:00
launch_job = models.ForeignKey('LaunchJob', null=True, on_delete=SET_NULL, related_name='launch_job_statuses')
2013-03-13 23:15:35 +04:00
status = models.IntegerField()
result_data = models.TextField()
# TODO: reporting (MPD)