196 lines
5.7 KiB
Ruby
196 lines
5.7 KiB
Ruby
|
require_relative 'test_helper'
|
||
|
|
||
|
# Watch entity tests
|
||
|
class TestWatch < MiniTest::Test
|
||
|
def test_watch_pod_success
|
||
|
stub_core_api_list
|
||
|
|
||
|
expected = [
|
||
|
{ 'type' => 'ADDED', 'resourceVersion' => '1389' },
|
||
|
{ 'type' => 'MODIFIED', 'resourceVersion' => '1390' },
|
||
|
{ 'type' => 'DELETED', 'resourceVersion' => '1398' }
|
||
|
]
|
||
|
|
||
|
stub_request(:get, %r{/watch/pods})
|
||
|
.to_return(body: open_test_file('watch_stream.json'),
|
||
|
status: 200)
|
||
|
|
||
|
client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
|
||
|
|
||
|
client.watch_pods.to_enum.with_index do |notice, index|
|
||
|
assert_instance_of(Kubeclient::Resource, notice)
|
||
|
assert_equal(expected[index]['type'], notice.type)
|
||
|
assert_equal('Pod', notice.object.kind)
|
||
|
assert_equal('php', notice.object.metadata.name)
|
||
|
assert_equal(expected[index]['resourceVersion'],
|
||
|
notice.object.metadata.resourceVersion)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_watch_pod_block
|
||
|
stub_core_api_list
|
||
|
stub_request(:get, %r{/watch/pods})
|
||
|
.to_return(body: open_test_file('watch_stream.json'),
|
||
|
status: 200)
|
||
|
|
||
|
client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
|
||
|
yielded = []
|
||
|
client.watch_pods { |notice| yielded << notice.type }
|
||
|
|
||
|
assert_equal %w[ADDED MODIFIED DELETED], yielded
|
||
|
end
|
||
|
|
||
|
def test_watch_pod_raw
|
||
|
stub_core_api_list
|
||
|
|
||
|
stub_request(:get, %r{/watch/pods}).to_return(
|
||
|
body: open_test_file('watch_stream.json'),
|
||
|
status: 200
|
||
|
)
|
||
|
|
||
|
client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
|
||
|
|
||
|
got = nil
|
||
|
client.watch_pods(as: :raw).each { |notice| got = notice }
|
||
|
assert_match(/\A{"type":"DELETED"/, got)
|
||
|
end
|
||
|
|
||
|
def test_watch_pod_failure
|
||
|
stub_core_api_list
|
||
|
stub_request(:get, %r{/watch/pods}).to_return(status: 404)
|
||
|
|
||
|
client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
|
||
|
assert_raises(Kubeclient::HttpError) do
|
||
|
client.watch_pods.each do
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_watch_pod_follow_redirect
|
||
|
stub_core_api_list
|
||
|
|
||
|
redirect = 'http://localhost:1234/api/v1/watch/pods'
|
||
|
stub_request(:get, %r{/watch/pods})
|
||
|
.to_return(status: 302, headers: { location: redirect })
|
||
|
|
||
|
stub_request(:get, redirect).to_return(
|
||
|
body: open_test_file('watch_stream.json'),
|
||
|
status: 200
|
||
|
)
|
||
|
|
||
|
client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1')
|
||
|
|
||
|
got = nil
|
||
|
client.watch_pods.each { |notice| got = notice }
|
||
|
assert_equal('DELETED', got.type)
|
||
|
end
|
||
|
|
||
|
def test_watch_pod_max_redirect
|
||
|
stub_core_api_list
|
||
|
|
||
|
redirect = 'http://localhost:1234/api/v1/watcher/pods'
|
||
|
stub_request(:get, %r{/watch/pods})
|
||
|
.to_return(status: 302, headers: { location: redirect })
|
||
|
|
||
|
stub_request(:get, redirect).to_return(
|
||
|
body: open_test_file('watch_stream.json'),
|
||
|
status: 200
|
||
|
)
|
||
|
|
||
|
client = Kubeclient::Client.new('http://localhost:8080/api/', 'v1', http_max_redirects: 0)
|
||
|
|
||
|
assert_raises(Kubeclient::HttpError) do
|
||
|
client.watch_pods.each do
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# Ensure that WatchStream respects a format that's not JSON
|
||
|
def test_watch_stream_text
|
||
|
url = 'http://www.example.com/foobar'
|
||
|
expected_lines = open_test_file('pod_log.txt').read.split("\n")
|
||
|
|
||
|
stub_request(:get, url)
|
||
|
.to_return(body: open_test_file('pod_log.txt'),
|
||
|
status: 200)
|
||
|
|
||
|
stream = Kubeclient::Common::WatchStream.new(URI.parse(url), {}, formatter: ->(v) { v })
|
||
|
stream.to_enum.with_index do |line, index|
|
||
|
assert_instance_of(String, line)
|
||
|
assert_equal(expected_lines[index], line)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_watch_with_resource_version
|
||
|
api_host = 'http://localhost:8080/api'
|
||
|
version = '1995'
|
||
|
stub_core_api_list
|
||
|
stub_request(:get, %r{.*\/watch/events})
|
||
|
.to_return(body: open_test_file('watch_stream.json'),
|
||
|
status: 200)
|
||
|
|
||
|
client = Kubeclient::Client.new(api_host, 'v1')
|
||
|
results = client.watch_events(version).to_enum
|
||
|
|
||
|
assert_equal(3, results.count)
|
||
|
assert_requested(:get,
|
||
|
"#{api_host}/v1/watch/events?resourceVersion=#{version}",
|
||
|
times: 1)
|
||
|
end
|
||
|
|
||
|
def test_watch_with_label_selector
|
||
|
api_host = 'http://localhost:8080/api'
|
||
|
selector = 'name=redis-master'
|
||
|
|
||
|
stub_core_api_list
|
||
|
stub_request(:get, %r{.*\/watch/events})
|
||
|
.to_return(body: open_test_file('watch_stream.json'),
|
||
|
status: 200)
|
||
|
|
||
|
client = Kubeclient::Client.new(api_host, 'v1')
|
||
|
results = client.watch_events(label_selector: selector).to_enum
|
||
|
|
||
|
assert_equal(3, results.count)
|
||
|
assert_requested(:get,
|
||
|
"#{api_host}/v1/watch/events?labelSelector=#{selector}",
|
||
|
times: 1)
|
||
|
end
|
||
|
|
||
|
def test_watch_with_field_selector
|
||
|
api_host = 'http://localhost:8080/api'
|
||
|
selector = 'involvedObject.kind=Pod'
|
||
|
|
||
|
stub_core_api_list
|
||
|
stub_request(:get, %r{.*\/watch/events})
|
||
|
.to_return(body: open_test_file('watch_stream.json'),
|
||
|
status: 200)
|
||
|
|
||
|
client = Kubeclient::Client.new(api_host, 'v1')
|
||
|
results = client.watch_events(field_selector: selector).to_enum
|
||
|
|
||
|
assert_equal(3, results.count)
|
||
|
assert_requested(:get,
|
||
|
"#{api_host}/v1/watch/events?fieldSelector=#{selector}",
|
||
|
times: 1)
|
||
|
end
|
||
|
|
||
|
def test_watch_with_finish_and_ebadf
|
||
|
api_host = 'http://localhost:8080/api'
|
||
|
|
||
|
stub_core_api_list
|
||
|
stub_request(:get, %r{.*\/watch/events})
|
||
|
.to_return(body: open_test_file('watch_stream.json'), status: 200)
|
||
|
|
||
|
client = Kubeclient::Client.new(api_host, 'v1')
|
||
|
watcher = client.watch_events
|
||
|
|
||
|
# explodes when StandardError is not caught
|
||
|
watcher.each do
|
||
|
watcher.finish
|
||
|
raise StandardError
|
||
|
end
|
||
|
|
||
|
assert_requested(:get, "#{api_host}/v1/watch/events", times: 1)
|
||
|
end
|
||
|
end
|