def identifier_to_node_uuid(cls, rest_client, node_id_name_or_ip): # These will raise appropriate exceptions on failure, so it's safe to # assume that otherwise accessing the 'uuid' key is safe. if CurieUtil.is_ipv4_address(node_id_name_or_ip): return rest_client.hosts_get(host_ip=node_id_name_or_ip)["uuid"] elif CurieUtil.is_uuid(node_id_name_or_ip): try: return rest_client.hosts_get( host_id=node_id_name_or_ip)["uuid"] except Exception: log.debug("Failed to lookup node via UUID '%s'", node_id_name_or_ip) # The provided node identifier is not an IPv4 address or a UUID. It may # be either an unresolved hostname or a Prism name. Try Prism name first # to avoid potential overhead in name resolution. try: return rest_client.hosts_get(host_name=node_id_name_or_ip)["uuid"] except Exception: log.debug("Failed to lookup node via Prism name '%s'", node_id_name_or_ip) try: ip = CurieUtil.resolve_hostname(node_id_name_or_ip) except Exception: raise CurieException( CurieError.kInvalidParameter, "Unable to resolve IP address for '%s'" % node_id_name_or_ip) # Allow this to raise it's own exception on failure, as there are no # further methods to which we can fall back. return rest_client.hosts_get(host_ip=ip)["uuid"]
def wait_for_vms_accessible(vms, timeout_secs): """ Wait until all the specified VMs are accessible to run guest OS commands. Raises CurieTestException if this takes longer than 'timeout_secs'. """ t1 = time.time() t2 = -1 for xx, vm in enumerate(vms): log.info("Waiting for VM %d/%d (%s) to become accessible", xx + 1, len(vms), vm.vm_name()) if t2 >= 0: wait_for_timeout_secs = timeout_secs - (t2 - t1) else: wait_for_timeout_secs = timeout_secs if wait_for_timeout_secs < 0: error_msg = "Timeout waiting for VMs to become accessible" raise CurieTestException(error_msg) if vm.vm_ip() is None: error_msg = "IP address not set on Vm object %s" % vm.vm_name() raise CurieTestException(error_msg) if not CurieUtil.is_ipv4_address(vm.vm_ip()): error_msg = "Non-IPv4 address %s on VM %s" % (vm.vm_ip(), vm.vm_name()) raise CurieTestException(error_msg) msg = "waiting for VM %s (%s) to become accessible" % \ (vm.vm_name(), vm.vm_ip()) if not CurieUtil.wait_for(vm.is_accessible, msg, wait_for_timeout_secs): error_msg = "Timeout waiting for VMs to become accessible" raise CurieTestException(error_msg) log.info("VM %d/%d (%s) is accessible", xx + 1, len(vms), vm.vm_name()) t2 = time.time()
def __init__(self, cluster, node_id, node_index): super(VsphereNode, self).__init__(cluster, node_id, node_index) # vCenter node IDs are either IPv4 addresses or hostnames. if CurieUtil.is_ipv4_address(node_id): self._node_ip = node_id else: self._node_ip = CurieUtil.resolve_hostname(node_id)
def __init__(self, cluster, node_id, node_index, node_properties): super(HyperVNode, self).__init__(cluster, node_id, node_index) self.power_state = node_properties["power_state"] self.__fqdn = node_properties["fqdn"] self.__overall_state = node_properties["overall_state"] ips = node_properties["ips"] if not ips: raise CurieException("Received empty node ip list in response") # vCenter node IDs are either IPv4 addresses or hostnames. if CurieUtil.is_ipv4_address(ips[0]): self._node_ip = ips[0] else: self._node_ip = CurieUtil.resolve_hostname(ips[0])
def _update_cluster_version_info_vcenter(cluster_pb): """ See 'DiscoveryUtil.update_cluster_version_info' for info. """ mgmt_info = cluster_pb.cluster_management_server_info.vcenter_info hyp_info = cluster_pb.cluster_hypervisor_info.esx_info with VsphereVcenter.from_proto(mgmt_info) as vcenter: vim_dc = vcenter.lookup_datacenter(mgmt_info.vcenter_datacenter_name) vim_cluster = vcenter.lookup_cluster(vim_dc, mgmt_info.vcenter_cluster_name) if vim_cluster is None: raise CurieException(CurieError.kInvalidParameter, "Cluster not found in specified vCenter") esx_version_pairs = vcenter.get_esx_versions(vim_cluster) hyp_info.version.extend(pair[0] for pair in esx_version_pairs) hyp_info.build.extend(pair[1] for pair in esx_version_pairs) mgmt_info.vcenter_version, mgmt_info.vcenter_build = \ vcenter.get_vcenter_version_info() if cluster_pb.cluster_software_info.HasField("nutanix_info"): cvms = [vim_vm for vim_vm in vcenter.lookup_vms(vim_cluster) if vcenter.vim_vm_is_nutanix_cvm(vim_vm)] if not cvms: raise CurieException( CurieError.kInvalidParameter, "Unable to locate any CVMs on cluster. Is this a Nutanix cluster?") for cvm in cvms: ip = get_optional_vim_attr(cvm.guest, "ipAddress") if ip and CurieUtil.is_ipv4_address(ip): break else: raise CurieException( CurieError.kInvalidParameter, "Unable to locate any CVMs with IPv4 addresses on cluster") software_info = cluster_pb.cluster_software_info.nutanix_info cli = NutanixRestApiClient( ip, software_info.decrypt_field("prism_user"), software_info.decrypt_field("prism_password")) DiscoveryUtil._update_cluster_version_info_nos(cli, cluster_pb)