kubeclient 2.5.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of kubeclient might be problematic. Click here for more details.

Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +13 -5
  3. data/.travis.yml +2 -10
  4. data/CHANGELOG.md +21 -2
  5. data/README.md +112 -46
  6. data/Rakefile +2 -5
  7. data/kubeclient.gemspec +9 -7
  8. data/lib/kubeclient.rb +8 -8
  9. data/lib/kubeclient/common.rb +88 -105
  10. data/lib/kubeclient/config.rb +10 -10
  11. data/lib/kubeclient/http_error.rb +25 -0
  12. data/lib/kubeclient/missing_kind_compatibility.rb +1 -1
  13. data/lib/kubeclient/resource.rb +11 -0
  14. data/lib/kubeclient/resource_not_found_error.rb +4 -0
  15. data/lib/kubeclient/version.rb +1 -1
  16. data/lib/kubeclient/watch_stream.rb +17 -10
  17. data/test/test_common.rb +3 -3
  18. data/test/test_component_status.rb +16 -14
  19. data/test/test_config.rb +11 -11
  20. data/test/test_endpoint.rb +16 -12
  21. data/test/test_guestbook_go.rb +64 -62
  22. data/test/test_helper.rb +2 -0
  23. data/test/test_kubeclient.rb +268 -282
  24. data/test/test_limit_range.rb +11 -11
  25. data/test/test_missing_methods.rb +3 -3
  26. data/test/test_namespace.rb +27 -27
  27. data/test/test_node.rb +17 -15
  28. data/test/test_persistent_volume.rb +16 -14
  29. data/test/test_persistent_volume_claim.rb +16 -14
  30. data/test/test_pod.rb +16 -14
  31. data/test/test_pod_log.rb +4 -4
  32. data/test/test_process_template.rb +7 -7
  33. data/test/test_replication_controller.rb +29 -4
  34. data/test/test_resource_list_without_kind.rb +7 -7
  35. data/test/test_resource_quota.rb +4 -4
  36. data/test/test_secret.rb +11 -10
  37. data/test/test_service.rb +36 -31
  38. data/test/test_service_account.rb +4 -4
  39. data/test/test_watch.rb +52 -29
  40. data/test/test_watch_notice.rb +1 -1
  41. metadata +35 -26
  42. data/Gemfile-rest-client-1.8.rb +0 -11
  43. data/lib/kubeclient/kube_exception.rb +0 -14
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  # Core api resource list without kind tests
4
4
  class TestResourceListWithoutKind < MiniTest::Test
@@ -15,19 +15,19 @@ class TestResourceListWithoutKind < MiniTest::Test
15
15
  entity: 'pod',
16
16
  type: 'Pod',
17
17
  name: 'pods',
18
- methods: %w(pod pods)
18
+ methods: %w[pod pods]
19
19
  },
20
20
  {
21
21
  entity: 'node',
22
22
  type: 'Node',
23
23
  name: 'nodes',
24
- methods: %w(node nodes)
24
+ methods: %w[node nodes]
25
25
  },
26
26
  {
27
27
  entity: 'service',
28
28
  type: 'Service',
29
29
  name: 'services',
30
- methods: %w(service services)
30
+ methods: %w[service services]
31
31
  }
32
32
  ].each { |h| assert_entities(client.instance_variable_get(:@entities)[h[:entity]], h) }
33
33
 
@@ -49,19 +49,19 @@ class TestResourceListWithoutKind < MiniTest::Test
49
49
  entity: 'template',
50
50
  type: 'Template',
51
51
  name: 'templates',
52
- methods: %w(template templates)
52
+ methods: %w[template templates]
53
53
  },
54
54
  {
55
55
  entity: 'build',
56
56
  type: 'Build',
57
57
  name: 'builds',
58
- methods: %w(build builds)
58
+ methods: %w[build builds]
59
59
  },
