bcome 1.3.2 → 1.4.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 (165) hide show
  1. checksums.yaml +5 -5
  2. data/bin/bcome +13 -8
  3. data/lib/bcome.rb +7 -11
  4. data/lib/objects/bcome/version.rb +19 -1
  5. data/lib/objects/bootup.rb +13 -5
  6. data/lib/objects/command/local.rb +2 -0
  7. data/lib/objects/config_factory.rb +3 -0
  8. data/lib/objects/driver/base.rb +36 -4
  9. data/lib/objects/driver/bucket.rb +6 -4
  10. data/lib/objects/driver/ec2.rb +35 -4
  11. data/lib/objects/driver/gcp.rb +124 -0
  12. data/lib/objects/driver/gcp/authentication/api_key.rb +6 -0
  13. data/lib/objects/driver/gcp/authentication/oauth.rb +101 -0
  14. data/lib/objects/driver/gcp/authentication/service_account.rb +7 -0
  15. data/lib/objects/driver/static.rb +2 -0
  16. data/lib/objects/encryptor.rb +26 -24
  17. data/lib/objects/exception/argument_error_invoking_method_from_command_line.rb +8 -4
  18. data/lib/objects/exception/base.rb +14 -10
  19. data/lib/objects/exception/can_only_subselect_on_inventory.rb +8 -4
  20. data/lib/objects/exception/cannot_authenticate_to_gcp.rb +11 -0
  21. data/lib/objects/exception/cannot_find_internal_registry_klass.rb +8 -4
  22. data/lib/objects/exception/cannot_find_inventory.rb +11 -0
  23. data/lib/objects/exception/cannot_find_subselection_parent.rb +8 -4
  24. data/lib/objects/exception/cant_find_key_in_cloud_tags.rb +8 -4
  25. data/lib/objects/exception/cant_find_key_in_metadata.rb +8 -4
  26. data/lib/objects/exception/cant_find_proxy_host_by_identifier.rb +8 -4
  27. data/lib/objects/exception/cant_find_proxy_host_by_namespace.rb +8 -4
  28. data/lib/objects/exception/could_not_initiate_ssh_connection.rb +8 -4
  29. data/lib/objects/exception/could_not_initiate_ssh_connection_through_backend_proxy.rb +8 -4
  30. data/lib/objects/exception/could_not_retrieve_terraform_output.rb +11 -0
  31. data/lib/objects/exception/deprecation_warning.rb +9 -7
  32. data/lib/objects/exception/duplicate_command_line_argument_key.rb +8 -4
  33. data/lib/objects/exception/ec2_driver_missing_provisioning_region.rb +8 -4
  34. data/lib/objects/exception/failed_to_run_local_command.rb +8 -4
  35. data/lib/objects/exception/generic.rb +11 -0
  36. data/lib/objects/exception/interactive_session_halt.rb +6 -2
  37. data/lib/objects/exception/invalid_bcome_breadcrumb.rb +8 -4
  38. data/lib/objects/exception/invalid_breadcrumb.rb +8 -4
  39. data/lib/objects/exception/invalid_context_command.rb +8 -4
  40. data/lib/objects/exception/invalid_gcp_authentication_scheme.rb +11 -0
  41. data/lib/objects/exception/invalid_identifier.rb +8 -4
  42. data/lib/objects/exception/invalid_machines_cache_config.rb +8 -4
  43. data/lib/objects/exception/invalid_matcher_query.rb +8 -4
  44. data/lib/objects/exception/invalid_meta_data_config.rb +8 -4
  45. data/lib/objects/exception/invalid_metadata_encryption_key.rb +8 -4
  46. data/lib/objects/exception/invalid_network_config.rb +8 -4
  47. data/lib/objects/exception/invalid_network_driver_type.rb +8 -4
  48. data/lib/objects/exception/invalid_port_forward_request.rb +11 -0
  49. data/lib/objects/exception/invalid_proxy_config.rb +8 -4
  50. data/lib/objects/exception/invalid_regexp_matcher_in_registry.rb +8 -4
  51. data/lib/objects/exception/invalid_registry_arguments_type.rb +8 -4
  52. data/lib/objects/exception/invalid_registry_command_name_length.rb +8 -4
  53. data/lib/objects/exception/invalid_registry_data_config.rb +8 -4
  54. data/lib/objects/exception/invalid_restriction_key_in_registry.rb +8 -4
  55. data/lib/objects/exception/invalid_ssh_config.rb +8 -4
  56. data/lib/objects/exception/inventories_cannot_have_subviews.rb +8 -4
  57. data/lib/objects/exception/malformed_command_line_arguments.rb +8 -4
  58. data/lib/objects/exception/method_invocation_requires_parameter.rb +8 -4
  59. data/lib/objects/exception/method_name_conflict_in_registry.rb +8 -4
  60. data/lib/objects/exception/missing_argument_for_registry_command.rb +8 -4
  61. data/lib/objects/exception/missing_description_on_view.rb +8 -4
  62. data/lib/objects/exception/missing_execute_on_registry_object.rb +8 -4
  63. data/lib/objects/exception/missing_gcp_authentication_scheme.rb +11 -0
  64. data/lib/objects/exception/missing_gcp_service_scopes.rb +11 -0
  65. data/lib/objects/exception/missing_identifier_on_view.rb +8 -4
  66. data/lib/objects/exception/missing_inventory_contributors.rb +11 -0
  67. data/lib/objects/exception/missing_ip_address_on_server.rb +8 -4
  68. data/lib/objects/exception/missing_network_config.rb +8 -4
  69. data/lib/objects/exception/missing_or_invalid_client_secrets.rb +11 -0
  70. data/lib/objects/exception/missing_params_for_rsync.rb +8 -4
  71. data/lib/objects/exception/missing_params_for_scp.rb +8 -4
  72. data/lib/objects/exception/missing_subselection_key.rb +8 -4
  73. data/lib/objects/exception/missing_type_on_view.rb +8 -4
  74. data/lib/objects/exception/no_node_found_for_breadcrumb.rb +8 -4
  75. data/lib/objects/exception/no_node_named_by_identifier.rb +8 -4
  76. data/lib/objects/exception/node_identifiers_must_be_unique.rb +8 -4
  77. data/lib/objects/exception/orchestration_script_does_not_exist.rb +8 -4
  78. data/lib/objects/exception/proxy_host_node_does_not_have_public_ip_address.rb +8 -4
  79. data/lib/objects/exception/unknown_dynamic_server_type.rb +11 -0
  80. data/lib/objects/exception/unknown_method_for_namespace.rb +8 -4
  81. data/lib/objects/interactive/session.rb +4 -1
  82. data/lib/objects/interactive/session_item/base.rb +2 -0
  83. data/lib/objects/interactive/session_item/capture_input.rb +2 -0
  84. data/lib/objects/interactive/session_item/transparent_ssh.rb +29 -23
  85. data/lib/objects/loading_bar/handler.rb +80 -0
  86. data/lib/objects/loading_bar/indicator/base.rb +64 -0
  87. data/lib/objects/loading_bar/indicator/basic.rb +34 -0
  88. data/lib/objects/loading_bar/indicator/progress.rb +26 -0
  89. data/lib/objects/loading_bar/pid_bucket.rb +27 -0
  90. data/lib/objects/modules/context.rb +13 -9
  91. data/lib/objects/modules/registry_management.rb +16 -10
  92. data/lib/objects/modules/ui_output.rb +10 -6
  93. data/lib/objects/modules/workspace_commands.rb +159 -155
  94. data/lib/objects/modules/workspace_menu.rb +129 -124
  95. data/lib/objects/node/attributes.rb +13 -21
  96. data/lib/objects/node/base.rb +116 -67
  97. data/lib/objects/node/cache_handler.rb +2 -0
  98. data/lib/objects/node/collection.rb +10 -9
  99. data/lib/objects/node/factory.rb +35 -28
  100. data/lib/objects/node/inventory/base.rb +100 -100
  101. data/lib/objects/node/inventory/defined.rb +110 -89
  102. data/lib/objects/node/inventory/merge.rb +43 -0
  103. data/lib/objects/node/inventory/subselect.rb +64 -46
  104. data/lib/objects/node/kube/base.rb +51 -0
  105. data/lib/objects/node/kube/container.rb +9 -0
  106. data/lib/objects/node/kube/estate.rb +19 -0
  107. data/lib/objects/node/kube/namespace.rb +24 -0
  108. data/lib/objects/node/kube/pod.rb +24 -0
  109. data/lib/objects/node/kube_wrap.rb +26 -0
  110. data/lib/objects/node/meta/base.rb +8 -1
  111. data/lib/objects/node/meta/cloud.rb +2 -0
  112. data/lib/objects/node/meta/local.rb +2 -0
  113. data/lib/objects/node/meta_data_factory.rb +3 -1
  114. data/lib/objects/node/meta_data_loader.rb +29 -23
  115. data/lib/objects/node/resources/base.rb +5 -1
  116. data/lib/objects/node/resources/inventory.rb +7 -5
  117. data/lib/objects/node/resources/merged.rb +38 -0
  118. data/lib/objects/node/resources/sub_inventory.rb +7 -4
  119. data/lib/objects/node/server/base.rb +91 -65
  120. data/lib/objects/node/server/dynamic/base.rb +23 -0
  121. data/lib/objects/node/server/{dynamic.rb → dynamic/ec2.rb} +14 -13
  122. data/lib/objects/node/server/dynamic/gcp.rb +47 -0
  123. data/lib/objects/node/server/static.rb +13 -2
  124. data/lib/objects/orchestration/base.rb +10 -0
  125. data/lib/objects/orchestration/interactive_terraform.rb +62 -27
  126. data/lib/objects/orchestrator.rb +22 -0
  127. data/lib/objects/parser/bread_crumb.rb +3 -1
  128. data/lib/objects/registry/arguments/base.rb +3 -1
  129. data/lib/objects/registry/arguments/command_line.rb +6 -1
  130. data/lib/objects/registry/arguments/console.rb +4 -1
  131. data/lib/objects/registry/command/base.rb +3 -0
  132. data/lib/objects/registry/command/external.rb +4 -2
  133. data/lib/objects/registry/command/group.rb +6 -3
  134. data/lib/objects/registry/command/internal.rb +3 -1
  135. data/lib/objects/registry/command/shortcut.rb +17 -9
  136. data/lib/objects/registry/command_list.rb +2 -0
  137. data/lib/objects/registry/loader.rb +10 -10
  138. data/lib/objects/ssh/bootstrap.rb +3 -1
  139. data/lib/objects/ssh/command.rb +10 -5
  140. data/lib/objects/ssh/command_exec.rb +13 -9
  141. data/lib/objects/ssh/connection_wrangler.rb +105 -0
  142. data/lib/objects/ssh/connector.rb +100 -0
  143. data/lib/objects/ssh/driver.rb +27 -215
  144. data/lib/objects/ssh/driver_concerns/command_strings.rb +17 -0
  145. data/lib/objects/ssh/driver_concerns/connection.rb +78 -0
  146. data/lib/objects/ssh/driver_concerns/functions.rb +89 -0
  147. data/lib/objects/ssh/driver_concerns/user.rb +32 -0
  148. data/lib/objects/ssh/{proxy_data.rb → proxy_hop.rb} +52 -7
  149. data/lib/objects/ssh/script_exec.rb +4 -1
  150. data/lib/objects/ssh/tunnel/local_port_forward.rb +5 -6
  151. data/lib/objects/ssh/tunnel_keeper.rb +21 -0
  152. data/lib/objects/ssh/window.rb +31 -0
  153. data/lib/objects/startup.rb +52 -0
  154. data/lib/objects/system/local.rb +3 -0
  155. data/lib/objects/terraform/output.rb +41 -0
  156. data/lib/objects/workspace.rb +3 -14
  157. data/patches/irb.rb +29 -6
  158. data/patches/string-encrypt.rb +20 -23
  159. data/patches/string.rb +5 -1
  160. data/patches/string_stylesheet.rb +2 -0
  161. metadata +101 -23
  162. data/lib/objects/progress_bar.rb +0 -30
  163. data/lib/objects/ssh/connection_handler.rb +0 -101
  164. data/lib/objects/terraform/parser.rb +0 -23
  165. data/lib/objects/terraform/state.rb +0 -34
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bcome
4
+ module Node
5
+ module Inventory
6
+ class Merge < ::Bcome::Node::Inventory::Base
7
+ attr_reader :dynamic_nodes_loaded
8
+
9
+ def initialize(*params)
10
+ super
11
+ raise Bcome::Exception::MissingInventoryContributors, @views unless @views[:contributors]
12
+ end
13
+
14
+ def nodes_loaded?
15
+ true
16
+ end
17
+
18
+ def contributing_inventories
19
+ @inventories ||= @views[:contributors].collect { |inventory_key| load_inventory(inventory_key) }
20
+ end
21
+
22
+ def resources
23
+ @resources ||= do_set_resources
24
+ end
25
+
26
+ def update_nodes
27
+ resources.update_nodes(self)
28
+ end
29
+
30
+ def do_set_resources
31
+ ::Bcome::Node::Resources::Merged.new(inventory: self)
32
+ end
33
+
34
+ def load_inventory(from_crumb)
35
+ inventory = ::Bcome::Node::Factory.instance.bucket[from_crumb]
36
+ raise Bcome::Exception::CannotFindInventory, "for key '#{from_crumb}'" unless inventory
37
+
38
+ inventory
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,60 +1,78 @@
1
- module Bcome::Node::Inventory
2
- class Subselect < ::Bcome::Node::Inventory::Base
3
- def initialize(*params)
4
- super
5
- raise Bcome::Exception::MissingSubselectionKey, @views unless @views[:subselect_from]
6
- update_nodes
7
- end
1
+ # frozen_string_literal: true
8
2
 
