Merge lp:~jameinel/maas/1.2-remove-kernel-opts into lp:maas/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
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.
Revision history for this message
Martin Packman (gz) wrote :

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`.

review: Approve

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.

Subscribers

People subscribed via source and target branches

to status/vote changes: