glb 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +3 -0
  4. data/CHANGELOG.md +7 -0
  5. data/Gemfile +6 -0
  6. data/Guardfile +19 -0
  7. data/LICENSE.txt +1 -0
  8. data/README.md +51 -0
  9. data/Rakefile +6 -0
  10. data/docs/external.md +19 -0
  11. data/docs/internal.md +65 -0
  12. data/docs/ssl.md +33 -0
  13. data/docs/static-ip-address.md +30 -0
  14. data/exe/glb +14 -0
  15. data/glb.gemspec +33 -0
  16. data/lib/glb/autoloader.rb +21 -0
  17. data/lib/glb/cli/base.rb +15 -0
  18. data/lib/glb/cli/help/completion.md +20 -0
  19. data/lib/glb/cli/help/completion_script.md +3 -0
  20. data/lib/glb/cli/help.rb +11 -0
  21. data/lib/glb/cli.rb +48 -0
  22. data/lib/glb/command.rb +91 -0
  23. data/lib/glb/completer/script.rb +8 -0
  24. data/lib/glb/completer/script.sh +10 -0
  25. data/lib/glb/completer.rb +159 -0
  26. data/lib/glb/config.rb +147 -0
  27. data/lib/glb/core.rb +27 -0
  28. data/lib/glb/lb/args.rb +66 -0
  29. data/lib/glb/lb/backend_service/backend.rb +94 -0
  30. data/lib/glb/lb/backend_service.rb +19 -0
  31. data/lib/glb/lb/firewall_rule.rb +9 -0
  32. data/lib/glb/lb/forwarding_rule.rb +16 -0
  33. data/lib/glb/lb/forwarding_rule_https.rb +24 -0
  34. data/lib/glb/lb/health_check.rb +13 -0
  35. data/lib/glb/lb/names.rb +50 -0
  36. data/lib/glb/lb/resource.rb +119 -0
  37. data/lib/glb/lb/target_http_proxy.rb +9 -0
  38. data/lib/glb/lb/target_https_proxy.rb +4 -0
  39. data/lib/glb/lb/url_map.rb +9 -0
  40. data/lib/glb/lb.rb +110 -0
  41. data/lib/glb/util/sh.rb +37 -0
  42. data/lib/glb/util/sure.rb +18 -0
  43. data/lib/glb/version.rb +3 -0
  44. data/lib/glb.rb +22 -0
  45. data/spec/cli_spec.rb +26 -0
  46. data/spec/spec_helper.rb +29 -0
  47. metadata +245 -0
