+{%- import 'net_map.j2' as nm with context -%}
+{%- set arch = conf[conf.MCP_JUMP_ARCH] -%}
+{%- set V = conf.virtual -%}
+{%- do V.nodes.update(arch.default.virtual.nodes) -%}
+{%- set section_map = {
+ 'infra': -1,
+ 'control': nm.ctl01.idx,
+ 'compute': nm.cmp001.idx
+} -%}
+
+{%- macro bash_arr(_l) -%}
+ ({%- for n in _l -%}'{{ n }}' {% endfor -%})
+{%- endmacro -%}
+
+{#- Pack list as `sep`-separated string, replacing spaces with '|' -#}
+{%- macro pack(x = [], sep = ',') -%}
+ {{ x | join(sep) | replace(' ', '|') }}
+{%- endmacro -%}
+
+{#- Pack all vnode data as string -#}
+{%- macro serialize_vnodes() -%}
+ {%- set arr = [] -%}
+ {%- for section in section_map -%}
+ {%- for n in V.nodes[section] or [] -%}
+ {%- if section_map[section] < 0 or conf.nodes[section_map[section] + loop.index0].node.type == 'virtual' -%}
+ {%- if n not in V -%}{%- do V.update({n: {}}) -%}{%- endif -%}
+ {%- set cpu_topo = 'cpu_topology' in V[n] and not conf.MCP_CMP_SS -%}
+ {%- if 'numa' in V[n] and cpu_topo -%}
+ {%- for k, v in V[n].numa.iteritems() -%}
+ {%- set c = pack([k, v.memory, v.cpus]) -%}
+ {%- do V[n].update({'s_numa': c if 's_numa' not in V[n] else pack([c, V[n].s_numa])}) -%}
+ {%- endfor -%}
+ {%- endif -%}
+ {%- do arr.append(pack([n, V[n].ram or arch.default.ram,
+ V[n].vcpus or arch.default.vcpus,
+ '' if not cpu_topo else pack([
+ V[n].cpu_topology.sockets,
+ V[n].cpu_topology.cores,
+ V[n].cpu_topology.threads,
+ '' if 's_numa' not in V[n] else V[n].s_numa])])) -%}
+ {%- endif -%}
+ {%- endfor -%}
+ {%- endfor -%}
+ '{{ pack(arr, '|') }}'
+{%- endmacro -%}
+
+{#- Return a bash array of node names or a Salt query, optionally filtered by type #}
+{%- macro filter_nodes(type, output_as_query = False, sections = section_map) -%}
+ {%- set arr = [] -%}
+ {%- for section in sections -%}
+ {%- for n in V.nodes[section] or [] -%}
+ {%- if ( (section_map[section] < 0 and type == 'virtual') or
+ (section_map[section] >= 0 and
+ conf.nodes[section_map[section] + loop.index0].node.type in type) ) -%}
+ {%- do arr.append(n) -%}
+ {%- endif -%}
+ {%- endfor -%}
+ {%- endfor -%}
+ {%- if output_as_query -%}
+ '{{ arr | join('* or ') }}*'
+ {%- else -%}
+ {{ bash_arr(arr) }}
+ {%- endif -%}
+{%- endmacro -%}
+
+{#- Pack apt_pkg data as string -#}
+{%- macro serialize_apt_pkg() -%}
+ {%- set arr = [] -%}
+ {%- set sections = [arch.common] -%}
+ {%- if conf.MCP_VCP -%}
+ {%- do sections.append(arch.control) -%}
+ {%- endif -%}
+ {%- for c in sections -%}
+ {%- do arr.append(pack([pack(c.apt['keys']), pack(c.apt.repos),
+ pack(c.pkg.install), pack(c.pkg.remove)], '^')) -%}
+ {%- endfor -%}
+ '{{ pack(arr, '^') }}'
+{%- endmacro -%}
+