def get_existing_machines(self, nodearray_definitions): ''' Queries pbsnodes and CycleCloud to get a sane set of cyclecloud.machine.Machine instances that represent the current state of the cluster. ''' pbsnodes = self.driver.pbsnodes().get(None) existing_machines = [] booting_instance_ids = autoscale_util.nodes_by_instance_id( self.clusters_api, nodearray_definitions) instance_ids_to_shutdown = Record() nodes_by_instance_id = Record() for pbsnode in pbsnodes.values(): inst = self.process_pbsnode(pbsnode, instance_ids_to_shutdown, nodearray_definitions) if not inst: continue existing_machines.append(inst) # we found the pbsnode that matches the cyclecloud node, so let's remove the duplicate instance_id = inst.get_attr("instance_id", "") if instance_id in booting_instance_ids: booting_instance_ids.pop(instance_id) nodes_by_instance_id[instance_id] = pbsnode for instance_id, node in list(booting_instance_ids.iteritems()): nodearray_name = node["Template"] machinetype_name = node["MachineType"] try: machinetype = nodearray_definitions.get_machinetype( nodearray_name, machinetype_name, node.get("PlacementGroupId")) except KeyError as e: raise ValueError( "machine is %s, key is %s, rest is %s" % (nodearray_name, str(e), nodearray_definitions)) inst = machine.new_machine_instance( machinetype, hostname=node.get("hostname"), instance_id=node.get("InstanceId"), group_id=node.get("placementGroupId")) existing_machines.append(inst) nodes_by_instance_id[instance_id] = node return pbsnodes, existing_machines, nodes_by_instance_id, instance_ids_to_shutdown
def get_existing_machines(self, nodearray_definitions): ''' Queries pbsnodes and CycleCloud to get a sane set of cyclecloud.machine.Machine instances that represent the current state of the cluster. ''' pbsnodes = self.driver.pbsnodes().get(None) existing_machines = [] booting_instance_ids = autoscale_util.nodes_by_instance_id(self.clusters_api, nodearray_definitions) instance_ids_to_shutdown = Record() nodes_by_instance_id = Record() for pbsnode in pbsnodes.values(): instance_id = pbsnode["resources_available"].get("instance_id", "") # use this opportunity to set some things that can change during the runtime (keepalive) or are not always set # by previous versions (machinetype/nodearray) if instance_id and booting_instance_ids.get(instance_id): node = booting_instance_ids.get(instance_id) pbsnode["resources_available"]["keep_alive"] = node.get("KeepAlive", False) pbsnode["resources_available"]["machinetype"] = pbsnode["resources_available"].get("machinetype") or node.get("MachineType") pbsnode["resources_available"]["nodearray"] = pbsnode["resources_available"].get("nodearray") or node.get("Template") inst = self.process_pbsnode(pbsnode, instance_ids_to_shutdown, nodearray_definitions) if not inst: continue existing_machines.append(inst) # we found the pbsnode that matches the cyclecloud node, so let's remove the duplicate instance_id = inst.get_attr("instance_id", "") if instance_id in booting_instance_ids: booting_instance_ids.pop(instance_id) nodes_by_instance_id[instance_id] = pbsnode for instance_id, node in list(booting_instance_ids.items()): nodearray_name = node["Template"] machinetype_name = node["MachineType"] try: machinetype = nodearray_definitions.get_machinetype(nodearray_name, machinetype_name, node.get("PlacementGroupId")) except KeyError as e: raise ValueError("machine is %s, key is %s, rest is %s" % (nodearray_name, str(e), nodearray_definitions)) inst = machine.new_machine_instance(machinetype, hostname=node.get("hostname"), instance_id=node.get("InstanceId"), group_id=node.get("placementGroupId"), keep_alive=node.get("KeepAlive", False)) existing_machines.append(inst) nodes_by_instance_id[instance_id] = node return pbsnodes, existing_machines, nodes_by_instance_id, instance_ids_to_shutdown