9
- def resources
10
- @resources ||= do_set_resources
11
- end
3
+ module Bcome
4
+ module Node
5
+ module Inventory
6
+ class Subselect < ::Bcome::Node::Inventory::Base
7
+ def initialize(*params)
8
+ super
9
+ raise Bcome::Exception::MissingSubselectionKey, @views unless @views[:subselect_from]
12
10
 
13
- def update_nodes
14
- resources.update_nodes(self)
15
- end
11
+ update_nodes
12
+ end
16
13
 
17
- def do_set_resources
18
- ::Bcome::Node::Resources::SubselectInventory.new(parent_inventory: parent_inventory, filters: filters)
19
- end
14
+ def enabled_menu_items
15
+ super + %i[reload]
16
+ end
20
17
 
21
- def nodes_loaded?
22
- true
23
- end
18
+ def menu_items
19
+ base_items = super.dup
24
20
 
25
- def filters
26
- # Flex point for filters, as obviously we need to support more than just ec2 filtering eventually
27
- @views[:filters] ? @views[:filters] : {}
28
- end
21
+ base_items[:reload] = {
22
+ description: 'Restock this inventory from remote',
23
+ console_only: true
24
+ }
25
+ base_items
26
+ end
29
27
 
30
- def self.to_s
31
- 'sub-inventory'
32
- end
28
+ def resources
29
+ @resources ||= do_set_resources
30
+ end
33
31
 
