Merge lp:~jameinel/maas/1.2-remove-kernel-opts into lp:maas/1.2
- 1.2-remove-kernel-opts
- Merge into 1.2
Proposed by
John A Meinel
on 2012-11-08
| Status: | Merged |
|---|---|
| Approved by: | John A Meinel on 2012-11-08 |
| Approved revision: | 1293 |
| Merged at revision: | 1293 |
| Proposed branch: | lp:~jameinel/maas/1.2-remove-kernel-opts |
| Merge into: | lp:maas/1.2 |
| Diff against target: |
545 lines (+5/-374) 11 files modified
src/maasserver/api.py (+1/-15) src/maasserver/forms.py (+0/-1) src/maasserver/migrations/0043_add_tag_kernel_opts.py (+0/-203) src/maasserver/models/node.py (+1/-24) src/maasserver/models/tag.py (+0/-3) src/maasserver/testing/factory.py (+3/-4) src/maasserver/tests/test_api.py (+0/-41) src/maasserver/tests/test_node.py (+0/-56) src/maasserver/tests/test_tag.py (+0/-10) src/provisioningserver/kernel_opts.py (+0/-4) src/provisioningserver/tests/test_kernel_opts.py (+0/-13) |
| To merge this branch: | bzr merge lp:~jameinel/maas/1.2-remove-kernel-opts |
| Related bugs: |
| Reviewer | Review Type | Date Requested | Status |
|---|---|---|---|
| Martin Packman (community) | 2012-11-08 | Approve on 2012-11-08 | |
|
Review via email:
|
|||
This proposal supersedes a proposal from 2012-11-08.
Commit Message
This removes the recent patches to add kernel_opts to the 1.2 branch.
We'll land it instead on trunk, and then it will get backported in the future once a bugfix only SRU was done.
Description of the Change
(Original proposal accidentally targetted trunk, this is now properly targetting 1.2)
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
| 1 | === modified file 'src/maasserver/api.py' |
| 2 | --- src/maasserver/api.py 2012-11-08 06:40:03 +0000 |
| 3 | +++ src/maasserver/api.py 2012-11-08 09:21:26 +0000 |
| 4 | @@ -1430,7 +1430,6 @@ |
| 5 | 'name', |
| 6 | 'definition', |
| 7 | 'comment', |
| 8 | - 'kernel_opts', |
| 9 | ) |
| 10 | |
| 11 | def read(self, request, name): |
| 12 | @@ -1551,11 +1550,6 @@ |
| 13 | It is meant as a human readable description of the tag. |
| 14 | :param definition: An XPATH query that will be evaluated against the |
| 15 | hardware_details stored for all nodes (output of `lshw -xml`). |
| 16 | - :param kernel_opts: Can be None. If set, nodes associated with this tag |
| 17 | - will add this string to their kernel options when booting. The |
| 18 | - value overrides the global 'kernel_opts' setting. If more than one |
| 19 | - tag is associated with a node, the one with the lowest alphabetical |
| 20 | - name will be picked (eg 01-my-tag will be taken over 99-tag-name). |
| 21 | """ |
| 22 | if not request.user.is_superuser: |
| 23 | raise PermissionDenied() |
| 24 | @@ -1790,13 +1784,6 @@ |
| 25 | else: |
| 26 | series = node.get_distro_series() |
| 27 | |
| 28 | - if node is not None: |
| 29 | - # We don't care if the kernel opts is from the global setting or a tag, |
| 30 | - # just get the options |
| 31 | - _, extra_kernel_opts = node.get_effective_kernel_options() |
| 32 | - else: |
| 33 | - extra_kernel_opts = None |
| 34 | - |
| 35 | purpose = get_boot_purpose(node) |
| 36 | server_address = get_maas_facing_server_address() |
| 37 | cluster_address = get_mandatory_param(request.GET, "local") |
| 38 | @@ -1804,8 +1791,7 @@ |
| 39 | params = KernelParameters( |
| 40 | arch=arch, subarch=subarch, release=series, purpose=purpose, |
| 41 | hostname=hostname, domain=domain, preseed_url=preseed_url, |
| 42 | - log_host=server_address, fs_host=cluster_address, |
| 43 | - extra_opts=extra_kernel_opts) |
| 44 | + log_host=server_address, fs_host=cluster_address) |
| 45 | |
| 46 | return HttpResponse( |
| 47 | json.dumps(params._asdict()), |
| 48 | |
| 49 | === modified file 'src/maasserver/forms.py' |
| 50 | --- src/maasserver/forms.py 2012-11-07 13:27:41 +0000 |
| 51 | +++ src/maasserver/forms.py 2012-11-08 09:21:26 +0000 |
| 52 | @@ -855,7 +855,6 @@ |
| 53 | 'name', |
| 54 | 'comment', |
| 55 | 'definition', |
| 56 | - 'kernel_opts', |
| 57 | ) |
| 58 | |
| 59 | def clean_definition(self): |
| 60 | |
| 61 | === removed file 'src/maasserver/migrations/0043_add_tag_kernel_opts.py' |
| 62 | --- src/maasserver/migrations/0043_add_tag_kernel_opts.py 2012-11-07 10:35:57 +0000 |
| 63 | +++ src/maasserver/migrations/0043_add_tag_kernel_opts.py 1970-01-01 00:00:00 +0000 |
| 64 | @@ -1,203 +0,0 @@ |
| 65 | -# -*- coding: utf-8 -*- |
| 66 | -import datetime |
| 67 | -from south.db import db |
| 68 | -from south.v2 import SchemaMigration |
| 69 | -from django.db import models |
| 70 | - |
| 71 | - |
| 72 | -class Migration(SchemaMigration): |
| 73 | - |
| 74 | - def forwards(self, orm): |
| 75 | - # Adding field 'Tag.kernel_opts' |
| 76 | - db.add_column(u'maasserver_tag', 'kernel_opts', |
| 77 | - self.gf('django.db.models.fields.TextField')(null=True, blank=True), |
| 78 | - keep_default=False) |
| 79 | - |
| 80 | - |
| 81 | - def backwards(self, orm): |
| 82 | - # Deleting field 'Tag.kernel_opts' |
| 83 | - db.delete_column(u'maasserver_tag', 'kernel_opts') |
| 84 | - |
| 85 | - |
| 86 | - models = { |
| 87 | - 'auth.group': { |
| 88 | - 'Meta': {'object_name': 'Group'}, |
| 89 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 90 | - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), |
| 91 | - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) |
| 92 | - }, |
| 93 | - 'auth.permission': { |
| 94 | - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, |
| 95 | - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
| 96 | - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), |
| 97 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 98 | - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) |
| 99 | - }, |
| 100 | - 'auth.user': { |
| 101 | - 'Meta': {'object_name': 'User'}, |
| 102 | - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), |
| 103 | - 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}), |
| 104 | - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), |
| 105 | - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), |
| 106 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 107 | - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
| 108 | - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
| 109 | - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
| 110 | - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), |
| 111 | - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), |
| 112 | - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), |
| 113 | - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), |
| 114 | - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) |
| 115 | - }, |
| 116 | - 'contenttypes.contenttype': { |
| 117 | - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, |
| 118 | - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
| 119 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 120 | - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
| 121 | - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) |
| 122 | - }, |
| 123 | - u'maasserver.bootimage': { |
| 124 | - 'Meta': {'unique_together': "((u'nodegroup', u'architecture', u'subarchitecture', u'release', u'purpose'),)", 'object_name': 'BootImage'}, |
| 125 | - 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
| 126 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 127 | - 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}), |
| 128 | - 'purpose': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
| 129 | - 'release': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
| 130 | - 'subarchitecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}) |
| 131 | - }, |
| 132 | - u'maasserver.componenterror': { |
| 133 | - 'Meta': {'object_name': 'ComponentError'}, |
| 134 | - 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), |
| 135 | - 'created': ('django.db.models.fields.DateTimeField', [], {}), |
| 136 | - 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}), |
| 137 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 138 | - 'updated': ('django.db.models.fields.DateTimeField', [], {}) |
| 139 | - }, |
| 140 | - u'maasserver.config': { |
| 141 | - 'Meta': {'object_name': 'Config'}, |
| 142 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 143 | - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
| 144 | - 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'}) |
| 145 | - }, |
| 146 | - u'maasserver.dhcplease': { |
| 147 | - 'Meta': {'object_name': 'DHCPLease'}, |
| 148 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 149 | - 'ip': ('django.db.models.fields.IPAddressField', [], {'unique': 'True', 'max_length': '15'}), |
| 150 | - 'mac': ('maasserver.fields.MACAddressField', [], {}), |
| 151 | - 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}) |
| 152 | - }, |
| 153 | - u'maasserver.filestorage': { |
| 154 | - 'Meta': {'object_name': 'FileStorage'}, |
| 155 | - 'content': ('metadataserver.fields.BinaryField', [], {}), |
| 156 | - 'filename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), |
| 157 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) |
| 158 | - }, |
| 159 | - u'maasserver.macaddress': { |
| 160 | - 'Meta': {'object_name': 'MACAddress'}, |
| 161 | - 'created': ('django.db.models.fields.DateTimeField', [], {}), |
| 162 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 163 | - 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}), |
| 164 | - 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}), |
| 165 | - 'updated': ('django.db.models.fields.DateTimeField', [], {}) |
| 166 | - }, |
| 167 | - u'maasserver.node': { |
| 168 | - 'Meta': {'object_name': 'Node'}, |
| 169 | - 'after_commissioning_action': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
| 170 | - 'architecture': ('django.db.models.fields.CharField', [], {'default': "u'i386/generic'", 'max_length': '31'}), |
| 171 | - 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
| 172 | - 'created': ('django.db.models.fields.DateTimeField', [], {}), |
| 173 | - 'distro_series': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '10', 'null': 'True', 'blank': 'True'}), |
| 174 | - 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), |
| 175 | - 'hardware_details': ('maasserver.fields.XMLField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), |
| 176 | - 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), |
| 177 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 178 | - 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
| 179 | - 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
| 180 | - 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}), |
| 181 | - 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), |
| 182 | - 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}), |
| 183 | - 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}), |
| 184 | - 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}), |
| 185 | - 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-8b729164-2805-11e2-bc60-fa163e384ad1'", 'unique': 'True', 'max_length': '41'}), |
| 186 | - 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}), |
| 187 | - 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'null': 'True'}), |
| 188 | - 'updated': ('django.db.models.fields.DateTimeField', [], {}) |
| 189 | - }, |
| 190 | - u'maasserver.nodegroup': { |
| 191 | - 'Meta': {'object_name': 'NodeGroup'}, |
| 192 | - 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}), |
| 193 | - 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Token']", 'unique': 'True'}), |
| 194 | - 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}), |
| 195 | - 'created': ('django.db.models.fields.DateTimeField', [], {}), |
| 196 | - 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), |
| 197 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 198 | - 'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}), |
| 199 | - 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
| 200 | - 'updated': ('django.db.models.fields.DateTimeField', [], {}), |
| 201 | - 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'}) |
| 202 | - }, |
| 203 | - u'maasserver.nodegroupinterface': { |
| 204 | - 'Meta': {'unique_together': "((u'nodegroup', u'interface'),)", 'object_name': 'NodeGroupInterface'}, |
| 205 | - 'broadcast_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), |
| 206 | - 'created': ('django.db.models.fields.DateTimeField', [], {}), |
| 207 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 208 | - 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), |
| 209 | - 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}), |
| 210 | - 'ip_range_high': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), |
| 211 | - 'ip_range_low': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), |
| 212 | - 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
| 213 | - 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}), |
| 214 | - 'router_ip': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), |
| 215 | - 'subnet_mask': ('django.db.models.fields.GenericIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), |
| 216 | - 'updated': ('django.db.models.fields.DateTimeField', [], {}) |
| 217 | - }, |
| 218 | - u'maasserver.sshkey': { |
| 219 | - 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'}, |
| 220 | - 'created': ('django.db.models.fields.DateTimeField', [], {}), |
| 221 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 222 | - 'key': ('django.db.models.fields.TextField', [], {}), |
| 223 | - 'updated': ('django.db.models.fields.DateTimeField', [], {}), |
| 224 | - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) |
| 225 | - }, |
| 226 | - u'maasserver.tag': { |
| 227 | - 'Meta': {'object_name': 'Tag'}, |
| 228 | - 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), |
| 229 | - 'created': ('django.db.models.fields.DateTimeField', [], {}), |
| 230 | - 'definition': ('django.db.models.fields.TextField', [], {}), |
| 231 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 232 | - 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), |
| 233 | - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}), |
| 234 | - 'updated': ('django.db.models.fields.DateTimeField', [], {}) |
| 235 | - }, |
| 236 | - u'maasserver.userprofile': { |
| 237 | - 'Meta': {'object_name': 'UserProfile'}, |
| 238 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 239 | - 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}) |
| 240 | - }, |
| 241 | - 'piston.consumer': { |
| 242 | - 'Meta': {'object_name': 'Consumer'}, |
| 243 | - 'description': ('django.db.models.fields.TextField', [], {}), |
| 244 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 245 | - 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}), |
| 246 | - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
| 247 | - 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}), |
| 248 | - 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}), |
| 249 | - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': "orm['auth.User']"}) |
| 250 | - }, |
| 251 | - 'piston.token': { |
| 252 | - 'Meta': {'object_name': 'Token'}, |
| 253 | - 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), |
| 254 | - 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
| 255 | - 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['piston.Consumer']"}), |
| 256 | - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
| 257 | - 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
| 258 | - 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}), |
| 259 | - 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}), |
| 260 | - 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1352201505L'}), |
| 261 | - 'token_type': ('django.db.models.fields.IntegerField', [], {}), |
| 262 | - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': "orm['auth.User']"}), |
| 263 | - 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'}) |
| 264 | - } |
| 265 | - } |
| 266 | - |
| 267 | - complete_apps = ['maasserver'] |
| 268 | |
| 269 | === modified file 'src/maasserver/models/node.py' |
| 270 | --- src/maasserver/models/node.py 2012-11-07 12:49:58 +0000 |
| 271 | +++ src/maasserver/models/node.py 2012-11-08 09:21:26 +0000 |
| 272 | @@ -67,10 +67,7 @@ |
| 273 | get_db_state, |
| 274 | strip_domain, |
| 275 | ) |
| 276 | -from maasserver.utils.orm import ( |
| 277 | - get_first, |
| 278 | - get_one, |
| 279 | - ) |
| 280 | +from maasserver.utils.orm import get_first |
| 281 | from piston.models import Token |
| 282 | from provisioningserver.enum import ( |
| 283 | POWER_TYPE, |
| 284 | @@ -697,26 +694,6 @@ |
| 285 | else: |
| 286 | return None |
| 287 | |
| 288 | - def get_effective_kernel_options(self): |
| 289 | - """Determine any special kernel parameters for this node. |
| 290 | - |
| 291 | - :return: (tag, kernel_options) |
| 292 | - tag is a Tag object or None. If None, the kernel_options came from |
| 293 | - the global setting. |
| 294 | - kernel_options, a string indicating extra kernel_options that |
| 295 | - should be used when booting this node. May be None if no tags match |
| 296 | - and no global setting has been configured. |
| 297 | - """ |
| 298 | - # First, see if there are any tags associated with this node that has a |
| 299 | - # custom kernel parameter |
| 300 | - tags = self.tags.filter(kernel_opts__isnull=False) |
| 301 | - tags = tags.order_by('name')[:1] |
| 302 | - tag = get_one(tags) |
| 303 | - if tag is not None: |
| 304 | - return tag, tag.kernel_opts |
| 305 | - global_value = Config.objects.get_config('kernel_opts') |
| 306 | - return None, global_value |
| 307 | - |
| 308 | @property |
| 309 | def work_queue(self): |
| 310 | """The name of the queue for tasks specific to this node.""" |
| 311 | |
| 312 | === modified file 'src/maasserver/models/tag.py' |
| 313 | --- src/maasserver/models/tag.py 2012-11-07 11:16:43 +0000 |
| 314 | +++ src/maasserver/models/tag.py 2012-11-08 09:21:26 +0000 |
| 315 | @@ -89,8 +89,6 @@ |
| 316 | tag. |
| 317 | :ivar comment: A long-form description for humans about what this tag is |
| 318 | trying to accomplish. |
| 319 | - :ivar kernel_opts: Optional kernel command-line parameters string to be |
| 320 | - used in the PXE config for nodes with this tags. |
| 321 | :ivar objects: The :class:`TagManager`. |
| 322 | """ |
| 323 | |
| 324 | @@ -103,7 +101,6 @@ |
| 325 | validators=[RegexValidator(_tag_name_regex)]) |
| 326 | definition = TextField(blank=True) |
| 327 | comment = TextField(blank=True) |
| 328 | - kernel_opts = TextField(blank=True, null=True) |
| 329 | |
| 330 | objects = TagManager() |
| 331 | |
| 332 | |
| 333 | === modified file 'src/maasserver/testing/factory.py' |
| 334 | --- src/maasserver/testing/factory.py 2012-11-07 10:35:57 +0000 |
| 335 | +++ src/maasserver/testing/factory.py 2012-11-08 09:21:26 +0000 |
| 336 | @@ -251,15 +251,14 @@ |
| 337 | key.save() |
| 338 | return key |
| 339 | |
| 340 | - def make_tag(self, name=None, definition=None, comment='', |
| 341 | - kernel_opts=None, created=None, updated=None): |
| 342 | + def make_tag(self, name=None, definition=None, comment='', created=None, |
| 343 | + updated=None): |
| 344 | if name is None: |
| 345 | name = self.make_name('tag') |
| 346 | if definition is None: |
| 347 | # Is there a 'node' in this xml? |
| 348 | definition = '//node' |
| 349 | - tag = Tag(name=name, definition=definition, comment=comment, |
| 350 | - kernel_opts=kernel_opts) |
| 351 | + tag = Tag(name=name, definition=definition, comment=comment) |
| 352 | self._save_node_unchecked(tag) |
| 353 | # Update the 'updated'/'created' fields with a call to 'update' |
| 354 | # preventing a call to save() from overriding the values. |
| 355 | |
| 356 | === modified file 'src/maasserver/tests/test_api.py' |
| 357 | --- src/maasserver/tests/test_api.py 2012-11-08 06:40:03 +0000 |
| 358 | +++ src/maasserver/tests/test_api.py 2012-11-08 09:21:26 +0000 |
| 359 | @@ -2999,30 +2999,6 @@ |
| 360 | % (invalid,)) |
| 361 | self.assertFalse(Tag.objects.filter(name=invalid).exists()) |
| 362 | |
| 363 | - def test_POST_new_kernel_opts(self): |
| 364 | - self.become_admin() |
| 365 | - name = factory.getRandomString() |
| 366 | - definition = '//node' |
| 367 | - comment = factory.getRandomString() |
| 368 | - extra_kernel_opts = factory.getRandomString() |
| 369 | - response = self.client.post( |
| 370 | - self.get_uri('tags/'), |
| 371 | - { |
| 372 | - 'op': 'new', |
| 373 | - 'name': name, |
| 374 | - 'comment': comment, |
| 375 | - 'definition': definition, |
| 376 | - 'kernel_opts': extra_kernel_opts, |
| 377 | - }) |
| 378 | - self.assertEqual(httplib.OK, response.status_code) |
| 379 | - parsed_result = json.loads(response.content) |
| 380 | - self.assertEqual(name, parsed_result['name']) |
| 381 | - self.assertEqual(comment, parsed_result['comment']) |
| 382 | - self.assertEqual(definition, parsed_result['definition']) |
| 383 | - self.assertEqual(extra_kernel_opts, parsed_result['kernel_opts']) |
| 384 | - self.assertEqual( |
| 385 | - extra_kernel_opts, Tag.objects.filter(name=name)[0].kernel_opts) |
| 386 | - |
| 387 | def test_POST_new_populates_nodes(self): |
| 388 | self.become_admin() |
| 389 | node1 = factory.make_node() |
| 390 | @@ -3386,23 +3362,6 @@ |
| 391 | kernel_params = KernelParameters(**self.get_pxeconfig(params)) |
| 392 | self.assertEqual(params["local"], kernel_params.fs_host) |
| 393 | |
| 394 | - def test_pxeconfig_returns_extra_kernel_options(self): |
| 395 | - node = factory.make_node() |
| 396 | - extra_kernel_opts = factory.getRandomString() |
| 397 | - Config.objects.set_config('kernel_opts', extra_kernel_opts) |
| 398 | - mac = factory.make_mac_address(node=node) |
| 399 | - params = self.get_default_params() |
| 400 | - params['mac'] = mac.mac_address |
| 401 | - pxe_config = self.get_pxeconfig(params) |
| 402 | - self.assertEqual(extra_kernel_opts, pxe_config['extra_opts']) |
| 403 | - |
| 404 | - def test_pxeconfig_returns_None_for_extra_kernel_opts(self): |
| 405 | - mac = factory.make_mac_address() |
| 406 | - params = self.get_default_params() |
| 407 | - params['mac'] = mac.mac_address |
| 408 | - pxe_config = self.get_pxeconfig(params) |
| 409 | - self.assertEqual(None, pxe_config['extra_opts']) |
| 410 | - |
| 411 | |
| 412 | class TestNodeGroupsAPI(APIv10TestMixin, MultipleUsersScenarios, TestCase): |
| 413 | scenarios = [ |
| 414 | |
| 415 | === modified file 'src/maasserver/tests/test_node.py' |
| 416 | --- src/maasserver/tests/test_node.py 2012-11-08 06:40:03 +0000 |
| 417 | +++ src/maasserver/tests/test_node.py 2012-11-08 09:21:26 +0000 |
| 418 | @@ -303,62 +303,6 @@ |
| 419 | successful_types = [node_power_types[node] for node in started_nodes] |
| 420 | self.assertItemsEqual(configless_power_types, successful_types) |
| 421 | |
| 422 | - def test_get_effective_kernel_options_with_nothing_set(self): |
| 423 | - node = factory.make_node() |
| 424 | - self.assertEqual((None, None), node.get_effective_kernel_options()) |
| 425 | - |
| 426 | - def test_get_effective_kernel_options_sees_global_config(self): |
| 427 | - node = factory.make_node() |
| 428 | - kernel_opts = factory.getRandomString() |
| 429 | - Config.objects.set_config('kernel_opts', kernel_opts) |
| 430 | - self.assertEqual( |
| 431 | - (None, kernel_opts), node.get_effective_kernel_options()) |
| 432 | - |
| 433 | - def test_get_effective_kernel_options_not_confused_by_empty_tag(self): |
| 434 | - node = factory.make_node() |
| 435 | - tag = factory.make_tag() |
| 436 | - node.tags.add(tag) |
| 437 | - kernel_opts = factory.getRandomString() |
| 438 | - Config.objects.set_config('kernel_opts', kernel_opts) |
| 439 | - self.assertEqual( |
| 440 | - (None, kernel_opts), node.get_effective_kernel_options()) |
| 441 | - |
| 442 | - def test_get_effective_kernel_options_ignores_unassociated_tag_value(self): |
| 443 | - node = factory.make_node() |
| 444 | - factory.make_tag(kernel_opts=factory.getRandomString()) |
| 445 | - self.assertEqual((None, None), node.get_effective_kernel_options()) |
| 446 | - |
| 447 | - def test_get_effective_kernel_options_uses_tag_value(self): |
| 448 | - node = factory.make_node() |
| 449 | - tag = factory.make_tag(kernel_opts=factory.getRandomString()) |
| 450 | - node.tags.add(tag) |
| 451 | - self.assertEqual( |
| 452 | - (tag, tag.kernel_opts), node.get_effective_kernel_options()) |
| 453 | - |
| 454 | - def test_get_effective_kernel_options_tag_overrides_global(self): |
| 455 | - node = factory.make_node() |
| 456 | - global_opts = factory.getRandomString() |
| 457 | - Config.objects.set_config('kernel_opts', global_opts) |
| 458 | - tag = factory.make_tag(kernel_opts=factory.getRandomString()) |
| 459 | - node.tags.add(tag) |
| 460 | - self.assertEqual( |
| 461 | - (tag, tag.kernel_opts), node.get_effective_kernel_options()) |
| 462 | - |
| 463 | - def test_get_effective_kernel_options_uses_first_real_tag_value(self): |
| 464 | - node = factory.make_node() |
| 465 | - # Intentionally create them in reverse order, so the default 'db' order |
| 466 | - # doesn't work, and we have asserted that we sort them. |
| 467 | - tag3 = factory.make_tag(factory.make_name('tag-03-'), |
| 468 | - kernel_opts=factory.getRandomString()) |
| 469 | - tag2 = factory.make_tag(factory.make_name('tag-02-'), |
| 470 | - kernel_opts=factory.getRandomString()) |
| 471 | - tag1 = factory.make_tag(factory.make_name('tag-01-'), kernel_opts=None) |
| 472 | - self.assertTrue(tag1.name < tag2.name) |
| 473 | - self.assertTrue(tag2.name < tag3.name) |
| 474 | - node.tags.add(tag1, tag2, tag3) |
| 475 | - self.assertEqual( |
| 476 | - (tag2, tag2.kernel_opts), node.get_effective_kernel_options()) |
| 477 | - |
| 478 | def test_acquire(self): |
| 479 | node = factory.make_node(status=NODE_STATUS.READY) |
| 480 | user = factory.make_user() |
| 481 | |
| 482 | === modified file 'src/maasserver/tests/test_tag.py' |
| 483 | --- src/maasserver/tests/test_tag.py 2012-11-07 10:35:57 +0000 |
| 484 | +++ src/maasserver/tests/test_tag.py 2012-11-08 09:21:26 +0000 |
| 485 | @@ -29,16 +29,6 @@ |
| 486 | self.assertEqual('tag-name', tag.name) |
| 487 | self.assertEqual('//node[@id=display]', tag.definition) |
| 488 | self.assertEqual('', tag.comment) |
| 489 | - self.assertIs(None, tag.kernel_opts) |
| 490 | - self.assertIsNot(None, tag.updated) |
| 491 | - self.assertIsNot(None, tag.created) |
| 492 | - |
| 493 | - def test_factory_make_tag_with_hardware_details(self): |
| 494 | - tag = factory.make_tag('a-tag', 'true', kernel_opts="console=ttyS0") |
| 495 | - self.assertEqual('a-tag', tag.name) |
| 496 | - self.assertEqual('true', tag.definition) |
| 497 | - self.assertEqual('', tag.comment) |
| 498 | - self.assertEqual('console=ttyS0', tag.kernel_opts) |
| 499 | self.assertIsNot(None, tag.updated) |
| 500 | self.assertIsNot(None, tag.created) |
| 501 | |
| 502 | |
| 503 | === modified file 'src/provisioningserver/kernel_opts.py' |
| 504 | --- src/provisioningserver/kernel_opts.py 2012-11-08 06:40:03 +0000 |
| 505 | +++ src/provisioningserver/kernel_opts.py 2012-11-08 09:21:26 +0000 |
| 506 | @@ -37,8 +37,6 @@ |
| 507 | "preseed_url", # URL from which a preseed can be obtained. |
| 508 | "log_host", # Host/IP to which syslog can be streamed. |
| 509 | "fs_host", # Host/IP on which ephemeral filesystems are hosted. |
| 510 | - "extra_opts", # String of extra options to supply, will be appended |
| 511 | - # verbatim to the kernel command line |
| 512 | )) |
| 513 | |
| 514 | |
| 515 | @@ -178,6 +176,4 @@ |
| 516 | # as it would be nice to have. |
| 517 | options += compose_logging_opts(params.log_host) |
| 518 | options += compose_arch_opts(params) |
| 519 | - if params.extra_opts: |
| 520 | - options.append(params.extra_opts) |
| 521 | return ' '.join(options) |
| 522 | |
| 523 | === modified file 'src/provisioningserver/tests/test_kernel_opts.py' |
| 524 | --- src/provisioningserver/tests/test_kernel_opts.py 2012-11-08 06:40:03 +0000 |
| 525 | +++ src/provisioningserver/tests/test_kernel_opts.py 2012-11-08 09:21:26 +0000 |
| 526 | @@ -133,19 +133,6 @@ |
| 527 | "overlayroot=tmpfs", |
| 528 | "ip=::::%s:BOOTIF" % params.hostname])) |
| 529 | |
| 530 | - def test_commissioning_compose_kernel_command_line_inc_extra_opts(self): |
| 531 | - extra_opts = "special console=ABCD -- options to pass" |
| 532 | - params = make_kernel_parameters(extra_opts=extra_opts) |
| 533 | - cmdline = compose_kernel_command_line(params) |
| 534 | - # There should be a blank space before the options, but otherwise added |
| 535 | - # verbatim. |
| 536 | - self.assertThat(cmdline, Contains(' ' + extra_opts)) |
| 537 | - |
| 538 | - def test_commissioning_compose_kernel_handles_extra_opts_None(self): |
| 539 | - params = make_kernel_parameters(extra_opts=None) |
| 540 | - cmdline = compose_kernel_command_line(params) |
| 541 | - self.assertNotIn(cmdline, "None") |
| 542 | - |
| 543 | def test_compose_kernel_command_line_inc_common_opts(self): |
| 544 | # Test that some kernel arguments appear on both commissioning |
| 545 | # and install command lines. |


Nothing obviously bad. Removing a schema migration is a little dodgy, but I guess we just tell anyone with a 1.2 development branch that they need to `rm -rf db && make syncdb`.