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.
- checksums.yaml +5 -5
- data/bin/bcome +13 -8
- data/lib/bcome.rb +7 -11
- data/lib/objects/bcome/version.rb +19 -1
- data/lib/objects/bootup.rb +13 -5
- data/lib/objects/command/local.rb +2 -0
- data/lib/objects/config_factory.rb +3 -0
- data/lib/objects/driver/base.rb +36 -4
- data/lib/objects/driver/bucket.rb +6 -4
- data/lib/objects/driver/ec2.rb +35 -4
- data/lib/objects/driver/gcp.rb +124 -0
- data/lib/objects/driver/gcp/authentication/api_key.rb +6 -0
- data/lib/objects/driver/gcp/authentication/oauth.rb +101 -0
- data/lib/objects/driver/gcp/authentication/service_account.rb +7 -0
- data/lib/objects/driver/static.rb +2 -0
- data/lib/objects/encryptor.rb +26 -24
- data/lib/objects/exception/argument_error_invoking_method_from_command_line.rb +8 -4
- data/lib/objects/exception/base.rb +14 -10
- data/lib/objects/exception/can_only_subselect_on_inventory.rb +8 -4
- data/lib/objects/exception/cannot_authenticate_to_gcp.rb +11 -0
- data/lib/objects/exception/cannot_find_internal_registry_klass.rb +8 -4
- data/lib/objects/exception/cannot_find_inventory.rb +11 -0
- data/lib/objects/exception/cannot_find_subselection_parent.rb +8 -4
- data/lib/objects/exception/cant_find_key_in_cloud_tags.rb +8 -4
- data/lib/objects/exception/cant_find_key_in_metadata.rb +8 -4
- data/lib/objects/exception/cant_find_proxy_host_by_identifier.rb +8 -4
- data/lib/objects/exception/cant_find_proxy_host_by_namespace.rb +8 -4
- data/lib/objects/exception/could_not_initiate_ssh_connection.rb +8 -4
- data/lib/objects/exception/could_not_initiate_ssh_connection_through_backend_proxy.rb +8 -4
- data/lib/objects/exception/could_not_retrieve_terraform_output.rb +11 -0
- data/lib/objects/exception/deprecation_warning.rb +9 -7
- data/lib/objects/exception/duplicate_command_line_argument_key.rb +8 -4
- data/lib/objects/exception/ec2_driver_missing_provisioning_region.rb +8 -4
- data/lib/objects/exception/failed_to_run_local_command.rb +8 -4
- data/lib/objects/exception/generic.rb +11 -0
- data/lib/objects/exception/interactive_session_halt.rb +6 -2
- data/lib/objects/exception/invalid_bcome_breadcrumb.rb +8 -4
- data/lib/objects/exception/invalid_breadcrumb.rb +8 -4
- data/lib/objects/exception/invalid_context_command.rb +8 -4
- data/lib/objects/exception/invalid_gcp_authentication_scheme.rb +11 -0
- data/lib/objects/exception/invalid_identifier.rb +8 -4
- data/lib/objects/exception/invalid_machines_cache_config.rb +8 -4
- data/lib/objects/exception/invalid_matcher_query.rb +8 -4
- data/lib/objects/exception/invalid_meta_data_config.rb +8 -4
- data/lib/objects/exception/invalid_metadata_encryption_key.rb +8 -4
- data/lib/objects/exception/invalid_network_config.rb +8 -4
- data/lib/objects/exception/invalid_network_driver_type.rb +8 -4
- data/lib/objects/exception/invalid_port_forward_request.rb +11 -0
- data/lib/objects/exception/invalid_proxy_config.rb +8 -4
- data/lib/objects/exception/invalid_regexp_matcher_in_registry.rb +8 -4
- data/lib/objects/exception/invalid_registry_arguments_type.rb +8 -4
- data/lib/objects/exception/invalid_registry_command_name_length.rb +8 -4
- data/lib/objects/exception/invalid_registry_data_config.rb +8 -4
- data/lib/objects/exception/invalid_restriction_key_in_registry.rb +8 -4
- data/lib/objects/exception/invalid_ssh_config.rb +8 -4
- data/lib/objects/exception/inventories_cannot_have_subviews.rb +8 -4
- data/lib/objects/exception/malformed_command_line_arguments.rb +8 -4
- data/lib/objects/exception/method_invocation_requires_parameter.rb +8 -4
- data/lib/objects/exception/method_name_conflict_in_registry.rb +8 -4
- data/lib/objects/exception/missing_argument_for_registry_command.rb +8 -4
- data/lib/objects/exception/missing_description_on_view.rb +8 -4
- data/lib/objects/exception/missing_execute_on_registry_object.rb +8 -4
- data/lib/objects/exception/missing_gcp_authentication_scheme.rb +11 -0
- data/lib/objects/exception/missing_gcp_service_scopes.rb +11 -0
- data/lib/objects/exception/missing_identifier_on_view.rb +8 -4
- data/lib/objects/exception/missing_inventory_contributors.rb +11 -0
- data/lib/objects/exception/missing_ip_address_on_server.rb +8 -4
- data/lib/objects/exception/missing_network_config.rb +8 -4
- data/lib/objects/exception/missing_or_invalid_client_secrets.rb +11 -0
- data/lib/objects/exception/missing_params_for_rsync.rb +8 -4
- data/lib/objects/exception/missing_params_for_scp.rb +8 -4
- data/lib/objects/exception/missing_subselection_key.rb +8 -4
- data/lib/objects/exception/missing_type_on_view.rb +8 -4
- data/lib/objects/exception/no_node_found_for_breadcrumb.rb +8 -4
- data/lib/objects/exception/no_node_named_by_identifier.rb +8 -4
- data/lib/objects/exception/node_identifiers_must_be_unique.rb +8 -4
- data/lib/objects/exception/orchestration_script_does_not_exist.rb +8 -4
- data/lib/objects/exception/proxy_host_node_does_not_have_public_ip_address.rb +8 -4
- data/lib/objects/exception/unknown_dynamic_server_type.rb +11 -0
- data/lib/objects/exception/unknown_method_for_namespace.rb +8 -4
- data/lib/objects/interactive/session.rb +4 -1
- data/lib/objects/interactive/session_item/base.rb +2 -0
- data/lib/objects/interactive/session_item/capture_input.rb +2 -0
- data/lib/objects/interactive/session_item/transparent_ssh.rb +29 -23
- data/lib/objects/loading_bar/handler.rb +80 -0
- data/lib/objects/loading_bar/indicator/base.rb +64 -0
- data/lib/objects/loading_bar/indicator/basic.rb +34 -0
- data/lib/objects/loading_bar/indicator/progress.rb +26 -0
- data/lib/objects/loading_bar/pid_bucket.rb +27 -0
- data/lib/objects/modules/context.rb +13 -9
- data/lib/objects/modules/registry_management.rb +16 -10
- data/lib/objects/modules/ui_output.rb +10 -6
- data/lib/objects/modules/workspace_commands.rb +159 -155
- data/lib/objects/modules/workspace_menu.rb +129 -124
- data/lib/objects/node/attributes.rb +13 -21
- data/lib/objects/node/base.rb +116 -67
- data/lib/objects/node/cache_handler.rb +2 -0
- data/lib/objects/node/collection.rb +10 -9
- data/lib/objects/node/factory.rb +35 -28
- data/lib/objects/node/inventory/base.rb +100 -100
- data/lib/objects/node/inventory/defined.rb +110 -89
- data/lib/objects/node/inventory/merge.rb +43 -0
- data/lib/objects/node/inventory/subselect.rb +64 -46
- data/lib/objects/node/kube/base.rb +51 -0
- data/lib/objects/node/kube/container.rb +9 -0
- data/lib/objects/node/kube/estate.rb +19 -0
- data/lib/objects/node/kube/namespace.rb +24 -0
- data/lib/objects/node/kube/pod.rb +24 -0
- data/lib/objects/node/kube_wrap.rb +26 -0
- data/lib/objects/node/meta/base.rb +8 -1
- data/lib/objects/node/meta/cloud.rb +2 -0
- data/lib/objects/node/meta/local.rb +2 -0
- data/lib/objects/node/meta_data_factory.rb +3 -1
- data/lib/objects/node/meta_data_loader.rb +29 -23
- data/lib/objects/node/resources/base.rb +5 -1
- data/lib/objects/node/resources/inventory.rb +7 -5
- data/lib/objects/node/resources/merged.rb +38 -0
- data/lib/objects/node/resources/sub_inventory.rb +7 -4
- data/lib/objects/node/server/base.rb +91 -65
- data/lib/objects/node/server/dynamic/base.rb +23 -0
- data/lib/objects/node/server/{dynamic.rb → dynamic/ec2.rb} +14 -13
- data/lib/objects/node/server/dynamic/gcp.rb +47 -0
- data/lib/objects/node/server/static.rb +13 -2
- data/lib/objects/orchestration/base.rb +10 -0
- data/lib/objects/orchestration/interactive_terraform.rb +62 -27
- data/lib/objects/orchestrator.rb +22 -0
- data/lib/objects/parser/bread_crumb.rb +3 -1
- data/lib/objects/registry/arguments/base.rb +3 -1
- data/lib/objects/registry/arguments/command_line.rb +6 -1
- data/lib/objects/registry/arguments/console.rb +4 -1
- data/lib/objects/registry/command/base.rb +3 -0
- data/lib/objects/registry/command/external.rb +4 -2
- data/lib/objects/registry/command/group.rb +6 -3
- data/lib/objects/registry/command/internal.rb +3 -1
- data/lib/objects/registry/command/shortcut.rb +17 -9
- data/lib/objects/registry/command_list.rb +2 -0
- data/lib/objects/registry/loader.rb +10 -10
- data/lib/objects/ssh/bootstrap.rb +3 -1
- data/lib/objects/ssh/command.rb +10 -5
- data/lib/objects/ssh/command_exec.rb +13 -9
- data/lib/objects/ssh/connection_wrangler.rb +105 -0
- data/lib/objects/ssh/connector.rb +100 -0
- data/lib/objects/ssh/driver.rb +27 -215
- data/lib/objects/ssh/driver_concerns/command_strings.rb +17 -0
- data/lib/objects/ssh/driver_concerns/connection.rb +78 -0
- data/lib/objects/ssh/driver_concerns/functions.rb +89 -0
- data/lib/objects/ssh/driver_concerns/user.rb +32 -0
- data/lib/objects/ssh/{proxy_data.rb → proxy_hop.rb} +52 -7
- data/lib/objects/ssh/script_exec.rb +4 -1
- data/lib/objects/ssh/tunnel/local_port_forward.rb +5 -6
- data/lib/objects/ssh/tunnel_keeper.rb +21 -0
- data/lib/objects/ssh/window.rb +31 -0
- data/lib/objects/startup.rb +52 -0
- data/lib/objects/system/local.rb +3 -0
- data/lib/objects/terraform/output.rb +41 -0
- data/lib/objects/workspace.rb +3 -14
- data/patches/irb.rb +29 -6
- data/patches/string-encrypt.rb +20 -23
- data/patches/string.rb +5 -1
- data/patches/string_stylesheet.rb +2 -0
- metadata +101 -23
- data/lib/objects/progress_bar.rb +0 -30
- data/lib/objects/ssh/connection_handler.rb +0 -101
- data/lib/objects/terraform/parser.rb +0 -23
- data/lib/objects/terraform/state.rb +0 -34
@@ -1,9 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Bcome::Node
|
2
4
|
class Collection < ::Bcome::Node::Base
|
3
|
-
def self.to_s
|
4
|
-
'collection'
|
5
|
-
end
|
6
|
-
|
7
5
|
def inventories
|
8
6
|
inv = []
|
9
7
|
@resources.active.each do |r|
|
@@ -28,20 +26,23 @@ module Bcome::Node
|
|
28
26
|
filtered_set
|
29
27
|
end
|
30
28
|
|
31
|
-
def machines
|
29
|
+
def machines(skip_for_hidden = true)
|
32
30
|
set = []
|
33
|
-
|
31
|
+
|
32
|
+
resources = skip_for_hidden ? @resources.active.reject(&:hide?) : @resources.active
|
33
|
+
|
34
|
+
resources.each do |resource|
|
34
35
|
if resource.inventory?
|
35
36
|
resource.load_nodes unless resource.nodes_loaded?
|
36
37
|
set << resource.resources.active
|
37
38
|
else
|
38
|
-
set << resource.machines
|
39
|
+
set << resource.machines(skip_for_hidden)
|
39
40
|
end
|
40
41
|
end
|
41
42
|
|
42
43
|
set.flatten!
|
43
|
-
|
44
|
-
|
44
|
+
filtered_machines = filter_duplicates(set)
|
45
|
+
filtered_machines
|
45
46
|
end
|
46
47
|
|
47
48
|
def collection?
|
data/lib/objects/node/factory.rb
CHANGED
@@ -1,18 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Bcome::Node
|
2
4
|
class Factory
|
3
5
|
include Singleton
|
4
6
|
|
5
7
|
attr_reader :estate
|
6
8
|
|
7
|
-
CONFIG_PATH = 'bcome'
|
8
|
-
DEFAULT_CONFIG_NAME = 'networks.yml'
|
9
|
-
SERVER_OVERRIDE_CONFIG_NAME = 'machines-data.yml'
|
10
|
-
LOCAL_OVERRIDE_CONFIG_NAME = 'me.yml'
|
9
|
+
CONFIG_PATH = 'bcome'
|
10
|
+
DEFAULT_CONFIG_NAME = 'networks.yml'
|
11
|
+
SERVER_OVERRIDE_CONFIG_NAME = 'machines-data.yml'
|
12
|
+
LOCAL_OVERRIDE_CONFIG_NAME = 'me.yml'
|
13
|
+
|
14
|
+
INVENTORY_KEY = 'inventory'
|
15
|
+
COLLECTION_KEY = 'collection'
|
16
|
+
SUBSELECT_KEY = 'inventory-subselect'
|
17
|
+
MERGE_KEY = 'inventory-merge'
|
18
|
+
KUBE_CLUSTER = 'kube-cluster'
|
11
19
|
|
12
|
-
|
13
|
-
COLLECTION_KEY = 'collection'.freeze
|
14
|
-
SUBSELECT_KEY = 'inventory-subselect'.freeze
|
15
|
-
BCOME_RC_FILENAME = '.bcomerc'.freeze
|
20
|
+
BCOME_RC_FILENAME = '.bcomerc'
|
16
21
|
|
17
22
|
def bucket
|
18
23
|
@bucket ||= {}
|
@@ -24,7 +29,7 @@ module Bcome::Node
|
|
24
29
|
end
|
25
30
|
|
26
31
|
def config_path
|
27
|
-
"#{CONFIG_PATH}/#{config_file_name}"
|
32
|
+
ENV['CONF'] || "#{CONFIG_PATH}/#{config_file_name}"
|
28
33
|
end
|
29
34
|
|
30
35
|
def machines_data_path
|
@@ -32,7 +37,7 @@ module Bcome::Node
|
|
32
37
|
end
|
33
38
|
|
34
39
|
def config_file_name
|
35
|
-
@config_file_name
|
40
|
+
@config_file_name || DEFAULT_CONFIG_NAME
|
36
41
|
end
|
37
42
|
|
38
43
|
def create_tree(context_node, views)
|
@@ -53,11 +58,11 @@ module Bcome::Node
|
|
53
58
|
raise Bcome::Exception::InvalidNetworkConfig, 'missing config type' unless config[:type]
|
54
59
|
|
55
60
|
klass = klass_for_view_type[config[:type]]
|
56
|
-
|
61
|
+
|
57
62
|
raise Bcome::Exception::InvalidNetworkConfig, "invalid config type #{config[:type]}" unless klass
|
58
63
|
|
59
64
|
node = klass.new(views: config, parent: parent)
|
60
|
-
create_tree(node, config[:views]) if config[:views]
|
65
|
+
create_tree(node, config[:views]) if config[:views]&.any?
|
61
66
|
parent.resources << node if parent
|
62
67
|
|
63
68
|
bucket[node.keyed_namespace] = node
|
@@ -66,20 +71,19 @@ module Bcome::Node
|
|
66
71
|
end
|
67
72
|
|
68
73
|
def validate_view(breadcrumb, data)
|
69
|
-
unless data && data[:type]
|
70
|
-
raise Bcome::Exception::InvalidNetworkConfig, "Missing namespace type for for namespace '#{breadcrumb}'"
|
71
|
-
end
|
74
|
+
raise Bcome::Exception::InvalidNetworkConfig, "Missing namespace type for namespace '#{breadcrumb}'" unless data && data[:type]
|
72
75
|
|
73
|
-
|
74
|
-
|
75
|
-
end
|
76
|
+
|
77
|
+
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(', ')}" unless is_valid_view_type?(data[:type])
|
76
78
|
end
|
77
79
|
|
78
80
|
def klass_for_view_type
|
79
81
|
{
|
80
82
|
COLLECTION_KEY => ::Bcome::Node::Collection,
|
81
83
|
INVENTORY_KEY => ::Bcome::Node::Inventory::Defined,
|
82
|
-
SUBSELECT_KEY => ::Bcome::Node::Inventory::Subselect
|
84
|
+
SUBSELECT_KEY => ::Bcome::Node::Inventory::Subselect,
|
85
|
+
MERGE_KEY => ::Bcome::Node::Inventory::Merge,
|
86
|
+
KUBE_CLUSTER => ::Bcome::Node::Kube::Estate
|
83
87
|
}
|
84
88
|
end
|
85
89
|
|
@@ -96,7 +100,7 @@ module Bcome::Node
|
|
96
100
|
end
|
97
101
|
|
98
102
|
def machines_data_for_namespace(namespace)
|
99
|
-
machines_data[namespace]
|
103
|
+
machines_data[namespace] || {}
|
100
104
|
end
|
101
105
|
|
102
106
|
def rewrite_estate_config(data)
|
@@ -107,25 +111,27 @@ module Bcome::Node
|
|
107
111
|
|
108
112
|
def load_estate_config
|
109
113
|
config = YAML.load_file(config_path).deep_symbolize_keys
|
110
|
-
|
114
|
+
config.deep_merge(local_data)
|
111
115
|
rescue ArgumentError, Psych::SyntaxError => e
|
112
116
|
raise Bcome::Exception::InvalidNetworkConfig, 'Invalid yaml in network config' + e.message
|
113
117
|
rescue Errno::ENOENT
|
114
118
|
raise Bcome::Exception::DeprecationWarning if is_running_deprecated_configs?
|
119
|
+
|
115
120
|
raise Bcome::Exception::MissingNetworkConfig, config_path
|
116
121
|
end
|
117
122
|
|
118
123
|
def load_machines_data
|
119
|
-
return {} unless File.exist?(machines_data_path)
|
124
|
+
return {} unless File.exist?(machines_data_path)
|
125
|
+
|
120
126
|
config = YAML.load_file(machines_data_path).deep_symbolize_keys
|
121
|
-
|
127
|
+
config
|
122
128
|
rescue ArgumentError, Psych::SyntaxError => e
|
123
129
|
raise Bcome::Exception::InvalidNetworkConfig, 'Invalid yaml in machines data config' + e.message
|
124
130
|
end
|
125
131
|
|
126
132
|
def local_data
|
127
133
|
@local_data ||= load_local_data
|
128
|
-
end
|
134
|
+
end
|
129
135
|
|
130
136
|
def local_data_path
|
131
137
|
"#{CONFIG_PATH}/#{LOCAL_OVERRIDE_CONFIG_NAME}"
|
@@ -133,16 +139,17 @@ module Bcome::Node
|
|
133
139
|
|
134
140
|
def load_local_data
|
135
141
|
return {} unless File.exist?(local_data_path)
|
136
|
-
|
142
|
+
|
143
|
+
config = YAML.load_file(local_data_path)
|
137
144
|
return {} if config.nil?
|
138
|
-
|
145
|
+
|
146
|
+
config
|
139
147
|
rescue ArgumentError, Psych::SyntaxError => e
|
140
148
|
raise Bcome::Exception::InvalidNetworkConfig, 'Invalid yaml in machines data config' + e.message
|
141
149
|
end
|
142
150
|
|
143
151
|
def is_running_deprecated_configs?
|
144
|
-
File.exist?(
|
152
|
+
File.exist?('bcome/config/platform.yml')
|
145
153
|
end
|
146
|
-
|
147
154
|
end
|
148
155
|
end
|
@@ -1,104 +1,104 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Node
|
5
|
+
module Inventory
|
6
|
+
class Base < ::Bcome::Node::Base
|
7
|
+
def initialize(*params)
|
8
|
+
super
|
9
|
+
raise Bcome::Exception::InventoriesCannotHaveSubViews, @views if @views[:views] && !@views[:views].empty?
|
10
|
+
end
|
11
|
+
|
12
|
+
def meta_matches(matchers)
|
13
|
+
data_wrapper = :metadata
|
14
|
+
matches_for(data_wrapper, matchers)
|
15
|
+
end
|
16
|
+
|
17
|
+
def cloud_matches(matchers)
|
18
|
+
data_wrapper = :cloud_tags
|
19
|
+
matches_for(data_wrapper, matchers)
|
20
|
+
end
|
21
|
+
|
22
|
+
def machine_by_identifier(identifier)
|
23
|
+
resources.active.select { |machine| machine.identifier == identifier }.first
|
24
|
+
end
|
25
|
+
|
26
|
+
def matches_for(data_wrapper, matchers)
|
27
|
+
resources.active.select do |machine|
|
28
|
+
machine.send(data_wrapper).has_key_and_value?(matchers)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def enabled_menu_items
|
33
|
+
super + %i[ssh]
|
34
|
+
end
|
35
|
+
|
36
|
+
def menu_items
|
37
|
+
base_items = super.dup
|
38
|
+
base_items[:ssh] = {
|
39
|
+
description: 'ssh directly into a resource',
|
40
|
+
usage: 'ssh identifier',
|
41
|
+
console_only: true
|
42
|
+
}
|
43
|
+
|
44
|
+
base_items
|
45
|
+
end
|
46
|
+
|
47
|
+
def resources
|
48
|
+
@resources ||= ::Bcome::Node::Resources::Inventory.new
|
49
|
+
end
|
50
|
+
|
51
|
+
def ssh(identifier = nil)
|
52
|
+
direct_invoke_server(:ssh, identifier)
|
53
|
+
end
|
54
|
+
|
55
|
+
def tags(identifier = nil)
|
56
|
+
identifier.nil? ? direct_invoke_all_servers(:tags) : direct_invoke_server(:tags, identifier)
|
57
|
+
end
|
58
|
+
|
59
|
+
def direct_invoke_server(method, identifier)
|
60
|
+
# If we only have a single resource in our inventory, then just allow direct invocation
|
61
|
+
if resources.size == 1
|
62
|
+
resource = resources.first
|
63
|
+
else
|
64
|
+
# Otherwise, we expect to find the resource by its identifier
|
65
|
+
unless identifier
|
66
|
+
puts "\nPlease provide a machine identifier, e.g. #{method} machinename\n".warning unless identifier
|
67
|
+
return
|
68
|
+
end
|
69
|
+
|
70
|
+
resource = resources.for_identifier(identifier)
|
71
|
+
raise Bcome::Exception::InvalidBreadcrumb, "Cannot find a node named '#{identifier}'" unless resource
|
72
|
+
end
|
73
|
+
|
74
|
+
resource.send(method)
|
75
|
+
end
|
76
|
+
|
77
|
+
def direct_invoke_all_servers(method)
|
78
|
+
resources.active.each { |m| m.send(method) }
|
79
|
+
nil
|
80
|
+
end
|
81
|
+
|
82
|
+
def cache_nodes_in_memory
|
83
|
+
@cache_handler.do_cache_nodes!
|
84
|
+
end
|
85
|
+
|
86
|
+
def list_key
|
87
|
+
:server
|
88
|
+
end
|
89
|
+
|
90
|
+
def machines(skip_for_hidden = true)
|
91
|
+
skip_for_hidden ? resources.active : resources.active.reject(&:hide?)
|
92
|
+
end
|
93
|
+
|
94
|
+
def inventory?
|
95
|
+
true
|
96
|
+
end
|
97
|
+
|
98
|
+
def override_server_identifier?
|
99
|
+
respond_to?(:override_identifier) && !override_identifier.nil?
|
100
|
+
end
|
76
101
|
end
|
77
102
|
end
|
78
|
-
|
79
|
-
def direct_invoke_all_servers(method)
|
80
|
-
resources.active.each {|m| m.send(method) }
|
81
|
-
return
|
82
|
-
end
|
83
|
-
|
84
|
-
def cache_nodes_in_memory
|
85
|
-
@cache_handler.do_cache_nodes!
|
86
|
-
end
|
87
|
-
|
88
|
-
def list_key
|
89
|
-
:server
|
90
|
-
end
|
91
|
-
|
92
|
-
def machines
|
93
|
-
@resources.active
|
94
|
-
end
|
95
|
-
|
96
|
-
def inventory?
|
97
|
-
true
|
98
|
-
end
|
99
|
-
|
100
|
-
def override_server_identifier?
|
101
|
-
!@override_identifier.nil?
|
102
|
-
end
|
103
103
|
end
|
104
104
|
end
|
@@ -1,117 +1,138 @@
|
|
1
|
-
|
2
|
-
class Defined < ::Bcome::Node::Inventory::Base
|
3
|
-
MACHINES_CACHE_PATH = 'machines-cache.yml'.freeze
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module Bcome
|
4
|
+
module Node
|
5
|
+
module Inventory
|
6
|
+
class Defined < ::Bcome::Node::Inventory::Base
|
7
|
+
include ::Bcome::LoadingBar::Handler
|
8
8
|
|
9
|
-
|
9
|
+
MACHINES_CACHE_PATH = 'machines-cache.yml'
|
10
10
|
|
11
|
-
|
12
|
-
@load_machines_from_cache = false
|
13
|
-
@cache_handler = ::Bcome::Node::CacheHandler.new(self)
|
14
|
-
super
|
15
|
-
end
|
11
|
+
attr_reader :dynamic_nodes_loaded
|
16
12
|
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
def initialize(*params)
|
14
|
+
@load_machines_from_cache = false
|
15
|
+
@cache_handler = ::Bcome::Node::CacheHandler.new(self)
|
16
|
+
super
|
17
|
+
end
|
20
18
|
|
21
|
-
|
22
|
-
|
19
|
+
def enabled_menu_items
|
20
|
+
super + %i[save reload]
|
21
|
+
end
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
console_only: true
|
27
|
-
}
|
28
|
-
base_items
|
29
|
-
end
|
23
|
+
def menu_items
|
24
|
+
base_items = super.dup
|
30
25
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
26
|
+
base_items[:reload] = {
|
27
|
+
description: "Restock this inventory from remote (hit 'save' after to persist)",
|
28
|
+
console_only: true
|
29
|
+
}
|
30
|
+
base_items
|
31
|
+
end
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
33
|
+
def reload
|
34
|
+
resources.reset_duplicate_nodes!
|
35
|
+
do_reload
|
36
|
+
puts "\n\nDone. Hit 'ls' to see the refreshed inventory.\n".informational
|
41
37
|
end
|
42
|
-
end
|
43
|
-
end
|
44
38
|
|
45
|
-
|
46
|
-
|
47
|
-
|
39
|
+
def set_static_servers
|
40
|
+
cached_machines = raw_static_machines_from_cache
|
41
|
+
|
42
|
+
if cached_machines&.any?
|
43
|
+
wrap_indicator type: :basic, title: 'Loading' + "\sCACHE".bc_blue.bold + "\s" + namespace.to_s.underline, completed_title: '' do
|
44
|
+
cached_machines.each do |server_config|
|
45
|
+
resources << ::Bcome::Node::Server::Static.new(views: server_config, parent: self)
|
46
|
+
end
|
47
|
+
signal_success
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
48
51
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
+
def raw_static_machines_from_cache
|
53
|
+
load_machines_config[namespace.to_sym]
|
54
|
+
end
|
52
55
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
56
|
+
def machines_cache_path
|
57
|
+
"#{::Bcome::Node::Factory::CONFIG_PATH}/#{MACHINES_CACHE_PATH}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def mark_as_cached!
|
61
|
+
data = ::Bcome::Node::Factory.instance.load_estate_config
|
62
|
+
data[namespace.to_sym][:load_machines_from_cache] = true
|
63
|
+
::Bcome::Node::Factory.instance.rewrite_estate_config(data)
|
64
|
+
end
|
58
65
|
|
59
|
-
|
60
|
-
|
61
|
-
|
66
|
+
def save
|
67
|
+
@answer = ::Bcome::Interactive::Session.run(self,
|
68
|
+
:capture_input, terminal_prompt: 'Are you sure you want to cache these machines (saving will overwrite any previous selections) [Y|N] ? ')
|
62
69
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
data[namespace] = views[:static_servers]
|
70
|
+
if @answer && @answer == 'Y'
|
71
|
+
cache_nodes_in_memory
|
72
|
+
data = load_machines_config
|
67
73
|
|
68
|
-
|
69
|
-
|
74
|
+
data.delete(namespace)
|
75
|
+
data.delete(namespace.to_sym)
|
76
|
+
|
77
|
+
data[namespace] = views[:static_servers]
|
78
|
+
|
79
|
+
File.open(machines_cache_path, 'w') do |file|
|
80
|
+
file.write data.to_yaml
|
81
|
+
end
|
82
|
+
mark_as_cached!
|
83
|
+
puts "\nMachines have been cached for node #{namespace}".informational
|
84
|
+
else
|
85
|
+
puts 'Nothing saved'.warning
|
86
|
+
end
|
70
87
|
end
|
71
|
-
mark_as_cached!
|
72
|
-
puts "Machines have been cached for node #{namespace}".informational
|
73
|
-
else
|
74
|
-
puts 'Nothing saved'.warning
|
75
|
-
end
|
76
|
-
end
|
77
88
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
89
|
+
def load_machines_config
|
90
|
+
config = YAML.load_file(machines_cache_path).deep_symbolize_keys
|
91
|
+
config
|
92
|
+
rescue ArgumentError, Psych::SyntaxError
|
93
|
+
raise Bcome::Exception::InvalidMachinesCacheConfig, 'Invalid yaml in config'
|
94
|
+
rescue Errno::ENOENT
|
95
|
+
{}
|
96
|
+
end
|
86
97
|
|
87
|
-
|
88
|
-
|
89
|
-
|
98
|
+
def cache_nodes_in_memory
|
99
|
+
@cache_handler.do_cache_nodes!
|
100
|
+
end
|
90
101
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
102
|
+
def do_reload
|
103
|
+
resources.unset!
|
104
|
+
load_dynamic_nodes
|
105
|
+
end
|
95
106
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
107
|
+
def load_nodes
|
108
|
+
set_static_servers
|
109
|
+
load_dynamic_nodes unless @load_machines_from_cache
|
110
|
+
end
|
100
111
|
|
101
|
-
|
102
|
-
|
112
|
+
def load_dynamic_nodes
|
113
|
+
raw_servers = fetch_server_list
|
103
114
|
|
104
|
-
|
105
|
-
resources << ::Bcome::Node::Server::Dynamic.new_from_fog_instance(raw_server, self)
|
106
|
-
end
|
115
|
+
raw_servers ||= []
|
107
116
|
|
108
|
-
|
117
|
+
raw_servers.each do |raw_server|
|
118
|
+
if raw_server.is_a?(Google::Apis::ComputeBeta::Instance)
|
119
|
+
resources << ::Bcome::Node::Server::Dynamic::Gcp.new_from_gcp_instance(raw_server, self)
|
120
|
+
elsif raw_server.is_a?(Fog::Compute::AWS::Server)
|
121
|
+
resources << ::Bcome::Node::Server::Dynamic::Ec2.new_from_fog_instance(raw_server, self)
|
122
|
+
else
|
123
|
+
raise Bcome::Exception::UnknownDynamicServerType, "Unknown dynamic server type #{raw_server.class}"
|
124
|
+
end
|
125
|
+
end
|
109
126
|
|
110
|
-
|
127
|
+
resources.rename_initial_duplicate if resources.should_rename_initial_duplicate?
|
128
|
+
end
|
129
|
+
|
130
|
+
def fetch_server_list
|
131
|
+
return [] unless network_driver
|
111
132
|
|
112
|
-
|
113
|
-
|
114
|
-
|
133
|
+
network_driver.fetch_server_list(filters)
|
134
|
+
end
|
135
|
+
end
|
115
136
|
end
|
116
137
|
end
|
117
138
|
end
|