34
- def reload
35
- do_reload
36
- end
32
+ def update_nodes
33
+ resources.update_nodes(self)
34
+ end
37
35
 
38
- def do_reload
39
- parent_inventory.resources.reset_duplicate_nodes!
40
- parent_inventory.do_reload
41
- resources.run_subselect
42
- update_nodes
43
- return
44
- end
36
+ def do_set_resources
37
+ ::Bcome::Node::Resources::SubselectInventory.new(parent_inventory: parent_inventory, filters: filters)
38
+ end
45
39
 
46
- private
40
+ def nodes_loaded?
41
+ true
42
+ end
47
43
 
48
- def parent_inventory
49
- @parent_inventory ||= load_parent_inventory
50
- end
44
+ def filters
45
+ # Flex point for filters, as obviously we need to support more than just ec2 filtering eventually
46
+ @views[:filters] || {}
47
+ end
48
+
49
+ def reload
50
+ do_reload
51
+ end
52
+
53
+ def do_reload
54
+ parent_inventory.resources.reset_duplicate_nodes!
55
+ parent_inventory.do_reload
56
+ resources.run_subselect
57
+ update_nodes
58
+ nil
59
+ end
60
+
61
+ private
62
+
63
+ def parent_inventory
64
+ @parent_inventory ||= load_parent_inventory
65
+ end
66
+
67
+ def load_parent_inventory
68
+ parent_crumb = @views[:subselect_from]
69
+ parent = ::Bcome::Node::Factory.instance.bucket[parent_crumb]
70
+ raise Bcome::Exception::CannotFindSubselectionParent, "for key '#{parent_crumb}'" unless parent
71
+ raise Bcome::Exception::CanOnlySubselectOnInventory, "breadcrumb'#{parent_crumb}' represents a #{parent.class}'" unless parent.inventory?
51
72
 
