kubecontrol 0.2.5 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 707a8841200476fc3adf97d63d744169629cf6a03993a43e8c771d73a6a4c80a
4
- data.tar.gz: 715c7157780f9e909e0a3cc2dfdc15a3c948dbc79529de91c4fc2504309a4d89
3
+ metadata.gz: 16ffbd150b8509fd48aafeb8caf01321335687af651155c69737e0e931b0fa58
4
+ data.tar.gz: 2c64c013191b415b3296e43fbd20a95b2ad82c76207d7a5f4ce2878914fa10ca
5
5
  SHA512:
6
- metadata.gz: 5a748ff7cf8eafcca984455fa9590db79edad8b44014c425b9a607e8521b48d7dbd24ff3db070e13862968d8c636b826ae25081fdfe4ad039a4c305cda1bbdad
7
- data.tar.gz: 2197d756a9568cc3ff3d7a7f1e589a08d93905d08b2ea97d485c026d5b54d25931c1d86ccaf90305e140fbabbee7e13e1b3eb3ab321f1210d352d585d574471a
6
+ metadata.gz: e4f4c1831fa2186e2b17c68c6bc2333dab39b0709c7cd887b775d62de93d1471a00cef49afb80937b62a8736b6fe5508db66dc9605a4da85d6538fc4b4b71d2c
7
+ data.tar.gz: 1ebf4b5a383a8300ba99e72871abe9dd878852610ab09a9e3badaf2c30ef113e54730a313bb2af00dd5f568894ed6bbb2f88f667b3f9627fb42198357c33dc73
@@ -1,4 +1,4 @@
1
- name: Ruby
1
+ name: Unit Tests
2
2
 
3
3
  on: [push]
4
4
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # v0.3.5 / 02-21-2020
2
+ - [FEATURE] Kubecontrol::Deployment
3
+ - [FEATURE] Kubecontrol::StatefulSet
4
+
1
5
  # v0.2.5 / 02-18-2020
2
6
  - [FEATURE] Kubecontrol::Service
3
7
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kubecontrol (0.2.5)
4
+ kubecontrol (0.3.5)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -20,6 +20,7 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
+ ##### kubectl Commands
23
24
  ```ruby
24
25
  require 'kubecontrol'
25
26
 
@@ -28,6 +29,15 @@ kubectl_client = Kubecontrol.client.new
28
29
 
29
30
  #Exec an arbitrary kubectl command
30
31
  std_out, std_err, exit_code = kubectl_client.kubectl_command 'get deployments'
32
+ ```
33
+
34
+ #### Pods
35
+
36
+ ```ruby
37
+ require 'kubecontrol'
38
+
39
+ # create new client
40
+ kubectl_client = Kubecontrol.client.new
31
41
 
32
42
  # all pods for namespace
33
43
  pods = kubectl_client.pods
@@ -47,6 +57,94 @@ pod.namespace
47
57
  std_out, std_err, exit_code = pod.exec('ls')
48
58
  ```
49
59
 
