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_entity_by_name( name=cluster_name, filters=filters) # noqa: E501 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_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_entity_by_name( name=cluster_name, 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_cluster_config(self, cluster_name, cluster_id=None, org=None, vdc=None): """Get cluster config for the given cluster name. :param str cluster_name: name of the cluster :param str vdc: name of vdc :param str org: name of org :return: cluster information :rtype: str :raises ClusterNotFoundError, CseDuplicateClusterError """ if not 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_entity_by_name( name=cluster_name, filters=filters) # noqa: E501 if not def_entity: raise cse_exceptions.ClusterNotFoundError( f"Cluster '{cluster_name}' not found.") # noqa: E501 cluster_id = def_entity.id return self.get_cluster_config_by_id(cluster_id)
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( self._server_rde_version, 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) # NOTE: This function is only valid when the CSE server is running # with RDE 1.0.0 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=current_entity.to_dict()) # 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_entity_by_name( name=cluster_name, filters=filters) # noqa: E501 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_entity_by_name( name=cluster_name, filters=filters) # noqa: E501 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 delete_cluster(self, cluster_name, cluster_id=None, org=None, vdc=None): """Delete DEF native cluster by name. :param str cluster_name: native cluster 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 """ if not 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_entity_by_name( name=cluster_name, filters=filters) # noqa: E501 if not def_entity: raise cse_exceptions.ClusterNotFoundError( f"Cluster '{cluster_name}' not found.") # noqa: E501 cluster_id = def_entity.id return self.delete_cluster_by_id(cluster_id)
def list_clusters(self, vdc=None, org=None, **kwargs): """Get collection of clusters using DEF API. :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 list information :rtype: list(dict) """ clusters = [] if client_utils.is_cli_for_tkg_only(): try: for clusters, has_more_results in \ self._tkgCluster.list_tkg_clusters(vdc=vdc, org=org): yield clusters, has_more_results except tkg_rest.ApiException as e: if e.status not in [ requests.codes.FORBIDDEN, requests.codes.UNAUTHORIZED ]: # noqa: E501 server_message = json.loads( e.body).get('message') or e.reason # noqa: E501 msg = cli_constants.TKG_RESPONSE_MESSAGES_BY_STATUS_CODE.get( e.status, f"{server_message}") # noqa: E501 logger.CLIENT_LOGGER.error(msg) raise Exception(msg) msg = f"User not authorized to fetch TKG clusters: {e}" logger.CLIENT_LOGGER.debug(msg) raise e else: # display all clusters filters = client_utils.construct_filters(self._server_rde_version, org=org, vdc=vdc) entity_svc = def_entity_svc.DefEntityService(self._cloudapi_client) has_more_results = True page_number = CSE_PAGINATION_FIRST_PAGE_NUMBER page_size = CSE_PAGINATION_DEFAULT_PAGE_SIZE try: while has_more_results: clusters_page_results = entity_svc.get_all_entities_per_page_by_interface( # noqa: E501 vendor=common_models.K8Interface.VCD_INTERFACE.value. vendor, # noqa: E501 nss=common_models.K8Interface.VCD_INTERFACE.value.nss, version=common_models.K8Interface.VCD_INTERFACE.value. version, # noqa: E501 filters=filters, page_number=page_number, page_size=page_size) # Get the list of cluster defined entities entities: List[ common_models. GenericClusterEntity] = clusters_page_results[ PaginationKey.VALUES] # noqa: E501 clusters = [] for de in entities: entity = de.entity logger.CLIENT_LOGGER.debug( f"Native Defined entity list from server: {entity}" ) # noqa: E501 cluster = { cli_constants.CLIOutputKey.CLUSTER_NAME.value: de.name, # noqa: E501 cli_constants.CLIOutputKey.ORG.value: de.org.name, # noqa: E501 cli_constants.CLIOutputKey.OWNER.value: de.owner.name # noqa: E501 } if isinstance(entity, AbstractNativeEntity): # TODO remove if-else logic once model classes # start using snake_case if hasattr(entity.metadata, 'ovdc_name'): cluster[cli_constants.CLIOutputKey.VDC.value] = \ entity.metadata.ovdc_name # noqa: E501 elif hasattr(entity.metadata, 'ovdcName'): cluster[cli_constants.CLIOutputKey.VDC.value] = \ entity.metadata.ovdcName # noqa: E501 cluster[cli_constants.CLIOutputKey.K8S_RUNTIME. value] = entity.kind # noqa: E501 cluster[ cli_constants.CLIOutputKey.K8S_VERSION. value] = entity.status.kubernetes # noqa: E501 cluster[cli_constants.CLIOutputKey.STATUS. value] = entity.status.phase # noqa: E501 elif isinstance(entity, common_models.TKGEntity): cluster[cli_constants.CLIOutputKey.VDC.value] = \ entity.metadata.virtualDataCenterName cluster[cli_constants.CLIOutputKey.K8S_RUNTIME. value] = entity.kind # noqa: E501 cluster[ cli_constants.CLIOutputKey.K8S_VERSION. value] = entity.spec.distribution.version # noqa: E501 cluster[cli_constants.CLIOutputKey.STATUS.value] = \ entity.status.phase if entity.status else 'N/A' # noqa: E501 clusters.append(cluster) has_more_results = page_number * page_size < \ clusters_page_results[PaginationKey.RESULT_TOTAL] yield clusters, has_more_results page_number += 1 except requests.exceptions.HTTPError as e: msg = f"Failed to fetch clusters: {e}" logger.CLIENT_LOGGER.debug(msg) raise e
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
def list_clusters(self, vdc=None, org=None, **kwargs): """Get collection of clusters using DEF API. :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 list information :rtype: list(dict) """ has_native_rights = True has_tkg_rights = True clusters = [] try: clusters += self._tkgCluster.list_tkg_clusters(vdc=vdc, org=org) except tkg_rest.ApiException as e: if e.status not in [ requests.codes.FORBIDDEN, requests.codes.UNAUTHORIZED ]: # noqa: E501 server_message = json.loads(e.body).get('message') or e.reason msg = cli_constants.TKG_RESPONSE_MESSAGES_BY_STATUS_CODE.get( e.status, f"{server_message}") # noqa: E501 logger.CLIENT_LOGGER.error(msg) raise Exception(msg) logger.CLIENT_LOGGER.debug( f"No rights present to fetch TKG clusters: {e}") # noqa: E501 has_tkg_rights = False if not client_utils.is_cli_for_tkg_only(): filters = client_utils.construct_filters(org=org, vdc=vdc) entity_svc = def_entity_svc.DefEntityService(self._cloudapi_client) native_entities = entity_svc.list_entities_by_entity_type( vendor=DEF_CSE_VENDOR, nss=DEF_NATIVE_ENTITY_TYPE_NSS, version=DEF_NATIVE_ENTITY_TYPE_VERSION, filters=filters) try: for def_entity in native_entities: entity = def_entity.entity logger.CLIENT_LOGGER.debug( f"Native Defined entity list from server: {def_entity}" ) # noqa: E501 cluster = { cli_constants.CLIOutputKey.CLUSTER_NAME.value: def_entity.name, # noqa: E501 cli_constants.CLIOutputKey.VDC.value: entity.metadata.ovdc_name, # noqa: E501 cli_constants.CLIOutputKey.ORG.value: entity.metadata.org_name, # noqa: E501 cli_constants.CLIOutputKey.K8S_RUNTIME.value: entity.kind, # noqa: E501 cli_constants.CLIOutputKey.K8S_VERSION.value: entity.status.kubernetes, # noqa: E501 cli_constants.CLIOutputKey.STATUS.value: entity.status.phase, # noqa: E501 cli_constants.CLIOutputKey.OWNER.value: def_entity.owner.name # noqa: E501 } clusters.append(cluster) except requests.exceptions.HTTPError as e: if e.response.status_code not in [ requests.codes.FORBIDDEN, requests.codes.UNAUTHORIZED ]: # noqa: E501 logger.CLIENT_LOGGER.error( f"Failed to fetch native clusters: {str(e)}" ) # noqa: E501 raise logger.CLIENT_LOGGER.debug( f"No rights present to fetch native clusters: {str(e)}" ) # noqa: E501 has_native_rights = False if not (has_tkg_rights or has_native_rights): raise Exception("Logged in user doesn't have Native cluster rights" " or TKG rights. Please contact administrator.") return clusters