bcome 1.3.6 → 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 +4 -4
- 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 -130
- data/lib/objects/node/attributes.rb +13 -21
- data/lib/objects/node/base.rb +113 -71
- 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 +27 -28
- 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 +88 -66
- 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 -230
- 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 +27 -3
- data/patches/string-encrypt.rb +20 -23
- data/patches/string.rb +5 -1
- data/patches/string_stylesheet.rb +2 -0
- metadata +95 -18
- 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 -40
data/lib/objects/progress_bar.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module Bcome
|
2
|
-
class ProgressBar
|
3
|
-
include Singleton
|
4
|
-
|
5
|
-
attr_reader :count
|
6
|
-
|
7
|
-
def initialize
|
8
|
-
@count = 0
|
9
|
-
end
|
10
|
-
|
11
|
-
def increment!
|
12
|
-
@count += 1
|
13
|
-
end
|
14
|
-
|
15
|
-
def reset!
|
16
|
-
@count = 0
|
17
|
-
end
|
18
|
-
|
19
|
-
def indicate(config, in_progress)
|
20
|
-
prefix = in_progress ? config[:prefix].progress : config[:prefix].progress
|
21
|
-
bar = prefix + "#{config[:indice] * @count}>" + " (#{@count} #{config[:indice_descriptor]})".progress + "\r"
|
22
|
-
print bar
|
23
|
-
end
|
24
|
-
|
25
|
-
def indicate_and_increment!(config, in_progress)
|
26
|
-
increment!
|
27
|
-
indicate(config, in_progress)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,101 +0,0 @@
|
|
1
|
-
module Bcome::Ssh
|
2
|
-
class ConnectionHandler
|
3
|
-
MAX_CONNECTION_ATTEMPTS = 3
|
4
|
-
|
5
|
-
class << self
|
6
|
-
def connect(node, config = {})
|
7
|
-
handler = new(node, config)
|
8
|
-
handler.connect
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def initialize(node, config = {})
|
13
|
-
@node = node
|
14
|
-
@config = config
|
15
|
-
@servers_to_connect = machines.dup
|
16
|
-
@connection_exceptions = {}
|
17
|
-
reset_progress if show_progress?
|
18
|
-
end
|
19
|
-
|
20
|
-
def machines
|
21
|
-
@node.server? ? [@node] : @node.machines
|
22
|
-
end
|
23
|
-
|
24
|
-
def show_progress?
|
25
|
-
@config[:show_progress] ? true : false
|
26
|
-
end
|
27
|
-
|
28
|
-
def ping?
|
29
|
-
@config[:is_ping] ? true : false
|
30
|
-
end
|
31
|
-
|
32
|
-
def reset_progress
|
33
|
-
::Bcome::ProgressBar.instance.reset!
|
34
|
-
end
|
35
|
-
|
36
|
-
def ping
|
37
|
-
connect
|
38
|
-
end
|
39
|
-
|
40
|
-
def connect
|
41
|
-
connection_attempt = 0
|
42
|
-
::Bcome::ProgressBar.instance.indicate(progress_bar_config, true) if show_progress?
|
43
|
-
|
44
|
-
# So here we have a bit of a hack: If you're connecting to a network via a bastion host, it may not be able to handle over a certain amount of consecutive/parallelized ssh connection attempts
|
45
|
-
# from bcome, so, we'll sweep up failures and re-try to connect up to MAX_CONNECTION_ATTEMPTS. Once connected, we're generally good - and any subsequent connection failures
|
46
|
-
# within a specific session will be handled ad-hoc and re-connection is automatic.
|
47
|
-
while @servers_to_connect.any? && connection_attempt <= MAX_CONNECTION_ATTEMPTS
|
48
|
-
puts "Retrying failed connections\n".warning if connection_attempt > 1
|
49
|
-
do_connect
|
50
|
-
connection_attempt += 1
|
51
|
-
end
|
52
|
-
|
53
|
-
if show_progress?
|
54
|
-
::Bcome::ProgressBar.instance.indicate(progress_bar_config, false)
|
55
|
-
reset_progress
|
56
|
-
end
|
57
|
-
|
58
|
-
if ping?
|
59
|
-
# If any machines remain, then we couldn't connect to them
|
60
|
-
@servers_to_connect.each do |server|
|
61
|
-
ping_result = {
|
62
|
-
success: false,
|
63
|
-
error: last_connection_exception_for(server)
|
64
|
-
}
|
65
|
-
puts server.print_ping_result(ping_result)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
if @servers_to_connect.any?
|
70
|
-
puts "Failed to connect to #{@servers_to_connect.size} nodes".error
|
71
|
-
else
|
72
|
-
puts 'All nodes reachable '.success
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def last_connection_exception_for(server)
|
77
|
-
@connection_exceptions[server]
|
78
|
-
end
|
79
|
-
|
80
|
-
def do_connect
|
81
|
-
@servers_to_connect.pmap do |server|
|
82
|
-
begin
|
83
|
-
server.open_ssh_connection unless server.has_ssh_connection?
|
84
|
-
Bcome::ProgressBar.instance.indicate_and_increment!(progress_bar_config, true) if show_progress?
|
85
|
-
@servers_to_connect -= [server]
|
86
|
-
puts server.print_ping_result if ping?
|
87
|
-
rescue Exception => e
|
88
|
-
@connection_exceptions[server] = e
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def progress_bar_config
|
94
|
-
{
|
95
|
-
prefix: "\sOpening SSH connections\s",
|
96
|
-
indice: '...',
|
97
|
-
indice_descriptor: "of #{machines.size}"
|
98
|
-
}
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module Bcome::Terraform
|
2
|
-
class Parser
|
3
|
-
def initialize(namespace)
|
4
|
-
@namespace = namespace
|
5
|
-
end
|
6
|
-
|
7
|
-
def attributes
|
8
|
-
a = {}
|
9
|
-
resources.keys.each do |key|
|
10
|
-
a[key] = resources[key]["primary"]["attributes"]
|
11
|
-
end
|
12
|
-
a
|
13
|
-
end
|
14
|
-
|
15
|
-
def resources
|
16
|
-
state.resources
|
17
|
-
end
|
18
|
-
|
19
|
-
def state
|
20
|
-
@state ||= ::Bcome::Terraform::State.new(@namespace)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module Bcome::Terraform
|
2
|
-
class State
|
3
|
-
require 'json'
|
4
|
-
|
5
|
-
TSTATE_FILENAME = "terraform.tfstate".freeze
|
6
|
-
|
7
|
-
def initialize(namespace)
|
8
|
-
@namespace = namespace
|
9
|
-
end
|
10
|
-
|
11
|
-
def terraform_installation_path
|
12
|
-
# Look for a terraform config installation in the path belonging to this node
|
13
|
-
@terraform_installation_path ||= "terraform/environments/#{@namespace.gsub(":","_")}"
|
14
|
-
end
|
15
|
-
|
16
|
-
def config_path
|
17
|
-
"#{terraform_installation_path}/#{TSTATE_FILENAME}"
|
18
|
-
end
|
19
|
-
|
20
|
-
def config_exists?
|
21
|
-
File.exist?(config_path)
|
22
|
-
end
|
23
|
-
|
24
|
-
def config
|
25
|
-
return {} unless config_exists?
|
26
|
-
JSON.parse(File.read(config_path))
|
27
|
-
end
|
28
|
-
|
29
|
-
def modules
|
30
|
-
return {} unless config_exists?
|
31
|
-
return config["modules"]
|
32
|
-
end
|
33
|
-
|
34
|
-
def resources
|
35
|
-
# TODO What was I thinking ... We need all the modules...
|
36
|
-
return {} unless config_exists?
|
37
|
-
return modules[0]["resources"]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|