bcome 0.7.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|