import pytest
-from ceph.deployment.service_spec import HostPlacementSpec, PlacementSpec, \
- ServiceSpec, RGWSpec, NFSServiceSpec, IscsiServiceSpec, AlertManagerSpec, \
- CustomContainerSpec, GrafanaSpec, PrometheusSpec
+from ceph.deployment.service_spec import (
+ AlertManagerSpec,
+ ArgumentSpec,
+ CustomContainerSpec,
+ GrafanaSpec,
+ HostPlacementSpec,
+ IscsiServiceSpec,
+ NFSServiceSpec,
+ PlacementSpec,
+ PrometheusSpec,
+ RGWSpec,
+ ServiceSpec,
+)
from ceph.deployment.drive_group import DriveGroupSpec
from ceph.deployment.hostspec import SpecValidationError
- host3
spec:
backend_service: rgw.foo
+ first_virtual_router_id: 50
frontend_port: 8080
monitor_port: 8081
virtual_ip: 192.168.20.1/24
with pytest.raises(SpecValidationError) as err:
specObj = ServiceSpec.from_json(data)
assert err.match(error_match)
+
+
+@pytest.mark.parametrize("y, ec_args, ee_args, ec_final_args, ee_final_args", [
+ pytest.param("""
+service_type: container
+service_id: hello-world
+service_name: container.hello-world
+spec:
+ args:
+ - --foo
+ bind_mounts:
+ - - type=bind
+ - source=lib/modules
+ - destination=/lib/modules
+ - ro=true
+ dirs:
+ - foo
+ - bar
+ entrypoint: /usr/bin/bash
+ envs:
+ - FOO=0815
+ files:
+ bar.conf:
+ - foo
+ - bar
+ foo.conf: 'foo
+
+ bar'
+ gid: 2000
+ image: docker.io/library/hello-world:latest
+ ports:
+ - 8080
+ - 8443
+ uid: 1000
+ volume_mounts:
+ foo: /foo
+""",
+ None,
+ None,
+ None,
+ None,
+ id="no_extra_args"),
+ pytest.param("""
+service_type: container
+service_id: hello-world
+service_name: container.hello-world
+spec:
+ args:
+ - --foo
+ extra_entrypoint_args:
+ - "--lasers=blue"
+ - "--enable-confetti"
+ bind_mounts:
+ - - type=bind
+ - source=lib/modules
+ - destination=/lib/modules
+ - ro=true
+ dirs:
+ - foo
+ - bar
+ entrypoint: /usr/bin/bash
+ envs:
+ - FOO=0815
+ files:
+ bar.conf:
+ - foo
+ - bar
+ foo.conf: 'foo
+
+ bar'
+ gid: 2000
+ image: docker.io/library/hello-world:latest
+ ports:
+ - 8080
+ - 8443
+ uid: 1000
+ volume_mounts:
+ foo: /foo
+""",
+ None,
+ ["--lasers=blue", "--enable-confetti"],
+ None,
+ ["--lasers=blue", "--enable-confetti"],
+ id="only_extra_entrypoint_args_spec"),
+ pytest.param("""
+service_type: container
+service_id: hello-world
+service_name: container.hello-world
+spec:
+ args:
+ - --foo
+ bind_mounts:
+ - - type=bind
+ - source=lib/modules
+ - destination=/lib/modules
+ - ro=true
+ dirs:
+ - foo
+ - bar
+ entrypoint: /usr/bin/bash
+ envs:
+ - FOO=0815
+ files:
+ bar.conf:
+ - foo
+ - bar
+ foo.conf: 'foo
+
+ bar'
+ gid: 2000
+ image: docker.io/library/hello-world:latest
+ ports:
+ - 8080
+ - 8443
+ uid: 1000
+ volume_mounts:
+ foo: /foo
+extra_entrypoint_args:
+- "--lasers blue"
+- "--enable-confetti"
+""",
+ None,
+ ["--lasers blue", "--enable-confetti"],
+ None,
+ ["--lasers", "blue", "--enable-confetti"],
+ id="only_extra_entrypoint_args_toplevel"),
+ pytest.param("""
+service_type: nfs
+service_id: mynfs
+service_name: nfs.mynfs
+spec:
+ port: 1234
+ extra_entrypoint_args:
+ - "--lasers=blue"
+ - "--title=Custom NFS Options"
+ extra_container_args:
+ - "--cap-add=CAP_NET_BIND_SERVICE"
+ - "--oom-score-adj=12"
+""",
+ ["--cap-add=CAP_NET_BIND_SERVICE", "--oom-score-adj=12"],
+ ["--lasers=blue", "--title=Custom NFS Options"],
+ ["--cap-add=CAP_NET_BIND_SERVICE", "--oom-score-adj=12"],
+ ["--lasers=blue", "--title=Custom", "NFS", "Options"],
+ id="both_kinds_nfs"),
+ pytest.param("""
+service_type: container
+service_id: hello-world
+service_name: container.hello-world
+spec:
+ args:
+ - --foo
+ bind_mounts:
+ - - type=bind
+ - source=lib/modules
+ - destination=/lib/modules
+ - ro=true
+ dirs:
+ - foo
+ - bar
+ entrypoint: /usr/bin/bash
+ envs:
+ - FOO=0815
+ files:
+ bar.conf:
+ - foo
+ - bar
+ foo.conf: 'foo
+
+ bar'
+ gid: 2000
+ image: docker.io/library/hello-world:latest
+ ports:
+ - 8080
+ - 8443
+ uid: 1000
+ volume_mounts:
+ foo: /foo
+extra_entrypoint_args:
+- argument: "--lasers=blue"
+ split: true
+- argument: "--enable-confetti"
+""",
+ None,
+ [
+ {"argument": "--lasers=blue", "split": True},
+ {"argument": "--enable-confetti", "split": False},
+ ],
+ None,
+ [
+ "--lasers=blue",
+ "--enable-confetti",
+ ],
+ id="only_extra_entrypoint_args_obj_toplevel"),
+ pytest.param("""
+service_type: container
+service_id: hello-world
+service_name: container.hello-world
+spec:
+ args:
+ - --foo
+ bind_mounts:
+ - - type=bind
+ - source=lib/modules
+ - destination=/lib/modules
+ - ro=true
+ dirs:
+ - foo
+ - bar
+ entrypoint: /usr/bin/bash
+ envs:
+ - FOO=0815
+ files:
+ bar.conf:
+ - foo
+ - bar
+ foo.conf: 'foo
+
+ bar'
+ gid: 2000
+ image: docker.io/library/hello-world:latest
+ ports:
+ - 8080
+ - 8443
+ uid: 1000
+ volume_mounts:
+ foo: /foo
+ extra_entrypoint_args:
+ - argument: "--lasers=blue"
+ split: true
+ - argument: "--enable-confetti"
+""",
+ None,
+ [
+ {"argument": "--lasers=blue", "split": True},
+ {"argument": "--enable-confetti", "split": False},
+ ],
+ None,
+ [
+ "--lasers=blue",
+ "--enable-confetti",
+ ],
+ id="only_extra_entrypoint_args_obj_indented"),
+ pytest.param("""
+service_type: nfs
+service_id: mynfs
+service_name: nfs.mynfs
+spec:
+ port: 1234
+extra_entrypoint_args:
+- argument: "--lasers=blue"
+- argument: "--title=Custom NFS Options"
+extra_container_args:
+- argument: "--cap-add=CAP_NET_BIND_SERVICE"
+- argument: "--oom-score-adj=12"
+""",
+ [
+ {"argument": "--cap-add=CAP_NET_BIND_SERVICE", "split": False},
+ {"argument": "--oom-score-adj=12", "split": False},
+ ],
+ [
+ {"argument": "--lasers=blue", "split": False},
+ {"argument": "--title=Custom NFS Options", "split": False},
+ ],
+ [
+ "--cap-add=CAP_NET_BIND_SERVICE",
+ "--oom-score-adj=12",
+ ],
+ [
+ "--lasers=blue",
+ "--title=Custom NFS Options",
+ ],
+ id="both_kinds_obj_nfs"),
+])
+def test_extra_args_handling(y, ec_args, ee_args, ec_final_args, ee_final_args):
+ data = yaml.safe_load(y)
+ spec_obj = ServiceSpec.from_json(data)
+
+ assert ArgumentSpec.map_json(spec_obj.extra_container_args) == ec_args
+ assert ArgumentSpec.map_json(spec_obj.extra_entrypoint_args) == ee_args
+ if ec_final_args is None:
+ assert spec_obj.extra_container_args is None
+ else:
+ ec_res = []
+ for args in spec_obj.extra_container_args:
+ ec_res.extend(args.to_args())
+ assert ec_res == ec_final_args
+ if ee_final_args is None:
+ assert spec_obj.extra_entrypoint_args is None
+ else:
+ ee_res = []
+ for args in spec_obj.extra_entrypoint_args:
+ ee_res.extend(args.to_args())
+ assert ee_res == ee_final_args