52
- def load_parent_inventory
53
- parent_crumb = @views[:subselect_from]
54
- parent = ::Bcome::Node::Factory.instance.bucket[parent_crumb]
55
- raise Bcome::Exception::CannotFindSubselectionParent, "for key '#{parent_crumb}'" unless parent
56
- raise Bcome::Exception::CanOnlySubselectOnInventory, "breadcrumb'#{parent_crumb}' represents a #{parent.class}'" unless parent.inventory?
57
- parent
73
+ parent
74
+ end
75
+ end
58
76
  end
59
77
  end
60
78
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ ## Bcome's kubernetes node namespaces
4
+ module Bcome::Node
5
+ module Kube
6
+ class Base
7
+ attr_reader :resources
8
+
9
+ def initialize(kube_wrap, config = {})
10
+ @kube_wrap = kube_wrap
11
+ @config = config
12
+ @resources = []
13
+ end
14
+
15
+ def parent
16
+ @config[:parent]
17
+ end
18
+
19
+ def run(command)
20
+ @kube_wrap.run(command)
21
+ end
22
+
23
+ def build
24
+ child_node_lookup_result = run(get_child_node_command)
25
+ parse(child_node_lookup_result)
26
+ end
27
+
28
+ def parse(child_node_lookup_result)
29
+ # Get the output
30
+ output = child_node_lookup_result.stdout
31
+ # Remove the title & form array
32
+ data = output.remove_lines(1).split("\n")
33
+
34
+ structured_data = {}
35
+ data.each do |raw_namespace_line|
36
+ child_config = get_child_config_from_line(raw_namespace_line)
37
+ child_config.merge!(parent: self)
38
+ @resources << child_node_klass.new(@kube_wrap, child_config)
39
+ end
40
+ end
41
+
42
+ def get_child_node_command
43
+ raise 'should be overriden'
44
+ end
45
+
46
+ def get_child_config_from_line(*_params)
47
+ raise 'should be overidden'
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bcome::Node::Kube
4
+ class Container < Bcome::Node::Kube::Base
5
+ # Expose shell
6
+ # Enable Server::Spec testing
7
+ # Enable file handlers
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bcome::Node::Kube
4
+ class Estate < Bcome::Node::Kube::Base
5
+ # CONTAINS NAMESPACES
6
+ def get_child_node_command
7
+ 'get namespaces'
8
+ end
9
+
10
+ def child_node_klass
11
+ ::Bcome::Kube::Node::Namespace
12
+ end
13
+
14
+ def get_child_config_from_line(raw_line)
15
+ name, active, age = raw_line.split("\s")
16
+ { name: name, active: active, age: age }
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bcome::Node::Kube
4
+ class Namespace < Bcome::Node::Kube::Base
5
+ # CONTAINS PODS
6
+
7
+ def get_child_node_command
8
+ "get pods -n #{name}"
9
+ end
10
+
11
+ def child_node_klass
12
+ ::Bcome::Kube::Node::Pod
13
+ end
14
+
15
+ def get_child_config_from_line(raw_line)
16
+ name, ready, status, restarts, age = raw_line.split("\s")
17
+ { name: name, ready: ready, status: status, reastarts: restarts, age: age }
18
+ end
19
+
20
+ def name
21
+ @config[:name]
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bcome::Node::Kube
4
+ class Pod < Bcome::Node::Kube::Base
5
+ # CONTAINS CONTAINERS
6
+
7
+ def get_child_node_command
8
+ "get pods #{name} -n #{parent.name} -o jsonpath=‘{.spec.containers[*].name}’"
9
+ end
10
+
11
+ def child_node_klass
12
+ ::Bcome::Kube::Node::Container
13
+ end
14
+
15
+ def name
16
+ @config[:name]
17
+ end
18
+
19
+ def get_child_config_from_line(raw_line)
20
+ name = raw_line.split("\s")
21
+ { name: name }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ ## Kubectl command wrapper. This will integrate directly with bcome's GCP authentication driver
4
+ class KubeWrap
5
+ KUBE_BIN = 'kubectl'
6
+
7
+ def initialize(access_token)
8
+ @access_token = access_token
9
+ end
10
+
11
+ def run(command_suffix)
12
+ full_command = create_command_for(command_suffix)
13
+ result = ::Bcome::Command::Local.run(full_command)
14
+
15
+ if result.failed?
16
+ puts "\n" + result.stderr.error + "\n"
17
+ raise
18
+ end
19
+
20
+ result
21
+ end
22
+
23
+ def create_command_for(suffix)
24
+ "#{KUBE_BIN} --token #{@access_token} #{suffix}"
25
+ end
26
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bcome::Node::Meta
2
4
  class Base
