Merge lp:~rvb/maas/bug-1104215-1.2 into lp:maas/1.2

Proposed by Raphaël Badin
Status: Merged
Approved by: Raphaël Badin
Approved revision: no longer in the source branch.
Merged at revision: 1351
Proposed branch: lp:~rvb/maas/bug-1104215-1.2
Merge into: lp:maas/1.2
Diff against target: 219 lines (+103/-3)
5 files modified
src/maas/settings.py (+5/-0)
src/maasserver/api.py (+16/-2)
src/maasserver/tests/test_api.py (+32/-1)
src/maasserver/utils/__init__.py (+23/-0)
src/maasserver/utils/tests/test_utils.py (+27/-0)
To merge this branch: bzr merge lp:~rvb/maas/bug-1104215-1.2
Reviewer Review Type Date Requested Status
Raphaël Badin (community) Approve
Review via email: mp+145641@code.launchpad.net

Commit message

Backport revision 1426.

To post a comment you must log in.
Revision history for this message
Raphaël Badin (rvb) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maas/settings.py'
--- src/maas/settings.py 2012-12-03 05:42:24 +0000
+++ src/maas/settings.py 2013-01-30 16:03:23 +0000
@@ -85,6 +85,11 @@
85# maasserver.middleware.APIErrorsMiddleware)85# maasserver.middleware.APIErrorsMiddleware)
86PISTON_DISPLAY_ERRORS = False86PISTON_DISPLAY_ERRORS = False
8787
88# Location of the local cluster config file (installed by
89# the package maas-cluster-controller). Use to distinguish the local cluster
90# from the others.
91LOCAL_CLUSTER_CONFIG = "/etc/maas/maas_cluster.conf"
92
88TEMPLATE_DEBUG = DEBUG93TEMPLATE_DEBUG = DEBUG
8994
90# Set this to where RaphaelJS files can be found.95# Set this to where RaphaelJS files can be found.
9196
=== modified file 'src/maasserver/api.py'
--- src/maasserver/api.py 2013-01-16 11:12:48 +0000
+++ src/maasserver/api.py 2013-01-30 16:03:23 +0000
@@ -168,6 +168,7 @@
168 absolute_reverse,168 absolute_reverse,
169 build_absolute_uri,169 build_absolute_uri,
170 find_nodegroup,170 find_nodegroup,
171 is_local_cluster_UUID,
171 map_enum,172 map_enum,
172 strip_domain,173 strip_domain,
173 )174 )
@@ -1156,17 +1157,30 @@
1156 "eth0"}]'1157 "eth0"}]'
1157 """1158 """
1158 uuid = get_mandatory_param(request.data, 'uuid')1159 uuid = get_mandatory_param(request.data, 'uuid')
1160 is_local_cluster = is_local_cluster_UUID(uuid)
1159 existing_nodegroup = get_one(NodeGroup.objects.filter(uuid=uuid))1161 existing_nodegroup = get_one(NodeGroup.objects.filter(uuid=uuid))
1160 if existing_nodegroup is None:1162 if existing_nodegroup is None:
1161 master = NodeGroup.objects.ensure_master()1163 master = NodeGroup.objects.ensure_master()
1162 # Does master.uuid look like it's a proper uuid?1164 # Does master.uuid look like it's a proper uuid?
1163 if master.uuid in ('master', ''):1165 if master.uuid in ('master', ''):
1164 # Master nodegroup not yet configured, configure it.1166 # Master nodegroup not yet configured, configure it.
1167 if is_local_cluster:
1168 # Connecting from localhost, accept the cluster
1169 # controller.
1170 status = NODEGROUP_STATUS.ACCEPTED
1171 else:
1172 # Connecting remotely, mark the cluster as pending.
1173 status = NODEGROUP_STATUS.PENDING
1165 form = NodeGroupWithInterfacesForm(1174 form = NodeGroupWithInterfacesForm(
1166 data=request.data, instance=master)1175 data=request.data, status=status, instance=master)
1167 if form.is_valid():1176 if form.is_valid():
1168 form.save()1177 form.save()
1169 return get_celery_credentials()1178 if status == NODEGROUP_STATUS.ACCEPTED:
1179 return get_celery_credentials()
1180 else:
1181 return HttpResponse(
1182 "Cluster registered. Awaiting admin approval.",
1183 status=httplib.ACCEPTED)
1170 else:1184 else:
1171 raise ValidationError(form.errors)1185 raise ValidationError(form.errors)
1172 else:1186 else:
11731187
=== modified file 'src/maasserver/tests/test_api.py'
--- src/maasserver/tests/test_api.py 2013-01-16 11:12:48 +0000
+++ src/maasserver/tests/test_api.py 2013-01-30 16:03:23 +0000
@@ -32,6 +32,7 @@
32import random32import random
33import shutil33import shutil
34import sys34import sys
35from textwrap import dedent
35from urlparse import urlparse36from urlparse import urlparse
3637
37from apiclient.maas_client import MAASClient38from apiclient.maas_client import MAASClient
@@ -3718,9 +3719,20 @@
3718 # validated by an admin.3719 # validated by an admin.
3719 self.assertEqual(httplib.ACCEPTED, response.status_code)3720 self.assertEqual(httplib.ACCEPTED, response.status_code)
37203721
3721 def test_register_nodegroup_returns_credentials_if_master(self):3722 def setup_local_cluster_config(self, uuid):
3723 # Helper to get settings.LOCAL_CLUSTER_CONFIG to point to a valid
3724 # cluster config file with CLUSTER_UUID set to the given uuid.
3725 contents = dedent("""
3726 MAAS_URL=http://localhost/MAAS
3727 CLUSTER_UUID="%s"
3728 """ % uuid)
3729 file_name = self.make_file(contents=contents)
3730 self.patch(settings, 'LOCAL_CLUSTER_CONFIG', file_name)
3731
3732 def test_register_nodegroup_returns_credentials_if_local_cluster(self):
3722 name = factory.make_name('name')3733 name = factory.make_name('name')
3723 uuid = factory.getRandomUUID()3734 uuid = factory.getRandomUUID()
3735 self.setup_local_cluster_config(uuid)
3724 fake_broker_url = factory.make_name('fake-broker_url')3736 fake_broker_url = factory.make_name('fake-broker_url')
3725 celery_conf = app_or_default().conf3737 celery_conf = app_or_default().conf
3726 self.patch(celery_conf, 'BROKER_URL', fake_broker_url)3738 self.patch(celery_conf, 'BROKER_URL', fake_broker_url)
@@ -3737,9 +3749,27 @@
3737 ({'BROKER_URL': fake_broker_url}, uuid),3749 ({'BROKER_URL': fake_broker_url}, uuid),
3738 (parsed_result, NodeGroup.objects.ensure_master().uuid))3750 (parsed_result, NodeGroup.objects.ensure_master().uuid))
37393751
3752 def test_register_nodegroup_gets_accepted_if_not_local_cluster(self):
3753 name = factory.make_name('name')
3754 uuid = factory.getRandomUUID()
3755 fake_broker_url = factory.make_name('fake-broker_url')
3756 celery_conf = app_or_default().conf
3757 self.patch(celery_conf, 'BROKER_URL', fake_broker_url)
3758 response = self.client.post(
3759 reverse('nodegroups_handler'),
3760 {
3761 'op': 'register',
3762 'name': name,
3763 'uuid': uuid,
3764 })
3765 self.assertEqual(httplib.ACCEPTED, response.status_code, response)
3766 self.assertEqual(
3767 response.content, "Cluster registered. Awaiting admin approval.")
3768
3740 def test_register_nodegroup_configures_master_if_unconfigured(self):3769 def test_register_nodegroup_configures_master_if_unconfigured(self):
3741 name = factory.make_name('nodegroup')3770 name = factory.make_name('nodegroup')
3742 uuid = factory.getRandomUUID()3771 uuid = factory.getRandomUUID()
3772 self.setup_local_cluster_config(uuid)
3743 interface = make_interface_settings()3773 interface = make_interface_settings()
3744 self.client.post(3774 self.client.post(
3745 reverse('nodegroups_handler'),3775 reverse('nodegroups_handler'),
@@ -3758,6 +3788,7 @@
37583788
3759 def test_register_nodegroup_uses_default_zone_name(self):3789 def test_register_nodegroup_uses_default_zone_name(self):
3760 uuid = factory.getRandomUUID()3790 uuid = factory.getRandomUUID()
3791 self.setup_local_cluster_config(uuid)
3761 self.client.post(3792 self.client.post(
3762 reverse('nodegroups_handler'),3793 reverse('nodegroups_handler'),
3763 {3794 {
37643795
=== modified file 'src/maasserver/utils/__init__.py'
--- src/maasserver/utils/__init__.py 2012-12-04 16:23:12 +0000
+++ src/maasserver/utils/__init__.py 2013-01-30 16:03:23 +0000
@@ -16,10 +16,13 @@
16 'find_nodegroup',16 'find_nodegroup',
17 'get_db_state',17 'get_db_state',
18 'ignore_unused',18 'ignore_unused',
19 'is_local_cluster_UUID',
19 'map_enum',20 'map_enum',
20 'strip_domain',21 'strip_domain',
21 ]22 ]
2223
24import errno
25import re
23from urllib import urlencode26from urllib import urlencode
24from urlparse import urljoin27from urlparse import urljoin
2528
@@ -110,6 +113,26 @@
110 return hostname.split('.', 1)[0]113 return hostname.split('.', 1)[0]
111114
112115
116def is_local_cluster_UUID(uuid):
117 """Return whether the given UUID is the UUID of the local cluster."""
118 try:
119 cluster_config = open(settings.LOCAL_CLUSTER_CONFIG).read()
120 match = re.search(
121 "CLUSTER_UUID=(?P<quote>[\"']?)([^\"']+)(?P=quote)",
122 cluster_config)
123 if match is not None:
124 return uuid == match.groups()[1]
125 else:
126 return False
127 except IOError as error:
128 if error.errno == errno.ENOENT:
129 # Cluster config file is not present.
130 return False
131 else:
132 # Anything else is an error.
133 raise
134
135
113def find_nodegroup(request):136def find_nodegroup(request):
114 """Find the nodegroup whose subnet contains the IP Address of the137 """Find the nodegroup whose subnet contains the IP Address of the
115 originating host of the request..138 originating host of the request..
116139
=== modified file 'src/maasserver/utils/tests/test_utils.py'
--- src/maasserver/utils/tests/test_utils.py 2012-12-04 16:23:12 +0000
+++ src/maasserver/utils/tests/test_utils.py 2013-01-30 16:03:23 +0000
@@ -34,6 +34,7 @@
34 build_absolute_uri,34 build_absolute_uri,
35 find_nodegroup,35 find_nodegroup,
36 get_db_state,36 get_db_state,
37 is_local_cluster_UUID,
37 map_enum,38 map_enum,
38 strip_domain,39 strip_domain,
39 )40 )
@@ -194,6 +195,32 @@
194 self.assertEqual(results, map(strip_domain, inputs))195 self.assertEqual(results, map(strip_domain, inputs))
195196
196197
198class TestIsLocalClusterUUID(TestCase):
199
200 def test_is_local_cluster_UUID_returns_false_if_no_config_file(self):
201 bogus_file_name = '/tmp/bogus/%s' % factory.make_name('name')
202 self.patch(settings, 'LOCAL_CLUSTER_CONFIG', bogus_file_name)
203 self.assertFalse(is_local_cluster_UUID(factory.getRandomUUID()))
204
205 def test_is_local_cluster_UUID_returns_false_if_parsing_fails(self):
206 file_name = self.make_file(contents="wrong content")
207 self.patch(settings, 'LOCAL_CLUSTER_CONFIG', file_name)
208 self.assertFalse(is_local_cluster_UUID(factory.getRandomUUID()))
209
210 def test_is_local_cluster_UUID_returns_false_if_wrong_UUID(self):
211 uuid = factory.getRandomUUID()
212 other_uuid = factory.getRandomUUID()
213 file_name = self.make_file(contents='CLUSTER_UUID="%s"' % other_uuid)
214 self.patch(settings, 'LOCAL_CLUSTER_CONFIG', file_name)
215 self.assertFalse(is_local_cluster_UUID(uuid))
216
217 def test_is_local_cluster_UUID_returns_true_if_local_UUID(self):
218 uuid = factory.getRandomUUID()
219 file_name = self.make_file(contents='CLUSTER_UUID="%s"' % uuid)
220 self.patch(settings, 'LOCAL_CLUSTER_CONFIG', file_name)
221 self.assertTrue(is_local_cluster_UUID(uuid))
222
223
197def get_request(origin_ip):224def get_request(origin_ip):
198 return RequestFactory().post('/', REMOTE_ADDR=origin_ip)225 return RequestFactory().post('/', REMOTE_ADDR=origin_ip)
199226

Subscribers

People subscribed via source and target branches

to status/vote changes: