kubes_google 0.2.0 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/kubes_google.gemspec +3 -0
- data/lib/hooks/kubes.rb +22 -0
- data/lib/kubes_google.rb +19 -0
- data/lib/kubes_google/config.rb +29 -0
- data/lib/kubes_google/gke.rb +120 -0
- data/lib/kubes_google/hooks.rb +7 -0
- data/lib/kubes_google/secrets/fetcher.rb +9 -28
- data/lib/kubes_google/secrets/fetcher/base.rb +15 -0
- data/lib/kubes_google/secrets/fetcher/gcloud.rb +21 -0
- data/lib/kubes_google/secrets/fetcher/sdk.rb +34 -0
- data/lib/kubes_google/service_account.rb +1 -20
- data/lib/kubes_google/services.rb +6 -0
- data/lib/kubes_google/util/sh.rb +23 -0
- data/lib/kubes_google/version.rb +1 -1
- metadata +38 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5ef849665496ae62a2621fe4d7732913c358a357334811413b109df5913d34c
|
4
|
+
data.tar.gz: 26fe10736966f7c027a88395206605c1bc1928b6f23b139680e21c5a325e0b26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3cd2ceaa682f677ec6d660a0fd6accceb2380e6ad5c50c9a946c78d24cafee5a563e8932d1c1bf27191a029088b35463717d9bf03dabd377faa4432601bd0b90
|
7
|
+
data.tar.gz: 697904843b0e1c5ca6185732a126a966151288896c9192725348d6a5fdd560b29d7cf08ed198f4f90c7bf9d9c1b7773e398de4d44ec02608fcb822da48cb09b1
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,21 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [0.3.4] - 2020-11-12
|
7
|
+
- fix KubesGoogle.config.secrets.fetcher check
|
8
|
+
|
9
|
+
## [0.3.3] - 2020-11-12
|
10
|
+
- [#6](https://github.com/boltops-tools/kubes_google/pull/6) sdk and gcloud secrets fetcher strategy: secrets.fetcher option
|
11
|
+
|
12
|
+
## [0.3.2] - 2020-11-11
|
13
|
+
- [#5](https://github.com/boltops-tools/kubes_google/pull/5) config.base64 option
|
14
|
+
|
15
|
+
## [0.3.1] - 2020-11-11
|
16
|
+
- [#4](https://github.com/boltops-tools/kubes_google/pull/4) get_credentials hook
|
17
|
+
|
18
|
+
## [0.3.0]
|
19
|
+
- #3 gke hook to whitelist ip
|
20
|
+
|
6
21
|
## [0.2.0]
|
7
22
|
- #2 add google_secret helper and register plugin
|
8
23
|
- fix GOOGLE_PROJECT check
|
data/kubes_google.gemspec
CHANGED
@@ -23,7 +23,10 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.require_paths = ["lib"]
|
24
24
|
|
25
25
|
spec.add_dependency "activesupport"
|
26
|
+
spec.add_dependency "google-cloud-container"
|
26
27
|
spec.add_dependency "google-cloud-secret_manager"
|
27
28
|
spec.add_dependency "memoist"
|
28
29
|
spec.add_dependency "zeitwerk"
|
30
|
+
|
31
|
+
spec.add_development_dependency "kubes"
|
29
32
|
end
|
data/lib/hooks/kubes.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
gke = KubesGoogle::Gke.new(
|
2
|
+
cluster_name: KubesGoogle.config.gke.cluster_name,
|
3
|
+
google_region: KubesGoogle.config.gke.google_region,
|
4
|
+
google_project: KubesGoogle.config.gke.google_project,
|
5
|
+
enable_get_credentials: KubesGoogle.config.gke.enable_get_credentials,
|
6
|
+
whitelist_ip: KubesGoogle.config.gke.whitelist_ip,
|
7
|
+
)
|
8
|
+
|
9
|
+
before("apply",
|
10
|
+
label: "gke get-credentials hook",
|
11
|
+
execute: gke.method(:get_credentials).to_proc,
|
12
|
+
) if gke.get_credentials_enabled?
|
13
|
+
|
14
|
+
before("apply",
|
15
|
+
label: "gke whitelist hook",
|
16
|
+
execute: gke.method(:allow).to_proc,
|
17
|
+
) if gke.enabled?
|
18
|
+
|
19
|
+
after("apply",
|
20
|
+
label: "gke whitelist hook",
|
21
|
+
execute: gke.method(:deny).to_proc,
|
22
|
+
) if gke.enabled?
|
data/lib/kubes_google.rb
CHANGED
@@ -16,6 +16,25 @@ module KubesGoogle
|
|
16
16
|
@@logger = v
|
17
17
|
end
|
18
18
|
|
19
|
+
# Friendlier method configure.
|
20
|
+
#
|
21
|
+
# .kubes/config/env/dev.rb
|
22
|
+
# .kubes/config/plugins/google.rb # also works
|
23
|
+
#
|
24
|
+
# Example:
|
25
|
+
#
|
26
|
+
# KubesGoogle.configure do |config|
|
27
|
+
# config.hooks.gke_whitelist = true
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
def configure(&block)
|
31
|
+
Config.instance.configure(&block)
|
32
|
+
end
|
33
|
+
|
34
|
+
def config
|
35
|
+
Config.instance.config
|
36
|
+
end
|
37
|
+
|
19
38
|
extend self
|
20
39
|
end
|
21
40
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module KubesGoogle
|
2
|
+
class Config
|
3
|
+
include Singleton
|
4
|
+
|
5
|
+
def defaults
|
6
|
+
c = ActiveSupport::OrderedOptions.new
|
7
|
+
c.gke = ActiveSupport::OrderedOptions.new
|
8
|
+
c.gke.cluster_name = nil
|
9
|
+
c.gke.enable_get_credentials = nil
|
10
|
+
c.gke.enable_hooks = nil # nil since need cluster_name also. setting to false will explicitly disable hooks
|
11
|
+
c.gke.google_project = nil
|
12
|
+
c.gke.google_region = nil
|
13
|
+
c.gke.whitelist_ip = nil # default will auto-detect IP
|
14
|
+
c.secrets = ActiveSupport::OrderedOptions.new
|
15
|
+
c.secrets.fetcher = "sdk"
|
16
|
+
c.secrets.base64 = true
|
17
|
+
c
|
18
|
+
end
|
19
|
+
|
20
|
+
@@config = nil
|
21
|
+
def config
|
22
|
+
@@config ||= defaults
|
23
|
+
end
|
24
|
+
|
25
|
+
def configure
|
26
|
+
yield(config)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module KubesGoogle
|
4
|
+
class Gke
|
5
|
+
extend Memoist
|
6
|
+
include Logging
|
7
|
+
include Services
|
8
|
+
include Util::Sh
|
9
|
+
|
10
|
+
def initialize(cluster_name:,
|
11
|
+
enable_get_credentials: false,
|
12
|
+
google_project: nil,
|
13
|
+
google_region: "us-central1",
|
14
|
+
whitelist_ip: nil)
|
15
|
+
@cluster_name = cluster_name
|
16
|
+
@enable_get_credentials = enable_get_credentials
|
17
|
+
@google_project = ENV['GOOGLE_PROJECT'] || google_project
|
18
|
+
@google_region = ENV['GOOGLE_REGION'] || google_region
|
19
|
+
@whitelist_ip = whitelist_ip
|
20
|
+
end
|
21
|
+
|
22
|
+
def allow
|
23
|
+
logger.debug "Updating cluster. Adding IP: #{ip}"
|
24
|
+
update_cluster(cidr_blocks(:with_whitelist))
|
25
|
+
end
|
26
|
+
|
27
|
+
def deny
|
28
|
+
logger.debug "Updating cluster. Removing IP: #{ip}"
|
29
|
+
update_cluster(cidr_blocks(:without_whitelist))
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_credentials
|
33
|
+
return unless get_credentials_enabled?
|
34
|
+
sh "gcloud container clusters get-credentials --project=#{@google_project} --region=#{@google_region} #{@cluster_name}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def full_name
|
38
|
+
"projects/#{@google_project}/locations/#{@google_region}/clusters/#{@cluster_name}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def enabled?
|
42
|
+
enable = KubesGoogle.config.gke.enable_hooks
|
43
|
+
enable = enable.nil? ? true : enable
|
44
|
+
# gke = KubesGoogle::Gke.new(name: KubesGoogle.config.gke.cluster_name)
|
45
|
+
# so @name = KubesGoogle.config.gke.cluster_name
|
46
|
+
!!(enable && @cluster_name)
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_credentials_enabled?
|
50
|
+
enable = KubesGoogle.config.gke.enable_get_credentials
|
51
|
+
enable = enable.nil? ? false : enable
|
52
|
+
!!(enable && full_name)
|
53
|
+
end
|
54
|
+
|
55
|
+
def update_cluster(cidr_blocks)
|
56
|
+
resp = cluster_manager.update_cluster(
|
57
|
+
name: full_name,
|
58
|
+
update: {
|
59
|
+
desired_master_authorized_networks_config: {
|
60
|
+
cidr_blocks: cidr_blocks,
|
61
|
+
enabled: true,
|
62
|
+
}
|
63
|
+
}
|
64
|
+
)
|
65
|
+
operation_name = resp.self_link.sub(/.*projects/,'projects')
|
66
|
+
wait_for(operation_name)
|
67
|
+
end
|
68
|
+
|
69
|
+
def wait_for(operation_name)
|
70
|
+
resp = cluster_manager.get_operation(name: operation_name)
|
71
|
+
until resp.status != :RUNNING do
|
72
|
+
sleep 5
|
73
|
+
resp = cluster_manager.get_operation(name: operation_name)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def cidr_blocks(type)
|
78
|
+
# so we dont keep adding duplicates
|
79
|
+
old = old_cidrs.reject do |x|
|
80
|
+
x[:display_name] == new_cidr[:display_name] &&
|
81
|
+
x[:cidr_block] == new_cidr[:cidr_block]
|
82
|
+
end
|
83
|
+
if type == :with_whitelist
|
84
|
+
old + [new_cidr]
|
85
|
+
else
|
86
|
+
old
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def old_cidrs
|
91
|
+
resp = cluster_manager.get_cluster(name: full_name)
|
92
|
+
config = resp.master_authorized_networks_config.to_h
|
93
|
+
config[:cidr_blocks]
|
94
|
+
end
|
95
|
+
memoize :old_cidrs
|
96
|
+
|
97
|
+
def new_cidr
|
98
|
+
{
|
99
|
+
display_name: "added-by-kubes-google",
|
100
|
+
cidr_block: ip,
|
101
|
+
}
|
102
|
+
end
|
103
|
+
memoize :new_cidr
|
104
|
+
|
105
|
+
def ip
|
106
|
+
@whitelist_ip || current_ip
|
107
|
+
end
|
108
|
+
|
109
|
+
def current_ip
|
110
|
+
resp = URI.open("http://ifconfig.me")
|
111
|
+
ip = resp.read
|
112
|
+
"#{ip}/32"
|
113
|
+
rescue SocketError => e
|
114
|
+
logger.info "WARN: #{e.message}"
|
115
|
+
logger.info "Unable to detect current ip. Will use 0.0.0.0/0"
|
116
|
+
"0.0.0.0/0"
|
117
|
+
end
|
118
|
+
memoize :current_ip
|
119
|
+
end
|
120
|
+
end
|
@@ -1,41 +1,22 @@
|
|
1
1
|
class KubesGoogle::Secrets
|
2
2
|
class Fetcher
|
3
|
-
|
4
|
-
include KubesGoogle::Services
|
3
|
+
extend Memoist
|
5
4
|
|
6
5
|
def initialize(options={})
|
7
6
|
@options = options
|
8
|
-
@base64 = options[:base64].nil? ? true : options[:base64]
|
9
|
-
@project_id = ENV['GOOGLE_PROJECT'] || raise("GOOGLE_PROJECT env variable is not set. It's required.")
|
10
7
|
end
|
11
8
|
|
12
9
|
def fetch(short_name)
|
13
|
-
|
14
|
-
value = Base64.strict_encode64(value).strip if @base64
|
15
|
-
value
|
10
|
+
fetcher.fetch(short_name)
|
16
11
|
end
|
17
12
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
logger.info e.message
|
25
|
-
"NOT FOUND #{name}" # simple string so Kubernetes YAML is valid
|
26
|
-
end
|
27
|
-
|
28
|
-
# TODO: Get the project from the list project api instead. Unsure where the docs are for this.
|
29
|
-
# If someone knows, let me know.
|
30
|
-
# Right now grabbing the first secret to then be able to get the google project number
|
31
|
-
@@project_number = nil
|
32
|
-
def project_number
|
33
|
-
return @@project_number if @@project_number
|
34
|
-
|
35
|
-
parent = "projects/#{@project_id}"
|
36
|
-
resp = secret_manager_service.list_secrets(parent: parent) # note: page_size doesnt seem to get respected
|
37
|
-
name = resp.first.name # IE: projects/686010496118/secrets/demo-dev-db_host
|
38
|
-
@@project_number = name.split('/')[1]
|
13
|
+
def fetcher
|
14
|
+
if KubesGoogle.config.secrets.fetcher == "sdk"
|
15
|
+
Sdk.new(@options)
|
16
|
+
else
|
17
|
+
Gcloud.new(@options)
|
18
|
+
end
|
39
19
|
end
|
20
|
+
memoize :fetcher
|
40
21
|
end
|
41
22
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class KubesGoogle::Secrets::Fetcher
|
2
|
+
class Base
|
3
|
+
include KubesGoogle::Logging
|
4
|
+
|
5
|
+
def initialize(options={})
|
6
|
+
@options = options
|
7
|
+
@base64 = options[:base64]
|
8
|
+
@project_id = options[:google_project] || ENV['GOOGLE_PROJECT'] || raise("GOOGLE_PROJECT env variable is not set. It's required.")
|
9
|
+
end
|
10
|
+
|
11
|
+
def base64?
|
12
|
+
@base64.nil? ? KubesGoogle.config.secrets.base64 : @base64
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class KubesGoogle::Secrets::Fetcher
|
2
|
+
class Gcloud < Base
|
3
|
+
include KubesGoogle::Util::Sh
|
4
|
+
|
5
|
+
def fetch(short_name, version="latest")
|
6
|
+
value = gcloud("secrets versions access #{version} --secret #{short_name}")
|
7
|
+
if value.include?("ERROR") && value.include?("NOT_FOUND")
|
8
|
+
logger.info "WARN: secret #{short_name} not found".color(:yellow)
|
9
|
+
logger.info e.message
|
10
|
+
"NOT FOUND #{short_name}" # simple string so Kubernetes YAML is valid
|
11
|
+
else
|
12
|
+
value = Base64.strict_encode64(value).strip if base64?
|
13
|
+
value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def gcloud(args)
|
18
|
+
capture("gcloud --project #{@project_id} #{args}")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class KubesGoogle::Secrets::Fetcher
|
2
|
+
class Sdk < Base
|
3
|
+
include KubesGoogle::Services
|
4
|
+
|
5
|
+
def fetch(short_name, version="latest")
|
6
|
+
value = fetch_value(short_name, version)
|
7
|
+
value = Base64.strict_encode64(value).strip if base64?
|
8
|
+
value
|
9
|
+
end
|
10
|
+
|
11
|
+
def fetch_value(short_name, version="latest")
|
12
|
+
name = "projects/#{project_number}/secrets/#{short_name}/versions/#{version}"
|
13
|
+
version = secret_manager_service.access_secret_version(name: name)
|
14
|
+
version.payload.data
|
15
|
+
rescue Google::Cloud::NotFoundError => e
|
16
|
+
logger.info "WARN: secret #{name} not found".color(:yellow)
|
17
|
+
logger.info e.message
|
18
|
+
"NOT FOUND #{name}" # simple string so Kubernetes YAML is valid
|
19
|
+
end
|
20
|
+
|
21
|
+
# TODO: Get the project from the list project api instead. Unsure where the docs are for this.
|
22
|
+
# If someone knows, let me know.
|
23
|
+
# Right now grabbing the first secret to then be able to get the google project number
|
24
|
+
@@project_number = nil
|
25
|
+
def project_number
|
26
|
+
return @@project_number if @@project_number
|
27
|
+
|
28
|
+
parent = "projects/#{@project_id}"
|
29
|
+
resp = secret_manager_service.list_secrets(parent: parent) # note: page_size doesnt seem to get respected
|
30
|
+
name = resp.first.name # IE: projects/686010496118/secrets/demo-dev-db_host
|
31
|
+
@@project_number = name.split('/')[1]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -4,6 +4,7 @@ require "json"
|
|
4
4
|
module KubesGoogle
|
5
5
|
class ServiceAccount
|
6
6
|
include Logging
|
7
|
+
include Util::Sh
|
7
8
|
|
8
9
|
def initialize(app:, namespace:nil, roles: [], gsa: nil, ksa: nil)
|
9
10
|
@app, @roles = app, roles
|
@@ -71,25 +72,5 @@ module KubesGoogle
|
|
71
72
|
--member=serviceAccount:#{@service_account} \
|
72
73
|
--role=#{role} > /dev/null".squish
|
73
74
|
end
|
74
|
-
|
75
|
-
private
|
76
|
-
def sh(command)
|
77
|
-
logger.debug "=> #{command}"
|
78
|
-
success = system(command)
|
79
|
-
unless success
|
80
|
-
logger.info "WARN: Running #{command}"
|
81
|
-
end
|
82
|
-
success
|
83
|
-
end
|
84
|
-
|
85
|
-
def capture(command)
|
86
|
-
out = `#{command}`
|
87
|
-
unless $?.exitstatus == 0
|
88
|
-
logger.info "ERROR: Running #{command}"
|
89
|
-
logger.info out
|
90
|
-
exit 1
|
91
|
-
end
|
92
|
-
out
|
93
|
-
end
|
94
75
|
end
|
95
76
|
end
|
@@ -1,9 +1,15 @@
|
|
1
1
|
require "google-cloud-secret_manager"
|
2
|
+
require "google/cloud/container"
|
2
3
|
|
3
4
|
module KubesGoogle
|
4
5
|
module Services
|
5
6
|
extend Memoist
|
6
7
|
|
8
|
+
def cluster_manager
|
9
|
+
Google::Cloud::Container.cluster_manager
|
10
|
+
end
|
11
|
+
memoize :cluster_manager
|
12
|
+
|
7
13
|
def secret_manager_service
|
8
14
|
Google::Cloud::SecretManager.secret_manager_service
|
9
15
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module KubesGoogle::Util
|
2
|
+
module Sh
|
3
|
+
private
|
4
|
+
def sh(command)
|
5
|
+
logger.debug "=> #{command}"
|
6
|
+
success = system(command)
|
7
|
+
unless success
|
8
|
+
logger.info "WARN: Running #{command}"
|
9
|
+
end
|
10
|
+
success
|
11
|
+
end
|
12
|
+
|
13
|
+
def capture(command)
|
14
|
+
out = `#{command}`
|
15
|
+
unless $?.exitstatus == 0
|
16
|
+
logger.info "ERROR: Running #{command}"
|
17
|
+
logger.info out
|
18
|
+
exit 1
|
19
|
+
end
|
20
|
+
out
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/kubes_google/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kubes_google
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: google-cloud-container
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: google-cloud-secret_manager
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +80,20 @@ dependencies:
|
|
66
80
|
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: kubes
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
69
97
|
description:
|
70
98
|
email:
|
71
99
|
- tung@boltops.com
|
@@ -81,14 +109,22 @@ files:
|
|
81
109
|
- README.md
|
82
110
|
- Rakefile
|
83
111
|
- kubes_google.gemspec
|
112
|
+
- lib/hooks/kubes.rb
|
84
113
|
- lib/kubes_google.rb
|
85
114
|
- lib/kubes_google/autoloader.rb
|
115
|
+
- lib/kubes_google/config.rb
|
116
|
+
- lib/kubes_google/gke.rb
|
86
117
|
- lib/kubes_google/helpers.rb
|
118
|
+
- lib/kubes_google/hooks.rb
|
87
119
|
- lib/kubes_google/logging.rb
|
88
120
|
- lib/kubes_google/secrets.rb
|
89
121
|
- lib/kubes_google/secrets/fetcher.rb
|
122
|
+
- lib/kubes_google/secrets/fetcher/base.rb
|
123
|
+
- lib/kubes_google/secrets/fetcher/gcloud.rb
|
124
|
+
- lib/kubes_google/secrets/fetcher/sdk.rb
|
90
125
|
- lib/kubes_google/service_account.rb
|
91
126
|
- lib/kubes_google/services.rb
|
127
|
+
- lib/kubes_google/util/sh.rb
|
92
128
|
- lib/kubes_google/version.rb
|
93
129
|
homepage: https://github.com/boltops-tools/kubes_google
|
94
130
|
licenses:
|