3
5
  attr_reader :data
@@ -10,11 +12,16 @@ module Bcome::Node::Meta
10
12
  matchers[:values] = [matchers[:values]] if matchers[:values] && !matchers[:values].is_a?(Array)
11
13
 
12
14
  raise Bcome::Exception::InvalidMatcherQuery unless matchers[:key] && matchers[:values].is_a?(Array)
15
+
13
16
  key = matchers[:key].to_sym
14
17
  values = matchers[:values]
15
18
  @data.key?(key) && values.include?(@data[key])
16
19
  end
17
20
 
21
+ def keys
22
+ @data.keys
23
+ end
24
+
18
25
  def dump
19
26
  @data.each do |k, v|
20
27
  puts "#{k} => #{v.resource_value}"
@@ -29,7 +36,7 @@ module Bcome::Node::Meta
29
36
  if @data.key?(key)
30
37
  @data[key]
31
38
  elsif default
32
- return default
39
+ default
33
40
  else
34
41
  raise Bcome::Exception::CantFindKeyInMetadata, key unless @data.key?(key)
35
42
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bcome::Node::Meta
2
4
  class Cloud < Bcome::Node::Meta::Base
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bcome::Node::Meta
2
4
  class Local < Bcome::Node::Meta::Base
3
5
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bcome::Node::LocalMetaDataFactory
2
- META_DATA_FILE_PATH_PREFIX = 'bcome/metadata'.freeze
4
+ META_DATA_FILE_PATH_PREFIX = 'bcome/metadata'
3
5
 
