cron-kubernetes 0.1.0 → 2.0.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/.gitignore +2 -2
- data/.rubocop.yml +13 -5
- data/.ruby-version +1 -1
- data/Appraisals +9 -0
- data/CHANGELOG.md +18 -0
- data/README.md +58 -17
- data/Rakefile +8 -2
- data/bin/setup +1 -0
- data/cron-kubernetes.gemspec +8 -7
- data/gemfiles/kubeclient_3.gemfile +7 -0
- data/gemfiles/kubeclient_4.gemfile +7 -0
- data/lib/cron-kubernetes.rb +2 -0
- data/lib/cron_kubernetes/configurable.rb +2 -0
- data/lib/cron_kubernetes/context/kubectl.rb +43 -0
- data/lib/cron_kubernetes/context/well_known.rb +40 -0
- data/lib/cron_kubernetes/cron_job.rb +7 -6
- data/lib/cron_kubernetes/cron_tab.rb +5 -8
- data/lib/cron_kubernetes/kubeclient_context.rb +8 -54
- data/lib/cron_kubernetes/kubernetes_client.rb +14 -9
- data/lib/cron_kubernetes/scheduler.rb +6 -5
- data/lib/cron_kubernetes/version.rb +1 -1
- data/lib/cron_kubernetes.rb +5 -0
- metadata +44 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d270469720001ff34f95dd439c0de2a23c282a33ccd4ed1b14f4286f39968c8
|
4
|
+
data.tar.gz: ab6337710606835428a34ba7a5e7bc8530bf6e8e09eca98a1f245866c4e2ea40
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5a914ae99f3475d65145458746ed5fe78c0599c1a188b96469332c6b0cf112cde6be15008f0943c3bded3e19b184008fa10077854f660628ddf0ecd241a09fd
|
7
|
+
data.tar.gz: a38265b2e4c43ddb8c3f70a10cbd9a8fe5729930c8a11ee120678323ee8e26dd934d44681da36212671314b6f791c6384ee1b38183d4340d8e192b7430d82e5e
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- "gemfiles/*"
|
4
|
+
SuggestExtensions: false
|
5
|
+
TargetRubyVersion: 2.7
|
6
|
+
|
1
7
|
Documentation:
|
2
8
|
Exclude:
|
3
9
|
- "**/railtie.rb"
|
@@ -5,9 +11,9 @@ Documentation:
|
|
5
11
|
|
6
12
|
Style/StringLiterals:
|
7
13
|
EnforcedStyle: double_quotes
|
8
|
-
|
14
|
+
Layout/LineLength:
|
9
15
|
Max: 120
|
10
|
-
Layout/
|
16
|
+
Layout/HashAlignment:
|
11
17
|
EnforcedHashRocketStyle: table
|
12
18
|
EnforcedColonStyle: table
|
13
19
|
Layout/SpaceInsideHashLiteralBraces:
|
@@ -16,9 +22,9 @@ Style/RaiseArgs:
|
|
16
22
|
EnforcedStyle: compact
|
17
23
|
Style/EmptyMethod:
|
18
24
|
EnforcedStyle: expanded
|
19
|
-
Layout/
|
25
|
+
Layout/FirstArrayElementIndentation:
|
20
26
|
IndentationWidth: 4
|
21
|
-
Layout/
|
27
|
+
Layout/FirstHashElementIndentation:
|
22
28
|
IndentationWidth: 4
|
23
29
|
Style/ConditionalAssignment:
|
24
30
|
EnforcedStyle: assign_inside_condition
|
@@ -31,7 +37,9 @@ Style/FormatStringToken:
|
|
31
37
|
EnforcedStyle: template
|
32
38
|
Style/AsciiComments:
|
33
39
|
Enabled: false
|
34
|
-
|
40
|
+
Naming/FileName:
|
41
|
+
Exclude:
|
42
|
+
- "lib/cron-kubernetes.rb"
|
35
43
|
Metrics/BlockLength:
|
36
44
|
Exclude:
|
37
45
|
- "*.gemspec"
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
3.2.2
|
data/Appraisals
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,2 +1,20 @@
|
|
1
|
+
# v2.0.0
|
2
|
+
**Breaking Change:**
|
3
|
+
- Requires ruby 2.7 or later
|
4
|
+
|
5
|
+
**Changes:**
|
6
|
+
- Fix issue where running `cron_kubernetes` would fail with "ResourceNotFoundError"
|
7
|
+
|
8
|
+
# v1.1.0
|
9
|
+
- Fix issue where all cron jobs in a cluster would be removed, not just ones matching `identifier`
|
10
|
+
|
11
|
+
# v1.0.0
|
12
|
+
**Breaking Change:**
|
13
|
+
- Requires `kubeclient` 3.1.2 or 4.x
|
14
|
+
|
15
|
+
**Changes:**
|
16
|
+
- Add `kubeclient` configuration option for connecting to any Kubernetes server
|
17
|
+
- Add Appraisal for testing with kubeclient 3.1.2 and 4.x
|
18
|
+
|
1
19
|
# v0.1.0
|
2
20
|
- Initial Release
|
data/README.md
CHANGED
@@ -22,7 +22,7 @@ Or install it yourself as:
|
|
22
22
|
## Configuration
|
23
23
|
|
24
24
|
You can configure global settings for your cron jobs. Add a file to your source like the example
|
25
|
-
below. If you are using Rails, you can add this to something like `config/initializers/
|
25
|
+
below. If you are using Rails, you can add this to something like `config/initializers/cron_kubernetes.rb`.
|
26
26
|
|
27
27
|
You _must_ configure the `identifier` and `manifest` settings. The other settings are optional
|
28
28
|
and default values are shown below.
|
@@ -95,6 +95,29 @@ replace both `ENTRYPOINT` and `CMD` in the Docker image. See
|
|
95
95
|
[Define a Command and Arguments for a Container](https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/)
|
96
96
|
for a discussion of how `command` works in Kubernetes.
|
97
97
|
|
98
|
+
### kubeclient
|
99
|
+
The gem will automatically connect to the Kubernetes server in the following cases:
|
100
|
+
- You are running this in [a standard Kubernetes cluster](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod)
|
101
|
+
- You are running on a system with `kubeclient` installed and
|
102
|
+
- the default cluster context has credentials
|
103
|
+
- the default cluster is GKE and your system has
|
104
|
+
[Google application default credentials](https://developers.google.com/identity/protocols/application-default-credentials)
|
105
|
+
installed
|
106
|
+
|
107
|
+
There are many other ways to connect and you can do so by providing your own
|
108
|
+
[configured `kubeclient`](https://github.com/abonas/kubeclient#usage):
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
# config/initializers/resque-kubernetes.rb
|
112
|
+
|
113
|
+
CronKubernetes.configuration do |config|
|
114
|
+
config.kubeclient = Kubeclient::Client.new("http://localhost:8080/apis/batch", "v1")
|
115
|
+
end
|
116
|
+
```
|
117
|
+
|
118
|
+
Because this uses the `CronJob` resource, make sure to connect to the `/apis/batch` API endpoint and
|
119
|
+
API version `v1` in your client.
|
120
|
+
|
98
121
|
## Usage
|
99
122
|
|
100
123
|
### Create a Schedule
|
@@ -111,10 +134,10 @@ CronKubernetes.schedule do
|
|
111
134
|
end
|
112
135
|
```
|
113
136
|
|
114
|
-
For all jobs the command
|
137
|
+
For all jobs the command will change directories to either `Rails.root` if Rails is installed
|
115
138
|
or the current working directory. These are evaluated when the scheduled tasks are loaded.
|
116
139
|
|
117
|
-
For all jobs you may provide a `name`
|
140
|
+
For all jobs you may provide a `name` that will be used with the `identifier` to name the
|
118
141
|
CronJob. If you do not provide a name `CronKubernetes` will try to figure one out from the job and
|
119
142
|
pod templates plus a hash of the schedule and command.
|
120
143
|
|
@@ -122,15 +145,14 @@ pod templates plus a hash of the schedule and command.
|
|
122
145
|
|
123
146
|
A `command` runs any arbitrary shell command on a schedule. The first argument is the command to run.
|
124
147
|
|
125
|
-
|
126
148
|
#### Rake Tasks
|
127
149
|
|
128
150
|
A `rake` call runs a `rake` task on the schedule. Rake and Bundler must be installed and on the path
|
129
|
-
in the container The command it executes is `bundle exec rake ...`.
|
151
|
+
in the container. The command it executes is `bundle exec rake ...`.
|
130
152
|
|
131
153
|
#### Runners
|
132
154
|
|
133
|
-
A `runner` runs arbitrary ruby code under
|
155
|
+
A `runner` runs arbitrary ruby code under Rails. Rails must be installed at `bin/rails` from the
|
134
156
|
working folder. The command it executes is `bin/rails runner '...'`.
|
135
157
|
|
136
158
|
### Update Your Cluster
|
@@ -139,7 +161,7 @@ Once you have configuration and cluster, then you can run the `cron_kubernetes`
|
|
139
161
|
to update your cluster.
|
140
162
|
|
141
163
|
```bash
|
142
|
-
cron_kubernetes --configuration config/initializers/cron_kubernetes.rb --schedule config/schedule.rb
|
164
|
+
bundle exec cron_kubernetes --configuration config/initializers/cron_kubernetes.rb --schedule config/schedule.rb
|
143
165
|
```
|
144
166
|
|
145
167
|
The command will read the provided configuration and current schedule, compare to any
|
@@ -151,7 +173,7 @@ loaded both a configuration and a schedule. For example, if they are in the same
|
|
151
173
|
just pass a single value:
|
152
174
|
|
153
175
|
```bash
|
154
|
-
cron_kubernetes --schedule schedule.rb
|
176
|
+
bundle exec cron_kubernetes --schedule schedule.rb
|
155
177
|
```
|
156
178
|
|
157
179
|
If you are running in a Rails application where the initializers are auto-loaded, and your
|
@@ -170,21 +192,40 @@ bin/rails runner cron_kubernetes
|
|
170
192
|
at: "[H]H:mm[am|pm]"
|
171
193
|
```
|
172
194
|
|
173
|
-
##
|
195
|
+
## Contributing
|
174
196
|
|
175
|
-
|
197
|
+
Bug reports and pull requests are welcome on GitHub at
|
198
|
+
https://github.com/keylime-toolbox/cron-kubernetes-ruby.
|
176
199
|
|
177
|
-
|
200
|
+
1. Fork it (`https://github.com/[my-github-username]/cron-kubernetes-ruby/fork`)
|
201
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
202
|
+
3. Test your changes with `rake`, add new tests if needed
|
203
|
+
4. Commit your changes (`git commit -am 'Add some feature'`)
|
204
|
+
6. Push to the branch (`git push origin my-new-feature`)
|
205
|
+
7. Open a new Pull Request
|
178
206
|
|
179
|
-
|
207
|
+
### Development
|
180
208
|
|
181
|
-
|
182
|
-
|
183
|
-
push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
209
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then,
|
210
|
+
run `rake` to run the test suite.
|
184
211
|
|
185
|
-
|
212
|
+
You can run `bin/console` for an interactive prompt that will allow you to
|
213
|
+
experiment.
|
214
|
+
|
215
|
+
Write test for any code that you add. Test all changes by running `bin/rake`.
|
216
|
+
This does the following, which you can also run separately while working.
|
217
|
+
1. Run unit tests: `appraisal rake spec`
|
218
|
+
2. Make sure that your code matches the styles: `rubocop`
|
219
|
+
3. Verify if any dependent gems have open CVEs (you must update these):
|
220
|
+
`rake bundle:audit`
|
221
|
+
|
222
|
+
## Release
|
186
223
|
|
187
|
-
|
224
|
+
To release a new version, update the version number in
|
225
|
+
`lib/cron_kubernetes/version.rb` and the `CHANGELOG.md`, then run
|
226
|
+
`bundle exec rake release`, which will create a git tag for the version,
|
227
|
+
push git commits and tags, and push the `.gem` file to
|
228
|
+
[rubygems.org](https://rubygems.org).
|
188
229
|
|
189
230
|
## Acknowledgments
|
190
231
|
|
data/Rakefile
CHANGED
@@ -1,16 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "appraisal/task"
|
4
|
+
require "bundler/audit/task"
|
3
5
|
require "bundler/gem_tasks"
|
4
6
|
require "rspec/core/rake_task"
|
5
7
|
require "rubocop/rake_task"
|
6
|
-
require "bundler/audit/task"
|
7
8
|
|
8
9
|
RSpec::Core::RakeTask.new(:spec)
|
9
10
|
RuboCop::RakeTask.new
|
10
11
|
Bundler::Audit::Task.new
|
12
|
+
Appraisal::Task.new
|
11
13
|
|
12
14
|
# Remove default and replace with a series of test tasks
|
13
15
|
task default: []
|
14
16
|
Rake::Task[:default].clear
|
15
17
|
|
16
|
-
|
18
|
+
if ENV["APPRAISAL_INITIALIZED"]
|
19
|
+
task default: %i[spec]
|
20
|
+
else
|
21
|
+
task default: %i[rubocop bundle:audit appraisal]
|
22
|
+
end
|
data/bin/setup
CHANGED
data/cron-kubernetes.gemspec
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
lib = File.expand_path("lib", __dir__)
|
@@ -15,8 +14,9 @@ Gem::Specification.new do |spec|
|
|
15
14
|
spec.description = "Configure and deploy Kubernetes CronJobs from ruby with a single schedule."
|
16
15
|
spec.homepage = "https://github.com/keylimetoolbox/cron-kubernetes"
|
17
16
|
spec.license = "MIT"
|
17
|
+
spec.required_ruby_version = ">= 2.7"
|
18
18
|
|
19
|
-
spec.files
|
19
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
20
20
|
f.match(%r{^(test|spec|features)/})
|
21
21
|
end
|
22
22
|
spec.require_paths = ["lib"]
|
@@ -24,14 +24,15 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.bindir = "bin"
|
25
25
|
spec.executables << "cron_kubernetes"
|
26
26
|
|
27
|
-
spec.add_dependency "kubeclient", "
|
27
|
+
spec.add_dependency "kubeclient", ">= 3.1.2", "< 5.0"
|
28
28
|
|
29
|
-
spec.add_development_dependency "
|
29
|
+
spec.add_development_dependency "appraisal"
|
30
|
+
spec.add_development_dependency "bundler", "~> 2.4"
|
30
31
|
spec.add_development_dependency "bundler-audit", "~> 0"
|
31
32
|
spec.add_development_dependency "mocha", "~> 1.3"
|
32
|
-
spec.add_development_dependency "rake", "~>
|
33
|
-
spec.add_development_dependency "rspec", "~> 3.
|
34
|
-
spec.add_development_dependency "rubocop", "~>
|
33
|
+
spec.add_development_dependency "rake", "~> 13.1"
|
34
|
+
spec.add_development_dependency "rspec", "~> 3.12"
|
35
|
+
spec.add_development_dependency "rubocop", "~> 1.57"
|
35
36
|
|
36
37
|
# For connecting to a GKE cluster in development/test
|
37
38
|
spec.add_development_dependency "googleauth"
|
data/lib/cron-kubernetes.rb
CHANGED
@@ -11,6 +11,7 @@ module CronKubernetes
|
|
11
11
|
#
|
12
12
|
# name: The name of the setting.
|
13
13
|
# default: A default value for the setting. (Optional)
|
14
|
+
# rubocop: disable Style/ClassVars
|
14
15
|
def define_setting(name, default = nil)
|
15
16
|
class_variable_set("@@#{name}", default)
|
16
17
|
|
@@ -22,6 +23,7 @@ module CronKubernetes
|
|
22
23
|
class_variable_get("@@#{name}")
|
23
24
|
end
|
24
25
|
end
|
26
|
+
# rubocop: enable Style/ClassVars
|
25
27
|
|
26
28
|
private
|
27
29
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CronKubernetes
|
4
|
+
module Context
|
5
|
+
# Kubeclient Context from `kubectl` config file.
|
6
|
+
class Kubectl
|
7
|
+
def applicable?
|
8
|
+
File.exist?(kubeconfig)
|
9
|
+
end
|
10
|
+
|
11
|
+
def context
|
12
|
+
config = Kubeclient::Config.read(kubeconfig)
|
13
|
+
|
14
|
+
CronKubernetes::KubeclientContext::Context.new(
|
15
|
+
config.context.api_endpoint,
|
16
|
+
config.context.api_version,
|
17
|
+
config.context.namespace,
|
18
|
+
auth_options: auth_options(config),
|
19
|
+
ssl_options: config.context.ssl_options
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def kubeconfig
|
26
|
+
File.join(ENV["HOME"], ".kube", "config")
|
27
|
+
end
|
28
|
+
|
29
|
+
def auth_options(config)
|
30
|
+
options = config.context.auth_options
|
31
|
+
return options unless options.empty?
|
32
|
+
|
33
|
+
google_application_default_credentials
|
34
|
+
end
|
35
|
+
|
36
|
+
def google_application_default_credentials
|
37
|
+
return unless defined?(Google) && defined?(Google::Auth)
|
38
|
+
|
39
|
+
{bearer_token: Kubeclient::GoogleApplicationDefaultCredentials.token}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CronKubernetes
|
4
|
+
module Context
|
5
|
+
# Kubeclient Context from well-known locations within a Kubernetes cluster.
|
6
|
+
class WellKnown
|
7
|
+
TOKEN_FILE = "/var/run/secrets/kubernetes.io/serviceaccount/token"
|
8
|
+
CA_FILE = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
|
9
|
+
NAMESPACE_FILE = "/var/run/secrets/kubernetes.io/serviceaccount/namespace"
|
10
|
+
|
11
|
+
def applicable?
|
12
|
+
File.exist?(TOKEN_FILE)
|
13
|
+
end
|
14
|
+
|
15
|
+
def context
|
16
|
+
CronKubernetes::KubeclientContext::Context.new(
|
17
|
+
"https://kubernetes.default.svc",
|
18
|
+
"v1",
|
19
|
+
namespace,
|
20
|
+
auth_options: {bearer_token_file: TOKEN_FILE},
|
21
|
+
ssl_options: ssl_options
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def namespace
|
28
|
+
return nil unless File.exist?(NAMESPACE_FILE)
|
29
|
+
|
30
|
+
File.read(NAMESPACE_FILE)
|
31
|
+
end
|
32
|
+
|
33
|
+
def ssl_options
|
34
|
+
return {} unless File.exist?(CA_FILE)
|
35
|
+
|
36
|
+
{ca_file: CA_FILE}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -18,7 +18,7 @@ module CronKubernetes
|
|
18
18
|
# rubocop:disable Metrics/MethodLength
|
19
19
|
def cron_job_manifest
|
20
20
|
{
|
21
|
-
"apiVersion" => "batch/
|
21
|
+
"apiVersion" => "batch/v1",
|
22
22
|
"kind" => "CronJob",
|
23
23
|
"metadata" => {
|
24
24
|
"name" => "#{identifier}-#{cron_job_name}",
|
@@ -39,7 +39,8 @@ module CronKubernetes
|
|
39
39
|
private
|
40
40
|
|
41
41
|
def namespace
|
42
|
-
return job_manifest["metadata"]["namespace"] if job_manifest["metadata"]
|
42
|
+
return job_manifest["metadata"]["namespace"] if job_manifest["metadata"] && job_manifest["metadata"]["namespace"]
|
43
|
+
|
43
44
|
"default"
|
44
45
|
end
|
45
46
|
|
@@ -57,17 +58,17 @@ module CronKubernetes
|
|
57
58
|
def cron_job_name
|
58
59
|
return name if name
|
59
60
|
return job_hash(job_manifest["metadata"]["name"]) if job_manifest["metadata"]
|
61
|
+
|
60
62
|
pod_template_name
|
61
63
|
end
|
62
64
|
|
63
|
-
# rubocop:disable Metrics/AbcSize
|
64
65
|
def pod_template_name
|
65
66
|
return nil unless job_manifest["spec"] &&
|
66
|
-
|
67
|
-
|
67
|
+
job_manifest["spec"]["template"] &&
|
68
|
+
job_manifest["spec"]["template"]["metadata"]
|
69
|
+
|
68
70
|
job_hash(job_manifest["spec"]["template"]["metadata"]["name"])
|
69
71
|
end
|
70
|
-
# rubocop:enable Metrics/AbcSize
|
71
72
|
|
72
73
|
def job_hash(name)
|
73
74
|
"#{name}-#{Digest::SHA1.hexdigest(schedule + command.join)[0..7]}"
|
@@ -3,13 +3,6 @@
|
|
3
3
|
module CronKubernetes
|
4
4
|
# The "table" of Kubernetes CronJobs that we manage in the cluster.
|
5
5
|
class CronTab
|
6
|
-
attr_reader :client
|
7
|
-
private :client
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@client = CronKubernetes::KubernetesClient.new.batch_beta1_client
|
11
|
-
end
|
12
|
-
|
13
6
|
# "Apply" the new configuration
|
14
7
|
# - remove from cluster any cron_jobs that are no longer in the schedule
|
15
8
|
# - add new jobs
|
@@ -24,9 +17,13 @@ module CronKubernetes
|
|
24
17
|
|
25
18
|
private
|
26
19
|
|
20
|
+
def client
|
21
|
+
@client ||= CronKubernetes::KubernetesClient.new.batch_client
|
22
|
+
end
|
23
|
+
|
27
24
|
# Define a label for our jobs based on an identifier
|
28
25
|
def label_selector
|
29
|
-
{"cron-kubernetes-identifier
|
26
|
+
{label_selector: "cron-kubernetes-identifier=#{CronKubernetes.identifier}"}
|
30
27
|
end
|
31
28
|
|
32
29
|
# Find all k8s CronJobs by our label for the identifier
|
@@ -5,64 +5,18 @@ require "kubeclient"
|
|
5
5
|
module CronKubernetes
|
6
6
|
# Create a context for `Kubeclient` depending on the environment.
|
7
7
|
class KubeclientContext
|
8
|
+
Context = Struct.new(:endpoint, :version, :namespace, :options)
|
9
|
+
|
8
10
|
class << self
|
9
11
|
def context
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
# When running in development, use the config file for `kubectl` and default application credentials
|
17
|
-
kubectl_context
|
12
|
+
[
|
13
|
+
CronKubernetes::Context::WellKnown,
|
14
|
+
CronKubernetes::Context::Kubectl
|
15
|
+
].each do |context_type|
|
16
|
+
context = context_type.new
|
17
|
+
return context.context if context.applicable?
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def well_known_context
|
24
|
-
Kubeclient::Config::Context.new(
|
25
|
-
"https://kubernetes",
|
26
|
-
"v1",
|
27
|
-
{ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"},
|
28
|
-
bearer_token_file: "/var/run/secrets/kubernetes.io/serviceaccount/token"
|
29
|
-
)
|
30
|
-
end
|
31
|
-
|
32
|
-
def kubectl_context
|
33
|
-
config = Kubeclient::Config.read(kubeconfig)
|
34
|
-
auth_options = config.context.auth_options
|
35
|
-
|
36
|
-
auth_options = google_default_application_credentials(config) if auth_options.empty?
|
37
|
-
|
38
|
-
Kubeclient::Config::Context.new(
|
39
|
-
config.context.api_endpoint,
|
40
|
-
config.context.api_version,
|
41
|
-
config.context.ssl_options,
|
42
|
-
auth_options
|
43
|
-
)
|
44
|
-
end
|
45
|
-
|
46
|
-
def kubeconfig
|
47
|
-
File.join(ENV["HOME"], ".kube", "config")
|
48
|
-
end
|
49
|
-
|
50
|
-
# TODO: Move this logic to kubeclient. See abonas/kubeclient#213
|
51
|
-
def google_default_application_credentials(config)
|
52
|
-
return unless defined?(Google) && defined?(Google::Auth)
|
53
|
-
|
54
|
-
_cluster, user = config.send(:fetch_context, config.instance_variable_get(:@kcfg)["current-context"])
|
55
|
-
return {} unless user["auth-provider"] && user["auth-provider"]["name"] == "gcp"
|
56
|
-
|
57
|
-
{bearer_token: new_google_token}
|
58
|
-
end
|
59
|
-
|
60
|
-
def new_google_token
|
61
|
-
scopes = ["https://www.googleapis.com/auth/cloud-platform"]
|
62
|
-
authorization = Google::Auth.get_application_default(scopes)
|
63
|
-
authorization.apply({})
|
64
|
-
authorization.access_token
|
65
|
-
end
|
66
20
|
end
|
67
21
|
end
|
68
22
|
end
|
@@ -3,22 +3,27 @@
|
|
3
3
|
module CronKubernetes
|
4
4
|
# Encapsulate access to Kubernetes API for different API versions.
|
5
5
|
class KubernetesClient
|
6
|
-
def
|
7
|
-
@
|
6
|
+
def batch_client
|
7
|
+
@batch_client ||= client("/apis/batch", "v1")
|
8
|
+
end
|
9
|
+
|
10
|
+
def namespace
|
11
|
+
context&.namespace
|
8
12
|
end
|
9
13
|
|
10
14
|
private
|
11
15
|
|
12
16
|
def client(scope, version = nil)
|
13
|
-
|
17
|
+
return CronKubernetes.kubeclient if CronKubernetes.kubeclient
|
14
18
|
return unless context
|
15
19
|
|
16
|
-
Kubeclient::Client.new(
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
Kubeclient::Client.new(context.endpoint + scope, version || context.version, context.options)
|
21
|
+
end
|
22
|
+
|
23
|
+
def context
|
24
|
+
return nil if CronKubernetes.kubeclient
|
25
|
+
|
26
|
+
@context ||= KubeclientContext.context
|
22
27
|
end
|
23
28
|
end
|
24
29
|
end
|
@@ -44,11 +44,11 @@ module CronKubernetes
|
|
44
44
|
|
45
45
|
def new_cron_job(schedule, command, name)
|
46
46
|
CronJob.new(
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
47
|
+
schedule: schedule,
|
48
|
+
command: make_command(command),
|
49
|
+
job_manifest: CronKubernetes.manifest,
|
50
|
+
name: name,
|
51
|
+
identifier: @identifier
|
52
52
|
)
|
53
53
|
end
|
54
54
|
|
@@ -58,6 +58,7 @@ module CronKubernetes
|
|
58
58
|
|
59
59
|
def root
|
60
60
|
return Rails.root if defined? Rails
|
61
|
+
|
61
62
|
Dir.pwd
|
62
63
|
end
|
63
64
|
end
|
data/lib/cron_kubernetes.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "cron_kubernetes/configurable"
|
4
|
+
require "cron_kubernetes/context/kubectl"
|
5
|
+
require "cron_kubernetes/context/well_known"
|
4
6
|
require "cron_kubernetes/cron_job"
|
5
7
|
require "cron_kubernetes/cron_tab"
|
6
8
|
require "cron_kubernetes/kubeclient_context"
|
@@ -26,6 +28,9 @@ module CronKubernetes
|
|
26
28
|
# Provide an identifier for this schedule (e.g. your application name)
|
27
29
|
define_setting :identifier
|
28
30
|
|
31
|
+
# A `kubeclient` for connection context, default attempts to read from cluster or `~/.kube/config`
|
32
|
+
define_setting :kubeclient, nil
|
33
|
+
|
29
34
|
class << self
|
30
35
|
def schedule(&block)
|
31
36
|
CronKubernetes::Scheduler.instance.instance_eval(&block)
|
metadata
CHANGED
@@ -1,43 +1,63 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cron-kubernetes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Wadsack
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kubeclient
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.1.2
|
20
|
+
- - "<"
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
22
|
+
version: '5.0'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.1.2
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '5.0'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: appraisal
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
25
45
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
46
|
+
version: '0'
|
27
47
|
- !ruby/object:Gem::Dependency
|
28
48
|
name: bundler
|
29
49
|
requirement: !ruby/object:Gem::Requirement
|
30
50
|
requirements:
|
31
51
|
- - "~>"
|
32
52
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
53
|
+
version: '2.4'
|
34
54
|
type: :development
|
35
55
|
prerelease: false
|
36
56
|
version_requirements: !ruby/object:Gem::Requirement
|
37
57
|
requirements:
|
38
58
|
- - "~>"
|
39
59
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
60
|
+
version: '2.4'
|
41
61
|
- !ruby/object:Gem::Dependency
|
42
62
|
name: bundler-audit
|
43
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,48 +92,42 @@ dependencies:
|
|
72
92
|
requirements:
|
73
93
|
- - "~>"
|
74
94
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
95
|
+
version: '13.1'
|
76
96
|
type: :development
|
77
97
|
prerelease: false
|
78
98
|
version_requirements: !ruby/object:Gem::Requirement
|
79
99
|
requirements:
|
80
100
|
- - "~>"
|
81
101
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
102
|
+
version: '13.1'
|
83
103
|
- !ruby/object:Gem::Dependency
|
84
104
|
name: rspec
|
85
105
|
requirement: !ruby/object:Gem::Requirement
|
86
106
|
requirements:
|
87
107
|
- - "~>"
|
88
108
|
- !ruby/object:Gem::Version
|
89
|
-
version: '3.
|
109
|
+
version: '3.12'
|
90
110
|
type: :development
|
91
111
|
prerelease: false
|
92
112
|
version_requirements: !ruby/object:Gem::Requirement
|
93
113
|
requirements:
|
94
114
|
- - "~>"
|
95
115
|
- !ruby/object:Gem::Version
|
96
|
-
version: '3.
|
116
|
+
version: '3.12'
|
97
117
|
- !ruby/object:Gem::Dependency
|
98
118
|
name: rubocop
|
99
119
|
requirement: !ruby/object:Gem::Requirement
|
100
120
|
requirements:
|
101
121
|
- - "~>"
|
102
122
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
104
|
-
- - ">="
|
105
|
-
- !ruby/object:Gem::Version
|
106
|
-
version: 0.52.1
|
123
|
+
version: '1.57'
|
107
124
|
type: :development
|
108
125
|
prerelease: false
|
109
126
|
version_requirements: !ruby/object:Gem::Requirement
|
110
127
|
requirements:
|
111
128
|
- - "~>"
|
112
129
|
- !ruby/object:Gem::Version
|
113
|
-
version: '
|
114
|
-
- - ">="
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: 0.52.1
|
130
|
+
version: '1.57'
|
117
131
|
- !ruby/object:Gem::Dependency
|
118
132
|
name: googleauth
|
119
133
|
requirement: !ruby/object:Gem::Requirement
|
@@ -141,6 +155,7 @@ files:
|
|
141
155
|
- ".rubocop.yml"
|
142
156
|
- ".ruby-gemset"
|
143
157
|
- ".ruby-version"
|
158
|
+
- Appraisals
|
144
159
|
- CHANGELOG.md
|
145
160
|
- Gemfile
|
146
161
|
- LICENSE.txt
|
@@ -150,9 +165,13 @@ files:
|
|
150
165
|
- bin/cron_kubernetes
|
151
166
|
- bin/setup
|
152
167
|
- cron-kubernetes.gemspec
|
168
|
+
- gemfiles/kubeclient_3.gemfile
|
169
|
+
- gemfiles/kubeclient_4.gemfile
|
153
170
|
- lib/cron-kubernetes.rb
|
154
171
|
- lib/cron_kubernetes.rb
|
155
172
|
- lib/cron_kubernetes/configurable.rb
|
173
|
+
- lib/cron_kubernetes/context/kubectl.rb
|
174
|
+
- lib/cron_kubernetes/context/well_known.rb
|
156
175
|
- lib/cron_kubernetes/cron_job.rb
|
157
176
|
- lib/cron_kubernetes/cron_tab.rb
|
158
177
|
- lib/cron_kubernetes/kubeclient_context.rb
|
@@ -163,7 +182,7 @@ homepage: https://github.com/keylimetoolbox/cron-kubernetes
|
|
163
182
|
licenses:
|
164
183
|
- MIT
|
165
184
|
metadata: {}
|
166
|
-
post_install_message:
|
185
|
+
post_install_message:
|
167
186
|
rdoc_options: []
|
168
187
|
require_paths:
|
169
188
|
- lib
|
@@ -171,16 +190,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
171
190
|
requirements:
|
172
191
|
- - ">="
|
173
192
|
- !ruby/object:Gem::Version
|
174
|
-
version: '
|
193
|
+
version: '2.7'
|
175
194
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
195
|
requirements:
|
177
196
|
- - ">="
|
178
197
|
- !ruby/object:Gem::Version
|
179
198
|
version: '0'
|
180
199
|
requirements: []
|
181
|
-
|
182
|
-
|
183
|
-
signing_key:
|
200
|
+
rubygems_version: 3.4.10
|
201
|
+
signing_key:
|
184
202
|
specification_version: 4
|
185
203
|
summary: Configure and deploy Kubernetes CronJobs from ruby.
|
186
204
|
test_files: []
|