in hostfactory/host_provider/src/cyclecloud_provider.py [0:0]
def get_return_requests(self, input_json):
"""
input:
{}
output:
{
"message": "Any additional message the caller should know"
"requests": [
# Note: Includes Spot instances and On-Demand instances returned from the management console.
{
"machine": "(mandatory)(string) Host name of the machine that must be returned",
"gracePeriod": "(mandatory)(numeric). Time remaining (in seconds) before this host will be reclaimed by the provider"
}]
}
ex.
{
"status" : "complete",
"message" : "Instances marked for termination retrieved successfully.",
"requests" : [ {
"gracePeriod" : 0,
"machine" : "ip-16-0-1-130.ec2.internal"
},
{
"gracePeriod" : 0,
"machine" : "ip-16-0-1-160.ec2.internal"
} ]
}
"""
request_status = RequestStates.complete
sym_existing_hostnames = set([m["name"] for m in input_json["machines"]])
try:
all_nodes = self.cluster.all_nodes()
except UserError as e:
logger.exception("Azure CycleCloud experienced an error and the get return request failed. %s", e)
return self.stdout_handler.handle({"status": RequestStates.complete_with_error,
"requests": [],
"message": "Azure CycleCloud experienced an error: %s" % str(e)})
except ValueError as e:
logger.exception("Azure CycleCloud experienced an error and the get return request failed. %s", e)
return self.stdout_handler.handle({"status": RequestStates.complete_with_error,
"requests": [],
"message": "Azure CycleCloud experienced an error: %s" % str(e)})
message = ""
report_failure_states = ["Unavailable", "Failed"]
response = {"message": message,
"requests": []}
req_return_count = 0
cc_existing_hostnames = set()
to_shutdown = []
for node in all_nodes['nodes']:
if not node.get("Configuration").get("autoscaling", {}).get("enabled", False):
continue
hostname = node.get("Hostname")
if not hostname:
try:
hostname = self.hostnamer.hostname(node.get("PrivateIp"))
except Exception:
logger.warning("get_return_requests: No hostname set and could not convert ip %s to hostname for \"%s\" VM.", node.get("PrivateIp"), node)
cc_existing_hostnames.add(hostname)
machine = {"gracePeriod": 0,
"machine": hostname or ""}
node_status = node.get("Status")
node_status_msg = node.get("StatusMessage", "Unknown node failure.")
if node_status in report_failure_states:
logger.error("Requesting Return for failed node: %s (%s) with State: %s (%s)", hostname, node.get("NodeId") or "", node_status, node_status_msg)
to_shutdown.append({"name": hostname, "machineId": node.get("NodeId")})
response["requests"].append(machine)
# these nodes may not even exist in symphony, so we will just shut them down and then report them
# to symphony.
try:
if to_shutdown:
logger.debug("Terminating returned machines: %s", to_shutdown)
self.terminate_machines({"machines": to_shutdown}, quiet_output())
except:
logger.exception()
missing_from_cc = sym_existing_hostnames - cc_existing_hostnames
if len(response["requests"]) > 0:
message = "Requesting return for %s failed nodes." % (len(response["requests"]))
for hostname in missing_from_cc:
if hostname:
machine = {"gracePeriod": 0,
"machine": hostname}
response["requests"].append(machine)
if missing_from_cc:
message = "%s Requesting return for %s previously terminated nodes." % (message, len(missing_from_cc))
response["message"] = message
response["status"] = request_status
return self.stdout_handler.handle(response)