diff options
Diffstat (limited to 'vendor/gems/kubeclient/test/test_kubeclient.rb')
-rw-r--r-- | vendor/gems/kubeclient/test/test_kubeclient.rb | 881 |
1 files changed, 881 insertions, 0 deletions
diff --git a/vendor/gems/kubeclient/test/test_kubeclient.rb b/vendor/gems/kubeclient/test/test_kubeclient.rb new file mode 100644 index 00000000000..f866bfc89df --- /dev/null +++ b/vendor/gems/kubeclient/test/test_kubeclient.rb @@ -0,0 +1,881 @@ +require_relative 'test_helper' + +# Kubernetes client entity tests +class KubeclientTest < MiniTest::Test + def test_json + our_object = Kubeclient::Resource.new + our_object.foo = 'bar' + our_object.nested = {} + our_object.nested.again = {} + our_object.nested.again.again = {} + our_object.nested.again.again.name = 'aaron' + + expected = { + 'foo' => 'bar', + 'nested' => { 'again' => { 'again' => { 'name' => 'aaron' } } } + } + + assert_equal(expected, JSON.parse(JSON.dump(our_object.to_h))) + end + + def test_pass_uri + # URI::Generic#hostname= was added in ruby 1.9.3 and will automatically + # wrap an ipv6 address in [] + uri = URI::HTTP.build(port: 8080) + uri.hostname = 'localhost' + client = Kubeclient::Client.new(uri) + rest_client = client.rest_client + assert_equal('http://localhost:8080/api/v1', rest_client.url.to_s) + end + + def test_no_path_in_uri + client = Kubeclient::Client.new('http://localhost:8080', 'v1') + rest_client = client.rest_client + assert_equal('http://localhost:8080/api/v1', rest_client.url.to_s) + end + + def test_no_version_passed + client = Kubeclient::Client.new('http://localhost:8080') + rest_client = client.rest_client + assert_equal('http://localhost:8080/api/v1', rest_client.url.to_s) + end + + def test_pass_proxy + uri = URI::HTTP.build(host: 'localhost', port: 8080) + proxy_uri = URI::HTTP.build(host: 'myproxyhost', port: 8888) + stub_core_api_list + + client = Kubeclient::Client.new(uri, http_proxy_uri: proxy_uri) + rest_client = client.rest_client + assert_equal(proxy_uri.to_s, rest_client.options[:proxy]) + + watch_client = client.watch_pods + assert_equal(watch_client.send(:build_client_options)[:proxy][:proxy_address], proxy_uri.host) + assert_equal(watch_client.send(:build_client_options)[:proxy][:proxy_port], proxy_uri.port) + end + + def test_pass_max_redirects + max_redirects = 0 + client = Kubeclient::Client.new('http://localhost:8080/api/', http_max_redirects: max_redirects) + rest_client = client.rest_client + assert_equal(max_redirects, rest_client.options[:max_redirects]) + + stub_request(:get, 'http://localhost:8080/api') + .to_return(status: 302, headers: { location: 'http://localhost:1234/api' }) + + exception = assert_raises(Kubeclient::HttpError) { client.api } + assert_equal(302, exception.error_code) + end + + def test_exception + stub_core_api_list + stub_request(:post, %r{/services}) + .to_return(body: open_test_file('namespace_exception.json'), status: 409) + + service = Kubeclient::Resource.new + service.metadata = {} + service.metadata.name = 'redisslave' + service.metadata.namespace = 'default' + # service.port = 80 + # service.container_port = 6379 + # service.protocol = 'TCP' + + client = Kubeclient::Client.new('http://localhost:8080/api/') + + exception = assert_raises(Kubeclient::HttpError) do + service = client.create_service(service) + end + + assert_instance_of(Kubeclient::HttpError, exception) + assert_equal("converting to : type names don't match (Pod, Namespace)", + exception.message) + + assert_includes(exception.to_s, ' for POST http://localhost:8080/api') + assert_equal(409, exception.error_code) + end + + def test_deprecated_exception + error_message = 'certificate verify failed' + + stub_request(:get, 'http://localhost:8080/api') + .to_raise(OpenSSL::SSL::SSLError.new(error_message)) + + client = Kubeclient::Client.new('http://localhost:8080/api/') + + exception = assert_raises(KubeException) { client.api } + assert_equal(error_message, exception.message) + end + + def test_api + stub_request(:get, 'http://localhost:8080/api') + .to_return(status: 200, body: open_test_file('versions_list.json')) + + response = client.api + assert_includes(response, 'versions') + end + + def test_api_ssl_failure + error_message = 'certificate verify failed' + + stub_request(:get, 'http://localhost:8080/api') + .to_raise(OpenSSL::SSL::SSLError.new(error_message)) + + client = Kubeclient::Client.new('http://localhost:8080/api/') + + exception = assert_raises(Kubeclient::HttpError) { client.api } + assert_equal(error_message, exception.message) + end + + def test_api_timeout + stub_request(:get, 'http://localhost:8080/api').to_timeout + + client = Kubeclient::Client.new('http://localhost:8080/api/') + + exception = assert_raises(Kubeclient::HttpError) { client.api } + assert_match(/(timed out|timeout)/i, exception.message) + end + + def test_api_valid + stub_request(:get, 'http://localhost:8080/api') + .to_return(status: 200, body: open_test_file('versions_list.json')) + + args = ['http://localhost:8080/api/'] + + [nil, 'v1beta3', 'v1'].each do |version| + client = Kubeclient::Client.new(*(version ? args + [version] : args)) + assert client.api_valid? + end + end + + def test_api_valid_with_invalid_version + stub_request(:get, 'http://localhost:8080/api') + .to_return(status: 200, body: open_test_file('versions_list.json')) + + client = Kubeclient::Client.new('http://localhost:8080/api/', 'foobar1') + refute client.api_valid? + end + + def test_api_valid_with_unreported_versions + stub_request(:get, 'http://localhost:8080/api') + .to_return(status: 200, body: '{}') + + client = Kubeclient::Client.new('http://localhost:8080/api/') + refute client.api_valid? + end + + def test_api_valid_with_invalid_json + stub_request(:get, 'http://localhost:8080/api') + .to_return(status: 200, body: '[]') + + client = Kubeclient::Client.new('http://localhost:8080/api/') + refute client.api_valid? + end + + def test_api_valid_with_bad_endpoint + stub_request(:get, 'http://localhost:8080/api') + .to_return(status: [404, 'Resource Not Found']) + + client = Kubeclient::Client.new('http://localhost:8080/api/') + assert_raises(Kubeclient::HttpError) { client.api_valid? } + end + + def test_api_valid_with_non_json + stub_request(:get, 'http://localhost:8080/api') + .to_return(status: 200, body: '<html></html>') + + client = Kubeclient::Client.new('http://localhost:8080/api/') + assert_raises(JSON::ParserError) { client.api_valid? } + end + + def test_nonjson_exception + stub_core_api_list + stub_request(:get, %r{/servic}) + .to_return(body: open_test_file('service_illegal_json_404.json'), status: 404) + + exception = assert_raises(Kubeclient::ResourceNotFoundError) do + client.get_services + end + + assert(exception.message.include?('Not Found')) + assert_equal(404, exception.error_code) + end + + def test_nonjson_exception_raw + stub_core_api_list + stub_request(:get, %r{/servic}) + .to_return(body: open_test_file('service_illegal_json_404.json'), status: 404) + + exception = assert_raises(Kubeclient::ResourceNotFoundError) do + client.get_services(as: :raw) + end + + assert(exception.message.include?('Not Found')) + assert_equal(404, exception.error_code) + end + + def test_entity_list + stub_core_api_list + stub_get_services + + services = client.get_services + + refute_empty(services) + assert_instance_of(Kubeclient::Common::EntityList, services) + # Stripping of 'List' in collection.kind RecursiveOpenStruct mode only is historic. + assert_equal('Service', services.kind) + assert_equal(2, services.size) + assert_instance_of(Kubeclient::Resource, services[0]) + assert_instance_of(Kubeclient::Resource, services[1]) + + assert_requested(:get, 'http://localhost:8080/api/v1/services', times: 1) + end + + def test_entity_list_raw + stub_core_api_list + stub_get_services + + response = client.get_services(as: :raw) + + refute_empty(response) + assert_equal(open_test_file('entity_list.json').read, response) + + assert_requested(:get, 'http://localhost:8080/api/v1/services', times: 1) + end + + def test_entity_list_parsed + stub_core_api_list + stub_get_services + + response = client.get_services(as: :parsed) + assert_equal Hash, response.class + assert_equal 'ServiceList', response['kind'] + assert_equal %w[metadata spec status], response['items'].first.keys + end + + def test_entity_list_parsed_symbolized + stub_core_api_list + stub_get_services + + response = client.get_services(as: :parsed_symbolized) + assert_equal Hash, response.class + assert_equal 'ServiceList', response[:kind] + assert_equal %i[metadata spec status], response[:items].first.keys + end + + def test_entity_list_unknown + stub_core_api_list + stub_get_services + + e = assert_raises(ArgumentError) { client.get_services(as: :whoops) } + assert_equal 'Unsupported format :whoops', e.message + end + + def test_entity_list_raw_failure + stub_core_api_list + stub_request(:get, %r{/services}) + .to_return(body: open_test_file('entity_list.json'), status: 500) + + exception = assert_raises(Kubeclient::HttpError) { client.get_services(as: :raw) } + assert_equal('500 Internal Server Error', exception.message) + assert_equal(500, exception.error_code) + end + + def test_entities_with_label_selector + selector = 'component=apiserver' + + stub_core_api_list + stub_get_services + + services = client.get_services(label_selector: selector) + + assert_instance_of(Kubeclient::Common::EntityList, services) + assert_requested( + :get, + "http://localhost:8080/api/v1/services?labelSelector=#{selector}", + times: 1 + ) + end + + def test_entities_with_resource_version + version = '329' + + stub_core_api_list + stub_get_services + + services = client.get_services(resource_version: version) + + assert_instance_of(Kubeclient::Common::EntityList, services) + assert_requested( + :get, + "http://localhost:8080/api/v1/services?resourceVersion=#{version}", + times: 1 + ) + end + + def test_entities_with_field_selector + selector = 'involvedObject.name=redis-master' + + stub_core_api_list + stub_get_services + + services = client.get_services(field_selector: selector) + + assert_instance_of(Kubeclient::Common::EntityList, services) + assert_requested( + :get, + "http://localhost:8080/api/v1/services?fieldSelector=#{selector}", + times: 1 + ) + end + + def test_empty_list + stub_core_api_list + stub_request(:get, %r{/pods}) + .to_return(body: open_test_file('empty_pod_list.json'), status: 200) + + pods = client.get_pods + assert_instance_of(Kubeclient::Common::EntityList, pods) + assert_equal(0, pods.size) + end + + def test_get_all + stub_core_api_list + + stub_request(:get, %r{/bindings}) + .to_return(body: open_test_file('bindings_list.json'), status: 404) + + stub_request(:get, %r{/configmaps}) + .to_return(body: open_test_file('config_map_list.json'), status: 200) + + stub_request(:get, %r{/podtemplates}) + .to_return(body: open_test_file('pod_template_list.json'), status: 200) + + stub_request(:get, %r{/services}) + .to_return(body: open_test_file('service_list.json'), status: 200) + + stub_request(:get, %r{/pods}) + .to_return(body: open_test_file('pod_list.json'), status: 200) + + stub_request(:get, %r{/nodes}) + .to_return(body: open_test_file('node_list.json'), status: 200) + + stub_request(:get, %r{/replicationcontrollers}) + .to_return(body: open_test_file('replication_controller_list.json'), status: 200) + + stub_request(:get, %r{/events}) + .to_return(body: open_test_file('event_list.json'), status: 200) + + stub_request(:get, %r{/endpoints}) + .to_return(body: open_test_file('endpoint_list.json'), status: 200) + + stub_request(:get, %r{/namespaces}) + .to_return(body: open_test_file('namespace_list.json'), status: 200) + + stub_request(:get, %r{/secrets}) + .to_return(body: open_test_file('secret_list.json'), status: 200) + + stub_request(:get, %r{/resourcequotas}) + .to_return(body: open_test_file('resource_quota_list.json'), status: 200) + + stub_request(:get, %r{/limitranges}) + .to_return(body: open_test_file('limit_range_list.json'), status: 200) + + stub_request(:get, %r{/persistentvolumes}) + .to_return(body: open_test_file('persistent_volume_list.json'), status: 200) + + stub_request(:get, %r{/persistentvolumeclaims}) + .to_return(body: open_test_file('persistent_volume_claim_list.json'), status: 200) + + stub_request(:get, %r{/componentstatuses}) + .to_return(body: open_test_file('component_status_list.json'), status: 200) + + stub_request(:get, %r{/serviceaccounts}) + .to_return(body: open_test_file('service_account_list.json'), status: 200) + + result = client.all_entities + assert_equal(16, result.keys.size) + assert_instance_of(Kubeclient::Common::EntityList, result['node']) + assert_instance_of(Kubeclient::Common::EntityList, result['service']) + assert_instance_of(Kubeclient::Common::EntityList, result['replication_controller']) + assert_instance_of(Kubeclient::Common::EntityList, result['pod']) + assert_instance_of(Kubeclient::Common::EntityList, result['event']) + assert_instance_of(Kubeclient::Common::EntityList, result['namespace']) + assert_instance_of(Kubeclient::Common::EntityList, result['secret']) + assert_instance_of(Kubeclient::Resource, result['service'][0]) + assert_instance_of(Kubeclient::Resource, result['node'][0]) + assert_instance_of(Kubeclient::Resource, result['event'][0]) + assert_instance_of(Kubeclient::Resource, result['endpoint'][0]) + assert_instance_of(Kubeclient::Resource, result['namespace'][0]) + assert_instance_of(Kubeclient::Resource, result['secret'][0]) + assert_instance_of(Kubeclient::Resource, result['resource_quota'][0]) + assert_instance_of(Kubeclient::Resource, result['limit_range'][0]) + assert_instance_of(Kubeclient::Resource, result['persistent_volume'][0]) + assert_instance_of(Kubeclient::Resource, result['persistent_volume_claim'][0]) + assert_instance_of(Kubeclient::Resource, result['component_status'][0]) + assert_instance_of(Kubeclient::Resource, result['service_account'][0]) + end + + def test_get_all_raw + stub_core_api_list + + stub_request(:get, %r{/bindings}) + .to_return(body: open_test_file('bindings_list.json'), status: 404) + + stub_request(:get, %r{/configmaps}) + .to_return(body: open_test_file('config_map_list.json'), status: 200) + + stub_request(:get, %r{/podtemplates}) + .to_return(body: open_test_file('pod_template_list.json'), status: 200) + + stub_request(:get, %r{/services}) + .to_return(body: open_test_file('service_list.json'), status: 200) + + stub_request(:get, %r{/pods}) + .to_return(body: open_test_file('pod_list.json'), status: 200) + + stub_request(:get, %r{/nodes}) + .to_return(body: open_test_file('node_list.json'), status: 200) + + stub_request(:get, %r{/replicationcontrollers}) + .to_return(body: open_test_file('replication_controller_list.json'), status: 200) + + stub_request(:get, %r{/events}) + .to_return(body: open_test_file('event_list.json'), status: 200) + + stub_request(:get, %r{/endpoints}) + .to_return(body: open_test_file('endpoint_list.json'), status: 200) + + stub_request(:get, %r{/namespaces}) + .to_return(body: open_test_file('namespace_list.json'), status: 200) + + stub_request(:get, %r{/secrets}) + .to_return(body: open_test_file('secret_list.json'), status: 200) + + stub_request(:get, %r{/resourcequotas}) + .to_return(body: open_test_file('resource_quota_list.json'), status: 200) + + stub_request(:get, %r{/limitranges}) + .to_return(body: open_test_file('limit_range_list.json'), status: 200) + + stub_request(:get, %r{/persistentvolumes}) + .to_return(body: open_test_file('persistent_volume_list.json'), status: 200) + + stub_request(:get, %r{/persistentvolumeclaims}) + .to_return(body: open_test_file('persistent_volume_claim_list.json'), status: 200) + + stub_request(:get, %r{/componentstatuses}) + .to_return(body: open_test_file('component_status_list.json'), status: 200) + + stub_request(:get, %r{/serviceaccounts}) + .to_return(body: open_test_file('service_account_list.json'), status: 200) + + result = client.all_entities(as: :raw) + assert_equal(16, result.keys.size) + + %w[ + component_status config_map endpoint event limit_range namespace node + persistent_volume persistent_volume_claim pod replication_controller + resource_quota secret service service_account + ].each do |entity| + assert_equal(open_test_file("#{entity}_list.json").read, result[entity]) + end + end + + def test_api_bearer_token_with_params_success + stub_request(:get, 'http://localhost:8080/api/v1/pods?labelSelector=name=redis-master') + .with(headers: { Authorization: 'Bearer valid_token' }) + .to_return(body: open_test_file('pod_list.json'), status: 200) + stub_request(:get, %r{/api/v1$}) + .with(headers: { Authorization: 'Bearer valid_token' }) + .to_return(body: open_test_file('core_api_resource_list.json'), status: 200) + + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + auth_options: { bearer_token: 'valid_token' } + ) + + pods = client.get_pods(label_selector: 'name=redis-master') + + assert_equal('Pod', pods.kind) + assert_equal(1, pods.size) + end + + def test_api_bearer_token_success + stub_core_api_list + stub_request(:get, 'http://localhost:8080/api/v1/pods') + .with(headers: { Authorization: 'Bearer valid_token' }) + .to_return( + body: open_test_file('pod_list.json'), status: 200 + ) + + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + auth_options: { bearer_token: 'valid_token' } + ) + + pods = client.get_pods + + assert_equal('Pod', pods.kind) + assert_equal(1, pods.size) + end + + def test_api_bearer_token_failure + error_message = + '"/api/v1" is forbidden because ' \ + 'system:anonymous cannot list on pods in' + response = OpenStruct.new(code: 401, message: error_message) + + stub_request(:get, 'http://localhost:8080/api/v1') + .with(headers: { Authorization: 'Bearer invalid_token' }) + .to_raise(Kubeclient::HttpError.new(403, error_message, response)) + + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + auth_options: { bearer_token: 'invalid_token' } + ) + + exception = assert_raises(Kubeclient::HttpError) { client.get_pods } + assert_equal(403, exception.error_code) + assert_equal(error_message, exception.message) + assert_equal(response, exception.response) + end + + def test_api_bearer_token_failure_raw + error_message = + '"/api/v1" is forbidden because ' \ + 'system:anonymous cannot list on pods in' + response = OpenStruct.new(code: 401, message: error_message) + + stub_request(:get, 'http://localhost:8080/api/v1') + .with(headers: { Authorization: 'Bearer invalid_token' }) + .to_raise(Kubeclient::HttpError.new(403, error_message, response)) + + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + auth_options: { bearer_token: 'invalid_token' } + ) + + exception = assert_raises(Kubeclient::HttpError) { client.get_pods(as: :raw) } + assert_equal(403, exception.error_code) + assert_equal(error_message, exception.message) + assert_equal(response, exception.response) + end + + def test_api_basic_auth_success + stub_request(:get, 'http://localhost:8080/api/v1') + .with(basic_auth: %w[username password]) + .to_return(body: open_test_file('core_api_resource_list.json'), status: 200) + stub_request(:get, 'http://localhost:8080/api/v1/pods') + .with(basic_auth: %w[username password]) + .to_return(body: open_test_file('pod_list.json'), status: 200) + + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + auth_options: { username: 'username', password: 'password' } + ) + + pods = client.get_pods + + assert_equal('Pod', pods.kind) + assert_equal(1, pods.size) + assert_requested( + :get, + 'http://localhost:8080/api/v1/pods', + times: 1 + ) + end + + def test_api_basic_auth_back_comp_success + stub_request(:get, 'http://localhost:8080/api/v1') + .with(basic_auth: %w[username password]) + .to_return(body: open_test_file('core_api_resource_list.json'), status: 200) + stub_request(:get, 'http://localhost:8080/api/v1/pods') + .with(basic_auth: %w[username password]) + .to_return(body: open_test_file('pod_list.json'), status: 200) + + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + auth_options: { user: 'username', password: 'password' } + ) + + pods = client.get_pods + + assert_equal('Pod', pods.kind) + assert_equal(1, pods.size) + assert_requested(:get, 'http://localhost:8080/api/v1/pods', times: 1) + end + + def test_api_basic_auth_failure + error_message = 'HTTP status code 401, 401 Unauthorized' + response = OpenStruct.new(code: 401, message: '401 Unauthorized') + + stub_request(:get, 'http://localhost:8080/api/v1') + .with(basic_auth: %w[username password]) + .to_raise(Kubeclient::HttpError.new(401, error_message, response)) + + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + auth_options: { username: 'username', password: 'password' } + ) + + exception = assert_raises(Kubeclient::HttpError) { client.get_pods } + assert_equal(401, exception.error_code) + assert_equal(error_message, exception.message) + assert_equal(response, exception.response) + assert_requested(:get, 'http://localhost:8080/api/v1', times: 1) + end + + def test_api_basic_auth_failure_raw + error_message = 'HTTP status code 401, 401 Unauthorized' + response = OpenStruct.new(code: 401, message: '401 Unauthorized') + + stub_request(:get, 'http://localhost:8080/api/v1') + .with(basic_auth: %w[username password]) + .to_raise(Kubeclient::HttpError.new(401, error_message, response)) + + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + auth_options: { username: 'username', password: 'password' } + ) + + exception = assert_raises(Kubeclient::HttpError) { client.get_pods(as: :raw) } + assert_equal(401, exception.error_code) + assert_equal(error_message, exception.message) + assert_equal(response, exception.response) + + assert_requested(:get, 'http://localhost:8080/api/v1', times: 1) + end + + def test_init_username_no_password + expected_msg = 'Basic auth requires both username & password' + exception = assert_raises(ArgumentError) do + Kubeclient::Client.new( + 'http://localhost:8080', + auth_options: { username: 'username' } + ) + end + assert_equal(expected_msg, exception.message) + end + + def test_init_user_no_password + expected_msg = 'Basic auth requires both username & password' + exception = assert_raises(ArgumentError) do + Kubeclient::Client.new( + 'http://localhost:8080', + auth_options: { user: 'username' } + ) + end + assert_equal(expected_msg, exception.message) + end + + def test_init_username_and_bearer_token + expected_msg = 'Invalid auth options: specify only one of username/password,' \ + ' bearer_token or bearer_token_file' + exception = assert_raises(ArgumentError) do + Kubeclient::Client.new( + 'http://localhost:8080', + auth_options: { username: 'username', bearer_token: 'token' } + ) + end + assert_equal(expected_msg, exception.message) + end + + def test_init_username_and_bearer_token_file + expected_msg = 'Invalid auth options: specify only one of username/password,' \ + ' bearer_token or bearer_token_file' + exception = assert_raises(ArgumentError) do + Kubeclient::Client.new( + 'http://localhost:8080', + auth_options: { username: 'username', bearer_token_file: 'token-file' } + ) + end + assert_equal(expected_msg, exception.message) + end + + def test_bearer_token_and_bearer_token_file + expected_msg = + 'Invalid auth options: specify only one of username/password,' \ + ' bearer_token or bearer_token_file' + exception = assert_raises(ArgumentError) do + Kubeclient::Client.new( + 'http://localhost:8080', + auth_options: { bearer_token: 'token', bearer_token_file: 'token-file' } + ) + end + assert_equal(expected_msg, exception.message) + end + + def test_bearer_token_file_not_exist + expected_msg = 'Token file token-file does not exist' + exception = assert_raises(ArgumentError) do + Kubeclient::Client.new( + 'http://localhost:8080', + auth_options: { bearer_token_file: 'token-file' } + ) + end + assert_equal(expected_msg, exception.message) + end + + def test_api_bearer_token_file_success + stub_core_api_list + stub_request(:get, 'http://localhost:8080/api/v1/pods') + .with(headers: { Authorization: 'Bearer valid_token' }) + .to_return(body: open_test_file('pod_list.json'), status: 200) + + file = File.join(File.dirname(__FILE__), 'valid_token_file') + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + auth_options: { bearer_token_file: file } + ) + + pods = client.get_pods + + assert_equal('Pod', pods.kind) + assert_equal(1, pods.size) + end + + def test_proxy_url + stub_core_api_list + + client = Kubeclient::Client.new('http://host:8080', 'v1') + assert_equal( + 'http://host:8080/api/v1/namespaces/ns/services/srvname:srvportname/proxy', + client.proxy_url('service', 'srvname', 'srvportname', 'ns') + ) + + assert_equal( + 'http://host:8080/api/v1/namespaces/ns/services/srvname:srvportname/proxy', + client.proxy_url('services', 'srvname', 'srvportname', 'ns') + ) + + assert_equal( + 'http://host:8080/api/v1/namespaces/ns/pods/srvname:srvportname/proxy', + client.proxy_url('pod', 'srvname', 'srvportname', 'ns') + ) + + assert_equal( + 'http://host:8080/api/v1/namespaces/ns/pods/srvname:srvportname/proxy', + client.proxy_url('pods', 'srvname', 'srvportname', 'ns') + ) + + # Check no namespace provided + assert_equal( + 'http://host:8080/api/v1/nodes/srvname:srvportname/proxy', + client.proxy_url('nodes', 'srvname', 'srvportname') + ) + + assert_equal( + 'http://host:8080/api/v1/nodes/srvname:srvportname/proxy', + client.proxy_url('node', 'srvname', 'srvportname') + ) + + # Check integer port + assert_equal( + 'http://host:8080/api/v1/nodes/srvname:5001/proxy', + client.proxy_url('nodes', 'srvname', 5001) + ) + + assert_equal( + 'http://host:8080/api/v1/nodes/srvname:5001/proxy', + client.proxy_url('node', 'srvname', 5001) + ) + end + + def test_attr_readers + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + ssl_options: { client_key: 'secret' }, + auth_options: { bearer_token: 'token' } + ) + assert_equal('/api', client.api_endpoint.path) + assert_equal('secret', client.ssl_options[:client_key]) + assert_equal('token', client.auth_options[:bearer_token]) + assert_equal('Bearer token', client.headers[:Authorization]) + end + + def test_nil_items + # handle https://github.com/kubernetes/kubernetes/issues/13096 + stub_core_api_list + stub_request(:get, %r{/persistentvolumeclaims}) + .to_return(body: open_test_file('persistent_volume_claims_nil_items.json'), status: 200) + + client.get_persistent_volume_claims + end + + # Timeouts + + def test_timeouts_defaults + client = Kubeclient::Client.new( + 'http://localhost:8080/api/' + ) + rest_client = client.rest_client + assert_default_open_timeout(rest_client.open_timeout) + assert_equal(60, rest_client.read_timeout) + end + + def test_timeouts_open + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + timeouts: { open: 10 } + ) + rest_client = client.rest_client + assert_equal(10, rest_client.open_timeout) + assert_equal(60, rest_client.read_timeout) + end + + def test_timeouts_read + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + timeouts: { read: 300 } + ) + rest_client = client.rest_client + assert_default_open_timeout(rest_client.open_timeout) + assert_equal(300, rest_client.read_timeout) + end + + def test_timeouts_both + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + timeouts: { open: 10, read: 300 } + ) + rest_client = client.rest_client + assert_equal(10, rest_client.open_timeout) + assert_equal(300, rest_client.read_timeout) + end + + def test_timeouts_infinite + client = Kubeclient::Client.new( + 'http://localhost:8080/api/', + timeouts: { open: nil, read: nil } + ) + rest_client = client.rest_client + assert_nil(rest_client.open_timeout) + assert_nil(rest_client.read_timeout) + end + + def assert_default_open_timeout(actual) + if RUBY_VERSION >= '2.3' + assert_equal(60, actual) + else + assert_nil(actual) + end + end + + private + + def stub_get_services + stub_request(:get, %r{/services}) + .to_return(body: open_test_file('entity_list.json'), status: 200) + end + + def client + @client ||= Kubeclient::Client.new('http://localhost:8080/api/', 'v1') + end + + # dup method creates a shallow copy which is not good in this case + # since rename_keys changes the input hash + # hence need to create a deep_copy + def deep_copy(hash) + Marshal.load(Marshal.dump(hash)) + end +end |