60
+ #### Services
61
+
62
+ ```ruby
63
+ require 'kubecontrol'
64
+
65
+ # create new client
66
+ kubectl_client = Kubecontrol.client.new
67
+
68
+ # all services for namespace
69
+ services = kubectl_client.services
70
+
71
+ # find service by name regex
72
+ service = kubectl_client.find_service_by_name /foo-api-.*/
73
+
74
+ # access service information
75
+ service.name
76
+ service.type
77
+ service.cluster_ip
78
+ service.external_ip
79
+ service.ports
80
+ service.age
81
+ service.namespace
82
+ ```
83
+
84
+ #### Deployments
85
+
86
+ ```ruby
87
+ require 'kubecontrol'
88
+
89
+ # create new client
90
+ kubectl_client = Kubecontrol.client.new
91
+
92
+ # all deployments for namespace
93
+ deployments = kubectl_client.deployments
94
+
95
+ # find deployment by name regex
96
+ deployment = kubectl_client.find_deployment_by_name /foo-api-.*/
97
+
98
+ # access deployment information
99
+ deployment.name
100
+ deployment.ready
101
+ deployment.up_to_date
102
+ deployment.available
103
+ deployment.age
104
+ deployment.namespace
105
+
106
+ # is deployment ready
107
+ deployment.ready?
108
+ deployment.all_ready?
109
+
110
+ # is deployment available
111
+ deployment.available?
112
+
113
+ # is deployment up_to_date
114
+ deployment.up_to_date?
115
+
116
+ # scale deployment
117
+ deployment.scale(5)
118
+ ```
119
+
120
+ #### StatefulSets
121
+
122
+ ```ruby
123
+ require 'kubecontrol'
124
+
125
+ # create new client
126
+ kubectl_client = Kubecontrol.client.new
127
+
128
+ # all stateful_sets for namespace
129
+ stateful_sets = kubectl_client.stateful_sets
130
+
131
+ # find stateful_set by name regex
132
+ stateful_set = kubectl_client.find_stateful_set_by_name /foo-api-.*/
133
+
134
+ # access stateful_set information
135
+ stateful_set.name
136
+ stateful_set.ready
137
+ stateful_set.age
138
+ stateful_set.namespace
139
+
140
+ # is stateful_set ready
141
+ stateful_set.ready?
142
+ stateful_set.all_ready?
143
+
144
+ # scale stateful_set
145
+ stateful_set.scale(5)
146
+ ```
147
+
50
148
  ## Development
51
149
 
52
150
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -56,3 +154,6 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
56
154
  ## Contributing
57
155
 
58
156
  Bug reports and pull requests are welcome on GitHub at https://github.com/madkin10/kubecontrol.
