def concretize_nodes(resources, nodes): # force order to be a *function* snodes = sorted(nodes, key=lambda n: n.address) pools = mk_pools(snodes, lambda n: n.address.split('-')[0]) # We first try to fulfill min requirements # Just considering machines with min value specified machines = resources["machines"] min_machines = sorted(machines, key=lambda desc: desc.get("min", 0)) for desc in min_machines: cluster = desc["cluster"] nb = desc.get("min", 0) c_nodes = pick_things(pools, cluster, nb) if len(c_nodes) < nb: raise NotEnoughNodesError("min requirement failed for %s " % desc) desc["_c_nodes"] = [c_node.address for c_node in c_nodes] # We then fill the remaining without # If no enough nodes are there we silently continue for desc in machines: cluster = desc["cluster"] nb = desc["nodes"] - len(desc["_c_nodes"]) c_nodes = pick_things(pools, cluster, nb) # put concrete hostnames here desc["_c_nodes"].extend([c_node.address for c_node in c_nodes])
def concretize_networks(resources, vlans, subnets): # avoid any non-determinism s_vlans = sorted(vlans, key=lambda v: (v["site"], v["vlan_id"])) s_subnets = sorted(subnets, key=lambda s: (s["site"], s["ip_prefix"])) pools = mk_pools(s_vlans, lambda n: (n["site"], to_vlan_type(n["vlan_id"]))) pools_subnets = mk_pools( s_subnets, lambda n: (n["site"], to_subnet_type(n["ip_prefix"]))) for desc in resources["networks"]: site = desc["site"] site_info = ex5.get_resource_attributes('/sites/%s' % site) n_type = desc["type"] if n_type == PROD: desc["_c_network"] = {"site": site, "vlan_id": None} desc["_c_network"].update(site_info["kavlans"]["default"]) elif n_type in KAVLAN_TYPE: networks = pick_things(pools, (site, n_type), 1) if len(networks) < 1: raise MissingNetworkError(site, n_type) # concretize the network desc["_c_network"] = networks[0] vlan_id = desc["_c_network"]["vlan_id"] desc["_c_network"].update(site_info["kavlans"][str(vlan_id)]) elif n_type in SUBNET_TYPE: networks = pick_things(pools_subnets, (site, n_type), 1) if len(networks) < 1: raise MissingNetworkError(site, n_type) desc["_c_network"] = networks[0] return resources
def concretize_nodes(resources, nodes): # force order to be a *function* snodes = sorted(nodes, key=lambda n: n.address) pools = mk_pools(snodes, lambda n: n.address.split('-')[0]) machines = resources["machines"] for desc in machines: cluster = desc["cluster"] nb = desc["nodes"] c_nodes = pick_things(pools, cluster, nb) # put concrete hostnames here desc["_c_nodes"] = [c_node.address for c_node in c_nodes]
def build_roles(provider_conf, env, servers, keyfnc): result = {} pools = mk_pools(servers, keyfnc) machines = provider_conf.machines for desc in machines: flavor = desc.flavour nb = desc.number roles = desc.roles nodes = pick_things(pools, flavor, nb) for role in roles: result.setdefault(role, []).extend(nodes) return result
def build_roles(resources, env, servers, keyfnc): result = {} pools = mk_pools(servers, keyfnc) machines = resources["machines"] for desc in machines: flavor = desc["flavor"] nb = desc["number"] roles = get_roles_as_list(desc) nodes = pick_things(pools, flavor, nb) for role in roles: result.setdefault(role, []).extend(nodes) return result
def concretize_networks(resources, networks): """Maps abstract to concrete networks. Warning: Side effect on resources """ s_networks = sorted(networks, key=lambda n: (n.site, n.nature, n.network)) pools = mk_pools(s_networks, lambda n: (n.site, n.nature)) for desc in resources["networks"]: site = desc["site"] n_type = desc["type"] # On grid'5000 a slash_16 is 64 slash_22 # So if we ask for a slash_16 we return 64 sash_22 # yes, this smells if n_type == SLASH_16: _networks = pick_things(pools, (site, SLASH_22), 64) else: _networks = pick_things(pools, (site, n_type), 1) if len(_networks) < 1: raise MissingNetworkError(site, n_type) desc["_c_network"] = _networks return resources
def concretize_networks(resources, vlans): s_vlans = sorted(vlans, key=lambda v: (v["site"], v["vlan_id"])) pools = mk_pools(s_vlans, lambda n: (n["site"], to_vlan_type(n["vlan_id"]))) for desc in resources["networks"]: site = desc["site"] site_info = ex5.get_resource_attributes('/sites/%s' % site) n_type = desc["type"] if n_type == PROD: desc["_c_network"] = {"site": site, "vlan_id": None} desc["_c_network"].update(site_info["kavlans"]["default"]) else: networks = pick_things(pools, (site, n_type), 1) if len(networks) < 1: raise MissingNetworkError(site, n_type) # concretize the network desc["_c_network"] = networks[0] vlan_id = desc["_c_network"]["vlan_id"] desc["_c_network"].update(site_info["kavlans"][str(vlan_id)])