60
60
  {
61
61
  entity: 'project',
62
62
  type: 'Project',
63
63
  name: 'projects',
64
- methods: %w(project projects)
64
+ methods: %w[project projects]
65
65
  }
66
66
  ].each { |h| assert_entities(client.instance_variable_get(:@entities)[h[:entity]], h) }
67
67
 
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  # ResourceQuota tests
4
4
  class TestResourceQuota < MiniTest::Test
@@ -10,10 +10,10 @@ class TestResourceQuota < MiniTest::Test
10
10
  .to_return(body: open_test_file('resource_quota.json'),
11
11
  status: 200)
12
12
 
13
- client = Kubeclient::Client.new 'http://localhost:8080/api/', 'v1'
14
- quota = client.get_resource_quota 'quota', 'quota-example'
13
+ client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
14
+ quota = client.get_resource_quota('quota', 'quota-example')
15
15
 
16
- assert_instance_of(Kubeclient::ResourceQuota, quota)
16
+ assert_instance_of(Kubeclient::Resource, quota)
17
17
  assert_equal('quota', quota.metadata.name)
18
18
  assert_equal('20', quota.spec.hard.cpu)
19
19
  assert_equal('10', quota.spec.hard.secrets)
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  # Namespace entity tests
4
4
  class TestSecret < MiniTest::Test
@@ -11,10 +11,10 @@ class TestSecret < MiniTest::Test
11
11
  .to_return(body: open_test_file('created_secret.json'),
12
12
  status: 200)
13
13
 
14
- client = Kubeclient::Client.new 'http://localhost:8080/api/', 'v1'
15
- secret = client.get_secret 'test-secret', 'dev'
14
+ client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
15
+ secret = client.get_secret('test-secret', 'dev')
16
16
 
17
- assert_instance_of(Kubeclient::Secret, secret)
17
+ assert_instance_of(Kubeclient::Resource, secret)
18
18
  assert_equal('4e38a198-2bcb-11e5-a483-0e840567604d', secret.metadata.uid)
19
19
  assert_equal('test-secret', secret.metadata.name)
20
20
  assert_equal('v1', secret.apiVersion)
@@ -31,10 +31,11 @@ class TestSecret < MiniTest::Test
31
31
  status: 200)
32
32
 
33
33
  stub_request(:delete, %r{/secrets})
34
- .to_return(status: 200)
34
+ .to_return(status: 200, body: open_test_file('created_secret.json'))
35
35
 
36
- client = Kubeclient::Client.new 'http://localhost:8080/api/', 'v1'
37
- client.delete_secret 'test-secret', 'dev'
36
+ client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
37
+ secret = client.delete_secret('test-secret', 'dev')
38
+ assert_kind_of(RecursiveOpenStruct, secret)
38
39
 
