Merge lp:~gmb/maas/enlist-uscm-to-RPC into lp:~maas-committers/maas/trunk

Proposed by Graham Binns
Status: Superseded
Proposed branch: lp:~gmb/maas/enlist-uscm-to-RPC
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 354 lines (+234/-30)
6 files modified
src/maasserver/models/nodegroup.py (+30/-8)
src/maasserver/models/tests/test_nodegroup.py (+100/-0)
src/provisioningserver/rpc/cluster.py (+28/-0)
src/provisioningserver/rpc/clusterservice.py (+22/-0)
src/provisioningserver/rpc/tests/test_clusterservice.py (+54/-0)
src/provisioningserver/tasks.py (+0/-22)
To merge this branch: bzr merge lp:~gmb/maas/enlist-uscm-to-RPC
Reviewer Review Type Date Requested Status
MAAS Maintainers Pending
Review via email: mp+234284@code.launchpad.net

This proposal has been superseded by a proposal from 2014-09-11.

Commit message

Convert the enlist_nodes_from_ucsm() celery task to use RPC.

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
=== modified file 'src/maasserver/models/nodegroup.py'
--- src/maasserver/models/nodegroup.py 2014-09-10 16:01:38 +0000
+++ src/maasserver/models/nodegroup.py 2014-09-11 10:17:45 +0000
@@ -41,13 +41,11 @@
41from provisioningserver.rpc.cluster import (41from provisioningserver.rpc.cluster import (
42 AddSeaMicro15k,42 AddSeaMicro15k,
43 AddVirsh,43 AddVirsh,
44 EnlistNodesFromMSCM,
45 EnlistNodesFromUCSM,
44 ImportBootImages,46 ImportBootImages,
45 )47 )
46from provisioningserver.rpc.exceptions import NoConnectionsAvailable48from provisioningserver.rpc.exceptions import NoConnectionsAvailable
47from provisioningserver.tasks import (
48 enlist_nodes_from_mscm,
49 enlist_nodes_from_ucsm,
50 )
5149
5250
53class NodeGroupManager(Manager):51class NodeGroupManager(Manager):
@@ -304,9 +302,21 @@
304 :param URL: URL of the Cisco UCS Manager HTTP-XML API.302 :param URL: URL of the Cisco UCS Manager HTTP-XML API.
305 :param username: username for UCS Manager.303 :param username: username for UCS Manager.
306 :param password: password for UCS Manager.304 :param password: password for UCS Manager.
305
306 :raises NoConnectionsAvailable: If no connections to the cluster
307 are available.
307 """308 """
308 args = (url, username, password)309 try:
309 enlist_nodes_from_ucsm.apply_async(queue=self.uuid, args=args)310 client = getClientFor(self.uuid, timeout=1)
311 except NoConnectionsAvailable:
312 # No connection to the cluster so we can't do anything. We
313 # let the caller handle the error, since we don't want to
314 # just drop it.
315 raise
316 else:
317 return client(
318 EnlistNodesFromUCSM, url=url, username=username,
319 password=password)
310320
311 def enlist_nodes_from_mscm(self, host, username, password):321 def enlist_nodes_from_mscm(self, host, username, password):
312 """ Add the servers from a Moonshot HP iLO Chassis Manager.322 """ Add the servers from a Moonshot HP iLO Chassis Manager.
@@ -314,6 +324,18 @@
314 :param host: IP address for the MSCM.324 :param host: IP address for the MSCM.
315 :param username: username for MSCM.325 :param username: username for MSCM.
316 :param password: password for MSCM.326 :param password: password for MSCM.
327
328 :raises NoConnectionsAvailable: If no connections to the cluster
329 are available.
317 """330 """
318 args = (host, username, password)331 try:
319 enlist_nodes_from_mscm.apply_async(queue=self.uuid, args=args)332 client = getClientFor(self.uuid, timeout=1)
333 except NoConnectionsAvailable:
334 # No connection to the cluster so we can't do anything. We
335 # let the caller handle the error, since we don't want to
336 # just drop it.
337 raise
338 else:
339 return client(
340 EnlistNodesFromMSCM, host=host, username=username,
341 password=password)
320342
=== modified file 'src/maasserver/models/tests/test_nodegroup.py'
--- src/maasserver/models/tests/test_nodegroup.py 2014-09-10 16:01:38 +0000
+++ src/maasserver/models/tests/test_nodegroup.py 2014-09-11 10:17:45 +0000
@@ -49,6 +49,8 @@
49from provisioningserver.rpc.cluster import (49from provisioningserver.rpc.cluster import (
50 AddSeaMicro15k,50 AddSeaMicro15k,
51 AddVirsh,51 AddVirsh,
52 EnlistNodesFromMSCM,
53 EnlistNodesFromUCSM,
52 ImportBootImages,54 ImportBootImages,
53 )55 )
54from provisioningserver.rpc.exceptions import NoConnectionsAvailable56from provisioningserver.rpc.exceptions import NoConnectionsAvailable
@@ -513,3 +515,101 @@
513 self.assertRaises(515 self.assertRaises(
514 NoConnectionsAvailable, nodegroup.add_seamicro15k,516 NoConnectionsAvailable, nodegroup.add_seamicro15k,
515 mac, username, password, power_control)517 mac, username, password, power_control)
518
519 def test_enlist_nodes_from_mscm_end_to_end(self):
520 nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ACCEPTED)
521
522 self.useFixture(RegionEventLoopFixture("rpc"))
523 self.useFixture(RunningEventLoopFixture())
524 fixture = self.useFixture(MockLiveRegionToClusterRPCFixture())
525 protocol = fixture.makeCluster(nodegroup, EnlistNodesFromMSCM)
526 protocol.EnlistNodesFromMSCM.return_value = defer.succeed({})
527
528 host = factory.make_name('host')
529 username = factory.make_name('user')
530 password = factory.make_name('password')
531 nodegroup.enlist_nodes_from_mscm(
532 host, username, password).wait(10)
533
534 self.expectThat(
535 protocol.EnlistNodesFromMSCM,
536 MockCalledOnceWith(
537 ANY, host=host, username=username, password=password))
538
539 def test_enlist_nodes_from_mscm_calls_client_with_resource_endpoint(self):
540 getClientFor = self.patch(nodegroup_module, 'getClientFor')
541 client = getClientFor.return_value
542 nodegroup = factory.make_NodeGroup()
543
544 host = factory.make_name('host')
545 username = factory.make_name('user')
546 password = factory.make_name('password')
547 nodegroup.enlist_nodes_from_mscm(
548 host, username, password).wait(10)
549
550 self.expectThat(
551 client,
552 MockCalledOnceWith(
553 EnlistNodesFromMSCM, host=host, username=username,
554 password=password))
555
556 def test_enlist_nodes_from_mscm_raises_if_no_connection_to_cluster(self):
557 getClientFor = self.patch(nodegroup_module, 'getClientFor')
558 getClientFor.side_effect = NoConnectionsAvailable()
559 nodegroup = factory.make_NodeGroup()
560
561 host = factory.make_name('host')
562 username = factory.make_name('user')
563 password = factory.make_name('password')
564 self.assertRaises(
565 NoConnectionsAvailable, nodegroup.enlist_nodes_from_mscm,
566 host, username, password)
567
568 def test_enlist_nodes_from_ucsm_end_to_end(self):
569 nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ACCEPTED)
570
571 self.useFixture(RegionEventLoopFixture("rpc"))
572 self.useFixture(RunningEventLoopFixture())
573 fixture = self.useFixture(MockLiveRegionToClusterRPCFixture())
574 protocol = fixture.makeCluster(nodegroup, EnlistNodesFromUCSM)
575 protocol.EnlistNodesFromUCSM.return_value = defer.succeed({})
576
577 url = factory.make_url()
578 username = factory.make_name('user')
579 password = factory.make_name('password')
580 nodegroup.enlist_nodes_from_ucsm(
581 url, username, password).wait(10)
582
583 self.expectThat(
584 protocol.EnlistNodesFromUCSM,
585 MockCalledOnceWith(
586 ANY, url=url, username=username, password=password))
587
588 def test_enlist_nodes_from_ucsm_calls_client_with_resource_endpoint(self):
589 getClientFor = self.patch(nodegroup_module, 'getClientFor')
590 client = getClientFor.return_value
591 nodegroup = factory.make_NodeGroup()
592
593 url = factory.make_url()
594 username = factory.make_name('user')
595 password = factory.make_name('password')
596 nodegroup.enlist_nodes_from_ucsm(
597 url, username, password).wait(10)
598
599 self.expectThat(
600 client,
601 MockCalledOnceWith(
602 EnlistNodesFromUCSM, url=url, username=username,
603 password=password))
604
605 def test_enlist_nodes_from_ucsm_raises_if_no_connection_to_cluster(self):
606 getClientFor = self.patch(nodegroup_module, 'getClientFor')
607 getClientFor.side_effect = NoConnectionsAvailable()
608 nodegroup = factory.make_NodeGroup()
609
610 url = factory.make_url()
611 username = factory.make_name('user')
612 password = factory.make_name('password')
613 self.assertRaises(
614 NoConnectionsAvailable, nodegroup.enlist_nodes_from_ucsm,
615 url, username, password)
516616
=== modified file 'src/provisioningserver/rpc/cluster.py'
--- src/provisioningserver/rpc/cluster.py 2014-09-10 16:44:28 +0000
+++ src/provisioningserver/rpc/cluster.py 2014-09-11 10:17:45 +0000
@@ -377,3 +377,31 @@
377 errors = {377 errors = {
378 exceptions.NoIPFoundForMACAddress: b"NoIPFoundForMACAddress",378 exceptions.NoIPFoundForMACAddress: b"NoIPFoundForMACAddress",
379 }379 }
380
381
382class EnlistNodesFromMSCM(amp.Command):
383 """Probe for and enlist mscm machines attached to the cluster.
384
385 :since 1.7:
386 """
387 arguments = [
388 (b"host", amp.Unicode()),
389 (b"username", amp.Unicode()),
390 (b"password", amp.Unicode()),
391 ]
392 response = []
393 errors = {}
394
395
396class EnlistNodesFromUCSM(amp.Command):
397 """Probe for and enlist ucsm machines attached to the cluster.
398
399 :since 1.7:
400 """
401 arguments = [
402 (b"url", amp.Unicode()),
403 (b"username", amp.Unicode()),
404 (b"password", amp.Unicode()),
405 ]
406 response = []
407 errors = {}
380408
=== modified file 'src/provisioningserver/rpc/clusterservice.py'
--- src/provisioningserver/rpc/clusterservice.py 2014-09-10 23:00:52 +0000
+++ src/provisioningserver/rpc/clusterservice.py 2014-09-11 10:17:45 +0000
@@ -29,6 +29,8 @@
29 ArchitectureRegistry,29 ArchitectureRegistry,
30 PowerTypeRegistry,30 PowerTypeRegistry,
31 )31 )
32from provisioningserver.drivers.hardware.mscm import probe_and_enlist_mscm
33from provisioningserver.drivers.hardware.ucsm import probe_and_enlist_ucsm
32from provisioningserver.drivers.hardware.seamicro import (34from provisioningserver.drivers.hardware.seamicro import (
33 probe_seamicro15k_and_enlist,35 probe_seamicro15k_and_enlist,
34 )36 )
@@ -266,6 +268,26 @@
266 raise exceptions.NoIPFoundForMACAddress(message)268 raise exceptions.NoIPFoundForMACAddress(message)
267 return {}269 return {}
268270
271 @cluster.EnlistNodesFromMSCM.responder
272 def enlist_nodes_from_mscm(self, host, username, password):
273 """enlist_nodes_from_mscm()
274
275 Implemention of
276 :py:class:`~provisioningserver.rpc.cluster.EnlistNodesFromMSCM`.
277 """
278 probe_and_enlist_mscm(host, username, password)
279 return {}
280
281 @cluster.EnlistNodesFromUCSM.responder
282 def enlist_nodes_from_ucsm(self, url, username, password):
283 """enlist_nodes_from_ucsm()
284
285 Implemention of
286 :py:class:`~provisioningserver.rpc.cluster.EnlistNodesFromUCSM`.
287 """
288 probe_and_enlist_ucsm(url, username, password)
289 return {}
290
269291
270@implementer(IConnection)292@implementer(IConnection)
271class ClusterClient(Cluster):293class ClusterClient(Cluster):
272294
=== modified file 'src/provisioningserver/rpc/tests/test_clusterservice.py'
--- src/provisioningserver/rpc/tests/test_clusterservice.py 2014-09-10 23:00:52 +0000
+++ src/provisioningserver/rpc/tests/test_clusterservice.py 2014-09-11 10:17:45 +0000
@@ -1256,3 +1256,57 @@
1256 probe_seamicro15k_and_enlist, MockCalledOnceWith(1256 probe_seamicro15k_and_enlist, MockCalledOnceWith(
1257 find_ip_via_arp.return_value, username, password,1257 find_ip_via_arp.return_value, username, password,
1258 power_control=power_control))1258 power_control=power_control))
1259
1260
1261class TestClusterProtocol_EnlistNodesFromMSCM(MAASTestCase):
1262
1263 def test__is_registered(self):
1264 protocol = Cluster()
1265 responder = protocol.locateResponder(
1266 cluster.EnlistNodesFromMSCM.commandName)
1267 self.assertIsNot(responder, None)
1268
1269 def test__calls_probe_and_enlist_mscm(self):
1270 probe_and_enlist_mscm = self.patch_autospec(
1271 clusterservice, 'probe_and_enlist_mscm')
1272
1273 host = factory.make_name('host')
1274 username = factory.make_name('user')
1275 password = factory.make_name('password')
1276
1277 call_responder(Cluster(), cluster.EnlistNodesFromMSCM, {
1278 'host': host,
1279 'username': username,
1280 'password': password,
1281 })
1282
1283 self.assertThat(
1284 probe_and_enlist_mscm, MockCalledOnceWith(
1285 host, username, password))
1286
1287
1288class TestClusterProtocol_EnlistNodesFromUCSM(MAASTestCase):
1289
1290 def test__is_registered(self):
1291 protocol = Cluster()
1292 responder = protocol.locateResponder(
1293 cluster.EnlistNodesFromUCSM.commandName)
1294 self.assertIsNot(responder, None)
1295
1296 def test__calls_probe_and_enlist_ucsm(self):
1297 probe_and_enlist_ucsm = self.patch_autospec(
1298 clusterservice, 'probe_and_enlist_ucsm')
1299
1300 url = factory.make_url()
1301 username = factory.make_name('user')
1302 password = factory.make_name('password')
1303
1304 call_responder(Cluster(), cluster.EnlistNodesFromUCSM, {
1305 'url': url,
1306 'username': username,
1307 'password': password,
1308 })
1309
1310 self.assertThat(
1311 probe_and_enlist_ucsm, MockCalledOnceWith(
1312 url, username, password))
12591313
=== modified file 'src/provisioningserver/tasks.py'
--- src/provisioningserver/tasks.py 2014-09-10 17:00:43 +0000
+++ src/provisioningserver/tasks.py 2014-09-11 10:17:45 +0000
@@ -42,8 +42,6 @@
42 set_up_options_conf,42 set_up_options_conf,
43 setup_rndc,43 setup_rndc,
44 )44 )
45from provisioningserver.drivers.hardware.mscm import probe_and_enlist_mscm
46from provisioningserver.drivers.hardware.ucsm import probe_and_enlist_ucsm
47from provisioningserver.logger import get_maas_logger45from provisioningserver.logger import get_maas_logger
4846
49# For each item passed to refresh_secrets, a refresh function to give it to.47# For each item passed to refresh_secrets, a refresh function to give it to.
@@ -297,23 +295,3 @@
297 exc=exc, countdown=UPDATE_NODE_TAGS_RETRY_DELAY)295 exc=exc, countdown=UPDATE_NODE_TAGS_RETRY_DELAY)
298 else:296 else:
299 raise297 raise
300
301
302# =====================================================================
303# Custom hardware tasks
304# =====================================================================
305
306@task
307@log_task_events()
308@log_exception_text
309def enlist_nodes_from_ucsm(url, username, password):
310 """ See `maasserver.api.NodeGroupHandler.enlist_nodes_from_ucsm`. """
311 probe_and_enlist_ucsm(url, username, password)
312
313
314@task
315@log_task_events()
316@log_exception_text
317def enlist_nodes_from_mscm(host, username, password):
318 """ See `maasserver.api.NodeGroupHandler.enlist_nodes_from_mscm`. """
319 probe_and_enlist_mscm(host, username, password)