4
6
  def metadata
5
7
  @node_metadata ||= do_create_metadata
@@ -1,58 +1,64 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bcome::Node
2
4
  class MetaDataLoader
3
5
  include ::Singleton
4
6
 
5
- META_DATA_FILE_PATH_PREFIX = 'bcome/metadata'.freeze
7
+ META_DATA_FILE_PATH_PREFIX = 'bcome/metadata'
6
8
 
7
9
  def initialize
8
10
  @all_metadata_filenames = Dir["#{META_DATA_FILE_PATH_PREFIX}/*"]
9
11
  end
10
12
 
11
- def decryption_key
12
- @decryption_key
13
- end
14
-
13
+ attr_accessor :decryption_key
14
+
15
15
  def data
16
16
  @data ||= do_load
17
17
  end
18
18
 
19
19
  def data_for_namespace(namespace)
20
- static_data = data[namespace.to_sym] ? data[namespace.to_sym] : {}
20
+ static_data = data[namespace.to_sym] || {}
21
21
  static_data.merge(terraform_data_for_namespace(namespace))
22
22
  end
23
23
 
24
24
  def terraform_data_for_namespace(namespace)
25
- parser = Bcome::Terraform::Parser.new(namespace)
26
- attributes = parser.attributes
27
- if attributes.keys.any?
28
- {
29
- "terraform_attributes" => attributes
30
- }
31
- else
32
- {}
33
- end
25
+ # Radical departure II - all we care is the outputs. This will then work across any terraform backend, and any version
26
+ tf_state = ::Bcome::Terraform::Output.new(namespace)
27
+ terraform_data = {}
28
+ terraform_data['terraform_outputs'] = tf_state.output
29
+ terraform_data
34
30
  end