@@ -0,0 +1,159 @@
1
+ =begin
2
+ Code Explanation:
3
+
4
+ There are 3 types of things to auto-complete:
5
+
6
+ 1. command: the command itself
7
+ 2. parameters: command parameters.
8
+ 3. options: command options
9
+
10
+ Here's an example:
11
+
12
+ mycli hello name --from me
13
+
14
+ * command: hello
15
+ * parameters: name
16
+ * option: --from
17
+
18
+ When command parameters are done processing, the remaining completion words will be options. We can tell that the command params are completed based on the method arity.
19
+
20
+ ## Arity
21
+
22
+ For example, say you had a method for a CLI command with the following form:
23
+
24
+ ufo scale service count --cluster development
25
+
26
+ It's equivalent ruby method:
27
+
28
+ scale(service, count) = has an arity of 2
29
+
30
+ So typing:
31
+
32
+ ufo scale service count [TAB] # there are 3 parameters including the "scale" command according to Thor's CLI processing.
33
+
34
+ So the completion should only show options, something like this:
35
+
36
+ --noop --verbose --cluster
37
+
38
+ ## Splat Arguments
39
+
40
+ When the ruby method has a splat argument, it's arity is negative. Here are some example methods and their arities.
41
+
42
+ ship(service) = 1
43
+ scale(service, count) = 2
44
+ ships(*services) = -1
45
+ foo(example, *rest) = -2
46
+
47
+ Fortunately, negative and positive arity values are processed the same way. So we take simply take the absolute value of the arity and process it the same.
48
+
49
+ Here are some test cases, hit TAB after typing the command:
50
+
51
+ glb completion
52
+ glb completion hello
53
+ glb completion hello name
54
+ glb completion hello name --
55
+ glb completion hello name --noop
56
+
57
+ glb completion
58
+ glb completion sub:goodbye
59
+ glb completion sub:goodbye name
60
+
61
+ ## Subcommands and Thor::Group Registered Commands
62
+
63
+ Sometimes the commands are not simple thor commands but are subcommands or Thor::Group commands. A good specific example is the ufo tool.
64
+
65
+ * regular command: ufo ship
66
+ * subcommand: ufo docker
67
+ * Thor::Group command: ufo init
68
+
69
+ Auto-completion accounts for each of these type of commands.
70
+ =end
71
+ module Glb
72
+ class Completer
73
+ def initialize(command_class, *params)
74
+ @params = params
75
+ @current_command = @params[0]
76
+ @command_class = command_class # CLI initiall
77
+ end
78
+
79
+ def run
80
+ if subcommand?(@current_command)
81
+ subcommand_class = @command_class.subcommand_classes[@current_command]
82
+ @params.shift # destructive
83
+ Completer.new(subcommand_class, *@params).run # recursively use subcommand
84
+ return
85
+ end
86
+
87
+ # full command has been found!
88
+ unless found?(@current_command)
89
+ puts all_commands
90
+ return
91
+ end
92
+
93
+ # will only get to here if command aws found (above)
94
+ arity = @command_class.instance_method(@current_command).arity.abs
95
+ if @params.size > arity or thor_group_command?
96
+ puts options_completion
97
+ else
98
+ puts params_completion
99
+ end
100
+ end
101
+
102
+ def subcommand?(command)
103
+ @command_class.subcommands.include?(command)
104
+ end
105
+
106
+ # hacky way to detect that command is a registered Thor::Group command
107
+ def thor_group_command?
108
+ command_params(raw=true) == [[:rest, :args]]
109
+ end
110
+
111
+ def found?(command)
112
+ public_methods = @command_class.public_instance_methods(false)
113
+ command && public_methods.include?(command.to_sym)
114
+ end
115
+
116
+ # all top-level commands
117
+ def all_commands
118
+ commands = @command_class.all_commands.reject do |k,v|
119
+ v.is_a?(Thor::HiddenCommand)
120
+ end
121
+ commands.keys
122
+ end
123
+
124
+ def command_params(raw=false)
125
+ params = @command_class.instance_method(@current_command).parameters
126
+ # Example:
127
+ # >> Sub.instance_method(:goodbye).parameters
128
+ # => [[:req, :name]]
129
+ # >>
130
+ raw ? params : params.map!(&:last)
131
+ end
132
+
133
+ def params_completion
134
+ offset = @params.size - 1
135
+ offset_params = command_params[offset..-1]
136
+ command_params[offset..-1].first
137
+ end
138
+
139
+ def options_completion
140
+ used = ARGV.select { |a| a.include?('--') } # so we can remove used options
141
+
142
+ method_options = @command_class.all_commands[@current_command].options.keys
143
+ class_options = @command_class.class_options.keys
144
+
145
+ all_options = method_options + class_options + ['help']
146
+
147
+ all_options.map! { |o| "--#{o.to_s.gsub('_','-')}" }
148
+ filtered_options = all_options - used
149
+ filtered_options.uniq
150
+ end
151
+
152
+ # Useful for debugging. Using puts messes up completion.
153
+ def log(msg)
154
+ File.open("/tmp/complete.log", "a") do |file|
155
+ file.puts(msg)
156
+ end
157
+ end
158
+ end
159
+ end
data/lib/glb/config.rb ADDED
@@ -0,0 +1,147 @@
1
+ require "singleton"
2
+
3
+ module Glb
4
+ class Config
5
+ include Singleton
6
+ include DslEvaluator
7
+
8
+ attr_reader :config
9
+ def initialize
10
+ @config = defaults
11
+ end
12
+
13
+ def defaults
14
+ config = ActiveSupport::OrderedOptions.new
15
+
16
+ config.lb = ActiveSupport::OrderedOptions.new
17
+ # config.lb.region = "us-central1"
18
+ # config.lb.load_balancing_scheme = "INTERNAL_MANAGED"
19
+ # config.lb.network = "dev"
20
+ # config.lb.subnet = "dev-app"
21
+
22
+ config.firewall_rule = ActiveSupport::OrderedOptions.new
23
+ config.firewall_rule.action = "allow"
24
+ config.firewall_rule.direction = "ingress"
25
+ config.firewall_rule.network = nil # default in set_from_lb_config
26
+ config.firewall_rule.rules = "tcp:80"
27
+ config.firewall_rule.source_ranges = "130.211.0.0/22,35.191.0.0/16" # load balancer
28
+ # config.firewall_rule.target_tags = @name # @name is not available here
29
+
30
+ config.health_check = ActiveSupport::OrderedOptions.new
31
+ config.health_check.port = 80
32
+ config.health_check.request_path = "/"
33
+ config.health_check.region = nil
34
+
35
+ config.backend_service = ActiveSupport::OrderedOptions.new
36
+ config.backend_service.load_balancing_scheme = nil # default in set_from_lb_config
37
+ config.backend_service.protocol = "HTTP"
38
+ config.backend_service.port_name = "http"
39
+ config.backend_service.region = nil
40
+ # config.backend_service.health_checks = health_check_name # health_check_name is not available here
41
+
42
+ config.backend_service.add_backend = ActiveSupport::OrderedOptions.new
43
+ config.backend_service.add_backend.balancing_mode = "RATE"
44
+ config.backend_service.add_backend.max_rate_per_endpoint = "1.0"
45
+ config.backend_service.add_backend.region = nil
46
+ config.backend_service.health_checks_region = nil
47
+ # config.backend_service.add_backend.network_endpoint_group_zone = google_zone, # google_zone is not available here
48
+ # config.backend_service.add_backend.network_endpoint_group = network_endpoint_group # network_endpoint_group is not available here
49
+
50
+ config.url_map = ActiveSupport::OrderedOptions.new
51
+ config.url_map.region = nil
52
+ # config.url_map.default_service = backend_service_name # backend_service_name is not available here
53
+
54
+ config.target_http_proxy = ActiveSupport::OrderedOptions.new
55
+ config.target_http_proxy.region = nil
56
+ # config.target_http_proxy.url_map = url_map_name # url_map_name is not available here
57
+
58
+ config.target_https_proxy = ActiveSupport::OrderedOptions.new
59
+ config.target_https_proxy.region = nil
60
+ config.target_https_proxy.ssl_certificates = nil # must be assigned by user
61
+ # config.target_https_proxy.url_map = url_map_name # url_map_name is not available here
62
+
63
+ config.forwarding_rule = ActiveSupport::OrderedOptions.new
64
+ config.forwarding_rule.load_balancing_scheme = nil # default in set_from_lb_config
65
+ config.forwarding_rule.ports = 80
66
+ config.forwarding_rule.region = nil
67
+ # config.forwarding_rule.target_http_proxy = target_http_proxy_name # target_http_proxy_name is not available here
68
+
69
+ config.forwarding_rule_https = ActiveSupport::OrderedOptions.new
70
+ config.forwarding_rule_https.load_balancing_scheme = nil # default in set_from_lb_config
71
+ config.forwarding_rule_https.ports = 443
72
+ config.forwarding_rule_https.region = nil
73
+ # config.forwarding_rule_https.target_http_proxy = target_http_proxy_name # target_http_proxy_name is not available here
74
+
75
+ config.show = ActiveSupport::OrderedOptions.new
76
+ config.show.format = nil
77
+
78
+ config.naming = ActiveSupport::OrderedOptions.new
79
+ config.naming.include_type = false
80
+
81
+ config
82
+ end
83
+
84
+ def configure
85
+ yield(@config)
86
+ end
87
+
88
+ # Load configs example:
89
+ #
90
+ # .glb/config.rb
91
+ # .glb/config/env/dev.rb
92
+ #
93
+ def load_configs
94
+ evaluate_file(".glb/config.rb")
95
+ evaluate_file(".glb/config/env/#{Glb.env}.rb")
96
+ if Glb.app
97
+ evaluate_file(".glb/config/app/#{Glb.app}.rb")
98
+ evaluate_file(".glb/config/app/#{Glb.app}/#{Glb.env}.rb")
99
+ end
100
+ set_from_lb_config
101
+ end
102
+
103
+ # Simpiflies the required config values to be set for an internal load balancer
104
+ # by providing shorthand config.lb options. Example:
105
+ #
106
+ # config.lb.region = "us-central1"
107
+ # config.lb.load_balancing_scheme = "INTERNAL_MANAGED"
108
+ # config.lb.network = "dev"
109
+ # config.lb.subnet = "dev-app"
110
+ #
111
+ # Called in initialize so that config values are set before any methods are called.
112
+ # IE: region_option or args
113
+ def set_from_lb_config
114
+ config.firewall_rule.network ||= config.lb.network || "default"
115
+
116
+ config.health_check.region ||= config.lb.region
117
+
118
+ config.backend_service.load_balancing_scheme ||= config.lb.load_balancing_scheme || "EXTERNAL_MANAGED"
119
+ config.backend_service.region ||= config.lb.region
120
+ config.backend_service.health_checks_region ||= config.lb.region
121
+ config.backend_service.add_backend.region ||= config.lb.region
122
+
123
+ config.url_map.region ||= config.lb.region
124
+
125
+ config.target_http_proxy.region ||= config.lb.region
126
+
127
+ config.target_https_proxy.region ||= config.lb.region
128
+ config.target_https_proxy.ssl_certificates ||= config.lb.ssl_certificates
129
+
130
+ config.forwarding_rule.region ||= config.lb.region
131
+ config.forwarding_rule.network ||= config.lb.network
132
+ config.forwarding_rule.subnet ||= config.lb.subnet
133
+ config.forwarding_rule.load_balancing_scheme ||= config.lb.load_balancing_scheme || "EXTERNAL_MANAGED"
134
+ config.forwarding_rule.target_http_proxy_region ||= config.lb.region
135
+
136
+ config.forwarding_rule_https.region ||= config.lb.region
137
+ config.forwarding_rule_https.network ||= config.lb.network
138
+ config.forwarding_rule_https.subnet ||= config.lb.subnet
139
+ config.forwarding_rule_https.load_balancing_scheme ||= config.lb.load_balancing_scheme || "EXTERNAL_MANAGED"
140
+ config.forwarding_rule_https.target_https_proxy_region ||= config.lb.region
141
+
142
+ # Set to true to create target_https_proxy and additional forwarding_rule which uses https settings
143
+ config.lb.enabled = false
144
+ end
145
+
146
+ end
147
+ end
data/lib/glb/core.rb ADDED
@@ -0,0 +1,27 @@
1
+ module Glb
2
+ module Core
3
+ extend Memoist
4
+
5
+ def app
6
+ ENV['GLB_APP'] unless ENV['GLB_APP'].blank?
7
+ end
8
+
9
+ def env
10
+ ENV['GLB_ENV'].blank? ? "dev" : ENV['GLB_ENV']
11
+ end
12
+
13
+ def extra
14
+ ENV['GLB_EXTRA'] unless ENV['GLB_EXTRA'].blank?
15
+ end
16
+
17
+ def configure(&block)
18
+ Config.instance.configure(&block)
19
+ end
20
+
21
+ def config
22
+ Config.instance.load_configs
23
+ Config.instance.config
24
+ end
25
+ memoize :config
26
+ end
27
+ end
@@ -0,0 +1,66 @@
1
+ class Glb::Lb
2
+ class Args
3
+ extend Memoist
4
+ include Glb::Util::Sh
5
+
6
+ # command: "firewall-rule create"
7
+ def initialize(command, opts)
8
+ @command, @opts = command, opts
9
+ end
10
+
11
+ # Converts a hash of options to a string of gcloud arguments
12
+ def transform
13
+ return "" if invalid_command?
14
+ options = @opts.dup
15
+ options.compact!
16
+ options[:global] = true unless options[:region]
17
+ allowed = allowed_options(@command)
18
+ allowed.map! { |o| o.gsub("-", "_") }
19
+ options = options.select { |k,v| allowed.include?(k.to_s) }
20
+
21
+ options.map do |k,v|
22
+ k = k.to_s.gsub("_", "-")
23
+ k = "--#{k}"
24
+ if v == true
25
+ k # IE: --global
26
+ elsif v == false
27
+ ""
28
+ else
29
+ "#{k}=#{v}"
30
+ end
31
+ end.sort.join(" ").squish
32
+ end
33
+
34
+ def invalid_command?
35
+ @command == "url-maps update"
36
+ end
37
+
38
+ def allowed_options(command)
39
+ lines = capture("gcloud help compute #{command}", show_command: false).split("\n")
40
+ lines = lines.grep(/--/)
41
+ lines = filter_special_cases(lines)
42
+ lines.map do |line|
43
+ md = line.match(/--([\w-]+)/)
44
+ md[1] if md
45
+ end.compact.sort.uniq
46
+ end
47
+ memoize :allowed_options
48
+
49
+ # Note: Tried filtering out lines with bold text, but it didn't work. It introduced too many bugs.
50
+ #
51
+ # " \e[1m--priority\e[m=\e[4mPRIORITY\e[m",
52
+ # " \e[1m--rules\e[m=[\e[4mPROTOCOL\e[m[:\e[4mPORT\e[m[-\e[4mPORT\e[m]],...]",
53
+ # " \e[1m--source-ranges\e[m=[\e[4mCIDR_RANGE\e[m,...]",
54
+ #
55
+ # regexp to match bold text: /^\s+.?\[1m--/ (attempt)
56
+ # line.match(/^\s+.?\[1m--/)
57
+ #
58
+ def filter_special_cases(lines)
59
+ case @command
60
+ when "backend-services update"
61
+ lines = lines.reject { |line| line.include?("--load-balancing-scheme") }
62
+ end
63
+ lines
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,94 @@
1
+ class Glb::Lb::BackendService
2
+ class Backend < Glb::Lb::Resource
3
+ # override so resource_name, resource_config, and region_option are correct
4
+ def resource_type
5
+ "backend_service"
6
+ end
7
+
8
+ def resource_name
9
+ backend_service_name
10
+ end
11
+
12
+ def add
13
+ return unless network_endpoint_group
14
+ validate_neg_exists!
15
+
16
+ google_zones.each do |zone|
17
+ if backend_added?(zone)
18
+ puts "Backend already added. network_endpoint_group: #{network_endpoint_group} backend_service: #{resource_name} zone: #{zone}"
19
+ else
20
+ sh add_command(zone)
21
+ end
22
+ end
23
+ end
24
+
25
+ def add_commands
26
+ google_zones.map do |zone|
27
+ add_command(zone)
28
+ end
29
+ end
30
+
31
+ def add_command(zone)
32
+ "gcloud compute backend-services add-backend #{resource_name} #{add_args(zone)}"
33
+ end
34
+
35
+ def add_args(zone)
36
+ defaults = {
37
+ network_endpoint_group_zone: zone, # us-central1-a
38
+ network_endpoint_group: network_endpoint_group,
39
+ }
40
+ opts = defaults.merge(config.backend_service.add_backend)
41
+ Glb::Lb::Args.new("backend-services add-backend", opts).transform
42
+ end
43
+
44
+ def backend_added?(zone)
45
+ @describe_cache ||= capture "gcloud compute backend-services describe #{resource_name} #{region_option} --format json"
46
+ return false if @describe_cache.blank?
47
+
48
+ data = JSON.load(@describe_cache)
49
+ backends = data["backends"]
50
+ return false unless backends
51
+
52
+ # "backends": [
53
+ # {
54
+ # "balancingMode": "RATE",
55
+ # "capacityScaler": 1,
56
+ # "group": "https://www.googleapis.com/compute/v1/projects/PROJECT/zones/ZONE/networkEndpointGroups/NEG",
57
+ # "maxRatePerEndpoint": 1
58
+ # }
59
+ backends.any? do |b|
60
+ # https://www.googleapis.com/compute/v1/projects/PROJECT/zones/ZONE/networkEndpointGroups/NEG
61
+ parts = b["group"].split("/")
62
+ parts.last == network_endpoint_group && parts[-3] == zone
63
+ end
64
+ end
65
+
66
+ private
67
+ # Validate by checking if the network_endpoint_group exists in any google zone
68
+ def validate_neg_exists!
69
+ if google_zones.empty?
70
+ puts <<~EOL.color(:red)
71
+ ERROR: Could not find network_endpoint_group: #{network_endpoint_group}
72
+ in any google zones.
73
+
74
+ Please check that the network_endpoint_group exists and try again.
75
+
76
+ gcloud compute network-endpoint-groups list --filter='name=#{network_endpoint_group}'
77
+
78
+ EOL
79
+ exit 1
80
+ end
81
+ end
82
+
83
+ def google_zones
84
+ out = capture "gcloud compute network-endpoint-groups list --filter='name=#{network_endpoint_group}' --format json", show_command: false
85
+ groups = JSON.load(out)
86
+ groups = groups.map { |g| g["zone"].split("/").last }
87
+ end
88
+ memoize :google_zones
89
+
90
+ def network_endpoint_group
91
+ Glb.config.backend_service.add_backend.network_endpoint_group
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,19 @@
1
+ class Glb::Lb
2
+ class BackendService < Resource
3
+ def default_options
4
+ {
5
+ health_checks: health_check_name,
6
+ }
7
+ end
8
+
9
+ def up
10
+ super
11
+ backend.add
12
+ end
13
+
14
+ def backend
15
+ Backend.new(@options)
16
+ end
17
+ memoize :backend
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ class Glb::Lb
2
+ class FirewallRule < Resource
3
+ def default_options
4
+ {
5
+ target_tags: Glb.config.firewall_rule.target_tags || @name,
6
+ }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ class Glb::Lb
2
+ class ForwardingRule < Resource
3
+ def default_options
4
+ {
5
+ target_http_proxy: target_http_proxy_name,
6
+ }
7
+ end
8
+
9
+ def show_ip
10
+ out = capture "gcloud compute forwarding-rules describe #{resource_name} #{region_option} --format json", show_command: false
11
+ ip = JSON.parse(out)["IPAddress"]
12
+ name = self.class.name.split('::').last.underscore.humanize
13
+ puts "#{name} ip: #{ip}"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ class Glb::Lb
2
+ class ForwardingRuleHttps < ForwardingRule
3
+ # override so resource_name is correct
4
+ def resource_type
5
+ "forwarding_rule"
6
+ end
7
+
8
+ # override so resource_name is correct
9
+ def resource_name
10
+ forwarding_rule_https_name
11
+ end
12
+
13
+ # override so resource_config and region_option are correct
14
+ def resource_config
15
+ config.forwarding_rule_https
16
+ end
17
+
18
+ def default_options
19
+ {
20
+ target_https_proxy: target_https_proxy_name,
21
+ }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ class Glb::Lb
2
+ class HealthCheck < Resource
3
+ # Override to add http to the command
4
+ def up_command
5
+ "gcloud compute health-checks #{action} http #{resource_name} #{args}" if valid?
6
+ end
7
+
8
+ # Override to add http to the command
9
+ def args
10
+ Args.new("health-checks #{action} http", config.health_check).transform
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,50 @@
1
+ class Glb::Lb
2
+ module Names
3
+ def firewall_rule_name
4
+ build_name("#{network}-#{@name}", 'firewall-rule') # IE: dev-demo-dev
5
+ end
6
+
7
+ # firewall_rule_name network method to be defined in the class
8
+ # defined here to make easier to follow
9
+ def network
10
+ Glb.config.firewall_rule.network
11
+ end
12
+
13
+ def health_check_name
14
+ build_name(@name, 'health-check') # IE: demo-health-check-dev
15
+ end
16
+
17
+ def backend_service_name
18
+ build_name(@name, 'backend-service') # IE: demo-backend-service-dev
19
+ end
20
+
21
+ def url_map_name
22
+ build_name(@name, 'url-map') # IE: demo-url-map-dev
23
+ end
24
+
25
+ def target_http_proxy_name
26
+ build_name(@name, 'target-http-proxy') # IE: demo-target-http-proxy-dev
27
+ end
28
+
29
+ def forwarding_rule_name
30
+ build_name(@name, 'forwarding-rule')
31
+ end
32
+
33
+ # Note: target_https_proxy name can be the same as target_http_proxy name
34
+ # Google considers them different types of resources.
35
+ def target_https_proxy_name
36
+ build_name(@name, 'target-https-proxy') # IE: demo-target-https-proxy-dev
37
+ end
38
+
39
+ # Note: forwarding rules for https must be differently named from the http one
40
+ # Google considers them the type of resources.
41
+ def forwarding_rule_https_name
42
+ build_name(@name, 'forwarding-rule', 'https') # IE: demo-forwarding-rule-https-dev
43
+ end
44
+
45
+ def build_name(name, type, infix=nil)
46
+ type = nil unless config.naming.include_type
47
+ [name, type, infix, Glb.env, Glb.extra].compact.join('-') # IE: demo-health-check-dev
48
+ end
49
+ end
50
+ end