1 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2 : Copyright (c) 2018 Mirantis Inc., Enea AB and others.
4 : All rights reserved. This program and the accompanying materials
5 : are made available under the terms of the Apache License, Version 2.0
6 : which accompanies this distribution, and is available at
7 : http://www.apache.org/licenses/LICENSE-2.0
8 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
9 From: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
10 Date: Sun, 03 Dec 2017 22:03:01 +0200
11 Subject: [PATCH] reclass.storage.node: Merge duplicate nodes
13 Reclass does not support duplicate nodes in top pillar, so merge all
14 nodes with the same name into a single node, inheriting classes from
17 This allows using multiple "system.reclass.storage.system.*_cluster"
18 classes for the same node, based on re-using the name (hostname).
20 NOTE: defaults.merge module does not merge lists (e.g. for classes),
21 so handle that case separately.
23 Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
26 diff --git a/reclass/storage/node.sls b/reclass/storage/node.sls
27 --- a/reclass/storage/node.sls
28 +++ b/reclass/storage/node.sls
30 {%- from "reclass/map.jinja" import storage with context %}
31 {%- if storage.enabled %}
33 +{%- set storage_by_name = {} %}
34 {%- for node_name, node in storage.get('node', {}).iteritems() %}
35 +{%- set new_node_name = node.get('name', node_name) %}
36 +{%- set new_node = storage_by_name.get(new_node_name, {'classes': []}) %}
37 +{%- do salt['defaults.merge'](node, {'classes': new_node.classes + node.classes}) %}
38 +{%- do salt['defaults.merge'](storage_by_name, {new_node_name: node}) %}
41 +{%- for node_name, node in storage_by_name.iteritems() %}
43 {%- if node.repeat is defined %}