157
+
158
+ ## Contributors
159
+ - [Dustin Ashley](https://github.com/DustinAshley)
data/lib/kubecontrol.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require 'kubecontrol/version'
2
2
  require 'kubecontrol/client'
3
3
  require 'kubecontrol/pod'
4
+ require 'kubecontrol/service'
5
+ require 'kubecontrol/stateful_set'
6
+ require 'kubecontrol/deployment'
4
7
 
5
8
  module Kubecontrol
6
9
  class Error < StandardError; end
@@ -1,5 +1,7 @@
1
1
  require 'open3'
2
2
  require_relative 'pod'
3
+ require_relative 'deployment'
4
+ require_relative 'stateful_set'
3
5
  require_relative 'service'
4
6
 
5
7
  module Kubecontrol
@@ -16,14 +18,34 @@ module Kubecontrol
16
18
  get_resource(Pod, 5)
17
19
  end
18
20
 
19
- def find_pod_by_name(name_regex)
20
- pods.find { |pod| pod.name.match?(name_regex) }
21
+ def deployments
22
+ get_resource(Deployment, 5)
23
+ end
24
+
25
+ def stateful_sets
26
+ get_resource(StatefulSet, 3)
21
27
  end
22
28
 
23
29
  def services
24
30
  get_resource(Service, 6)
25
31
  end
26
32
 
33
+ def find_service_by_name(name_regex)
34
+ services.find { |service| service.name.match?(name_regex) }
35
+ end
36
+
37
+ def find_pod_by_name(name_regex)
38
+ pods.find { |pod| pod.name.match?(name_regex) }
39
+ end
40
+
41
+ def find_deployment_by_name(name_regex)
42
+ deployments.find { |deployment| deployment.name.match?(name_regex) }
43
+ end
44
+
45
+ def find_stateful_set_by_name(name_regex)
46
+ stateful_sets.find { |stateful_set| stateful_set.name.match?(name_regex) }
47
+ end
48
+
27
49
  def kubectl_command(command)
28
50
  stdout_data, stderr_data, status = Open3.capture3("kubectl -n #{namespace} #{command}")
29
51
  exit_code = status.exitstatus
@@ -0,0 +1,38 @@
1
+ module Kubecontrol
2
+ class Deployment
3
+ RESOURCE_NAME = 'deployments'.freeze
4
+
5
+ attr_reader :name, :ready, :up_to_date, :available, :age, :namespace, :client
6
+
7
+ def initialize(name, ready, up_to_date, available, age, namespace, client)
8
+ @name = name
9
+ @ready = ready
10
+ @up_to_date = up_to_date
11
+ @available = available
12
+ @age = age
13
+ @namespace = namespace
14
+ @client = client
15
+ end
16
+
17
+ def ready?
18
+ @ready.split('/').first != '0'
19
+ end
20
+
21
+ def all_ready?
22
+ max_pods = @ready.split('/').last
23
+ @ready == "#{max_pods}/#{max_pods}"
24
+ end
25
+
26
+ def available?
27
+ @available.to_i > 1
28
+ end
29
+
30
+ def up_to_date?
31
+ @up_to_date.to_i > 1
32
+ end
33
+
34
+ def scale(count)
35
+ @client.kubectl_command("scale deployment #{@name} --replicas=#{count}")
36
+ end
37
+ end
38
+ end
@@ -23,6 +23,11 @@ module Kubecontrol
23
23
  @status == RUNNING
24
24
  end
25
25
 
26
+ def ready?
27
+ pod_containers = @ready.split('/').last
28
+ @ready == "#{pod_containers}/#{pod_containers}"
29
+ end
30
+
26
31
  def exec(command)
27
32
  @client.kubectl_command("exec -i #{name} -- sh -c \"#{command.gsub('"', '\"')}\"")
28
33
  end
@@ -0,0 +1,28 @@
1
+ module Kubecontrol
2
+ class StatefulSet
3
+ RESOURCE_NAME = 'statefulsets'.freeze
4
+
5
+ attr_reader :name, :ready, :age, :namespace, :client
6
+
7
+ def initialize(name, ready, age, namespace, client)
8
+ @name = name
9
+ @ready = ready
10
+ @age = age
11
+ @namespace = namespace
12
+ @client = client
13
+ end
14
+
15
+ def ready?
16
+ @ready.split('/').first != '0'
17
+ end
18
+
19
+ def all_ready?
20
+ max_pods = @ready.split('/').last
21
+ @ready == "#{max_pods}/#{max_pods}"
22
+ end
23
+
24
+ def scale(count)
25
+ @client.kubectl_command("scale statefulset #{@name} --replicas=#{count}")
26
+ end
27
+ end
28
+ end
@@ -1,3 +1,3 @@
1
1
  module Kubecontrol
2
- VERSION = '0.2.5'.freeze
2
+ VERSION = '0.3.5'.freeze
3
3
  end
@@ -2,25 +2,58 @@ require_relative '../spec_helper'
2
2
 
3
3
  RSpec.describe Kubecontrol::Client do
4
4
  let(:custom_namespace) { 'custom_namespace' }
5
- let(:pod_name) { 'foo_pod' }
6
- let(:pod_ready) { '1/1' }
5
+ let(:name) { 'foo_pod' }
6
+ let(:ready) { '1/1' }
7
+ let(:age) { '20d' }
8
+ let(:process_status) do
9
+ fork { exit }
10
+ $CHILD_STATUS
11
+ end
12
+
7
13
  let(:pod_status) { 'Running' }
8
14
  let(:pod_restarts) { '0' }
9
- let(:pod_age) { '20d' }
10
-
11
15
  let(:get_pods_std_out) do
12
16
  <<~RUBY
13
- NAME READY STATUS RESTARTS AGE
14
- #{pod_name} #{pod_ready} #{pod_status} #{pod_restarts} #{pod_age}
17
+ NAME READY STATUS RESTARTS AGE
18
+ #{name} #{ready} #{pod_status} #{pod_restarts} #{age}
15
19
  RUBY
16
20
  end
17
21
  let(:get_pods_std_err) { '' }
18
- let(:process_status) do
19
- fork { exit }
20
- $CHILD_STATUS
21
- end
22
22
  let(:get_pods_response) { [get_pods_std_out, get_pods_std_err, process_status] }
23
23
 
24
+ let(:service_type) { 'ClusterIP' }
25
+ let(:service_cluster_ip) { '172.20.0.1' }
26
+ let(:service_external_ip) { '<none>' }
27
+ let(:service_ports) { '443/TCP' }
28
+ let(:get_services_std_out) do
29
+ <<~RUBY
30
+ NAME TYPE CLUSTER_IP EXTERNAL-IP PORT(S) AGE
31
+ #{name} #{service_type} #{service_cluster_ip} #{service_external_ip} #{service_ports} #{age}
32
+ RUBY
33
+ end
34
+ let(:get_services_std_err) { '' }
35
+ let(:get_services_response) { [get_services_std_out, get_services_std_err, process_status] }
36
+
37
+ let(:deployments_up_to_date) { '1' }
38
+ let(:deployments_available) { '1' }
39
+ let(:get_deployments_std_out) do
40
+ <<~RUBY
41
+ NAME READY UP-TO-DATE AVAILABLE AGE
42
+ #{name} #{ready} #{deployments_up_to_date} #{deployments_available} #{age}
43
+ RUBY
44
+ end
45
+ let(:get_deployments_std_err) { '' }
46
+ let(:get_deployments_response) { [get_deployments_std_out, get_deployments_std_err, process_status] }
47
+
48
+ let(:get_stateful_sets_std_out) do
49
+ <<~RUBY
50
+ NAME READY AGE
51
+ #{name} #{ready} #{age}
52
+ RUBY
53
+ end
54
+ let(:get_stateful_sets_std_err) { '' }
55
+ let(:get_stateful_sets_response) { [get_stateful_sets_std_out, get_stateful_sets_std_err, process_status] }
56
+
24
57
  describe '#initialize' do
25
58
  subject { Kubecontrol::Client }
26
59
 
@@ -78,7 +111,7 @@ RSpec.describe Kubecontrol::Client do
78
111
  end
79
112
 
80
113
  describe '#find_pod_by_name' do
81
- subject { Kubecontrol::Client.new.find_pod_by_name(pod_name) }
114
+ subject { Kubecontrol::Client.new.find_pod_by_name(name) }
82
115
 
83
116
  before do
84
117
  allow(Open3).to receive(:capture3).and_return get_pods_response
@@ -87,7 +120,7 @@ RSpec.describe Kubecontrol::Client do
87
120
  it { is_expected.to be_an_instance_of Kubecontrol::Pod }
88
121
 
89
122
  it 'returns the correct pod' do
90
- expect(subject.name).to eq pod_name
123
+ expect(subject.name).to eq name
91
124
  end
92
125
 
93
126
  context 'pod does not exist' do
@@ -96,4 +129,145 @@ RSpec.describe Kubecontrol::Client do
96
129
  it { is_expected.to be_nil }
97
130
  end
98
131
  end
132
+
133
+ describe '#services' do
134
+ subject { Kubecontrol::Client.new.services }
135
+
136
+ it 'send a kubectl request to the command line' do
137
+ expect(Open3).to receive(:capture3).with('kubectl -n default get services').and_return get_services_response
138
+ subject
139
+ end
140
+
141
+ it 'returns an array of Kubecontrol::Services' do
142
+ allow(Open3).to receive(:capture3).and_return get_services_response
143
+ result = subject
144
+ expect(result).to be_an_instance_of Array
145
+ expect(result.length).to eq 1
146
+ expect(result.first).to be_an_instance_of Kubecontrol::Service
147
+ end
148
+
149
+ context 'no services found' do
150
+ let(:get_services_std_out) { '' }
151
+
152
+ before do
153
+ allow(Open3).to receive(:capture3).and_return get_services_response
154
+ end
155
+
156
+ it { is_expected.to be_empty }
157
+ end
158
+ end
159
+
160
+ describe '#find_service_by_name' do
161
+ subject { Kubecontrol::Client.new.find_service_by_name(name) }
162
+
163
+ before do
164
+ allow(Open3).to receive(:capture3).and_return get_services_response
165
+ end
166
+
167
+ it { is_expected.to be_an_instance_of Kubecontrol::Service }
168
+
169
+ it 'returns the correct service' do
170
+ expect(subject.name).to eq name
171
+ end
172
+
173
+ context 'service does not exist' do
174
+ let(:get_services_std_out) { '' }
175
+
176
+ it { is_expected.to be_nil }
177
+ end
178
+ end
179
+
180
+ describe '#deployments' do
181
+ subject { Kubecontrol::Client.new.deployments }
182
+
183
+ it 'send a kubectl request to the command line' do
184
+ expect(Open3).to receive(:capture3).with('kubectl -n default get deployments').and_return get_deployments_response
185
+ subject
186
+ end
187
+
188
+ it 'returns an array of Kubecontrol::Deployments' do
189
+ allow(Open3).to receive(:capture3).and_return get_deployments_response
190
+ result = subject
191
+ expect(result).to be_an_instance_of Array
192
+ expect(result.length).to eq 1
193
+ expect(result.first).to be_an_instance_of Kubecontrol::Deployment
194
+ end
195
+
196
+ context 'no deployments found' do
197
+ let(:get_deployments_std_out) { '' }
198
+
199
+ before do
200
+ allow(Open3).to receive(:capture3).and_return get_deployments_response
201
+ end
202
+
203
+ it { is_expected.to be_empty }
204
+ end
205
+ end
206
+
207
+ describe '#find_deployment_by_name' do
208
+ subject { Kubecontrol::Client.new.find_deployment_by_name(name) }
209
+
210
+ before do
211
+ allow(Open3).to receive(:capture3).and_return get_deployments_response
212
+ end
213
+
214
+ it { is_expected.to be_an_instance_of Kubecontrol::Deployment }
215
+
216
+ it 'returns the correct deployment' do
217
+ expect(subject.name).to eq name
218
+ end
219
+
220
+ context 'deployment does not exist' do
221
+ let(:get_deployments_std_out) { '' }
222
+
223
+ it { is_expected.to be_nil }
224
+ end
225
+ end
226
+
227
+ describe '#stateful_sets' do
228
+ subject { Kubecontrol::Client.new.stateful_sets }
229
+
230
+ it 'send a kubectl request to the command line' do
231
+ expect(Open3).to receive(:capture3).with('kubectl -n default get statefulsets').and_return get_stateful_sets_response
232
+ subject
233
+ end
234
+
235
+ it 'returns an array of Kubecontrol::StatefulSet' do
236
+ allow(Open3).to receive(:capture3).and_return get_stateful_sets_response
237
+ result = subject
238
+ expect(result).to be_an_instance_of Array
239
+ expect(result.length).to eq 1
240
+ expect(result.first).to be_an_instance_of Kubecontrol::StatefulSet
241
+ end
242
+
243
+ context 'no stateful_sets found' do
244
+ let(:get_stateful_sets_std_out) { '' }
245
+
246
+ before do
247
+ allow(Open3).to receive(:capture3).and_return get_stateful_sets_response
248
+ end
249
+
250
+ it { is_expected.to be_empty }
251
+ end
252
+ end
253
+
254
+ describe '#find_stateful_set_by_name' do
255
+ subject { Kubecontrol::Client.new.find_stateful_set_by_name(name) }
256
+
257
+ before do
258
+ allow(Open3).to receive(:capture3).and_return get_stateful_sets_response
259
+ end
260
+
261
+ it { is_expected.to be_an_instance_of Kubecontrol::StatefulSet }
262
+
263
+ it 'returns the correct stateful_sets' do
264
+ expect(subject.name).to eq name
265
+ end
266
+
267
+ context 'stateful_set does not exist' do
268
+ let(:get_stateful_sets_std_out) { '' }
269
+
270
+ it { is_expected.to be_nil }
271
+ end
272
+ end
99
273
  end
@@ -0,0 +1,158 @@
1
+ require_relative '../spec_helper'
2
+ require_relative '../../lib/kubecontrol/deployment'
3
+
4
+ RSpec.describe Kubecontrol::Deployment do
5
+ let(:deployment_name) { 'foo_deployment' }
6
+ let(:deployment_age) { '2d' }
7
+ let(:deployment_ready) { '1/1' }
8
+ let(:deployment_up_to_date) { '1' }
9
+ let(:deployment_available) { '1' }
10
+ let(:namespace) { 'default' }
11
+ let(:client) { Kubecontrol::Client.new }
12
+ let(:deployment) { Kubecontrol::Deployment.new(deployment_name, deployment_ready, deployment_up_to_date, deployment_available, deployment_age, namespace, client) }
13
+
14
+ describe '#initialize' do
15
+ subject { deployment }
16
+
17
+ it 'sets the deployment name field' do
18
+ expect(subject.name).to eq deployment_name
19
+ end
20
+
21
+ it 'sets the deployment age field' do
22
+ expect(subject.age).to eq deployment_age
23
+ end
24
+
25
+ it 'sets the deployment ready field' do
26
+ expect(subject.ready).to eq deployment_ready
27
+ end
28
+
29
+ it 'sets the deployment up to date field' do
30
+ expect(subject.up_to_date).to eq deployment_up_to_date
31
+ end
32
+
33
+ it 'sets the deployment available field' do
34
+ expect(subject.available).to eq deployment_available
35
+ end
36
+
37
+ it 'sets the deployment namespace' do
38
+ expect(subject.namespace).to eq namespace
39
+ end
40
+
41
+ it 'sets the client' do
42
+ expect(subject.client).to eq client
43
+ end
44
+ end
45
+
46
+ describe '#ready?' do
47
+ subject { deployment.ready? }
48
+
49
+ context 'all replicas running' do
50
+ let(:deployment_ready) { '3/3' }
51
+
52
+ it { is_expected.to eq true }
53
+ end
54
+
55
+ context 'some replicas not running' do
56
+ let(:deployment_ready) { '2/3' }
57
+
58
+ it { is_expected.to eq true }
59
+ end
60
+
61
+ context 'no replicas running' do
62
+ let(:deployment_ready) { '0/3' }
63
+
64
+ it { is_expected.to eq false }
65
+ end
66
+ end
67
+
68
+ describe '#all_ready?' do
69
+ subject { deployment.all_ready? }
70
+
71
+ context 'all replicas running' do
72
+ let(:deployment_ready) { '3/3' }
73
+
74
+ it { is_expected.to eq true }
75
+ end
76
+
77
+ context 'some replicas not running' do
78
+ let(:deployment_ready) { '2/3' }
79
+
80
+ it { is_expected.to eq false }
81
+ end
82
+
83
+ context 'no replicas running' do
84
+ let(:deployment_ready) { '0/3' }
85
+
86
+ it { is_expected.to eq false }
87
+ end
88
+ end
89
+
90
+ describe '#available?' do
91
+ subject { deployment.available? }
92
+
93
+ context 'all replicas available' do
94
+ let(:deployment_available) { '3' }
95
+
96
+ it { is_expected.to eq true }
97
+ end
98
+
99
+ context 'some replicas not available' do
100
+ let(:deployment_available) { '2' }
101
+
102
+ it { is_expected.to eq true }
103
+ end
104
+
105
+ context 'no replicas available' do
106
+ let(:deployment_available) { '0' }
107
+
108
+ it { is_expected.to eq false }
109
+ end
110
+ end
111
+
112
+ describe '#up_to_date?' do
113
+ subject { deployment.up_to_date? }
114
+
115
+ context 'all replicas up to date' do
116
+ let(:deployment_up_to_date) { '3' }
117
+
118
+ it { is_expected.to eq true }
119
+ end
120
+
121
+ context 'some replicas not up to date' do
122
+ let(:deployment_up_to_date) { '2' }
123
+
124
+ it { is_expected.to eq true }
125
+ end
126
+
127
+ context 'no replicas up to date' do
128
+ let(:deployment_up_to_date) { '0' }
129
+
130
+ it { is_expected.to eq false }
131
+ end
132
+ end
133
+
134
+ describe '#scale' do
135
+ let(:scale_count) { '5' }
136
+
137
+ let(:kubectl_command) { "scale deployment #{deployment_name} --replicas=#{scale_count}" }
138
+ let(:std_out) { "deployment.extensions/#{deployment_name} scaled" }
139
+ let(:std_err) { '' }
140
+ let(:status_code) { 0 }
141
+ let(:kubectl_command_response) { [std_out, std_err, status_code] }
142
+
143
+ subject { deployment.scale(scale_count) }
144
+
145
+ it 'sends the scale command via Kubecontrol::Client#kubectl_command' do
146
+ expect(deployment.client).to receive(:kubectl_command).with(kubectl_command).and_return kubectl_command_response
147
+ subject
148
+ end
149
+
150
+ it 'returns an array of std_out, std_err, and status code' do
151
+ allow(deployment.client).to receive(:kubectl_command).with(kubectl_command).and_return kubectl_command_response
152
+ std_out_response, std_err_response, status_code_response = subject
153
+ expect(std_out_response).to eq std_out
154
+ expect(std_err_response).to eq std_err
155
+ expect(status_code_response).to eq status_code
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,104 @@
1
+ require_relative '../spec_helper'
2
+ require_relative '../../lib/kubecontrol/stateful_set'
3
+
4
+ RSpec.describe Kubecontrol::StatefulSet do
5
+ let(:stateful_set_name) { 'foo_stateful_set' }
6
+ let(:stateful_set_age) { '2d' }
7
+ let(:stateful_set_ready) { '1/1' }
8
+ let(:namespace) { 'default' }
9
+ let(:client) { Kubecontrol::Client.new }
10
+ let(:stateful_set) { Kubecontrol::StatefulSet.new(stateful_set_name, stateful_set_ready, stateful_set_age, namespace, client) }
11
+
12
+ describe '#initialize' do
13
+ subject { stateful_set }
14
+
15
+ it 'sets the stateful_set name field' do
16
+ expect(subject.name).to eq stateful_set_name
17
+ end
18
+
19
+ it 'sets the stateful_set age field' do
20
+ expect(subject.age).to eq stateful_set_age
21
+ end
22
+
23
+ it 'sets the stateful_set ready field' do
24
+ expect(subject.ready).to eq stateful_set_ready
25
+ end
26
+
27
+ it 'sets the stateful_set namespace' do
28
+ expect(subject.namespace).to eq namespace
29
+ end
30
+
31
+ it 'sets the client' do
32
+ expect(subject.client).to eq client
33
+ end
34
+ end
35
+
36
+ describe '#ready?' do
37
+ subject { stateful_set.ready? }
38
+
39
+ context 'all replicas running' do
40
+ let(:stateful_set_ready) { '3/3' }
41
+
42
+ it { is_expected.to eq true }
43
+ end
44
+
45
+ context 'some replicas not running' do
46
+ let(:stateful_set_ready) { '2/3' }
47
+
48
+ it { is_expected.to eq true }
49
+ end
50
+
51
+ context 'no replicas running' do
52
+ let(:stateful_set_ready) { '0/3' }
53
+
54
+ it { is_expected.to eq false }
55
+ end
56
+ end
57
+
58
+ describe '#all_ready?' do
59
+ subject { stateful_set.all_ready? }
60
+
61
+ context 'all replicas running' do
62
+ let(:stateful_set_ready) { '3/3' }
63
+
64
+ it { is_expected.to eq true }
65
+ end
66
+
67
+ context 'some replicas not running' do
68
+ let(:stateful_set_ready) { '2/3' }
69
+
70
+ it { is_expected.to eq false }
71
+ end
72
+
73
+ context 'no replicas running' do
74
+ let(:stateful_set_ready) { '0/3' }
75
+
76
+ it { is_expected.to eq false }
77
+ end
78
+ end
79
+
80
+ describe '#scale' do
81
+ let(:scale_count) { '5' }
82
+
83
+ let(:kubectl_command) { "scale statefulset #{stateful_set_name} --replicas=#{scale_count}" }
84
+ let(:std_out) { "stateful_set.extensions/#{stateful_set_name} scaled" }
85
+ let(:std_err) { '' }
86
+ let(:status_code) { 0 }
87
+ let(:kubectl_command_response) { [std_out, std_err, status_code] }
88
+
89
+ subject { stateful_set.scale(scale_count) }
90
+
91
+ it 'sends the scale command via Kubecontrol::Client#kubectl_command' do
92
+ expect(stateful_set.client).to receive(:kubectl_command).with(kubectl_command).and_return kubectl_command_response
93
+ subject
94
+ end
95
+
96
+ it 'returns an array of std_out, std_err, and status code' do
97
+ allow(stateful_set.client).to receive(:kubectl_command).with(kubectl_command).and_return kubectl_command_response
98
+ std_out_response, std_err_response, status_code_response = subject
99
+ expect(std_out_response).to eq std_out
100
+ expect(std_err_response).to eq std_err
101
+ expect(status_code_response).to eq status_code
102
+ end
103
+ end
104
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kubecontrol
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marco Adkins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-18 00:00:00.000000000 Z
11
+ date: 2020-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -75,8 +75,7 @@ executables:
75
75
  extensions: []
76
76
  extra_rdoc_files: []
77
77
  files:
78
- - ".github/workflows/gempush.yml"
79
- - ".github/workflows/ruby.yml"
78
+ - ".github/workflows/unit_tests.yml"
80
79
  - ".gitignore"
81
80
  - ".rspec"
82
81
  - CHANGELOG.md
@@ -90,12 +89,16 @@ files:
90
89
  - kubecontrol.gemspec
91
90
  - lib/kubecontrol.rb
92
91
  - lib/kubecontrol/client.rb
92
+ - lib/kubecontrol/deployment.rb
93
93
  - lib/kubecontrol/pod.rb
94
94
  - lib/kubecontrol/service.rb
95
+ - lib/kubecontrol/stateful_set.rb
95
96
  - lib/kubecontrol/version.rb
96
97
  - spec/kubecontrol/client_spec.rb
98
+ - spec/kubecontrol/deployment_spec.rb
97
99
  - spec/kubecontrol/pod_spec.rb
98
100
  - spec/kubecontrol/service_spec.rb
101
+ - spec/kubecontrol/stateful_set_spec.rb
99
102
  - spec/kubecontrol_spec.rb
100
103
  - spec/spec_helper.rb
101
104
  homepage: https://github.com/madkin10/kubecontrol
@@ -120,8 +123,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
123
  - !ruby/object:Gem::Version
121
124
  version: '0'
122
125
  requirements: []
123
- rubygems_version: 3.0.3
126
+ rubygems_version: 3.1.2
124
127
  signing_key:
125
128
  specification_version: 4
126
129
  summary: Simple ruby wrapper for `kubectl` commands
127
- test_files: []
130
+ test_files:
131
+ - spec/kubecontrol/client_spec.rb
132
+ - spec/kubecontrol/deployment_spec.rb
133
+ - spec/kubecontrol/pod_spec.rb
134
+ - spec/kubecontrol/service_spec.rb
135
+ - spec/kubecontrol/stateful_set_spec.rb
136
+ - spec/kubecontrol_spec.rb
137
+ - spec/spec_helper.rb
@@ -1,44 +0,0 @@
1
- name: Ruby Gem
2
-
3
- on:
4
- pull_request:
5
- branches:
6
- - master
7
- push:
8
- branches:
9
- - master
10
-
11
- jobs:
12
- build:
13
- name: Build + Publish
14
- runs-on: ubuntu-latest
15
-
16
- steps:
17
- - uses: actions/checkout@master
18
- - name: Set up Ruby 2.6
19
- uses: actions/setup-ruby@v1
20
- with:
21
- version: 2.6.x
22
-
23
- - name: Publish to GPR
24
- run: |
25
- mkdir -p $HOME/.gem
26
- touch $HOME/.gem/credentials
27
- chmod 0600 $HOME/.gem/credentials
28
- printf -- "---\n:github: Bearer ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
29
- gem build *.gemspec
30
- gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
31
- env:
32
- GEM_HOST_API_KEY: ${{secrets.GPR_AUTH_TOKEN}}
33
- OWNER: madkin10
34
-
35
- - name: Publish to RubyGems
36
- run: |
37
- mkdir -p $HOME/.gem
38
- touch $HOME/.gem/credentials
39
- chmod 0600 $HOME/.gem/credentials
40
- printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
41
- gem build *.gemspec
42
- gem push *.gem
43
- env:
44
- GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_AUTH_TOKEN}}