diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..458af72788 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +acom/settings.py +*.py[c,o] +*.swp diff --git a/Makefile b/Makefile index f1f7785549..e7dfaad0ca 100644 --- a/Makefile +++ b/Makefile @@ -1,25 +1,37 @@ clean: find . -type f -regex ".*\.py[co]$$" -delete +zero: + python acom/manage.py migrate main zero + setup: - ansible-playbook app_setup/setup.yml -i "127.0.0.1," -c local -e working_dir=`pwd` + ansible-playbook app_setup/setup.yml --verbose -i "127.0.0.1," -c local -e working_dir=`pwd` syncdb: + # only run from initial setup python acom/manage.py syncdb runserver: + # run for testing the server python acom/manage.py runserver # already done and should not have to happen again: # -#south_init: -# PYTHON_PATH=./acom python acom/manage.py schemamigration main --initial +south_init: + PYTHON_PATH=./acom python acom/manage.py schemamigration main --initial dbchange: + # run this each time we make changes to the model PYTHON_PATH=./acom python acom/manage.py schemamigration main --auto migrate: - PYTHON_PATH=./acom python acom/manage.py migrate main --auto + # run this to apply changes to the model + PYTHON_PATH=./acom python acom/manage.py migrate + +dbshell: + # access database shell + # asks for password # PYTHON_PATH=./acom python acom/manage.py dbshell + sudo -u postgres psql -d acom test: PYTHON_PATH=./acom python acom/manage.py test main diff --git a/acom/main/migrations/0001_initial.py b/acom/main/migrations/0001_initial.py index f2237a99d5..05a548f25e 100644 --- a/acom/main/migrations/0001_initial.py +++ b/acom/main/migrations/0001_initial.py @@ -8,29 +8,788 @@ from django.db import models class Migration(SchemaMigration): def forwards(self, orm): - # Adding model 'Inventory' - db.create_table('inventory', ( + # Adding model 'Tag' + db.create_table('main_tag', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('main', ['Tag']) + + # Adding model 'AuditTrail' + db.create_table('main_audittrail', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('name', self.gf('django.db.models.fields.TextField')()), ('description', self.gf('django.db.models.fields.TextField')()), ('creation_date', self.gf('django.db.models.fields.DateField')()), + ('resource_type', self.gf('django.db.models.fields.TextField')()), + ('modified_by', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['main.User'])), + ('delta', self.gf('django.db.models.fields.TextField')()), + ('detail', self.gf('django.db.models.fields.TextField')()), + ('comment', self.gf('django.db.models.fields.TextField')()), + ('tag', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['main.Tag'])), + )) + db.send_create_signal('main', ['AuditTrail']) + + # Adding M2M table for field tags on 'AuditTrail' + db.create_table('main_audittrail_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_audittrail_tags', ['audittrail_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'AuditTrail' + db.create_table('main_audittrail_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('from_audittrail', models.ForeignKey(orm['main.audittrail'], null=False)), + ('to_audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_audittrail_audit_trail', ['from_audittrail_id', 'to_audittrail_id']) + + # Adding model 'Organization' + db.create_table('main_organization', ( ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + )) + db.send_create_signal('main', ['Organization']) + + # Adding M2M table for field tags on 'Organization' + db.create_table('main_organization_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('organization', models.ForeignKey(orm['main.organization'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_organization_tags', ['organization_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'Organization' + db.create_table('main_organization_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('organization', models.ForeignKey(orm['main.organization'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_organization_audit_trail', ['organization_id', 'audittrail_id']) + + # Adding M2M table for field users on 'Organization' + db.create_table('main_organization_users', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('organization', models.ForeignKey(orm['main.organization'], null=False)), + ('user', models.ForeignKey(orm['main.user'], null=False)) + )) + db.create_unique('main_organization_users', ['organization_id', 'user_id']) + + # Adding M2M table for field admins on 'Organization' + db.create_table('main_organization_admins', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('organization', models.ForeignKey(orm['main.organization'], null=False)), + ('user', models.ForeignKey(orm['main.user'], null=False)) + )) + db.create_unique('main_organization_admins', ['organization_id', 'user_id']) + + # Adding M2M table for field projects on 'Organization' + db.create_table('main_organization_projects', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('organization', models.ForeignKey(orm['main.organization'], null=False)), + ('project', models.ForeignKey(orm['main.project'], null=False)) + )) + db.create_unique('main_organization_projects', ['organization_id', 'project_id']) + + # Adding model 'Inventory' + db.create_table('main_inventory', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + ('organization', self.gf('django.db.models.fields.related.ForeignKey')(related_name='inventories', to=orm['main.Organization'])), )) db.send_create_signal('main', ['Inventory']) + # Adding M2M table for field tags on 'Inventory' + db.create_table('main_inventory_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('inventory', models.ForeignKey(orm['main.inventory'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_inventory_tags', ['inventory_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'Inventory' + db.create_table('main_inventory_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('inventory', models.ForeignKey(orm['main.inventory'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_inventory_audit_trail', ['inventory_id', 'audittrail_id']) + + # Adding model 'Host' + db.create_table('main_host', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + ('inventory', self.gf('django.db.models.fields.related.ForeignKey')(related_name='hosts', to=orm['main.Inventory'])), + )) + db.send_create_signal('main', ['Host']) + + # Adding M2M table for field tags on 'Host' + db.create_table('main_host_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('host', models.ForeignKey(orm['main.host'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_host_tags', ['host_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'Host' + db.create_table('main_host_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('host', models.ForeignKey(orm['main.host'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_host_audit_trail', ['host_id', 'audittrail_id']) + + # Adding model 'Group' + db.create_table('main_group', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + ('inventory', self.gf('django.db.models.fields.related.ForeignKey')(related_name='groups', to=orm['main.Inventory'])), + )) + db.send_create_signal('main', ['Group']) + + # Adding M2M table for field tags on 'Group' + db.create_table('main_group_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('group', models.ForeignKey(orm['main.group'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_group_tags', ['group_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'Group' + db.create_table('main_group_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('group', models.ForeignKey(orm['main.group'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_group_audit_trail', ['group_id', 'audittrail_id']) + + # Adding M2M table for field parents on 'Group' + db.create_table('main_group_parents', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('from_group', models.ForeignKey(orm['main.group'], null=False)), + ('to_group', models.ForeignKey(orm['main.group'], null=False)) + )) + db.create_unique('main_group_parents', ['from_group_id', 'to_group_id']) + + # Adding model 'VariableData' + db.create_table('main_variabledata', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + ('host', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='variable_data', null=True, blank=True, to=orm['main.Host'])), + ('group', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='variable_data', null=True, blank=True, to=orm['main.Group'])), + ('data', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('main', ['VariableData']) + + # Adding M2M table for field tags on 'VariableData' + db.create_table('main_variabledata_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('variabledata', models.ForeignKey(orm['main.variabledata'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_variabledata_tags', ['variabledata_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'VariableData' + db.create_table('main_variabledata_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('variabledata', models.ForeignKey(orm['main.variabledata'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_variabledata_audit_trail', ['variabledata_id', 'audittrail_id']) + + # Adding model 'User' + db.create_table('main_user', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + ('auth_user', self.gf('django.db.models.fields.related.OneToOneField')(related_name='application_user', unique=True, to=orm['auth.User'])), + )) + db.send_create_signal('main', ['User']) + + # Adding M2M table for field tags on 'User' + db.create_table('main_user_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('user', models.ForeignKey(orm['main.user'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_user_tags', ['user_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'User' + db.create_table('main_user_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('user', models.ForeignKey(orm['main.user'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_user_audit_trail', ['user_id', 'audittrail_id']) + + # Adding model 'Credential' + db.create_table('main_credential', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='credentials', null=True, blank=True, to=orm['main.User'])), + ('project', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='credentials', null=True, blank=True, to=orm['main.Project'])), + ('team', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='credentials', null=True, blank=True, to=orm['main.Team'])), + ('ssh_key_path', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('ssh_key_data', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('ssh_key_unlock', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('ssh_password', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + ('sudo_password', self.gf('django.db.models.fields.TextField')(default='', blank=True)), + )) + db.send_create_signal('main', ['Credential']) + + # Adding M2M table for field tags on 'Credential' + db.create_table('main_credential_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('credential', models.ForeignKey(orm['main.credential'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_credential_tags', ['credential_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'Credential' + db.create_table('main_credential_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('credential', models.ForeignKey(orm['main.credential'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_credential_audit_trail', ['credential_id', 'audittrail_id']) + + # Adding model 'Team' + db.create_table('main_team', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + )) + db.send_create_signal('main', ['Team']) + + # Adding M2M table for field tags on 'Team' + db.create_table('main_team_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('team', models.ForeignKey(orm['main.team'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_team_tags', ['team_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'Team' + db.create_table('main_team_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('team', models.ForeignKey(orm['main.team'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_team_audit_trail', ['team_id', 'audittrail_id']) + + # Adding M2M table for field projects on 'Team' + db.create_table('main_team_projects', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('team', models.ForeignKey(orm['main.team'], null=False)), + ('project', models.ForeignKey(orm['main.project'], null=False)) + )) + db.create_unique('main_team_projects', ['team_id', 'project_id']) + + # Adding M2M table for field users on 'Team' + db.create_table('main_team_users', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('team', models.ForeignKey(orm['main.team'], null=False)), + ('user', models.ForeignKey(orm['main.user'], null=False)) + )) + db.create_unique('main_team_users', ['team_id', 'user_id']) + + # Adding M2M table for field organization on 'Team' + db.create_table('main_team_organization', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('team', models.ForeignKey(orm['main.team'], null=False)), + ('organization', models.ForeignKey(orm['main.organization'], null=False)) + )) + db.create_unique('main_team_organization', ['team_id', 'organization_id']) + + # Adding model 'Project' + db.create_table('main_project', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + ('local_repository', self.gf('django.db.models.fields.TextField')()), + ('scm_type', self.gf('django.db.models.fields.TextField')()), + ('default_playbook', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('main', ['Project']) + + # Adding M2M table for field tags on 'Project' + db.create_table('main_project_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('project', models.ForeignKey(orm['main.project'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_project_tags', ['project_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'Project' + db.create_table('main_project_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('project', models.ForeignKey(orm['main.project'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_project_audit_trail', ['project_id', 'audittrail_id']) + + # Adding M2M table for field inventories on 'Project' + db.create_table('main_project_inventories', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('project', models.ForeignKey(orm['main.project'], null=False)), + ('inventory', models.ForeignKey(orm['main.inventory'], null=False)) + )) + db.create_unique('main_project_inventories', ['project_id', 'inventory_id']) + + # Adding model 'Permission' + db.create_table('main_permission', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='permissions', to=orm['main.User'])), + ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='permissions', to=orm['main.Project'])), + ('team', self.gf('django.db.models.fields.related.ForeignKey')(related_name='permissions', to=orm['main.Team'])), + ('job_type', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('main', ['Permission']) + + # Adding M2M table for field tags on 'Permission' + db.create_table('main_permission_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('permission', models.ForeignKey(orm['main.permission'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_permission_tags', ['permission_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'Permission' + db.create_table('main_permission_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('permission', models.ForeignKey(orm['main.permission'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_permission_audit_trail', ['permission_id', 'audittrail_id']) + + # Adding model 'LaunchJob' + db.create_table('main_launchjob', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + ('inventory', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='launch_jobs', null=True, blank=True, to=orm['main.Inventory'])), + ('credential', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='launch_jobs', null=True, blank=True, to=orm['main.Credential'])), + ('project', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='launch_jobs', null=True, blank=True, to=orm['main.Project'])), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='launch_jobs', null=True, blank=True, to=orm['main.User'])), + ('job_type', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('main', ['LaunchJob']) + + # Adding M2M table for field tags on 'LaunchJob' + db.create_table('main_launchjob_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('launchjob', models.ForeignKey(orm['main.launchjob'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_launchjob_tags', ['launchjob_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'LaunchJob' + db.create_table('main_launchjob_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('launchjob', models.ForeignKey(orm['main.launchjob'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_launchjob_audit_trail', ['launchjob_id', 'audittrail_id']) + + # Adding model 'LaunchJobStatus' + db.create_table('main_launchjobstatus', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.TextField')()), + ('description', self.gf('django.db.models.fields.TextField')()), + ('creation_date', self.gf('django.db.models.fields.DateField')()), + ('launch_job', self.gf('django.db.models.fields.related.ForeignKey')(related_name='launch_job_statuses', to=orm['main.LaunchJob'])), + ('status', self.gf('django.db.models.fields.IntegerField')()), + ('result_data', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('main', ['LaunchJobStatus']) + + # Adding M2M table for field tags on 'LaunchJobStatus' + db.create_table('main_launchjobstatus_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('launchjobstatus', models.ForeignKey(orm['main.launchjobstatus'], null=False)), + ('tag', models.ForeignKey(orm['main.tag'], null=False)) + )) + db.create_unique('main_launchjobstatus_tags', ['launchjobstatus_id', 'tag_id']) + + # Adding M2M table for field audit_trail on 'LaunchJobStatus' + db.create_table('main_launchjobstatus_audit_trail', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('launchjobstatus', models.ForeignKey(orm['main.launchjobstatus'], null=False)), + ('audittrail', models.ForeignKey(orm['main.audittrail'], null=False)) + )) + db.create_unique('main_launchjobstatus_audit_trail', ['launchjobstatus_id', 'audittrail_id']) + def backwards(self, orm): + # Deleting model 'Tag' + db.delete_table('main_tag') + + # Deleting model 'AuditTrail' + db.delete_table('main_audittrail') + + # Removing M2M table for field tags on 'AuditTrail' + db.delete_table('main_audittrail_tags') + + # Removing M2M table for field audit_trail on 'AuditTrail' + db.delete_table('main_audittrail_audit_trail') + + # Deleting model 'Organization' + db.delete_table('main_organization') + + # Removing M2M table for field tags on 'Organization' + db.delete_table('main_organization_tags') + + # Removing M2M table for field audit_trail on 'Organization' + db.delete_table('main_organization_audit_trail') + + # Removing M2M table for field users on 'Organization' + db.delete_table('main_organization_users') + + # Removing M2M table for field admins on 'Organization' + db.delete_table('main_organization_admins') + + # Removing M2M table for field projects on 'Organization' + db.delete_table('main_organization_projects') + # Deleting model 'Inventory' - db.delete_table('inventory') + db.delete_table('main_inventory') + + # Removing M2M table for field tags on 'Inventory' + db.delete_table('main_inventory_tags') + + # Removing M2M table for field audit_trail on 'Inventory' + db.delete_table('main_inventory_audit_trail') + + # Deleting model 'Host' + db.delete_table('main_host') + + # Removing M2M table for field tags on 'Host' + db.delete_table('main_host_tags') + + # Removing M2M table for field audit_trail on 'Host' + db.delete_table('main_host_audit_trail') + + # Deleting model 'Group' + db.delete_table('main_group') + + # Removing M2M table for field tags on 'Group' + db.delete_table('main_group_tags') + + # Removing M2M table for field audit_trail on 'Group' + db.delete_table('main_group_audit_trail') + + # Removing M2M table for field parents on 'Group' + db.delete_table('main_group_parents') + + # Deleting model 'VariableData' + db.delete_table('main_variabledata') + + # Removing M2M table for field tags on 'VariableData' + db.delete_table('main_variabledata_tags') + + # Removing M2M table for field audit_trail on 'VariableData' + db.delete_table('main_variabledata_audit_trail') + + # Deleting model 'User' + db.delete_table('main_user') + + # Removing M2M table for field tags on 'User' + db.delete_table('main_user_tags') + + # Removing M2M table for field audit_trail on 'User' + db.delete_table('main_user_audit_trail') + + # Deleting model 'Credential' + db.delete_table('main_credential') + + # Removing M2M table for field tags on 'Credential' + db.delete_table('main_credential_tags') + + # Removing M2M table for field audit_trail on 'Credential' + db.delete_table('main_credential_audit_trail') + + # Deleting model 'Team' + db.delete_table('main_team') + + # Removing M2M table for field tags on 'Team' + db.delete_table('main_team_tags') + + # Removing M2M table for field audit_trail on 'Team' + db.delete_table('main_team_audit_trail') + + # Removing M2M table for field projects on 'Team' + db.delete_table('main_team_projects') + + # Removing M2M table for field users on 'Team' + db.delete_table('main_team_users') + + # Removing M2M table for field organization on 'Team' + db.delete_table('main_team_organization') + + # Deleting model 'Project' + db.delete_table('main_project') + + # Removing M2M table for field tags on 'Project' + db.delete_table('main_project_tags') + + # Removing M2M table for field audit_trail on 'Project' + db.delete_table('main_project_audit_trail') + + # Removing M2M table for field inventories on 'Project' + db.delete_table('main_project_inventories') + + # Deleting model 'Permission' + db.delete_table('main_permission') + + # Removing M2M table for field tags on 'Permission' + db.delete_table('main_permission_tags') + + # Removing M2M table for field audit_trail on 'Permission' + db.delete_table('main_permission_audit_trail') + + # Deleting model 'LaunchJob' + db.delete_table('main_launchjob') + + # Removing M2M table for field tags on 'LaunchJob' + db.delete_table('main_launchjob_tags') + + # Removing M2M table for field audit_trail on 'LaunchJob' + db.delete_table('main_launchjob_audit_trail') + + # Deleting model 'LaunchJobStatus' + db.delete_table('main_launchjobstatus') + + # Removing M2M table for field tags on 'LaunchJobStatus' + db.delete_table('main_launchjobstatus_tags') + + # Removing M2M table for field audit_trail on 'LaunchJobStatus' + db.delete_table('main_launchjobstatus_audit_trail') models = { - 'main.inventory': { - 'Meta': {'object_name': 'Inventory', 'db_table': "'inventory'"}, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'main.audittrail': { + 'Meta': {'object_name': 'AuditTrail'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'audittrail_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'comment': ('django.db.models.fields.TextField', [], {}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'delta': ('django.db.models.fields.TextField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'detail': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified_by': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['main.User']"}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'resource_type': ('django.db.models.fields.TextField', [], {}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['main.Tag']"}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'audittrail_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}) + }, + 'main.credential': { + 'Meta': {'object_name': 'Credential'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'credential_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), 'creation_date': ('django.db.models.fields.DateField', [], {}), 'description': ('django.db.models.fields.TextField', [], {}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'credentials'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Project']"}), + 'ssh_key_data': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'ssh_key_path': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'ssh_key_unlock': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'ssh_password': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'sudo_password': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'credential_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}), + 'team': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'credentials'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Team']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'credentials'", 'null': 'True', 'blank': 'True', 'to': "orm['main.User']"}) + }, + 'main.group': { + 'Meta': {'object_name': 'Group'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'group_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'groups'", 'to': "orm['main.Inventory']"}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'parents': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'parents_rel_+'", 'to': "orm['main.Group']"}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'group_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}) + }, + 'main.host': { + 'Meta': {'object_name': 'Host'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'host_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts'", 'to': "orm['main.Inventory']"}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'host_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}) + }, + 'main.inventory': { + 'Meta': {'object_name': 'Inventory'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'inventory_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'inventories'", 'to': "orm['main.Organization']"}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'inventory_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}) + }, + 'main.launchjob': { + 'Meta': {'object_name': 'LaunchJob'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'launchjob_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'launch_jobs'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Credential']"}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventory': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'launch_jobs'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Inventory']"}), + 'job_type': ('django.db.models.fields.TextField', [], {}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'launch_jobs'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Project']"}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'launchjob_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'launch_jobs'", 'null': 'True', 'blank': 'True', 'to': "orm['main.User']"}) + }, + 'main.launchjobstatus': { + 'Meta': {'object_name': 'LaunchJobStatus'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'launchjobstatus_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'launch_job': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'launch_job_statuses'", 'to': "orm['main.LaunchJob']"}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'result_data': ('django.db.models.fields.TextField', [], {}), + 'status': ('django.db.models.fields.IntegerField', [], {}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'launchjobstatus_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}) + }, + 'main.organization': { + 'Meta': {'object_name': 'Organization'}, + 'admins': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'admin_of_organizations'", 'symmetrical': 'False', 'to': "orm['main.User']"}), + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'organization_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'projects': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'organizations'", 'symmetrical': 'False', 'to': "orm['main.Project']"}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'organization_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'organizations'", 'symmetrical': 'False', 'to': "orm['main.User']"}) + }, + 'main.permission': { + 'Meta': {'object_name': 'Permission'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'permission_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'job_type': ('django.db.models.fields.TextField', [], {}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'permissions'", 'to': "orm['main.Project']"}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'permission_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}), + 'team': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'permissions'", 'to': "orm['main.Team']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'permissions'", 'to': "orm['main.User']"}) + }, + 'main.project': { + 'Meta': {'object_name': 'Project'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'project_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'default_playbook': ('django.db.models.fields.TextField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inventories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'projects'", 'symmetrical': 'False', 'to': "orm['main.Inventory']"}), + 'local_repository': ('django.db.models.fields.TextField', [], {}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'scm_type': ('django.db.models.fields.TextField', [], {}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'project_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}) + }, + 'main.tag': { + 'Meta': {'object_name': 'Tag'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.TextField', [], {}) + }, + 'main.team': { + 'Meta': {'object_name': 'Team'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'team_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'organization': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'teams'", 'symmetrical': 'False', 'to': "orm['main.Organization']"}), + 'projects': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'teams'", 'symmetrical': 'False', 'to': "orm['main.Project']"}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'team_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'teams'", 'symmetrical': 'False', 'to': "orm['main.User']"}) + }, + 'main.user': { + 'Meta': {'object_name': 'User'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'user_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'auth_user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'application_user'", 'unique': 'True', 'to': "orm['auth.User']"}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'user_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}) + }, + 'main.variabledata': { + 'Meta': {'object_name': 'VariableData'}, + 'audit_trail': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'variabledata_audit_trails'", 'symmetrical': 'False', 'to': "orm['main.AuditTrail']"}), + 'creation_date': ('django.db.models.fields.DateField', [], {}), + 'data': ('django.db.models.fields.TextField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'variable_data'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Group']"}), + 'host': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'variable_data'", 'null': 'True', 'blank': 'True', 'to': "orm['main.Host']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'variabledata_tags'", 'symmetrical': 'False', 'to': "orm['main.Tag']"}) } } - complete_apps = ['main'] + complete_apps = ['main'] \ No newline at end of file diff --git a/acom/main/models.py b/acom/main/models.py index 8c8d43dc70..d583f02104 100644 --- a/acom/main/models.py +++ b/acom/main/models.py @@ -1,10 +1,13 @@ from django.db import models -# TODO: split into seperate files? -# TODO: smart objects discussion # TODO: jobs and events model # TODO: how to link up with Django user auth # TODO: general schema review/organization +# TODO: audit cascade behavior and defaults +# TODO: set related names + +# SET_NULL = models.SET_NULL +# PROTECT = models.PROTECT class CommonModel(models.Model): ''' @@ -17,18 +20,15 @@ class CommonModel(models.Model): name = models.TextField() description = models.TextField() creation_date = models.DateField() - tags = models.ManyToManyField('Tag') - -class Tag(CommonModel): - ''' - any type of object can be given a search tag - ''' + tags = models.ManyToManyField('Tag', related_name='%(class)s_tags') + audit_trail = models.ManyToManyField('AuditTrail', related_name='%(class)s_audit_trails') + +class Tag(models.Model): + ''' + any type of object can be given a search tag + ''' - class Meta: - db_table = 'tags' - - id = models.AutoField(primary_key=True) - name = models.TextField() + name = models.TextField() class AuditTrail(CommonModel): @@ -36,13 +36,9 @@ class AuditTrail(CommonModel): changing any object records the change ''' - class Meta: - db_table = 'audit_trails' - - id = models.AutoField(primary_key=True) resource_type = models.TextField() modified_by = models.ForeignKey('User') - delta = models.ForeignKey('Delta') + delta = models.TextField() # FIXME: switch to JSONField detail = models.TextField() comment = models.TextField() tag = models.ForeignKey('Tag') @@ -52,35 +48,23 @@ class Organization(CommonModel): organizations are the basic unit of multi-tenancy divisions ''' - class Meta: - db_table = 'organizations' - - id = models.AutoField(primary_key=True) - users = models.ManyToManyField('User') - admins = models.ManyToManyField('User') + users = models.ManyToManyField('User', related_name='organizations') + admins = models.ManyToManyField('User', related_name='admin_of_organizations') + projects = models.ManyToManyField('Project', related_name='organizations') class Inventory(CommonModel): ''' an inventory source contains lists and hosts. ''' - class Meta: - db_table = 'inventory' - - id = models.AutoField(primary_key=True) - organization = models.ForeignKey(Organization) - sync_script_path = models.TextField() # for future use + organization = models.ForeignKey(Organization, related_name='inventories') class Host(CommonModel): ''' A managed node ''' - class Meta: - db_table = 'hosts' - - id = models.AutoField(primary_key=True) - inventory = models.ForeignKey('Inventory') + inventory = models.ForeignKey('Inventory', related_name='hosts') class Group(CommonModel): @@ -88,26 +72,20 @@ class Group(CommonModel): A group of managed nodes. May belong to multiple groups ''' - class Meta: - db_table = 'groups' + inventory = models.ForeignKey('Inventory', related_name='groups') + parents = models.ManyToManyField('self', related_name='children') - id = models.AutoField(primary_key=True) - inventory = models.ForeignKey('Inventory') - parents = models.ManyToManyField('Group') # ? +# FIXME: audit nullables +# FIXME: audit cascades -class InventoryVariable(CommonModel): +class VariableData(CommonModel): ''' - A variable + A set of host or group variables ''' - class Meta: - db_table = 'inventory_variables' - - id = models.AutoField(primary_key=True) - host = models.ForeignKey('Host') - group = models.ForeignKey('Group') - key = models.TextField() - value = models.TextField() + host = models.ForeignKey('Host', null=True, default=None, blank=True, related_name='variable_data') + group = models.ForeignKey('Group', null=True, default=None, blank=True, related_name='variable_data') + data = models.TextField() # FIXME: JsonField class User(CommonModel): ''' @@ -116,13 +94,7 @@ class User(CommonModel): # FIXME: how to integrate with Django auth? - class Meta: - db_table = 'users' - - id = models.AutoField(primary_key=True) - organization = models.ManyToManyField('Organization') - team = models.ManyToManyField('Team') - credentials = models.ManyToManyField('Credential') + auth_user = models.OneToOneField('auth.User', related_name='application_user') class Credential(CommonModel): ''' @@ -131,45 +103,32 @@ class Credential(CommonModel): If used with sudo, a sudo password should be set if required. ''' - - class Meta: - db_table = 'credentials' + user = models.ForeignKey('User', null=True, default=None, blank=True, related_name='credentials') + project = models.ForeignKey('Project', null=True, default=None, blank=True, related_name='credentials') + team = models.ForeignKey('Team', null=True, default=None, blank=True, related_name='credentials') - id = models.AutoField(primary_key=True) - user = models.ForeignKey('User') - project = models.ForeignKey('Project') - team = models.ForeignKey('Team') - ssh_key_path = models.TextField() - ssh_key_data = models.TextField() # later - ssh_key_unlock = models.TextField() - ssh_password = models.TextField() - sudo_password = models.TextField() + ssh_key_path = models.TextField(blank=True, default='') + ssh_key_data = models.TextField(blank=True, default='') # later + ssh_key_unlock = models.TextField(blank=True, default='') + ssh_password = models.TextField(blank=True, default='') + sudo_password = models.TextField(blank=True, default='') + class Team(CommonModel): ''' A team is a group of users that work on common projects. ''' - class Meta: - db_table = 'teams' - - id = models.AutoField(primary_key=True) - projects = models.ManyToManyField('Project') - credentials = models.ManyToManyField('Credential') - users = models.ManyToManyField('User') - organization = models.ManyToManyField('Organization') + projects = models.ManyToManyField('Project', related_name='teams') + users = models.ManyToManyField('User', related_name='teams') + organization = models.ManyToManyField('Organization', related_name='teams') class Project(CommonModel): ''' A project represents a playbook git repo that can access a set of inventories ''' - class Meta: - db_table = 'projects' - - id = models.AutoField(primary_key=True) - credentials = models.ManyToManyField('Credential') - inventories = models.ManyToManyField('Inventory') + inventories = models.ManyToManyField('Inventory', related_name='projects') local_repository = models.TextField() scm_type = models.TextField() default_playbook = models.TextField() @@ -179,27 +138,35 @@ class Permission(CommonModel): A permission allows a user, project, or team to be able to use an inventory source. ''' - class Meta: - db_table = 'permissions' + user = models.ForeignKey('User', related_name='permissions') + project = models.ForeignKey('Project', related_name='permissions') + team = models.ForeignKey('Team', related_name='permissions') + job_type = models.TextField() - id = models.AutoField(primary_key=True) - user = models.ForeignKey('User') - project = models.ForeignKey('Project') - team = models.ForeignKey('Team') - # ... others? - -# TODO: Jobs +# TODO: other job types (later) class LaunchJob(CommonModel): - ''' a launch job is a request to apply a project to an inventory source with a given credential' + ''' + a launch job is a request to apply a project to an inventory source with a given credential + ''' - inventory = models.ForeignKey('Inventory') - credential = models.ForeignKey('Credential') - project = models.ForeignKey('Project') - user = models.ForeignKey('User') + inventory = models.ForeignKey('Inventory', null=True, default=None, blank=True, related_name='launch_jobs') + credential = models.ForeignKey('Credential', null=True, default=None, blank=True, related_name='launch_jobs') + project = models.ForeignKey('Project', null=True, default=None, blank=True, related_name='launch_jobs') + user = models.ForeignKey('User', null=True, default=None, blank=True, related_name='launch_jobs') job_type = models.TextField() - event = models.ForeignKey('Event') + + # TODO: Events +class LaunchJobStatus(CommonModel): + + launch_job = models.ForeignKey('LaunchJob', related_name='launch_job_statuses') + status = models.IntegerField() + result_data = models.TextField() + + +# TODO: reporting (MPD) + diff --git a/app_setup/setup.yml b/app_setup/setup.yml index 4b050a781b..6887fa30f1 100644 --- a/app_setup/setup.yml +++ b/app_setup/setup.yml @@ -53,8 +53,8 @@ - name: configure python settings (with database password) template: src=templates/settings.py.j2 dest=${working_dir}/acom/settings.py - - name: sync Django database - shell: python ${working_dir}/acom/manage.py syncdb + #- name: sync Django database + # shell: python ${working_dir}/acom/manage.py syncdb - name: sync django database django_manage: > @@ -64,3 +64,4 @@ - name: run south migrations command: python ${working_dir}/acom/manage.py migrate main + diff --git a/planning/api2.md b/planning/api2.md index 5f7538ceae..c8881e4ecc 100644 --- a/planning/api2.md +++ b/planning/api2.md @@ -1,7 +1,7 @@ API Overview ============ -The following is a start to an API document. +The following is a start to an API document. It is just a sketch and may evolve as we build things out. Versioning and Semantics ========================