kubeclient 1.1.3 → 1.1.4

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.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9a71f479760bd69996f7b109ee46d8968ed790fa
4
- data.tar.gz: 600d882545ff5af34501b0c66913cf2f31905d0b
3
+ metadata.gz: 6f768aad498e66fa0f505eeb189e8b16ba540d18
4
+ data.tar.gz: cb9117eec7974802515d05073815eb3615c02753
5
5
  SHA512:
6
- metadata.gz: 41a44396960513d8841627506c9fdc9a607bac842d0662f52023a504cba5f06d64783dfc9ef78dd38fb31ecfc78ae37a96708de083253f511898ba96d1f8a47d
7
- data.tar.gz: cd1cc5c1a512c4f3bf2a1edc52c9f97a54ab562e24522b8702c33628341ce3a649a585b9b2fa955b773a4d48549851e0b05856064ff37c7e5e9ee0dbb553c035
6
+ metadata.gz: dfb530cff6a49e8a3b1100da06a520bec3341b862f79829b19de34819c4ccabb8cbe6b228619c2c8728d1885a796777df5d591d87b2991b4652797db503080c8
7
+ data.tar.gz: 3241b347cceeed5453a980fb412a39b9455255e1c73a016277adf67a4f1aeaa1ed690b1d7507edaf2fb5d6167590bd79732eaf69ea853dd3a74e6b52e6fe94a4
@@ -8,3 +8,5 @@ Metrics/LineLength:
8
8
  Max: 100
9
9
  Metrics/ParameterLists:
10
10
  Max: 8
11
+ Metrics/CyclomaticComplexity:
12
+ Max: 8
@@ -6,3 +6,7 @@ rvm:
6
6
  - "2.3.0"
7
7
  sudo: false
8
8
  cache: bundler
9
+ script: bundle exec rake $TASK
10
+ env:
11
+ - TASK=test
12
+ - TASK=rubocop
data/Rakefile CHANGED
@@ -1,8 +1,9 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rake/testtask'
3
3
  require 'rubocop/rake_task'
4
+ require 'yaml'
4
5
 
5
- task default: [:test, :rubocop]
6
+ task default: [:test, :rubocop] # same as .travis.yml
6
7
 
7
8
  Rake::TestTask.new do |t|
8
9
  t.libs << 'test'
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency 'bundler', '~> 1.6'
23
23
  spec.add_development_dependency 'rake', '~> 10.0'
24
24
  spec.add_development_dependency 'minitest'
25
- spec.add_development_dependency 'webmock'
25
+ spec.add_development_dependency 'webmock', '~> 1.24.2'
26
26
  spec.add_development_dependency 'vcr'
27
27
  spec.add_development_dependency 'rubocop', '= 0.30.0'
28
28
  spec.add_dependency 'rest-client'
@@ -7,6 +7,7 @@ require 'kubeclient/kube_exception'
7
7
  require 'kubeclient/watch_notice'
8
8
  require 'kubeclient/watch_stream'
9
9
  require 'kubeclient/common'
10
+ require 'kubeclient/config'
10
11
 
11
12
  module Kubeclient
12
13
  # Kubernetes Client
@@ -31,28 +32,17 @@ module Kubeclient
31
32
 
32
33
  ClientMixin.define_entity_methods(ENTITY_TYPES)
33
34
 
34
- def initialize(uri,
35
- version = 'v1',
36
- ssl_options: {
37
- client_cert: nil,
38
- client_key: nil,
39
- ca_file: nil,
40
- cert_store: nil,
41
- verify_ssl: OpenSSL::SSL::VERIFY_PEER
42
- },
43
- auth_options: {
44
- username: nil,
45
- password: nil,
46
- bearer_token: nil,
47
- bearer_token_file: nil
48
- },
49
- socket_options: {
50
- socket_class: nil,
51
- ssl_socket_class: nil
52
- }
53
- )
54
- initialize_client(uri, '/api', version, ssl_options: ssl_options, auth_options: auth_options,
55
- socket_options: socket_options)
35
+ def initialize(
36
+ uri,
37
+ version = 'v1',
38
+ **options
39
+ )
40
+ initialize_client(
41
+ uri,
42
+ '/api',
43
+ version,
44
+ options
45
+ )
56
46
  end
57
47
 
58
48
  def all_entities
@@ -2,7 +2,28 @@ require 'json'
2
2
  require 'rest-client'
3
3
  module Kubeclient
4
4
  # Common methods
5
+ # this is mixed in by other gems
5
6
  module ClientMixin
7
+ DEFAULT_SSL_OPTIONS = {
8
+ client_cert: nil,
9
+ client_key: nil,
10
+ ca_file: nil,
11
+ cert_store: nil,
12
+ verify_ssl: OpenSSL::SSL::VERIFY_PEER
13
+ }.freeze
14
+
15
+ DEFAULT_AUTH_OPTIONS = {
16
+ username: nil,
17
+ password: nil,
18
+ bearer_token: nil,
19
+ bearer_token_file: nil
20
+ }.freeze
21
+
22
+ DEFAULT_SOCKET_OPTIONS = {
23
+ socket_class: nil,
24
+ ssl_socket_class: nil
25
+ }.freeze
26
+
6
27
  attr_reader :api_endpoint
