def execute_scale_down_logic()

in services/jenkins-autoscaling/lambda_mxnet_ci/autoscaling/handler.py [0:0]


def execute_scale_down_logic(jenkins_server, ec2_resource, scale_down_nodes):
    if not scale_down_nodes:
        logging.info('No scale down required')
        return

    # Extract all display names from scale_down_nodes. Node is an api internal dictionary,
    # coming from jenkinsapi.computers._data
    scale_down_node_names = [node['displayName'] for nodes in scale_down_nodes.values() for node in nodes]
    scale_down_nodes_list = list(_convert_to_jenkins_nodes(jenkins_server, scale_down_node_names).values())

    (nodes_online, nodes_offline) = partition(lambda node: not node._data['offline'], scale_down_nodes_list)

    # Mark nodes as offline to prevent builds being scheduled
    _mark_nodes_offline(offline_nodes=nodes_online, reason=DOWNSCALE_REASON)

    # Nodes that are offline but executing jobs are marked online again
    # Scale down: Validate nodes are properly taken offline and no builds are going to be interrupted
    final_scale_down_nodes_list, non_idle_offline_nodes = _partition_non_idle(nodes_online)
    # Re-enable filtered nodes
    logging.debug('Re-enabling %d non-idle nodes: %s', len(non_idle_offline_nodes), non_idle_offline_nodes)
    _mark_nodes_online(online_nodes=non_idle_offline_nodes)

    final_scale_down_nodes_list.extend(nodes_offline)

    # Scale down: Shutdown node instances
    shutdown_ec2_instance_name_list = [node.name for node in final_scale_down_nodes_list]
    logging.debug('Shutting down %d instances: %s', len(shutdown_ec2_instance_name_list),
                  shutdown_ec2_instance_name_list)

    #########################################################
    _terminate_ec2_instances(
        instance_names=shutdown_ec2_instance_name_list,
        ec2_resource=ec2_resource)
    #########################################################

    terminated_nodes = _convert_to_jenkins_nodes(
        server=jenkins_server,
        instances=shutdown_ec2_instance_name_list)

    logging.debug('Deleting %d jenkins nodes: %s', len(terminated_nodes), terminated_nodes)
    #########################################################
    _delete_jenkins_node_objects(node_objs=terminated_nodes)