helm-wrapper 1.0.1 → 1.3.1
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/lib/helm-wrapper.rb +35 -3
- data/lib/helm-wrapper/shared/auths/azure.rb +16 -15
- data/lib/helm-wrapper/shared/chart.rb +22 -13
- data/lib/helm-wrapper/shared/config.rb +40 -18
- data/lib/helm-wrapper/shared/runner.rb +81 -8
- data/lib/helm-wrapper/shared/variables.rb +2 -3
- data/lib/helm-wrapper/tasks.rb +3 -0
- data/lib/helm-wrapper/tasks/apply.rb +1 -1
- data/lib/helm-wrapper/tasks/destroy.rb +1 -1
- data/lib/helm-wrapper/tasks/push.rb +67 -0
- data/lib/helm-wrapper/tasks/template.rb +71 -0
- data/lib/helm-wrapper/tasks/validate.rb +58 -0
- data/lib/helm-wrapper/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64fe7756c771f5de17023c164a926696c6514315542e35b444ef31d4396ac130
|
4
|
+
data.tar.gz: 79334dd60dfc68de644ca511ebefde9b2382ca13bbb7f65e7347868337a13aa8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e69d4b002536594076ac8476f791a4e5b0fe3c2062de5cf5f4225e6df1919e21eb19b4ba362ed430d36cc2f01e8bda9edd14ab1f0cc2fa1701955c2d46944b61
|
7
|
+
data.tar.gz: 681c5bc705a01aa22730f6994ac975785701c16d1f39ef0265851cccfdf81404ea97d75b9a8edc868871ff51cdd1dc2a70bd89528411b9bf44698822ef60d76c
|
data/lib/helm-wrapper.rb
CHANGED
@@ -22,8 +22,8 @@ module HelmWrapper
|
|
22
22
|
|
23
23
|
###############################################################################
|
24
24
|
|
25
|
-
def self.
|
26
|
-
@logger.info("Building tasks for
|
25
|
+
def self.deployment_tasks(chart:, namespace:, release:, options: Hash.new)
|
26
|
+
@logger.info("Building deployment tasks for release: #{release}...")
|
27
27
|
|
28
28
|
@logger.fatal("Options must be specified as a hash!") unless options.kind_of?(Hash)
|
29
29
|
|
@@ -33,15 +33,19 @@ module HelmWrapper
|
|
33
33
|
|
34
34
|
chart_options = Hash.new
|
35
35
|
chart_options["name"] = chart
|
36
|
+
chart_options["path"] = nil
|
36
37
|
chart_options["repos"] = options.key?("chart-repos") ? options["chart-repos"] : Array.new
|
38
|
+
chart_options["release"] = release
|
37
39
|
chart_options["version"] = options.key?("chart-version") ? options["chart-version"] : String.new
|
38
40
|
|
39
41
|
config_options = Hash.new
|
42
|
+
config_options["atomic"] = options.key?("config-atomic") ? options["config-atomic"] : false
|
40
43
|
config_options["auth-azure"] = options.key?("config-auth-azure") ? options["config-auth-azure"] : false
|
41
44
|
config_options["auth-azure-options"] = options.key?("config-auth-azure-options") ? options["config-auth-azure-options"] : Hash.new
|
42
45
|
config_options["base"] = options.key?("config-base") ? options["config-base"] : File.join(Dir.pwd, "config")
|
43
46
|
config_options["namespace"] = namespace
|
44
|
-
config_options["
|
47
|
+
config_options["timeout"] = options.key?("config-timeout") ? options["config-timeout"] : "5m0s"
|
48
|
+
config_options["wait"] = options.key?("config-wait") ? options["config-wait"] : true
|
45
49
|
|
46
50
|
binary = HelmWrapper::Shared::Binary.new(options: binary_options)
|
47
51
|
chart = HelmWrapper::Shared::Chart.new(options: chart_options)
|
@@ -50,6 +54,34 @@ module HelmWrapper
|
|
50
54
|
tasks << HelmWrapper::Tasks::Apply.new(binary: binary, chart: chart, options: config_options)
|
51
55
|
tasks << HelmWrapper::Tasks::Binary.new(binary: binary)
|
52
56
|
tasks << HelmWrapper::Tasks::Destroy.new(binary: binary, chart: chart, options: config_options)
|
57
|
+
tasks << HelmWrapper::Tasks::Template.new(binary: binary, chart: chart, options: config_options)
|
58
|
+
return tasks
|
59
|
+
end
|
60
|
+
|
61
|
+
###############################################################################
|
62
|
+
|
63
|
+
def self.development_tasks(chart:, path:, options: Hash.new)
|
64
|
+
@logger.info("Building development tasks for path: #{path}...")
|
65
|
+
|
66
|
+
@logger.fatal("Options must be specified as a hash!") unless options.kind_of?(Hash)
|
67
|
+
|
68
|
+
binary_options = Hash.new
|
69
|
+
binary_options["base"] = options.key?("binary-base") ? options["binary-base"] : File.join(Dir.pwd, "vendor", "helm")
|
70
|
+
binary_options["version"] = options.key?("binary-version") ? options["binary-version"] : Shared::Latest.instance.version
|
71
|
+
|
72
|
+
chart_options = Hash.new
|
73
|
+
chart_options["name"] = chart
|
74
|
+
chart_options["path"] = path
|
75
|
+
chart_options["repos"] = options.key?("chart-repos") ? options["chart-repos"] : Array.new
|
76
|
+
chart_options["version"] = String.new
|
77
|
+
|
78
|
+
binary = HelmWrapper::Shared::Binary.new(options: binary_options)
|
79
|
+
chart = HelmWrapper::Shared::Chart.new(options: chart_options)
|
80
|
+
|
81
|
+
tasks = Array.new
|
82
|
+
tasks << HelmWrapper::Tasks::Binary.new(binary: binary)
|
83
|
+
tasks << HelmWrapper::Tasks::Push.new(binary: binary, chart: chart)
|
84
|
+
tasks << HelmWrapper::Tasks::Validate.new(binary: binary, chart: chart)
|
53
85
|
return tasks
|
54
86
|
end
|
55
87
|
|
@@ -29,13 +29,14 @@ module HelmWrapper
|
|
29
29
|
|
30
30
|
###############################################################################
|
31
31
|
|
32
|
-
@
|
33
|
-
@
|
32
|
+
@keyvault
|
33
|
+
@secret_ca
|
34
|
+
@secret_endpoint
|
35
|
+
@secret_token
|
34
36
|
|
35
37
|
###############################################################################
|
36
38
|
|
37
|
-
|
38
|
-
attr_reader :endpoint
|
39
|
+
@ca_tempfile = nil
|
39
40
|
|
40
41
|
###############################################################################
|
41
42
|
|
@@ -46,6 +47,10 @@ module HelmWrapper
|
|
46
47
|
###############################################################################
|
47
48
|
|
48
49
|
def auth()
|
50
|
+
ca = secret(vault: @keyvault, name: @secret_ca)
|
51
|
+
endpoint = secret(vault: @keyvault, name: @secret_endpoint)
|
52
|
+
token = secret(vault: @keyvault, name: @secret_token)
|
53
|
+
|
49
54
|
@ca_tempfile = Tempfile.new('helm-wrapper-auths-azure-ca')
|
50
55
|
|
51
56
|
begin
|
@@ -57,8 +62,8 @@ module HelmWrapper
|
|
57
62
|
logger.success("Azure authenticator successfully written Kubernetes CA to file!")
|
58
63
|
|
59
64
|
ENV["HELM_KUBECAFILE"] = @ca_tempfile.path
|
60
|
-
ENV["HELM_KUBEAPISERVER"] =
|
61
|
-
ENV["HELM_KUBETOKEN"] =
|
65
|
+
ENV["HELM_KUBEAPISERVER"] = endpoint
|
66
|
+
ENV["HELM_KUBETOKEN"] = token
|
62
67
|
|
63
68
|
logger.success("Azure authenticator environment variables set!")
|
64
69
|
end
|
@@ -109,7 +114,7 @@ module HelmWrapper
|
|
109
114
|
###############################################################################
|
110
115
|
|
111
116
|
def specific()
|
112
|
-
logger.fatal("Azure CLI must
|
117
|
+
logger.fatal("Azure CLI must be installed and accessible to use the Azure authenticator.") unless cli
|
113
118
|
|
114
119
|
logger.fatal("Azure authenticator mandatory option 'keyvault' has not been set!") unless @options.key?("keyvault")
|
115
120
|
logger.fatal("Azure authenticator keyvault must be a string!") unless @options["keyvault"].kind_of?(String)
|
@@ -144,17 +149,13 @@ module HelmWrapper
|
|
144
149
|
end
|
145
150
|
|
146
151
|
begin
|
147
|
-
keyvault
|
148
|
-
|
149
|
-
|
150
|
-
|
152
|
+
@keyvault = keyvault % @variables.identifiers
|
153
|
+
@secret_ca = ca % @variables.identifiers
|
154
|
+
@secret_endpoint = endpoint % @variables.identifiers
|
155
|
+
@secret_token = token % @variables.identifiers
|
151
156
|
rescue
|
152
157
|
logger.fatal("Azure authenticator options contain identifiers that are not included in the configuration file!")
|
153
158
|
end
|
154
|
-
|
155
|
-
@ca = secret(vault: keyvault, name: ca)
|
156
|
-
@endpoint = secret(vault: keyvault, name: endpoint)
|
157
|
-
@token = secret(vault: keyvault, name: token)
|
158
159
|
end
|
159
160
|
|
160
161
|
###############################################################################
|
@@ -18,7 +18,9 @@ module HelmWrapper
|
|
18
18
|
|
19
19
|
attr_reader :artefact
|
20
20
|
attr_reader :name
|
21
|
+
attr_reader :path
|
21
22
|
attr_reader :oci
|
23
|
+
attr_reader :release
|
22
24
|
attr_reader :version
|
23
25
|
|
24
26
|
###############################################################################
|
@@ -29,6 +31,19 @@ module HelmWrapper
|
|
29
31
|
|
30
32
|
@name = options["name"]
|
31
33
|
|
34
|
+
unless options["path"].nil? then
|
35
|
+
logger.fatal("Chart path must be a string!") unless options["path"].kind_of?(String)
|
36
|
+
logger.fatal("Chart path must not be blank!") if options["path"].strip.empty?
|
37
|
+
logger.fatal("Chart path must exist!") unless File.directory?(options["path"])
|
38
|
+
end
|
39
|
+
|
40
|
+
@path = options["path"]
|
41
|
+
|
42
|
+
logger.fatal("Chart release instance must be a string!") unless options["release"].kind_of?(String)
|
43
|
+
logger.fatal("Chart release instance must not be blank!") if options["release"].strip.empty?
|
44
|
+
|
45
|
+
@release = options["release"]
|
46
|
+
|
32
47
|
logger.fatal("Chart version must be a string!") unless options["version"].kind_of?(String)
|
33
48
|
|
34
49
|
@version = options["version"]
|
@@ -40,7 +55,11 @@ module HelmWrapper
|
|
40
55
|
@oci = Array.new
|
41
56
|
@artefact = Array.new
|
42
57
|
|
43
|
-
repos.each do |repo|
|
58
|
+
repos.each do |repo| logger.fatal("Configuration name must be a string!") unless options["name"].kind_of?(String)
|
59
|
+
logger.fatal("Configuration name must not be blank!") if options["name"].strip.empty?
|
60
|
+
|
61
|
+
@name = options["name"]
|
62
|
+
|
44
63
|
logger.fatal("All elements of chart repos must be hashes!") unless repo.kind_of?(Hash)
|
45
64
|
|
46
65
|
logger.fatal("Chart repo: #{hash["name"]} must have a type attribute!") unless repo.key?("type")
|
@@ -68,23 +87,13 @@ module HelmWrapper
|
|
68
87
|
logger.fatal("Chart repo: #{hash["name"]} username must be a string!") unless repo["username"].kind_of?(String)
|
69
88
|
logger.fatal("Chart repo: #{hash["name"]} username must not be blank!") if repo["username"].strip.empty?
|
70
89
|
|
71
|
-
|
72
|
-
|
73
|
-
logger.fatal("Chart repo: #{hash["name"]} username attribute must refer to a valid environment variable that holds the actual repository username!") unless ENV.key?(repo_username)
|
74
|
-
logger.fatal("Environment variable holding the username for chart repo: #{hash["name"]} is blank!") if ENV[repo_username].strip.empty?
|
75
|
-
|
76
|
-
hash["username"] = ENV[repo_username].strip
|
90
|
+
hash["username"] = repo["username"].strip
|
77
91
|
|
78
92
|
logger.fatal("Chart repo: #{hash["name"]} must have a password attribute if 'username' is set!") unless repo.key?("password")
|
79
93
|
logger.fatal("Chart repo: #{hash["name"]} password must be a string!") unless repo["password"].kind_of?(String)
|
80
94
|
logger.fatal("Chart repo: #{hash["name"]} password must not be blank!") if repo["password"].strip.empty?
|
81
95
|
|
82
|
-
|
83
|
-
|
84
|
-
logger.fatal("Chart repo: #{hash["name"]} password attribute must refer to a valid environment variable that holds the actual repository password!") unless ENV.key?(repo_password)
|
85
|
-
logger.fatal("Environment variable holding the password for chart repo: #{hash["name"]} is blank!") if ENV[repo_password].strip.empty?
|
86
|
-
|
87
|
-
hash["password"] = ENV[repo_password].strip
|
96
|
+
hash["password"] = repo["password"].strip
|
88
97
|
else
|
89
98
|
fatal("Chart repo: #{hash["name"]} is an OCI repository therefore must have a username attribute! Public OCI repositories do not need to be declared.") if is_oci
|
90
99
|
hash["username"] = nil
|
@@ -24,18 +24,24 @@ module HelmWrapper
|
|
24
24
|
|
25
25
|
###############################################################################
|
26
26
|
|
27
|
+
attr_reader :atomic
|
27
28
|
attr_reader :auths
|
28
29
|
attr_reader :base
|
29
30
|
attr_reader :chart
|
30
31
|
attr_reader :name
|
31
32
|
attr_reader :namespace
|
32
33
|
attr_reader :path
|
33
|
-
attr_reader :
|
34
|
+
attr_reader :timeout
|
34
35
|
attr_reader :variables
|
36
|
+
attr_reader :wait
|
35
37
|
|
36
38
|
###############################################################################
|
37
39
|
|
38
40
|
def initialize(chart:, options:)
|
41
|
+
logger.fatal("Configuration atomic mode must be a boolean!") unless [ true, false ].include?(options["atomic"])
|
42
|
+
|
43
|
+
@atomic = options["atomic"]
|
44
|
+
|
39
45
|
logger.fatal("Configuration base path must be a string!") unless options["base"].kind_of?(String)
|
40
46
|
logger.fatal("Configuration base path must not be blank!") if options["base"].strip.empty?
|
41
47
|
|
@@ -46,44 +52,60 @@ module HelmWrapper
|
|
46
52
|
|
47
53
|
@name = options["name"]
|
48
54
|
|
49
|
-
logger.fatal("Configuration
|
50
|
-
logger.fatal("Configuration
|
51
|
-
|
52
|
-
namespace = options["namespace"]
|
55
|
+
logger.fatal("Configuration wait timeout must be a string!") unless options["timeout"].kind_of?(String)
|
56
|
+
logger.fatal("Configuration wait timeout must not be blank!") if options["timeout"].strip.empty?
|
53
57
|
|
54
|
-
|
55
|
-
logger.fatal("Configuration release name must not be blank!") if options["release"].strip.empty?
|
58
|
+
@timeout = options["timeout"]
|
56
59
|
|
57
|
-
|
58
|
-
|
59
|
-
logger.fatal("Configuration authenticator for Azure enabled must be a Boolean!") unless [ true, false ].include?(options["auth-azure"])
|
60
|
+
logger.fatal("Configuration authenticator for Azure enabled must be a boolean!") unless [ true, false ].include?(options["auth-azure"])
|
60
61
|
|
61
62
|
auth_azure = options["auth-azure"]
|
62
63
|
|
63
|
-
logger.fatal("Configuration authenticator for Azure options must be a
|
64
|
+
logger.fatal("Configuration authenticator for Azure options must be a hash!") unless options["auth-azure-options"].kind_of?(Hash)
|
64
65
|
|
65
66
|
auth_azure_options = options["auth-azure-options"]
|
66
67
|
|
68
|
+
logger.fatal("Configuration destination namespace must be a string!") unless options["namespace"].kind_of?(String)
|
69
|
+
logger.fatal("Configuration destination namespace must not be blank!") if options["namespace"].strip.empty?
|
70
|
+
|
71
|
+
namespace = options["namespace"]
|
72
|
+
|
73
|
+
logger.fatal("Configuration wait mode must be a boolean!") unless [ true, false ].include?(options["wait"])
|
74
|
+
|
75
|
+
wait = options["wait"]
|
76
|
+
|
67
77
|
@chart = chart
|
68
78
|
@path = ::HelmWrapper.find(base: @base, name: @name, exts: @@config_exts, description: "Configuration")
|
79
|
+
@wait = (not @atomic) and wait
|
69
80
|
|
70
81
|
yaml = YAML.load(File.read(@path))
|
71
82
|
logger.fatal("Invalid YAML in configuration file: #{@path}") unless yaml.kind_of?(Hash)
|
72
83
|
|
73
84
|
identifers = yaml.key?("identifiers") ? yaml["identifiers"] : Hash.new
|
74
|
-
@variables = HelmWrapper::Shared::Variables.new(chart: @chart.name, config: @name, namespace: namespace, release: release, identifiers: identifers)
|
75
|
-
@variables.
|
85
|
+
@variables = HelmWrapper::Shared::Variables.new(chart: @chart.name, config: @name, namespace: namespace, release: @chart.release, identifiers: identifers)
|
86
|
+
@namespace = @variables.core[:namespace]
|
87
|
+
|
88
|
+
if yaml.key?("globals") then
|
89
|
+
logger.fatal("Key 'globals' is not a hash in configuration file: #{@path}") unless yaml["globals"].kind_of?(Hash)
|
90
|
+
globals = yaml["globals"]
|
91
|
+
|
92
|
+
@variables.add_variables(variables: globals["variables"]) if globals.key?("variables")
|
93
|
+
end
|
76
94
|
|
77
95
|
if yaml.key?("helm") then
|
78
96
|
logger.fatal("Key 'helm' is not a hash in configuration file: #{@path}") unless yaml["helm"].kind_of?(Hash)
|
79
97
|
helm = yaml["helm"]
|
80
98
|
|
81
|
-
@
|
82
|
-
|
83
|
-
|
99
|
+
[ "globals", @chart.release ].each do |extra|
|
100
|
+
if helm.key?(extra) then
|
101
|
+
logger.fatal("Key '#{extra}' under 'helm' is not a hash in configuration file: #{@path}") unless helm[extra].kind_of?(Hash)
|
102
|
+
section = helm[extra]
|
84
103
|
|
85
|
-
|
86
|
-
|
104
|
+
@variables.add_variables(variables: section["variables"]) if section.key?("variables")
|
105
|
+
@variables.add_files(base: @base, files: section["files"]) if section.key?("files")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
87
109
|
|
88
110
|
@auths = Array.new
|
89
111
|
@auths.append(HelmWrapper::Shared::Auths::Azure.new(options: auth_azure_options, variables: @variables)) if auth_azure
|
@@ -36,7 +36,7 @@ module HelmWrapper
|
|
36
36
|
|
37
37
|
###############################################################################
|
38
38
|
|
39
|
-
def initialize(binary:, chart:, config:)
|
39
|
+
def initialize(binary:, chart:, config: nil)
|
40
40
|
@binary = binary
|
41
41
|
@chart = chart
|
42
42
|
@config = config
|
@@ -48,6 +48,8 @@ module HelmWrapper
|
|
48
48
|
###############################################################################
|
49
49
|
|
50
50
|
def init_auths()
|
51
|
+
logger.fatal("Cannot initialise authenticators without a valid configuration!") if @config.nil?
|
52
|
+
|
51
53
|
@auths_attempted = true
|
52
54
|
|
53
55
|
config.auths.map(&:auth)
|
@@ -62,28 +64,36 @@ module HelmWrapper
|
|
62
64
|
|
63
65
|
@chart.oci.each_with_index do |oci_repo, oci_index|
|
64
66
|
logger.info("Logging into OCI repository: #{oci_repo["name"]}")
|
67
|
+
|
68
|
+
username = from_environment(variable: oci_repo["username"])
|
69
|
+
password = from_environment(variable: oci_repo["password"])
|
70
|
+
|
65
71
|
@chart.oci_active(active: true, index: oci_index)
|
66
72
|
|
67
73
|
parameters = Array.new
|
68
74
|
parameters.append("login")
|
69
75
|
parameters.append("\"#{oci_repo["url"]}\"")
|
70
|
-
parameters.append("--username=\"#{
|
76
|
+
parameters.append("--username=\"#{username}\"")
|
71
77
|
parameters.append("--password-stdin")
|
72
|
-
logger.fatal("Failed to login to Helm OCI repository: #{oci_repo["name"]}, url: #{oci_repo["url"]}") unless run(action: "registry", parameters: parameters, stdin:
|
78
|
+
logger.fatal("Failed to login to Helm OCI repository: #{oci_repo["name"]}, url: #{oci_repo["url"]}") unless run(action: "registry", parameters: parameters, stdin: password)
|
73
79
|
end
|
74
80
|
|
75
81
|
if @chart.artefact.length > 0 then
|
76
82
|
|
77
83
|
@chart.artefact.each_with_index do |artefact_repo, artefact_index|
|
78
84
|
logger.info("Adding artefact repository: #{artefact_repo["name"]}")
|
85
|
+
|
86
|
+
username = artefact_repo["username"].nil? ? nil : from_environment(variable: artefact_repo["username"])
|
87
|
+
password = artefact_repo["password"].nil? ? nil : from_environment(variable: artefact_repo["password"])
|
88
|
+
|
79
89
|
@chart.artefact_active(active: true, index: artefact_index)
|
80
90
|
|
81
91
|
parameters = Array.new
|
82
92
|
parameters.append("add")
|
83
93
|
parameters.append("\"#{artefact_repo["name"]}\"")
|
84
94
|
parameters.append("\"#{artefact_repo["url"]}\"")
|
85
|
-
parameters.append("--username=\"#{
|
86
|
-
parameters.append("--password=\"#{
|
95
|
+
parameters.append("--username=\"#{username}\"") unless username.nil?
|
96
|
+
parameters.append("--password=\"#{password}\"") unless password.nil?
|
87
97
|
parameters.append("--force-update") if force
|
88
98
|
logger.fatal("Failed to add Helm repository: #{artefact_repo["name"]}, url: #{artefact_repo["url"]}") unless run(action: "repo", parameters: parameters)
|
89
99
|
end
|
@@ -105,26 +115,48 @@ module HelmWrapper
|
|
105
115
|
###############################################################################
|
106
116
|
|
107
117
|
def delete()
|
118
|
+
logger.fatal("Cannot Helm delete without a valid configuration!") if @config.nil?
|
108
119
|
logger.fatal("Cannot Helm delete before initialising authenticators!") unless auths
|
109
120
|
|
110
121
|
parameters = Array.new
|
111
122
|
parameters.append("--namespace=\"#{@config.namespace}\"")
|
112
|
-
parameters.append(@
|
123
|
+
parameters.append("\"#{@chart.release}\"")
|
113
124
|
|
114
125
|
logger.fatal("Helm delete failed!") unless run(action: "delete", parameters: parameters)
|
115
126
|
end
|
116
127
|
|
128
|
+
###############################################################################
|
129
|
+
|
130
|
+
def template()
|
131
|
+
logger.fatal("Cannot Helm template without a valid configuration!") if @config.nil?
|
132
|
+
logger.fatal("Cannot Helm template before initialising repositories!") unless repos
|
133
|
+
|
134
|
+
parameters = Array.new
|
135
|
+
parameters.append("--namespace=\"#{@config.namespace}\"")
|
136
|
+
parameters.append("\"#{@chart.release}\"")
|
137
|
+
parameters.append("\"#{@chart.name}\"")
|
138
|
+
parameters.append("--version=\"#{@chart.version}\"") unless @chart.version.strip.empty?
|
139
|
+
parameters.concat(variable_files)
|
140
|
+
parameters.concat(variable_strings)
|
141
|
+
|
142
|
+
logger.fatal("Helm template failed!") unless run(action: "template", parameters: parameters)
|
143
|
+
end
|
144
|
+
|
117
145
|
###############################################################################
|
118
146
|
|
119
147
|
def upgrade(install: true)
|
148
|
+
logger.fatal("Cannot Helm upgrade without a valid configuration!") if @config.nil?
|
120
149
|
logger.fatal("Cannot Helm upgrade before initialising authenticators!") unless auths
|
121
150
|
logger.fatal("Cannot Helm upgrade before initialising repositories!") unless repos
|
122
151
|
|
123
152
|
parameters = Array.new
|
124
153
|
parameters.append("--namespace=\"#{@config.namespace}\"")
|
125
154
|
parameters.append("--install") if install
|
126
|
-
parameters.append(@
|
127
|
-
parameters.append(@chart.name)
|
155
|
+
parameters.append("\"#{@chart.release}\"")
|
156
|
+
parameters.append("\"#{@chart.name}\"")
|
157
|
+
parameters.append("--atomic") if @config.atomic
|
158
|
+
parameters.append("--wait") if @config.wait
|
159
|
+
parameters.append("--timeout=\"#{@config.timeout}\"") if (@config.atomic or @config.wait)
|
128
160
|
parameters.append("--version=\"#{@chart.version}\"") unless @chart.version.strip.empty?
|
129
161
|
parameters.concat(variable_files)
|
130
162
|
parameters.concat(variable_strings)
|
@@ -132,6 +164,38 @@ module HelmWrapper
|
|
132
164
|
logger.fatal("Helm upgrade failed!") unless run(action: "upgrade", parameters: parameters)
|
133
165
|
end
|
134
166
|
|
167
|
+
###############################################################################
|
168
|
+
|
169
|
+
def lint()
|
170
|
+
parameters = Array.new
|
171
|
+
parameters.append("\"#{@chart.path}\"")
|
172
|
+
|
173
|
+
logger.fatal("Helm validate failed!") unless run(action: "lint", parameters: parameters)
|
174
|
+
end
|
175
|
+
|
176
|
+
###############################################################################
|
177
|
+
|
178
|
+
def push(tag:)
|
179
|
+
logger.fatal("Cannot Helm push before initialising repositories!") unless repos
|
180
|
+
|
181
|
+
parameters = Array.new
|
182
|
+
parameters.append("push")
|
183
|
+
parameters.append("\"#{@chart.name}:#{tag}\"")
|
184
|
+
|
185
|
+
logger.fatal("Helm push failed!") unless run(action: "chart", parameters: parameters)
|
186
|
+
end
|
187
|
+
|
188
|
+
###############################################################################
|
189
|
+
|
190
|
+
def save(tag:)
|
191
|
+
parameters = Array.new
|
192
|
+
parameters.append("save")
|
193
|
+
parameters.append("\"#{@chart.path}\"")
|
194
|
+
parameters.append("\"#{@chart.name}:#{tag}\"")
|
195
|
+
|
196
|
+
logger.fatal("Helm save failed!") unless run(action: "chart", parameters: parameters)
|
197
|
+
end
|
198
|
+
|
135
199
|
###############################################################################
|
136
200
|
|
137
201
|
private
|
@@ -234,6 +298,15 @@ module HelmWrapper
|
|
234
298
|
return result
|
235
299
|
end
|
236
300
|
|
301
|
+
###############################################################################
|
302
|
+
|
303
|
+
def from_environment(variable:)
|
304
|
+
logger.fatal("Environment variable: #{variable} does not exist") unless ENV.key?(variable)
|
305
|
+
logger.fatal("Environment variable: #{variable} is blank!") if ENV[variable].strip.empty?
|
306
|
+
|
307
|
+
return ENV[variable].strip
|
308
|
+
end
|
309
|
+
|
237
310
|
###############################################################################
|
238
311
|
|
239
312
|
end
|
@@ -35,15 +35,14 @@ module HelmWrapper
|
|
35
35
|
core[:chart] = chart
|
36
36
|
core[:config] = config
|
37
37
|
core[:namespace] = nil
|
38
|
-
core[:release] =
|
38
|
+
core[:release] = release
|
39
39
|
|
40
40
|
user = cleanse(variables: identifiers, reserved: core.keys)
|
41
41
|
|
42
42
|
begin
|
43
43
|
core[:namespace] = namespace % user
|
44
|
-
core[:release] = release % user
|
45
44
|
rescue
|
46
|
-
logger.fatal("Provided
|
45
|
+
logger.fatal("Provided namespace includes identifiers that are not included in the configuration file!")
|
47
46
|
end
|
48
47
|
|
49
48
|
merged = core.merge(user)
|
data/lib/helm-wrapper/tasks.rb
CHANGED
@@ -7,5 +7,8 @@ require 'rake/tasklib'
|
|
7
7
|
require_relative 'tasks/apply'
|
8
8
|
require_relative 'tasks/binary'
|
9
9
|
require_relative 'tasks/destroy'
|
10
|
+
require_relative 'tasks/push'
|
11
|
+
require_relative 'tasks/template'
|
12
|
+
require_relative 'tasks/validate'
|
10
13
|
|
11
14
|
###############################################################################
|
@@ -45,7 +45,7 @@ module HelmWrapper
|
|
45
45
|
config = HelmWrapper::Shared::Config.new(chart: @chart, options: options)
|
46
46
|
runner = HelmWrapper::Shared::Runner.new(binary: @binary, chart: @chart, config: config)
|
47
47
|
|
48
|
-
logger.info("Running Helm upgrade for release: #{
|
48
|
+
logger.info("Running Helm upgrade for release: #{@chart.release}, namespace: #{config.namespace}...")
|
49
49
|
|
50
50
|
begin
|
51
51
|
runner.init_repos
|
@@ -44,7 +44,7 @@ module HelmWrapper
|
|
44
44
|
config = HelmWrapper::Shared::Config.new(chart: @chart, options: options)
|
45
45
|
runner = HelmWrapper::Shared::Runner.new(binary: @binary, chart: @chart, config: config)
|
46
46
|
|
47
|
-
logger.info("Running Helm delete for release: #{
|
47
|
+
logger.info("Running Helm delete for release: #{@chart.release}, namespace: #{config.namespace}...")
|
48
48
|
|
49
49
|
begin
|
50
50
|
runner.init_auths
|
@@ -0,0 +1,67 @@
|
|
1
|
+
###############################################################################
|
2
|
+
|
3
|
+
module HelmWrapper
|
4
|
+
|
5
|
+
###############################################################################
|
6
|
+
|
7
|
+
module Tasks
|
8
|
+
|
9
|
+
###############################################################################
|
10
|
+
|
11
|
+
class Push < ::Rake::TaskLib
|
12
|
+
|
13
|
+
###############################################################################
|
14
|
+
|
15
|
+
include HelmWrapper::Shared::Logging
|
16
|
+
|
17
|
+
###############################################################################
|
18
|
+
|
19
|
+
@binary
|
20
|
+
@chart
|
21
|
+
|
22
|
+
###############################################################################
|
23
|
+
|
24
|
+
def initialize(binary:, chart:)
|
25
|
+
@binary = binary
|
26
|
+
@chart = chart
|
27
|
+
|
28
|
+
yield self if block_given?
|
29
|
+
|
30
|
+
push_task
|
31
|
+
end
|
32
|
+
|
33
|
+
###############################################################################
|
34
|
+
|
35
|
+
def push_task
|
36
|
+
desc "Pushes a Helm chart to an OCI Helm repository."
|
37
|
+
task :push, [:tag, :clean] => :binary do |t, args|
|
38
|
+
tag = (args[:tag].kind_of?(String) and (not args[:tag].strip.empty?)) ? args[:tag].strip : "latest"
|
39
|
+
clean = args[:clean].kind_of?(String) ? args[:clean].downcase == "true" : true
|
40
|
+
|
41
|
+
runner = HelmWrapper::Shared::Runner.new(binary: @binary, chart: @chart)
|
42
|
+
|
43
|
+
logger.info("Running Helm push for path: #{@chart.path}...")
|
44
|
+
|
45
|
+
begin
|
46
|
+
runner.init_repos
|
47
|
+
runner.save(tag: tag)
|
48
|
+
runner.push(tag: tag)
|
49
|
+
ensure
|
50
|
+
runner.clean(repos: clean)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
###############################################################################
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
###############################################################################
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
###############################################################################
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
###############################################################################
|
@@ -0,0 +1,71 @@
|
|
1
|
+
###############################################################################
|
2
|
+
|
3
|
+
module HelmWrapper
|
4
|
+
|
5
|
+
###############################################################################
|
6
|
+
|
7
|
+
module Tasks
|
8
|
+
|
9
|
+
###############################################################################
|
10
|
+
|
11
|
+
class Template < ::Rake::TaskLib
|
12
|
+
|
13
|
+
###############################################################################
|
14
|
+
|
15
|
+
include HelmWrapper::Shared::Logging
|
16
|
+
|
17
|
+
###############################################################################
|
18
|
+
|
19
|
+
@binary
|
20
|
+
@chart
|
21
|
+
@options
|
22
|
+
|
23
|
+
###############################################################################
|
24
|
+
|
25
|
+
def initialize(binary:, chart:, options:)
|
26
|
+
@binary = binary
|
27
|
+
@chart = chart
|
28
|
+
@options = options
|
29
|
+
|
30
|
+
yield self if block_given?
|
31
|
+
|
32
|
+
template_task
|
33
|
+
end
|
34
|
+
|
35
|
+
###############################################################################
|
36
|
+
|
37
|
+
def template_task
|
38
|
+
desc "Templates a chart with Helm for a given configuration."
|
39
|
+
task :template, [:config, :clean] => :binary do |t, args|
|
40
|
+
options = @options.merge({"name" => args[:config]})
|
41
|
+
clean = args[:clean].kind_of?(String) ? args[:clean].downcase == "true" : true
|
42
|
+
|
43
|
+
logger.info("Processing configuration for Helm template...")
|
44
|
+
|
45
|
+
config = HelmWrapper::Shared::Config.new(chart: @chart, options: options)
|
46
|
+
runner = HelmWrapper::Shared::Runner.new(binary: @binary, chart: @chart, config: config)
|
47
|
+
|
48
|
+
logger.info("Running Helm template for release: #{@chart.release}, namespace: #{config.namespace}...")
|
49
|
+
|
50
|
+
begin
|
51
|
+
runner.init_repos
|
52
|
+
runner.template
|
53
|
+
ensure
|
54
|
+
runner.clean(repos: clean)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
###############################################################################
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
###############################################################################
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
###############################################################################
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
###############################################################################
|
@@ -0,0 +1,58 @@
|
|
1
|
+
###############################################################################
|
2
|
+
|
3
|
+
module HelmWrapper
|
4
|
+
|
5
|
+
###############################################################################
|
6
|
+
|
7
|
+
module Tasks
|
8
|
+
|
9
|
+
###############################################################################
|
10
|
+
|
11
|
+
class Validate < ::Rake::TaskLib
|
12
|
+
|
13
|
+
###############################################################################
|
14
|
+
|
15
|
+
include HelmWrapper::Shared::Logging
|
16
|
+
|
17
|
+
###############################################################################
|
18
|
+
|
19
|
+
@binary
|
20
|
+
@chart
|
21
|
+
|
22
|
+
###############################################################################
|
23
|
+
|
24
|
+
def initialize(binary:, chart:)
|
25
|
+
@binary = binary
|
26
|
+
@chart = chart
|
27
|
+
|
28
|
+
yield self if block_given?
|
29
|
+
|
30
|
+
validate_task
|
31
|
+
end
|
32
|
+
|
33
|
+
###############################################################################
|
34
|
+
|
35
|
+
def validate_task
|
36
|
+
desc "Validates a Helm chart stored locally."
|
37
|
+
task :validate => :binary do |t, args|
|
38
|
+
runner = HelmWrapper::Shared::Runner.new(binary: @binary, chart: @chart)
|
39
|
+
|
40
|
+
logger.info("Running Helm validate for path: #{@chart.path}...")
|
41
|
+
|
42
|
+
runner.lint
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
###############################################################################
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
###############################################################################
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
###############################################################################
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
###############################################################################
|
data/lib/helm-wrapper/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: helm-wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Lees
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -58,6 +58,9 @@ files:
|
|
58
58
|
- lib/helm-wrapper/tasks/apply.rb
|
59
59
|
- lib/helm-wrapper/tasks/binary.rb
|
60
60
|
- lib/helm-wrapper/tasks/destroy.rb
|
61
|
+
- lib/helm-wrapper/tasks/push.rb
|
62
|
+
- lib/helm-wrapper/tasks/template.rb
|
63
|
+
- lib/helm-wrapper/tasks/validate.rb
|
61
64
|
- lib/helm-wrapper/version.rb
|
62
65
|
homepage: https://gitlab.com/rlees85-ruby/helm-wrapper/
|
63
66
|
licenses:
|