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.
Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bcome +8 -39
  3. data/lib/bcome.rb +12 -3
  4. data/lib/objects/bcome/version.rb +3 -0
  5. data/lib/objects/bootup.rb +81 -0
  6. data/lib/objects/command/local.rb +40 -0
  7. data/lib/objects/config_factory.rb +36 -0
  8. data/lib/objects/driver/base.rb +30 -0
  9. data/lib/objects/driver/bucket.rb +20 -0
  10. data/lib/objects/driver/ec2.rb +44 -0
  11. data/lib/objects/driver/static.rb +4 -0
  12. data/lib/objects/exception/argument_error_invoking_method_from_command_line.rb +7 -0
  13. data/lib/objects/exception/base.rb +15 -0
  14. data/lib/objects/exception/can_only_subselect_on_inventory.rb +7 -0
  15. data/lib/objects/exception/cannot_find_internal_registry_klass.rb +7 -0
  16. data/lib/objects/exception/cannot_find_subselection_parent.rb +7 -0
  17. data/lib/objects/exception/cant_find_key_in_cloud_tags.rb +7 -0
  18. data/lib/objects/exception/cant_find_key_in_metadata.rb +7 -0
  19. data/lib/objects/exception/cant_find_proxy_host_by_identifier.rb +7 -0
  20. data/lib/objects/exception/cant_find_proxy_host_by_namespace.rb +7 -0
  21. data/lib/objects/exception/could_not_initiate_ssh_connection.rb +7 -0
  22. data/lib/objects/exception/could_not_initiate_ssh_connection_through_backend_proxy.rb +7 -0
  23. data/lib/objects/exception/deprecation_warning.rb +11 -0
  24. data/lib/objects/exception/duplicate_command_line_argument_key.rb +7 -0
  25. data/lib/objects/exception/ec2_driver_missing_provisioning_region.rb +7 -0
  26. data/lib/objects/exception/failed_to_run_local_command.rb +7 -0
  27. data/lib/objects/exception/interactive_session_halt.rb +4 -0
  28. data/lib/objects/exception/invalid_bcome_breadcrumb.rb +7 -0
  29. data/lib/objects/exception/invalid_breadcrumb.rb +7 -0
  30. data/lib/objects/exception/invalid_context_command.rb +7 -0
  31. data/lib/objects/exception/invalid_identifier.rb +7 -0
  32. data/lib/objects/exception/invalid_machines_cache_config.rb +7 -0
  33. data/lib/objects/exception/invalid_matcher_query.rb +7 -0
  34. data/lib/objects/exception/invalid_meta_data_config.rb +7 -0
  35. data/lib/objects/exception/invalid_network_config.rb +7 -0
  36. data/lib/objects/exception/invalid_network_driver_type.rb +7 -0
  37. data/lib/objects/exception/invalid_proxy_config.rb +7 -0
  38. data/lib/objects/exception/invalid_regexp_matcher_in_registry.rb +7 -0
  39. data/lib/objects/exception/invalid_registry_arguments_type.rb +7 -0
  40. data/lib/objects/exception/invalid_registry_data_config.rb +7 -0
  41. data/lib/objects/exception/invalid_restriction_key_in_registry.rb +7 -0
  42. data/lib/objects/exception/invalid_ssh_config.rb +7 -0
  43. data/lib/objects/exception/inventories_cannot_have_subviews.rb +7 -0
  44. data/lib/objects/exception/malformed_command_line_arguments.rb +7 -0
  45. data/lib/objects/exception/method_invocation_requires_parameter.rb +7 -0
  46. data/lib/objects/exception/method_name_conflict_in_registry.rb +7 -0
  47. data/lib/objects/exception/missing_argument_for_registry_command.rb +7 -0
  48. data/lib/objects/exception/missing_description_on_view.rb +7 -0
  49. data/lib/objects/exception/missing_execute_on_registry_object.rb +7 -0
  50. data/lib/objects/exception/missing_identifier_on_view.rb +7 -0
  51. data/lib/objects/exception/missing_ip_address_on_server.rb +7 -0
  52. data/lib/objects/exception/missing_network_config.rb +7 -0
  53. data/lib/objects/exception/missing_params_for_rsync.rb +7 -0
  54. data/lib/objects/exception/missing_params_for_scp.rb +7 -0
  55. data/lib/objects/exception/missing_subselection_key.rb +7 -0
  56. data/lib/objects/exception/missing_type_on_view.rb +7 -0
  57. data/lib/objects/exception/no_node_found_for_breadcrumb.rb +7 -0
  58. data/lib/objects/exception/no_node_named_by_identifier.rb +7 -0
  59. data/lib/objects/exception/node_identifiers_must_be_unique.rb +7 -0
  60. data/lib/objects/exception/orchestration_script_does_not_exist.rb +7 -0
  61. data/lib/objects/exception/proxy_host_node_does_not_have_public_ip_address.rb +7 -0
  62. data/lib/objects/exception/unknown_method_for_namespace.rb +7 -0
  63. data/lib/objects/interactive/session.rb +45 -0
  64. data/lib/objects/interactive/session_item/base.rb +36 -0
  65. data/lib/objects/interactive/session_item/capture_input.rb +20 -0
  66. data/lib/objects/interactive/session_item/transparent_ssh.rb +111 -0
  67. data/lib/objects/modules/context.rb +13 -0
  68. data/lib/objects/modules/registry_management.rb +14 -0
  69. data/lib/objects/modules/ui_output.rb +9 -0
  70. data/lib/objects/modules/workspace_commands.rb +198 -0
  71. data/lib/objects/modules/workspace_menu.rb +128 -0
  72. data/lib/objects/node/attributes.rb +47 -0
  73. data/lib/objects/node/base.rb +248 -0
  74. data/lib/objects/node/cache_handler.rb +24 -0
  75. data/lib/objects/node/collection.rb +51 -0
  76. data/lib/objects/node/factory.rb +108 -0
  77. data/lib/objects/node/inventory/base.rb +88 -0
  78. data/lib/objects/node/inventory/defined.rb +112 -0
  79. data/lib/objects/node/inventory/subselect.rb +54 -0
  80. data/lib/objects/node/meta/base.rb +36 -0
  81. data/lib/objects/node/meta/cloud.rb +4 -0
  82. data/lib/objects/node/meta/local.rb +4 -0
  83. data/lib/objects/node/meta_data_factory.rb +23 -0
  84. data/lib/objects/node/meta_data_loader.rb +32 -0
  85. data/lib/objects/node/resources/base.rb +98 -0
  86. data/lib/objects/node/resources/inventory.rb +25 -0
  87. data/lib/objects/node/resources/sub_inventory.rb +56 -0
  88. data/lib/objects/node/server/base.rb +218 -0
  89. data/lib/objects/node/server/dynamic.rb +39 -0
  90. data/lib/objects/node/server/static.rb +31 -0
  91. data/lib/objects/orchestration/base.rb +13 -0
  92. data/lib/objects/orchestrator.rb +24 -0
  93. data/lib/objects/parser/bread_crumb.rb +31 -0
  94. data/lib/objects/progress_bar.rb +30 -0
  95. data/lib/objects/registry/arguments/base.rb +36 -0
  96. data/lib/objects/registry/arguments/command_line.rb +35 -0
  97. data/lib/objects/registry/arguments/console.rb +15 -0
  98. data/lib/objects/registry/command/base.rb +66 -0
  99. data/lib/objects/registry/command/external.rb +55 -0
  100. data/lib/objects/registry/command/group.rb +76 -0
  101. data/lib/objects/registry/command/internal.rb +34 -0
  102. data/lib/objects/registry/command_list.rb +33 -0
  103. data/lib/objects/registry/loader.rb +70 -0
  104. data/lib/objects/ssh/bootstrap.rb +19 -0
  105. data/lib/objects/ssh/command.rb +46 -0
  106. data/lib/objects/ssh/command_exec.rb +65 -0
  107. data/lib/objects/ssh/connection_handler.rb +101 -0
  108. data/lib/objects/ssh/driver.rb +204 -0
  109. data/lib/objects/ssh/proxy_data.rb +56 -0
  110. data/lib/objects/ssh/script_exec.rb +43 -0
  111. data/lib/objects/system/local.rb +30 -0
  112. data/lib/objects/workspace.rb +75 -0
  113. data/patches/irb.rb +20 -7
  114. data/patches/string.rb +75 -0
  115. data/patches/string_stylesheet.rb +61 -0
  116. metadata +175 -93
  117. data/bin/bcome-bash-setup +0 -18
  118. data/bin/bcome-setup +0 -43
  119. data/bin/boot.rb +0 -148
  120. data/bin/boot_no_shell.rb +0 -3
  121. data/filters/ec2_filter.rb +0 -12
  122. data/lib/bcome/version.rb +0 -3
  123. data/lib/become_object.rb +0 -111
  124. data/lib/boot.rb +0 -13
  125. data/lib/command.rb +0 -56
  126. data/lib/context_functions.rb +0 -65
  127. data/lib/filters/base.rb +0 -10
  128. data/lib/filters/ec2_filter.rb +0 -4
  129. data/lib/functions.rb +0 -70
  130. data/lib/helpers/command_helper.rb +0 -13
  131. data/lib/helpers/environment_ssh.rb +0 -122
  132. data/lib/helpers/fog_helper.rb +0 -108
  133. data/lib/helpers/instance_command.rb +0 -71
  134. data/lib/helpers/instance_ssh.rb +0 -83
  135. data/lib/helpers/selections.rb +0 -117
  136. data/lib/interactive/interactive_session_halt.rb +0 -4
  137. data/lib/interactive/session.rb +0 -44
  138. data/lib/interactive/session_item/base.rb +0 -30
  139. data/lib/interactive/session_item/transparent_ssh.rb +0 -133
  140. data/lib/nodes/base.rb +0 -60
  141. data/lib/nodes/environment.rb +0 -30
  142. data/lib/nodes/estate.rb +0 -44
  143. data/lib/nodes/instance.rb +0 -94
  144. data/lib/nodes/platform.rb +0 -17
  145. data/lib/nodes/view.rb +0 -31
  146. data/lib/object.rb +0 -21
  147. data/lib/orchestrator/command_group/base.rb +0 -56
  148. data/lib/orchestrator/command_group/custom.rb +0 -13
  149. data/lib/orchestrator/command_group/direct.rb +0 -53
  150. data/lib/orchestrator/direct_command/group.rb +0 -21
  151. data/lib/orchestrator/direct_command/instance.rb +0 -19
  152. data/lib/orchestrator/factory.rb +0 -38
  153. data/lib/orchestrator/loader.rb +0 -47
  154. data/lib/orchestrator/node_target/all.rb +0 -14
  155. data/lib/orchestrator/node_target/all_excluding_roles.rb +0 -14
  156. data/lib/orchestrator/node_target/all_with_roles.rb +0 -14
  157. data/lib/orchestrator/node_target/base.rb +0 -43
  158. data/lib/orchestrator/node_target/single.rb +0 -12
  159. data/lib/orchestrator/recipe.rb +0 -60
  160. data/lib/orchestrator/registry.rb +0 -37
  161. data/lib/orchestrator/validate_and_set.rb +0 -10
  162. data/lib/patches/string.rb +0 -86
  163. data/lib/progress_bar.rb +0 -31
  164. data/lib/render_irb.rb +0 -53
  165. data/lib/scp.rb +0 -40
  166. data/lib/ssh.rb +0 -51
  167. data/lib/stack/base.rb +0 -148
  168. data/lib/stack/environment.rb +0 -222
  169. data/lib/stack/estate.rb +0 -50
  170. data/lib/stack/instance.rb +0 -130
  171. data/lib/stack/platform.rb +0 -74
  172. data/lib/stack/view.rb +0 -56
  173. 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