7
28
  attr_reader :ssl_options
8
29
  attr_reader :auth_options
@@ -11,24 +32,10 @@ module Kubeclient
11
32
  def initialize_client(
12
33
  uri,
13
34
  path,
14
- version = nil,
15
- ssl_options: {
16
- client_cert: nil,
17
- client_key: nil,
18
- ca_file: nil,
19
- cert_store: nil,
20
- verify_ssl: OpenSSL::SSL::VERIFY_PEER
21
- },
22
- auth_options: {
23
- username: nil,
24
- password: nil,
25
- bearer_token: nil,
26
- bearer_token_file: nil
27
- },
28
- socket_options: {
29
- socket_class: nil,
30
- ssl_socket_class: nil
31
- }
35
+ version,
36
+ ssl_options: DEFAULT_SSL_OPTIONS,
37
+ auth_options: DEFAULT_AUTH_OPTIONS,
38
+ socket_options: DEFAULT_SOCKET_OPTIONS
32
39
  )
33
40
  validate_auth_options(auth_options)
34
41
  handle_uri(uri, path)
@@ -50,21 +57,20 @@ module Kubeclient
50
57
  def handle_exception
51
58
  yield
52
59
  rescue RestClient::Exception => e
53
- begin
54
- json_error_msg = JSON.parse(e.response || '') || {}
60
+ json_error_msg = begin
61
+ JSON.parse(e.response || '') || {}
55
62
  rescue JSON::ParserError
56
- json_error_msg = {}
63
+ {}
57
64
  end
58
65
  err_message = json_error_msg['message'] || e.message
59
66
  raise KubeException.new(e.http_code, err_message, e.response)
60
67
  end
61
68
 
62
69
  def handle_uri(uri, path)
63
- fail ArgumentError, 'Missing uri' if uri.nil?
64
- @api_endpoint = (uri.is_a? URI) ? uri : URI.parse(uri)
70
+ fail ArgumentError, 'Missing uri' unless uri
71
+ @api_endpoint = (uri.is_a?(URI) ? uri : URI.parse(uri))
65
72
  @api_endpoint.path = path if @api_endpoint.path.empty?
66
- @api_endpoint.path = @api_endpoint.path.chop \
67
- if @api_endpoint.path.end_with? '/'
73
+ @api_endpoint.path = @api_endpoint.path.chop if @api_endpoint.path.end_with? '/'
68
74
  end
69
75
 
70
76
  def build_namespace_prefix(namespace)
@@ -84,8 +90,7 @@ module Kubeclient
84
90
  end
85
91
 
86
92
  # watch all entities of a type e.g. watch_nodes, watch_pods, etc.
87
- define_method("watch_#{entity_name_plural}") \
88
- do |options = {}|
93
+ define_method("watch_#{entity_name_plural}") do |options = {}|
89
94
  # This method used to take resource_version as a param, so
90
95
  # this conversion is to keep backwards compatibility
91
96
  options = { resource_version: options } unless options.is_a?(Hash)
