def _isolate_cluster(self, cluster_name, qualified_cluster_name, cluster_id): if not cluster_id: raise ValueError( f"Invalid cluster_id for cluster : '{cluster_name}'") LOGGER.debug(f"Isolating network of cluster {cluster_name}.") try: cluster_network_isolater = ClusterNetworkIsolater(self.nsxt_client) cluster_network_isolater.isolate_cluster(qualified_cluster_name, cluster_id) except Exception as err: raise ClusterNetworkIsolationError( f"Cluster : '{cluster_name}' is in an unusable state. Failed " "to isolate cluster network") from err
def _create_cluster(self, cluster_name, node_count, pks_plan, pks_ext_host, compute_profile=None, **kwargs): """Create cluster in PKS environment. Creates Distributed Firewall rules in NSX-T to isolate the cluster network from other clusters. :param str cluster_name: Name of the cluster :param str plan: PKS plan. It should be one of the three plans that PKS supports. :param str external_host_name: User-preferred external hostname of the K8 cluster :param str compute_profile: Name of the compute profile :return: Details of the cluster :rtype: dict """ # TODO(ClusterSpec) Create an inner class "ClusterSpec" # in abstract_broker.py and have subclasses define and use it # as instance variable. # Method 'Create_cluster' in VcdBroker and PksBroker should take # ClusterSpec either as a param (or) # read from instance variable (if needed only). if not self.nsxt_server: raise CseServerError( "NSX-T server details not found for PKS server selected for " f"cluster : {cluster_name}. Aborting creation of cluster.") compute_profile = compute_profile \ if compute_profile else self.compute_profile cluster_api = ClusterApiV1Beta(api_client=self.client_v1beta) cluster_params = \ ClusterParameters(kubernetes_master_host=pks_ext_host, kubernetes_worker_instances=node_count) cluster_request = ClusterRequest(name=cluster_name, plan_name=pks_plan, parameters=cluster_params, compute_profile_name=compute_profile) LOGGER.debug(f"Sending request to PKS: {self.pks_host_uri} to create " f"cluster of name: {cluster_name}") try: cluster = cluster_api.add_cluster(cluster_request) except v1BetaException as err: LOGGER.debug(f"Creating cluster {cluster_name} in PKS failed with " f"error:\n {err}") raise PksServerError(err.status, err.body) cluster_dict = cluster.to_dict() # Flattening the dictionary cluster_params_dict = cluster_dict.pop('parameters') cluster_dict.update(cluster_params_dict) LOGGER.debug(f"PKS: {self.pks_host_uri} accepted the request to create" f" cluster: {cluster_name}") # TODO() : Rollback cluster if any error is encountered in this section # isolate cluster via NSX-T DFW try: cluster_id = cluster_dict.get('uuid') if cluster_id: LOGGER.debug(f"Isolating network of cluster {cluster_name}.") cluster_network_isolater = ClusterNetworkIsolater( self.nsxt_client) cluster_network_isolater.isolate_cluster( cluster_name, cluster_id) else: raise CseServerError("Failed to isolate network of cluster " f"{cluster_name}. Cluster ID not found.") except Exception as err: raise CseServerError("Failed to isolate network of cluster " f"{cluster_name} : Aborting creation of " "cluster.") from err return cluster_dict