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
Status: | Merged |
---|---|
Approved by: | John A Meinel |
Approved revision: | no longer in the source branch. |
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) | Approve | ||
Review via email: mp+133425@code.launchpad.net |
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`.