39
40
  assert_requested(:delete,
40
41
  'http://localhost:8080/api/v1/namespaces/dev/secrets/test-secret',
@@ -57,9 +58,9 @@ class TestSecret < MiniTest::Test
57
58
  secret.data = {}
58
59
  secret.data['super-secret'] = 'Y2F0J3MgYXJlIGF3ZXNvbWUK'
59
60
 
60
- client = Kubeclient::Client.new 'http://localhost:8080/api/'
61
- created_secret = client.create_secret secret
62
- assert_instance_of(Kubeclient::Secret, created_secret)
61
+ client = Kubeclient::Client.new('http://localhost:8080/api/')
62
+ created_secret = client.create_secret(secret)
63
+ assert_instance_of(Kubeclient::Resource, created_secret)
63
64
  assert_equal(secret.metadata.name, created_secret.metadata.name)
64
65
  assert_equal(secret.metadata.namespace, created_secret.metadata.namespace)
65
66
  assert_equal(
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  # Service entity tests
4
4
  class TestService < MiniTest::Test
@@ -11,17 +11,18 @@ class TestService < MiniTest::Test
11
11
  our_service.metadata.labels.name = 'guestbook'
12
12
 
13
13
  our_service.spec = {}
14
- our_service.spec.ports = [{ 'port' => 3000,
15
- 'targetPort' => 'http-server',
16
- 'protocol' => 'TCP'
14
+ our_service.spec.ports = [{
15
+ 'port' => 3000,
16
+ 'targetPort' => 'http-server',
17
+ 'protocol' => 'TCP'
17
18
  }]
18
19
 
19
20
  assert_equal('guestbook', our_service.metadata.labels.name)
20
21
 
21
22
  hash = our_service.to_h
22
23
 
23
- assert_equal our_service.metadata.labels.name,
24
- hash[:metadata][:labels][:name]
24
+ assert_equal(our_service.metadata.labels.name,
25
+ hash[:metadata][:labels][:name])
25
26
 
26
27
  expected_url = 'http://localhost:8080/api/v1/namespaces/staging/services'
27
28
  stub_request(:get, %r{/api/v1$})
@@ -31,15 +32,15 @@ class TestService < MiniTest::Test
31
32
  stub_request(:post, expected_url)
32
33
  .to_return(body: open_test_file('created_service.json'), status: 201)
33
34
 
34
- client = Kubeclient::Client.new 'http://localhost:8080/api/'
35
- created = client.create_service our_service
35
+ client = Kubeclient::Client.new('http://localhost:8080/api/')
36
+ created = client.create_service(our_service)
36
37
 
37
- assert_instance_of(Kubeclient::Service, created)
38
+ assert_instance_of(Kubeclient::Resource, created)
38
39
  assert_equal(created.metadata.name, our_service.metadata.name)
39
40
  assert_equal(created.spec.ports.size, our_service.spec.ports.size)
40
41
 
41
42
  # Check that original entity_config is not modified by kind/apiVersion patches:
42
- assert_equal(our_service.kind, nil)
43
+ assert_nil(our_service.kind)
43
44
 
44
45
  assert_requested(:post, expected_url, times: 1) do |req|
45
46
  data = JSON.parse(req.body)
@@ -72,8 +73,8 @@ class TestService < MiniTest::Test
72
73
  stub_request(:post, expected_url)
73
74
  .to_return(body: open_test_file('created_service.json'), status: 201)
74
75
 
75
- client = Kubeclient::Client.new 'http://localhost:8080/api/'
76
- client.create_service service
76
+ client = Kubeclient::Client.new('http://localhost:8080/api/')
77
+ client.create_service(service)
77
78
 
78
79
  assert_requested(:post, expected_url, times: 1) do |req|
79
80
  data = JSON.parse(req.body)
@@ -107,8 +108,8 @@ class TestService < MiniTest::Test
107
108
  stub_request(:post, %r{namespaces/staging/services})
108
109
  .to_return(body: open_test_file('created_service.json'), status: 201)
109
110
 
110
- client = Kubeclient::Client.new 'http://localhost:8080/api/'
111
- client.create_service service
111
+ client = Kubeclient::Client.new('http://localhost:8080/api/')
112
+ client.create_service(service)
112
113
 
113
114
  assert_requested(:post, expected_url, times: 1) do |req|
114
115
  data = JSON.parse(req.body)
@@ -128,10 +129,10 @@ class TestService < MiniTest::Test
128
129
  .to_return(body: open_test_file('service.json'),
129
130
  status: 200)
130
131
 
131
- client = Kubeclient::Client.new 'http://localhost:8080/api/'
132
- service = client.get_service 'redis-slave', 'development'
132
+ client = Kubeclient::Client.new('http://localhost:8080/api/')
133
+ service = client.get_service('redis-slave', 'development')
133
134
 
134
- assert_instance_of(Kubeclient::Service, service)
135
+ assert_instance_of(Kubeclient::Resource, service)
135
136
  assert_equal('2015-04-05T13:00:31Z',
136
137
  service.metadata.creationTimestamp)
137
138
  assert_equal('bdb80a8f-db93-11e4-b293-f8b156af4ae1', service.metadata.uid)
@@ -163,10 +164,11 @@ class TestService < MiniTest::Test
163
164
  .to_return(body: open_test_file('core_api_resource_list.json'),
164
165
  status: 200)
165
166
  stub_request(:delete, %r{/namespaces/default/services})
166
- .to_return(status: 200)
167
+ .to_return(body: open_test_file('service.json'), status: 200)
167
168
 
168
- client = Kubeclient::Client.new 'http://localhost:8080/api/', 'v1'
169
- client.delete_service our_service.name, 'default'
169
+ client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
170
+ our_service = client.delete_service(our_service.name, 'default')
171
+ assert_kind_of(RecursiveOpenStruct, our_service)
170
172
 
171
173
  assert_requested(:delete,
172
174
  'http://localhost:8080/api/v1/namespaces/default/services/redis-service',
@@ -182,10 +184,10 @@ class TestService < MiniTest::Test
182
184
  stub_request(:get, %r{/services/redis-slave})
183
185
  .to_return(status: 404)
184
186
 
185
- client = Kubeclient::Client.new 'http://localhost:8080/api/'
187
+ client = Kubeclient::Client.new('http://localhost:8080/api/')
186
188
 
187
- exception = assert_raises(KubeException) do
188
- client.get_service 'redis-slave'
189
+ exception = assert_raises(Kubeclient::HttpError) do
190
+ client.get_service('redis-slave')
189
191
  end
190
192
  assert_equal(404, exception.error_code)
191
193
  end
@@ -198,8 +200,8 @@ class TestService < MiniTest::Test
198
200
  .to_return(body: open_test_file('service.json'),
199
201
  status: 200)
200
202
 
201
- client = Kubeclient::Client.new 'http://localhost:8080/api/'
202
- service = client.get_service 'redis-slave', 'development'
203
+ client = Kubeclient::Client.new('http://localhost:8080/api/')
204
+ service = client.get_service('redis-slave', 'development')
203
205
  assert_equal('redis-slave', service.metadata.name)
204
206
 
205
207
  assert_requested(:get,
@@ -222,8 +224,9 @@ class TestService < MiniTest::Test
222
224
  stub_request(:put, expected_url)
223
225
  .to_return(body: open_test_file('service_update.json'), status: 201)
224
226
 
225
- client = Kubeclient::Client.new 'http://localhost:8080/api/', 'v1'
226
- client.update_service service
227
+ client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
228
+ service = client.update_service(service)
229
+ assert_kind_of(RecursiveOpenStruct, service)
227
230
 
228
231
  assert_requested(:put, expected_url, times: 1) do |req|
229
232
  data = JSON.parse(req.body)
@@ -248,8 +251,9 @@ class TestService < MiniTest::Test
248
251
  stub_request(:put, expected_url)
249
252
  .to_return(body: open_test_file('service_update.json'), status: 201)
250
253
 
251
- client = Kubeclient::Client.new 'http://localhost:8080/api/', 'v1'
252
- client.update_service service
254
+ client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
255
+ service = client.update_service(service)
256
+ assert_kind_of(RecursiveOpenStruct, service)
253
257
 
254
258
  assert_requested(:put, expected_url, times: 1) do |req|
255
259
  data = JSON.parse(req.body)
@@ -281,8 +285,9 @@ class TestService < MiniTest::Test
281
285
  }
282
286
  }
283
287
 
284
- client = Kubeclient::Client.new 'http://localhost:8080/api/', 'v1'
285
- client.patch_service name, patch, 'development'
288
+ client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
289
+ service = client.patch_service(name, patch, 'development')
290
+ assert_kind_of(RecursiveOpenStruct, service)
286
291
 
287
292
  assert_requested(:patch, expected_url, times: 1) do |req|
288
293
  data = JSON.parse(req.body)
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  # ServiceAccount tests
4
4
  class TestServiceAccount < MiniTest::Test
@@ -10,10 +10,10 @@ class TestServiceAccount < MiniTest::Test
10
10
  .to_return(body: open_test_file('core_api_resource_list.json'),
11
11
  status: 200)
12
12
 
13
- client = Kubeclient::Client.new 'http://localhost:8080/api/', 'v1'
14
- account = client.get_service_account 'default'
13
+ client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
14
+ account = client.get_service_account('default')
15
15
 
16
- assert_instance_of(Kubeclient::ServiceAccount, account)
16
+ assert_instance_of(Kubeclient::Resource, account)
17
17
  assert_equal('default', account.metadata.name)
18
18
  assert_equal('default-token-6s23q', account.secrets[0].name)
19
19
  assert_equal('default-dockercfg-62tf3', account.secrets[1].name)
@@ -1,23 +1,21 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  # Watch entity tests
4
4
  class TestWatch < MiniTest::Test
5
5
  def test_watch_pod_success
6
+ stub_resource_list
7
+
6
8
  expected = [
7
9
  { 'type' => 'ADDED', 'resourceVersion' => '1389' },
8
10
  { 'type' => 'MODIFIED', 'resourceVersion' => '1390' },
9
11
  { 'type' => 'DELETED', 'resourceVersion' => '1398' }
10
12
  ]
11
13
 
12
- stub_request(:get, %r{/api/v1$})
13
- .to_return(body: open_test_file('core_api_resource_list.json'),
14
- status: 200)
15
-
16
- stub_request(:get, %r{.*\/watch/pods})
14
+ stub_request(:get, %r{/watch/pods})
17
15
  .to_return(body: open_test_file('watch_stream.json'),
18
16
  status: 200)
19
17
 
20
- client = Kubeclient::Client.new 'http://localhost:8080/api/', 'v1'
18
+ client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
21
19
 
22
20
  client.watch_pods.to_enum.with_index do |notice, index|
23
21
  assert_instance_of(Kubeclient::Common::WatchNotice, notice)
@@ -29,14 +27,27 @@ class TestWatch < MiniTest::Test
29
27
  end
30
28
  end
31
29
 
30
+ def test_watch_pod_raw
31
+ stub_resource_list
32
+
33
+ stub_request(:get, %r{/watch/pods}).to_return(
34
+ body: open_test_file('watch_stream.json'),
35
+ status: 200
36
+ )
37
+
38
+ client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
39
+
40
+ got = nil
41
+ client.watch_pods(as: :raw).each { |notice| got = notice }
42
+ assert_match(/\A{"type":"DELETED"/, got)
43
+ end
44
+
32
45
  def test_watch_pod_failure
33
- stub_request(:get, %r{/api/v1$})
34
- .to_return(body: open_test_file('core_api_resource_list.json'),
35
- status: 200)
36
- stub_request(:get, %r{.*\/watch/pods}).to_return(status: 404)
46
+ stub_resource_list
47
+ stub_request(:get, %r{/watch/pods}).to_return(status: 404)
37
48
 
38
- client = Kubeclient::Client.new 'http://localhost:8080/api/', 'v1'
39
- assert_raises KubeException do
49
+ client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
50
+ assert_raises(Kubeclient::HttpError) do
40
51
  client.watch_pods.each do
41
52
  end
42
53
  end
@@ -51,24 +62,33 @@ class TestWatch < MiniTest::Test
51
62
  .to_return(body: open_test_file('pod_log.txt'),
52
63
  status: 200)
53
64
 
54
- stream = Kubeclient::Common::WatchStream.new(URI.parse(url), {}, format: :txt)
65
+ stream = Kubeclient::Common::WatchStream.new(URI.parse(url), {}, as: :raw)
55
66
  stream.to_enum.with_index do |line, index|
56
67
  assert_instance_of(String, line)
57
68
  assert_equal(expected_lines[index], line)
58
69
  end
59
70
  end
60
71
 
72
+ # Ensure that WatchStream respects a format that's not JSON
73
+ def test_watch_stream_unknown
74
+ url = 'http://www.example.com/foobar'
75
+ stub_request(:get, url)
76
+ .to_return(body: open_test_file('pod_log.txt'),
77
+ status: 200)
78
+
79
+ stream = Kubeclient::Common::WatchStream.new(URI.parse(url), {}, as: :foo)
80
+ assert_raises(NotImplementedError) { stream.each {} }
81
+ end
82
+
61
83
  def test_watch_with_resource_version
62
84
  api_host = 'http://localhost:8080/api'
63
85
  version = '1995'
64
- stub_request(:get, %r{/api/v1$})
65
- .to_return(body: open_test_file('core_api_resource_list.json'),
66
- status: 200)
86
+ stub_resource_list
67
87
  stub_request(:get, %r{.*\/watch/events})
68
88
  .to_return(body: open_test_file('watch_stream.json'),
69
89
  status: 200)
70
90
 
71
- client = Kubeclient::Client.new api_host, 'v1'
91
+ client = Kubeclient::Client.new(api_host, 'v1')
72
92
  results = client.watch_events(version).to_enum
73
93
 
74
94
  assert_equal(3, results.count)
@@ -81,14 +101,12 @@ class TestWatch < MiniTest::Test
81
101
  api_host = 'http://localhost:8080/api'
82
102
  selector = 'name=redis-master'
83
103
 
84
- stub_request(:get, %r{/api/v1$})
85
- .to_return(body: open_test_file('core_api_resource_list.json'),
86
- status: 200)
104
+ stub_resource_list
87
105
  stub_request(:get, %r{.*\/watch/events})
88
106
  .to_return(body: open_test_file('watch_stream.json'),
89
107
  status: 200)
90
108
 
91
- client = Kubeclient::Client.new api_host, 'v1'
109
+ client = Kubeclient::Client.new(api_host, 'v1')
92
110
  results = client.watch_events(label_selector: selector).to_enum
93
111
 
94
112
  assert_equal(3, results.count)
@@ -101,14 +119,12 @@ class TestWatch < MiniTest::Test
101
119
  api_host = 'http://localhost:8080/api'
102
120
  selector = 'involvedObject.kind=Pod'
103
121
 
104
- stub_request(:get, %r{/api/v1$})
105
- .to_return(body: open_test_file('core_api_resource_list.json'),
106
- status: 200)
122
+ stub_resource_list
107
123
  stub_request(:get, %r{.*\/watch/events})
108
124
  .to_return(body: open_test_file('watch_stream.json'),
109
125
  status: 200)
110
126
 
111
- client = Kubeclient::Client.new api_host, 'v1'
127
+ client = Kubeclient::Client.new(api_host, 'v1')
112
128
  results = client.watch_events(field_selector: selector).to_enum
113
129
 
114
130
  assert_equal(3, results.count)
@@ -120,9 +136,7 @@ class TestWatch < MiniTest::Test
120
136
  def test_watch_with_finish_and_ebadf
121
137
  api_host = 'http://localhost:8080/api'
122
138
 
123
- stub_request(:get, %r{/api/v1$})
124
- .to_return(body: open_test_file('core_api_resource_list.json'),
125
- status: 200)
139
+ stub_resource_list
126
140
  stub_request(:get, %r{.*\/watch/events})
127
141
  .to_return(body: open_test_file('watch_stream.json'), status: 200)
128
142
 
@@ -137,4 +151,13 @@ class TestWatch < MiniTest::Test
137
151
 
138
152
  assert_requested(:get, "#{api_host}/v1/watch/events", times: 1)
139
153
  end
154
+
155
+ private
156
+
157
+ def stub_resource_list
158
+ stub_request(:get, %r{/api/v1$}).to_return(
159
+ body: open_test_file('core_api_resource_list.json'),
160
+ status: 200
161
+ )
162
+ end
140
163
  end