From d14d34b534e6914dea107878212436dd995c6560 Mon Sep 17 00:00:00 2001 From: Peter Amstutz Date: Fri, 20 Nov 2015 10:48:57 -0500 Subject: [PATCH] Fix for _size_shutdowns and node prices in node manager refs #5353 --- services/nodemanager/arvnodeman/daemon.py | 17 +++++++++++------ services/nodemanager/arvnodeman/jobqueue.py | 12 ++++++++++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/services/nodemanager/arvnodeman/daemon.py b/services/nodemanager/arvnodeman/daemon.py index df0307ae31..dbc3273e1c 100644 --- a/services/nodemanager/arvnodeman/daemon.py +++ b/services/nodemanager/arvnodeman/daemon.py @@ -227,9 +227,9 @@ class NodeManagerDaemonActor(actor_class): def _total_price(self): cost = 0 - cost += sum(c.cloud_size.get().price + cost += sum(self.server_calculator.find_size(c.cloud_size.get().id).price for c in self.booting.itervalues()) - cost += sum(c.cloud_node.size.price + cost += sum(self.server_calculator.find_size(c.cloud_node.size.id).price for i in (self.booted, self.cloud_nodes.nodes) for c in i.itervalues()) return cost @@ -252,8 +252,14 @@ class NodeManagerDaemonActor(actor_class): return sum(1 for c in self.last_wishlist if c.id == size.id) def _size_shutdowns(self, size): - return sum(1 for c in self.shutdowns.itervalues() - if c.cloud_node.get().size.id == size.id) + sh = 0 + for c in self.shutdowns.itervalues(): + try: + if c.cloud_node.get().size.id == size.id: + sh += 1 + except pykka.ActorDeadError: + pass + return sh def _nodes_wanted(self, size): total_up_count = self._nodes_up(None) @@ -289,8 +295,7 @@ class NodeManagerDaemonActor(actor_class): def update_server_wishlist(self, wishlist): self._update_poll_time('server_wishlist') self.last_wishlist = wishlist - for sz in reversed(self.server_calculator.cloud_sizes): - size = sz.real + for size in reversed(self.server_calculator.cloud_sizes): nodes_wanted = self._nodes_wanted(size) if nodes_wanted > 0: self._later.start_node(size) diff --git a/services/nodemanager/arvnodeman/jobqueue.py b/services/nodemanager/arvnodeman/jobqueue.py index 8f78ba1df5..e0f0a5b1ec 100644 --- a/services/nodemanager/arvnodeman/jobqueue.py +++ b/services/nodemanager/arvnodeman/jobqueue.py @@ -30,6 +30,9 @@ class ServerCalculator(object): raise ValueError("unrecognized size field '%s'" % (name,)) setattr(self, name, override) + if self.price is None: + raise ValueError("Required field 'price' is None") + def meets_constraints(self, **kwargs): for name, want_value in kwargs.iteritems(): have_value = getattr(self, name) @@ -70,20 +73,25 @@ class ServerCalculator(object): for job in queue: seen_jobs.add(job['uuid']) constraints = job['runtime_constraints'] - want_count = self.coerce_int(constraints.get('min_nodes'), 1) + want_count = max(1, self.coerce_int(constraints.get('min_nodes'), 1)) cloud_size = self.cloud_size_for_constraints(constraints) if cloud_size is None: if job['uuid'] not in self.logged_jobs: self.logged_jobs.add(job['uuid']) self.logger.debug("job %s not satisfiable", job['uuid']) elif (want_count <= self.max_nodes) and (want_count*cloud_size.price <= self.max_price): - servers.extend([cloud_size.real] * max(1, want_count)) + servers.extend([cloud_size.real] * want_count) self.logged_jobs.intersection_update(seen_jobs) return servers def cheapest_size(self): return self.cloud_sizes[0] + def find_size(self, sizeid): + for s in self.cloud_sizes: + if s.id == sizeid: + return s + return None class JobQueueMonitorActor(clientactor.RemotePollLoopActor): """Actor to generate server wishlists from the job queue. -- 2.30.2