Merge lp:~jtv/maas/db-default-disable-ipv4 into lp:~maas-committers/maas/trunk
- db-default-disable-ipv4
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Jeroen T. Vermeulen |
Approved revision: | no longer in the source branch. |
Merged at revision: | 3041 |
Proposed branch: | lp:~jtv/maas/db-default-disable-ipv4 |
Merge into: | lp:~maas-committers/maas/trunk |
Diff against target: |
455 lines (+395/-4) 3 files modified
src/maasserver/migrations/0111_add_nodegroup_default_disable_ipv4.py (+375/-0) src/maasserver/models/nodegroup.py (+14/-2) src/maasserver/testing/factory.py (+6/-2) |
To merge this branch: | bzr merge lp:~jtv/maas/db-default-disable-ipv4 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Gavin Panella (community) | Approve | ||
Review via email: mp+235267@code.launchpad.net |
Commit message
Add new field to schema: NodeGroup.
Description of the change
Andres requested a default setting, to make it easier to set a common policy for a site's nodes. I think the cluster is the right place to put this: it gives slightly more control than setting it globally. You can have a dedicated IPv6-only cluster.
Nor does it make sense to set this on the cluster interface. One, the setting is for the entire node, not just one network interface. And two, it is inherently only useful for situations where a node has a single network interface connecting to two cluster interfaces — one IPv4 and one IPv6.
In the UI, this new setting will be hidden behind the REVEAL_IPv6 flag. It will be settable from the API, but not pushed in the user's face until we're ready. And right now of course, the setting doesn't actually do anything yet.
Jeroen
Gavin Panella (allenap) : | # |
Preview Diff
1 | === added file 'src/maasserver/migrations/0111_add_nodegroup_default_disable_ipv4.py' | |||
2 | --- src/maasserver/migrations/0111_add_nodegroup_default_disable_ipv4.py 1970-01-01 00:00:00 +0000 | |||
3 | +++ src/maasserver/migrations/0111_add_nodegroup_default_disable_ipv4.py 2014-09-19 12:49:24 +0000 | |||
4 | @@ -0,0 +1,375 @@ | |||
5 | 1 | from south.db import db | ||
6 | 2 | from south.v2 import SchemaMigration | ||
7 | 3 | |||
8 | 4 | |||
9 | 5 | class Migration(SchemaMigration): | ||
10 | 6 | |||
11 | 7 | def forwards(self, orm): | ||
12 | 8 | # Adding field 'NodeGroup.default_disable_ipv4' | ||
13 | 9 | db.add_column(u'maasserver_nodegroup', 'default_disable_ipv4', | ||
14 | 10 | self.gf('django.db.models.fields.BooleanField')(default=False), | ||
15 | 11 | keep_default=False) | ||
16 | 12 | |||
17 | 13 | |||
18 | 14 | def backwards(self, orm): | ||
19 | 15 | # Deleting field 'NodeGroup.default_disable_ipv4' | ||
20 | 16 | db.delete_column(u'maasserver_nodegroup', 'default_disable_ipv4') | ||
21 | 17 | |||
22 | 18 | |||
23 | 19 | models = { | ||
24 | 20 | u'auth.group': { | ||
25 | 21 | 'Meta': {'object_name': 'Group'}, | ||
26 | 22 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
27 | 23 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), | ||
28 | 24 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) | ||
29 | 25 | }, | ||
30 | 26 | u'auth.permission': { | ||
31 | 27 | 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, | ||
32 | 28 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
33 | 29 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), | ||
34 | 30 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
35 | 31 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) | ||
36 | 32 | }, | ||
37 | 33 | u'auth.user': { | ||
38 | 34 | 'Meta': {'object_name': 'User'}, | ||
39 | 35 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
40 | 36 | 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}), | ||
41 | 37 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
42 | 38 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), | ||
43 | 39 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
44 | 40 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
45 | 41 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
46 | 42 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
47 | 43 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
48 | 44 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
49 | 45 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
50 | 46 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), | ||
51 | 47 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) | ||
52 | 48 | }, | ||
53 | 49 | u'contenttypes.contenttype': { | ||
54 | 50 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, | ||
55 | 51 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
56 | 52 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
57 | 53 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
58 | 54 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) | ||
59 | 55 | }, | ||
60 | 56 | u'maasserver.bootimage': { | ||
61 | 57 | 'Meta': {'unique_together': "((u'nodegroup', u'osystem', u'architecture', u'subarchitecture', u'release', u'purpose', u'label'),)", 'object_name': 'BootImage'}, | ||
62 | 58 | 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
63 | 59 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
64 | 60 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
65 | 61 | 'label': ('django.db.models.fields.CharField', [], {'default': "u'release'", 'max_length': '255'}), | ||
66 | 62 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}), | ||
67 | 63 | 'osystem': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
68 | 64 | 'purpose': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
69 | 65 | 'release': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
70 | 66 | 'subarchitecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
71 | 67 | 'supported_subarches': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
72 | 68 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
73 | 69 | 'xinstall_path': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
74 | 70 | 'xinstall_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '30', 'null': 'True', 'blank': 'True'}) | ||
75 | 71 | }, | ||
76 | 72 | u'maasserver.bootresource': { | ||
77 | 73 | 'Meta': {'unique_together': "((u'name', u'architecture'),)", 'object_name': 'BootResource'}, | ||
78 | 74 | 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
79 | 75 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
80 | 76 | 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}), | ||
81 | 77 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
82 | 78 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
83 | 79 | 'rtype': ('django.db.models.fields.IntegerField', [], {'max_length': '10'}), | ||
84 | 80 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
85 | 81 | }, | ||
86 | 82 | u'maasserver.bootresourcefile': { | ||
87 | 83 | 'Meta': {'unique_together': "((u'resource_set', u'filetype'),)", 'object_name': 'BootResourceFile'}, | ||
88 | 84 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
89 | 85 | 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}), | ||
90 | 86 | 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
91 | 87 | 'filetype': ('django.db.models.fields.CharField', [], {'default': "u'root-tgz'", 'max_length': '20'}), | ||
92 | 88 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
93 | 89 | 'largefile': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.LargeFile']"}), | ||
94 | 90 | 'resource_set': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'files'", 'to': u"orm['maasserver.BootResourceSet']"}), | ||
95 | 91 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
96 | 92 | }, | ||
97 | 93 | u'maasserver.bootresourceset': { | ||
98 | 94 | 'Meta': {'unique_together': "((u'resource', u'version'),)", 'object_name': 'BootResourceSet'}, | ||
99 | 95 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
100 | 96 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
101 | 97 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
102 | 98 | 'resource': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'sets'", 'to': u"orm['maasserver.BootResource']"}), | ||
103 | 99 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
104 | 100 | 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'}) | ||
105 | 101 | }, | ||
106 | 102 | u'maasserver.bootsource': { | ||
107 | 103 | 'Meta': {'object_name': 'BootSource'}, | ||
108 | 104 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
109 | 105 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
110 | 106 | 'keyring_data': ('maasserver.fields.EditableBinaryField', [], {'blank': 'True'}), | ||
111 | 107 | 'keyring_filename': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'blank': 'True'}), | ||
112 | 108 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
113 | 109 | 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'}) | ||
114 | 110 | }, | ||
115 | 111 | u'maasserver.bootsourceselection': { | ||
116 | 112 | 'Meta': {'object_name': 'BootSourceSelection'}, | ||
117 | 113 | 'arches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}), | ||
118 | 114 | 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}), | ||
119 | 115 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
120 | 116 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
121 | 117 | 'labels': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}), | ||
122 | 118 | 'os': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
123 | 119 | 'release': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
124 | 120 | 'subarches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}), | ||
125 | 121 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
126 | 122 | }, | ||
127 | 123 | u'maasserver.candidatename': { | ||
128 | 124 | 'Meta': {'unique_together': "((u'name', u'position'),)", 'object_name': 'CandidateName'}, | ||
129 | 125 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
130 | 126 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), | ||
131 | 127 | 'position': ('django.db.models.fields.IntegerField', [], {}) | ||
132 | 128 | }, | ||
133 | 129 | u'maasserver.componenterror': { | ||
134 | 130 | 'Meta': {'object_name': 'ComponentError'}, | ||
135 | 131 | 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), | ||
136 | 132 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
137 | 133 | 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}), | ||
138 | 134 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
139 | 135 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
140 | 136 | }, | ||
141 | 137 | u'maasserver.config': { | ||
142 | 138 | 'Meta': {'object_name': 'Config'}, | ||
143 | 139 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
144 | 140 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
145 | 141 | 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'}) | ||
146 | 142 | }, | ||
147 | 143 | u'maasserver.dhcplease': { | ||
148 | 144 | 'Meta': {'object_name': 'DHCPLease'}, | ||
149 | 145 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
150 | 146 | 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}), | ||
151 | 147 | 'mac': ('maasserver.fields.MACAddressField', [], {}), | ||
152 | 148 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}) | ||
153 | 149 | }, | ||
154 | 150 | u'maasserver.downloadprogress': { | ||
155 | 151 | 'Meta': {'object_name': 'DownloadProgress'}, | ||
156 | 152 | 'bytes_downloaded': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), | ||
157 | 153 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
158 | 154 | 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}), | ||
159 | 155 | 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
160 | 156 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
161 | 157 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}), | ||
162 | 158 | 'size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), | ||
163 | 159 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
164 | 160 | }, | ||
165 | 161 | u'maasserver.event': { | ||
166 | 162 | 'Meta': {'object_name': 'Event'}, | ||
167 | 163 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
168 | 164 | 'description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}), | ||
169 | 165 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
170 | 166 | 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}), | ||
171 | 167 | 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.EventType']"}), | ||
172 | 168 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
173 | 169 | }, | ||
174 | 170 | u'maasserver.eventtype': { | ||
175 | 171 | 'Meta': {'object_name': 'EventType'}, | ||
176 | 172 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
177 | 173 | 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
178 | 174 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
179 | 175 | 'level': ('django.db.models.fields.IntegerField', [], {}), | ||
180 | 176 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), | ||
181 | 177 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
182 | 178 | }, | ||
183 | 179 | u'maasserver.filestorage': { | ||
184 | 180 | 'Meta': {'unique_together': "((u'filename', u'owner'),)", 'object_name': 'FileStorage'}, | ||
185 | 181 | 'content': ('metadataserver.fields.BinaryField', [], {'blank': 'True'}), | ||
186 | 182 | 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
187 | 183 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
188 | 184 | 'key': ('django.db.models.fields.CharField', [], {'default': "u'151cf944-3fe8-11e4-abeb-94de80b61466'", 'unique': 'True', 'max_length': '36'}), | ||
189 | 185 | 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) | ||
190 | 186 | }, | ||
191 | 187 | u'maasserver.largefile': { | ||
192 | 188 | 'Meta': {'object_name': 'LargeFile'}, | ||
193 | 189 | 'content': ('maasserver.fields.LargeObjectField', [], {}), | ||
194 | 190 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
195 | 191 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
196 | 192 | 'sha256': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}), | ||
197 | 193 | 'total_size': ('django.db.models.fields.BigIntegerField', [], {}), | ||
198 | 194 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
199 | 195 | }, | ||
200 | 196 | u'maasserver.licensekey': { | ||
201 | 197 | 'Meta': {'unique_together': "((u'osystem', u'distro_series'),)", 'object_name': 'LicenseKey'}, | ||
202 | 198 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
203 | 199 | 'distro_series': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
204 | 200 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
205 | 201 | 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
206 | 202 | 'osystem': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
207 | 203 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
208 | 204 | }, | ||
209 | 205 | u'maasserver.macaddress': { | ||
210 | 206 | 'Meta': {'ordering': "(u'created',)", 'object_name': 'MACAddress'}, | ||
211 | 207 | 'cluster_interface': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.NodeGroupInterface']", 'null': 'True', 'blank': 'True'}), | ||
212 | 208 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
213 | 209 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
214 | 210 | 'ip_addresses': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.StaticIPAddress']", 'symmetrical': 'False', 'through': u"orm['maasserver.MACStaticIPAddressLink']", 'blank': 'True'}), | ||
215 | 211 | 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}), | ||
216 | 212 | 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Network']", 'symmetrical': 'False', 'blank': 'True'}), | ||
217 | 213 | 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}), | ||
218 | 214 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
219 | 215 | }, | ||
220 | 216 | u'maasserver.macstaticipaddresslink': { | ||
221 | 217 | 'Meta': {'unique_together': "((u'ip_address', u'mac_address'),)", 'object_name': 'MACStaticIPAddressLink'}, | ||
222 | 218 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
223 | 219 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
224 | 220 | 'ip_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.StaticIPAddress']", 'unique': 'True'}), | ||
225 | 221 | 'mac_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.MACAddress']"}), | ||
226 | 222 | 'nic_alias': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), | ||
227 | 223 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
228 | 224 | }, | ||
229 | 225 | u'maasserver.network': { | ||
230 | 226 | 'Meta': {'object_name': 'Network'}, | ||
231 | 227 | 'default_gateway': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
232 | 228 | 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
233 | 229 | 'dns_servers': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
234 | 230 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
235 | 231 | 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}), | ||
236 | 232 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), | ||
237 | 233 | 'netmask': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}), | ||
238 | 234 | 'vlan_tag': ('django.db.models.fields.PositiveSmallIntegerField', [], {'unique': 'True', 'null': 'True', 'blank': 'True'}) | ||
239 | 235 | }, | ||
240 | 236 | u'maasserver.node': { | ||
241 | 237 | 'Meta': {'object_name': 'Node'}, | ||
242 | 238 | 'agent_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
243 | 239 | 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '31'}), | ||
244 | 240 | 'boot_type': ('django.db.models.fields.CharField', [], {'default': "u'fastpath'", 'max_length': '20'}), | ||
245 | 241 | 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
246 | 242 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
247 | 243 | 'disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
248 | 244 | 'distro_series': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
249 | 245 | 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
250 | 246 | 'error_description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}), | ||
251 | 247 | 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}), | ||
252 | 248 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
253 | 249 | 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), | ||
254 | 250 | 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
255 | 251 | 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
256 | 252 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}), | ||
257 | 253 | 'osystem': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
258 | 254 | 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}), | ||
259 | 255 | 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}), | ||
260 | 256 | 'power_state': ('django.db.models.fields.CharField', [], {'default': "u'unknown'", 'max_length': '10'}), | ||
261 | 257 | 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}), | ||
262 | 258 | 'routers': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'macaddr'", 'null': 'True', 'blank': 'True'}), | ||
263 | 259 | 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}), | ||
264 | 260 | 'storage': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
265 | 261 | 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-151ba76a-3fe8-11e4-abeb-94de80b61466'", 'unique': 'True', 'max_length': '41'}), | ||
266 | 262 | 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}), | ||
267 | 263 | 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'null': 'True'}), | ||
268 | 264 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
269 | 265 | 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Zone']", 'on_delete': 'models.SET_DEFAULT'}) | ||
270 | 266 | }, | ||
271 | 267 | u'maasserver.nodegroup': { | ||
272 | 268 | 'Meta': {'object_name': 'NodeGroup'}, | ||
273 | 269 | 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}), | ||
274 | 270 | 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'unique': 'True'}), | ||
275 | 271 | 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}), | ||
276 | 272 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
277 | 273 | 'default_disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
278 | 274 | 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
279 | 275 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
280 | 276 | 'maas_url': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
281 | 277 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}), | ||
282 | 278 | 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
283 | 279 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
284 | 280 | 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'}) | ||
285 | 281 | }, | ||
286 | 282 | u'maasserver.nodegroupinterface': { | ||
287 | 283 | 'Meta': {'unique_together': "((u'nodegroup', u'name'),)", 'object_name': 'NodeGroupInterface'}, | ||
288 | 284 | 'broadcast_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
289 | 285 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
290 | 286 | 'foreign_dhcp_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
291 | 287 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
292 | 288 | 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
293 | 289 | 'ip': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}), | ||
294 | 290 | 'ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
295 | 291 | 'ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
296 | 292 | 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
297 | 293 | 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
298 | 294 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}), | ||
299 | 295 | 'router_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
300 | 296 | 'static_ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
301 | 297 | 'static_ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
302 | 298 | 'subnet_mask': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
303 | 299 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
304 | 300 | }, | ||
305 | 301 | u'maasserver.sshkey': { | ||
306 | 302 | 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'}, | ||
307 | 303 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
308 | 304 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
309 | 305 | 'key': ('django.db.models.fields.TextField', [], {}), | ||
310 | 306 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
311 | 307 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) | ||
312 | 308 | }, | ||
313 | 309 | u'maasserver.sslkey': { | ||
314 | 310 | 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSLKey'}, | ||
315 | 311 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
316 | 312 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
317 | 313 | 'key': ('django.db.models.fields.TextField', [], {}), | ||
318 | 314 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
319 | 315 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) | ||
320 | 316 | }, | ||
321 | 317 | u'maasserver.staticipaddress': { | ||
322 | 318 | 'Meta': {'object_name': 'StaticIPAddress'}, | ||
323 | 319 | 'alloc_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
324 | 320 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
325 | 321 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
326 | 322 | 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}), | ||
327 | 323 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
328 | 324 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) | ||
329 | 325 | }, | ||
330 | 326 | u'maasserver.tag': { | ||
331 | 327 | 'Meta': {'object_name': 'Tag'}, | ||
332 | 328 | 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
333 | 329 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
334 | 330 | 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
335 | 331 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
336 | 332 | 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), | ||
337 | 333 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}), | ||
338 | 334 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
339 | 335 | }, | ||
340 | 336 | u'maasserver.userprofile': { | ||
341 | 337 | 'Meta': {'object_name': 'UserProfile'}, | ||
342 | 338 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
343 | 339 | 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) | ||
344 | 340 | }, | ||
345 | 341 | u'maasserver.zone': { | ||
346 | 342 | 'Meta': {'ordering': "[u'name']", 'object_name': 'Zone'}, | ||
347 | 343 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
348 | 344 | 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
349 | 345 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
350 | 346 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}), | ||
351 | 347 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
352 | 348 | }, | ||
353 | 349 | u'piston.consumer': { | ||
354 | 350 | 'Meta': {'object_name': 'Consumer'}, | ||
355 | 351 | 'description': ('django.db.models.fields.TextField', [], {}), | ||
356 | 352 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
357 | 353 | 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}), | ||
358 | 354 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
359 | 355 | 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}), | ||
360 | 356 | 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}), | ||
361 | 357 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': u"orm['auth.User']"}) | ||
362 | 358 | }, | ||
363 | 359 | u'piston.token': { | ||
364 | 360 | 'Meta': {'object_name': 'Token'}, | ||
365 | 361 | 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
366 | 362 | 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
367 | 363 | 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Consumer']"}), | ||
368 | 364 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
369 | 365 | 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
370 | 366 | 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}), | ||
371 | 367 | 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}), | ||
372 | 368 | 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1411122674L'}), | ||
373 | 369 | 'token_type': ('django.db.models.fields.IntegerField', [], {}), | ||
374 | 370 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': u"orm['auth.User']"}), | ||
375 | 371 | 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'}) | ||
376 | 372 | } | ||
377 | 373 | } | ||
378 | 374 | |||
379 | 375 | complete_apps = ['maasserver'] | ||
380 | 0 | 376 | ||
381 | === modified file 'src/maasserver/models/nodegroup.py' | |||
382 | --- src/maasserver/models/nodegroup.py 2014-09-17 20:36:17 +0000 | |||
383 | +++ src/maasserver/models/nodegroup.py 2014-09-19 12:49:24 +0000 | |||
384 | @@ -20,6 +20,7 @@ | |||
385 | 20 | 20 | ||
386 | 21 | from apiclient.creds import convert_tuple_to_string | 21 | from apiclient.creds import convert_tuple_to_string |
387 | 22 | from django.db.models import ( | 22 | from django.db.models import ( |
388 | 23 | BooleanField, | ||
389 | 23 | CharField, | 24 | CharField, |
390 | 24 | ForeignKey, | 25 | ForeignKey, |
391 | 25 | IntegerField, | 26 | IntegerField, |
392 | @@ -58,7 +59,8 @@ | |||
393 | 58 | """ | 59 | """ |
394 | 59 | 60 | ||
395 | 60 | def new(self, name, uuid, subnet_mask=None, dhcp_key='', | 61 | def new(self, name, uuid, subnet_mask=None, dhcp_key='', |
397 | 61 | status=NODEGROUP_STATUS.DEFAULT, cluster_name=None, maas_url=''): | 62 | status=NODEGROUP_STATUS.DEFAULT, cluster_name=None, maas_url='', |
398 | 63 | default_disable_ipv4=False): | ||
399 | 62 | """Create a :class:`NodeGroup` with the given parameters. | 64 | """Create a :class:`NodeGroup` with the given parameters. |
400 | 63 | 65 | ||
401 | 64 | Also generates API credentials for the nodegroup's worker to use. | 66 | Also generates API credentials for the nodegroup's worker to use. |
402 | @@ -67,7 +69,8 @@ | |||
403 | 67 | cluster_name = NODEGROUP_CLUSTER_NAME_TEMPLATE % {'uuid': uuid} | 69 | cluster_name = NODEGROUP_CLUSTER_NAME_TEMPLATE % {'uuid': uuid} |
404 | 68 | nodegroup = NodeGroup( | 70 | nodegroup = NodeGroup( |
405 | 69 | name=name, uuid=uuid, cluster_name=cluster_name, dhcp_key=dhcp_key, | 71 | name=name, uuid=uuid, cluster_name=cluster_name, dhcp_key=dhcp_key, |
407 | 70 | status=status, maas_url=maas_url) | 72 | status=status, maas_url=maas_url, |
408 | 73 | default_disable_ipv4=default_disable_ipv4) | ||
409 | 71 | nodegroup.save() | 74 | nodegroup.save() |
410 | 72 | return nodegroup | 75 | return nodegroup |
411 | 73 | 76 | ||
412 | @@ -173,6 +176,15 @@ | |||
413 | 173 | maas_url = CharField( | 176 | maas_url = CharField( |
414 | 174 | blank=True, editable=False, max_length=255, default='') | 177 | blank=True, editable=False, max_length=255, default='') |
415 | 175 | 178 | ||
416 | 179 | # Should nodes on this cluster be configured to disable IPv4 on deployment | ||
417 | 180 | # by default? | ||
418 | 181 | default_disable_ipv4 = BooleanField( | ||
419 | 182 | default=False, | ||
420 | 183 | verbose_name="Disable IPv4 by default when deploying nodes", | ||
421 | 184 | help_text=( | ||
422 | 185 | "Default setting for setting on new nodes: disable IPv4 when " | ||
423 | 186 | "deploying, on operating systems where this is supported.")) | ||
424 | 187 | |||
425 | 176 | @property | 188 | @property |
426 | 177 | def api_credentials(self): | 189 | def api_credentials(self): |
427 | 178 | """Return a string containing credentials for this nodegroup.""" | 190 | """Return a string containing credentials for this nodegroup.""" |
428 | 179 | 191 | ||
429 | === modified file 'src/maasserver/testing/factory.py' | |||
430 | --- src/maasserver/testing/factory.py 2014-09-19 04:46:35 +0000 | |||
431 | +++ src/maasserver/testing/factory.py 2014-09-19 12:49:24 +0000 | |||
432 | @@ -351,7 +351,8 @@ | |||
433 | 351 | subnet_mask=None, broadcast_ip=None, ip_range_low=None, | 351 | subnet_mask=None, broadcast_ip=None, ip_range_low=None, |
434 | 352 | ip_range_high=None, interface=None, management=None, | 352 | ip_range_high=None, interface=None, management=None, |
435 | 353 | status=None, maas_url='', static_ip_range_low=None, | 353 | status=None, maas_url='', static_ip_range_low=None, |
437 | 354 | static_ip_range_high=None, **kwargs): | 354 | static_ip_range_high=None, default_disable_ipv4=None, |
438 | 355 | **kwargs): | ||
439 | 355 | """Create a :class:`NodeGroup`. | 356 | """Create a :class:`NodeGroup`. |
440 | 356 | 357 | ||
441 | 357 | If `management` is set (to a `NODEGROUPINTERFACE_MANAGEMENT` value), | 358 | If `management` is set (to a `NODEGROUPINTERFACE_MANAGEMENT` value), |
442 | @@ -373,9 +374,12 @@ | |||
443 | 373 | if dhcp_key is None: | 374 | if dhcp_key is None: |
444 | 374 | # TODO: Randomise this properly. | 375 | # TODO: Randomise this properly. |
445 | 375 | dhcp_key = '' | 376 | dhcp_key = '' |
446 | 377 | if default_disable_ipv4 is None: | ||
447 | 378 | default_disable_ipv4 = factory.pick_bool() | ||
448 | 376 | cluster = NodeGroup.objects.new( | 379 | cluster = NodeGroup.objects.new( |
449 | 377 | name=name, uuid=uuid, cluster_name=cluster_name, status=status, | 380 | name=name, uuid=uuid, cluster_name=cluster_name, status=status, |
451 | 378 | dhcp_key=dhcp_key, maas_url=maas_url) | 381 | dhcp_key=dhcp_key, maas_url=maas_url, |
452 | 382 | default_disable_ipv4=default_disable_ipv4) | ||
453 | 379 | if management is not None: | 383 | if management is not None: |
454 | 380 | interface_settings = dict( | 384 | interface_settings = dict( |
455 | 381 | ip=ip, router_ip=router_ip, network=network, | 385 | ip=ip, router_ip=router_ip, network=network, |