@@ -48,6 +48,21 @@ impl Inventory {
48
48
. and_modify ( |nodes : & mut Vec < String > | nodes. push ( name. clone ( ) ) )
49
49
. or_insert ( vec ! [ name. clone( ) ] ) ;
50
50
}
51
+ // Ensure application and classes values are sorted. We need to consume the iterator,
52
+ // but we don't care about the vec of unit types which results from calling sort on the
53
+ // values_mut() elements, so we directly drop the resulting Vec.
54
+ drop (
55
+ inv. classes
56
+ . values_mut ( )
57
+ . map ( |v| v. sort ( ) )
58
+ . collect :: < Vec < ( ) > > ( ) ,
59
+ ) ;
60
+ drop (
61
+ inv. applications
62
+ . values_mut ( )
63
+ . map ( |v| v. sort ( ) )
64
+ . collect :: < Vec < ( ) > > ( ) ,
65
+ ) ;
51
66
inv. nodes . insert ( name. clone ( ) , info) ;
52
67
}
53
68
Ok ( inv)
@@ -87,7 +102,8 @@ mod inventory_tests {
87
102
let r = Reclass :: new (
88
103
"./tests/inventory/nodes" ,
89
104
"./tests/inventory/classes" ,
90
- false ,
105
+ // n18 includes a nonexistent class
106
+ true ,
91
107
)
92
108
. unwrap ( ) ;
93
109
let inv = Inventory :: render ( & r) . unwrap ( ) ;
@@ -96,34 +112,82 @@ mod inventory_tests {
96
112
// have individual tests for each NodeInfo in `src/node`.
97
113
let mut nodes = inv. nodes . keys ( ) . cloned ( ) . collect :: < Vec < String > > ( ) ;
98
114
nodes. sort ( ) ;
99
- assert_eq ! (
100
- nodes,
101
- ( 1 ..=4 ) . map( |n| format!( "n{n}" ) ) . collect:: <Vec <String >>( )
102
- ) ;
103
115
104
- // applications should contain app[1-2]
116
+ let mut expected_nodes = ( 1 ..=23 ) . map ( |n| format ! ( "n{n}" ) ) . collect :: < Vec < String > > ( ) ;
117
+ expected_nodes. sort ( ) ;
118
+
119
+ assert_eq ! ( nodes, expected_nodes) ;
120
+
121
+ // applications should contain app[1-2], [a-d]
105
122
let mut expected_applications = HashMap :: < String , Vec < String > > :: new ( ) ;
106
123
expected_applications. insert ( "app1" . into ( ) , vec ! [ "n1" . into( ) ] ) ;
107
124
expected_applications. insert ( "app2" . into ( ) , vec ! [ "n1" . into( ) ] ) ;
125
+ expected_applications. insert ( "a" . into ( ) , vec ! [ "n12" . into( ) , "n13" . into( ) ] ) ;
126
+ expected_applications. insert ( "b" . into ( ) , vec ! [ "n13" . into( ) ] ) ;
127
+ expected_applications. insert ( "c" . into ( ) , vec ! [ "n12" . into( ) ] ) ;
128
+ expected_applications. insert ( "d" . into ( ) , vec ! [ "n13" . into( ) ] ) ;
129
+
108
130
assert_eq ! ( inv. applications, expected_applications) ;
109
131
110
- // classes should contain:
111
- // * cls[1-8]
112
- // * ${qux} -- interpolated as cls1 for n4, but both Python reclass and our implementation
113
- // have the uninterpolated class name in the classes list.
114
- // * nested.cls[1-2]
132
+ // classes should match the hash map defined below.
133
+ // Note that classes with parameter references are tracked unrendered and the rendered
134
+ // variants aren't added to the classes list for the node. Here's the expected
135
+ // rendered values:
136
+ // * ${cls9} -- rendered as cls9 for n15
137
+ // * ${qux} -- rendered as cls1 for n4
138
+ // * ${tenant}.${cluster} -- rendered as foo.bar for n16
139
+ // * \${baz} -- rendered as `${baz}` for n17
140
+ // * cluster.${dist} -- rendered as cluster.foo for n19
141
+
115
142
let mut expected_classes = HashMap :: < String , Vec < String > > :: new ( ) ;
143
+ expected_classes. insert ( "${cls9}" . into ( ) , vec ! [ "n15" . into( ) ] ) ;
144
+ expected_classes. insert ( "${qux}" . into ( ) , vec ! [ "n4" . into( ) ] ) ;
145
+ expected_classes. insert ( "${tenant}.${cluster}" . into ( ) , vec ! [ "n16" . into( ) ] ) ;
146
+ expected_classes. insert ( "\\ ${baz}" . into ( ) , vec ! [ "n17" . into( ) ] ) ;
147
+ expected_classes. insert ( "app1" . into ( ) , vec ! [ "n12" . into( ) ] ) ;
148
+ expected_classes. insert ( "app2" . into ( ) , vec ! [ "n13" . into( ) ] ) ;
116
149
expected_classes. insert ( "cls1" . into ( ) , vec ! [ "n1" . into( ) ] ) ;
117
150
expected_classes. insert ( "cls2" . into ( ) , vec ! [ "n1" . into( ) ] ) ;
118
- expected_classes. insert ( "nested.cls1" . into ( ) , vec ! [ "n2" . into( ) ] ) ;
119
- expected_classes. insert ( "nested.cls2" . into ( ) , vec ! [ "n2" . into( ) ] ) ;
120
151
expected_classes. insert ( "cls3" . into ( ) , vec ! [ "n3" . into( ) ] ) ;
121
152
expected_classes. insert ( "cls4" . into ( ) , vec ! [ "n3" . into( ) ] ) ;
122
153
expected_classes. insert ( "cls5" . into ( ) , vec ! [ "n3" . into( ) ] ) ;
123
154
expected_classes. insert ( "cls6" . into ( ) , vec ! [ "n3" . into( ) ] ) ;
124
155
expected_classes. insert ( "cls7" . into ( ) , vec ! [ "n4" . into( ) ] ) ;
125
156
expected_classes. insert ( "cls8" . into ( ) , vec ! [ "n4" . into( ) ] ) ;
126
- expected_classes. insert ( "${qux}" . into ( ) , vec ! [ "n4" . into( ) ] ) ;
157
+ expected_classes. insert (
158
+ "cls9" . into ( ) ,
159
+ vec ! [
160
+ "n10" . into( ) ,
161
+ "n12" . into( ) ,
162
+ "n13" . into( ) ,
163
+ "n14" . into( ) ,
164
+ "n18" . into( ) ,
165
+ "n5" . into( ) ,
166
+ "n6" . into( ) ,
167
+ "n7" . into( ) ,
168
+ "n9" . into( ) ,
169
+ ] ,
170
+ ) ;
171
+ expected_classes. insert ( "cls9_meta" . into ( ) , vec ! [ "n15" . into( ) ] ) ;
172
+ expected_classes. insert ( "cls10" . into ( ) , vec ! [ "n13" . into( ) , "n5" . into( ) , "n9" . into( ) ] ) ;
173
+ expected_classes. insert ( "cls11" . into ( ) , vec ! [ "n6" . into( ) ] ) ;
174
+ expected_classes. insert ( "cls12" . into ( ) , vec ! [ "n9" . into( ) ] ) ;
175
+ expected_classes. insert ( "cls13" . into ( ) , vec ! [ "n14" . into( ) ] ) ;
176
+ expected_classes. insert ( "cls14" . into ( ) , vec ! [ "n23" . into( ) ] ) ;
177
+ expected_classes. insert ( "cls15" . into ( ) , vec ! [ "n23" . into( ) ] ) ;
178
+ expected_classes. insert ( "cluster.${dist}" . into ( ) , vec ! [ "n19" . into( ) ] ) ;
179
+ expected_classes. insert ( "cluster.default" . into ( ) , vec ! [ "n19" . into( ) ] ) ;
180
+ expected_classes. insert ( "cluster.facts" . into ( ) , vec ! [ "n19" . into( ) ] ) ;
181
+ expected_classes. insert ( "cluster.global" . into ( ) , vec ! [ "n19" . into( ) ] ) ;
182
+ expected_classes. insert ( "config" . into ( ) , vec ! [ "n16" . into( ) ] ) ;
183
+ expected_classes. insert ( "foo-indirect" . into ( ) , vec ! [ "n20" . into( ) ] ) ;
184
+ expected_classes. insert ( "nested.a" . into ( ) , vec ! [ "n8" . into( ) ] ) ;
185
+ expected_classes. insert ( "nested.a_sub" . into ( ) , vec ! [ "n8" . into( ) , "n9" . into( ) ] ) ;
186
+ expected_classes. insert ( "nested.b" . into ( ) , vec ! [ "n10" . into( ) ] ) ;
187
+ expected_classes. insert ( "nested.cls1" . into ( ) , vec ! [ "n2" . into( ) ] ) ;
188
+ expected_classes. insert ( "nested.cls2" . into ( ) , vec ! [ "n2" . into( ) ] ) ;
189
+ expected_classes. insert ( "nonexisting" . into ( ) , vec ! [ "n18" . into( ) ] ) ;
190
+ expected_classes. insert ( "yaml-anchor" . into ( ) , vec ! [ "n21" . into( ) ] ) ;
127
191
128
192
assert_eq ! ( inv. classes, expected_classes) ;
129
193
}
0 commit comments