@@ -36,14 +36,46 @@ def exept node
36
36
nodes . select { |n | n . name != node . name }
37
37
end
38
38
39
- def find name : nil , fqdn : nil
39
+ # @param name [String] Hostname of a node
40
+ # @param fqdn [String] Fully qualified domain name
41
+ # @param barclamp [String] Name of a barclamp assigned to a node
42
+ # @param element [String] Element name in the crowbar proposal json tree
43
+ # @note Parameter :barclamp requires element to be specified
44
+ # @return [Array] One or multiple node instances
45
+ def find name : nil , fqdn : nil , barclamp : nil , element : nil , proposal : "default"
40
46
load!
41
- return nodes . find { |n | n . name == name } if name
42
- return nodes . find { |n | n . fqdn == fqdn } if fqdn
47
+ return nodes . select { |n | n . name == name } if name
48
+ return nodes . select { |n | n . fqdn == fqdn } if fqdn
49
+
50
+ if barclamp
51
+ raise "Missing element for barclamp proposal" unless element
52
+
53
+ proposal = JSON . parse (
54
+ admin_node . exec! ( "crowbar #{ barclamp } show #{ proposal } " ) . output
55
+ )
56
+
57
+ nodes_detected = [ ]
58
+
59
+ clustered = proposal [ "deployment" ] [ barclamp ] [ "elements" ] [ element ] . first . start_with? ( "cluster:" )
60
+
61
+ if clustered
62
+ nodes_detected . push (
63
+ proposal [ "deployment" ] [ barclamp ] [ "elements_expanded" ] [ element ]
64
+ )
65
+ else
66
+ nodes_detected . push (
67
+ proposal [ "deployment" ] [ barclamp ] [ "elements" ] [ element ]
68
+ )
69
+ end
70
+
71
+ nodes_detected . flatten . compact . map do |node_fqdn |
72
+ nodes . find { |n | n . fqdn == node_fqdn }
73
+ end . compact
74
+ end
43
75
end
44
76
45
77
def admin_node
46
- nodes . find { |node | node . name = AdminNode ::NAME }
78
+ @admin_node ||= nodes . find { |node | node . name = = AdminNode ::NAME }
47
79
end
48
80
49
81
def clear
@@ -69,7 +101,6 @@ def load_nodes!
69
101
end
70
102
71
103
def load_admin name , attrs , node_details
72
- admin_node = nodes . find { |n | n . name == AdminNode ::NAME }
73
104
if admin_node
74
105
return admin_node . reload! unless admin_node . loaded?
75
106
return admin_node if admin_node . loaded?
0 commit comments