def get_cluster_info(self, cluster_name, cluster_id=None, org=None, vdc=None, **kwargs): """Get cluster information using DEF API. :param str cluster_name: name of the cluster :param str vdc: name of vdc :param str org: name of org :param kwargs: *filter (dict): keys,values for DEF API query filter :return: cluster information :rtype: dict """ if cluster_id: return self.get_cluster_info_by_id(cluster_id) filters = client_utils.construct_filters(org=org, vdc=vdc) entity_svc = def_entity_svc.DefEntityService(self._cloudapi_client) def_entity = \ entity_svc.get_native_rde_by_name_and_rde_version( cluster_name, self._server_rde_version, filters=filters) # noqa: E501 logger.CLIENT_LOGGER.debug( f"Defined entity info from server:{def_entity}") # noqa: E501 if not def_entity: logger.CLIENT_LOGGER.error( f"Cannot find native cluster with name {cluster_name}" ) # noqa: E501 raise cse_exceptions.ClusterNotFoundError( f"Cluster '{cluster_name}' not found.") # noqa: E501 # TODO() relevant output if def_entity: return yaml.dump(asdict(def_entity.entity))
def get_tkg_s_clusters_by_name(self, name, vdc=None, org=None): self.set_tenant_org_context(org_name=org) filters = {cli_constants.TKGEntityFilterKey.CLUSTER_NAME.value: name} if vdc: filters[cli_constants.TKGEntityFilterKey.VDC_NAME.value] = vdc filter_string = utils.construct_filter_string(filters) response = \ self._tkg_s_client_api.list_tkg_clusters( f"{Vendor.VMWARE}/{Nss.TKG}/1.0.0", object_filter=filter_string) tkg_entities = [] tkg_def_entities = [] if response: tkg_entities = response[0] tkg_def_entities = response[3]['entityDetails'] if len(tkg_entities) == 0: raise cse_exceptions.ClusterNotFoundError( f"TKG-S cluster with name '{name}' not found.") if len(tkg_entities) > 1: if not org: raise cse_exceptions.CseDuplicateClusterError( f"Multiple clusters with the name '{name}' found." " Please specify the org using --org flag.") raise cse_exceptions.CseDuplicateClusterError( f"Multiple clusters with the name '{name}' present in the" "same Organization. Please contact the administrator.") return tkg_entities, tkg_def_entities
def upgrade_cluster(self, cluster_name, template_name, template_revision, org_name=None, ovdc_name=None): """Get the upgrade plan for given cluster. :param str cluster_name: name of the cluster :param str template_name: Name of the template the cluster should be upgraded to. :param str template_revision: Revision of the template the cluster should be upgraded to. :param org_name: name of the org :param ovdc_name: name of the vdc :return: string containing upgrade cluster task href :rtype: str """ filters = client_utils.construct_filters(org=org_name, vdc=ovdc_name) entity_svc = def_entity_svc.DefEntityService(self._cloudapi_client) current_entity = entity_svc.get_native_rde_by_name_and_rde_version( cluster_name, self._server_rde_version, filters=filters) if current_entity: current_entity.entity.spec.k8_distribution.template_name = template_name # noqa: E501 current_entity.entity.spec.k8_distribution.template_revision = template_revision # noqa: E501 return self.upgrade_cluster_by_cluster_id( current_entity.id, cluster_def_entity=asdict(current_entity)) # noqa: E501 raise cse_exceptions.ClusterNotFoundError( f"Cluster '{cluster_name}' not found.") # noqa: E501
def get_cluster_id_by_name(self, cluster_name, org=None, vdc=None): filters = client_utils.construct_filters(org=org, vdc=vdc) entity_svc = def_entity_svc.DefEntityService(self._cloudapi_client) def_entity = entity_svc.get_native_rde_by_name_and_rde_version( cluster_name, self._server_rde_version, filters=filters) if not def_entity: raise cse_exceptions.ClusterNotFoundError( f"Cluster '{cluster_name}' not found.") # noqa: E501 return def_entity.id
def get_upgrade_plan(self, cluster_name, org=None, vdc=None): """Get the upgrade plan for given cluster. :param cluster_name: name of the cluster :param org: name of the org :param vdc: name of the vdc :return: upgrade plan info :rtype: dict """ filters = client_utils.construct_filters(org=org, vdc=vdc) entity_svc = def_entity_svc.DefEntityService(self._cloudapi_client) def_entity = entity_svc.get_native_rde_by_name_and_rde_version( cluster_name, self._server_rde_version, filters=filters) if def_entity: return self.get_upgrade_plan_by_cluster_id(def_entity.id) raise cse_exceptions.ClusterNotFoundError( f"Cluster '{cluster_name}' not found.") # noqa: E501
def delete_nfs_node(self, cluster_name, node_name, org=None, vdc=None): """Delete nfs node given the cluster name and node name. :param str cluster_name: native cluster name :param str node_name: nfs-node name :param str org: name of the org :param str vdc: name of the vdc :return: string containing delete operation task href :rtype: str :raises ClusterNotFoundError """ filters = client_utils.construct_filters(org=org, vdc=vdc) entity_svc = def_entity_svc.DefEntityService(self._cloudapi_client) def_entity = entity_svc.get_native_rde_by_name_and_rde_version( cluster_name, self._server_rde_version, filters=filters) if def_entity: return self.delete_nfs_by_cluster_id(def_entity.id, node_name) raise cse_exceptions.ClusterNotFoundError( f"Cluster '{cluster_name}' not found.") # noqa: E501
def _get_tkg_native_clusters_by_name(self, cluster_name: str, org=None, vdc=None): """Get native and TKG clusters by name. Assumption: Native clusters cannot have name collision among them. But there can be multiple TKG clusters with the same name and 2 or more TKG clusters can also have the same name. :param str cluster_name: Cluster name to search for :param str org: Org to filter by :param str vdc: VDC to filter by :returns: tkg entity or native def entity with entity properties and boolean indicating cluster type :rtype: (cluster, dict, bool) """ filters = client_utils.construct_filters(self._server_rde_version, org=org, vdc=vdc) entity_svc = def_entity_svc.DefEntityService(self._cloudapi_client) has_native_rights = True has_tkg_rights = True native_def_entity = None additional_entity_properties = None # NOTE: The following can throw error if invoked by users who # doesn't have the necessary rights. try: native_def_entity = \ entity_svc.get_native_rde_by_name_and_rde_version( cluster_name, self._server_rde_version, filters=filters) except cse_exceptions.DefSchemaServiceError: # NOTE: 500 status code is returned which is not ideal # when user doesn't have native rights has_native_rights = False tkg_entity = [] tkg_def_entity = [] # NOTE: The following can throw error if invoked by users who # doesn't have the necessary rights. try: tkg_entity, tkg_def_entity = \ self._tkgCluster.get_tkg_clusters_by_name(cluster_name, vdc=vdc, org=org) except tkg_rest.ApiException as e: if e.status not in [ requests.codes.FORBIDDEN, requests.codes.UNAUTHORIZED ]: # noqa: E501 raise has_tkg_rights = False except cse_exceptions.ClusterNotFoundError: logger.CLIENT_LOGGER.debug( f"No TKG cluster with name {cluster_name}") # noqa: E501 if not (has_native_rights or has_tkg_rights): raise Exception("User cannot access native or TKG clusters." " Please contact administrator") msg = "Multiple clusters with the same name found." if len(tkg_entity) > 0 and native_def_entity: # If org filter is not provided, ask the user to provide org # filter if not org: # handles the case where there is are TKG clusters and native # clusters with the same name in different organizations raise Exception(f"{msg} Please specify the org to use " "using --org flag.") # handles the case where there is a TKG cluster and a native # native cluster with the same name in the same organization raise Exception(f"{msg} Please specify the k8-runtime to use using" " --k8-runtime flag.") if not native_def_entity and len(tkg_entity) == 0: # handles the case where no clusters are found msg = f"Cluster '{cluster_name}' not found." logger.CLIENT_LOGGER.error(msg) raise cse_exceptions.ClusterNotFoundError(msg) if native_def_entity: cluster = native_def_entity is_native_cluster = True else: additional_entity_properties = tkg_def_entity[0] cluster = tkg_entity[0] is_native_cluster = False return cluster, additional_entity_properties, is_native_cluster