@@ -0,0 +1,111 @@
1
+ require 'yaml'
2
+ require 'base64'
3
+
4
+ module Kubeclient
5
+ # Kubernetes client configuration class
6
+ class Config
7
+ # Kubernetes client configuration context class
8
+ class Context
9
+ attr_reader :api_endpoint, :api_version, :ssl_options
10
+
11
+ def initialize(api_endpoint, api_version, ssl_options)
12
+ @api_endpoint = api_endpoint
13
+ @api_version = api_version
14
+ @ssl_options = ssl_options
15
+ end
16
+ end
17
+
18
+ def initialize(kcfg, kcfg_path)
19
+ @kcfg = kcfg
20
+ @kcfg_path = kcfg_path
21
+ fail 'Unknown kubeconfig version' if @kcfg['apiVersion'] != 'v1'
22
+ end
23
+
24
+ def self.read(filename)
25
+ Config.new(YAML.load_file(filename), File.dirname(filename))
26
+ end
27
+
28
+ def contexts
29
+ @kcfg['contexts'].map { |x| x['name'] }
30
+ end
31
+
32
+ def context(context_name = nil)
33
+ cluster, user = fetch_context(context_name || @kcfg['current-context'])
34
+
35
+ ca_cert_data = fetch_cluster_ca_data(cluster)
36
+ client_cert_data = fetch_user_cert_data(user)
37
+ client_key_data = fetch_user_key_data(user)
38
+
39
+ ssl_options = {}
40
+
41
+ if !ca_cert_data.nil?
42
+ cert_store = OpenSSL::X509::Store.new
43
+ cert_store.add_cert(OpenSSL::X509::Certificate.new(ca_cert_data))
44
+ ssl_options[:verify_ssl] = OpenSSL::SSL::VERIFY_PEER
45
+ ssl_options[:cert_store] = cert_store
46
+ else
47
+ ssl_options[:verify_ssl] = OpenSSL::SSL::VERIFY_NONE
48
+ end
49
+
50
+ unless client_cert_data.nil?
51
+ ssl_options[:client_cert] = OpenSSL::X509::Certificate.new(client_cert_data)
52
+ end
53
+
54
+ unless client_key_data.nil?
55
+ ssl_options[:client_key] = OpenSSL::PKey.read(client_key_data)
56
+ end
57
+
58
+ Context.new(cluster['server'], @kcfg['apiVersion'], ssl_options)
59
+ end
60
+
61
+ private
62
+
63
+ def ext_file_path(path)
64
+ File.join(@kcfg_path, path)
65
+ end
66
+
67
+ def fetch_context(context_name)
68
+ context = @kcfg['contexts'].detect do |x|
69
+ break x['context'] if x['name'] == context_name
70
+ end
71
+
72
+ fail "Unknown context #{context_name}" unless context
73
+
74
+ cluster = @kcfg['clusters'].detect do |x|
75
+ break x['cluster'] if x['name'] == context['cluster']
76
+ end
77
+
78
+ fail "Unknown cluster #{context['cluster']}" unless cluster
79
+
80
+ user = @kcfg['users'].detect do |x|
81
+ break x['user'] if x['name'] == context['user']
82
+ end || {}
83
+
84
+ [cluster, user]
85
+ end
86
+
87
+ def fetch_cluster_ca_data(cluster)
88
+ if cluster.key?('certificate-authority')
89
+ return File.read(ext_file_path(cluster['certificate-authority']))
90
+ elsif cluster.key?('certificate-authority-data')
91
+ return Base64.decode64(cluster['certificate-authority-data'])
92
+ end
93
+ end
94
+
95
+ def fetch_user_cert_data(user)
96
+ if user.key?('client-certificate')
97
+ return File.read(ext_file_path(user['client-certificate']))
98
+ elsif user.key?('client-certificate-data')
99
+ return Base64.decode64(user['client-certificate-data'])
100
+ end
101
+ end
102
+
103
+ def fetch_user_key_data(user)
104
+ if user.key?('client-key')
105
+ return File.read(ext_file_path(user['client-key']))
106
+ elsif user.key?('client-key-data')
107
+ return Base64.decode64(user['client-key-data'])
108
+ end
109
+ end
110
+ end
111
+ end
@@ -1,4 +1,4 @@
1
1
  # Kubernetes REST-API Client
2
2
  module Kubeclient
3
- VERSION = '1.1.3'
3
+ VERSION = '1.1.4'
4
4
  end
