bcome 0.7.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/bcome +8 -39
- data/lib/bcome.rb +12 -3
- data/lib/objects/bcome/version.rb +3 -0
- data/lib/objects/bootup.rb +81 -0
- data/lib/objects/command/local.rb +40 -0
- data/lib/objects/config_factory.rb +36 -0
- data/lib/objects/driver/base.rb +30 -0
- data/lib/objects/driver/bucket.rb +20 -0
- data/lib/objects/driver/ec2.rb +44 -0
- data/lib/objects/driver/static.rb +4 -0
- data/lib/objects/exception/argument_error_invoking_method_from_command_line.rb +7 -0
- data/lib/objects/exception/base.rb +15 -0
- data/lib/objects/exception/can_only_subselect_on_inventory.rb +7 -0
- data/lib/objects/exception/cannot_find_internal_registry_klass.rb +7 -0
- data/lib/objects/exception/cannot_find_subselection_parent.rb +7 -0
- data/lib/objects/exception/cant_find_key_in_cloud_tags.rb +7 -0
- data/lib/objects/exception/cant_find_key_in_metadata.rb +7 -0
- data/lib/objects/exception/cant_find_proxy_host_by_identifier.rb +7 -0
- data/lib/objects/exception/cant_find_proxy_host_by_namespace.rb +7 -0
- data/lib/objects/exception/could_not_initiate_ssh_connection.rb +7 -0
- data/lib/objects/exception/could_not_initiate_ssh_connection_through_backend_proxy.rb +7 -0
- data/lib/objects/exception/deprecation_warning.rb +11 -0
- data/lib/objects/exception/duplicate_command_line_argument_key.rb +7 -0
- data/lib/objects/exception/ec2_driver_missing_provisioning_region.rb +7 -0
- data/lib/objects/exception/failed_to_run_local_command.rb +7 -0
- data/lib/objects/exception/interactive_session_halt.rb +4 -0
- data/lib/objects/exception/invalid_bcome_breadcrumb.rb +7 -0
- data/lib/objects/exception/invalid_breadcrumb.rb +7 -0
- data/lib/objects/exception/invalid_context_command.rb +7 -0
- data/lib/objects/exception/invalid_identifier.rb +7 -0
- data/lib/objects/exception/invalid_machines_cache_config.rb +7 -0
- data/lib/objects/exception/invalid_matcher_query.rb +7 -0
- data/lib/objects/exception/invalid_meta_data_config.rb +7 -0
- data/lib/objects/exception/invalid_network_config.rb +7 -0
- data/lib/objects/exception/invalid_network_driver_type.rb +7 -0
- data/lib/objects/exception/invalid_proxy_config.rb +7 -0
- data/lib/objects/exception/invalid_regexp_matcher_in_registry.rb +7 -0
- data/lib/objects/exception/invalid_registry_arguments_type.rb +7 -0
- data/lib/objects/exception/invalid_registry_data_config.rb +7 -0
- data/lib/objects/exception/invalid_restriction_key_in_registry.rb +7 -0
- data/lib/objects/exception/invalid_ssh_config.rb +7 -0
- data/lib/objects/exception/inventories_cannot_have_subviews.rb +7 -0
- data/lib/objects/exception/malformed_command_line_arguments.rb +7 -0
- data/lib/objects/exception/method_invocation_requires_parameter.rb +7 -0
- data/lib/objects/exception/method_name_conflict_in_registry.rb +7 -0
- data/lib/objects/exception/missing_argument_for_registry_command.rb +7 -0
- data/lib/objects/exception/missing_description_on_view.rb +7 -0
- data/lib/objects/exception/missing_execute_on_registry_object.rb +7 -0
- data/lib/objects/exception/missing_identifier_on_view.rb +7 -0
- data/lib/objects/exception/missing_ip_address_on_server.rb +7 -0
- data/lib/objects/exception/missing_network_config.rb +7 -0
- data/lib/objects/exception/missing_params_for_rsync.rb +7 -0
- data/lib/objects/exception/missing_params_for_scp.rb +7 -0
- data/lib/objects/exception/missing_subselection_key.rb +7 -0
- data/lib/objects/exception/missing_type_on_view.rb +7 -0
- data/lib/objects/exception/no_node_found_for_breadcrumb.rb +7 -0
- data/lib/objects/exception/no_node_named_by_identifier.rb +7 -0
- data/lib/objects/exception/node_identifiers_must_be_unique.rb +7 -0
- data/lib/objects/exception/orchestration_script_does_not_exist.rb +7 -0
- data/lib/objects/exception/proxy_host_node_does_not_have_public_ip_address.rb +7 -0
- data/lib/objects/exception/unknown_method_for_namespace.rb +7 -0
- data/lib/objects/interactive/session.rb +45 -0
- data/lib/objects/interactive/session_item/base.rb +36 -0
- data/lib/objects/interactive/session_item/capture_input.rb +20 -0
- data/lib/objects/interactive/session_item/transparent_ssh.rb +111 -0
- data/lib/objects/modules/context.rb +13 -0
- data/lib/objects/modules/registry_management.rb +14 -0
- data/lib/objects/modules/ui_output.rb +9 -0
- data/lib/objects/modules/workspace_commands.rb +198 -0
- data/lib/objects/modules/workspace_menu.rb +128 -0
- data/lib/objects/node/attributes.rb +47 -0
- data/lib/objects/node/base.rb +248 -0
- data/lib/objects/node/cache_handler.rb +24 -0
- data/lib/objects/node/collection.rb +51 -0
- data/lib/objects/node/factory.rb +108 -0
- data/lib/objects/node/inventory/base.rb +88 -0
- data/lib/objects/node/inventory/defined.rb +112 -0
- data/lib/objects/node/inventory/subselect.rb +54 -0
- data/lib/objects/node/meta/base.rb +36 -0
- data/lib/objects/node/meta/cloud.rb +4 -0
- data/lib/objects/node/meta/local.rb +4 -0
- data/lib/objects/node/meta_data_factory.rb +23 -0
- data/lib/objects/node/meta_data_loader.rb +32 -0
- data/lib/objects/node/resources/base.rb +98 -0
- data/lib/objects/node/resources/inventory.rb +25 -0
- data/lib/objects/node/resources/sub_inventory.rb +56 -0
- data/lib/objects/node/server/base.rb +218 -0
- data/lib/objects/node/server/dynamic.rb +39 -0
- data/lib/objects/node/server/static.rb +31 -0
- data/lib/objects/orchestration/base.rb +13 -0
- data/lib/objects/orchestrator.rb +24 -0
- data/lib/objects/parser/bread_crumb.rb +31 -0
- data/lib/objects/progress_bar.rb +30 -0
- data/lib/objects/registry/arguments/base.rb +36 -0
- data/lib/objects/registry/arguments/command_line.rb +35 -0
- data/lib/objects/registry/arguments/console.rb +15 -0
- data/lib/objects/registry/command/base.rb +66 -0
- data/lib/objects/registry/command/external.rb +55 -0
- data/lib/objects/registry/command/group.rb +76 -0
- data/lib/objects/registry/command/internal.rb +34 -0
- data/lib/objects/registry/command_list.rb +33 -0
- data/lib/objects/registry/loader.rb +70 -0
- data/lib/objects/ssh/bootstrap.rb +19 -0
- data/lib/objects/ssh/command.rb +46 -0
- data/lib/objects/ssh/command_exec.rb +65 -0
- data/lib/objects/ssh/connection_handler.rb +101 -0
- data/lib/objects/ssh/driver.rb +204 -0
- data/lib/objects/ssh/proxy_data.rb +56 -0
- data/lib/objects/ssh/script_exec.rb +43 -0
- data/lib/objects/system/local.rb +30 -0
- data/lib/objects/workspace.rb +75 -0
- data/patches/irb.rb +20 -7
- data/patches/string.rb +75 -0
- data/patches/string_stylesheet.rb +61 -0
- metadata +175 -93
- data/bin/bcome-bash-setup +0 -18
- data/bin/bcome-setup +0 -43
- data/bin/boot.rb +0 -148
- data/bin/boot_no_shell.rb +0 -3
- data/filters/ec2_filter.rb +0 -12
- data/lib/bcome/version.rb +0 -3
- data/lib/become_object.rb +0 -111
- data/lib/boot.rb +0 -13
- data/lib/command.rb +0 -56
- data/lib/context_functions.rb +0 -65
- data/lib/filters/base.rb +0 -10
- data/lib/filters/ec2_filter.rb +0 -4
- data/lib/functions.rb +0 -70
- data/lib/helpers/command_helper.rb +0 -13
- data/lib/helpers/environment_ssh.rb +0 -122
- data/lib/helpers/fog_helper.rb +0 -108
- data/lib/helpers/instance_command.rb +0 -71
- data/lib/helpers/instance_ssh.rb +0 -83
- data/lib/helpers/selections.rb +0 -117
- data/lib/interactive/interactive_session_halt.rb +0 -4
- data/lib/interactive/session.rb +0 -44
- data/lib/interactive/session_item/base.rb +0 -30
- data/lib/interactive/session_item/transparent_ssh.rb +0 -133
- data/lib/nodes/base.rb +0 -60
- data/lib/nodes/environment.rb +0 -30
- data/lib/nodes/estate.rb +0 -44
- data/lib/nodes/instance.rb +0 -94
- data/lib/nodes/platform.rb +0 -17
- data/lib/nodes/view.rb +0 -31
- data/lib/object.rb +0 -21
- data/lib/orchestrator/command_group/base.rb +0 -56
- data/lib/orchestrator/command_group/custom.rb +0 -13
- data/lib/orchestrator/command_group/direct.rb +0 -53
- data/lib/orchestrator/direct_command/group.rb +0 -21
- data/lib/orchestrator/direct_command/instance.rb +0 -19
- data/lib/orchestrator/factory.rb +0 -38
- data/lib/orchestrator/loader.rb +0 -47
- data/lib/orchestrator/node_target/all.rb +0 -14
- data/lib/orchestrator/node_target/all_excluding_roles.rb +0 -14
- data/lib/orchestrator/node_target/all_with_roles.rb +0 -14
- data/lib/orchestrator/node_target/base.rb +0 -43
- data/lib/orchestrator/node_target/single.rb +0 -12
- data/lib/orchestrator/recipe.rb +0 -60
- data/lib/orchestrator/registry.rb +0 -37
- data/lib/orchestrator/validate_and_set.rb +0 -10
- data/lib/patches/string.rb +0 -86
- data/lib/progress_bar.rb +0 -31
- data/lib/render_irb.rb +0 -53
- data/lib/scp.rb +0 -40
- data/lib/ssh.rb +0 -51
- data/lib/stack/base.rb +0 -148
- data/lib/stack/environment.rb +0 -222
- data/lib/stack/estate.rb +0 -50
- data/lib/stack/instance.rb +0 -130
- data/lib/stack/platform.rb +0 -74
- data/lib/stack/view.rb +0 -56
- data/lib/workspace_context.rb +0 -40
@@ -0,0 +1,47 @@
|
|
1
|
+
module Bcome::Node::Attributes
|
2
|
+
## -- Attributes --
|
3
|
+
|
4
|
+
def identifier
|
5
|
+
@identifier
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
@description
|
10
|
+
end
|
11
|
+
|
12
|
+
def type
|
13
|
+
@type
|
14
|
+
end
|
15
|
+
|
16
|
+
def ssh_driver
|
17
|
+
@ssh_driver ||= ::Bcome::Ssh::Driver.new(ssh_data, self)
|
18
|
+
end
|
19
|
+
|
20
|
+
def ssh_data
|
21
|
+
instance_var_name = '@ssh_settings'
|
22
|
+
recurse_hash_data_for_instance_var(instance_var_name, :ssh_data)
|
23
|
+
end
|
24
|
+
|
25
|
+
def network_driver
|
26
|
+
return nil if !network_data || (network_data.is_a?(Hash) && network_data.empty?)
|
27
|
+
@network_driver ||= ::Bcome::Driver::Bucket.instance.driver_for_network_data(network_data)
|
28
|
+
@network_driver
|
29
|
+
end
|
30
|
+
|
31
|
+
def filters
|
32
|
+
instance_var_name = '@ec2_filters'
|
33
|
+
recurse_hash_data_for_instance_var(instance_var_name, :filters)
|
34
|
+
end
|
35
|
+
|
36
|
+
def network_data
|
37
|
+
instance_var_name = '@network'
|
38
|
+
recurse_hash_data_for_instance_var(instance_var_name, :network_data)
|
39
|
+
end
|
40
|
+
|
41
|
+
def recurse_hash_data_for_instance_var(instance_var_name, parent_key)
|
42
|
+
instance_data = instance_variable_defined?(instance_var_name) ? instance_variable_get(instance_var_name) : {}
|
43
|
+
instance_data ||= {}
|
44
|
+
instance_data = parent.send(parent_key).merge(instance_data) if has_parent?
|
45
|
+
instance_data
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,248 @@
|
|
1
|
+
module Bcome::Node
|
2
|
+
class Base
|
3
|
+
|
4
|
+
include Bcome::Context
|
5
|
+
include Bcome::WorkspaceCommands
|
6
|
+
include Bcome::Node::Attributes
|
7
|
+
include Bcome::WorkspaceMenu
|
8
|
+
include Bcome::Node::LocalMetaDataFactory
|
9
|
+
include Bcome::Node::RegistryManagement
|
10
|
+
|
11
|
+
DEFAULT_IDENTIFIER = "bcome"
|
12
|
+
|
13
|
+
def self.const_missing(constant)
|
14
|
+
## Hook for direct access to node level resources by constant name where
|
15
|
+
## cd ServerName should yield the same outcome as cd "ServerName"
|
16
|
+
set_context = ::IRB.CurrentContext.workspace.main
|
17
|
+
return (set_context.resource_for_identifier(constant.to_s)) ? constant.to_s : super
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :params
|
21
|
+
|
22
|
+
def initialize(params)
|
23
|
+
@params = params
|
24
|
+
@identifier = nil
|
25
|
+
@description = nil
|
26
|
+
@views = params[:views]
|
27
|
+
@parent = params[:parent]
|
28
|
+
@type = params[:type]
|
29
|
+
@metadata = {}
|
30
|
+
|
31
|
+
set_view_attributes if @views
|
32
|
+
validate_attributes
|
33
|
+
::Bcome::Registry::Loader.instance.set_command_group_for_node(self)
|
34
|
+
end
|
35
|
+
|
36
|
+
def bootstrap?
|
37
|
+
false
|
38
|
+
end
|
39
|
+
|
40
|
+
def collection?
|
41
|
+
false
|
42
|
+
end
|
43
|
+
|
44
|
+
def inventory?
|
45
|
+
false
|
46
|
+
end
|
47
|
+
|
48
|
+
def server?
|
49
|
+
false
|
50
|
+
end
|
51
|
+
|
52
|
+
def enabled_menu_items
|
53
|
+
[:ls, :lsa, :workon, :enable, :disable, :enable!, :disable!, :run, :tree, :ping, :put, :rsync, :cd, :meta, :registry, :interactive, :execute_script]
|
54
|
+
end
|
55
|
+
|
56
|
+
def has_proxy?
|
57
|
+
ssh_driver.has_proxy?
|
58
|
+
end
|
59
|
+
|
60
|
+
def proxy
|
61
|
+
ssh_driver.proxy
|
62
|
+
end
|
63
|
+
|
64
|
+
# TODO - why not do these in parallel?
|
65
|
+
def scp(local_path, remote_path)
|
66
|
+
resources.active.each do |resource|
|
67
|
+
resource.put(local_path, remote_path)
|
68
|
+
end
|
69
|
+
return
|
70
|
+
end
|
71
|
+
|
72
|
+
def rsync(local_path, remote_path)
|
73
|
+
resources.active.each do |resource|
|
74
|
+
resource.rsync(local_path, remote_path)
|
75
|
+
end
|
76
|
+
return
|
77
|
+
end
|
78
|
+
|
79
|
+
def put(local_path, remote_path)
|
80
|
+
resources.active.each do |resource|
|
81
|
+
resource.put(local_path, remote_path)
|
82
|
+
end
|
83
|
+
return
|
84
|
+
end
|
85
|
+
|
86
|
+
def execute_script(script_name)
|
87
|
+
results = {}
|
88
|
+
machines.pmap do |machine|
|
89
|
+
command = machine.execute_script(script_name)
|
90
|
+
results[machine.namespace] = command
|
91
|
+
end
|
92
|
+
results
|
93
|
+
end
|
94
|
+
|
95
|
+
def validate_attributes
|
96
|
+
validate_identifier
|
97
|
+
raise ::Bcome::Exception::MissingDescriptionOnView.new(@views.inspect) if requires_description? && !@description
|
98
|
+
raise ::Bcome::Exception::MissingTypeOnView.new(@views.inspect) if requires_type? && !@type
|
99
|
+
end
|
100
|
+
|
101
|
+
def validate_identifier
|
102
|
+
@identifier = DEFAULT_IDENTIFIER if is_top_level_node? && !@identifier && !is_a?(::Bcome::Node::Server::Base)
|
103
|
+
raise ::Bcome::Exception::MissingIdentifierOnView.new(@views.inspect) unless @identifier
|
104
|
+
raise ::Bcome::Exception::InvalidIdentifier.new("'#{@identifier}' contains whitespace") if @identifier =~ /\s/
|
105
|
+
end
|
106
|
+
|
107
|
+
def requires_description?
|
108
|
+
true
|
109
|
+
end
|
110
|
+
|
111
|
+
def requires_type?
|
112
|
+
true
|
113
|
+
end
|
114
|
+
|
115
|
+
def no_nodes?
|
116
|
+
!resources || resources.empty?
|
117
|
+
end
|
118
|
+
|
119
|
+
def nodes_loaded?
|
120
|
+
resources.any?
|
121
|
+
end
|
122
|
+
|
123
|
+
def resources
|
124
|
+
@resources ||= ::Bcome::Node::Resources::Base.new
|
125
|
+
end
|
126
|
+
|
127
|
+
def list_key
|
128
|
+
:view
|
129
|
+
end
|
130
|
+
|
131
|
+
def invoke(method_name, arguments = [])
|
132
|
+
if method_is_available_on_node?(method_name)
|
133
|
+
if respond_to?(method_name)
|
134
|
+
# Invoke a method on node that's defined by the system
|
135
|
+
begin
|
136
|
+
if arguments && arguments.any?
|
137
|
+
send(method_name, *arguments)
|
138
|
+
else
|
139
|
+
send(method_name)
|
140
|
+
end
|
141
|
+
rescue ArgumentError => e
|
142
|
+
raise ::Bcome::Exception::ArgumentErrorInvokingMethodFromCommmandLine.new method_name + "error message - #{e.message}"
|
143
|
+
end
|
144
|
+
else
|
145
|
+
# Invoke a user defined (registry) method
|
146
|
+
command = user_command_wrapper.command_for_console_command_name(method_name.to_sym)
|
147
|
+
command.execute(self, arguments)
|
148
|
+
end
|
149
|
+
else
|
150
|
+
# Final crumb is neither a node level context nor an executable method on the penultimate node level context
|
151
|
+
raise ::Bcome::Exception::InvalidBreadcrumb.new("Method '#{method_name}' is not available on bcome node of type #{self.class}, at namespace #{namespace}")
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def resource_for_identifier(identifier)
|
156
|
+
resources.for_identifier(identifier)
|
157
|
+
end
|
158
|
+
|
159
|
+
def recurse_resource_for_identifier(identifier)
|
160
|
+
resource = resource_for_identifier(identifier)
|
161
|
+
return resource ? resource : (has_parent? ? parent.recurse_resource_for_identifier(identifier) : nil)
|
162
|
+
end
|
163
|
+
|
164
|
+
def prompt_breadcrumb
|
165
|
+
"#{has_parent? ? "#{parent.prompt_breadcrumb}> " : "" }#{ is_current_context? ? (has_parent? ? identifier.terminal_prompt : identifier) : identifier}"
|
166
|
+
end
|
167
|
+
|
168
|
+
def namespace
|
169
|
+
"#{ parent ? "#{parent.namespace}:" : "" }#{identifier}"
|
170
|
+
end
|
171
|
+
|
172
|
+
def keyed_namespace
|
173
|
+
splits = namespace.split(":") ;
|
174
|
+
splits[1..splits.size].join(":")
|
175
|
+
end
|
176
|
+
|
177
|
+
def has_parent?
|
178
|
+
!@parent.nil?
|
179
|
+
end
|
180
|
+
|
181
|
+
def is_top_level_node?
|
182
|
+
!has_parent?
|
183
|
+
end
|
184
|
+
|
185
|
+
def list_attributes
|
186
|
+
{
|
187
|
+
"Identifier": :identifier,
|
188
|
+
"Description": :description,
|
189
|
+
"Type": :type
|
190
|
+
}
|
191
|
+
end
|
192
|
+
|
193
|
+
def close_ssh_connections
|
194
|
+
machines.pmap do |machine|
|
195
|
+
machine.close_ssh_connection
|
196
|
+
end
|
197
|
+
return
|
198
|
+
end
|
199
|
+
|
200
|
+
def open_ssh_connections
|
201
|
+
machines.pmap do |machine|
|
202
|
+
machine.open_ssh_connection unless machine.has_ssh_connection?
|
203
|
+
end
|
204
|
+
return
|
205
|
+
end
|
206
|
+
|
207
|
+
def execute_local(command)
|
208
|
+
puts "(local) > #{command}"
|
209
|
+
system(command)
|
210
|
+
end
|
211
|
+
|
212
|
+
def data_print_from_hash(data, heading)
|
213
|
+
puts "\n#{heading.title}"
|
214
|
+
puts ""
|
215
|
+
|
216
|
+
if data.keys.any?
|
217
|
+
data.each do |key, value|
|
218
|
+
puts "#{key.to_s.resource_key}: #{value.to_s.informational}"
|
219
|
+
end
|
220
|
+
else
|
221
|
+
puts "No values found".warning
|
222
|
+
end
|
223
|
+
puts ""
|
224
|
+
end
|
225
|
+
|
226
|
+
private
|
227
|
+
|
228
|
+
def set_view_attributes
|
229
|
+
@views.keys.each do |view_attribute_key|
|
230
|
+
next if view_attributes_to_skip_on_setup.include?(view_attribute_key)
|
231
|
+
instance_variable_set("@#{view_attribute_key}", @views[view_attribute_key])
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
def view_attributes_to_skip_on_setup
|
236
|
+
[:views]
|
237
|
+
end
|
238
|
+
|
239
|
+
private
|
240
|
+
|
241
|
+
def to_ary
|
242
|
+
# due to my method_missing implementation, the following is required.
|
243
|
+
# with thanks to https://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary.html & http://yehudakatz.com/2010/01/02/the-craziest-fing-bug-ive-ever-seen/
|
244
|
+
nil
|
245
|
+
end
|
246
|
+
|
247
|
+
end
|
248
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Bcome::Node
|
2
|
+
class CacheHandler
|
3
|
+
def initialize(inventory_node)
|
4
|
+
@inventory_node = inventory_node
|
5
|
+
end
|
6
|
+
|
7
|
+
def do_cache_nodes!
|
8
|
+
@inventory_node.load_nodes unless @inventory_node.nodes_loaded?
|
9
|
+
all_nodes = @inventory_node.resources.active
|
10
|
+
write_to_in_memory_cache!(all_nodes) if all_nodes.any?
|
11
|
+
end
|
12
|
+
|
13
|
+
def write_to_in_memory_cache!(nodes)
|
14
|
+
@inventory_node.views[:load_machines_from_cache] = true
|
15
|
+
static_server_data = dynamic_nodes_to_cache_hash(nodes)
|
16
|
+
@inventory_node.views[:static_servers] = static_server_data
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def dynamic_nodes_to_cache_hash(nodes)
|
21
|
+
nodes.collect(&:cache_data)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Bcome::Node
|
2
|
+
class Collection < ::Bcome::Node::Base
|
3
|
+
def self.to_s
|
4
|
+
'collection'
|
5
|
+
end
|
6
|
+
|
7
|
+
def inventories
|
8
|
+
inv = []
|
9
|
+
@resources.active.each do |r|
|
10
|
+
inv << if r.inventory?
|
11
|
+
r
|
12
|
+
else
|
13
|
+
r.inventories
|
14
|
+
end
|
15
|
+
end
|
16
|
+
inv.flatten
|
17
|
+
end
|
18
|
+
|
19
|
+
def filter_duplicates(original_set)
|
20
|
+
instance_lookup = []
|
21
|
+
filtered_set = []
|
22
|
+
original_set.each do |server|
|
23
|
+
unless instance_lookup.include?(server.origin_object_id)
|
24
|
+
filtered_set << server
|
25
|
+
instance_lookup << server.origin_object_id
|
26
|
+
end
|
27
|
+
end
|
28
|
+
filtered_set
|
29
|
+
end
|
30
|
+
|
31
|
+
def machines
|
32
|
+
set = []
|
33
|
+
@resources.active.each do |resource|
|
34
|
+
if resource.inventory?
|
35
|
+
resource.load_nodes unless resource.nodes_loaded?
|
36
|
+
set << resource.resources.active
|
37
|
+
else
|
38
|
+
set << resource.machines
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
set.flatten!
|
43
|
+
|
44
|
+
filter_duplicates(set)
|
45
|
+
end
|
46
|
+
|
47
|
+
def collection?
|
48
|
+
true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module Bcome::Node
|
2
|
+
class Factory
|
3
|
+
include Singleton
|
4
|
+
|
5
|
+
attr_reader :estate
|
6
|
+
|
7
|
+
CONFIG_PATH = 'bcome'.freeze
|
8
|
+
DEFAULT_CONFIG_NAME = 'networks.yml'.freeze
|
9
|
+
INVENTORY_KEY = 'inventory'.freeze
|
10
|
+
COLLECTION_KEY = 'collection'.freeze
|
11
|
+
SUBSELECT_KEY = 'inventory-subselect'.freeze
|
12
|
+
BCOME_RC_FILENAME = '.bcomerc'.freeze
|
13
|
+
|
14
|
+
def bucket
|
15
|
+
@bucket ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def init_tree
|
19
|
+
@estate = create_node(estate_config)
|
20
|
+
@estate
|
21
|
+
end
|
22
|
+
|
23
|
+
def config_path
|
24
|
+
"#{CONFIG_PATH}/#{config_file_name}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def config_file_name
|
28
|
+
@config_file_name ||= ENV['CONF'] ? ENV['CONF'] : DEFAULT_CONFIG_NAME
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_tree(context_node, views)
|
32
|
+
views.each { |config| create_node(config, context_node) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def reformat_config(config)
|
36
|
+
conf = ::Bcome::ConfigFactory.new
|
37
|
+
config.each do |crumb, data|
|
38
|
+
validate_view(crumb, data)
|
39
|
+
crumbs = Bcome::Parser::BreadCrumb.parse(crumb)
|
40
|
+
conf.add_crumbs(crumbs, data)
|
41
|
+
end
|
42
|
+
conf.flattened
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_node(config, parent = nil)
|
46
|
+
raise Bcome::Exception::InvalidNetworkConfig, 'missing config type' unless config[:type]
|
47
|
+
|
48
|
+
klass = klass_for_view_type[config[:type]]
|
49
|
+
|
50
|
+
raise Bcome::Exception::InvalidNetworkConfig, "invalid config type #{config[:type]}" unless klass
|
51
|
+
|
52
|
+
node = klass.new(views: config, parent: parent)
|
53
|
+
create_tree(node, config[:views]) if config[:views] && config[:views].any?
|
54
|
+
parent.resources << node if parent
|
55
|
+
|
56
|
+
bucket[node.keyed_namespace] = node
|
57
|
+
|
58
|
+
node
|
59
|
+
end
|
60
|
+
|
61
|
+
def validate_view(breadcrumb, data)
|
62
|
+
unless data && data[:type]
|
63
|
+
raise Bcome::Exception::InvalidNetworkConfig, "Missing namespace type for for namespace '#{breadcrumb}'"
|
64
|
+
end
|
65
|
+
|
66
|
+
unless is_valid_view_type?(data[:type])
|
67
|
+
raise Bcome::Exception::InvalidNetworkConfig, "Invalid View Type '#{data[:type]}' for namespace '#{breadcrumb}'. Expecting View Type to be one of: #{klass_for_view_type.keys.join(', ')}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def klass_for_view_type
|
72
|
+
{
|
73
|
+
COLLECTION_KEY => ::Bcome::Node::Collection,
|
74
|
+
INVENTORY_KEY => ::Bcome::Node::Inventory::Defined,
|
75
|
+
SUBSELECT_KEY => ::Bcome::Node::Inventory::Subselect
|
76
|
+
}
|
77
|
+
end
|
78
|
+
|
79
|
+
def is_valid_view_type?(view_type)
|
80
|
+
klass_for_view_type.keys.include?(view_type)
|
81
|
+
end
|
82
|
+
|
83
|
+
def estate_config
|
84
|
+
@estate_config ||= reformat_config(load_estate_config)
|
85
|
+
end
|
86
|
+
|
87
|
+
def rewrite_estate_config(data)
|
88
|
+
File.open(config_path, 'w') do |file|
|
89
|
+
file.write data.to_yaml
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def load_estate_config
|
94
|
+
config = YAML.load_file(config_path).deep_symbolize_keys
|
95
|
+
return config
|
96
|
+
rescue ArgumentError, Psych::SyntaxError => e
|
97
|
+
raise Bcome::Exception::InvalidNetworkConfig, 'Invalid yaml in config' + e.message
|
98
|
+
rescue Errno::ENOENT
|
99
|
+
raise Bcome::Exception::DeprecationWarning if is_running_deprecated_configs?
|
100
|
+
raise Bcome::Exception::MissingNetworkConfig, config_path
|
101
|
+
end
|
102
|
+
|
103
|
+
def is_running_deprecated_configs?
|
104
|
+
File.exist?("bcome/config/platform.yml")
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|