diff --git a/cli/compose/convert/service.go b/cli/compose/convert/service.go index ee14f088dfa8..5fbc289d830e 100644 --- a/cli/compose/convert/service.go +++ b/cli/compose/convert/service.go @@ -560,10 +560,6 @@ func convertResources(source composetypes.Resources) (*swarm.ResourceRequirement GenericResources: generic, } } - // These fields are themselves pointers -- we can simply assign, no need to - // nil-check them. Nil is nil. - resources.SwapBytes = source.MemswapLimit - resources.MemorySwappiness = source.MemSwappiness return resources, nil } diff --git a/cli/compose/convert/service_test.go b/cli/compose/convert/service_test.go index 5ce1690401c3..b5999fe6ea8e 100644 --- a/cli/compose/convert/service_test.go +++ b/cli/compose/convert/service_test.go @@ -81,9 +81,6 @@ func TestConvertExtraHosts(t *testing.T) { } func TestConvertResourcesFull(t *testing.T) { - // create some variables so we can get pointers - memswap := int64(72090) - swappiness := int64(27) source := composetypes.Resources{ Limits: &composetypes.ResourceLimit{ NanoCPUs: "0.003", @@ -93,8 +90,6 @@ func TestConvertResourcesFull(t *testing.T) { NanoCPUs: "0.002", MemoryBytes: composetypes.UnitBytes(200000000), }, - MemswapLimit: &memswap, - MemSwappiness: &swappiness, } resources, err := convertResources(source) assert.NilError(t, err) @@ -108,8 +103,6 @@ func TestConvertResourcesFull(t *testing.T) { NanoCPUs: 2000000, MemoryBytes: 200000000, }, - SwapBytes: &memswap, - MemorySwappiness: &swappiness, } assert.Check(t, is.DeepEqual(expected, resources)) } diff --git a/cli/compose/loader/full-example.yml b/cli/compose/loader/full-example.yml index 0a008fe5c7b7..36ebf833e708 100644 --- a/cli/compose/loader/full-example.yml +++ b/cli/compose/loader/full-example.yml @@ -1,4 +1,4 @@ -version: "3.14" +version: "3.13" services: foo: @@ -79,8 +79,6 @@ services: - discrete_resource_spec: kind: 'ssd' value: 1 - memswap_limit: 86000 - mem_swappiness: 27 restart_policy: condition: on-failure delay: 5s diff --git a/cli/compose/loader/full-struct_test.go b/cli/compose/loader/full-struct_test.go index 060a6d40bf6d..5d420c872bcf 100644 --- a/cli/compose/loader/full-struct_test.go +++ b/cli/compose/loader/full-struct_test.go @@ -11,7 +11,7 @@ import ( func fullExampleConfig(workingDir, homeDir string) *types.Config { return &types.Config{ - Version: "3.14", + Version: "3.13", Services: services(workingDir, homeDir), Networks: networks(), Volumes: volumes(), @@ -108,8 +108,6 @@ func services(workingDir, homeDir string) []types.ServiceConfig { }, }, }, - MemswapLimit: int64Ptr(86000), - MemSwappiness: int64Ptr(27), }, RestartPolicy: &types.RestartPolicy{ Condition: "on-failure", diff --git a/cli/compose/loader/loader_test.go b/cli/compose/loader/loader_test.go index dabf50a38f81..fd9a644726ae 100644 --- a/cli/compose/loader/loader_test.go +++ b/cli/compose/loader/loader_test.go @@ -184,7 +184,7 @@ func strPtr(val string) *string { } var sampleConfig = types.Config{ - Version: "3.14", + Version: "3.13", Services: []types.ServiceConfig{ { Name: "foo", @@ -970,10 +970,6 @@ func uint32Ptr(value uint32) *uint32 { return &value } -func int64Ptr(value int64) *int64 { - return &value -} - func TestFullExample(t *testing.T) { skip.If(t, runtime.GOOS == "windows", "FIXME: substitutes platform-specific HOME-dirs and requires platform-specific golden files; see https://github.com/docker/cli/pull/4610") diff --git a/cli/compose/loader/testdata/full-example.json.golden b/cli/compose/loader/testdata/full-example.json.golden index 4f0a08d97009..c0ef39dabe37 100644 --- a/cli/compose/loader/testdata/full-example.json.golden +++ b/cli/compose/loader/testdata/full-example.json.golden @@ -181,9 +181,7 @@ } } ] - }, - "memswap_limit": 86000, - "mem_swappiness": 27 + } }, "restart_policy": { "condition": "on-failure", @@ -515,7 +513,7 @@ "working_dir": "/code" } }, - "version": "3.14", + "version": "3.13", "volumes": { "another-volume": { "name": "user_specified_name", diff --git a/cli/compose/loader/testdata/full-example.yaml.golden b/cli/compose/loader/testdata/full-example.yaml.golden index a69b7d2f31e3..dfc57f15419f 100644 --- a/cli/compose/loader/testdata/full-example.yaml.golden +++ b/cli/compose/loader/testdata/full-example.yaml.golden @@ -1,4 +1,4 @@ -version: "3.14" +version: "3.13" services: foo: build: @@ -73,8 +73,6 @@ services: - discrete_resource_spec: kind: ssd value: 1 - memswap_limit: 86000 - mem_swappiness: 27 restart_policy: condition: on-failure delay: 5s diff --git a/cli/compose/schema/data/config_schema_v3.14.json b/cli/compose/schema/data/config_schema_v3.14.json deleted file mode 100644 index 5189f8d0186f..000000000000 --- a/cli/compose/schema/data/config_schema_v3.14.json +++ /dev/null @@ -1,686 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "config_schema_v3.14.json", - "type": "object", - - "properties": { - "version": { - "type": "string", - "default": "3.14" - }, - - "services": { - "id": "#/properties/services", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/service" - } - }, - "additionalProperties": false - }, - - "networks": { - "id": "#/properties/networks", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/network" - } - } - }, - - "volumes": { - "id": "#/properties/volumes", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/volume" - } - }, - "additionalProperties": false - }, - - "secrets": { - "id": "#/properties/secrets", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/secret" - } - }, - "additionalProperties": false - }, - - "configs": { - "id": "#/properties/configs", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/config" - } - }, - "additionalProperties": false - } - }, - - "patternProperties": {"^x-": {}}, - "additionalProperties": false, - - "definitions": { - - "service": { - "id": "#/definitions/service", - "type": "object", - - "properties": { - "deploy": {"$ref": "#/definitions/deployment"}, - "build": { - "oneOf": [ - {"type": "string"}, - { - "type": "object", - "properties": { - "context": {"type": "string"}, - "dockerfile": {"type": "string"}, - "args": {"$ref": "#/definitions/list_or_dict"}, - "labels": {"$ref": "#/definitions/list_or_dict"}, - "cache_from": {"$ref": "#/definitions/list_of_strings"}, - "network": {"type": "string"}, - "target": {"type": "string"}, - "shm_size": {"type": ["integer", "string"]}, - "extra_hosts": {"$ref": "#/definitions/list_or_dict"} - }, - "additionalProperties": true - } - ] - }, - "cap_add": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "cap_drop": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "cgroupns_mode": {"type": "string"}, - "cgroup_parent": {"type": "string"}, - "command": { - "oneOf": [ - {"type": "string"}, - {"type": "array", "items": {"type": "string"}} - ] - }, - "configs": { - "type": "array", - "items": { - "oneOf": [ - {"type": "string"}, - { - "type": "object", - "properties": { - "source": {"type": "string"}, - "target": {"type": "string"}, - "uid": {"type": "string"}, - "gid": {"type": "string"}, - "mode": {"type": "number"} - } - } - ] - } - }, - "container_name": {"type": "string"}, - "credential_spec": { - "type": "object", - "properties": { - "config": {"type": "string"}, - "file": {"type": "string"}, - "registry": {"type": "string"} - }, - "additionalProperties": false - }, - "depends_on": {"$ref": "#/definitions/list_of_strings"}, - "devices": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "dns": {"$ref": "#/definitions/string_or_list"}, - "dns_search": {"$ref": "#/definitions/string_or_list"}, - "domainname": {"type": "string"}, - "entrypoint": { - "oneOf": [ - {"type": "string"}, - {"type": "array", "items": {"type": "string"}} - ] - }, - "env_file": {"$ref": "#/definitions/string_or_list"}, - "environment": {"$ref": "#/definitions/list_or_dict"}, - - "expose": { - "type": "array", - "items": { - "type": ["string", "number"], - "format": "expose" - }, - "uniqueItems": true - }, - - "external_links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "extra_hosts": {"$ref": "#/definitions/list_or_dict"}, - "healthcheck": {"$ref": "#/definitions/healthcheck"}, - "hostname": {"type": "string"}, - "image": {"type": "string"}, - "init": {"type": "boolean"}, - "ipc": {"type": "string"}, - "isolation": {"type": "string"}, - "labels": {"$ref": "#/definitions/list_or_dict"}, - "links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - - "logging": { - "type": "object", - - "properties": { - "driver": {"type": "string"}, - "options": { - "type": "object", - "patternProperties": { - "^.+$": {"type": ["string", "number", "null"]} - } - } - }, - "additionalProperties": false - }, - - "mac_address": {"type": "string"}, - "network_mode": {"type": "string"}, - - "networks": { - "oneOf": [ - {"$ref": "#/definitions/list_of_strings"}, - { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "oneOf": [ - { - "type": "object", - "properties": { - "aliases": {"$ref": "#/definitions/list_of_strings"}, - "driver_opts": { - "type": "object", - "patternProperties": { - "^.+$": { "type": ["string", "number"] } - } - }, - "ipv4_address": {"type": "string"}, - "ipv6_address": {"type": "string"} - }, - "additionalProperties": false - }, - {"type": "null"} - ] - } - }, - "additionalProperties": false - } - ] - }, - "pid": {"type": ["string", "null"]}, - - "ports": { - "type": "array", - "items": { - "oneOf": [ - {"type": "number", "format": "ports"}, - {"type": "string", "format": "ports"}, - { - "type": "object", - "properties": { - "mode": {"type": "string"}, - "target": {"type": "integer"}, - "published": {"type": "integer"}, - "protocol": {"type": "string"} - }, - "additionalProperties": false - } - ] - }, - "uniqueItems": true - }, - - "privileged": {"type": "boolean"}, - "read_only": {"type": "boolean"}, - "restart": {"type": "string"}, - "security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "shm_size": {"type": ["number", "string"]}, - "secrets": { - "type": "array", - "items": { - "oneOf": [ - {"type": "string"}, - { - "type": "object", - "properties": { - "source": {"type": "string"}, - "target": {"type": "string"}, - "uid": {"type": "string"}, - "gid": {"type": "string"}, - "mode": {"type": "number"} - } - } - ] - } - }, - "sysctls": {"$ref": "#/definitions/list_or_dict"}, - "stdin_open": {"type": "boolean"}, - "stop_grace_period": {"type": "string", "format": "duration"}, - "stop_signal": {"type": "string"}, - "tmpfs": {"$ref": "#/definitions/string_or_list"}, - "tty": {"type": "boolean"}, - "ulimits": { - "type": "object", - "patternProperties": { - "^[a-z]+$": { - "oneOf": [ - {"type": "integer"}, - { - "type":"object", - "properties": { - "hard": {"type": "integer"}, - "soft": {"type": "integer"} - }, - "required": ["soft", "hard"], - "additionalProperties": false - } - ] - } - } - }, - "oom_score_adj": {"type": "integer"}, - "user": {"type": "string"}, - "userns_mode": {"type": "string"}, - "volumes": { - "type": "array", - "items": { - "oneOf": [ - {"type": "string"}, - { - "type": "object", - "required": ["type"], - "properties": { - "type": {"type": "string"}, - "source": {"type": "string"}, - "target": {"type": "string"}, - "read_only": {"type": "boolean"}, - "consistency": {"type": "string"}, - "bind": { - "type": "object", - "properties": { - "propagation": {"type": "string"} - } - }, - "volume": { - "type": "object", - "properties": { - "nocopy": {"type": "boolean"} - } - }, - "tmpfs": { - "type": "object", - "properties": { - "size": { - "type": "integer", - "minimum": 0 - } - } - } - }, - "additionalProperties": false - } - ], - "uniqueItems": true - } - }, - "working_dir": {"type": "string"} - }, - "patternProperties": {"^x-": {}}, - "additionalProperties": false - }, - - "healthcheck": { - "id": "#/definitions/healthcheck", - "type": "object", - "additionalProperties": false, - "properties": { - "disable": {"type": "boolean"}, - "interval": {"type": "string", "format": "duration"}, - "retries": {"type": "number"}, - "test": { - "oneOf": [ - {"type": "string"}, - {"type": "array", "items": {"type": "string"}} - ] - }, - "timeout": {"type": "string", "format": "duration"}, - "start_period": {"type": "string", "format": "duration"}, - "start_interval": {"type": "string", "format": "duration"} - } - }, - "deployment": { - "id": "#/definitions/deployment", - "type": ["object", "null"], - "properties": { - "mode": {"type": "string"}, - "endpoint_mode": {"type": "string"}, - "replicas": {"type": "integer"}, - "labels": {"$ref": "#/definitions/list_or_dict"}, - "rollback_config": { - "type": "object", - "properties": { - "parallelism": {"type": "integer"}, - "delay": {"type": "string", "format": "duration"}, - "failure_action": {"type": "string"}, - "monitor": {"type": "string", "format": "duration"}, - "max_failure_ratio": {"type": "number"}, - "order": {"type": "string", "enum": [ - "start-first", "stop-first" - ]} - }, - "additionalProperties": false - }, - "update_config": { - "type": "object", - "properties": { - "parallelism": {"type": "integer"}, - "delay": {"type": "string", "format": "duration"}, - "failure_action": {"type": "string"}, - "monitor": {"type": "string", "format": "duration"}, - "max_failure_ratio": {"type": "number"}, - "order": {"type": "string", "enum": [ - "start-first", "stop-first" - ]} - }, - "additionalProperties": false - }, - "resources": { - "type": "object", - "properties": { - "limits": { - "type": "object", - "properties": { - "cpus": {"type": "string"}, - "memory": {"type": "string"}, - "pids": {"type": "integer"} - }, - "additionalProperties": false - }, - "reservations": { - "type": "object", - "properties": { - "cpus": {"type": "string"}, - "memory": {"type": "string"}, - "generic_resources": {"$ref": "#/definitions/generic_resources"} - }, - "additionalProperties": false - }, - "memswap_limit": { - "type": "integer" - }, - "mem_swappiness": { - "type": "integer" - } - }, - "additionalProperties": false - }, - "restart_policy": { - "type": "object", - "properties": { - "condition": {"type": "string"}, - "delay": {"type": "string", "format": "duration"}, - "max_attempts": {"type": "integer"}, - "window": {"type": "string", "format": "duration"} - }, - "additionalProperties": false - }, - "placement": { - "type": "object", - "properties": { - "constraints": {"type": "array", "items": {"type": "string"}}, - "preferences": { - "type": "array", - "items": { - "type": "object", - "properties": { - "spread": {"type": "string"} - }, - "additionalProperties": false - } - }, - "max_replicas_per_node": {"type": "integer"} - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - - "generic_resources": { - "id": "#/definitions/generic_resources", - "type": "array", - "items": { - "type": "object", - "properties": { - "discrete_resource_spec": { - "type": "object", - "properties": { - "kind": {"type": "string"}, - "value": {"type": "number"} - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - - "network": { - "id": "#/definitions/network", - "type": ["object", "null"], - "properties": { - "name": {"type": "string"}, - "driver": {"type": "string"}, - "driver_opts": { - "type": "object", - "patternProperties": { - "^.+$": {"type": ["string", "number"]} - } - }, - "ipam": { - "type": "object", - "properties": { - "driver": {"type": "string"}, - "config": { - "type": "array", - "items": { - "type": "object", - "properties": { - "subnet": {"type": "string"} - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "external": { - "type": ["boolean", "object"], - "properties": { - "name": {"type": "string"} - }, - "additionalProperties": false - }, - "internal": {"type": "boolean"}, - "attachable": {"type": "boolean"}, - "labels": {"$ref": "#/definitions/list_or_dict"} - }, - "patternProperties": {"^x-": {}}, - "additionalProperties": false - }, - - "volume": { - "id": "#/definitions/volume", - "type": ["object", "null"], - "properties": { - "name": {"type": "string"}, - "driver": {"type": "string"}, - "driver_opts": { - "type": "object", - "patternProperties": { - "^.+$": {"type": ["string", "number"]} - } - }, - "external": { - "type": ["boolean", "object"], - "properties": { - "name": {"type": "string"} - }, - "additionalProperties": false - }, - "labels": {"$ref": "#/definitions/list_or_dict"}, - "x-cluster-spec": { - "type": "object", - "properties": { - "group": {"type": "string"}, - "access_mode": { - "type": "object", - "properties": { - "scope": {"type": "string"}, - "sharing": {"type": "string"}, - "block_volume": {"type": "object"}, - "mount_volume": { - "type": "object", - "properties": { - "fs_type": {"type": "string"}, - "mount_flags": {"type": "array", "items": {"type": "string"}} - } - } - } - }, - "accessibility_requirements": { - "type": "object", - "properties": { - "requisite": { - "type": "array", - "items": { - "type": "object", - "properties": { - "segments": {"$ref": "#/definitions/list_or_dict"} - } - } - }, - "preferred": { - "type": "array", - "items": { - "type": "object", - "properties": { - "segments": {"$ref": "#/definitions/list_or_dict"} - } - } - } - } - }, - "capacity_range": { - "type": "object", - "properties": { - "required_bytes": {"type": "string"}, - "limit_bytes": {"type": "string"} - } - }, - "availability": {"type": "string"} - } - } - }, - "patternProperties": {"^x-": {}}, - "additionalProperties": false - }, - - "secret": { - "id": "#/definitions/secret", - "type": "object", - "properties": { - "name": {"type": "string"}, - "file": {"type": "string"}, - "external": { - "type": ["boolean", "object"], - "properties": { - "name": {"type": "string"} - } - }, - "labels": {"$ref": "#/definitions/list_or_dict"}, - "driver": {"type": "string"}, - "driver_opts": { - "type": "object", - "patternProperties": { - "^.+$": {"type": ["string", "number"]} - } - }, - "template_driver": {"type": "string"} - }, - "patternProperties": {"^x-": {}}, - "additionalProperties": false - }, - - "config": { - "id": "#/definitions/config", - "type": "object", - "properties": { - "name": {"type": "string"}, - "file": {"type": "string"}, - "external": { - "type": ["boolean", "object"], - "properties": { - "name": {"type": "string"} - } - }, - "labels": {"$ref": "#/definitions/list_or_dict"}, - "template_driver": {"type": "string"} - }, - "patternProperties": {"^x-": {}}, - "additionalProperties": false - }, - - "string_or_list": { - "oneOf": [ - {"type": "string"}, - {"$ref": "#/definitions/list_of_strings"} - ] - }, - - "list_of_strings": { - "type": "array", - "items": {"type": "string"}, - "uniqueItems": true - }, - - "list_or_dict": { - "oneOf": [ - { - "type": "object", - "patternProperties": { - ".+": { - "type": ["string", "number", "null"] - } - }, - "additionalProperties": false - }, - {"type": "array", "items": {"type": "string"}, "uniqueItems": true} - ] - }, - - "constraints": { - "service": { - "id": "#/definitions/constraints/service", - "anyOf": [ - {"required": ["build"]}, - {"required": ["image"]} - ], - "properties": { - "build": { - "required": ["context"] - } - } - } - } - } -} diff --git a/cli/compose/schema/schema.go b/cli/compose/schema/schema.go index 2725ae243427..ea8543a85957 100644 --- a/cli/compose/schema/schema.go +++ b/cli/compose/schema/schema.go @@ -15,7 +15,7 @@ import ( ) const ( - defaultVersion = "3.14" + defaultVersion = "3.13" versionField = "version" ) @@ -52,7 +52,7 @@ func init() { } // Version returns the version of the config, defaulting to the latest "3.x" -// version (3.14). If only the major version "3" is specified, it is used as +// version (3.13). If only the major version "3" is specified, it is used as // version "3.x" and returns the default version (latest 3.x). func Version(config map[string]any) string { version, ok := config[versionField] diff --git a/cli/compose/schema/schema_test.go b/cli/compose/schema/schema_test.go index 3733fc09fbff..8d039a6a8ccb 100644 --- a/cli/compose/schema/schema_test.go +++ b/cli/compose/schema/schema_test.go @@ -210,7 +210,6 @@ func TestValidateCredentialSpecs(t *testing.T) { {version: "3.11"}, {version: "3.12"}, {version: "3.13"}, - {version: "3.14"}, {version: "3"}, {version: ""}, } diff --git a/cli/compose/types/types.go b/cli/compose/types/types.go index a55eec1d2a93..fdc0eb44feda 100644 --- a/cli/compose/types/types.go +++ b/cli/compose/types/types.go @@ -307,10 +307,8 @@ type UpdateConfig struct { // Resources the resource limits and reservations type Resources struct { - Limits *ResourceLimit `yaml:",omitempty" json:"limits,omitempty"` - Reservations *Resource `yaml:",omitempty" json:"reservations,omitempty"` - MemswapLimit *int64 `mapstructure:"memswap_limit" yaml:"memswap_limit,omitempty" json:"memswap_limit,omitempty"` - MemSwappiness *int64 `mapstructure:"mem_swappiness" yaml:"mem_swappiness,omitempty" json:"mem_swappiness,omitempty"` + Limits *ResourceLimit `yaml:",omitempty" json:"limits,omitempty"` + Reservations *Resource `yaml:",omitempty" json:"reservations,omitempty"` } // ResourceLimit is a resource to be limited