From cec9542493cac1904c94860286338bab60041517 Mon Sep 17 00:00:00 2001 From: nu12 <34694287+nu12@users.noreply.github.com> Date: Tue, 26 Aug 2025 22:42:16 -0400 Subject: [PATCH 1/2] Create variable for API_VERSION --- Rakefile | 2 +- dockerapi.gemspec | 2 +- lib/docker/api/base.rb | 5 +- lib/docker/api/version.rb | 6 +- lib/dockerapi.rb | 10 +++ spec/e2e/e2e_spec.rb | 6 +- spec/endpoints/container_spec.rb | 74 ++++++++++----------- spec/endpoints/exec_spec.rb | 8 +-- spec/endpoints/image_spec.rb | 110 +++++++++++++++---------------- spec/endpoints/network_spec.rb | 36 +++++----- spec/endpoints/node_spec.rb | 20 +++--- spec/endpoints/plugin_spec.rb | 26 ++++---- spec/endpoints/secret_spec.rb | 18 ++--- spec/endpoints/service_spec.rb | 34 +++++----- spec/endpoints/swarm_spec.rb | 22 +++---- spec/endpoints/system_spec.rb | 16 ++--- spec/endpoints/task_spec.rb | 26 ++++---- spec/endpoints/volume_spec.rb | 20 +++--- spec/misc/api_version_spec.rb | 29 ++++++++ 19 files changed, 254 insertions(+), 216 deletions(-) create mode 100644 spec/misc/api_version_spec.rb diff --git a/Rakefile b/Rakefile index 130635d..c529e27 100644 --- a/Rakefile +++ b/Rakefile @@ -6,5 +6,5 @@ RSpec::Core::RakeTask.new(:spec) task :default => :spec task :version do - p "v#{Docker::API::GEM_VERSION}" + p "v#{Docker::API::VERSION}" end \ No newline at end of file diff --git a/dockerapi.gemspec b/dockerapi.gemspec index be1e5fb..a2c878f 100644 --- a/dockerapi.gemspec +++ b/dockerapi.gemspec @@ -2,7 +2,7 @@ require_relative 'lib/docker/api/version' Gem::Specification.new do |spec| spec.name = "dockerapi" - spec.version = Docker::API::GEM_VERSION + spec.version = Docker::API::VERSION spec.authors = ["Alysson A. Costa"] spec.email = ["alysson.avila.costa@gmail.com"] diff --git a/lib/docker/api/base.rb b/lib/docker/api/base.rb index de01cac..0342751 100644 --- a/lib/docker/api/base.rb +++ b/lib/docker/api/base.rb @@ -1,6 +1,8 @@ ## # Base class to provide general methods, helpers and implementations accross classes. class Docker::API::Base + attr_accessor(:api_version) + [:get, :post, :head, :delete, :put].each do | method | define_method(method) { | path, params = {} | self.request(method: method, path: path, params: params) } end @@ -24,6 +26,7 @@ def request params def initialize connection = nil raise StandardError.new("Expected connection to be a Docker::API::Connection class") if connection != nil && !connection.is_a?(Docker::API::Connection) @connection = connection || Docker::API::Connection.new + @api_version = Docker::API.default_api_version end private @@ -91,7 +94,7 @@ def hash_to_params hash # @param path [String]: Base URL string. # @param hash [Hash]: Hash object to be appended to the URL as query parameters. def build_path path, params = {} - path = "/v#{Docker::API::API_VERSION}#{path}" + path = "/v#{@api_version}#{path}" params.size > 0 ? [path, hash_to_params(params)].join("?") : path end diff --git a/lib/docker/api/version.rb b/lib/docker/api/version.rb index 6fd3d28..cc49d59 100644 --- a/lib/docker/api/version.rb +++ b/lib/docker/api/version.rb @@ -1,9 +1,5 @@ module Docker module API - GEM_VERSION = "0.22.1" - - API_VERSION = "1.43" - - VERSION = "Gem: #{Docker::API::GEM_VERSION} | API: #{Docker::API::API_VERSION}" + VERSION = "0.22.1" end end diff --git a/lib/dockerapi.rb b/lib/dockerapi.rb index a99fbf3..ea04db0 100644 --- a/lib/dockerapi.rb +++ b/lib/dockerapi.rb @@ -43,6 +43,16 @@ def self.print_response_to_stdout=(bool) @@print_response_to_stdout = bool end self.print_response_to_stdout = false + + ## + # This variable controls the default Docker API version. + def self.default_api_version + @@default_api_version + end + def self.default_api_version=(s) + @@default_api_version = s + end + self.default_api_version = "1.43" end end diff --git a/spec/e2e/e2e_spec.rb b/spec/e2e/e2e_spec.rb index b1caeab..c76bb24 100644 --- a/spec/e2e/e2e_spec.rb +++ b/spec/e2e/e2e_spec.rb @@ -17,15 +17,15 @@ it { expect(system.info.status).to eq(200) } it { expect(system.info.success?).to eq(true) } it { expect(system.info.json).to be_kind_of(Hash) } - it { expect(system.info.path).to eq("/v#{Docker::API::API_VERSION}/info") } + it { expect(system.info.path).to eq("/v#{Docker::API.default_api_version}/info") } it { expect(system.version.status).to eq(200) } it { expect(system.version.success?).to eq(true) } it { expect(system.version.json).to be_kind_of(Hash) } - it { expect(system.version.path).to eq("/v#{Docker::API::API_VERSION}/version") } + it { expect(system.version.path).to eq("/v#{Docker::API.default_api_version}/version") } it { expect(system.df.status).to eq(200) } it { expect(system.df.success?).to eq(true) } it { expect(system.df.json).to be_kind_of(Hash) } - it { expect(system.df.path).to eq("/v#{Docker::API::API_VERSION}/system/df") } + it { expect(system.df.path).to eq("/v#{Docker::API.default_api_version}/system/df") } end describe "Misc of requests that are expected to fail" do diff --git a/spec/endpoints/container_spec.rb b/spec/endpoints/container_spec.rb index dbd0c4e..c75f3c6 100644 --- a/spec/endpoints/container_spec.rb +++ b/spec/endpoints/container_spec.rb @@ -32,14 +32,14 @@ before(:all) { Excon.stub({ :scheme => 'http', :host => '127.0.0.1', :method => :get, :port => 2375 }, {headers: {'Content-Type': 'application/json'}, body: '[]', status: 200 }) } after(:all) { Excon.unstub({ :method => :get }) } it { expect(subject.list.json).to be_kind_of(Array) } - it { expect(subject.list( { all: true, filters: {name: {"test": true}} } ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/json?all=true&filters={\"name\":{\"test\":true}}") } - it { expect(subject.list( { all: true, filters: {exited: {"0": true} } } ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/json?all=true&filters={\"exited\":{\"0\":true}}") } - it { expect(subject.list( { all: true, filters: {status: ["running"] } } ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/json?all=true&filters={\"status\":[\"running\"]}") } + it { expect(subject.list( { all: true, filters: {name: {"test": true}} } ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/json?all=true&filters={\"name\":{\"test\":true}}") } + it { expect(subject.list( { all: true, filters: {exited: {"0": true} } } ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/json?all=true&filters={\"exited\":{\"0\":true}}") } + it { expect(subject.list( { all: true, filters: {status: ["running"] } } ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/json?all=true&filters={\"status\":[\"running\"]}") } it { expect { subject.list( { invalid: "invalid" } ) }.not_to raise_error } end describe ".create" do - it { expect(subject.create({name: "dockerapi", platform: "linux/amd64"}, {Image: "nginx"}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/create?name=dockerapi&platform=linux/amd64") } + it { expect(subject.create({name: "dockerapi", platform: "linux/amd64"}, {Image: "nginx"}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/create?name=dockerapi&platform=linux/amd64") } it { expect(subject.create({name: "dockerapi", platform: "linux/amd64"}, {Image: "nginx"}).request_params[:method]).to eq(:post) } it { expect(subject.create({name: "dockerapi", platform: "linux/amd64"}, {Image: "nginx"}).request_params[:body]).to eq('{"Image":"nginx"}') } it { expect{subject.remove({invalid: "invalid", platform: "linux/amd64"}, {Image: "nginx"})}.not_to raise_error } @@ -47,76 +47,76 @@ end describe ".remove" do - it { expect(subject.remove("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi") } + it { expect(subject.remove("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi") } it { expect(subject.remove("dockerapi").request_params[:method]).to eq(:delete) } - it { expect(subject.remove("dockerapi", {v: true}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi?v=true") } - it { expect(subject.remove("dockerapi", {force: true}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi?force=true") } + it { expect(subject.remove("dockerapi", {v: true}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi?v=true") } + it { expect(subject.remove("dockerapi", {force: true}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi?force=true") } it { expect{subject.remove("dockerapi", {invalid: "invalid"})}.not_to raise_error } end describe ".start" do - it { expect(subject.start("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/start") } - it { expect(subject.start("dockerapi", {detachKeys: "ctrl-c"}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/start?detachKeys=ctrl-c") } + it { expect(subject.start("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/start") } + it { expect(subject.start("dockerapi", {detachKeys: "ctrl-c"}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/start?detachKeys=ctrl-c") } it { expect(subject.start("dockerapi").request_params[:method]).to eq(:post) } it { expect{subject.start("dockerapi", {invalid: "invalid"})}.not_to raise_error } end describe ".stop" do - it { expect(subject.stop("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/stop") } - it { expect(subject.stop("dockerapi", {signal: "SIGINT"}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/stop?signal=SIGINT") } + it { expect(subject.stop("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/stop") } + it { expect(subject.stop("dockerapi", {signal: "SIGINT"}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/stop?signal=SIGINT") } it { expect(subject.stop("dockerapi").request_params[:method]).to eq(:post) } it { expect{subject.stop("dockerapi", {invalid: "invalid"})}.not_to raise_error } end describe ".kill" do - it { expect(subject.kill("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/kill") } - it { expect(subject.kill("dockerapi", {signal: "SIGINT"}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/kill?signal=SIGINT") } + it { expect(subject.kill("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/kill") } + it { expect(subject.kill("dockerapi", {signal: "SIGINT"}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/kill?signal=SIGINT") } it { expect(subject.kill("dockerapi").request_params[:method]).to eq(:post) } it { expect{subject.kill("dockerapi", {invalid: "invalid"})}.not_to raise_error } end describe ".restart" do - it { expect(subject.restart("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/restart") } - it { expect(subject.restart("dockerapi", {signal: "SIGINT"}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/restart?signal=SIGINT") } + it { expect(subject.restart("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/restart") } + it { expect(subject.restart("dockerapi", {signal: "SIGINT"}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/restart?signal=SIGINT") } it { expect(subject.restart("dockerapi").request_params[:method]).to eq(:post) } it { expect{subject.restart("dockerapi", {invalid: "invalid"})}.not_to raise_error } end describe ".pause" do - it { expect(subject.pause("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/pause") } + it { expect(subject.pause("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/pause") } end describe ".unpause" do - it { expect(subject.unpause("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/unpause") } + it { expect(subject.unpause("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/unpause") } end describe ".top" do before(:all) { Excon.stub({ :scheme => 'http', :host => '127.0.0.1', :method => :get, :port => 2375 }, { headers: {'Content-Type': 'application/json'}, body: '{}', status: 200 }) } after(:all) { Excon.unstub({ :method => :get }) } - it { expect(subject.top("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/top") } + it { expect(subject.top("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/top") } it { expect(subject.top("dockerapi").request_params[:method]).to eq(:get) } it { expect(subject.top("dockerapi").json).to be_kind_of(Hash) } it { expect{subject.top("dockerapi", {invalid_value: "invalid"})}.not_to raise_error } end describe ".wait" do - it { expect(subject.wait("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/wait") } + it { expect(subject.wait("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/wait") } it { expect(subject.wait("dockerapi").request_params[:method]).to eq(:post) } end describe ".get_archive" do - it { expect(subject.get_archive("dockerapi", "~/archive.tar", { path: "/usr/share/nginx/html/" }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/archive?path=/usr/share/nginx/html/") } + it { expect(subject.get_archive("dockerapi", "~/archive.tar", { path: "/usr/share/nginx/html/" }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/archive?path=/usr/share/nginx/html/") } it { expect(subject.get_archive("dockerapi", "~/archive.tar", { path: "/usr/share/nginx/html/" }).request_params[:method]).to eq(:get) } end describe ".put_archive" do - it { expect(subject.put_archive("dockerapi", "~/archive.tar", { path: "/home" }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/archive?path=/home") } + it { expect(subject.put_archive("dockerapi", "~/archive.tar", { path: "/home" }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/archive?path=/home") } it { expect(subject.put_archive("dockerapi", "~/archive.tar", { path: "/home" }).request_params[:method]).to eq(:put) } end describe ".resize" do - it { expect(subject.resize("dockerapi", {h: 100, w: 100}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/resize?h=100&w=100") } + it { expect(subject.resize("dockerapi", {h: 100, w: 100}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/resize?h=100&w=100") } it { expect(subject.resize("dockerapi", {h: 100, w: 100}).request_params[:method]).to eq(:post) } it { expect{subject.resize("dockerapi", {invalid: "invalid"})}.not_to raise_error } end @@ -124,34 +124,34 @@ describe ".details" do before(:all) { Excon.stub({ :scheme => 'http', :host => '127.0.0.1', :method => :get, :port => 2375 }, { headers: {'Content-Type': 'application/json'}, body: '{"Name":"/dockerapi"}', status: 200 }) } after(:all) { Excon.unstub({ :method => :get }) } - it { expect(subject.details("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/json") } - it { expect(subject.details("dockerapi", {size: true}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/json?size=true") } + it { expect(subject.details("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/json") } + it { expect(subject.details("dockerapi", {size: true}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/json?size=true") } it { expect(subject.details("dockerapi").request_params[:method]).to eq(:get) } it { expect(subject.details("dockerapi").body).to match(/\"Name\":\"\/dockerapi\"/) } it { expect{subject.details("dockerapi", {invalid_value: "invalid"})}.not_to raise_error } end describe ".logs" do - it { expect(subject.logs("dockerapi", {stdout: true}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/logs?stdout=true") } - it { expect(subject.logs("dockerapi", {stderr: true}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/logs?stderr=true") } - it { expect(subject.logs("dockerapi", {follow: false, stdout: true, stderr: true}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/logs?follow=false&stdout=true&stderr=true") } - it { expect(subject.logs("dockerapi", {stdout: true, since: 0}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/logs?stdout=true&since=0") } - it { expect(subject.logs("dockerapi", {stdout: true, until: 999999999}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/logs?stdout=true&until=999999999") } - it { expect(subject.logs("dockerapi", {stdout: true, timestamps: true}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/logs?stdout=true×tamps=true") } - it { expect(subject.logs("dockerapi", {stdout: true, tail: "all"}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/logs?stdout=true&tail=all") } + it { expect(subject.logs("dockerapi", {stdout: true}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/logs?stdout=true") } + it { expect(subject.logs("dockerapi", {stderr: true}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/logs?stderr=true") } + it { expect(subject.logs("dockerapi", {follow: false, stdout: true, stderr: true}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/logs?follow=false&stdout=true&stderr=true") } + it { expect(subject.logs("dockerapi", {stdout: true, since: 0}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/logs?stdout=true&since=0") } + it { expect(subject.logs("dockerapi", {stdout: true, until: 999999999}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/logs?stdout=true&until=999999999") } + it { expect(subject.logs("dockerapi", {stdout: true, timestamps: true}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/logs?stdout=true×tamps=true") } + it { expect(subject.logs("dockerapi", {stdout: true, tail: "all"}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/logs?stdout=true&tail=all") } it { expect{subject.logs("dockerapi", {invalid_value: "invalid"})}.not_to raise_error } end describe ".changes" do before(:all) { Excon.stub({ :scheme => 'http', :host => '127.0.0.1', :method => :get, :port => 2375 }, { headers: {'Content-Type': 'application/json'}, body: '[]', status: 200 }) } after(:all) { Excon.unstub({ :method => :get }) } - it { expect(subject.changes("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/changes") } + it { expect(subject.changes("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/changes") } it { expect(subject.changes("dockerapi").request_params[:method]).to eq(:get) } it { expect(subject.changes("dockerapi").json).to be_kind_of(Array) } end describe ".stats" do - it { expect(subject.stats("dockerapi", {stream: false}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/stats?stream=false") } + it { expect(subject.stats("dockerapi", {stream: false}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/stats?stream=false") } it { expect(subject.stats("dockerapi", {stream: false}).request_params[:method]).to eq(:get) } it { expect{subject.stats("dockerapi", {invalid_value: "invalid"})}.not_to raise_error } end @@ -168,19 +168,19 @@ end describe ".update" do - it { expect(subject.update("dockerapi", {RestartPolicy: {Name: "unless-stopped"}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/update") } + it { expect(subject.update("dockerapi", {RestartPolicy: {Name: "unless-stopped"}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/update") } it { expect(subject.update("dockerapi", {RestartPolicy: {Name: "unless-stopped"}}).request_params[:method]).to eq(:post) } it { expect(subject.update("dockerapi", {RestartPolicy: {Name: "unless-stopped"}}).request_params[:body]).to eq('{"RestartPolicy":{"Name":"unless-stopped"}}') } it { expect{subject.update("dockerapi", {invalid: "invalid"})}.not_to raise_error } end describe ".rename" do - it { expect(subject.rename("dockerapi", {name: "new_name"}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/rename?name=new_name") } + it { expect(subject.rename("dockerapi", {name: "new_name"}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/rename?name=new_name") } it { expect(subject.rename("dockerapi", {name: "new_name"}).request_params[:method]).to eq(:post) } end describe ".attach" do - it { expect(subject.attach("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/attach") } + it { expect(subject.attach("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/attach") } it { expect(subject.attach("dockerapi").request_params[:method]).to eq(:post) } it { expect{subject.attach("dockerapi", {invalid: "invalid"})}.not_to raise_error } end @@ -189,7 +189,7 @@ before(:all) { Excon.stub({ :scheme => 'http', :host => '127.0.0.1', :method => :post, :port => 2375 }, { headers: {'Content-Type': 'application/json'}, body: '{}', status: 200 }) } after(:all) { Excon.unstub({ :method => :post }) } - it { expect(subject.prune.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/prune") } + it { expect(subject.prune.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/prune") } it { expect(subject.prune.request_params[:method]).to eq(:post) } it { expect(subject.prune.json).to be_kind_of(Hash) } it { expect{subject.prune( {invalid: "invalid"})}.not_to raise_error } diff --git a/spec/endpoints/exec_spec.rb b/spec/endpoints/exec_spec.rb index d34254f..a498de2 100644 --- a/spec/endpoints/exec_spec.rb +++ b/spec/endpoints/exec_spec.rb @@ -11,25 +11,25 @@ after(:all) { Excon.stubs.clear } describe ".create" do - it { expect(subject.create("dockerapi", Cmd: ["ls", "-l"]).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/containers/dockerapi/exec") } + it { expect(subject.create("dockerapi", Cmd: ["ls", "-l"]).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/dockerapi/exec") } it { expect(subject.create("dockerapi", Cmd: ["ls", "-l"]).request_params[:method]).to eq(:post) } it { expect(subject.create("dockerapi", Cmd: ["ls", "-l"]).request_params[:body]).to eq('{"Cmd":["ls","-l"]}') } it { expect(subject.create("dockerapi", AttachStdout:true, WorkingDir: "/etc", Cmd: ["ls", "-l"]).request_params[:body]).to eq('{"AttachStdout":true,"WorkingDir":"/etc","Cmd":["ls","-l"]}') } end describe ".start" do - it { expect(subject.start("id").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/exec/id/start") } + it { expect(subject.start("id").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/exec/id/start") } it { expect(subject.start("id").request_params[:method]).to eq(:post) } it { expect(subject.start("id").request_params[:body]).to eq("{}") } end describe ".resize" do - it { expect(subject.resize("id").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/exec/id/resize") } + it { expect(subject.resize("id").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/exec/id/resize") } it { expect(subject.resize("id").request_params[:method]).to eq(:post) } end describe ".details" do - it { expect(subject.details("id").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/exec/id/json") } + it { expect(subject.details("id").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/exec/id/json") } it { expect(subject.details("id").request_params[:method]).to eq(:get) } end end diff --git a/spec/endpoints/image_spec.rb b/spec/endpoints/image_spec.rb index 4b0e789..cb16640 100644 --- a/spec/endpoints/image_spec.rb +++ b/spec/endpoints/image_spec.rb @@ -22,64 +22,64 @@ after(:all) { Excon.stubs.clear } describe ".details" do - it { expect(subject.details("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/dockerapi/json") } + it { expect(subject.details("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/dockerapi/json") } it { expect(subject.details("dockerapi").request_params[:method]).to eq(:get) } end describe ".distribution" do - it { expect(subject.distribution("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/distribution/dockerapi/json") } + it { expect(subject.distribution("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/distribution/dockerapi/json") } it { expect(subject.distribution("dockerapi", { username: "docker", password: "api" }).request_params[:headers]["X-Registry-Auth"]).to eq("eyJ1c2VybmFtZSI6ImRvY2tlciIsInBhc3N3b3JkIjoiYXBpIn0=") } it { expect(subject.distribution("dockerapi").request_params[:method]).to eq(:get) } end describe ".history" do - it { expect(subject.history("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/dockerapi/history") } + it { expect(subject.history("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/dockerapi/history") } it { expect(subject.history("dockerapi").request_params[:method]).to eq(:get) } end describe ".list" do - it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/json") } + it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/json") } it { expect(subject.list.request_params[:method]).to eq(:get) } - it { expect(subject.list(all: true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/json?all=true") } - it { expect(subject.list(all: true, "shared-size": true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/json?all=true&shared-size=true") } - it { expect(subject.list(digests: true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/json?digests=true") } - it { expect(subject.list(all: true, digests: true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/json?all=true&digests=true") } - it { expect(subject.list(all: true, filters: {dangling: {"true": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/json?all=true&filters={\"dangling\":{\"true\":true}}") } - it { expect(subject.list(all: true, filters: {label: {"label-here": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/json?all=true&filters={\"label\":{\"label-here\":true}}") } - it { expect(subject.list(all: true, filters: {reference: {"nginx": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/json?all=true&filters={\"reference\":{\"nginx\":true}}") } - it { expect(subject.list(all: true, filters: {before: {"nginx": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/json?all=true&filters={\"before\":{\"nginx\":true}}") } - it { expect(subject.list(all: true, filters: {since: {"nginx": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/json?all=true&filters={\"since\":{\"nginx\":true}}") } + it { expect(subject.list(all: true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/json?all=true") } + it { expect(subject.list(all: true, "shared-size": true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/json?all=true&shared-size=true") } + it { expect(subject.list(digests: true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/json?digests=true") } + it { expect(subject.list(all: true, digests: true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/json?all=true&digests=true") } + it { expect(subject.list(all: true, filters: {dangling: {"true": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/json?all=true&filters={\"dangling\":{\"true\":true}}") } + it { expect(subject.list(all: true, filters: {label: {"label-here": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/json?all=true&filters={\"label\":{\"label-here\":true}}") } + it { expect(subject.list(all: true, filters: {reference: {"nginx": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/json?all=true&filters={\"reference\":{\"nginx\":true}}") } + it { expect(subject.list(all: true, filters: {before: {"nginx": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/json?all=true&filters={\"before\":{\"nginx\":true}}") } + it { expect(subject.list(all: true, filters: {since: {"nginx": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/json?all=true&filters={\"since\":{\"nginx\":true}}") } end describe ".search" do - it { expect(subject.search.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/search") } + it { expect(subject.search.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/search") } it { expect(subject.search.request_params[:method]).to eq(:get) } - it { expect(subject.search(term: "busybox").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/search?term=busybox") } - it { expect(subject.search(term: "busybox", limit: 2).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/search?term=busybox&limit=2") } - it { expect(subject.search(term: "busybox", filters: {"is-automated": {"true": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/search?term=busybox&filters={\"is-automated\":{\"true\":true}}") } - it { expect(subject.search(term: "busybox", filters: {"is-official": {"true": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/search?term=busybox&filters={\"is-official\":{\"true\":true}}") } - it { expect(subject.search(term: "busybox", filters: {stars: {"20": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/search?term=busybox&filters={\"stars\":{\"20\":true}}") } + it { expect(subject.search(term: "busybox").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/search?term=busybox") } + it { expect(subject.search(term: "busybox", limit: 2).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/search?term=busybox&limit=2") } + it { expect(subject.search(term: "busybox", filters: {"is-automated": {"true": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/search?term=busybox&filters={\"is-automated\":{\"true\":true}}") } + it { expect(subject.search(term: "busybox", filters: {"is-official": {"true": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/search?term=busybox&filters={\"is-official\":{\"true\":true}}") } + it { expect(subject.search(term: "busybox", filters: {stars: {"20": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/search?term=busybox&filters={\"stars\":{\"20\":true}}") } it { expect{subject.search(invalid: "invalid")}.not_to raise_error } end describe ".tag" do - it { expect(subject.tag("dockerapi").request_params[:path]).to eq ("/v#{Docker::API::API_VERSION}/images/dockerapi/tag") } - it { expect(subject.tag("dockerapi", repo: "dockerapi/tag:1").request_params[:path]).to eq ("/v#{Docker::API::API_VERSION}/images/dockerapi/tag?repo=dockerapi/tag:1") } - it { expect(subject.tag("dockerapi", repo: "dockerapi/tag", tag: "2").request_params[:path]).to eq ("/v#{Docker::API::API_VERSION}/images/dockerapi/tag?repo=dockerapi/tag&tag=2") } + it { expect(subject.tag("dockerapi").request_params[:path]).to eq ("/v#{Docker::API.default_api_version}/images/dockerapi/tag") } + it { expect(subject.tag("dockerapi", repo: "dockerapi/tag:1").request_params[:path]).to eq ("/v#{Docker::API.default_api_version}/images/dockerapi/tag?repo=dockerapi/tag:1") } + it { expect(subject.tag("dockerapi", repo: "dockerapi/tag", tag: "2").request_params[:path]).to eq ("/v#{Docker::API.default_api_version}/images/dockerapi/tag?repo=dockerapi/tag&tag=2") } it { expect{subject.tag("dockerapi", invalid: "invalid")}.not_to raise_error } end describe ".prune" do - it { expect(subject.prune.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/prune") } + it { expect(subject.prune.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/prune") } it { expect(subject.prune.request_params[:method]).to eq(:post) } - it { expect(subject.prune(filters: {dangling: {"true": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/prune?filters={\"dangling\":{\"true\":true}}") } - it { expect(subject.prune(filters: {dangling: {"1": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/prune?filters={\"dangling\":{\"1\":true}}") } - it { expect(subject.prune(filters: {until: {"10m": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/prune?filters={\"until\":{\"10m\":true}}") } - it { expect(subject.prune(filters: {label: {"LABEL": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/prune?filters={\"label\":{\"LABEL\":true}}") } - it { expect(subject.prune(filters: {label: {"LABEL": true}, dangling: {"1": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/prune?filters={\"label\":{\"LABEL\":true},\"dangling\":{\"1\":true}}") } + it { expect(subject.prune(filters: {dangling: {"true": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/prune?filters={\"dangling\":{\"true\":true}}") } + it { expect(subject.prune(filters: {dangling: {"1": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/prune?filters={\"dangling\":{\"1\":true}}") } + it { expect(subject.prune(filters: {until: {"10m": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/prune?filters={\"until\":{\"10m\":true}}") } + it { expect(subject.prune(filters: {label: {"LABEL": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/prune?filters={\"label\":{\"LABEL\":true}}") } + it { expect(subject.prune(filters: {label: {"LABEL": true}, dangling: {"1": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/prune?filters={\"label\":{\"LABEL\":true},\"dangling\":{\"1\":true}}") } end describe ".remove" do - it { expect(subject.remove("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/dockerapi") } + it { expect(subject.remove("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/dockerapi") } it { expect(subject.remove("dockerapi").request_params[:method]).to eq(:delete) } - it { expect(subject.remove("dockerapi", force: true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/dockerapi?force=true") } - it { expect(subject.remove("dockerapi", noprune: false).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/dockerapi?noprune=false") } + it { expect(subject.remove("dockerapi", force: true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/dockerapi?force=true") } + it { expect(subject.remove("dockerapi", noprune: false).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/dockerapi?noprune=false") } it { expect{subject.remove("dockerapi", invalid: "invalid")}.not_to raise_error } end describe ".export" do @@ -102,14 +102,14 @@ File.delete(File.expand_path("import.tar")) end - it { expect(subject.import("import.tar").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/load") } - it { expect(subject.import("import.tar", quiet: true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/load?quiet=true") } + it { expect(subject.import("import.tar").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/load") } + it { expect(subject.import("import.tar", quiet: true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/load?quiet=true") } it { expect(subject.import("import.tar", quiet: true).request_params[:method]).to eq(:post) } it { expect(subject.import("import.tar", quiet: true).request_params[:headers]["Content-Type"]).to eq("application/x-tar") } it { expect{subject.import("import.tar", invalid: "invalid")}.not_to raise_error } end describe ".push" do - it { expect(subject.push("localhost:5000/dockerapi", {},{username: "janedoe", password: "password"}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/localhost:5000/dockerapi/push") } + it { expect(subject.push("localhost:5000/dockerapi", {},{username: "janedoe", password: "password"}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/localhost:5000/dockerapi/push") } it { expect(subject.push("localhost:5000/dockerapi", {},{username: "janedoe", password: "password"}).request_params[:method]).to eq(:post) } it { expect(subject.push("localhost:5000/dockerapi", {},{username: "janedoe", password: "password"}).request_params[:headers]["X-Registry-Auth"]).to eq("eyJ1c2VybmFtZSI6ImphbmVkb2UiLCJwYXNzd29yZCI6InBhc3N3b3JkIn0=") } it { expect{subject.push("localhost:5000/push:1")}.to raise_error(StandardError, "Provide authentication parameters to push an image") } @@ -117,16 +117,16 @@ describe ".commit" do before(:all) { Excon.stub({ :scheme => 'http', :host => '127.0.0.1', :method => :get, :port => 2375 }, { headers: {'Content-Type': 'application/json'}, body: '{"Config": {}}', status: 200 }) } after(:all) { Excon.unstub({ :method => :get }) } - it { expect(subject.commit(container: "dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/commit?container=dockerapi") } + it { expect(subject.commit(container: "dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/commit?container=dockerapi") } it { expect(subject.commit(container: "dockerapi").request_params[:method]).to eq(:post) } it { expect(subject.commit(container: "dockerapi").request_params[:body]).to eq("{}") } - it { expect(subject.commit(container: "dockerapi", repo: "dockerapi/dockerapi:1" ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/commit?container=dockerapi&repo=dockerapi/dockerapi:1") } - it { expect(subject.commit(container: "dockerapi", repo: "dockerapi/dockerapi", tag: "2" ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/commit?container=dockerapi&repo=dockerapi/dockerapi&tag=2") } - it { expect(subject.commit(container: "dockerapi", repo: "dockerapi/dockerapi", tag: "3", comment: "Comment from commit" ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/commit?container=dockerapi&repo=dockerapi/dockerapi&tag=3&comment=Commentfromcommit") } - it { expect(subject.commit(container: "dockerapi", repo: "dockerapi/dockerapi", tag: "4", author: "dockerapi" ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/commit?container=dockerapi&repo=dockerapi/dockerapi&tag=4&author=dockerapi") } - it { expect(subject.commit(container: "dockerapi", repo: "dockerapi/dockerapi", tag: "5", pause: false ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/commit?container=dockerapi&repo=dockerapi/dockerapi&tag=5&pause=false") } - it { expect(subject.commit({container: "dockerapi", repo: "dockerapi/dockerapi:6"}, {OpenStdin: false, Cmd: "echo dockerapi", Entrypoint: [""]} ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/commit?container=dockerapi&repo=dockerapi/dockerapi:6") } + it { expect(subject.commit(container: "dockerapi", repo: "dockerapi/dockerapi:1" ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/commit?container=dockerapi&repo=dockerapi/dockerapi:1") } + it { expect(subject.commit(container: "dockerapi", repo: "dockerapi/dockerapi", tag: "2" ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/commit?container=dockerapi&repo=dockerapi/dockerapi&tag=2") } + it { expect(subject.commit(container: "dockerapi", repo: "dockerapi/dockerapi", tag: "3", comment: "Comment from commit" ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/commit?container=dockerapi&repo=dockerapi/dockerapi&tag=3&comment=Commentfromcommit") } + it { expect(subject.commit(container: "dockerapi", repo: "dockerapi/dockerapi", tag: "4", author: "dockerapi" ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/commit?container=dockerapi&repo=dockerapi/dockerapi&tag=4&author=dockerapi") } + it { expect(subject.commit(container: "dockerapi", repo: "dockerapi/dockerapi", tag: "5", pause: false ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/commit?container=dockerapi&repo=dockerapi/dockerapi&tag=5&pause=false") } + it { expect(subject.commit({container: "dockerapi", repo: "dockerapi/dockerapi:6"}, {OpenStdin: false, Cmd: "echo dockerapi", Entrypoint: [""]} ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/commit?container=dockerapi&repo=dockerapi/dockerapi:6") } it { expect(subject.commit({container: "dockerapi", repo: "dockerapi/dockerapi:6"}, {OpenStdin: false, Cmd: "echo dockerapi", Entrypoint: [""]} ).request_params[:body]).to eq("{\"OpenStdin\":false,\"Cmd\":\"echo dockerapi\",\"Entrypoint\":[\"\"]}") } it { expect{subject.commit(invalid: "invalid")}.not_to raise_error } it { expect{subject.commit({invalid: "invalid"}, {invalid: "invalid"})}.not_to raise_error } @@ -134,43 +134,43 @@ end describe ".create" do context "from repository without authentication" do - it { expect(subject.create(fromImage: "nginx").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/create?fromImage=nginx") } + it { expect(subject.create(fromImage: "nginx").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/create?fromImage=nginx") } it { expect(subject.create(fromImage: "nginx").request_params[:method]).to eq(:post) } end context "from local tar file" do before(:all) { File.write("create.tar", "\u0000") } after(:all) { File.delete(File.expand_path("create.tar")) } - it { expect(subject.create(fromSrc: "create.tar").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/create?fromSrc=-") } - it { expect(subject.create(fromSrc: "create.tar", repo: "dockerapi", message: "Imported with dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/create?fromSrc=-&repo=dockerapi&message=Importedwithdockerapi") } + it { expect(subject.create(fromSrc: "create.tar").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/create?fromSrc=-") } + it { expect(subject.create(fromSrc: "create.tar", repo: "dockerapi", message: "Imported with dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/create?fromSrc=-&repo=dockerapi&message=Importedwithdockerapi") } end context "from remote tar file" do let(:url) { "https://address/to/image.tar" } - it { expect(subject.create(fromSrc: url).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/create?fromSrc=https://address/to/image.tar") } - it { expect(subject.create(fromSrc: url, repo: "dockerapi", message: "Imported with dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/images/create?fromSrc=https://address/to/image.tar&repo=dockerapi&message=Importedwithdockerapi") } + it { expect(subject.create(fromSrc: url).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/create?fromSrc=https://address/to/image.tar") } + it { expect(subject.create(fromSrc: url, repo: "dockerapi", message: "Imported with dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/images/create?fromSrc=https://address/to/image.tar&repo=dockerapi&message=Importedwithdockerapi") } end end describe ".build" do before(:all) { File.write("build.tar.xz", "\u0000") } after(:all) { File.delete(File.expand_path("build.tar.xz")) } - it { expect(subject.build("build.tar.xz").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/build") } + it { expect(subject.build("build.tar.xz").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/build") } it { expect(subject.build("build.tar.xz").request_params[:method]).to eq(:post) } it { expect(subject.build("build.tar.xz").request_params[:headers]["Content-type"]).to eq("application/x-tar") } - it { expect(subject.build("build.tar.xz", q: true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/build?q=true") } - it { expect(subject.build("build.tar.xz", q: true, rm: false).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/build?q=true&rm=false") } - it { expect(subject.build("build.tar.xz", memory: 4000000, rm: true, forcerm:true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/build?memory=4000000&rm=true&forcerm=true") } - it { expect(subject.build("build.tar.xz", memory: 4000000, rm: true, forcerm:true, pull:true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/build?memory=4000000&rm=true&forcerm=true&pull=true") } - it { expect(subject.build(nil, remote: "https://address/to/image.tar.xz").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/build?remote=https://address/to/image.tar.xz") } - it { expect(subject.build(nil, remote: "https://address/to/Dockerfile").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/build?remote=https://address/to/Dockerfile") } + it { expect(subject.build("build.tar.xz", q: true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/build?q=true") } + it { expect(subject.build("build.tar.xz", q: true, rm: false).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/build?q=true&rm=false") } + it { expect(subject.build("build.tar.xz", memory: 4000000, rm: true, forcerm:true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/build?memory=4000000&rm=true&forcerm=true") } + it { expect(subject.build("build.tar.xz", memory: 4000000, rm: true, forcerm:true, pull:true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/build?memory=4000000&rm=true&forcerm=true&pull=true") } + it { expect(subject.build(nil, remote: "https://address/to/image.tar.xz").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/build?remote=https://address/to/image.tar.xz") } + it { expect(subject.build(nil, remote: "https://address/to/Dockerfile").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/build?remote=https://address/to/Dockerfile") } it { expect{subject.build("build.tar.xz", invalid: "invalid")}.not_to raise_error } it { expect{subject.build(nil, remote: "https://address/to/image.tar.xz", invalid: "invalid")}.not_to raise_error } it { expect{subject.build(nil, invalid: "invalid")}.to raise_error(StandardError) } end describe ".delete_cache" do - it { expect(subject.delete_cache.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/build/prune") } + it { expect(subject.delete_cache.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/build/prune") } it { expect(subject.delete_cache.request_params[:method]).to eq(:post) } - it { expect(subject.delete_cache(all:true, "keep-storage": 100000, filters: {until: {"24h": true}, inuse: {"true": true}, shared: {"true": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/build/prune?all=true&keep-storage=100000&filters={\"until\":{\"24h\":true},\"inuse\":{\"true\":true},\"shared\":{\"true\":true}}") } + it { expect(subject.delete_cache(all:true, "keep-storage": 100000, filters: {until: {"24h": true}, inuse: {"true": true}, shared: {"true": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/build/prune?all=true&keep-storage=100000&filters={\"until\":{\"24h\":true},\"inuse\":{\"true\":true},\"shared\":{\"true\":true}}") } it { expect{subject.delete_cache(invalid: "invalid")}.not_to raise_error } end end diff --git a/spec/endpoints/network_spec.rb b/spec/endpoints/network_spec.rb index 5fd0761..09f46eb 100644 --- a/spec/endpoints/network_spec.rb +++ b/spec/endpoints/network_spec.rb @@ -14,27 +14,27 @@ after(:all) { Excon.stubs.clear } describe ".list" do - it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks") } + it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks") } it { expect(subject.list.request_params[:method]).to eq(:get) } - it { expect(subject.list(filters: { dangling: {"true": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks?filters={\"dangling\":{\"true\":true}}") } - it { expect(subject.list(filters: { driver: {"bridge": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks?filters={\"driver\":{\"bridge\":true}}") } - it { expect(subject.list(filters: { name: {"bridge": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks?filters={\"name\":{\"bridge\":true}}") } - it { expect(subject.list(filters: { scope: {"local": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks?filters={\"scope\":{\"local\":true}}") } - it { expect(subject.list(filters: { type: {"custom": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks?filters={\"type\":{\"custom\":true}}") } - it { expect(subject.list(filters: { type: {"builtin": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks?filters={\"type\":{\"builtin\":true}}") } + it { expect(subject.list(filters: { dangling: {"true": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks?filters={\"dangling\":{\"true\":true}}") } + it { expect(subject.list(filters: { driver: {"bridge": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks?filters={\"driver\":{\"bridge\":true}}") } + it { expect(subject.list(filters: { name: {"bridge": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks?filters={\"name\":{\"bridge\":true}}") } + it { expect(subject.list(filters: { scope: {"local": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks?filters={\"scope\":{\"local\":true}}") } + it { expect(subject.list(filters: { type: {"custom": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks?filters={\"type\":{\"custom\":true}}") } + it { expect(subject.list(filters: { type: {"builtin": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks?filters={\"type\":{\"builtin\":true}}") } it { expect{subject.list( invalid: true )}.not_to raise_error } end describe ".details" do - it { expect(subject.details( "bridge" ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks/bridge") } + it { expect(subject.details( "bridge" ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks/bridge") } it { expect(subject.details( "bridge" ).request_params[:method]).to eq(:get) } - it { expect(subject.details( "bridge", verbose: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks/bridge?verbose=true") } - it { expect(subject.details( "bridge", scope: "local" ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks/bridge?scope=local") } + it { expect(subject.details( "bridge", verbose: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks/bridge?verbose=true") } + it { expect(subject.details( "bridge", scope: "local" ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks/bridge?scope=local") } it { expect{subject.details( "bridge", invalid: true )}.not_to raise_error } end describe ".create" do - it { expect(subject.create( Name: "rspec-network",CheckDuplicate: true,Driver: "bridge",Internal: true,Attachable: true,EnableIPv6: false).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks/create") } + it { expect(subject.create( Name: "rspec-network",CheckDuplicate: true,Driver: "bridge",Internal: true,Attachable: true,EnableIPv6: false).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks/create") } it { expect(subject.create( Name: "rspec-network",CheckDuplicate: true,Driver: "bridge",Internal: true,Attachable: true,EnableIPv6: false).request_params[:method]).to eq(:post) } it { expect(subject.create( Name: "rspec-network",CheckDuplicate: true,Driver: "bridge",Internal: true,Attachable: true,EnableIPv6: false).request_params[:body]).to eq("{\"Name\":\"rspec-network\",\"CheckDuplicate\":true,\"Driver\":\"bridge\",\"Internal\":true,\"Attachable\":true,\"EnableIPv6\":false}") } it { expect(subject.create( Name: "rspec-network",CheckDuplicate: true,Driver: "bridge",Internal: true,Attachable: true,EnableIPv6: false).request_params[:headers]["Content-Type"]).to eq("application/json") } @@ -42,7 +42,7 @@ end describe ".connect" do - it { expect(subject.connect("rspec-network", Container: "rspec-container").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks/rspec-network/connect") } + it { expect(subject.connect("rspec-network", Container: "rspec-container").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks/rspec-network/connect") } it { expect(subject.connect("rspec-network", Container: "rspec-container").request_params[:method]).to eq(:post) } it { expect(subject.connect("rspec-network", Container: "rspec-container").request_params[:body]).to eq("{\"Container\":\"rspec-container\"}") } it { expect(subject.connect("rspec-network", Container: "rspec-container").request_params[:headers]["Content-Type"]).to eq("application/json") } @@ -50,7 +50,7 @@ end describe ".disconnect" do - it { expect(subject.disconnect("rspec-network", Container: "rspec-container").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks/rspec-network/disconnect") } + it { expect(subject.disconnect("rspec-network", Container: "rspec-container").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks/rspec-network/disconnect") } it { expect(subject.disconnect("rspec-network", Container: "rspec-container").request_params[:method]).to eq(:post) } it { expect(subject.disconnect("rspec-network", Container: "rspec-container").request_params[:body]).to eq("{\"Container\":\"rspec-container\"}") } it { expect(subject.disconnect("rspec-network", Container: "rspec-container").request_params[:headers]["Content-Type"]).to eq("application/json") } @@ -58,16 +58,16 @@ end describe ".remove" do - it { expect(subject.remove("rspec-network").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks/rspec-network") } + it { expect(subject.remove("rspec-network").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks/rspec-network") } it { expect(subject.remove("rspec-network").request_params[:method]).to eq(:delete) } end describe ".prune" do - it { expect(subject.prune.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks/prune") } + it { expect(subject.prune.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks/prune") } it { expect(subject.prune.request_params[:method]).to eq(:post) } - it { expect(subject.prune(filters: { until: {"10m": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks/prune?filters={\"until\":{\"10m\":true}}") } - it { expect(subject.prune(filters: { until: {"1h30m": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks/prune?filters={\"until\":{\"1h30m\":true}}") } - it { expect(subject.prune(filters: { label: {"key=value": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/networks/prune?filters={\"label\":{\"key=value\":true}}") } + it { expect(subject.prune(filters: { until: {"10m": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks/prune?filters={\"until\":{\"10m\":true}}") } + it { expect(subject.prune(filters: { until: {"1h30m": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks/prune?filters={\"until\":{\"1h30m\":true}}") } + it { expect(subject.prune(filters: { label: {"key=value": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/networks/prune?filters={\"label\":{\"key=value\":true}}") } it { expect{subject.prune( invalid: true )}.not_to raise_error } end end diff --git a/spec/endpoints/node_spec.rb b/spec/endpoints/node_spec.rb index cb351de..2f2cfcb 100644 --- a/spec/endpoints/node_spec.rb +++ b/spec/endpoints/node_spec.rb @@ -11,23 +11,23 @@ after(:all) { Excon.stubs.clear } describe ".list" do - it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/nodes") } + it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/nodes") } it { expect(subject.list.request_params[:method]).to eq(:get) } - it { expect(subject.list(filters: {label: ["key=value"]}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/nodes?filters={\"label\":[\"key=value\"]}") } - it { expect(subject.list(filters: {"node.label": ["key=value"]}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/nodes?filters={\"node.label\":[\"key=value\"]}") } - it { expect(subject.list(filters: {membership: {"accepted": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/nodes?filters={\"membership\":{\"accepted\":true}}") } - it { expect(subject.list(filters: {membership: {"pending": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/nodes?filters={\"membership\":{\"pending\":true}}") } - it { expect(subject.list(filters: {name: {"node_name": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/nodes?filters={\"name\":{\"node_name\":true}}") } + it { expect(subject.list(filters: {label: ["key=value"]}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/nodes?filters={\"label\":[\"key=value\"]}") } + it { expect(subject.list(filters: {"node.label": ["key=value"]}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/nodes?filters={\"node.label\":[\"key=value\"]}") } + it { expect(subject.list(filters: {membership: {"accepted": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/nodes?filters={\"membership\":{\"accepted\":true}}") } + it { expect(subject.list(filters: {membership: {"pending": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/nodes?filters={\"membership\":{\"pending\":true}}") } + it { expect(subject.list(filters: {name: {"node_name": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/nodes?filters={\"name\":{\"node_name\":true}}") } it { expect{subject.list(invalid: true)}.not_to raise_error } end describe ".details" do - it { expect(subject.details("id").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/nodes/id") } + it { expect(subject.details("id").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/nodes/id") } it { expect(subject.details("id").request_params[:method]).to eq(:get) } end describe ".update" do - it { expect(subject.update("id", {version: "version"}, {Role: "manager", Availability: "drain" }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/nodes/id/update?version=version") } + it { expect(subject.update("id", {version: "version"}, {Role: "manager", Availability: "drain" }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/nodes/id/update?version=version") } it { expect(subject.update("id", {version: "version"}, {Role: "manager", Availability: "pause" }).request_params[:method]).to eq(:post) } it { expect(subject.update("id", {version: "version"}, {Role: "manager", Availability: "active" }).request_params[:body]).to eq("{\"Role\":\"manager\",\"Availability\":\"active\"}") } it { expect(subject.update("id", {version: "version"}, {Role: "manager", Availability: "drain" }).request_params[:headers]["Content-Type"]).to eq("application/json") } @@ -38,9 +38,9 @@ end describe ".remove" do - it { expect(subject.remove("id").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/nodes/id") } + it { expect(subject.remove("id").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/nodes/id") } it { expect(subject.remove("id").request_params[:method]).to eq(:delete) } - it { expect(subject.remove("id", force: true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/nodes/id?force=true") } + it { expect(subject.remove("id", force: true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/nodes/id?force=true") } it { expect{subject.remove("id", invalid: true)}.not_to raise_error } end diff --git a/spec/endpoints/plugin_spec.rb b/spec/endpoints/plugin_spec.rb index 6f4753c..a02066c 100644 --- a/spec/endpoints/plugin_spec.rb +++ b/spec/endpoints/plugin_spec.rb @@ -18,20 +18,20 @@ after(:all) { Excon.stubs.clear } describe ".list" do - it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins") } + it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins") } it { expect(subject.list.request_params[:method]).to eq(:get) } - it { expect(subject.list(filters: {capability: { "name": true }}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins?filters={\"capability\":{\"name\":true}}") } + it { expect(subject.list(filters: {capability: { "name": true }}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins?filters={\"capability\":{\"name\":true}}") } it { expect{subject.list(invalid: true)}.not_to raise_error } end describe ".privileges" do - it { expect(subject.privileges(remote: "remote").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins/privileges?remote=remote") } + it { expect(subject.privileges(remote: "remote").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins/privileges?remote=remote") } it { expect(subject.privileges(remote: "remote").request_params[:method]).to eq(:get) } it { expect{subject.privileges(invalid: true)}.not_to raise_error } end describe ".install" do - it { expect(subject.install(remote: "plugin", name: "local-name").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins/pull?remote=plugin&name=local-name") } + it { expect(subject.install(remote: "plugin", name: "local-name").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins/pull?remote=plugin&name=local-name") } it { expect(subject.install(remote: "plugin", name: "local-name").request_params[:method]).to eq(:post) } it { expect(subject.install({remote: "plugin", name: "local-name"}, {a: "b"}).request_params[:body]).to eq("{\"a\":\"b\"}") } it { expect(subject.install({remote: "plugin", name: "local-name"}, {a: "b"}).request_params[:headers]["Content-Type"]).to eq("application/json") } @@ -40,31 +40,31 @@ end describe ".details" do - it { expect(subject.details("plugin").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins/plugin/json") } + it { expect(subject.details("plugin").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins/plugin/json") } it { expect(subject.details("plugin").request_params[:method]).to eq(:get) } end describe ".configure" do - it { expect(subject.configure("plugin", ["DEBUG=1"]).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins/plugin/set") } + it { expect(subject.configure("plugin", ["DEBUG=1"]).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins/plugin/set") } it { expect(subject.configure("plugin", ["DEBUG=1"]).request_params[:method]).to eq(:post) } it { expect(subject.configure("plugin", ["DEBUG=1"]).request_params[:headers]["Content-Type"]).to eq("application/json") } it { expect(subject.configure("plugin", ["DEBUG=1"]).request_params[:body]).to eq("[\"DEBUG=1\"]") } end describe ".enable" do - it { expect(subject.enable("plugin", timeout: 0).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins/plugin/enable?timeout=0") } + it { expect(subject.enable("plugin", timeout: 0).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins/plugin/enable?timeout=0") } it { expect(subject.enable("plugin", timeout: 0).request_params[:method]).to eq(:post) } it { expect{subject.enable("plugin", invalid: true)}.not_to raise_error } end describe ".disable" do - it { expect(subject.disable("plugin").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins/plugin/disable") } + it { expect(subject.disable("plugin").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins/plugin/disable") } it { expect(subject.disable("plugin").request_params[:method]).to eq(:post) } end describe ".upgrade" do - it { expect(subject.upgrade("plugin", {remote: "remote"}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins/plugin/upgrade?remote=remote") } + it { expect(subject.upgrade("plugin", {remote: "remote"}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins/plugin/upgrade?remote=remote") } it { expect(subject.upgrade("plugin", {remote: "remote"}).request_params[:method]).to eq(:post) } it { expect(subject.upgrade("plugin", {remote: "remote"}).request_params[:headers]["Content-Type"]).to eq("application/json") } it { expect(subject.upgrade("plugin", {remote: "remote"}, nil, {username: "janedoe", password: "password"}).request_params[:headers]["X-Registry-Auth"]).to eq("eyJ1c2VybmFtZSI6ImphbmVkb2UiLCJwYXNzd29yZCI6InBhc3N3b3JkIn0=") } @@ -73,22 +73,22 @@ end describe ".remove" do - it { expect(subject.remove("plugin").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins/plugin") } + it { expect(subject.remove("plugin").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins/plugin") } it { expect(subject.remove("plugin").request_params[:method]).to eq(:delete) } - it { expect(subject.remove("plugin", force: true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins/plugin?force=true") } + it { expect(subject.remove("plugin", force: true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins/plugin?force=true") } it { expect{subject.remove("plugin", invalid: true)}.not_to raise_error } end describe ".create" do before(:all) { File.write("plugin.tar", "\u0000") } after(:all) { File.delete(File.expand_path("plugin.tar")) } - it { expect(subject.create("myplugin", "plugin.tar").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins/create?name=myplugin") } + it { expect(subject.create("myplugin", "plugin.tar").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins/create?name=myplugin") } it { expect(subject.create("myplugin", "plugin.tar").request_params[:method]).to eq(:post) } it { expect(subject.create("myplugin", "plugin.tar").request_params[:body]).to eq("\u0000") } end describe ".push" do - it { expect(subject.push("myplugin").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/plugins/myplugin/push") } + it { expect(subject.push("myplugin").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/plugins/myplugin/push") } it { expect(subject.push("myplugin").request_params[:method]).to eq(:post) } it { expect(subject.push("myplugin", {username: "janedoe", password: "password"}).request_params[:headers]["X-Registry-Auth"]).to eq("eyJ1c2VybmFtZSI6ImphbmVkb2UiLCJwYXNzd29yZCI6InBhc3N3b3JkIn0=") } end diff --git a/spec/endpoints/secret_spec.rb b/spec/endpoints/secret_spec.rb index 2e09c03..e6920e0 100644 --- a/spec/endpoints/secret_spec.rb +++ b/spec/endpoints/secret_spec.rb @@ -12,17 +12,17 @@ after(:all) { Excon.stubs.clear } describe ".list" do - it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/secrets") } + it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/secrets") } it { expect(subject.list.request_params[:method]).to eq(:get) } - it { expect(subject.list(filters: {id: { "secret-id": true }}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/secrets?filters={\"id\":{\"secret-id\":true}}") } - it { expect(subject.list(filters: {label: { "label=key": true }}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/secrets?filters={\"label\":{\"label=key\":true}}") } - it { expect(subject.list(filters: {name: { "secret-name": true }}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/secrets?filters={\"name\":{\"secret-name\":true}}") } - it { expect(subject.list(filters: {names: { "secret-name": true }}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/secrets?filters={\"names\":{\"secret-name\":true}}") } + it { expect(subject.list(filters: {id: { "secret-id": true }}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/secrets?filters={\"id\":{\"secret-id\":true}}") } + it { expect(subject.list(filters: {label: { "label=key": true }}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/secrets?filters={\"label\":{\"label=key\":true}}") } + it { expect(subject.list(filters: {name: { "secret-name": true }}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/secrets?filters={\"name\":{\"secret-name\":true}}") } + it { expect(subject.list(filters: {names: { "secret-name": true }}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/secrets?filters={\"names\":{\"secret-name\":true}}") } it { expect{subject.list(invalid: true)}.not_to raise_error } end describe ".create" do - it { expect(subject.create({Name: "secret",Labels: {foo: "bar"}, Data: "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg=="}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/secrets/create") } + it { expect(subject.create({Name: "secret",Labels: {foo: "bar"}, Data: "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg=="}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/secrets/create") } it { expect(subject.create({Name: "secret",Labels: {foo: "bar"}, Data: "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg=="}).request_params[:method]).to eq(:post) } it { expect(subject.create({Name: "secret",Labels: {foo: "bar"}, Data: "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg=="}).request_params[:body]).to eq("{\"Name\":\"secret\",\"Labels\":{\"foo\":\"bar\"},\"Data\":\"VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg==\"}") } it { expect(subject.create({Name: "secret",Labels: {foo: "bar"}, Data: "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg=="}).request_params[:headers]["Content-Type"]).to eq("application/json") } @@ -30,12 +30,12 @@ end describe ".details" do - it { expect(subject.details("secret").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/secrets/secret") } + it { expect(subject.details("secret").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/secrets/secret") } it { expect(subject.details("secret").request_params[:method]).to eq(:get) } end describe ".update" do - it { expect(subject.update("secret", {version: "version"}, {}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/secrets/secret/update?version=version") } + it { expect(subject.update("secret", {version: "version"}, {}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/secrets/secret/update?version=version") } it { expect(subject.update("secret", {version: "version"}, {}).request_params[:method]).to eq(:post) } it { expect(subject.update("secret", {version: "version"}, {}).request_params[:body]).to eq("{}") } it { expect(subject.update("secret", {version: "version"}, {}).request_params[:headers]["Content-Type"]).to eq("application/json") } @@ -44,7 +44,7 @@ end describe ".remove" do - it { expect(subject.remove("secret").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/secrets/secret") } + it { expect(subject.remove("secret").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/secrets/secret") } it { expect(subject.remove("secret").request_params[:method]).to eq(:delete) } end end diff --git a/spec/endpoints/service_spec.rb b/spec/endpoints/service_spec.rb index d5174be..bca0495 100644 --- a/spec/endpoints/service_spec.rb +++ b/spec/endpoints/service_spec.rb @@ -13,18 +13,18 @@ after(:all) { Excon.stubs.clear } describe ".list" do - it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services") } + it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services") } it { expect(subject.list.request_params[:method]).to eq(:get) } - it { expect(subject.list(status:true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services?status=true") } - it { expect(subject.list(filters: {id: ["9mnpnzenvg8p8tdbtq4wvbkcz"]}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services?filters={\"id\":[\"9mnpnzenvg8p8tdbtq4wvbkcz\"]}") } - it { expect(subject.list(filters: {label: ["key=value"]}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services?filters={\"label\":[\"key=value\"]}") } - it { expect(subject.list(filters: {mode: ["replicated", "global"]}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services?filters={\"mode\":[\"replicated\",\"global\"]}") } - it { expect(subject.list(filters: {name: ["service-name"]}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services?filters={\"name\":[\"service-name\"]}") } + it { expect(subject.list(status:true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services?status=true") } + it { expect(subject.list(filters: {id: ["9mnpnzenvg8p8tdbtq4wvbkcz"]}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services?filters={\"id\":[\"9mnpnzenvg8p8tdbtq4wvbkcz\"]}") } + it { expect(subject.list(filters: {label: ["key=value"]}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services?filters={\"label\":[\"key=value\"]}") } + it { expect(subject.list(filters: {mode: ["replicated", "global"]}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services?filters={\"mode\":[\"replicated\",\"global\"]}") } + it { expect(subject.list(filters: {name: ["service-name"]}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services?filters={\"name\":[\"service-name\"]}") } it { expect{subject.list(invalid: true)}.not_to raise_error } end describe ".create" do - it { expect(subject.create({Name: "dockerapi", TaskTemplate: {ContainerSpec: { Image: "busybox:1.31.1-uclibc" }},Mode: { Replicated: { Replicas: 2 } },EndpointSpec: { Ports: [{Protocol: "tcp", PublishedPort: 8080, TargetPort: 80}] }}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services/create") } + it { expect(subject.create({Name: "dockerapi", TaskTemplate: {ContainerSpec: { Image: "busybox:1.31.1-uclibc" }},Mode: { Replicated: { Replicas: 2 } },EndpointSpec: { Ports: [{Protocol: "tcp", PublishedPort: 8080, TargetPort: 80}] }}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services/create") } it { expect(subject.create({Name: "dockerapi", TaskTemplate: {ContainerSpec: { Image: "busybox:1.31.1-uclibc" }},Mode: { Replicated: { Replicas: 2 } },EndpointSpec: { Ports: [{Protocol: "tcp", PublishedPort: 8080, TargetPort: 80}] }}).request_params[:method]).to eq(:post) } it { expect(subject.create({Name: "dockerapi", TaskTemplate: {ContainerSpec: { Image: "busybox:1.31.1-uclibc" }},Mode: { Replicated: { Replicas: 2 } },EndpointSpec: { Ports: [{Protocol: "tcp", PublishedPort: 8080, TargetPort: 80}] }}).request_params[:body]).to eq("{\"Name\":\"dockerapi\",\"TaskTemplate\":{\"ContainerSpec\":{\"Image\":\"busybox:1.31.1-uclibc\"}},\"Mode\":{\"Replicated\":{\"Replicas\":2}},\"EndpointSpec\":{\"Ports\":[{\"Protocol\":\"tcp\",\"PublishedPort\":8080,\"TargetPort\":80}]}}") } it { expect(subject.create({Name: "dockerapi", TaskTemplate: {ContainerSpec: { Image: "busybox:1.31.1-uclibc" }},Mode: { Replicated: { Replicas: 2 } },EndpointSpec: { Ports: [{Protocol: "tcp", PublishedPort: 8080, TargetPort: 80}] }}).request_params[:headers]["Content-Type"]).to eq("application/json") } @@ -33,25 +33,25 @@ end describe ".details" do - it { expect(subject.details( "dockerapi" ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services/dockerapi") } + it { expect(subject.details( "dockerapi" ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services/dockerapi") } it { expect(subject.details( "dockerapi" ).request_params[:method]).to eq(:get) } - it { expect(subject.details( "dockerapi", insertDefaults: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services/dockerapi?insertDefaults=true") } + it { expect(subject.details( "dockerapi", insertDefaults: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services/dockerapi?insertDefaults=true") } it { expect{subject.details( "dockerapi", invalid: true )}.not_to raise_error } end describe ".logs" do - it { expect(subject.logs( "dockerapi", details: true, stdout: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services/dockerapi/logs?details=true&stdout=true") } + it { expect(subject.logs( "dockerapi", details: true, stdout: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services/dockerapi/logs?details=true&stdout=true") } it { expect(subject.logs( "dockerapi", details: true, stdout: true ).request_params[:method]).to eq(:get) } - it { expect(subject.logs( "dockerapi", details: true, stderr: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services/dockerapi/logs?details=true&stderr=true") } - it { expect(subject.logs( "dockerapi", since: 0, stdout: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services/dockerapi/logs?since=0&stdout=true") } - it { expect(subject.logs( "dockerapi", timestamps: 0, stdout: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services/dockerapi/logs?timestamps=0&stdout=true") } - it { expect(subject.logs( "dockerapi", tail: 10, stdout: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services/dockerapi/logs?tail=10&stdout=true") } - it { expect(subject.logs( "dockerapi", tail: "all", stdout: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services/dockerapi/logs?tail=all&stdout=true") } + it { expect(subject.logs( "dockerapi", details: true, stderr: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services/dockerapi/logs?details=true&stderr=true") } + it { expect(subject.logs( "dockerapi", since: 0, stdout: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services/dockerapi/logs?since=0&stdout=true") } + it { expect(subject.logs( "dockerapi", timestamps: 0, stdout: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services/dockerapi/logs?timestamps=0&stdout=true") } + it { expect(subject.logs( "dockerapi", tail: 10, stdout: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services/dockerapi/logs?tail=10&stdout=true") } + it { expect(subject.logs( "dockerapi", tail: "all", stdout: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services/dockerapi/logs?tail=all&stdout=true") } it { expect{subject.details( "dockerapi", invalid: true )}.not_to raise_error } end describe ".update" do - it { expect(subject.update("dockerapi", {version: "version"}, {}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services/dockerapi/update?version=version") } + it { expect(subject.update("dockerapi", {version: "version"}, {}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services/dockerapi/update?version=version") } it { expect(subject.update("dockerapi", {version: "version"}, {}).request_params[:method]).to eq(:post) } it { expect(subject.update("dockerapi", {version: "version"}, {}).request_params[:headers]["Content-Type"]).to eq("application/json") } it { expect(subject.update("dockerapi", {version: "version"}, {}, {username: "janedoe", password: "password"}).request_params[:headers]["X-Registry-Auth"]).to eq("eyJ1c2VybmFtZSI6ImphbmVkb2UiLCJwYXNzd29yZCI6InBhc3N3b3JkIn0=") } @@ -61,7 +61,7 @@ end describe ".remove" do - it { expect(subject.remove("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/services/dockerapi") } + it { expect(subject.remove("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/services/dockerapi") } it { expect(subject.remove("dockerapi").request_params[:method]).to eq(:delete) } end diff --git a/spec/endpoints/swarm_spec.rb b/spec/endpoints/swarm_spec.rb index 3a7e57d..2616ef1 100644 --- a/spec/endpoints/swarm_spec.rb +++ b/spec/endpoints/swarm_spec.rb @@ -15,7 +15,7 @@ after(:all) { Excon.stubs.clear } describe ".init" do - it { expect(subject.init({AdvertiseAddr: "127.0.0.1:2375", ListenAddr: "0.0.0.0:4567", SubnetSize: 24, Spec: { Name: "default" }}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/swarm/init") } + it { expect(subject.init({AdvertiseAddr: "127.0.0.1:2375", ListenAddr: "0.0.0.0:4567", SubnetSize: 24, Spec: { Name: "default" }}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/swarm/init") } it { expect(subject.init({AdvertiseAddr: "127.0.0.1:2375", ListenAddr: "0.0.0.0:4567", SubnetSize: 24, Spec: { Name: "default" }}).request_params[:method]).to eq(:post) } it { expect(subject.init({AdvertiseAddr: "127.0.0.1:2375", ListenAddr: "0.0.0.0:4567", SubnetSize: 24, Spec: { Name: "default" }}).request_params[:body]).to eq("{\"AdvertiseAddr\":\"127.0.0.1:2375\",\"ListenAddr\":\"0.0.0.0:4567\",\"SubnetSize\":24,\"Spec\":{\"Name\":\"default\"}}") } it { expect(subject.init({AdvertiseAddr: "127.0.0.1:2375", ListenAddr: "0.0.0.0:4567", SubnetSize: 24, Spec: { Name: "default" }}).request_params[:headers]["Content-Type"]).to eq("application/json") } @@ -23,41 +23,41 @@ end describe ".details" do - it { expect(subject.details.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/swarm") } + it { expect(subject.details.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/swarm") } it { expect(subject.details.request_params[:method]).to eq(:get) } end describe ".update" do - it { expect(subject.update({version: "version"}, {}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/swarm/update?version=version") } + it { expect(subject.update({version: "version"}, {}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/swarm/update?version=version") } it { expect(subject.update({version: "version"}, {}).request_params[:method]).to eq(:post) } - it { expect(subject.update({version: "version", rotateWorkerToken: true}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/swarm/update?version=version&rotateWorkerToken=true") } - it { expect(subject.update({version: "version", rotateManagerToken: true}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/swarm/update?version=version&rotateManagerToken=true") } - it { expect(subject.update({version: "version", rotateManagerUnlockKey: true}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/swarm/update?version=version&rotateManagerUnlockKey=true") } + it { expect(subject.update({version: "version", rotateWorkerToken: true}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/swarm/update?version=version&rotateWorkerToken=true") } + it { expect(subject.update({version: "version", rotateManagerToken: true}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/swarm/update?version=version&rotateManagerToken=true") } + it { expect(subject.update({version: "version", rotateManagerUnlockKey: true}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/swarm/update?version=version&rotateManagerUnlockKey=true") } it { expect{subject.update({version: "version", invalid: true})}.not_to raise_error } - it { expect(subject.update({version: "version"}, {EncryptionConfig: { AutoLockManagers: true } }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/swarm/update?version=version") } + it { expect(subject.update({version: "version"}, {EncryptionConfig: { AutoLockManagers: true } }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/swarm/update?version=version") } it { expect(subject.update({version: "version"}, {EncryptionConfig: { AutoLockManagers: true } }).request_params[:body]).to eq("{\"EncryptionConfig\":{\"AutoLockManagers\":true}}") } it { expect(subject.update({version: "version"}, {EncryptionConfig: { AutoLockManagers: true } }).request_params[:headers]["Content-Type"]).to eq("application/json") } end describe ".unlock_key" do - it { expect(subject.unlock_key.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/swarm/unlockkey") } + it { expect(subject.unlock_key.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/swarm/unlockkey") } it { expect(subject.unlock_key.request_params[:method]).to eq(:get) } end describe ".unlock" do - it { expect(subject.unlock.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/swarm/unlock") } + it { expect(subject.unlock.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/swarm/unlock") } it { expect(subject.unlock.request_params[:method]).to eq(:post) } end describe ".join" do - it { expect(subject.join(RemoteAddrs: ["127.0.0.1:2377"], JoinToken: "token" ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/swarm/join") } + it { expect(subject.join(RemoteAddrs: ["127.0.0.1:2377"], JoinToken: "token" ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/swarm/join") } it { expect(subject.join(RemoteAddrs: ["127.0.0.1:2377"], JoinToken: "token" ).request_params[:method]).to eq(:post) } it { expect(subject.join(RemoteAddrs: ["127.0.0.1:2377"], JoinToken: "token" ).request_params[:body]).to eq("{\"RemoteAddrs\":[\"127.0.0.1:2377\"],\"JoinToken\":\"token\"}") } it { expect(subject.join(RemoteAddrs: ["127.0.0.1:2377"], JoinToken: "token" ).request_params[:headers]["Content-Type"]).to eq("application/json") } end describe ".leave" do - it { expect(subject.leave(force: true).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/swarm/leave?force=true") } + it { expect(subject.leave(force: true).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/swarm/leave?force=true") } it { expect(subject.leave(force: true).request_params[:method]).to eq(:post) } it { expect{subject.leave(invalid: true)}.not_to raise_error } end diff --git a/spec/endpoints/system_spec.rb b/spec/endpoints/system_spec.rb index a1021ea..a2b5e09 100644 --- a/spec/endpoints/system_spec.rb +++ b/spec/endpoints/system_spec.rb @@ -13,7 +13,7 @@ after(:all) { Excon.stubs.clear } describe ".auth" do - it { expect(subject.auth(username: "janedoe", password: "password", email: "janedow@email.com", serveraddress: "docker.io", identitytoken: "token").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/auth") } + it { expect(subject.auth(username: "janedoe", password: "password", email: "janedow@email.com", serveraddress: "docker.io", identitytoken: "token").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/auth") } it { expect(subject.auth(username: "janedoe", password: "password", email: "janedow@email.com", serveraddress: "docker.io", identitytoken: "token").request_params[:method]).to eq(:post) } it { expect(subject.auth(username: "janedoe", password: "password", email: "janedow@email.com", serveraddress: "docker.io", identitytoken: "token").request_params[:body]).to eq("{\"username\":\"janedoe\",\"password\":\"password\",\"email\":\"janedow@email.com\",\"serveraddress\":\"docker.io\",\"identitytoken\":\"token\"}") } it { expect(subject.auth(username: "janedoe", password: "password", email: "janedow@email.com", serveraddress: "docker.io", identitytoken: "token").request_params[:headers]["Content-Type"]).to eq("application/json") } @@ -22,32 +22,32 @@ end describe ".ping" do - it { expect(subject.ping.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/_ping") } + it { expect(subject.ping.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/_ping") } it { expect(subject.ping.request_params[:method]).to eq(:get) } end describe ".info" do - it { expect(subject.info.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/info") } + it { expect(subject.info.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/info") } it { expect(subject.info.request_params[:method]).to eq(:get) } end describe ".version" do - it { expect(subject.version.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/version") } + it { expect(subject.version.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/version") } it { expect(subject.version.request_params[:method]).to eq(:get) } end describe ".events" do let(:now) { Time.now.to_i } - it { expect(subject.events.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/events") } + it { expect(subject.events.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/events") } it { expect(subject.events.request_params[:method]).to eq(:get) } - it { expect(subject.events(until: now).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/events?until=#{now}") } + it { expect(subject.events(until: now).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/events?until=#{now}") } it { expect{subject.events(invalid: true)}.not_to raise_error } end describe ".df" do - it { expect(subject.df.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/system/df") } + it { expect(subject.df.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/system/df") } it { expect(subject.df.request_params[:method]).to eq(:get) } - it { expect(subject.df(type: "container").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/system/df?type=container" )} + it { expect(subject.df(type: "container").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/system/df?type=container" )} it { expect{subject.df(invalid: "true")}.not_to raise_error } end diff --git a/spec/endpoints/task_spec.rb b/spec/endpoints/task_spec.rb index cd3a37e..b6de09e 100644 --- a/spec/endpoints/task_spec.rb +++ b/spec/endpoints/task_spec.rb @@ -10,28 +10,28 @@ after(:all) { Excon.stubs.clear } describe ".list" do - it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks") } + it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks") } it { expect(subject.list.request_params[:method]).to eq(:get) } - it { expect(subject.list(filters: { "desired-state": {"running": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks?filters={\"desired-state\":{\"running\":true}}") } - it { expect(subject.list(filters: { "desired-state": {"shutdown": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks?filters={\"desired-state\":{\"shutdown\":true}}") } - it { expect(subject.list(filters: { "desired-state": {"accepted": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks?filters={\"desired-state\":{\"accepted\":true}}") } - it { expect(subject.list(filters: { "id": {"id-here": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks?filters={\"id\":{\"id-here\":true}}") } - it { expect(subject.list(filters: { "name": {"task-name": true} }).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks?filters={\"name\":{\"task-name\":true}}") } + it { expect(subject.list(filters: { "desired-state": {"running": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks?filters={\"desired-state\":{\"running\":true}}") } + it { expect(subject.list(filters: { "desired-state": {"shutdown": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks?filters={\"desired-state\":{\"shutdown\":true}}") } + it { expect(subject.list(filters: { "desired-state": {"accepted": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks?filters={\"desired-state\":{\"accepted\":true}}") } + it { expect(subject.list(filters: { "id": {"id-here": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks?filters={\"id\":{\"id-here\":true}}") } + it { expect(subject.list(filters: { "name": {"task-name": true} }).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks?filters={\"name\":{\"task-name\":true}}") } it { expect{subject.list(invalid: true)}.not_to raise_error } end describe ".details" do - it { expect(subject.details("id").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks/id") } + it { expect(subject.details("id").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks/id") } it { expect(subject.details("id").request_params[:method]).to eq(:get) } end describe ".logs" do - it { expect(subject.logs( "id", details: true, stdout: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks/id/logs?details=true&stdout=true") } - it { expect(subject.logs( "id", details: true, stderr: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks/id/logs?details=true&stderr=true") } - it { expect(subject.logs( "id", since: 0, stdout: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks/id/logs?since=0&stdout=true") } - it { expect(subject.logs( "id", timestamps: 0, stdout: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks/id/logs?timestamps=0&stdout=true") } - it { expect(subject.logs( "id", tail: 10, stdout: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks/id/logs?tail=10&stdout=true") } - it { expect(subject.logs( "id", tail: "all", stdout: true ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/tasks/id/logs?tail=all&stdout=true") } + it { expect(subject.logs( "id", details: true, stdout: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks/id/logs?details=true&stdout=true") } + it { expect(subject.logs( "id", details: true, stderr: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks/id/logs?details=true&stderr=true") } + it { expect(subject.logs( "id", since: 0, stdout: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks/id/logs?since=0&stdout=true") } + it { expect(subject.logs( "id", timestamps: 0, stdout: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks/id/logs?timestamps=0&stdout=true") } + it { expect(subject.logs( "id", tail: 10, stdout: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks/id/logs?tail=10&stdout=true") } + it { expect(subject.logs( "id", tail: "all", stdout: true ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/tasks/id/logs?tail=all&stdout=true") } it { expect{subject.logs( "id", invalid: true )}.not_to raise_error } end end diff --git a/spec/endpoints/volume_spec.rb b/spec/endpoints/volume_spec.rb index a7b2049..c4c2917 100644 --- a/spec/endpoints/volume_spec.rb +++ b/spec/endpoints/volume_spec.rb @@ -12,16 +12,16 @@ after(:all) { Excon.stubs.clear } describe ".list" do - it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/volumes") } + it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/volumes") } it { expect(subject.list.request_params[:method]).to eq(:get) } - it { expect(subject.list(filters: {dangling: {"true": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/volumes?filters={\"dangling\":{\"true\":true}}") } - it { expect(subject.list(filters: {driver: {"local": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/volumes?filters={\"driver\":{\"local\":true}}") } - it { expect(subject.list(filters: {name: {"bridge": true}}).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/volumes?filters={\"name\":{\"bridge\":true}}") } + it { expect(subject.list(filters: {dangling: {"true": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/volumes?filters={\"dangling\":{\"true\":true}}") } + it { expect(subject.list(filters: {driver: {"local": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/volumes?filters={\"driver\":{\"local\":true}}") } + it { expect(subject.list(filters: {name: {"bridge": true}}).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/volumes?filters={\"name\":{\"bridge\":true}}") } it { expect{subject.list( invalid: true )}.not_to raise_error } end describe ".create" do - it { expect(subject.create(Name: "dockerapi", Driver: "local").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/volumes/create") } + it { expect(subject.create(Name: "dockerapi", Driver: "local").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/volumes/create") } it { expect(subject.create(Name: "dockerapi", Driver: "local").request_params[:method]).to eq(:post) } it { expect(subject.create(Name: "dockerapi", Driver: "local").request_params[:body]).to eq("{\"Name\":\"dockerapi\",\"Driver\":\"local\"}") } it { expect(subject.create(Name: "dockerapi", Driver: "local").request_params[:headers]["Content-Type"]).to eq("application/json") } @@ -29,21 +29,21 @@ end describe ".details" do - it { expect(subject.details("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/volumes/dockerapi") } + it { expect(subject.details("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/volumes/dockerapi") } it { expect(subject.details("dockerapi").request_params[:method]).to eq(:get) } end describe ".remove" do - it { expect(subject.remove("dockerapi").request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/volumes/dockerapi") } + it { expect(subject.remove("dockerapi").request_params[:path]).to eq("/v#{Docker::API.default_api_version}/volumes/dockerapi") } it { expect(subject.remove("dockerapi").request_params[:method]).to eq(:delete) } it { expect{subject.remove( "dockerapi", invalid: true )}.not_to raise_error } end describe ".prune" do - it { expect(subject.prune.request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/volumes/prune") } + it { expect(subject.prune.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/volumes/prune") } it { expect(subject.prune.request_params[:method]).to eq(:post) } - it { expect(subject.prune( filters: {label: {"key": true}} ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/volumes/prune?filters={\"label\":{\"key\":true}}") } - it { expect(subject.prune( filters: {label: {"key=value": true}} ).request_params[:path]).to eq("/v#{Docker::API::API_VERSION}/volumes/prune?filters={\"label\":{\"key=value\":true}}") } + it { expect(subject.prune( filters: {label: {"key": true}} ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/volumes/prune?filters={\"label\":{\"key\":true}}") } + it { expect(subject.prune( filters: {label: {"key=value": true}} ).request_params[:path]).to eq("/v#{Docker::API.default_api_version}/volumes/prune?filters={\"label\":{\"key=value\":true}}") } it { expect{subject.prune( invalid: true )}.not_to raise_error } end end diff --git a/spec/misc/api_version_spec.rb b/spec/misc/api_version_spec.rb new file mode 100644 index 0000000..33a4759 --- /dev/null +++ b/spec/misc/api_version_spec.rb @@ -0,0 +1,29 @@ +RSpec.describe "Support multiple Docker API versions" do + + context "with stubs" do + before(:all) { Excon.stub({ :scheme => 'http', :host => '127.0.0.1', :method => :get, :port => 2375 }, {headers: {'Content-Type': 'application/json'}, body: '[]', status: 200 }) } + after(:all) { Excon.unstub({ :method => :get }) } + + describe "default version" do + subject { Docker::API::Container.new(stub_connection) } + it { expect(subject.list.request_params[:path]).to eq("/v#{Docker::API.default_api_version}/containers/json") } + end + + describe "overwriting the default version" do + subject = Docker::API::Container.new(stub_connection) + + it { expect{subject.api_version="1.45"}.not_to raise_error } + it { expect(subject.api_version).to eq("1.45") } + it { expect(subject.list.request_params[:path]).to eq("/v1.45/containers/json") } + end + + describe "using a different default version" do + Docker::API.default_api_version = "1.47" + subject = Docker::API::Container.new(stub_connection) + Docker::API.default_api_version = "1.43" + + it { expect(subject.api_version).to eq("1.47") } + it { expect(subject.list.request_params[:path]).to eq("/v1.47/containers/json") } + end + end +end \ No newline at end of file From 216475878b4f5d2c4b9804e0fcfda5e2dfdac17e Mon Sep 17 00:00:00 2001 From: nu12 <34694287+nu12@users.noreply.github.com> Date: Tue, 26 Aug 2025 22:45:40 -0400 Subject: [PATCH 2/2] Multiple versions for E2E tests --- Gemfile.lock | 2 +- README.md | 26 ++++++++++++++++ lib/docker/api/version.rb | 2 +- spec/e2e/e2e_spec.rb | 63 ++++++++++++++++++++------------------- 4 files changed, 61 insertions(+), 32 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2f4dac3..0a51ec0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - dockerapi (0.22.1) + dockerapi (1.0.0) base64 excon (>= 0.97, < 2) diff --git a/README.md b/README.md index 4691d12..8b566c2 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ Interact with Docker API directly from Ruby code. Comprehensive implementation ( * [Installation](#installation) * [Usage](#usage) + * [API version](#api-version) * [Images](#images) * [Containers](#containers) * [Volumes](#volumes) @@ -52,6 +53,31 @@ If you need more information about the different Docker API endpoints, please se For a more detailed and comprehensive documentation about this gem's API, please see the [documentation page](https://rubydoc.info/gems/dockerapi). +### API version + +The Docker API is backward-compatible, which means we can specify which version of the API we want to use. Doing so is optional in order to take advantage of a specific feature. + +We can specify the version to be used in 2 ways: + + +Use a specific version for all new instances + +```ruby +Docker::API.default_api_version="1.43" +image = Docker::API::Image.new +image.list.path +=> "/v1.43/images/json" +``` + +Change the version used after the instance is created + +```ruby +image = Docker::API::Image.new +image.api_version="1.43" +image.list.path +=> "/v1.43/images/json" +``` + ### Images ```ruby diff --git a/lib/docker/api/version.rb b/lib/docker/api/version.rb index cc49d59..da76fbc 100644 --- a/lib/docker/api/version.rb +++ b/lib/docker/api/version.rb @@ -1,5 +1,5 @@ module Docker module API - VERSION = "0.22.1" + VERSION = "1.0.0" end end diff --git a/spec/e2e/e2e_spec.rb b/spec/e2e/e2e_spec.rb index c76bb24..de94121 100644 --- a/spec/e2e/e2e_spec.rb +++ b/spec/e2e/e2e_spec.rb @@ -1,18 +1,6 @@ RSpec.describe "End-to-end test", e2e: true do - before(:all) do - - end - after(:all) do - Docker::API::Image.new.remove("localhost/dockerapi", force: true) - Docker::API::Image.new.remove("nginx@sha256:94f1c83ea210e0568f87884517b4fe9a39c74b7677e0ad3de72700cfa3da7268", force: true) - File.delete("./html.tar") - end - container = Docker::API::Container.new - image = Docker::API::Image.new - volume = Docker::API::Volume.new - system = Docker::API::System.new - describe "System calls" do + system = Docker::API::System.new it { expect(system.ping.status).to eq(200) } it { expect(system.info.status).to eq(200) } it { expect(system.info.success?).to eq(true) } @@ -29,6 +17,8 @@ end describe "Misc of requests that are expected to fail" do + container = Docker::API::Container.new + image = Docker::API::Image.new it { expect(image.create(fromImage: "doesn-exist:latest").status).to eq(404) } it { expect(image.create(fromSrc: "http://404").status).to eq(500) } it { expect(image.details("doesn-exist").status).to eq(404) } @@ -38,22 +28,35 @@ it { expect(container.start("doesn-exist").status).to eq(404 )} it { expect(container.remove("doesn-exist").status).to eq(404) } end - - describe "Basic workflow" do - it "downloads an image" do expect(image.create( fromImage: "nginx@sha256:94f1c83ea210e0568f87884517b4fe9a39c74b7677e0ad3de72700cfa3da7268" ).status).to be(200) end - it "inspects the image" do expect(image.details( "nginx@sha256:94f1c83ea210e0568f87884517b4fe9a39c74b7677e0ad3de72700cfa3da7268" ).json).to be_kind_of(Hash) end - it "tags the image" do expect(image.tag("nginx@sha256:94f1c83ea210e0568f87884517b4fe9a39c74b7677e0ad3de72700cfa3da7268", repo: "localhost/dockerapi").status).to be(201) end - it "removes an image" do expect(image.remove("nginx@sha256:94f1c83ea210e0568f87884517b4fe9a39c74b7677e0ad3de72700cfa3da7268").status).to be(200) end - it "creates a volume" do expect(volume.create( Name:"dockerapi" ).status).to be(201) end - it "creates a container" do expect(container.create( {name: "dockerapi1"}, {Image: "localhost/dockerapi", HostConfig: {Binds: ["dockerapi:/usr/share/nginx/html"], PortBindings: {"80/tcp": [ {HostIp: "0.0.0.0", HostPort: "3080"} ]}}}).status).to be(201) end - it "starts container" do expect(container.start("dockerapi1").status).to be(204) end - it "sleeps to wait container" do sleep 2 end - it "requests the container on port 3080" do expect(Excon.get('http://127.0.0.1:3080').body).to match(/Welcome to nginx!/) end - it "copies content from container" do expect(container.get_archive("dockerapi1", "./html.tar", path: "/usr/share/nginx/html/").status).to be(200) end - it "verifies the content of the copied file" do expect(File.exist?("./html.tar")).to be(true) end - it "stops container" do expect(container.stop("dockerapi1").status).to be(204) end - it "waits for the container to stop" do expect(container.wait("dockerapi1").status).to be(200) end - it "removes container" do expect(container.remove("dockerapi1").status).to be(204) end - it "removes a volume" do expect(volume.remove("dockerapi").status).to be(204) end + + ["1.40", "1.41", "1.42", "1.43", "1.44", "1.45", "1.46", "1.47", "1.48"].each do | version | + Docker::API.default_api_version = version + describe "Basic workflow with version #{version}" do + after(:all) do + Docker::API::Image.new.remove("localhost/dockerapi", force: true) + Docker::API::Image.new.remove("nginx@sha256:94f1c83ea210e0568f87884517b4fe9a39c74b7677e0ad3de72700cfa3da7268", force: true) + File.delete("./html.tar") + end + container = Docker::API::Container.new + image = Docker::API::Image.new + volume = Docker::API::Volume.new + it "list images using the specified API version" do expect(image.list.path).to eq("/v#{version}/images/json") end + it "download an image" do expect(image.create( fromImage: "nginx@sha256:94f1c83ea210e0568f87884517b4fe9a39c74b7677e0ad3de72700cfa3da7268" ).status).to be(200) end + it "inspect the image" do expect(image.details( "nginx@sha256:94f1c83ea210e0568f87884517b4fe9a39c74b7677e0ad3de72700cfa3da7268" ).json).to be_kind_of(Hash) end + it "tag the image" do expect(image.tag("nginx@sha256:94f1c83ea210e0568f87884517b4fe9a39c74b7677e0ad3de72700cfa3da7268", repo: "localhost/dockerapi").status).to be(201) end + it "remove an image" do expect(image.remove("nginx@sha256:94f1c83ea210e0568f87884517b4fe9a39c74b7677e0ad3de72700cfa3da7268").status).to be(200) end + it "create a volume" do expect(volume.create( Name:"dockerapi" ).status).to be(201) end + it "create a container" do expect(container.create( {name: "dockerapi1"}, {Image: "localhost/dockerapi", HostConfig: {Binds: ["dockerapi:/usr/share/nginx/html"], PortBindings: {"80/tcp": [ {HostIp: "0.0.0.0", HostPort: "3080"} ]}}}).status).to be(201) end + it "start container" do expect(container.start("dockerapi1").status).to be(204) end + it "sleep to wait container" do sleep 2 end + it "request the container on port 3080" do expect(Excon.get('http://127.0.0.1:3080').body).to match(/Welcome to nginx!/) end + it "copy content from container" do expect(container.get_archive("dockerapi1", "./html.tar", path: "/usr/share/nginx/html/").status).to be(200) end + it "verify the content of the copied file" do expect(File.exist?("./html.tar")).to be(true) end + it "stop container" do expect(container.stop("dockerapi1").status).to be(204) end + it "wait for the container to stop" do expect(container.wait("dockerapi1").status).to be(200) end + it "remove container" do expect(container.remove("dockerapi1").status).to be(204) end + it "remove a volume" do expect(volume.remove("dockerapi").status).to be(204) end + end + Docker::API.default_api_version = "1.43" end end