From 1164a39cc3ad067f9979c9793a659c215021616c Mon Sep 17 00:00:00 2001 From: Kirill Mokevnin Date: Sun, 27 Sep 2026 15:25:23 -0400 Subject: [PATCH] fix: serialize whole-object request bodies and accept host_config Ten methods take their body as one object (containers.create config, the spec of configs, secrets, services, nodes and swarm, volumes.create), but their params models never declared that field. The SDK then sent it as given, in snake_case: containers.create posted exposed_ports instead of ExposedPorts, and Docker silently dropped every such field. The params models now declare the body field with its model, so it is dumped in API names. containers.create also takes host_config, which the Engine API expects in the same body as HostConfig, so callers no longer need extra_body for it. Co-Authored-By: Claude Opus 5.5 --- .../models/config_create_params.rb | 8 ++- .../models/config_update_params.rb | 8 ++- .../models/container_create_params.rb | 15 ++++- .../models/node_update_params.rb | 8 ++- .../models/secret_create_params.rb | 8 ++- .../models/secret_update_params.rb | 8 ++- .../models/service_create_params.rb | 8 ++- .../models/service_update_params.rb | 8 ++- .../models/swarm_update_params.rb | 8 ++- .../models/volume_create_params.rb | 8 ++- .../resources/containers.rb | 11 +++- .../transport/pooled_net_requester.rbi | 4 +- .../models/config_create_params.rbi | 9 ++- .../models/config_update_params.rbi | 10 ++- .../models/container_create_params.rbi | 28 ++++++++- .../models/node_update_params.rbi | 10 ++- .../models/secret_create_params.rbi | 9 ++- .../models/secret_update_params.rbi | 10 ++- .../models/service_create_params.rbi | 10 ++- .../models/service_update_params.rbi | 9 +++ .../models/swarm_update_params.rbi | 9 +++ .../models/volume_create_params.rbi | 11 +++- .../resources/containers.rbi | 3 + .../models/config_create_params.rbs | 5 +- .../models/config_update_params.rbs | 6 +- .../models/container_create_params.rbs | 19 +++++- .../models/node_update_params.rbs | 6 +- .../models/secret_create_params.rbs | 5 +- .../models/secret_update_params.rbs | 6 +- .../models/service_create_params.rbs | 6 +- .../models/service_update_params.rbs | 5 ++ .../models/swarm_update_params.rbs | 5 ++ .../models/volume_create_params.rbs | 5 +- .../resources/containers.rbs | 1 + .../models/request_body_test.rb | 62 +++++++++++++++++++ 35 files changed, 319 insertions(+), 32 deletions(-) create mode 100644 test/docker_engine_ruby/models/request_body_test.rb diff --git a/lib/docker_engine_ruby/models/config_create_params.rb b/lib/docker_engine_ruby/models/config_create_params.rb index 6665491..dff9eac 100644 --- a/lib/docker_engine_ruby/models/config_create_params.rb +++ b/lib/docker_engine_ruby/models/config_create_params.rb @@ -7,7 +7,13 @@ class ConfigCreateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters - # @!method initialize(request_options: {}) + # @!attribute spec + # + # @return [DockerEngineRuby::Models::ConfigSpec] + required :spec, -> { DockerEngineRuby::ConfigSpec } + + # @!method initialize(spec:, request_options: {}) + # @param spec [DockerEngineRuby::Models::ConfigSpec] # @param request_options [DockerEngineRuby::RequestOptions, Hash{Symbol=>Object}] end end diff --git a/lib/docker_engine_ruby/models/config_update_params.rb b/lib/docker_engine_ruby/models/config_update_params.rb index 2936f25..3e8f961 100644 --- a/lib/docker_engine_ruby/models/config_update_params.rb +++ b/lib/docker_engine_ruby/models/config_update_params.rb @@ -7,6 +7,11 @@ class ConfigUpdateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + # @!attribute spec + # + # @return [DockerEngineRuby::Models::ConfigSpec] + required :spec, -> { DockerEngineRuby::ConfigSpec } + # @!attribute id # # @return [String] @@ -17,7 +22,8 @@ class ConfigUpdateParams < DockerEngineRuby::Internal::Type::BaseModel # @return [Integer] required :version, Integer - # @!method initialize(id:, version:, request_options: {}) + # @!method initialize(spec:, id:, version:, request_options: {}) + # @param spec [DockerEngineRuby::Models::ConfigSpec] # @param id [String] # @param version [Integer] # @param request_options [DockerEngineRuby::RequestOptions, Hash{Symbol=>Object}] diff --git a/lib/docker_engine_ruby/models/container_create_params.rb b/lib/docker_engine_ruby/models/container_create_params.rb index c32faca..44bc194 100644 --- a/lib/docker_engine_ruby/models/container_create_params.rb +++ b/lib/docker_engine_ruby/models/container_create_params.rb @@ -7,6 +7,17 @@ class ContainerCreateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + # @!attribute config + # + # @return [DockerEngineRuby::Models::Config] + required :config, -> { DockerEngineRuby::Config } + + # @!attribute host_config + # Контейнерные настройки хоста: монтирования, сеть, лимиты. + # + # @return [DockerEngineRuby::Models::Container::HostConfig, nil] + optional :host_config, -> { DockerEngineRuby::Container::HostConfig } + # @!attribute name # # @return [String, nil] @@ -17,7 +28,9 @@ class ContainerCreateParams < DockerEngineRuby::Internal::Type::BaseModel # @return [String, nil] optional :platform, String - # @!method initialize(name: nil, platform: nil, request_options: {}) + # @!method initialize(config:, host_config: nil, name: nil, platform: nil, request_options: {}) + # @param config [DockerEngineRuby::Models::Config] + # @param host_config [DockerEngineRuby::Models::Container::HostConfig] # @param name [String] # @param platform [String] # @param request_options [DockerEngineRuby::RequestOptions, Hash{Symbol=>Object}] diff --git a/lib/docker_engine_ruby/models/node_update_params.rb b/lib/docker_engine_ruby/models/node_update_params.rb index 3f558ff..a229e3f 100644 --- a/lib/docker_engine_ruby/models/node_update_params.rb +++ b/lib/docker_engine_ruby/models/node_update_params.rb @@ -7,6 +7,11 @@ class NodeUpdateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + # @!attribute spec + # + # @return [DockerEngineRuby::Models::NodeSpec] + required :spec, -> { DockerEngineRuby::NodeSpec } + # @!attribute id # # @return [String] @@ -17,7 +22,8 @@ class NodeUpdateParams < DockerEngineRuby::Internal::Type::BaseModel # @return [Integer] required :version, Integer - # @!method initialize(id:, version:, request_options: {}) + # @!method initialize(spec:, id:, version:, request_options: {}) + # @param spec [DockerEngineRuby::Models::NodeSpec] # @param id [String] # @param version [Integer] # @param request_options [DockerEngineRuby::RequestOptions, Hash{Symbol=>Object}] diff --git a/lib/docker_engine_ruby/models/secret_create_params.rb b/lib/docker_engine_ruby/models/secret_create_params.rb index e811bef..d91b686 100644 --- a/lib/docker_engine_ruby/models/secret_create_params.rb +++ b/lib/docker_engine_ruby/models/secret_create_params.rb @@ -7,7 +7,13 @@ class SecretCreateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters - # @!method initialize(request_options: {}) + # @!attribute spec + # + # @return [DockerEngineRuby::Models::SecretSpec] + required :spec, -> { DockerEngineRuby::SecretSpec } + + # @!method initialize(spec:, request_options: {}) + # @param spec [DockerEngineRuby::Models::SecretSpec] # @param request_options [DockerEngineRuby::RequestOptions, Hash{Symbol=>Object}] end end diff --git a/lib/docker_engine_ruby/models/secret_update_params.rb b/lib/docker_engine_ruby/models/secret_update_params.rb index d3c390f..f69638b 100644 --- a/lib/docker_engine_ruby/models/secret_update_params.rb +++ b/lib/docker_engine_ruby/models/secret_update_params.rb @@ -7,6 +7,11 @@ class SecretUpdateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + # @!attribute spec + # + # @return [DockerEngineRuby::Models::SecretSpec] + required :spec, -> { DockerEngineRuby::SecretSpec } + # @!attribute id # # @return [String] @@ -17,7 +22,8 @@ class SecretUpdateParams < DockerEngineRuby::Internal::Type::BaseModel # @return [Integer] required :version, Integer - # @!method initialize(id:, version:, request_options: {}) + # @!method initialize(spec:, id:, version:, request_options: {}) + # @param spec [DockerEngineRuby::Models::SecretSpec] # @param id [String] # @param version [Integer] # @param request_options [DockerEngineRuby::RequestOptions, Hash{Symbol=>Object}] diff --git a/lib/docker_engine_ruby/models/service_create_params.rb b/lib/docker_engine_ruby/models/service_create_params.rb index 9c8c806..72af2cf 100644 --- a/lib/docker_engine_ruby/models/service_create_params.rb +++ b/lib/docker_engine_ruby/models/service_create_params.rb @@ -7,12 +7,18 @@ class ServiceCreateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + # @!attribute spec + # + # @return [DockerEngineRuby::Models::ServiceSpec] + required :spec, -> { DockerEngineRuby::ServiceSpec } + # @!attribute x_registry_auth # # @return [String, nil] optional :x_registry_auth, String - # @!method initialize(x_registry_auth: nil, request_options: {}) + # @!method initialize(spec:, x_registry_auth: nil, request_options: {}) + # @param spec [DockerEngineRuby::Models::ServiceSpec] # @param x_registry_auth [String] # @param request_options [DockerEngineRuby::RequestOptions, Hash{Symbol=>Object}] end diff --git a/lib/docker_engine_ruby/models/service_update_params.rb b/lib/docker_engine_ruby/models/service_update_params.rb index dd8ca72..34a4cc8 100644 --- a/lib/docker_engine_ruby/models/service_update_params.rb +++ b/lib/docker_engine_ruby/models/service_update_params.rb @@ -7,6 +7,11 @@ class ServiceUpdateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + # @!attribute spec + # + # @return [DockerEngineRuby::Models::ServiceSpec] + required :spec, -> { DockerEngineRuby::ServiceSpec } + # @!attribute id # # @return [String] @@ -32,7 +37,8 @@ class ServiceUpdateParams < DockerEngineRuby::Internal::Type::BaseModel # @return [String, nil] optional :x_registry_auth, String - # @!method initialize(id:, version:, registry_auth_from: nil, rollback: nil, x_registry_auth: nil, request_options: {}) + # @!method initialize(spec:, id:, version:, registry_auth_from: nil, rollback: nil, x_registry_auth: nil, request_options: {}) + # @param spec [DockerEngineRuby::Models::ServiceSpec] # @param id [String] # @param version [Integer] # @param registry_auth_from [Symbol, DockerEngineRuby::Models::ServiceUpdateParams::RegistryAuthFrom] diff --git a/lib/docker_engine_ruby/models/swarm_update_params.rb b/lib/docker_engine_ruby/models/swarm_update_params.rb index d367007..08452a2 100644 --- a/lib/docker_engine_ruby/models/swarm_update_params.rb +++ b/lib/docker_engine_ruby/models/swarm_update_params.rb @@ -7,6 +7,11 @@ class SwarmUpdateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + # @!attribute spec + # + # @return [DockerEngineRuby::Models::SwarmSpec] + required :spec, -> { DockerEngineRuby::SwarmSpec } + # @!attribute version # # @return [Integer] @@ -27,7 +32,8 @@ class SwarmUpdateParams < DockerEngineRuby::Internal::Type::BaseModel # @return [Boolean, nil] optional :rotate_worker_token, DockerEngineRuby::Internal::Type::Boolean - # @!method initialize(version:, rotate_manager_token: nil, rotate_manager_unlock_key: nil, rotate_worker_token: nil, request_options: {}) + # @!method initialize(spec:, version:, rotate_manager_token: nil, rotate_manager_unlock_key: nil, rotate_worker_token: nil, request_options: {}) + # @param spec [DockerEngineRuby::Models::SwarmSpec] # @param version [Integer] # @param rotate_manager_token [Boolean] # @param rotate_manager_unlock_key [Boolean] diff --git a/lib/docker_engine_ruby/models/volume_create_params.rb b/lib/docker_engine_ruby/models/volume_create_params.rb index fc5d5cc..7d3342c 100644 --- a/lib/docker_engine_ruby/models/volume_create_params.rb +++ b/lib/docker_engine_ruby/models/volume_create_params.rb @@ -7,7 +7,13 @@ class VolumeCreateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters - # @!method initialize(request_options: {}) + # @!attribute create_request + # + # @return [DockerEngineRuby::Models::CreateRequest] + required :create_request, -> { DockerEngineRuby::CreateRequest } + + # @!method initialize(create_request:, request_options: {}) + # @param create_request [DockerEngineRuby::Models::CreateRequest] # @param request_options [DockerEngineRuby::RequestOptions, Hash{Symbol=>Object}] end end diff --git a/lib/docker_engine_ruby/resources/containers.rb b/lib/docker_engine_ruby/resources/containers.rb index 20abbf7..8bc4714 100644 --- a/lib/docker_engine_ruby/resources/containers.rb +++ b/lib/docker_engine_ruby/resources/containers.rb @@ -5,10 +5,12 @@ module Resources class Containers # Create a container # - # @overload create(config:, name: nil, platform: nil, request_options: {}) + # @overload create(config:, host_config: nil, name: nil, platform: nil, request_options: {}) # # @param config [DockerEngineRuby::Models::Config] Body param: Configuration for a container that is portable between hosts. # + # @param host_config [DockerEngineRuby::Models::Container::HostConfig] Body param: Настройки хоста: монтирования, сеть, лимиты. + # # @param name [String] Query param # # @param platform [String] Query param @@ -20,12 +22,15 @@ class Containers # @see DockerEngineRuby::Models::ContainerCreateParams def create(params) parsed, options = DockerEngineRuby::ContainerCreateParams.dump_request(params) - query = DockerEngineRuby::Internal::Util.encode_query_params(parsed.except(:config)) + query = DockerEngineRuby::Internal::Util.encode_query_params(parsed.except(:config, :host_config)) + # Docker ждёт настройки хоста в том же теле, что и конфиг контейнера: `{..., "HostConfig": {...}}`. + host_config = parsed[:host_config] + body = host_config.nil? ? parsed[:config] : {**parsed[:config], HostConfig: host_config} @client.request( method: :post, path: "containers/create", query: query, - body: parsed[:config], + body: body, model: DockerEngineRuby::CreateResponse, options: options ) diff --git a/rbi/docker_engine_ruby/internal/transport/pooled_net_requester.rbi b/rbi/docker_engine_ruby/internal/transport/pooled_net_requester.rbi index bf8d352..b931532 100644 --- a/rbi/docker_engine_ruby/internal/transport/pooled_net_requester.rbi +++ b/rbi/docker_engine_ruby/internal/transport/pooled_net_requester.rbi @@ -33,9 +33,7 @@ module DockerEngineRuby tls_key: T.nilable(OpenSSL::PKey::PKey), tls_verify_peer: T::Boolean, url: URI::Generic - ).returns( - Net::HTTP - ) + ).returns(Net::HTTP) end def connect(cert_store:, tls_cert:, tls_key:, tls_verify_peer:, url:) end diff --git a/rbi/docker_engine_ruby/models/config_create_params.rbi b/rbi/docker_engine_ruby/models/config_create_params.rbi index 0750e07..34713e6 100644 --- a/rbi/docker_engine_ruby/models/config_create_params.rbi +++ b/rbi/docker_engine_ruby/models/config_create_params.rbi @@ -14,12 +14,19 @@ module DockerEngineRuby ) end + sig { returns(DockerEngineRuby::ConfigSpec) } + attr_reader :spec + + sig { params(spec: DockerEngineRuby::ConfigSpec::OrHash).void } + attr_writer :spec + sig do params( + spec: DockerEngineRuby::ConfigSpec::OrHash, request_options: DockerEngineRuby::RequestOptions::OrHash ).returns(T.attached_class) end - def self.new(request_options: {}) + def self.new(spec:, request_options: {}) end sig do diff --git a/rbi/docker_engine_ruby/models/config_update_params.rbi b/rbi/docker_engine_ruby/models/config_update_params.rbi index fc6b6ac..b364c77 100644 --- a/rbi/docker_engine_ruby/models/config_update_params.rbi +++ b/rbi/docker_engine_ruby/models/config_update_params.rbi @@ -14,6 +14,12 @@ module DockerEngineRuby ) end + sig { returns(DockerEngineRuby::ConfigSpec) } + attr_reader :spec + + sig { params(spec: DockerEngineRuby::ConfigSpec::OrHash).void } + attr_writer :spec + sig { returns(String) } attr_accessor :id @@ -22,17 +28,19 @@ module DockerEngineRuby sig do params( + spec: DockerEngineRuby::ConfigSpec::OrHash, id: String, version: Integer, request_options: DockerEngineRuby::RequestOptions::OrHash ).returns(T.attached_class) end - def self.new(id:, version:, request_options: {}) + def self.new(spec:, id:, version:, request_options: {}) end sig do override.returns( { + spec: DockerEngineRuby::ConfigSpec, id: String, version: Integer, request_options: DockerEngineRuby::RequestOptions diff --git a/rbi/docker_engine_ruby/models/container_create_params.rbi b/rbi/docker_engine_ruby/models/container_create_params.rbi index cd02690..6960ed1 100644 --- a/rbi/docker_engine_ruby/models/container_create_params.rbi +++ b/rbi/docker_engine_ruby/models/container_create_params.rbi @@ -14,6 +14,22 @@ module DockerEngineRuby ) end + sig { returns(DockerEngineRuby::Config) } + attr_reader :config + + sig { params(config: DockerEngineRuby::Config::OrHash).void } + attr_writer :config + + sig { returns(T.nilable(DockerEngineRuby::Container::HostConfig)) } + attr_reader :host_config + + sig do + params( + host_config: DockerEngineRuby::Container::HostConfig::OrHash + ).void + end + attr_writer :host_config + sig { returns(T.nilable(String)) } attr_reader :name @@ -28,17 +44,27 @@ module DockerEngineRuby sig do params( + config: DockerEngineRuby::Config::OrHash, + host_config: DockerEngineRuby::Container::HostConfig::OrHash, name: String, platform: String, request_options: DockerEngineRuby::RequestOptions::OrHash ).returns(T.attached_class) end - def self.new(name: nil, platform: nil, request_options: {}) + def self.new( + config:, + host_config: nil, + name: nil, + platform: nil, + request_options: {} + ) end sig do override.returns( { + config: DockerEngineRuby::Config, + host_config: DockerEngineRuby::Container::HostConfig, name: String, platform: String, request_options: DockerEngineRuby::RequestOptions diff --git a/rbi/docker_engine_ruby/models/node_update_params.rbi b/rbi/docker_engine_ruby/models/node_update_params.rbi index e7699ba..2f2d133 100644 --- a/rbi/docker_engine_ruby/models/node_update_params.rbi +++ b/rbi/docker_engine_ruby/models/node_update_params.rbi @@ -14,6 +14,12 @@ module DockerEngineRuby ) end + sig { returns(DockerEngineRuby::NodeSpec) } + attr_reader :spec + + sig { params(spec: DockerEngineRuby::NodeSpec::OrHash).void } + attr_writer :spec + sig { returns(String) } attr_accessor :id @@ -22,17 +28,19 @@ module DockerEngineRuby sig do params( + spec: DockerEngineRuby::NodeSpec::OrHash, id: String, version: Integer, request_options: DockerEngineRuby::RequestOptions::OrHash ).returns(T.attached_class) end - def self.new(id:, version:, request_options: {}) + def self.new(spec:, id:, version:, request_options: {}) end sig do override.returns( { + spec: DockerEngineRuby::NodeSpec, id: String, version: Integer, request_options: DockerEngineRuby::RequestOptions diff --git a/rbi/docker_engine_ruby/models/secret_create_params.rbi b/rbi/docker_engine_ruby/models/secret_create_params.rbi index afe0de9..15c7eaf 100644 --- a/rbi/docker_engine_ruby/models/secret_create_params.rbi +++ b/rbi/docker_engine_ruby/models/secret_create_params.rbi @@ -14,12 +14,19 @@ module DockerEngineRuby ) end + sig { returns(DockerEngineRuby::SecretSpec) } + attr_reader :spec + + sig { params(spec: DockerEngineRuby::SecretSpec::OrHash).void } + attr_writer :spec + sig do params( + spec: DockerEngineRuby::SecretSpec::OrHash, request_options: DockerEngineRuby::RequestOptions::OrHash ).returns(T.attached_class) end - def self.new(request_options: {}) + def self.new(spec:, request_options: {}) end sig do diff --git a/rbi/docker_engine_ruby/models/secret_update_params.rbi b/rbi/docker_engine_ruby/models/secret_update_params.rbi index 14a16d3..982c837 100644 --- a/rbi/docker_engine_ruby/models/secret_update_params.rbi +++ b/rbi/docker_engine_ruby/models/secret_update_params.rbi @@ -14,6 +14,12 @@ module DockerEngineRuby ) end + sig { returns(DockerEngineRuby::SecretSpec) } + attr_reader :spec + + sig { params(spec: DockerEngineRuby::SecretSpec::OrHash).void } + attr_writer :spec + sig { returns(String) } attr_accessor :id @@ -22,17 +28,19 @@ module DockerEngineRuby sig do params( + spec: DockerEngineRuby::SecretSpec::OrHash, id: String, version: Integer, request_options: DockerEngineRuby::RequestOptions::OrHash ).returns(T.attached_class) end - def self.new(id:, version:, request_options: {}) + def self.new(spec:, id:, version:, request_options: {}) end sig do override.returns( { + spec: DockerEngineRuby::SecretSpec, id: String, version: Integer, request_options: DockerEngineRuby::RequestOptions diff --git a/rbi/docker_engine_ruby/models/service_create_params.rbi b/rbi/docker_engine_ruby/models/service_create_params.rbi index ffa8240..dae25da 100644 --- a/rbi/docker_engine_ruby/models/service_create_params.rbi +++ b/rbi/docker_engine_ruby/models/service_create_params.rbi @@ -14,6 +14,12 @@ module DockerEngineRuby ) end + sig { returns(DockerEngineRuby::ServiceSpec) } + attr_reader :spec + + sig { params(spec: DockerEngineRuby::ServiceSpec::OrHash).void } + attr_writer :spec + sig { returns(T.nilable(String)) } attr_reader :x_registry_auth @@ -22,16 +28,18 @@ module DockerEngineRuby sig do params( + spec: DockerEngineRuby::ServiceSpec::OrHash, x_registry_auth: String, request_options: DockerEngineRuby::RequestOptions::OrHash ).returns(T.attached_class) end - def self.new(x_registry_auth: nil, request_options: {}) + def self.new(spec:, x_registry_auth: nil, request_options: {}) end sig do override.returns( { + spec: DockerEngineRuby::ServiceSpec, x_registry_auth: String, request_options: DockerEngineRuby::RequestOptions } diff --git a/rbi/docker_engine_ruby/models/service_update_params.rbi b/rbi/docker_engine_ruby/models/service_update_params.rbi index c15907d..c816391 100644 --- a/rbi/docker_engine_ruby/models/service_update_params.rbi +++ b/rbi/docker_engine_ruby/models/service_update_params.rbi @@ -14,6 +14,12 @@ module DockerEngineRuby ) end + sig { returns(DockerEngineRuby::ServiceSpec) } + attr_reader :spec + + sig { params(spec: DockerEngineRuby::ServiceSpec::OrHash).void } + attr_writer :spec + sig { returns(String) } attr_accessor :id @@ -51,6 +57,7 @@ module DockerEngineRuby sig do params( + spec: DockerEngineRuby::ServiceSpec::OrHash, id: String, version: Integer, registry_auth_from: @@ -61,6 +68,7 @@ module DockerEngineRuby ).returns(T.attached_class) end def self.new( + spec:, id:, version:, registry_auth_from: nil, @@ -73,6 +81,7 @@ module DockerEngineRuby sig do override.returns( { + spec: DockerEngineRuby::ServiceSpec, id: String, version: Integer, registry_auth_from: diff --git a/rbi/docker_engine_ruby/models/swarm_update_params.rbi b/rbi/docker_engine_ruby/models/swarm_update_params.rbi index a46613c..b4988d4 100644 --- a/rbi/docker_engine_ruby/models/swarm_update_params.rbi +++ b/rbi/docker_engine_ruby/models/swarm_update_params.rbi @@ -14,6 +14,12 @@ module DockerEngineRuby ) end + sig { returns(DockerEngineRuby::SwarmSpec) } + attr_reader :spec + + sig { params(spec: DockerEngineRuby::SwarmSpec::OrHash).void } + attr_writer :spec + sig { returns(Integer) } attr_accessor :version @@ -37,6 +43,7 @@ module DockerEngineRuby sig do params( + spec: DockerEngineRuby::SwarmSpec::OrHash, version: Integer, rotate_manager_token: T::Boolean, rotate_manager_unlock_key: T::Boolean, @@ -45,6 +52,7 @@ module DockerEngineRuby ).returns(T.attached_class) end def self.new( + spec:, version:, rotate_manager_token: nil, rotate_manager_unlock_key: nil, @@ -56,6 +64,7 @@ module DockerEngineRuby sig do override.returns( { + spec: DockerEngineRuby::SwarmSpec, version: Integer, rotate_manager_token: T::Boolean, rotate_manager_unlock_key: T::Boolean, diff --git a/rbi/docker_engine_ruby/models/volume_create_params.rbi b/rbi/docker_engine_ruby/models/volume_create_params.rbi index c17fdb3..6a87490 100644 --- a/rbi/docker_engine_ruby/models/volume_create_params.rbi +++ b/rbi/docker_engine_ruby/models/volume_create_params.rbi @@ -14,12 +14,21 @@ module DockerEngineRuby ) end + sig { returns(DockerEngineRuby::CreateRequest) } + attr_reader :create_request + + sig do + params(create_request: DockerEngineRuby::CreateRequest::OrHash).void + end + attr_writer :create_request + sig do params( + create_request: DockerEngineRuby::CreateRequest::OrHash, request_options: DockerEngineRuby::RequestOptions::OrHash ).returns(T.attached_class) end - def self.new(request_options: {}) + def self.new(create_request:, request_options: {}) end sig do diff --git a/rbi/docker_engine_ruby/resources/containers.rbi b/rbi/docker_engine_ruby/resources/containers.rbi index 9a3e81f..1261fbc 100644 --- a/rbi/docker_engine_ruby/resources/containers.rbi +++ b/rbi/docker_engine_ruby/resources/containers.rbi @@ -7,6 +7,7 @@ module DockerEngineRuby sig do params( config: DockerEngineRuby::Config::OrHash, + host_config: DockerEngineRuby::Container::HostConfig::OrHash, name: String, platform: String, request_options: DockerEngineRuby::RequestOptions::OrHash @@ -15,6 +16,8 @@ module DockerEngineRuby def create( # Body param: Configuration for a container that is portable between hosts. config:, + # Body param: Настройки хоста: монтирования, сеть, лимиты. + host_config: nil, # Query param name: nil, # Query param diff --git a/sig/docker_engine_ruby/models/config_create_params.rbs b/sig/docker_engine_ruby/models/config_create_params.rbs index 6d87a2b..8a5dda7 100644 --- a/sig/docker_engine_ruby/models/config_create_params.rbs +++ b/sig/docker_engine_ruby/models/config_create_params.rbs @@ -1,12 +1,15 @@ module DockerEngineRuby module Models type config_create_params = - { } & DockerEngineRuby::Internal::Type::request_parameters + { spec: DockerEngineRuby::ConfigSpec } + & DockerEngineRuby::Internal::Type::request_parameters class ConfigCreateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + attr_accessor spec: DockerEngineRuby::ConfigSpec + def initialize: (?request_options: DockerEngineRuby::request_opts) -> void def to_hash: -> { request_options: DockerEngineRuby::RequestOptions } diff --git a/sig/docker_engine_ruby/models/config_update_params.rbs b/sig/docker_engine_ruby/models/config_update_params.rbs index 0fafd00..2910b14 100644 --- a/sig/docker_engine_ruby/models/config_update_params.rbs +++ b/sig/docker_engine_ruby/models/config_update_params.rbs @@ -1,24 +1,28 @@ module DockerEngineRuby module Models type config_update_params = - { id: String, version: Integer } + { spec: DockerEngineRuby::ConfigSpec, id: String, version: Integer } & DockerEngineRuby::Internal::Type::request_parameters class ConfigUpdateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + attr_accessor spec: DockerEngineRuby::ConfigSpec + attr_accessor id: String attr_accessor version: Integer def initialize: ( + spec: DockerEngineRuby::ConfigSpec, id: String, version: Integer, ?request_options: DockerEngineRuby::request_opts ) -> void def to_hash: -> { + spec: DockerEngineRuby::ConfigSpec, id: String, version: Integer, request_options: DockerEngineRuby::RequestOptions diff --git a/sig/docker_engine_ruby/models/container_create_params.rbs b/sig/docker_engine_ruby/models/container_create_params.rbs index 5285aeb..793b1fa 100644 --- a/sig/docker_engine_ruby/models/container_create_params.rbs +++ b/sig/docker_engine_ruby/models/container_create_params.rbs @@ -1,13 +1,26 @@ module DockerEngineRuby module Models type container_create_params = - { name: String, platform: String } + { + config: DockerEngineRuby::Config, + host_config: DockerEngineRuby::Container::HostConfig, + name: String, + platform: String + } & DockerEngineRuby::Internal::Type::request_parameters class ContainerCreateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + attr_accessor config: DockerEngineRuby::Config + + attr_reader host_config: DockerEngineRuby::Container::HostConfig? + + def host_config=: ( + DockerEngineRuby::Container::HostConfig + ) -> DockerEngineRuby::Container::HostConfig + attr_reader name: String? def name=: (String) -> String @@ -17,12 +30,16 @@ module DockerEngineRuby def platform=: (String) -> String def initialize: ( + config: DockerEngineRuby::Config, + ?host_config: DockerEngineRuby::Container::HostConfig, ?name: String, ?platform: String, ?request_options: DockerEngineRuby::request_opts ) -> void def to_hash: -> { + config: DockerEngineRuby::Config, + host_config: DockerEngineRuby::Container::HostConfig, name: String, platform: String, request_options: DockerEngineRuby::RequestOptions diff --git a/sig/docker_engine_ruby/models/node_update_params.rbs b/sig/docker_engine_ruby/models/node_update_params.rbs index 5996c5f..5972241 100644 --- a/sig/docker_engine_ruby/models/node_update_params.rbs +++ b/sig/docker_engine_ruby/models/node_update_params.rbs @@ -1,24 +1,28 @@ module DockerEngineRuby module Models type node_update_params = - { id: String, version: Integer } + { spec: DockerEngineRuby::NodeSpec, id: String, version: Integer } & DockerEngineRuby::Internal::Type::request_parameters class NodeUpdateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + attr_accessor spec: DockerEngineRuby::NodeSpec + attr_accessor id: String attr_accessor version: Integer def initialize: ( + spec: DockerEngineRuby::NodeSpec, id: String, version: Integer, ?request_options: DockerEngineRuby::request_opts ) -> void def to_hash: -> { + spec: DockerEngineRuby::NodeSpec, id: String, version: Integer, request_options: DockerEngineRuby::RequestOptions diff --git a/sig/docker_engine_ruby/models/secret_create_params.rbs b/sig/docker_engine_ruby/models/secret_create_params.rbs index 97dbdb7..20d61f2 100644 --- a/sig/docker_engine_ruby/models/secret_create_params.rbs +++ b/sig/docker_engine_ruby/models/secret_create_params.rbs @@ -1,12 +1,15 @@ module DockerEngineRuby module Models type secret_create_params = - { } & DockerEngineRuby::Internal::Type::request_parameters + { spec: DockerEngineRuby::SecretSpec } + & DockerEngineRuby::Internal::Type::request_parameters class SecretCreateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + attr_accessor spec: DockerEngineRuby::SecretSpec + def initialize: (?request_options: DockerEngineRuby::request_opts) -> void def to_hash: -> { request_options: DockerEngineRuby::RequestOptions } diff --git a/sig/docker_engine_ruby/models/secret_update_params.rbs b/sig/docker_engine_ruby/models/secret_update_params.rbs index ed1faec..84346ba 100644 --- a/sig/docker_engine_ruby/models/secret_update_params.rbs +++ b/sig/docker_engine_ruby/models/secret_update_params.rbs @@ -1,24 +1,28 @@ module DockerEngineRuby module Models type secret_update_params = - { id: String, version: Integer } + { spec: DockerEngineRuby::SecretSpec, id: String, version: Integer } & DockerEngineRuby::Internal::Type::request_parameters class SecretUpdateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + attr_accessor spec: DockerEngineRuby::SecretSpec + attr_accessor id: String attr_accessor version: Integer def initialize: ( + spec: DockerEngineRuby::SecretSpec, id: String, version: Integer, ?request_options: DockerEngineRuby::request_opts ) -> void def to_hash: -> { + spec: DockerEngineRuby::SecretSpec, id: String, version: Integer, request_options: DockerEngineRuby::RequestOptions diff --git a/sig/docker_engine_ruby/models/service_create_params.rbs b/sig/docker_engine_ruby/models/service_create_params.rbs index 8c90047..2170a05 100644 --- a/sig/docker_engine_ruby/models/service_create_params.rbs +++ b/sig/docker_engine_ruby/models/service_create_params.rbs @@ -1,23 +1,27 @@ module DockerEngineRuby module Models type service_create_params = - { x_registry_auth: String } + { spec: DockerEngineRuby::ServiceSpec, x_registry_auth: String } & DockerEngineRuby::Internal::Type::request_parameters class ServiceCreateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + attr_accessor spec: DockerEngineRuby::ServiceSpec + attr_reader x_registry_auth: String? def x_registry_auth=: (String) -> String def initialize: ( + spec: DockerEngineRuby::ServiceSpec, ?x_registry_auth: String, ?request_options: DockerEngineRuby::request_opts ) -> void def to_hash: -> { + spec: DockerEngineRuby::ServiceSpec, x_registry_auth: String, request_options: DockerEngineRuby::RequestOptions } diff --git a/sig/docker_engine_ruby/models/service_update_params.rbs b/sig/docker_engine_ruby/models/service_update_params.rbs index 85ad8e5..e3e1fa1 100644 --- a/sig/docker_engine_ruby/models/service_update_params.rbs +++ b/sig/docker_engine_ruby/models/service_update_params.rbs @@ -2,6 +2,7 @@ module DockerEngineRuby module Models type service_update_params = { + spec: DockerEngineRuby::ServiceSpec, id: String, version: Integer, registry_auth_from: DockerEngineRuby::Models::ServiceUpdateParams::registry_auth_from, @@ -14,6 +15,8 @@ module DockerEngineRuby extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + attr_accessor spec: DockerEngineRuby::ServiceSpec + attr_accessor id: String attr_accessor version: Integer @@ -33,6 +36,7 @@ module DockerEngineRuby def x_registry_auth=: (String) -> String def initialize: ( + spec: DockerEngineRuby::ServiceSpec, id: String, version: Integer, ?registry_auth_from: DockerEngineRuby::Models::ServiceUpdateParams::registry_auth_from, @@ -42,6 +46,7 @@ module DockerEngineRuby ) -> void def to_hash: -> { + spec: DockerEngineRuby::ServiceSpec, id: String, version: Integer, registry_auth_from: DockerEngineRuby::Models::ServiceUpdateParams::registry_auth_from, diff --git a/sig/docker_engine_ruby/models/swarm_update_params.rbs b/sig/docker_engine_ruby/models/swarm_update_params.rbs index abc31ba..184a5da 100644 --- a/sig/docker_engine_ruby/models/swarm_update_params.rbs +++ b/sig/docker_engine_ruby/models/swarm_update_params.rbs @@ -2,6 +2,7 @@ module DockerEngineRuby module Models type swarm_update_params = { + spec: DockerEngineRuby::SwarmSpec, version: Integer, rotate_manager_token: bool, rotate_manager_unlock_key: bool, @@ -13,6 +14,8 @@ module DockerEngineRuby extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + attr_accessor spec: DockerEngineRuby::SwarmSpec + attr_accessor version: Integer attr_reader rotate_manager_token: bool? @@ -28,6 +31,7 @@ module DockerEngineRuby def rotate_worker_token=: (bool) -> bool def initialize: ( + spec: DockerEngineRuby::SwarmSpec, version: Integer, ?rotate_manager_token: bool, ?rotate_manager_unlock_key: bool, @@ -36,6 +40,7 @@ module DockerEngineRuby ) -> void def to_hash: -> { + spec: DockerEngineRuby::SwarmSpec, version: Integer, rotate_manager_token: bool, rotate_manager_unlock_key: bool, diff --git a/sig/docker_engine_ruby/models/volume_create_params.rbs b/sig/docker_engine_ruby/models/volume_create_params.rbs index b6459c8..51e8f0b 100644 --- a/sig/docker_engine_ruby/models/volume_create_params.rbs +++ b/sig/docker_engine_ruby/models/volume_create_params.rbs @@ -1,12 +1,15 @@ module DockerEngineRuby module Models type volume_create_params = - { } & DockerEngineRuby::Internal::Type::request_parameters + { create_request: DockerEngineRuby::CreateRequest } + & DockerEngineRuby::Internal::Type::request_parameters class VolumeCreateParams < DockerEngineRuby::Internal::Type::BaseModel extend DockerEngineRuby::Internal::Type::RequestParameters::Converter include DockerEngineRuby::Internal::Type::RequestParameters + attr_accessor create_request: DockerEngineRuby::CreateRequest + def initialize: (?request_options: DockerEngineRuby::request_opts) -> void def to_hash: -> { request_options: DockerEngineRuby::RequestOptions } diff --git a/sig/docker_engine_ruby/resources/containers.rbs b/sig/docker_engine_ruby/resources/containers.rbs index 6272ded..b3c3676 100644 --- a/sig/docker_engine_ruby/resources/containers.rbs +++ b/sig/docker_engine_ruby/resources/containers.rbs @@ -3,6 +3,7 @@ module DockerEngineRuby class Containers def create: ( config: DockerEngineRuby::Config, + ?host_config: DockerEngineRuby::Container::HostConfig, ?name: String, ?platform: String, ?request_options: DockerEngineRuby::request_opts diff --git a/test/docker_engine_ruby/models/request_body_test.rb b/test/docker_engine_ruby/models/request_body_test.rb new file mode 100644 index 0000000..14762e9 --- /dev/null +++ b/test/docker_engine_ruby/models/request_body_test.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class DockerEngineRuby::Test::RequestBodyModelTest < Minitest::Test + extend Minitest::Serial + include WebMock::API + + def before_all + super + WebMock.enable! + end + + def teardown + WebMock.reset! + super + end + + def after_all + WebMock.disable! + super + end + + def test_container_create_sends_config_and_host_config_in_api_names + body = sent_body(:post, "http://localhost/containers/create", {Id: "c1", Warnings: []}) do |client| + client.containers.create( + config: {image: "alpine", cmd: ["true"], exposed_ports: {"80/tcp" => {}}}, + host_config: {binds: ["/src:/app"], network_mode: "bridge", memory: 1024}, + name: "app" + ) + end + + assert_equal( + { + "Image" => "alpine", + "Cmd" => ["true"], + "ExposedPorts" => {"80/tcp" => {}}, + "HostConfig" => {"Binds" => ["/src:/app"], "NetworkMode" => "bridge", "Memory" => 1024} + }, + body + ) + end + + def test_secret_create_sends_spec_in_api_names + body = sent_body(:post, "http://localhost/secrets/create", {ID: "s1"}) do |client| + client.secrets.create(spec: {name: "token", data: "c2VjcmV0"}) + end + + assert_equal({"Name" => "token", "Data" => "c2VjcmV0"}, body) + end + + private + + def sent_body(method, url, response) + body = nil + stub_request(method, /#{Regexp.escape(url)}/) + .with { body = JSON.parse(_1.body) } + .to_return_json(status: 201, body: response) + yield(DockerEngineRuby::Client.new(base_url: "http://localhost", max_retries: 0)) + body + end +end