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 +4 -4
- data/.rubocop.yml +2 -0
- data/.travis.yml +4 -0
- data/Rakefile +2 -1
- data/kubeclient.gemspec +1 -1
- data/lib/kubeclient.rb +12 -22
- data/lib/kubeclient/common.rb +32 -27
- data/lib/kubeclient/config.rb +111 -0
- data/lib/kubeclient/version.rb +1 -1
- data/test/config/allinone.kubeconfig +20 -0
- data/test/config/external-ca.pem +18 -0
- data/test/config/external-cert.pem +19 -0
- data/test/config/external-key.rsa +27 -0
- data/test/config/external.kubeconfig +20 -0
- data/test/config/nouser.kubeconfig +16 -0
- data/test/test_config.rb +42 -0
- metadata +21 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f768aad498e66fa0f505eeb189e8b16ba540d18
|
4
|
+
data.tar.gz: cb9117eec7974802515d05073815eb3615c02753
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfb530cff6a49e8a3b1100da06a520bec3341b862f79829b19de34819c4ccabb8cbe6b228619c2c8728d1885a796777df5d591d87b2991b4652797db503080c8
|
7
|
+
data.tar.gz: 3241b347cceeed5453a980fb412a39b9455255e1c73a016277adf67a4f1aeaa1ed690b1d7507edaf2fb5d6167590bd79732eaf69ea853dd3a74e6b52e6fe94a4
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/Rakefile
CHANGED
data/kubeclient.gemspec
CHANGED
@@ -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'
|
data/lib/kubeclient.rb
CHANGED
@@ -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(
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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
|
data/lib/kubeclient/common.rb
CHANGED
@@ -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
|
15
|
-
ssl_options:
|
16
|
-
|
17
|
-
|
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
|
-
|
60
|
+
json_error_msg = begin
|
61
|
+
JSON.parse(e.response || '') || {}
|
55
62
|
rescue JSON::ParserError
|
56
|
-
|
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'
|
64
|
-
@api_endpoint = (uri.is_a?
|
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
|
data/lib/kubeclient/version.rb
CHANGED
@@ -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: []
|
data/test/test_config.rb
ADDED
@@ -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.
|
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-
|
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:
|
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:
|
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
|