diff --git a/awx/api/views/__init__.py b/awx/api/views/__init__.py index 0e4685f188..93cb5b0920 100644 --- a/awx/api/views/__init__.py +++ b/awx/api/views/__init__.py @@ -339,10 +339,7 @@ class InstanceDetail(RetrieveUpdateAPIView): r = super(InstanceDetail, self).update(request, *args, **kwargs) if status.is_success(r.status_code): obj = self.get_object() - if obj.enabled: - obj.refresh_capacity() - else: - obj.capacity = 0 + obj.refresh_capacity() obj.save() r.data = serializers.InstanceSerializer(obj, context=self.get_serializer_context()).to_representation(obj) return r diff --git a/awx/main/models/ha.py b/awx/main/models/ha.py index c238fac89b..c2fa368f11 100644 --- a/awx/main/models/ha.py +++ b/awx/main/models/ha.py @@ -144,7 +144,10 @@ class Instance(HasPolicyEditsMixin, BaseModel): def refresh_capacity(self): cpu = get_cpu_capacity() mem = get_mem_capacity() - self.capacity = get_system_task_capacity(self.capacity_adjustment) + if self.enabled: + self.capacity = get_system_task_capacity(self.capacity_adjustment) + else: + self.capacity = 0 self.cpu = cpu[0] self.memory = mem[0] self.cpu_capacity = cpu[1] @@ -231,9 +234,7 @@ class InstanceGroup(HasPolicyEditsMixin, BaseModel, RelatedJobsMixin): def fit_task_to_most_remaining_capacity_instance(self, task): instance_most_capacity = None - for i in self.instances.filter(capacity__gt=0).order_by('hostname'): - if not i.enabled: - continue + for i in self.instances.filter(capacity__gt=0, enabled=True).order_by('hostname'): if i.remaining_capacity >= task.task_impact and \ (instance_most_capacity is None or i.remaining_capacity > instance_most_capacity.remaining_capacity): @@ -242,7 +243,7 @@ class InstanceGroup(HasPolicyEditsMixin, BaseModel, RelatedJobsMixin): def find_largest_idle_instance(self): largest_instance = None - for i in self.instances.filter(capacity__gt=0).order_by('hostname'): + for i in self.instances.filter(capacity__gt=0, enabled=True).order_by('hostname'): if i.jobs_running == 0: if largest_instance is None: largest_instance = i @@ -253,7 +254,7 @@ class InstanceGroup(HasPolicyEditsMixin, BaseModel, RelatedJobsMixin): def choose_online_controller_node(self): return random.choice(list(self.controller .instances - .filter(capacity__gt=0) + .filter(capacity__gt=0, enabled=True) .values_list('hostname', flat=True))) diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 9c4f4d251e..53b90c3794 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -393,14 +393,9 @@ def cluster_node_heartbeat(): instance_list.remove(inst) if this_inst: startup_event = this_inst.is_lost(ref_time=nowtime) - if this_inst.capacity == 0 and this_inst.enabled: - logger.warning('Rejoining the cluster as instance {}.'.format(this_inst.hostname)) - if this_inst.enabled: - this_inst.refresh_capacity() - elif this_inst.capacity != 0 and not this_inst.enabled: - this_inst.capacity = 0 - this_inst.save(update_fields=['capacity']) + this_inst.refresh_capacity() if startup_event: + logger.warning('Rejoining the cluster as instance {}.'.format(this_inst.hostname)) return else: raise RuntimeError("Cluster Host Not Found: {}".format(settings.CLUSTER_HOST_ID))