[ARVADOS] updated: 908959eafe8a9925cb2c204d6511095f702c1667
Git user
git at public.curoverse.com
Wed Feb 15 11:29:55 EST 2017
Summary of changes:
.../arvnodeman/computenode/dispatch/slurm.py | 11 ++++++-
services/nodemanager/arvnodeman/nodelist.py | 2 +-
.../nodemanager/tests/test_computenode_dispatch.py | 8 +++--
.../tests/test_computenode_dispatch_slurm.py | 13 +++++++-
services/nodemanager/tests/test_nodelist.py | 36 ++++++++++++++++++++--
5 files changed, 61 insertions(+), 9 deletions(-)
via 908959eafe8a9925cb2c204d6511095f702c1667 (commit)
via f14ce11321e919cc39b878fe9f7847e1a9bb0de3 (commit)
from bf9af31f49954d949317475bdcdc0694d247f82d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
commit 908959eafe8a9925cb2c204d6511095f702c1667
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date: Wed Feb 15 11:29:25 2017 -0500
6520: Assign weight to node based on price to preferentially schedule on
cheaper nodes.
diff --git a/services/nodemanager/arvnodeman/computenode/dispatch/slurm.py b/services/nodemanager/arvnodeman/computenode/dispatch/slurm.py
index cbeabd1..6c5cfc8 100644
--- a/services/nodemanager/arvnodeman/computenode/dispatch/slurm.py
+++ b/services/nodemanager/arvnodeman/computenode/dispatch/slurm.py
@@ -6,8 +6,9 @@ import subprocess
import time
from . import \
- ComputeNodeSetupActor, ComputeNodeUpdateActor, ComputeNodeMonitorActor
+ ComputeNodeSetupActor, ComputeNodeMonitorActor
from . import ComputeNodeShutdownActor as ShutdownActorBase
+from . import ComputeNodeUpdateActor as UpdateActorBase
from .. import RetryMixin
class SlurmMixin(object):
@@ -75,3 +76,11 @@ class ComputeNodeShutdownActor(SlurmMixin, ShutdownActorBase):
else:
# any other state.
self._later.shutdown_node()
+
+class ComputeNodeUpdateActor(UpdateActorBase):
+ def sync_node(self, cloud_node, arvados_node):
+ try:
+ subprocess.check_output(['scontrol', 'update', 'NodeName=' + arvados_node["hostname"], 'Weight=%i' % int(cloud_node.size.price * 1000)])
+ except OSError:
+ self._logger.warn("Unable to set slurm node weight.", exc_info=True)
+ return super(ComputeNodeUpdateActor, self).sync_node(cloud_node, arvados_node)
diff --git a/services/nodemanager/tests/test_computenode_dispatch.py b/services/nodemanager/tests/test_computenode_dispatch.py
index ec15734..c718dad 100644
--- a/services/nodemanager/tests/test_computenode_dispatch.py
+++ b/services/nodemanager/tests/test_computenode_dispatch.py
@@ -273,11 +273,13 @@ class ComputeNodeShutdownActorTestCase(ComputeNodeShutdownActorMixin,
class ComputeNodeUpdateActorTestCase(testutil.ActorTestMixin,
unittest.TestCase):
+ ACTOR_CLASS = dispatch.ComputeNodeUpdateActor
+
def make_actor(self):
self.driver = mock.MagicMock(name='driver_mock')
- self.updater = dispatch.ComputeNodeUpdateActor.start(self.driver).proxy()
+ self.updater = self.ACTOR_CLASS.start(self.driver).proxy()
- def test_node_sync(self):
+ def test_node_sync(self, *args):
self.make_actor()
cloud_node = testutil.cloud_node_mock()
arv_node = testutil.arvados_node_mock()
@@ -285,7 +287,7 @@ class ComputeNodeUpdateActorTestCase(testutil.ActorTestMixin,
self.driver().sync_node.assert_called_with(cloud_node, arv_node)
@testutil.no_sleep
- def test_node_sync_error(self):
+ def test_node_sync_error(self, *args):
self.make_actor()
cloud_node = testutil.cloud_node_mock()
arv_node = testutil.arvados_node_mock()
diff --git a/services/nodemanager/tests/test_computenode_dispatch_slurm.py b/services/nodemanager/tests/test_computenode_dispatch_slurm.py
index 536b0ca..38fe1d7 100644
--- a/services/nodemanager/tests/test_computenode_dispatch_slurm.py
+++ b/services/nodemanager/tests/test_computenode_dispatch_slurm.py
@@ -10,7 +10,7 @@ import mock
import arvnodeman.computenode.dispatch.slurm as slurm_dispatch
from . import testutil
-from .test_computenode_dispatch import ComputeNodeShutdownActorMixin
+from .test_computenode_dispatch import ComputeNodeShutdownActorMixin, ComputeNodeUpdateActorTestCase
@mock.patch('subprocess.check_output')
class SLURMComputeNodeShutdownActorTestCase(ComputeNodeShutdownActorMixin,
@@ -101,3 +101,14 @@ class SLURMComputeNodeShutdownActorTestCase(ComputeNodeShutdownActorMixin,
proc_mock.return_value = 'other\n'
super(SLURMComputeNodeShutdownActorTestCase,
self).test_uncancellable_shutdown()
+
+ at mock.patch('subprocess.check_output')
+class SLURMComputeNodeUpdateActorTestCase(ComputeNodeUpdateActorTestCase):
+ ACTOR_CLASS = slurm_dispatch.ComputeNodeUpdateActor
+
+ def test_update_node_weight(self, check_output):
+ self.make_actor()
+ cloud_node = testutil.cloud_node_mock()
+ arv_node = testutil.arvados_node_mock()
+ self.updater.sync_node(cloud_node, arv_node).get(self.TIMEOUT)
+ check_output.assert_called_with(['scontrol', 'update', 'NodeName=compute99', 'Weight=99000'])
commit f14ce11321e919cc39b878fe9f7847e1a9bb0de3
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date: Tue Feb 14 16:22:09 2017 -0500
6520: Add testcase using sinfo to set crunch_worker_state
diff --git a/services/nodemanager/arvnodeman/nodelist.py b/services/nodemanager/arvnodeman/nodelist.py
index 6d436be..5b02fde 100644
--- a/services/nodemanager/arvnodeman/nodelist.py
+++ b/services/nodemanager/arvnodeman/nodelist.py
@@ -23,7 +23,7 @@ class ArvadosNodeListMonitorActor(clientactor.RemotePollLoopActor):
return node['uuid']
def _send_request(self):
- nodelist = arvados.util.list_all(self._client.nodes)
+ nodelist = arvados.util.list_all(self._client.nodes().list)
# node hostname, state
sinfo_out = subprocess.check_output(["sinfo", "--noheader", "--format=%n %t"])
diff --git a/services/nodemanager/tests/test_nodelist.py b/services/nodemanager/tests/test_nodelist.py
index 5346e7a..8ceaca6 100644
--- a/services/nodemanager/tests/test_nodelist.py
+++ b/services/nodemanager/tests/test_nodelist.py
@@ -3,6 +3,7 @@
from __future__ import absolute_import, print_function
import unittest
+import mock
import arvnodeman.nodelist as nodelist
from . import testutil
@@ -16,13 +17,43 @@ class ArvadosNodeListMonitorActorTestCase(testutil.RemotePollLoopActorTestMixin,
*args, **kwargs)
self.client.nodes().list().execute.side_effect = side_effect
- def test_uuid_is_subscription_key(self):
+ @mock.patch("subprocess.check_output")
+ def test_uuid_is_subscription_key(self, sinfo_mock):
+ sinfo_mock.return_value = ""
node = testutil.arvados_node_mock()
- self.build_monitor([{'items': [node]}])
+ self.build_monitor([{
+ 'items': [node],
+ 'items_available': 1,
+ 'offset': 0
+ }, {
+ 'items': [],
+ 'items_available': 1,
+ 'offset': 1
+ }])
self.monitor.subscribe_to(node['uuid'],
self.subscriber).get(self.TIMEOUT)
self.stop_proxy(self.monitor)
self.subscriber.assert_called_with(node)
+ self.assertEqual("down", node["crunch_worker_state"])
+
+ @mock.patch("subprocess.check_output")
+ def test_update_from_sinfo(self, sinfo_mock):
+ sinfo_mock.return_value = "compute99 alloc"
+ node = testutil.arvados_node_mock()
+ self.build_monitor([{
+ 'items': [node],
+ 'items_available': 1,
+ 'offset': 0
+ }, {
+ 'items': [],
+ 'items_available': 1,
+ 'offset': 1
+ }])
+ self.monitor.subscribe_to(node['uuid'],
+ self.subscriber).get(self.TIMEOUT)
+ self.stop_proxy(self.monitor)
+ self.subscriber.assert_called_with(node)
+ self.assertEqual("busy", node["crunch_worker_state"])
class CloudNodeListMonitorActorTestCase(testutil.RemotePollLoopActorTestMixin,
@@ -54,4 +85,3 @@ class CloudNodeListMonitorActorTestCase(testutil.RemotePollLoopActorTestMixin,
if __name__ == '__main__':
unittest.main()
-
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list