@@ -0,0 +1,20 @@
1
+ apiVersion: v1
2
+ clusters:
3
+ - cluster:
4
+ certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1akNDQWRDZ0F3SUJBZ0lCQVRBTEJna3Foa2lHOXcwQkFRc3dKakVrTUNJR0ExVUVBd3diYjNCbGJuTm8KYVdaMExYTnBaMjVsY2tBeE5EUTBNVEk0T0Rnd01CNFhEVEUxTVRBd05qRXdOVFEwTUZvWERURTJNVEF3TlRFdwpOVFEwTVZvd0pqRWtNQ0lHQTFVRUF3d2JiM0JsYm5Ob2FXWjBMWE5wWjI1bGNrQXhORFEwTVRJNE9EZ3dNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyNmdtOUhBV2UxbGswSlBJUE9vSXl2azkKWXJwN0dMa0ljQ1B4ME1CTEd0cmpVK2wyNzl6RER2NlBWMmIwS1UxTEZDM0l4UGtaTXJMQkVaNTR3MllrV3ZlUApreUhZczByMEdOd0hldk9XR2R0c2d0VXkveHAvTlVHUlZrclVPUGtrNGZMclAzcm5DQmVuVzdTYWlxRCtxNUpJCjhxTytXSVZtaDZGRjF1R0tWWjZmaS8rRjZwN1AreXhCUForV0kyTWt0UXE2akZrQlgxbjFnYlIzRGpRdng3SjEKdjNvWi9PTkNkQ2FXZXNuUm1ON0MyUDRVMVdPNXk0dkwzNFFPcXYyai9jaXpmRWdFcERsNXcrdXk1WDQ3aEsvSwpubEh0UHdrSFpMRWtva3VETnBjVGZ4Nk5Od09UVEZIdmdUeDUvYlFvVUZrbkVad2oyRW9lTW8wd05Pb0VId0lECkFRQUJveU13SVRBT0JnTlZIUThCQWY4RUJBTUNBS1F3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFMQmdrcWhraUcKOXcwQkFRc0RnZ0VCQUVQUUFDa09LUkhVem85SXBMNWQxK05wRjVHWFJEb3BCSkllRkJuZ01tZ1g3cUtqRzJNcwpHWGx3bXgvL2hZQll4MHc2R2FBNFc0VzM4cEYwR24yaFNXTVE2cTZsRXpoQU1ROWFYb2xRcXBTLytzMmFGK2J2CmxoWStoUXk2dmRTTUExK3ZPVzBLTDBRaGxjdCszY3UwN1pTajFXNG9obmJpUklXYzJJdCsxSWVMbnZBY210eCsKTURnSTlzV2ZmeW5VVkN0RkVsdEkrTVM2VjhuRlAxVTB6Z243V3ZSc1JQK0YyYXZkejRmYWR4RVBTTTl4WGtUVQpDL2M5L0JvKzlmT0dMakhnbFMwY1ZiNWI3d3k5ZHhwc0p2Wll3SjFwZk5Uci9COVZpL09kQzN0UFBhd0habVVCCnVkSTVXUWljelVQSjhDU1NSMDJuaDJMUUMvRzVCS2FxSk9ZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
5
+ server: https://localhost:8443
6
+ name: localhost:8443
7
+ contexts:
8
+ - context:
9
+ cluster: localhost:8443
10
+ namespace: default
11
+ user: system:admin/localhost:8443
12
+ name: default/localhost:8443/system:admin
13
+ current-context: default/localhost:8443/system:admin
14
+ kind: Config
15
+ preferences: {}
16
+ users:
17
+ - name: system:admin/localhost:8443
18
+ user:
19
+ client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURDVENDQWZPZ0F3SUJBZ0lCQlRBTEJna3Foa2lHOXcwQkFRc3dKakVrTUNJR0ExVUVBd3diYjNCbGJuTm8KYVdaMExYTnBaMjVsY2tBeE5EUTBNVEk0T0Rnd01CNFhEVEUxTVRBd05qRXdOVFEwTWxvWERURTJNVEF3TlRFdwpOVFEwTTFvd056RWVNQndHQTFVRUNoTVZjM2x6ZEdWdE9tTnNkWE4wWlhJdFlXUnRhVzV6TVJVd0V3WURWUVFECkV3eHplWE4wWlcwNllXUnRhVzR3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFYKSjNJUkJTdTQ4TVppOFBaVlJFSno1NWN2d3hsclhyZUxSZnQ0cW1FdVQwbzE5WUlOR3lMMWVXc0VpanBML1ZVWAo0clA4Q280MXFHbDVBbS94WDZHMWNKTE45Z1plY3l5SHJUTTdjSXNsTjRydy9UUkg2SXF2ZWluUHNrcHl3UTRDClU1UHlQSTh0QU9aa3I2VU14K1cwckJWZXNUM1NKZjF0UVY0Ynh4cXlHeXA2dGM5SElGZ1hGQzdUQnovcDBGU2MKdXdiaFpMTmkrbHcxcC9QWGxCK3BJY0hNMnN5RldHYnVFemk2aE1TWHNKN3l2dEtpZW9KdWtmV05ZOE9QcURNRgpWVmNnUHJJaTErM0Z4ZWFEY1pYMUZ1TEw5ZVVOQ2o3NlR6dDVJcUJzaHVVdy8ra0I1cWxtemgyaDdrbmMxbkRsCmNaRkxxdlE1MFV0cVJqazdFQ3UvQWdNQkFBR2pOVEF6TUE0R0ExVWREd0VCL3dRRUF3SUFvREFUQmdOVkhTVUUKRERBS0JnZ3JCZ0VGQlFjREFqQU1CZ05WSFJNQkFmOEVBakFBTUFzR0NTcUdTSWIzRFFFQkN3T0NBUUVBaThLRgpiYzVwcVg1U2tlbytqaExESzRwdHB3VCtNMDFuRGdyc3FDMTEzbFNZclNvKytGbnptZ2hTRVBoSmg1TzhIYjNYCkZkN0NybWc1V3BQVldCaGt0NHBpenRWN2VpRTdES050NUxMTjNrcm1sWHlBUUppYkkxVSthOUJuelJCWnQzOXMKeHVUOE9XOTBNdS9oVkFRN1NkTzlTNzYvbm1xamZWQTNwNHFENTVXVDRQZ0N0Q1hzc042ZEYwdE9WV0NUZW9aUwpxRVBHODY1Wmw3ODlMTWZZVVlSbmhCa0xnVkVkU1U4Z2N6NU1JNUpSejd6cll4ekc2REMreXZYdnJrUFJLRE5PCm42VUFDbTI2UVFwcHZrUzVRczkwR2lER3FTdHhtY2JEd1Y1Z0lmMStQcmtwaXRlMzNmN0hud2JhQy9vRGN1d3MKRDRPRlhNZkE1c1FEMVpJTUZRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
20
+ client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBMVNkeUVRVXJ1UERHWXZEMlZVUkNjK2VYTDhNWmExNjNpMFg3ZUtwaExrOUtOZldDCkRSc2k5WGxyQklvNlMvMVZGK0t6L0FxT05haHBlUUp2OFYraHRYQ1N6ZllHWG5Nc2g2MHpPM0NMSlRlSzhQMDAKUitpS3Izb3B6N0pLY3NFT0FsT1Q4anlQTFFEbVpLK2xETWZsdEt3VlhyRTkwaVg5YlVGZUc4Y2FzaHNxZXJYUApSeUJZRnhRdTB3Yy82ZEJVbkxzRzRXU3pZdnBjTmFmejE1UWZxU0hCek5yTWhWaG03aE00dW9URWw3Q2U4cjdTCm9ucUNicEgxaldQRGo2Z3pCVlZYSUQ2eUl0ZnR4Y1htZzNHVjlSYml5L1hsRFFvKytrODdlU0tnYklibE1QL3AKQWVhcFpzNGRvZTVKM05adzVYR1JTNnIwT2RGTGFrWTVPeEFydndJREFRQUJBb0lCQVFDcWozTEZ6Y1pycVRhRgp5MXpCWStwc3hsOEMxL0hLS2JOaTNXL1k0VFQ4RW5SR2N4cEtsSEZIelkxbHg1bllYbkV0dUxqZXNDK1ZIaHF2CnV0U0taMFNGWS93RWxKNEtDODBSRC9XVDFYMXlIVnl2YzF6WFFXdGYrTGZtT3pzNVVlTjgxeFhtV3JFU2lNclMKdkgyc21YUGtPMktxTDlkUkJoY2d5cEtjVlppMTlITHR2ZG83TUg4V3g0Ukw5dnVnY0VVU2laYTFTQjdyMVp2dApTOXFqSHZUMEhSOThDUGh2b0h2Q29mdndGVDhZQTBzdHBYczFqSWZBZmFFSC9aLzhGNkhZUnJid1dNMFAxRXE1Cmw1WmROK04vQnNXaGQvbW5ZVHZUcWNDWnJIaFVFaCtyUDcyR2tlY1hwR0svR3diRXRFOWNYK0ZYMVkwRkJxWW0KcUM4NnRtcEJBb0dCQU9NRGdwdkhYZkhRb3RqU0tMMVlNOUVQZnhEeG9mY3JSekJEd0NNRFZPZTh5aDIxT0kxdgozdUVZc1BRTkZ1eXVxOWxuYmJkQWdwNHRPZm9OTVBucnRIUXdmelpRQmpYby9Gc2U1Q3l5MVdDZWg4a3IyWWxRCmQwNWNmWUFMeDlZRGFoK0dkd00xZWplQ1JRQndUQ0RrZzY2bENkQTFScll6bWF6by9TVWRKRnZoQW9HQkFQQmUKNW13YlZiam1yUWlhSU1maHRKODZFNWFJMnhSRGdzNGYzTm9RdWw5K1paaERaQkl5NXQ3Vjc4NElhYkZ2dklNYwpHV2hobC8xWGtxNmFBUzRnVWRET1lWQkEwVnBiMWx0RkUybG81SklpWXg5c2R1MXdNMkZNL0ZMUGpkcGR2R0o3CnVpeWxFTUVHNC9oTHQ2UFpGd1Y2aTMxUHlUU3hUVmQ5WWlSRUZudWZBb0dBZllTWFZxS3BJdWNFNDNWdjZTRTMKcFVRNE1ab292NDFDVTBGaW52bGNuTFVaMjhzemRhQ0JUMXhqbXMwUis5T29XUkNDN1d2UnpMdWM3dEVVWDFzZgo3NDVSQ0NxL0JGZktFR2ZJS1o3SHRDQnpXNXZQTDhrNTdpM2Roa3I5Tnl1MEpiSW5ZN0xSM0pjK3A3dHZuRkE5Ckx2YzVzZEdEUTRMTVdYcUpYVmY3bm9FQ2dZRUE0WjZDTkZrWUJsMW5iMXFVaUdtZ0M1RU16OUNYcXBhUDBnQncKWWJNdjdQQ01WZlp6bU8xMGJSZHNadnpZa0hjci8vakJGSXYraVFySklPQm5XUzkyL0VLcmJ4UFlMak5qcWZuVgpkYXpDVnpTMXk4b1llMWhFc2dEOEdwSzlPSW1oaU9OUDVoWHQrdkVIeklqdHozcTJ0Q3JKZ1k4QmNsYzJISGdSClJhOHZWMHNDZ1lBOHlPdmlWZUUxT2lJVklkT1NxbjFsOXVtUDBFZXhHazVhUGlXZlVMc2ZWcTNveWNJd3AzdkcKWHdNOEFmRlFPZGxyR3dkeVdqQ1hDdzNKRmMwdHBPa3h6dzM2aUw5ekdoZ2JndjMyZ2ptR2djYllWV0w1bm04Rgp0eGlBOEZMSCs4eXI2b2hhalRZL293WUlaWFN6S3ptcDh1QnhuRzdpU2J0MzNBc0UzTGJjMnc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
@@ -0,0 +1,18 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIC5jCCAdCgAwIBAgIBATALBgkqhkiG9w0BAQswJjEkMCIGA1UEAwwbb3BlbnNo
3
+ aWZ0LXNpZ25lckAxNDQ0MTI4ODgwMB4XDTE1MTAwNjEwNTQ0MFoXDTE2MTAwNTEw
4
+ NTQ0MVowJjEkMCIGA1UEAwwbb3BlbnNoaWZ0LXNpZ25lckAxNDQ0MTI4ODgwMIIB
5
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr6gm9HAWe1lk0JPIPOoIyvk9
6
+ Yrp7GLkIcCPx0MBLGtrjU+l279zDDv6PV2b0KU1LFC3IxPkZMrLBEZ54w2YkWveP
7
+ kyHYs0r0GNwHevOWGdtsgtUy/xp/NUGRVkrUOPkk4fLrP3rnCBenW7SaiqD+q5JI
8
+ 8qO+WIVmh6FF1uGKVZ6fi/+F6p7P+yxBPZ+WI2MktQq6jFkBX1n1gbR3DjQvx7J1
9
+ v3oZ/ONCdCaWesnRmN7C2P4U1WO5y4vL34QOqv2j/cizfEgEpDl5w+uy5X47hK/K
10
+ nlHtPwkHZLEkokuDNpcTfx6NNwOTTFHvgTx5/bQoUFknEZwj2EoeMo0wNOoEHwID
11
+ AQABoyMwITAOBgNVHQ8BAf8EBAMCAKQwDwYDVR0TAQH/BAUwAwEB/zALBgkqhkiG
12
+ 9w0BAQsDggEBAEPQACkOKRHUzo9IpL5d1+NpF5GXRDopBJIeFBngMmgX7qKjG2Ms
13
+ GXlwmx//hYBYx0w6GaA4W4W38pF0Gn2hSWMQ6q6lEzhAMQ9aXolQqpS/+s2aF+bv
14
+ lhY+hQy6vdSMA1+vOW0KL0Qhlct+3cu07ZSj1W4ohnbiRIWc2It+1IeLnvAcmtx+
15
+ MDgI9sWffynUVCtFEltI+MS6V8nFP1U0zgn7WvRsRP+F2avdz4fadxEPSM9xXkTU
16
+ C/c9/Bo+9fOGLjHglS0cVb5b7wy9dxpsJvZYwJ1pfNTr/B9Vi/OdC3tPPawHZmUB
17
+ udI5WQiczUPJ8CSSR02nh2LQC/G5BKaqJOY=
18
+ -----END CERTIFICATE-----
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDCTCCAfOgAwIBAgIBBTALBgkqhkiG9w0BAQswJjEkMCIGA1UEAwwbb3BlbnNo
3
+ aWZ0LXNpZ25lckAxNDQ0MTI4ODgwMB4XDTE1MTAwNjEwNTQ0MloXDTE2MTAwNTEw
4
+ NTQ0M1owNzEeMBwGA1UEChMVc3lzdGVtOmNsdXN0ZXItYWRtaW5zMRUwEwYDVQQD
5
+ EwxzeXN0ZW06YWRtaW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDV
6
+ J3IRBSu48MZi8PZVREJz55cvwxlrXreLRft4qmEuT0o19YINGyL1eWsEijpL/VUX
7
+ 4rP8Co41qGl5Am/xX6G1cJLN9gZecyyHrTM7cIslN4rw/TRH6IqveinPskpywQ4C
8
+ U5PyPI8tAOZkr6UMx+W0rBVesT3SJf1tQV4bxxqyGyp6tc9HIFgXFC7TBz/p0FSc
9
+ uwbhZLNi+lw1p/PXlB+pIcHM2syFWGbuEzi6hMSXsJ7yvtKieoJukfWNY8OPqDMF
10
+ VVcgPrIi1+3FxeaDcZX1FuLL9eUNCj76Tzt5IqBshuUw/+kB5qlmzh2h7knc1nDl
11
+ cZFLqvQ50UtqRjk7ECu/AgMBAAGjNTAzMA4GA1UdDwEB/wQEAwIAoDATBgNVHSUE
12
+ DDAKBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMAsGCSqGSIb3DQEBCwOCAQEAi8KF
13
+ bc5pqX5Skeo+jhLDK4ptpwT+M01nDgrsqC113lSYrSo++FnzmghSEPhJh5O8Hb3X
14
+ Fd7Crmg5WpPVWBhkt4piztV7eiE7DKNt5LLN3krmlXyAQJibI1U+a9BnzRBZt39s
15
+ xuT8OW90Mu/hVAQ7SdO9S76/nmqjfVA3p4qD55WT4PgCtCXssN6dF0tOVWCTeoZS
16
+ qEPG865Zl789LMfYUYRnhBkLgVEdSU8gcz5MI5JRz7zrYxzG6DC+yvXvrkPRKDNO
17
+ n6UACm26QQppvkS5Qs90GiDGqStxmcbDwV5gIf1+Prkpite33f7HnwbaC/oDcuws
18
+ D4OFXMfA5sQD1ZIMFQ==
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpAIBAAKCAQEA1SdyEQUruPDGYvD2VURCc+eXL8MZa163i0X7eKphLk9KNfWC
3
+ DRsi9XlrBIo6S/1VF+Kz/AqONahpeQJv8V+htXCSzfYGXnMsh60zO3CLJTeK8P00
4
+ R+iKr3opz7JKcsEOAlOT8jyPLQDmZK+lDMfltKwVXrE90iX9bUFeG8cashsqerXP
5
+ RyBYFxQu0wc/6dBUnLsG4WSzYvpcNafz15QfqSHBzNrMhVhm7hM4uoTEl7Ce8r7S
6
+ onqCbpH1jWPDj6gzBVVXID6yItftxcXmg3GV9Rbiy/XlDQo++k87eSKgbIblMP/p
7
+ AeapZs4doe5J3NZw5XGRS6r0OdFLakY5OxArvwIDAQABAoIBAQCqj3LFzcZrqTaF
8
+ y1zBY+psxl8C1/HKKbNi3W/Y4TT8EnRGcxpKlHFHzY1lx5nYXnEtuLjesC+VHhqv
9
+ utSKZ0SFY/wElJ4KC80RD/WT1X1yHVyvc1zXQWtf+LfmOzs5UeN81xXmWrESiMrS
10
+ vH2smXPkO2KqL9dRBhcgypKcVZi19HLtvdo7MH8Wx4RL9vugcEUSiZa1SB7r1Zvt
11
+ S9qjHvT0HR98CPhvoHvCofvwFT8YA0stpXs1jIfAfaEH/Z/8F6HYRrbwWM0P1Eq5
12
+ l5ZdN+N/BsWhd/mnYTvTqcCZrHhUEh+rP72GkecXpGK/GwbEtE9cX+FX1Y0FBqYm
13
+ qC86tmpBAoGBAOMDgpvHXfHQotjSKL1YM9EPfxDxofcrRzBDwCMDVOe8yh21OI1v
14
+ 3uEYsPQNFuyuq9lnbbdAgp4tOfoNMPnrtHQwfzZQBjXo/Fse5Cyy1WCeh8kr2YlQ
15
+ d05cfYALx9YDah+GdwM1ejeCRQBwTCDkg66lCdA1RrYzmazo/SUdJFvhAoGBAPBe
16
+ 5mwbVbjmrQiaIMfhtJ86E5aI2xRDgs4f3NoQul9+ZZhDZBIy5t7V784IabFvvIMc
17
+ GWhhl/1Xkq6aAS4gUdDOYVBA0Vpb1ltFE2lo5JIiYx9sdu1wM2FM/FLPjdpdvGJ7
18
+ uiylEMEG4/hLt6PZFwV6i31PyTSxTVd9YiREFnufAoGAfYSXVqKpIucE43Vv6SE3
19
+ pUQ4MZoov41CU0FinvlcnLUZ28szdaCBT1xjms0R+9OoWRCC7WvRzLuc7tEUX1sf
20
+ 745RCCq/BFfKEGfIKZ7HtCBzW5vPL8k57i3dhkr9Nyu0JbInY7LR3Jc+p7tvnFA9
21
+ Lvc5sdGDQ4LMWXqJXVf7noECgYEA4Z6CNFkYBl1nb1qUiGmgC5EMz9CXqpaP0gBw
22
+ YbMv7PCMVfZzmO10bRdsZvzYkHcr//jBFIv+iQrJIOBnWS92/EKrbxPYLjNjqfnV
23
+ dazCVzS1y8oYe1hEsgD8GpK9OImhiONP5hXt+vEHzIjtz3q2tCrJgY8Bclc2HHgR
24
+ Ra8vV0sCgYA8yOviVeE1OiIVIdOSqn1l9umP0EexGk5aPiWfULsfVq3oycIwp3vG
25
+ XwM8AfFQOdlrGwdyWjCXCw3JFc0tpOkxzw36iL9zGhgbgv32gjmGgcbYVWL5nm8F
26
+ txiA8FLH+8yr6ohajTY/owYIZXSzKzmp8uBxnG7iSbt33AsE3Lbc2w==
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,20 @@
1
+ apiVersion: v1
2
+ clusters:
3
+ - cluster:
4
+ certificate-authority: external-ca.pem
5
+ server: https://localhost:8443
6
+ name: localhost:8443
7
+ contexts:
8
+ - context:
9
+ cluster: localhost:8443
10
+ namespace: default
11
+ user: system:admin/localhost:8443
12
+ name: default/localhost:8443/system:admin
13
+ current-context: default/localhost:8443/system:admin
14
+ kind: Config
15
+ preferences: {}
16
+ users:
17
+ - name: system:admin/localhost:8443
18
+ user:
19
+ client-certificate: external-cert.pem
20
+ client-key: external-key.rsa
@@ -0,0 +1,16 @@
1
+ apiVersion: v1
2
+ clusters:
3
+ - cluster:
4
+ server: https://localhost:8443
5
+ insecure-skip-tls-verify: true
6
+ name: localhost:8443
7
+ contexts:
8
+ - context:
9
+ cluster: localhost:8443
10
+ namespace: default
11
+ user: ""
12
+ name: default/localhost:8443/nouser
13
+ current-context: default/localhost:8443/nouser
14
+ kind: Config
15
+ preferences: {}
16
+ users: []
@@ -0,0 +1,42 @@
1
+ require 'test_helper'
2
+
3
+ def test_config_file(name)
4
+ File.new(File.join(File.dirname(__FILE__), 'config', name))
5
+ end
6
+
7
+ # Testing Kubernetes client configuration
8
+ class KubeClientConfigTest < MiniTest::Test
9
+ def test_allinone
10
+ config = Kubeclient::Config.read(test_config_file('allinone.kubeconfig'))
11
+ assert_equal(['default/localhost:8443/system:admin'], config.contexts)
12
+ check_context(config.context, ssl: true)
13
+ end
14
+
15
+ def test_external
16
+ config = Kubeclient::Config.read(test_config_file('external.kubeconfig'))
17
+ assert_equal(['default/localhost:8443/system:admin'], config.contexts)
18
+ check_context(config.context, ssl: true)
19
+ end
20
+
21
+ def test_nouser
22
+ config = Kubeclient::Config.read(test_config_file('nouser.kubeconfig'))
23
+ assert_equal(['default/localhost:8443/nouser'], config.contexts)
24
+ check_context(config.context, ssl: false)
25
+ end
26
+
27
+ private
28
+
29
+ def check_context(context, ssl: true)
30
+ assert_equal('https://localhost:8443', context.api_endpoint)
31
+ assert_equal('v1', context.api_version)
32
+ if ssl
33
+ assert_equal(OpenSSL::SSL::VERIFY_PEER, context.ssl_options[:verify_ssl])
34
+ assert_kind_of(OpenSSL::X509::Store, context.ssl_options[:cert_store])
35
+ assert_kind_of(OpenSSL::X509::Certificate, context.ssl_options[:client_cert])
36
+ assert_kind_of(OpenSSL::PKey::RSA, context.ssl_options[:client_key])
37
+ assert(context.ssl_options[:cert_store].verify(context.ssl_options[:client_cert]))
38
+ else
39
+ assert_equal(OpenSSL::SSL::VERIFY_NONE, context.ssl_options[:verify_ssl])
40
+ end
41
+ end
42
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kubeclient
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alissa Bonas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-04 00:00:00.000000000 Z
11
+ date: 2016-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: webmock
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 1.24.2
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 1.24.2
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: vcr
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -167,12 +167,19 @@ files:
167
167
  - kubeclient.gemspec