35
31
 
36
32
  def prompt_for_decryption_key
37
- print "\nEnter your decryption key: ".informational
33
+ decryption_key_prompt = 'Enter your metadata decryption key: '.informational
34
+
35
+ print "\n#{decryption_key_prompt}"
38
36
  @decryption_key = STDIN.noecho(&:gets).chomp
37
+ print "\r#{decryption_key_prompt}" + "**********\n\n"
39
38
  end
40
39
 
41
40
  def load_file_data_for(filepath)
42
- if filepath =~ /.enc/ # encrypted file contents
41
+ if filepath =~ /.enc/ # encrypted file contents
43
42
  prompt_for_decryption_key unless decryption_key
44
- encrypted_contents = File.read(filepath)
45
- decrypted_contents = encrypted_contents.decrypt(decryption_key)
46
- return YAML.load(decrypted_contents)
43
+ encrypted_contents = File.read(filepath)
44
+ decrypted_contents = encrypted_contents.decrypt(decryption_key)
45
+
46
+ begin
47
+ YAML.safe_load(decrypted_contents, [Symbol], [], true)
48
+ rescue Exception => e
49
+ @decryption_key = nil
50
+ raise ::Bcome::Exception::InvalidMetaDataConfig, "#{e.class} #{e.message} - " + decrypted_contents
51
+ end
52
+
47
53
  else # unencrypted
48
- return YAML.load_file(filepath)
54
+ YAML.load_file(filepath)
49
55
  end
50
56
  end
51
57
 
52
58
  def do_load
53
59
  all_meta_data = {}
54
60
  @all_metadata_filenames.each do |filepath|
55
- next if filepath =~ /-unenc/ # we only read from the encrypted, packed files.
61
+ next if filepath =~ /-unenc/ # we only read from the encrypted, packed files.
56
62
 
57
63
  begin
58
64
  filedata = load_file_data_for(filepath)
@@ -61,7 +67,7 @@ module Bcome::Node
61
67
  raise Bcome::Exception::InvalidMetaDataConfig, "Error: #{e.message}"
62
68
  end
63
69
  end
64
- return all_meta_data
70
+ all_meta_data
65
71
  end
66
72
  end
67
73
  end