Ejemplo n.º 1
0
def get_deployed_components():
    """Returns set of deployed components."""
    deployed_deployments = kubernetes.list_cluster_deployments()
    deployed_statefulsets = kubernetes.list_cluster_statefulsets()
    deployed_components = set(kubernetes.get_object_names(
        itertools.chain(deployed_deployments, deployed_statefulsets))
    )
    return deployed_components
Ejemplo n.º 2
0
def get_deployed_components():
    """Returns set of deployed components."""
    deployed_deployments = kubernetes.list_cluster_deployments()
    deployed_statefulsets = kubernetes.list_cluster_statefulsets()
    deployed_components = set(
        kubernetes.get_object_names(
            itertools.chain(deployed_deployments, deployed_statefulsets)))
    return deployed_components
Ejemplo n.º 3
0
def _make_topology(nodes, roles, replicas):
    failed = False
    if not deploy_validation.validate_nodes_section(nodes, CONF.configs):
        failed = True
    # TODO(sreshetniak): move it to validation
    if not roles:
        LOG.error("Roles section is not specified in configs")
        failed = True
    if failed:
        raise RuntimeError("Failed to create topology for services")

    # Replicas are optional, 1 replica will deployed by default
    replicas = replicas or _yaml.AttrDict()

    # TODO(sreshetniak): add validation
    k8s_nodes = kubernetes.list_k8s_nodes()
    k8s_node_names = kubernetes.get_object_names(k8s_nodes)

    def find_match(glob):
        matcher = re.compile(glob)
        nodes = []
        for node in k8s_node_names:
            match = matcher.match(node)
            if match:
                nodes.append(node)
        return nodes

    roles_to_node = {}
    for node in sorted(nodes):
        matched_nodes = find_match(node)
        for role in nodes[node]["roles"] + [JOBS_ROLE]:
            roles_to_node.setdefault(role, [])
            roles_to_node[role].extend(matched_nodes)
    service_to_node = {}
    for role in sorted(roles):
        if role in roles_to_node:
            for svc in roles[role]:
                service_to_node.setdefault(svc, [])
                service_to_node[svc].extend(roles_to_node[role])
        else:
            LOG.warning("Role '%s' defined, but unused", role)

    replicas = replicas._dict.copy()
    for svc, svc_hosts in six.iteritems(service_to_node):
        svc_replicas = replicas.pop(svc, None)

        if svc_replicas is None:
            continue

        svc_hosts_count = len(svc_hosts)
        if svc_replicas > svc_hosts_count:
            LOG.error(
                "Requested %s replicas for %s while only %s hosts able "
                "to run that service (%s)", svc_replicas, svc, svc_hosts_count,
                ", ".join(svc_hosts))
            raise RuntimeError("Replicas doesn't match available hosts.")

    if replicas:
        LOG.error("Replicas defined for unspecified service(s): %s",
                  ", ".join(replicas.keys()))
        raise RuntimeError("Replicas defined for unspecified service(s)")
    service_to_node[JOBS_ROLE] = roles_to_node[JOBS_ROLE]
    return {k: sorted(set(v)) for k, v in service_to_node.items()}
Ejemplo n.º 4
0
def _make_topology(nodes, roles, replicas):
    failed = False
    if not deploy_validation.validate_nodes_section(nodes, CONF.configs):
        failed = True
    # TODO(sreshetniak): move it to validation
    if not roles:
        LOG.error("Roles section is not specified in configs")
        failed = True
    if failed:
        raise RuntimeError("Failed to create topology for services")

    # Replicas are optional, 1 replica will deployed by default
    replicas = replicas or _yaml.AttrDict()

    # TODO(sreshetniak): add validation
    k8s_nodes = kubernetes.list_k8s_nodes()
    k8s_node_names = kubernetes.get_object_names(k8s_nodes)

    def find_match(glob):
        matcher = re.compile(glob)
        nodes = []
        for node in k8s_node_names:
            match = matcher.match(node)
            if match:
                nodes.append(node)
        return nodes

    roles_to_node = {}
    for node in sorted(nodes):
        matched_nodes = find_match(node)
        for role in nodes[node]["roles"] + [JOBS_ROLE]:
            roles_to_node.setdefault(role, [])
            roles_to_node[role].extend(matched_nodes)
    service_to_node = {}
    for role in sorted(roles):
        if role in roles_to_node:
            for svc in roles[role]:
                service_to_node.setdefault(svc, [])
                service_to_node[svc].extend(roles_to_node[role])
        else:
            LOG.warning("Role '%s' defined, but unused", role)

    replicas = replicas._dict.copy()
    for svc, svc_hosts in six.iteritems(service_to_node):
        svc_replicas = replicas.pop(svc, None)

        if svc_replicas is None:
            continue

        svc_hosts_count = len(svc_hosts)
        if svc_replicas > svc_hosts_count:
            LOG.error("Requested %s replicas for %s while only %s hosts able "
                      "to run that service (%s)", svc_replicas, svc,
                      svc_hosts_count, ", ".join(svc_hosts))
            raise RuntimeError("Replicas doesn't match available hosts.")

    if replicas:
        LOG.error("Replicas defined for unspecified service(s): %s",
                  ", ".join(replicas.keys()))
        raise RuntimeError("Replicas defined for unspecified service(s)")
    service_to_node[JOBS_ROLE] = roles_to_node[JOBS_ROLE]
    return {k: sorted(set(v)) for k, v in service_to_node.items()}