← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] lp:~jtv/maas/ensure-master-nodegroup-but-not-through-south into lp:maas

 

Jeroen T. Vermeulen has proposed merging lp:~jtv/maas/ensure-master-nodegroup-but-not-through-south into lp:maas.

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~jtv/maas/ensure-master-nodegroup-but-not-through-south/+merge/117593

The schema migration was a dead end.  We can't run model code in a database migration, and there was too much to duplicate and move (as appropriate) into the migration.

Instead, cover all entrances:

 * “make syncdb“ sensibly initializes the master, and in time for the sample data to use it.

 * wsgi.py also calls ensure_master on webapp startup, to cover existing installations.

 * …and what about tests?  Actually, never mind.  They run fine without.  We'll burn that bridge when we get to it.

We'll probably want to encapsulate some kind of hook later for all kinds of things that need to run on app startup.  But first, this more basic fix should unblock Raphaël.

Oh, and I made wsgi.py export its “application” variable in __all__.  Exporting that variable is the whole point of wsgi.py.


Jeroen
-- 
https://code.launchpad.net/~jtv/maas/ensure-master-nodegroup-but-not-through-south/+merge/117593
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~jtv/maas/ensure-master-nodegroup-but-not-through-south into lp:maas.
=== modified file 'Makefile'
--- Makefile	2012-07-30 15:55:03 +0000
+++ Makefile	2012-08-01 09:42:21 +0000
@@ -153,6 +153,7 @@
 	$(dbrun) bin/maas syncdb --noinput
 	$(dbrun) bin/maas migrate maasserver --noinput
 	$(dbrun) bin/maas migrate metadataserver --noinput
+	$(dbrun) bin/maas config_master_dhcp --ensure
 
 define phony_targets
   build

=== modified file 'contrib/wsgi.py'
--- contrib/wsgi.py	2012-06-25 13:52:54 +0000
+++ contrib/wsgi.py	2012-08-01 09:42:21 +0000
@@ -10,7 +10,9 @@
     )
 
 __metaclass__ = type
-__all__ = []
+__all__ = [
+    'application',
+    ]
 
 import os
 import sys
@@ -26,3 +28,6 @@
 
 from maasserver.maasavahi import setup_maas_avahi_service
 setup_maas_avahi_service()
+
+from maasserver.models import NodeGroup
+NodeGroup.objects.ensure_master()

=== removed file 'src/maasserver/migrations/0015_create_master_nodegroup.py'
--- src/maasserver/migrations/0015_create_master_nodegroup.py	2012-07-30 11:52:21 +0000
+++ src/maasserver/migrations/0015_create_master_nodegroup.py	1970-01-01 00:00:00 +0000
@@ -1,167 +0,0 @@
-# encoding: utf-8
-
-# No unicode_literals.  Unicode strings here irk South.
-from __future__ import (
-    absolute_import,
-    print_function,
-    )
-
-__metaclass__ = type
-__all__ = ['Migration']
-
-import datetime
-
-from django.db import models
-from maasserver.models import NodeGroup
-from south.db import db
-from south.v2 import SchemaMigration
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Ensure that there is a master nodegroup.
-        NodeGroup.objects.ensure_master()
-
-    def backwards(self, orm):
-        # Reversing this migration doesn't need to do anything: it's
-        # fine to have a master nodegroup when you don't need one.
-        pass
-
-    models = {
-        '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', [], {'unique': 'True', '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'})
-        },
-        u'maasserver.config': {
-            'Meta': {'object_name': 'Config'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
-            'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
-        },
-        u'maasserver.dhcplease': {
-            'Meta': {'object_name': 'DHCPLease'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'ip': ('django.db.models.fields.IPAddressField', [], {'unique': 'True', 'max_length': '15'}),
-            'mac': ('maasserver.fields.MACAddressField', [], {}),
-            'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"})
-        },
-        u'maasserver.filestorage': {
-            'Meta': {'object_name': 'FileStorage'},
-            'data': ('django.db.models.fields.files.FileField', [], {'max_length': '255'}),
-            'filename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
-        },
-        u'maasserver.macaddress': {
-            'Meta': {'object_name': 'MACAddress'},
-            'created': ('django.db.models.fields.DateTimeField', [], {}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}),
-            'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
-            'updated': ('django.db.models.fields.DateTimeField', [], {})
-        },
-        u'maasserver.node': {
-            'Meta': {'object_name': 'Node'},
-            'after_commissioning_action': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'architecture': ('django.db.models.fields.CharField', [], {'default': "u'i386'", 'max_length': '10'}),
-            'created': ('django.db.models.fields.DateTimeField', [], {}),
-            'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
-            'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.NodeGroup']", 'null': 'True', 'blank': 'True'}),
-            'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
-            'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
-            'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
-            'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
-            'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-07cd231a-cff4-11e1-bbd4-002608dc6120'", 'unique': 'True', 'max_length': '41'}),
-            'token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'null': 'True'}),
-            'updated': ('django.db.models.fields.DateTimeField', [], {})
-        },
-        u'maasserver.nodegroup': {
-            'Meta': {'object_name': 'NodeGroup'},
-            'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
-            'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'unique': 'True'}),
-            'broadcast_ip': ('django.db.models.fields.IPAddressField', [], {'default': "u''", 'max_length': '15', 'null': 'True', 'blank': 'True'}),
-            'created': ('django.db.models.fields.DateTimeField', [], {}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'ip_range_high': ('django.db.models.fields.IPAddressField', [], {'default': "u''", 'max_length': '15', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
-            'ip_range_low': ('django.db.models.fields.IPAddressField', [], {'default': "u''", 'max_length': '15', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
-            'router_ip': ('django.db.models.fields.IPAddressField', [], {'default': "u''", 'max_length': '15', 'null': 'True', 'blank': 'True'}),
-            'subnet_mask': ('django.db.models.fields.IPAddressField', [], {'default': "u''", 'max_length': '15', 'null': 'True', 'blank': 'True'}),
-            'updated': ('django.db.models.fields.DateTimeField', [], {}),
-            'worker_ip': ('django.db.models.fields.IPAddressField', [], {'unique': 'True', 'max_length': '15'})
-        },
-        u'maasserver.sshkey': {
-            'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
-            'created': ('django.db.models.fields.DateTimeField', [], {}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'key': ('django.db.models.fields.TextField', [], {}),
-            'updated': ('django.db.models.fields.DateTimeField', [], {}),
-            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
-        },
-        u'maasserver.userprofile': {
-            'Meta': {'object_name': 'UserProfile'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
-        },
-        'piston.consumer': {
-            'Meta': {'object_name': 'Consumer'},
-            'description': ('django.db.models.fields.TextField', [], {}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
-            'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
-            'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
-            'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': "orm['auth.User']"})
-        },
-        'piston.token': {
-            'Meta': {'object_name': 'Token'},
-            'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
-            'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Consumer']"}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
-            'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
-            'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1342518254L'}),
-            'token_type': ('django.db.models.fields.IntegerField', [], {}),
-            'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': "orm['auth.User']"}),
-            'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
-        }
-    }
-
-    complete_apps = ['maasserver']


Follow ups