168
168
  - lib/kubeclient.rb
169
169
  - lib/kubeclient/common.rb
170
+ - lib/kubeclient/config.rb
170
171
  - lib/kubeclient/entity_list.rb
171
172
  - lib/kubeclient/kube_exception.rb
172
173
  - lib/kubeclient/version.rb
173
174
  - lib/kubeclient/watch_notice.rb
174
175
  - lib/kubeclient/watch_stream.rb
175
176
  - test/cassettes/kubernetes_guestbook.yml
177
+ - test/config/allinone.kubeconfig
178
+ - test/config/external-ca.pem
179
+ - test/config/external-cert.pem
180
+ - test/config/external-key.rsa
181
+ - test/config/external.kubeconfig
182
+ - test/config/nouser.kubeconfig
176
183
  - test/json/component_status.json
177
184
  - test/json/component_status_list.json
178
185
  - test/json/created_endpoint.json
@@ -212,6 +219,7 @@ files:
212
219
  - test/json/versions_list.json
213
220
  - test/json/watch_stream.json
214
221
  - test/test_component_status.rb
222
+ - test/test_config.rb
215
223
  - test/test_endpoint.rb
216
224
  - test/test_guestbook_go.rb
217
225
  - test/test_helper.rb
@@ -257,6 +265,12 @@ specification_version: 4
257
265
  summary: A client for Kubernetes REST api
258
266
  test_files:
259
267
  - test/cassettes/kubernetes_guestbook.yml
268
+ - test/config/allinone.kubeconfig
269
+ - test/config/external-ca.pem
270
+ - test/config/external-cert.pem
271
+ - test/config/external-key.rsa
272
+ - test/config/external.kubeconfig
273
+ - test/config/nouser.kubeconfig
260
274
  - test/json/component_status.json
261
275
  - test/json/component_status_list.json
262
276
  - test/json/created_endpoint.json
@@ -296,6 +310,7 @@ test_files:
296
310
  - test/json/versions_list.json
297
311
  - test/json/watch_stream.json
298
312
  - test/test_component_status.rb
313
+ - test/test_config.rb
299
314
  - test/test_endpoint.rb
300
315
  - test/test_guestbook_go.rb
301
316
  - test/test_helper.rb