rancher.rb 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.codeclimate.yml +42 -0
- data/.gitignore +14 -0
- data/.ruby-version +1 -0
- data/.travis.yml +16 -0
- data/Gemfile +22 -0
- data/LICENSE.txt +22 -0
- data/README.md +70 -0
- data/Rakefile +6 -0
- data/bin/console +15 -0
- data/bin/setup +7 -0
- data/lib/rancher.rb +32 -0
- data/lib/rancher/arguments.rb +12 -0
- data/lib/rancher/authentication.rb +8 -0
- data/lib/rancher/classify.rb +66 -0
- data/lib/rancher/client.rb +81 -0
- data/lib/rancher/collection.rb +42 -0
- data/lib/rancher/configurable.rb +84 -0
- data/lib/rancher/connection.rb +192 -0
- data/lib/rancher/default.rb +109 -0
- data/lib/rancher/error.rb +241 -0
- data/lib/rancher/middleware/follow_redirects.rb +131 -0
- data/lib/rancher/resource.rb +94 -0
- data/lib/rancher/response/raise_error.rb +21 -0
- data/lib/rancher/type.rb +112 -0
- data/lib/rancher/version.rb +18 -0
- data/rancher.gemspec +23 -0
- data/spec/cassettes/Rancher_Client/_get/handles_headers.json +1 -0
- data/spec/cassettes/Rancher_Client/_head/handles_headers.json +1 -0
- data/spec/cassettes/Rancher_Client/_last_response/caches_the_last_agent_response.json +1 -0
- data/spec/cassettes/root.json +1 -0
- data/spec/helper.rb +120 -0
- data/spec/rancher/client_spec.rb +187 -0
- data/spec/rancher/type_spec.rb +135 -0
- data/spec/rancher_spec.rb +46 -0
- metadata +122 -0
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
# Adapted from lostisland/faraday_middleware. Trimmed down to just the logic
|
5
|
+
# that we need for Rancher.rb.
|
6
|
+
#
|
7
|
+
# https://github.com/lostisland/faraday_middleware/blob/138766e/lib/faraday_middleware/response/follow_redirects.rb
|
8
|
+
|
9
|
+
module Rancher
|
10
|
+
|
11
|
+
module Middleware
|
12
|
+
|
13
|
+
# Public: Exception thrown when the maximum amount of requests is exceeded.
|
14
|
+
class RedirectLimitReached < Faraday::Error::ClientError
|
15
|
+
attr_reader :response
|
16
|
+
|
17
|
+
def initialize(response)
|
18
|
+
super "too many redirects; last one to: #{response['location']}"
|
19
|
+
@response = response
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Public: Follow HTTP 301, 302, 303, and 307 redirects.
|
24
|
+
#
|
25
|
+
# For HTTP 303, the original GET, POST, PUT, DELETE, or PATCH request gets
|
26
|
+
# converted into a GET. For HTTP 301, 302, and 307, the HTTP method remains
|
27
|
+
# unchanged.
|
28
|
+
#
|
29
|
+
# This middleware currently only works with synchronous requests; i.e. it
|
30
|
+
# doesn't support parallelism.
|
31
|
+
class FollowRedirects < Faraday::Middleware
|
32
|
+
# HTTP methods for which 30x redirects can be followed
|
33
|
+
ALLOWED_METHODS = Set.new [:head, :options, :get, :post, :put, :patch, :delete]
|
34
|
+
|
35
|
+
# HTTP redirect status codes that this middleware implements
|
36
|
+
REDIRECT_CODES = Set.new [301, 302, 303, 307]
|
37
|
+
|
38
|
+
# Keys in env hash which will get cleared between requests
|
39
|
+
ENV_TO_CLEAR = Set.new [:status, :response, :response_headers]
|
40
|
+
|
41
|
+
# Default value for max redirects followed
|
42
|
+
FOLLOW_LIMIT = 3
|
43
|
+
|
44
|
+
# Regex that matches characters that need to be escaped in URLs, sans
|
45
|
+
# the "%" character which we assume already represents an escaped
|
46
|
+
# sequence.
|
47
|
+
URI_UNSAFE = /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]%]/
|
48
|
+
|
49
|
+
# Public: Initialize the middleware.
|
50
|
+
#
|
51
|
+
# options - An options Hash (default: {}):
|
52
|
+
# :limit - A Fixnum redirect limit (default: 3).
|
53
|
+
def initialize(app, options = {})
|
54
|
+
super(app)
|
55
|
+
@options = options
|
56
|
+
|
57
|
+
@convert_to_get = Set.new [303]
|
58
|
+
end
|
59
|
+
|
60
|
+
def call(env)
|
61
|
+
perform_with_redirection(env, follow_limit)
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def convert_to_get?(response)
|
67
|
+
![:head, :options].include?(response.env[:method]) &&
|
68
|
+
@convert_to_get.include?(response.status)
|
69
|
+
end
|
70
|
+
|
71
|
+
def perform_with_redirection(env, follows)
|
72
|
+
request_body = env[:body]
|
73
|
+
response = @app.call(env)
|
74
|
+
|
75
|
+
response.on_complete do |response_env|
|
76
|
+
if follow_redirect?(response_env, response)
|
77
|
+
raise(RedirectLimitReached, response) if follows.zero?
|
78
|
+
new_request_env = update_env(response_env, request_body, response)
|
79
|
+
response = perform_with_redirection(new_request_env, follows - 1)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
response
|
83
|
+
end
|
84
|
+
|
85
|
+
def update_env(env, request_body, response)
|
86
|
+
original_url = env[:url]
|
87
|
+
env[:url] += safe_escape(response["location"])
|
88
|
+
unless same_host?(original_url, env[:url])
|
89
|
+
env[:request_headers].delete("Authorization")
|
90
|
+
end
|
91
|
+
|
92
|
+
if convert_to_get?(response)
|
93
|
+
env[:method] = :get
|
94
|
+
env[:body] = nil
|
95
|
+
else
|
96
|
+
env[:body] = request_body
|
97
|
+
end
|
98
|
+
|
99
|
+
ENV_TO_CLEAR.each { |key| env.delete(key) }
|
100
|
+
|
101
|
+
env
|
102
|
+
end
|
103
|
+
|
104
|
+
def follow_redirect?(env, response)
|
105
|
+
ALLOWED_METHODS.include?(env[:method]) &&
|
106
|
+
REDIRECT_CODES.include?(response.status)
|
107
|
+
end
|
108
|
+
|
109
|
+
def follow_limit
|
110
|
+
@options.fetch(:limit, FOLLOW_LIMIT)
|
111
|
+
end
|
112
|
+
|
113
|
+
def same_host?(original_url, redirect_url)
|
114
|
+
original_uri = Addressable::URI.parse(original_url)
|
115
|
+
redirect_uri = Addressable::URI.parse(redirect_url)
|
116
|
+
|
117
|
+
redirect_uri.host.nil? || original_uri.host == redirect_uri.host
|
118
|
+
end
|
119
|
+
|
120
|
+
# Internal: Escapes unsafe characters from a URL which might be a path
|
121
|
+
# component only or a fully-qualified URI so that it can be joined onto a
|
122
|
+
# URI:HTTP using the `+` operator. Doesn't escape "%" characters so to not
|
123
|
+
# risk double-escaping.
|
124
|
+
def safe_escape(uri)
|
125
|
+
uri.to_s.gsub(URI_UNSAFE) { |match|
|
126
|
+
"%" + match.unpack("H2" * match.bytesize).join("%").upcase
|
127
|
+
}
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Rancher
|
2
|
+
# A Rancher Resource
|
3
|
+
class Resource
|
4
|
+
@meta = {}
|
5
|
+
@links = []
|
6
|
+
@actions = []
|
7
|
+
|
8
|
+
attr_reader :links, :meta
|
9
|
+
|
10
|
+
def initialize(body = nil)
|
11
|
+
@meta = {}
|
12
|
+
|
13
|
+
return unless body
|
14
|
+
body.each do |key, val|
|
15
|
+
@links = val if key == :links
|
16
|
+
@actions = val if key == :actions
|
17
|
+
continue if key == :body
|
18
|
+
@meta[key] = val unless key == :links || key == :actions
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def save!
|
23
|
+
Rancher.put get_link('self'), @meta
|
24
|
+
end
|
25
|
+
|
26
|
+
def remove!
|
27
|
+
Rancher.delete get_link('self')
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_link(name)
|
31
|
+
@links[name.to_sym] if @links[name.to_sym]
|
32
|
+
end
|
33
|
+
|
34
|
+
def action?(name)
|
35
|
+
(@actions[name.to_sym])
|
36
|
+
end
|
37
|
+
|
38
|
+
def in_meta?(name)
|
39
|
+
(@meta[name.to_sym])
|
40
|
+
end
|
41
|
+
|
42
|
+
def action(name, *args)
|
43
|
+
if action?(name)
|
44
|
+
opt = args[0] || {}
|
45
|
+
link = @actions[name.to_sym]
|
46
|
+
return Rancher.post link, opt
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def method_missing(method_name, *args, &_block)
|
51
|
+
str_method_name = method_name.to_s
|
52
|
+
if str_method_name.start_with?('fetch')
|
53
|
+
name = str_method_name[6..-1]
|
54
|
+
do_fetch(name, *args)
|
55
|
+
elsif str_method_name.start_with?('get')
|
56
|
+
name = str_method_name[4..-1]
|
57
|
+
if @meta.key?(name.to_sym)
|
58
|
+
## Todo Handle TS return in seconds
|
59
|
+
@meta[name.to_sym]
|
60
|
+
else
|
61
|
+
field = schema_field(name)
|
62
|
+
fail("Attempted to access unknown property '#{name}'") if field.nil?
|
63
|
+
nil
|
64
|
+
end
|
65
|
+
elsif str_method_name.start_with?('set')
|
66
|
+
name = str_method_name[4..-1]
|
67
|
+
@meta[name.to_sym] = args[0]
|
68
|
+
true
|
69
|
+
elsif str_method_name.start_with?('do')
|
70
|
+
name = str_method_name[3..-1]
|
71
|
+
action(name, *args)
|
72
|
+
elsif str_method_name.start_with?('can')
|
73
|
+
name = str_method_name[4..-1]
|
74
|
+
action?(name)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def do_fetch(name, *args)
|
81
|
+
opts = args[0] || {}
|
82
|
+
link = Rancher::Type.list_href(get_link(name), opts)
|
83
|
+
|
84
|
+
Rancher.get link if link
|
85
|
+
end
|
86
|
+
|
87
|
+
def schema_field(name)
|
88
|
+
type_name = get_type
|
89
|
+
type = Rancher.types[type_name.to_sym]
|
90
|
+
|
91
|
+
type.resource_field(name) unless type.nil?
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'rancher/error'
|
3
|
+
|
4
|
+
module Rancher
|
5
|
+
# Faraday response middleware
|
6
|
+
module Response
|
7
|
+
|
8
|
+
# This class raises an Rancher-flavored exception based
|
9
|
+
# HTTP status codes returned by the API
|
10
|
+
class RaiseError < Faraday::Response::Middleware
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def on_complete(response)
|
15
|
+
if error = Rancher::Error.from_response(response)
|
16
|
+
raise error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/rancher/type.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'addressable/uri'
|
2
|
+
|
3
|
+
module Rancher
|
4
|
+
# An Object type inside of Rancher
|
5
|
+
class Type
|
6
|
+
attr_reader :schema
|
7
|
+
|
8
|
+
def initialize(schema)
|
9
|
+
@schema = schema
|
10
|
+
end
|
11
|
+
|
12
|
+
def by_id(id)
|
13
|
+
Rancher.get url(id)
|
14
|
+
end
|
15
|
+
|
16
|
+
def query(filters = {}, sort = {}, pagination = {}, include = {})
|
17
|
+
opts = {
|
18
|
+
filters: filters,
|
19
|
+
sort: sort,
|
20
|
+
pagination: pagination,
|
21
|
+
include: include
|
22
|
+
}
|
23
|
+
|
24
|
+
link = self.class.list_href(url, opts)
|
25
|
+
|
26
|
+
Rancher.get link
|
27
|
+
end
|
28
|
+
|
29
|
+
def create(attrs)
|
30
|
+
attrs = attrs.meta if attrs.is_a?(Rancher::Resource)
|
31
|
+
|
32
|
+
Rancher.post url attrs
|
33
|
+
end
|
34
|
+
|
35
|
+
def remove!(id_or_obj)
|
36
|
+
id = id_or_obj.get_id if id_or_obj.is_a?(Rancher::Resource)
|
37
|
+
|
38
|
+
Rancher.delete url(id)
|
39
|
+
end
|
40
|
+
|
41
|
+
def resource_field(name)
|
42
|
+
if schema.in_meta?('resourceFields')
|
43
|
+
fields = schema.get_resourceFields
|
44
|
+
else
|
45
|
+
fields = schema.get_fields
|
46
|
+
end
|
47
|
+
|
48
|
+
fields[name.to_sym] if fields[name.to_sym]
|
49
|
+
end
|
50
|
+
|
51
|
+
def collection_field(name)
|
52
|
+
fields = @schema.get_collectionFields
|
53
|
+
fields[name.to_sym] if fields[name.to_sym]
|
54
|
+
end
|
55
|
+
|
56
|
+
def url(id = nil)
|
57
|
+
id = "/#{id}" unless id.nil?
|
58
|
+
"#{@schema.get_link('collection')}#{id}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.list_href(url, opts)
|
62
|
+
qs = []
|
63
|
+
opts ||= {}
|
64
|
+
|
65
|
+
uri = Addressable::URI.parse(url) unless url.empty? || url.nil?
|
66
|
+
uri.query_values.each do |key, value|
|
67
|
+
qs.push("#{key}=#{value}")
|
68
|
+
end if uri.query_values
|
69
|
+
|
70
|
+
if opts[:filters]
|
71
|
+
opts[:filters].each do |field, value|
|
72
|
+
qs.push("#{field}=#{value}") unless value.is_a?(Array)
|
73
|
+
|
74
|
+
next unless value.is_a?(Array)
|
75
|
+
|
76
|
+
qs.concat value.map do |val|
|
77
|
+
if val.is_a?(Hash) && (val.key?(:modifier) || val.key?(:value))
|
78
|
+
name = "#{field}"
|
79
|
+
name += "_#{val[:modifier]}" if val.key?(:modifier) && val[:modifier] != '' && val[:modifier] != 'eq'
|
80
|
+
|
81
|
+
str = "#{name}="
|
82
|
+
|
83
|
+
str += "#{val[:value]}" if val.key?(:value)
|
84
|
+
|
85
|
+
str
|
86
|
+
else
|
87
|
+
"#{field}=#{val}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
if opts[:sort] && opts[:sort].key?(:name)
|
94
|
+
qs.push("sort=#{opts[:sort][:name]}")
|
95
|
+
qs.push('order=desc') if opts[:sort].key?(:order) && opts[:sort][:order] == 'desc'
|
96
|
+
end
|
97
|
+
|
98
|
+
if opts[:pagination] && opts[:pagination].key?(:limit)
|
99
|
+
qs.push("limit=#{opts[:pagination][:limit]}")
|
100
|
+
qs.push("marker=#{opts[:pagination][:marker]}") if opts[:pagination].key?(:marker)
|
101
|
+
end
|
102
|
+
|
103
|
+
qs.concat opts[:include].map do |inc|
|
104
|
+
"include=#{inc}"
|
105
|
+
end if opts[:include] && opts[:include].is_a?(Array)
|
106
|
+
|
107
|
+
uri.query = qs.join('&') if qs.size > 0
|
108
|
+
|
109
|
+
uri.to_s
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Set the Gem Version
|
2
|
+
module Rancher
|
3
|
+
# Current major release.
|
4
|
+
# @return [Integer]
|
5
|
+
MAJOR = 0
|
6
|
+
|
7
|
+
# Current minor release.
|
8
|
+
# @return [Integer]
|
9
|
+
MINOR = 1
|
10
|
+
|
11
|
+
# Current patch level.
|
12
|
+
# @return [Integer]
|
13
|
+
PATCH = 0
|
14
|
+
|
15
|
+
# Full release version.
|
16
|
+
# @return [String]
|
17
|
+
VERSION = [MAJOR, MINOR, PATCH].join('.').freeze
|
18
|
+
end
|
data/rancher.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rancher/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'rancher.rb'
|
8
|
+
spec.version = Rancher::VERSION.dup
|
9
|
+
spec.authors = ['Jon Whitcraft']
|
10
|
+
spec.email = ['jwhitcraft@mac.com']
|
11
|
+
spec.summary = %q{Ruby API Client for Rancher}
|
12
|
+
spec.description = %q{Consume the API from Rancher with Ruby!}
|
13
|
+
spec.homepage = 'https://github.com/jwhitcraft/rancher.rb'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
22
|
+
spec.add_dependency 'sawyer', '>= 0.5.3', '~> 0.6.0'
|
23
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"http_interactions":[{"request":{"method":"get","uri":"http://docker.dev:8080/zen?foo=bar","body":{"encoding":"US-ASCII","base64_string":""},"headers":{"Accept":["text/plain"],"User-Agent":["Rancher Ruby Gem 0.1.0"],"Content-Type":["application/json"],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Content-Type":["application/json; charset=utf-8"],"Date":["Thu, 10 Sep 2015 15:24:03 GMT"],"Server":["Jetty(9.2.11.v20150529)"],"Vary":["Accept-Encoding, User-Agent"],"X-Api-Account-Id":["1a1"],"X-Api-Client-Ip":["192.168.99.1"],"X-Api-Schemas":["http://docker.dev:8080/v1/schemas"],"Content-Length":["848"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJpZCI6InYxIiwidHlwZSI6ImFwaVZlcnNpb24iLCJsaW5rcyI6eyJhY2Nv\ndW50cyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvYWNjb3VudHMiLCJh\nZ2VudHMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2FnZW50cyIsImFw\naUtleXMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2FwaWtleXMiLCJj\nZXJ0aWZpY2F0ZXMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2NlcnRp\nZmljYXRlcyIsImNsdXN0ZXJzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92\nMS9jbHVzdGVycyIsImNvbmZpZ0l0ZW1TdGF0dXNlcyI6Imh0dHA6Ly9kb2Nr\nZXIuZGV2OjgwODAvdjEvY29uZmlnaXRlbXN0YXR1c2VzIiwiY29uZmlnSXRl\nbXMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2NvbmZpZ2l0ZW1zIiwi\nY29udGFpbmVyRXZlbnRzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9j\nb250YWluZXJldmVudHMiLCJjb250YWluZXJFeGVjcyI6Imh0dHA6Ly9kb2Nr\nZXIuZGV2OjgwODAvdjEvY29udGFpbmVyZXhlY3MiLCJjb250YWluZXJzIjoi\naHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9jb250YWluZXJzIiwiY3JlZGVu\ndGlhbHMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2NyZWRlbnRpYWxz\nIiwiZGF0YWJhc2VjaGFuZ2Vsb2dsb2NrcyI6Imh0dHA6Ly9kb2NrZXIuZGV2\nOjgwODAvdjEvZGF0YWJhc2VjaGFuZ2Vsb2dsb2NrcyIsImRhdGFiYXNlY2hh\nbmdlbG9ncyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvZGF0YWJhc2Vj\naGFuZ2Vsb2dzIiwiZG5zU2VydmljZXMiOiJodHRwOi8vZG9ja2VyLmRldjo4\nMDgwL3YxL2Ruc3NlcnZpY2VzIiwiZG9ja2VyQnVpbGRzIjoiaHR0cDovL2Rv\nY2tlci5kZXY6ODA4MC92MS9kb2NrZXJidWlsZHMiLCJlbnZpcm9ubWVudHMi\nOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2Vudmlyb25tZW50cyIsImV4\ndGVuc2lvblBvaW50cyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvZXh0\nZW5zaW9ucG9pbnRzIiwiZXh0ZXJuYWxIYW5kbGVyRXh0ZXJuYWxIYW5kbGVy\nUHJvY2Vzc01hcHMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2V4dGVy\nbmFsaGFuZGxlcmV4dGVybmFsaGFuZGxlcnByb2Nlc3NtYXBzIiwiZXh0ZXJu\nYWxIYW5kbGVyUHJvY2Vzc2VzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92\nMS9leHRlcm5hbGhhbmRsZXJwcm9jZXNzZXMiLCJleHRlcm5hbEhhbmRsZXJz\nIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9leHRlcm5hbGhhbmRsZXJz\nIiwiZXh0ZXJuYWxTZXJ2aWNlcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAv\ndjEvZXh0ZXJuYWxzZXJ2aWNlcyIsImdpdGh1YmNvbmZpZ3MiOiJodHRwOi8v\nZG9ja2VyLmRldjo4MDgwL3YxL2dpdGh1YmNvbmZpZ3MiLCJnbG9iYWxMb2Fk\nQmFsYW5jZXJzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9nbG9iYWxs\nb2FkYmFsYW5jZXJzIiwiaG9zdEFjY2Vzc2VzIjoiaHR0cDovL2RvY2tlci5k\nZXY6ODA4MC92MS9ob3N0YWNjZXNzZXMiLCJob3N0QXBpUHJveHlUb2tlbnMi\nOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2hvc3RhcGlwcm94eXRva2Vu\ncyIsImhvc3RzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9ob3N0cyIs\nImlkZW50aXRpZXMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2lkZW50\naXRpZXMiLCJpbWFnZXMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2lt\nYWdlcyIsImluc3RhbmNlTGlua3MiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgw\nL3YxL2luc3RhbmNlbGlua3MiLCJpbnN0YW5jZXMiOiJodHRwOi8vZG9ja2Vy\nLmRldjo4MDgwL3YxL2luc3RhbmNlcyIsImlwQWRkcmVzc2VzIjoiaHR0cDov\nL2RvY2tlci5kZXY6ODA4MC92MS9pcGFkZHJlc3NlcyIsImxhYmVscyI6Imh0\ndHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvbGFiZWxzIiwibGRhcGNvbmZpZ3Mi\nOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2xkYXBjb25maWdzIiwibG9h\nZEJhbGFuY2VyQ29uZmlnTGlzdGVuZXJNYXBzIjoiaHR0cDovL2RvY2tlci5k\nZXY6ODA4MC92MS9sb2FkYmFsYW5jZXJjb25maWdsaXN0ZW5lcm1hcHMiLCJs\nb2FkQmFsYW5jZXJDb25maWdzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92\nMS9sb2FkYmFsYW5jZXJjb25maWdzIiwibG9hZEJhbGFuY2VySG9zdE1hcHMi\nOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL2xvYWRiYWxhbmNlcmhvc3Rt\nYXBzIiwibG9hZEJhbGFuY2VyTGlzdGVuZXJzIjoiaHR0cDovL2RvY2tlci5k\nZXY6ODA4MC92MS9sb2FkYmFsYW5jZXJsaXN0ZW5lcnMiLCJsb2FkQmFsYW5j\nZXJTZXJ2aWNlcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvbG9hZGJh\nbGFuY2Vyc2VydmljZXMiLCJsb2FkQmFsYW5jZXJUYXJnZXRzIjoiaHR0cDov\nL2RvY2tlci5kZXY6ODA4MC92MS9sb2FkYmFsYW5jZXJ0YXJnZXRzIiwibG9h\nZEJhbGFuY2VycyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvbG9hZGJh\nbGFuY2VycyIsIm1hY2hpbmVzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92\nMS9tYWNoaW5lcyIsIm1vdW50cyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAv\ndjEvbW91bnRzIiwibmV0d29ya3MiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgw\nL3YxL25ldHdvcmtzIiwicGh5c2ljYWxIb3N0cyI6Imh0dHA6Ly9kb2NrZXIu\nZGV2OjgwODAvdjEvcGh5c2ljYWxob3N0cyIsInBvcnRzIjoiaHR0cDovL2Rv\nY2tlci5kZXY6ODA4MC92MS9wb3J0cyIsInByb2Nlc3NEZWZpbml0aW9ucyI6\nImh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvY2Vzc2RlZmluaXRpb25z\nIiwicHJvY2Vzc0V4ZWN1dGlvbnMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgw\nL3YxL3Byb2Nlc3NleGVjdXRpb25zIiwicHJvY2Vzc0luc3RhbmNlcyI6Imh0\ndHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvY2Vzc2luc3RhbmNlcyIsInBy\nb2plY3RNZW1iZXJzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9q\nZWN0bWVtYmVycyIsInByb2plY3RzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4\nMC92MS9wcm9qZWN0cyIsInJlZ2lzdGVyIjoiaHR0cDovL2RvY2tlci5kZXY6\nODA4MC92MS9yZWdpc3RlciIsInJlZ2lzdHJhdGlvblRva2VucyI6Imh0dHA6\nLy9kb2NrZXIuZGV2OjgwODAvdjEvcmVnaXN0cmF0aW9udG9rZW5zIiwicmVn\naXN0cmllcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcmVnaXN0cmll\ncyIsInJlZ2lzdHJ5Q3JlZGVudGlhbHMiOiJodHRwOi8vZG9ja2VyLmRldjo4\nMDgwL3YxL3JlZ2lzdHJ5Y3JlZGVudGlhbHMiLCJyZXNvdXJjZURlZmluaXRp\nb25zIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9yZXNvdXJjZWRlZmlu\naXRpb25zIiwic2NoZW1hcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEv\nc2NoZW1hcyIsInNlbGYiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3plbiIs\nInNlcnZpY2VDb25zdW1lTWFwcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAv\ndjEvc2VydmljZWNvbnN1bWVtYXBzIiwic2VydmljZUV2ZW50cyI6Imh0dHA6\nLy9kb2NrZXIuZGV2OjgwODAvdjEvc2VydmljZWV2ZW50cyIsInNlcnZpY2VF\neHBvc2VNYXBzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9zZXJ2aWNl\nZXhwb3NlbWFwcyIsInNlcnZpY2VzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4\nMC92MS9zZXJ2aWNlcyIsInNldHRpbmdzIjoiaHR0cDovL2RvY2tlci5kZXY6\nODA4MC92MS9zZXR0aW5ncyIsInNuYXBzaG90cyI6Imh0dHA6Ly9kb2NrZXIu\nZGV2OjgwODAvdjEvc25hcHNob3RzIiwic3RhdHNBY2Nlc3NlcyI6Imh0dHA6\nLy9kb2NrZXIuZGV2OjgwODAvdjEvc3RhdHNhY2Nlc3NlcyIsInN0b3JhZ2VQ\nb29scyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvc3RvcmFnZXBvb2xz\nIiwidGFza0luc3RhbmNlcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEv\ndGFza2luc3RhbmNlcyIsInRhc2tzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4\nMC92MS90YXNrcyIsInR5cGVEb2N1bWVudGF0aW9ucyI6Imh0dHA6Ly9kb2Nr\nZXIuZGV2OjgwODAvdjEvdHlwZWRvY3VtZW50YXRpb25zIiwidXNlclByZWZl\ncmVuY2VzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS91c2VycHJlZmVy\nZW5jZXMiLCJ2b2x1bWVzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS92\nb2x1bWVzIn0sImFjdGlvbnMiOnt9fQ==\n"},"http_version":null},"recorded_at":"Thu, 10 Sep 2015 15:24:04 GMT"}],"recorded_with":"VCR 2.9.3"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"http_interactions":[{"request":{"method":"head","uri":"http://docker.dev:8080/zen?foo=bar","body":{"encoding":"US-ASCII","base64_string":""},"headers":{"Accept":["text/plain"],"User-Agent":["Rancher Ruby Gem 0.1.0"],"Content-Type":["application/json"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Content-Length":["4162"],"Content-Type":["application/json; charset=utf-8"],"Date":["Thu, 10 Sep 2015 15:24:03 GMT"],"Server":["Jetty(9.2.11.v20150529)"],"X-Api-Account-Id":["1a1"],"X-Api-Client-Ip":["192.168.99.1"],"X-Api-Schemas":["http://docker.dev:8080/v1/schemas"]},"body":{"encoding":"UTF-8","base64_string":""},"http_version":null},"recorded_at":"Thu, 10 Sep 2015 15:24:04 GMT"}],"recorded_with":"VCR 2.9.3"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"http_interactions":[{"request":{"method":"get","uri":"http://docker.dev:8080/","body":{"encoding":"US-ASCII","base64_string":""},"headers":{"Accept":["application/json"],"User-Agent":["Rancher Ruby Gem 0.1.0"],"Content-Type":["application/json"],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Content-Type":["application/json; charset=utf-8"],"Date":["Thu, 10 Sep 2015 15:24:03 GMT"],"Server":["Jetty(9.2.11.v20150529)"],"Vary":["Accept-Encoding, User-Agent"],"X-Api-Account-Id":["1a1"],"X-Api-Client-Ip":["192.168.99.1"],"X-Api-Schemas":["http://docker.dev:8080/v1/schemas"],"Content-Length":["188"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJ0eXBlIjoiY29sbGVjdGlvbiIsInJlc291cmNlVHlwZSI6ImFwaVZlcnNp\nb24iLCJsaW5rcyI6eyJzZWxmIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC8i\nLCJsYXRlc3QiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxIn0sImNyZWF0\nZVR5cGVzIjp7fSwiYWN0aW9ucyI6e30sImRhdGEiOlt7ImlkIjoidjEiLCJ0\neXBlIjoiYXBpVmVyc2lvbiIsImxpbmtzIjp7InNlbGYiOiJodHRwOi8vZG9j\na2VyLmRldjo4MDgwL3YxIn0sImFjdGlvbnMiOnt9fV0sInNvcnRMaW5rcyI6\ne30sInBhZ2luYXRpb24iOm51bGwsInNvcnQiOm51bGwsImZpbHRlcnMiOnt9\nLCJjcmVhdGVEZWZhdWx0cyI6e319\n"},"http_version":null},"recorded_at":"Thu, 10 Sep 2015 15:24:04 GMT"}],"recorded_with":"VCR 2.9.3"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"http_interactions":[{"request":{"method":"get","uri":"http://docker.dev:8080/v1/projects/1a5/","body":{"encoding":"US-ASCII","base64_string":""},"headers":{"Accept":["application/json"],"User-Agent":["Rancher Ruby Gem 0.1.0"],"Content-Type":["application/json"],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Content-Type":["application/json; charset=utf-8"],"Date":["Thu, 10 Sep 2015 15:24:03 GMT"],"Server":["Jetty(9.2.11.v20150529)"],"Vary":["Accept-Encoding, User-Agent"],"X-Api-Account-Id":["1a1"],"X-Api-Client-Ip":["192.168.99.1"],"X-Api-Schemas":["http://docker.dev:8080/v1/schemas"],"Content-Length":["1090"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJpZCI6IjFhNSIsInR5cGUiOiJwcm9qZWN0IiwibGlua3MiOnsic2VsZiI6\nImh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMvMWE1IiwiYWdl\nbnRzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUv\nYWdlbnRzIiwiY2VydGlmaWNhdGVzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4\nMC92MS9wcm9qZWN0cy8xYTUvY2VydGlmaWNhdGVzIiwiY29uZmlnSXRlbVN0\nYXR1c2VzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8x\nYTUvY29uZmlnaXRlbXN0YXR1c2VzIiwiY29udGFpbmVyRXZlbnRzIjoiaHR0\ncDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvY29udGFpbmVy\nZXZlbnRzIiwiY3JlZGVudGlhbHMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgw\nL3YxL3Byb2plY3RzLzFhNS9jcmVkZW50aWFscyIsImVudmlyb25tZW50cyI6\nImh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMvMWE1L2Vudmly\nb25tZW50cyIsImdsb2JhbExvYWRCYWxhbmNlcnMiOiJodHRwOi8vZG9ja2Vy\nLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9nbG9iYWxsb2FkYmFsYW5jZXJz\nIiwiaG9zdHMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3Rz\nLzFhNS9ob3N0cyIsImltYWdlcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAv\ndjEvcHJvamVjdHMvMWE1L2ltYWdlcyIsImluc3RhbmNlTGlua3MiOiJodHRw\nOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9pbnN0YW5jZWxp\nbmtzIiwiaW5zdGFuY2VzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9w\ncm9qZWN0cy8xYTUvaW5zdGFuY2VzIiwiaXBBZGRyZXNzZXMiOiJodHRwOi8v\nZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9pcGFkZHJlc3NlcyIs\nImxhYmVscyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMv\nMWE1L2xhYmVscyIsImxvYWRCYWxhbmNlckNvbmZpZ0xpc3RlbmVyTWFwcyI6\nImh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMvMWE1L2xvYWRi\nYWxhbmNlcmNvbmZpZ2xpc3RlbmVybWFwcyIsImxvYWRCYWxhbmNlckNvbmZp\nZ3MiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9s\nb2FkYmFsYW5jZXJjb25maWdzIiwibG9hZEJhbGFuY2VySG9zdE1hcHMiOiJo\ndHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9sb2FkYmFs\nYW5jZXJob3N0bWFwcyIsImxvYWRCYWxhbmNlckxpc3RlbmVycyI6Imh0dHA6\nLy9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMvMWE1L2xvYWRiYWxhbmNl\ncmxpc3RlbmVycyIsImxvYWRCYWxhbmNlclRhcmdldHMiOiJodHRwOi8vZG9j\na2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9sb2FkYmFsYW5jZXJ0YXJn\nZXRzIiwibG9hZEJhbGFuY2VycyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAv\ndjEvcHJvamVjdHMvMWE1L2xvYWRiYWxhbmNlcnMiLCJtb3VudHMiOiJodHRw\nOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9tb3VudHMiLCJu\nZXR3b3JrcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMv\nMWE1L25ldHdvcmtzIiwicGh5c2ljYWxIb3N0cyI6Imh0dHA6Ly9kb2NrZXIu\nZGV2OjgwODAvdjEvcHJvamVjdHMvMWE1L3BoeXNpY2FsaG9zdHMiLCJwb3J0\ncyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMvMWE1L3Bv\ncnRzIiwicHJvamVjdE1lbWJlcnMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgw\nL3YxL3Byb2plY3RzLzFhNS9wcm9qZWN0bWVtYmVycyIsInNlcnZpY2VDb25z\ndW1lTWFwcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMv\nMWE1L3NlcnZpY2Vjb25zdW1lbWFwcyIsInNlcnZpY2VFdmVudHMiOiJodHRw\nOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9zZXJ2aWNlZXZl\nbnRzIiwic2VydmljZUV4cG9zZU1hcHMiOiJodHRwOi8vZG9ja2VyLmRldjo4\nMDgwL3YxL3Byb2plY3RzLzFhNS9zZXJ2aWNlZXhwb3NlbWFwcyIsInNlcnZp\nY2VzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUv\nc2VydmljZXMiLCJzbmFwc2hvdHMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgw\nL3YxL3Byb2plY3RzLzFhNS9zbmFwc2hvdHMiLCJzdG9yYWdlUG9vbHMiOiJo\ndHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9zdG9yYWdl\ncG9vbHMiLCJ1c2VyUHJlZmVyZW5jZXMiOiJodHRwOi8vZG9ja2VyLmRldjo4\nMDgwL3YxL3Byb2plY3RzLzFhNS91c2VycHJlZmVyZW5jZXMiLCJ2b2x1bWVz\nIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvdm9s\ndW1lcyIsImFjY291bnRzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9w\ncm9qZWN0cy8xYTUvYWNjb3VudHMiLCJhcGlLZXlzIjoiaHR0cDovL2RvY2tl\nci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvYXBpa2V5cyIsImNsdXN0ZXJz\nIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvY2x1\nc3RlcnMiLCJjb25maWdJdGVtcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAv\ndjEvcHJvamVjdHMvMWE1L2NvbmZpZ2l0ZW1zIiwiY29udGFpbmVyRXhlY3Mi\nOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9jb250\nYWluZXJleGVjcyIsImNvbnRhaW5lcnMiOiJodHRwOi8vZG9ja2VyLmRldjo4\nMDgwL3YxL3Byb2plY3RzLzFhNS9jb250YWluZXJzIiwiZGF0YWJhc2VjaGFu\nZ2Vsb2dsb2NrcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVj\ndHMvMWE1L2RhdGFiYXNlY2hhbmdlbG9nbG9ja3MiLCJkYXRhYmFzZWNoYW5n\nZWxvZ3MiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFh\nNS9kYXRhYmFzZWNoYW5nZWxvZ3MiLCJkbnNTZXJ2aWNlcyI6Imh0dHA6Ly9k\nb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMvMWE1L2Ruc3NlcnZpY2VzIiwi\nZG9ja2VyQnVpbGRzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9q\nZWN0cy8xYTUvZG9ja2VyYnVpbGRzIiwiZXh0ZW5zaW9uUG9pbnRzIjoiaHR0\ncDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvZXh0ZW5zaW9u\ncG9pbnRzIiwiZXh0ZXJuYWxIYW5kbGVyRXh0ZXJuYWxIYW5kbGVyUHJvY2Vz\nc01hcHMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFh\nNS9leHRlcm5hbGhhbmRsZXJleHRlcm5hbGhhbmRsZXJwcm9jZXNzbWFwcyIs\nImV4dGVybmFsSGFuZGxlclByb2Nlc3NlcyI6Imh0dHA6Ly9kb2NrZXIuZGV2\nOjgwODAvdjEvcHJvamVjdHMvMWE1L2V4dGVybmFsaGFuZGxlcnByb2Nlc3Nl\ncyIsImV4dGVybmFsSGFuZGxlcnMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgw\nL3YxL3Byb2plY3RzLzFhNS9leHRlcm5hbGhhbmRsZXJzIiwiZXh0ZXJuYWxT\nZXJ2aWNlcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMv\nMWE1L2V4dGVybmFsc2VydmljZXMiLCJnaXRodWJjb25maWdzIjoiaHR0cDov\nL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvZ2l0aHViY29uZmln\ncyIsImhvc3RBY2Nlc3NlcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEv\ncHJvamVjdHMvMWE1L2hvc3RhY2Nlc3NlcyIsImhvc3RBcGlQcm94eVRva2Vu\ncyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMvMWE1L2hv\nc3RhcGlwcm94eXRva2VucyIsImlkZW50aXRpZXMiOiJodHRwOi8vZG9ja2Vy\nLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9pZGVudGl0aWVzIiwibGRhcGNv\nbmZpZ3MiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFh\nNS9sZGFwY29uZmlncyIsImxvYWRCYWxhbmNlclNlcnZpY2VzIjoiaHR0cDov\nL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvbG9hZGJhbGFuY2Vy\nc2VydmljZXMiLCJtYWNoaW5lcyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAv\ndjEvcHJvamVjdHMvMWE1L21hY2hpbmVzIiwicHJvY2Vzc0RlZmluaXRpb25z\nIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvcHJv\nY2Vzc2RlZmluaXRpb25zIiwicHJvY2Vzc0V4ZWN1dGlvbnMiOiJodHRwOi8v\nZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9wcm9jZXNzZXhlY3V0\naW9ucyIsInByb2Nlc3NJbnN0YW5jZXMiOiJodHRwOi8vZG9ja2VyLmRldjo4\nMDgwL3YxL3Byb2plY3RzLzFhNS9wcm9jZXNzaW5zdGFuY2VzIiwicHJvamVj\ndHMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9w\ncm9qZWN0cyIsInJlZ2lzdGVyIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92\nMS9wcm9qZWN0cy8xYTUvcmVnaXN0ZXIiLCJyZWdpc3RyYXRpb25Ub2tlbnMi\nOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS9yZWdp\nc3RyYXRpb250b2tlbnMiLCJyZWdpc3RyaWVzIjoiaHR0cDovL2RvY2tlci5k\nZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvcmVnaXN0cmllcyIsInJlZ2lzdHJ5\nQ3JlZGVudGlhbHMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2pl\nY3RzLzFhNS9yZWdpc3RyeWNyZWRlbnRpYWxzIiwicmVzb3VyY2VEZWZpbml0\naW9ucyI6Imh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMvMWE1\nL3Jlc291cmNlZGVmaW5pdGlvbnMiLCJzY2hlbWFzIjoiaHR0cDovL2RvY2tl\nci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvc2NoZW1hcyIsInNldHRpbmdz\nIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvc2V0\ndGluZ3MiLCJzdGF0c0FjY2Vzc2VzIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4\nMC92MS9wcm9qZWN0cy8xYTUvc3RhdHNhY2Nlc3NlcyIsInRhc2tJbnN0YW5j\nZXMiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS90\nYXNraW5zdGFuY2VzIiwidGFza3MiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgw\nL3YxL3Byb2plY3RzLzFhNS90YXNrcyIsInR5cGVEb2N1bWVudGF0aW9ucyI6\nImh0dHA6Ly9kb2NrZXIuZGV2OjgwODAvdjEvcHJvamVjdHMvMWE1L3R5cGVk\nb2N1bWVudGF0aW9ucyIsImhvc3RTdGF0cyI6Imh0dHA6Ly9kb2NrZXIuZGV2\nOjgwODAvdjEvcHJvamVjdHMvMWE1L3Byb2plY3RzLzFhNS9ob3N0c3RhdHMi\nfSwiYWN0aW9ucyI6eyJ1cGRhdGUiOiJodHRwOi8vZG9ja2VyLmRldjo4MDgw\nL3YxL3Byb2plY3RzLzFhNS8/YWN0aW9uPXVwZGF0ZSIsImRlYWN0aXZhdGUi\nOiJodHRwOi8vZG9ja2VyLmRldjo4MDgwL3YxL3Byb2plY3RzLzFhNS8/YWN0\naW9uPWRlYWN0aXZhdGUiLCJzZXRtZW1iZXJzIjoiaHR0cDovL2RvY2tlci5k\nZXY6ODA4MC92MS9wcm9qZWN0cy8xYTUvP2FjdGlvbj1zZXRtZW1iZXJzIiwi\nZGVsZXRlIjoiaHR0cDovL2RvY2tlci5kZXY6ODA4MC92MS9wcm9qZWN0cy8x\nYTUvP2FjdGlvbj1kZWxldGUifSwibmFtZSI6IkRlZmF1bHQiLCJzdGF0ZSI6\nImFjdGl2ZSIsImNyZWF0ZWQiOiIyMDE1LTA5LTEwVDE1OjEzOjIwWiIsImNy\nZWF0ZWRUUyI6MTQ0MTg5ODAwMDAwMCwiZGF0YSI6eyJmaWVsZHMiOnsiZGVm\nYXVsdE5ldHdvcmtJZCI6NSwiY2FwYWJpbGl0aWVzIjpbIm93bmVyIl19fSwi\nZGVzY3JpcHRpb24iOm51bGwsImtpbmQiOiJwcm9qZWN0IiwibWVtYmVycyI6\nbnVsbCwicmVtb3ZlVGltZSI6bnVsbCwicmVtb3ZlZCI6bnVsbCwidHJhbnNp\ndGlvbmluZyI6Im5vIiwidHJhbnNpdGlvbmluZ01lc3NhZ2UiOm51bGwsInRy\nYW5zaXRpb25pbmdQcm9ncmVzcyI6bnVsbCwidXVpZCI6ImFkbWluUHJvamVj\ndCJ9\n"},"http_version":null},"recorded_at":"Thu, 10 Sep 2015 15:24:04 GMT"}],"recorded_with":"VCR 2.9.3"}
|
data/spec/helper.rb
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
if RUBY_ENGINE == 'ruby'
|
2
|
+
require 'simplecov'
|
3
|
+
require 'coveralls'
|
4
|
+
|
5
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
6
|
+
SimpleCov::Formatter::HTMLFormatter,
|
7
|
+
Coveralls::SimpleCov::Formatter
|
8
|
+
]
|
9
|
+
SimpleCov.start
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'json'
|
13
|
+
require 'rancher'
|
14
|
+
require 'rspec'
|
15
|
+
require 'webmock/rspec'
|
16
|
+
|
17
|
+
WebMock.disable_net_connect!(:allow => 'coveralls.io')
|
18
|
+
|
19
|
+
RSpec.configure do |config|
|
20
|
+
config.raise_errors_for_deprecations!
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'vcr'
|
24
|
+
VCR.configure do |c|
|
25
|
+
c.configure_rspec_metadata!
|
26
|
+
|
27
|
+
c.ignore_request do |request|
|
28
|
+
!!request.headers['X-Vcr-Test-Repo-Setup']
|
29
|
+
end
|
30
|
+
|
31
|
+
c.default_cassette_options = {
|
32
|
+
:serialize_with => :json,
|
33
|
+
# TODO: Track down UTF-8 issue and remove
|
34
|
+
:preserve_exact_body_bytes => true,
|
35
|
+
:decode_compressed_response => true,
|
36
|
+
:record => ENV['TRAVIS'] ? :none : :once
|
37
|
+
}
|
38
|
+
c.cassette_library_dir = 'spec/cassettes'
|
39
|
+
c.hook_into :webmock
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_rancher_api_endpoint
|
43
|
+
ENV.fetch 'RANCHER_TEST_API_ENDPOINT', 'http://localhost:8080/v1/project/1a5'
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_rancher_access_key
|
47
|
+
ENV.fetch 'RANCHER_TEST_ACCESS_KEY', 'x' * 21
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_rancher_secret_key
|
51
|
+
ENV.fetch 'RANCHER_TEST_SECRET_KEY', 'x' * 40
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_client
|
55
|
+
Rancher::Client.new(
|
56
|
+
:api_endpoint => test_rancher_api_endpoint
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
60
|
+
def stub_delete(url)
|
61
|
+
stub_request(:delete, rancher_url(url))
|
62
|
+
end
|
63
|
+
|
64
|
+
def stub_get(url)
|
65
|
+
stub_request(:get, rancher_url(url))
|
66
|
+
end
|
67
|
+
|
68
|
+
def stub_head(url)
|
69
|
+
stub_request(:head, rancher_url(url))
|
70
|
+
end
|
71
|
+
|
72
|
+
def stub_patch(url)
|
73
|
+
stub_request(:patch, rancher_url(url))
|
74
|
+
end
|
75
|
+
|
76
|
+
def stub_post(url)
|
77
|
+
stub_request(:post, rancher_url(url))
|
78
|
+
end
|
79
|
+
|
80
|
+
def stub_put(url)
|
81
|
+
stub_request(:put, rancher_url(url))
|
82
|
+
end
|
83
|
+
|
84
|
+
def fixture_path
|
85
|
+
File.expand_path("../fixtures", __FILE__)
|
86
|
+
end
|
87
|
+
|
88
|
+
def fixture(file)
|
89
|
+
File.new(fixture_path + '/' + file)
|
90
|
+
end
|
91
|
+
|
92
|
+
def json_response(file)
|
93
|
+
{
|
94
|
+
:body => fixture(file),
|
95
|
+
:headers => {
|
96
|
+
:content_type => 'application/json; charset=utf-8'
|
97
|
+
}
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
def rancher_url(url)
|
102
|
+
return url if url =~ /^http/
|
103
|
+
Rancher.configure do |c|
|
104
|
+
c.api_endpoint = test_rancher_api_endpoint
|
105
|
+
end
|
106
|
+
|
107
|
+
url = File.join(Rancher.api_endpoint, url)
|
108
|
+
uri = Addressable::URI.parse(url)
|
109
|
+
uri.path.gsub!("1a5//", "1a5/")
|
110
|
+
|
111
|
+
uri.to_s
|
112
|
+
end
|
113
|
+
|
114
|
+
def use_vcr_placeholder_for(text, replacement)
|
115
|
+
VCR.configure do |c|
|
116
|
+
c.define_cassette_placeholder(replacement) do
|
117
|
+
text
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|