Browse Source

Merge pull request #4563 from shin-/3723-mem-reservation

Add mem_reservation option to service config in 2.0 and 2.1 formats
Joffrey F 8 years ago
parent
commit
dd4e49ef98

+ 2 - 1
compose/config/config.py

@@ -76,7 +76,8 @@ DOCKER_CONFIG_KEYS = [
     'labels',
     'links',
     'mac_address',
-    'mem_limit',
+    'mem_limit'
+    'mem_reservation',
     'memswap_limit',
     'mem_swappiness',
     'net',

+ 2 - 1
compose/config/config_schema_v2.0.json

@@ -145,8 +145,9 @@
 
         "mac_address": {"type": "string"},
         "mem_limit": {"type": ["number", "string"]},
-        "memswap_limit": {"type": ["number", "string"]},
+        "mem_reservation": {"type": ["string", "integer"]},
         "mem_swappiness": {"type": "integer"},
+        "memswap_limit": {"type": ["number", "string"]},
         "network_mode": {"type": "string"},
 
         "networks": {

+ 2 - 1
compose/config/config_schema_v2.1.json

@@ -168,8 +168,9 @@
 
         "mac_address": {"type": "string"},
         "mem_limit": {"type": ["number", "string"]},
-        "memswap_limit": {"type": ["number", "string"]},
+        "mem_reservation": {"type": ["string", "integer"]},
         "mem_swappiness": {"type": "integer"},
+        "memswap_limit": {"type": ["number", "string"]},
         "network_mode": {"type": "string"},
 
         "networks": {

+ 3 - 1
compose/service.py

@@ -64,9 +64,10 @@ DOCKER_START_KEYS = [
     'log_driver',
     'log_opt',
     'mem_limit',
+    'mem_reservation',
     'memswap_limit',
-    'oom_score_adj',
     'mem_swappiness',
+    'oom_score_adj',
     'pid',
     'pids_limit',
     'privileged',
@@ -766,6 +767,7 @@ class Service(object):
             cap_add=options.get('cap_add'),
             cap_drop=options.get('cap_drop'),
             mem_limit=options.get('mem_limit'),
+            mem_reservation=options.get('mem_reservation'),
             memswap_limit=options.get('memswap_limit'),
             ulimits=build_ulimits(options.get('ulimits')),
             log_config=log_config,

+ 5 - 0
tests/integration/service_test.py

@@ -880,6 +880,11 @@ class ServiceTest(DockerClientTestCase):
         container = create_and_start_container(service)
         self.assertEqual(container.get('HostConfig.MemorySwappiness'), 11)
 
+    def test_mem_reservation(self):
+        service = self.create_service('web', mem_reservation='20m')
+        container = create_and_start_container(service)
+        assert container.get('HostConfig.MemoryReservation') == 20 * 1024 * 1024
+
     def test_restart_always_value(self):
         service = self.create_service('web', restart={'Name': 'always'})
         container = create_and_start_container(service)

+ 14 - 0
tests/unit/service_test.py

@@ -170,6 +170,20 @@ class ServiceTest(unittest.TestCase):
             2000000000
         )
 
+    def test_mem_reservation(self):
+        self.mock_client.create_host_config.return_value = {}
+
+        service = Service(
+            name='foo',
+            image='foo',
+            hostname='name',
+            client=self.mock_client,
+            mem_reservation='512m'
+        )
+        service._get_container_create_options({'some': 'overrides'}, 1)
+        assert self.mock_client.create_host_config.called is True
+        assert self.mock_client.create_host_config.call_args[1]['mem_reservation'] == '512m'
+
     def test_cgroup_parent(self):
         self.mock_client.create_host_config.return_value = {}