From 201919824f5afd0f73c9d787aec23f4e7004bb0e Mon Sep 17 00:00:00 2001 From: Alexey Rokhin Date: Thu, 18 May 2017 01:43:04 +0300 Subject: [PATCH] move cpus validation to validation.py Signed-off-by: Alexey Rokhin --- compose/config/config.py | 2 ++ compose/config/validation.py | 11 +++++++++++ compose/const.py | 1 + compose/service.py | 6 ++---- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/compose/config/config.py b/compose/config/config.py index 056847a85..4fddac822 100644 --- a/compose/config/config.py +++ b/compose/config/config.py @@ -38,6 +38,7 @@ from .types import VolumeSpec from .validation import match_named_volumes from .validation import validate_against_config_schema from .validation import validate_config_section +from .validation import validate_cpu from .validation import validate_depends_on from .validation import validate_extends_file_path from .validation import validate_links @@ -643,6 +644,7 @@ def validate_service(service_config, service_names, config_file): validate_service_constraints(service_dict, service_name, config_file) validate_paths(service_dict) + validate_cpu(service_config) validate_ulimits(service_config) validate_network_mode(service_config, service_names) validate_depends_on(service_config, service_names) diff --git a/compose/config/validation.py b/compose/config/validation.py index 1df6dd6b7..856f811c5 100644 --- a/compose/config/validation.py +++ b/compose/config/validation.py @@ -15,6 +15,7 @@ from jsonschema import RefResolver from jsonschema import ValidationError from ..const import COMPOSEFILE_V1 as V1 +from ..const import NANOCPUS_SCALE from .errors import ConfigurationError from .errors import VERSION_EXPLANATION from .sort_services import get_service_name_from_network_mode @@ -387,6 +388,16 @@ def validate_service_constraints(config, service_name, config_file): handle_errors(validator.iter_errors(config), handler, None) +def validate_cpu(service_config): + cpus = service_config.config.get('cpus') + if not cpus: + return + nano_cpus = cpus * NANOCPUS_SCALE + if isinstance(nano_cpus, float) and not nano_cpus.is_integer(): + raise ConfigurationError( + "cpus must have nine or less digits after decimal point") + + def get_schema_path(): return os.path.dirname(os.path.abspath(__file__)) diff --git a/compose/const.py b/compose/const.py index 573136d5d..36703138a 100644 --- a/compose/const.py +++ b/compose/const.py @@ -15,6 +15,7 @@ LABEL_NETWORK = 'com.docker.compose.network' LABEL_VERSION = 'com.docker.compose.version' LABEL_VOLUME = 'com.docker.compose.volume' LABEL_CONFIG_HASH = 'com.docker.compose.config-hash' +NANOCPUS_SCALE = 1000000000 SECRETS_PATH = '/run/secrets' diff --git a/compose/service.py b/compose/service.py index 515992ad4..19873d5e5 100644 --- a/compose/service.py +++ b/compose/service.py @@ -34,6 +34,7 @@ from .const import LABEL_ONE_OFF from .const import LABEL_PROJECT from .const import LABEL_SERVICE from .const import LABEL_VERSION +from .const import NANOCPUS_SCALE from .container import Container from .errors import HealthCheckFailed from .errors import NoHealthCheckConfigured @@ -803,10 +804,7 @@ class Service(object): nano_cpus = None if 'cpus' in options: - nano_cpus = options.get('cpus') * 1000000000 - if isinstance(nano_cpus, float) and not nano_cpus.is_integer(): - raise ValueError("cpus is too precise") - nano_cpus = int(nano_cpus) + nano_cpus = int(options.get('cpus') * NANOCPUS_SCALE) return self.client.create_host_config( links=self._get_links(link_to_self=one_off),