def _get_cluster_info(self, cid, config): cluster = ClusterModel.objects.get(id=cid) cluster_name = cluster.name kube_config = KubernetesOperation()._get_config_from_params( cluster.host.k8s_param) clusters_exists = ClusterModel.objects(host=cluster.host) ports_index = [ service.port for service in ServicePort.objects(cluster__in=clusters_exists) ] nfsServer_ip = cluster.host.k8s_param.get('K8SNfsServer') consensus = config['consensus_plugin'] return cluster, cluster_name, kube_config, ports_index, \ nfsServer_ip, consensus
def find_free_start_ports(self, host_id, number): """ Find the first available port for a new cluster api This is NOT lock-free. Should keep simple, fast and safe! Check existing cluster records in the host, find available one. :param host_id: id of the host :param number: Number of ports to get :return: The port list, e.g., [7050, 7150, ...] """ logger.debug("Find {} start ports for host {}".format(number, host_id)) if number <= 0: logger.warning("number {} <= 0".format(number)) return [] host = self.host_handler.get_by_id(host_id) if not host: logger.warning("Cannot find host with id={}", host_id) return "" clusters_exists = ClusterModel.objects(host=host) # clusters_valid = list(filter(lambda c: c.get("service_url"), # clusters_exists)) # ports_existed = list(map( # lambda c: int(c["service_url"]["rest"].split(":")[-1]), # clusters_valid)) ports_existed = [ service.port for service in ServicePort.objects(cluster__in=clusters_exists) ] logger.debug("The ports existed: {}".format(ports_existed)) if len(ports_existed) + number >= 1000: logger.warning("Too much ports are already in used.") return [] candidates = [ CLUSTER_PORT_START + i * CLUSTER_PORT_STEP for i in range(len(ports_existed) + number) ] result = list(filter(lambda x: x not in ports_existed, candidates)) logger.debug("Free ports are {}".format(result[:number])) return result[:number]
def stop(self, name, worker_api, mapped_ports, log_type, log_level, log_server, config): try: cluster, cluster_name, kube_config, ports_index, nfsServer_ip, \ consensus = self._get_cluster_info(name, config) operation = K8sClusterOperation(kube_config) operation.stop_cluster(cluster_name, ports_index, nfsServer_ip, consensus) cluster_ports = ServicePort.objects(cluster=cluster) for ports in cluster_ports: ports.delete() cluster_containers = Container.objects(cluster=cluster) for container in cluster_containers: container.delete() except Exception as e: logger.error("Failed to stop Kubernetes Cluster: {}".format(e)) return False return True
def find_free_start_ports(self, host_id, number): """ Find the first available port for a new cluster api This is NOT lock-free. Should keep simple, fast and safe! Check existing cluster records in the host, find available one. :param host_id: id of the host :param number: Number of ports to get :return: The port list, e.g., [7050, 7150, ...] """ logger.debug("Find {} start ports for host {}".format(number, host_id)) if number <= 0: logger.warning("number {} <= 0".format(number)) return [] host = self.host_handler.get_by_id(host_id) if not host: logger.warning("Cannot find host with id={}", host_id) return "" clusters_exists = ClusterModel.objects(host=host) # clusters_valid = list(filter(lambda c: c.get("service_url"), # clusters_exists)) # ports_existed = list(map( # lambda c: int(c["service_url"]["rest"].split(":")[-1]), # clusters_valid)) ports_existed = [service.port for service in ServicePort.objects(cluster__in=clusters_exists)] logger.debug("The ports existed: {}".format(ports_existed)) if len(ports_existed) + number >= 1000: logger.warning("Too much ports are already in used.") return [] candidates = [CLUSTER_PORT_START + i * CLUSTER_PORT_STEP for i in range(len(ports_existed) + number)] result = list(filter(lambda x: x not in ports_existed, candidates)) logger.debug("Free ports are {}".format(result[:number])) return result[:number]
def delete(self, cid, worker_api, config): try: cluster, cluster_name, kube_config, ports_index, nfsServer_ip,\ consensus = self._get_cluster_info(cid, config) operation = K8sClusterOperation(kube_config) operation.delete_cluster(cluster_name, ports_index, nfsServer_ip, consensus) # delete ports for clusters cluster_ports = ServicePort.objects(cluster=cluster) if cluster_ports: for ports in cluster_ports: ports.delete() cluster_containers = Container.objects(cluster=cluster) if cluster_containers: for container in cluster_containers: container.delete() except Exception as e: logger.error("Failed to delete Kubernetes Cluster: {}".format(e)) return False return True