|
@@ -0,0 +1,357 @@
|
|
|
+import pytest
|
|
|
+
|
|
|
+from openshift_checks.logging.fluentd_config import FluentdConfig, OpenShiftCheckException
|
|
|
+
|
|
|
+
|
|
|
+def canned_fluentd_pod(containers):
|
|
|
+ return {
|
|
|
+ "metadata": {
|
|
|
+ "labels": {"component": "fluentd", "deploymentconfig": "logging-fluentd"},
|
|
|
+ "name": "logging-fluentd-1",
|
|
|
+ },
|
|
|
+ "spec": {
|
|
|
+ "host": "node1",
|
|
|
+ "nodeName": "node1",
|
|
|
+ "containers": containers,
|
|
|
+ },
|
|
|
+ "status": {
|
|
|
+ "phase": "Running",
|
|
|
+ "containerStatuses": [{"ready": True}],
|
|
|
+ "conditions": [{"status": "True", "type": "Ready"}],
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+fluentd_pod = {
|
|
|
+ "metadata": {
|
|
|
+ "labels": {"component": "fluentd", "deploymentconfig": "logging-fluentd"},
|
|
|
+ "name": "logging-fluentd-1",
|
|
|
+ },
|
|
|
+ "spec": {
|
|
|
+ "host": "node1",
|
|
|
+ "nodeName": "node1",
|
|
|
+ "containers": [
|
|
|
+ {
|
|
|
+ "name": "container1",
|
|
|
+ "env": [
|
|
|
+ {
|
|
|
+ "name": "USE_JOURNAL",
|
|
|
+ "value": "true",
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ "status": {
|
|
|
+ "phase": "Running",
|
|
|
+ "containerStatuses": [{"ready": True}],
|
|
|
+ "conditions": [{"status": "True", "type": "Ready"}],
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+not_running_fluentd_pod = {
|
|
|
+ "metadata": {
|
|
|
+ "labels": {"component": "fluentd", "deploymentconfig": "logging-fluentd"},
|
|
|
+ "name": "logging-fluentd-2",
|
|
|
+ },
|
|
|
+ "status": {
|
|
|
+ "phase": "Unknown",
|
|
|
+ "containerStatuses": [{"ready": True}, {"ready": False}],
|
|
|
+ "conditions": [{"status": "True", "type": "Ready"}],
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.parametrize('name, use_journald, logging_driver, extra_words', [
|
|
|
+ (
|
|
|
+ 'test success with use_journald=false, and docker config set to use "json-file"',
|
|
|
+ False,
|
|
|
+ "json-file",
|
|
|
+ [],
|
|
|
+ ),
|
|
|
+], ids=lambda argvals: argvals[0])
|
|
|
+def test_check_logging_config_non_master(name, use_journald, logging_driver, extra_words):
|
|
|
+ def execute_module(module_name, args):
|
|
|
+ if module_name == "docker_info":
|
|
|
+ return {
|
|
|
+ "info": {
|
|
|
+ "LoggingDriver": logging_driver,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return {}
|
|
|
+
|
|
|
+ task_vars = dict(
|
|
|
+ group_names=["nodes", "etcd"],
|
|
|
+ openshift_logging_fluentd_use_journal=use_journald,
|
|
|
+ openshift=dict(
|
|
|
+ common=dict(config_base=""),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ check = FluentdConfig(execute_module, task_vars)
|
|
|
+ check.execute_module = execute_module
|
|
|
+ error = check.check_logging_config()
|
|
|
+
|
|
|
+ assert error is None
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.parametrize('name, use_journald, logging_driver, words', [
|
|
|
+ (
|
|
|
+ 'test failure with use_journald=false, but docker config set to use "journald"',
|
|
|
+ False,
|
|
|
+ "journald",
|
|
|
+ ['json log files', 'has been set to use "journald"'],
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ 'test failure with use_journald=false, but docker config set to use an "unsupported" driver',
|
|
|
+ False,
|
|
|
+ "unsupported",
|
|
|
+ ["json log files", 'has been set to use "unsupported"'],
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ 'test failure with use_journald=true, but docker config set to use "json-file"',
|
|
|
+ True,
|
|
|
+ "json-file",
|
|
|
+ ['logs from "journald"', 'has been set to use "json-file"'],
|
|
|
+ ),
|
|
|
+], ids=lambda argvals: argvals[0])
|
|
|
+def test_check_logging_config_non_master_failed(name, use_journald, logging_driver, words):
|
|
|
+ def execute_module(module_name, args):
|
|
|
+ if module_name == "docker_info":
|
|
|
+ return {
|
|
|
+ "info": {
|
|
|
+ "LoggingDriver": logging_driver,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return {}
|
|
|
+
|
|
|
+ task_vars = dict(
|
|
|
+ group_names=["nodes", "etcd"],
|
|
|
+ openshift_logging_fluentd_use_journal=use_journald,
|
|
|
+ openshift=dict(
|
|
|
+ common=dict(config_base=""),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ check = FluentdConfig(execute_module, task_vars)
|
|
|
+ check.execute_module = execute_module
|
|
|
+ error = check.check_logging_config()
|
|
|
+
|
|
|
+ assert error is not None
|
|
|
+ for word in words:
|
|
|
+ assert word in error
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.parametrize('name, pods, logging_driver, extra_words', [
|
|
|
+ # use_journald returns false (not using journald), but check succeeds
|
|
|
+ # since docker is set to use json-file
|
|
|
+ (
|
|
|
+ 'test success with use_journald=false, and docker config set to use default driver "json-file"',
|
|
|
+ [canned_fluentd_pod(
|
|
|
+ [
|
|
|
+ {
|
|
|
+ "name": "container1",
|
|
|
+ "env": [{
|
|
|
+ "name": "USE_JOURNAL",
|
|
|
+ "value": "false",
|
|
|
+ }],
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ )],
|
|
|
+ "json-file",
|
|
|
+ [],
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ 'test success with USE_JOURNAL env var missing and docker config set to use default driver "json-file"',
|
|
|
+ [canned_fluentd_pod(
|
|
|
+ [
|
|
|
+ {
|
|
|
+ "name": "container1",
|
|
|
+ "env": [{
|
|
|
+ "name": "RANDOM",
|
|
|
+ "value": "value",
|
|
|
+ }],
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ )],
|
|
|
+ "json-file",
|
|
|
+ [],
|
|
|
+ ),
|
|
|
+], ids=lambda argvals: argvals[0])
|
|
|
+def test_check_logging_config_master(name, pods, logging_driver, extra_words):
|
|
|
+ def execute_module(module_name, args):
|
|
|
+ if module_name == "docker_info":
|
|
|
+ return {
|
|
|
+ "info": {
|
|
|
+ "LoggingDriver": logging_driver,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return {}
|
|
|
+
|
|
|
+ task_vars = dict(
|
|
|
+ group_names=["masters"],
|
|
|
+ openshift=dict(
|
|
|
+ common=dict(config_base=""),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ def get_pods(namespace, logging_component):
|
|
|
+ return pods, None
|
|
|
+
|
|
|
+ check = FluentdConfig(execute_module, task_vars)
|
|
|
+ check.execute_module = execute_module
|
|
|
+ check.get_pods_for_component = get_pods
|
|
|
+ error = check.check_logging_config()
|
|
|
+
|
|
|
+ assert error is None
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.parametrize('name, pods, logging_driver, words', [
|
|
|
+ (
|
|
|
+ 'test failure with use_journald=false, but docker config set to use "journald"',
|
|
|
+ [canned_fluentd_pod(
|
|
|
+ [
|
|
|
+ {
|
|
|
+ "name": "container1",
|
|
|
+ "env": [{
|
|
|
+ "name": "USE_JOURNAL",
|
|
|
+ "value": "false",
|
|
|
+ }],
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ )],
|
|
|
+ "journald",
|
|
|
+ ['json log files', 'has been set to use "journald"'],
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ 'test failure with use_journald=true, but docker config set to use "json-file"',
|
|
|
+ [fluentd_pod],
|
|
|
+ "json-file",
|
|
|
+ ['logs from "journald"', 'has been set to use "json-file"'],
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ 'test failure with use_journald=false, but docker set to use an "unsupported" driver',
|
|
|
+ [canned_fluentd_pod(
|
|
|
+ [
|
|
|
+ {
|
|
|
+ "name": "container1",
|
|
|
+ "env": [{
|
|
|
+ "name": "USE_JOURNAL",
|
|
|
+ "value": "false",
|
|
|
+ }],
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ )],
|
|
|
+ "unsupported",
|
|
|
+ ["json log files", 'has been set to use "unsupported"'],
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ 'test failure with USE_JOURNAL env var missing and docker config set to use "journald"',
|
|
|
+ [canned_fluentd_pod(
|
|
|
+ [
|
|
|
+ {
|
|
|
+ "name": "container1",
|
|
|
+ "env": [{
|
|
|
+ "name": "RANDOM",
|
|
|
+ "value": "value",
|
|
|
+ }],
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ )],
|
|
|
+ "journald",
|
|
|
+ ["configuration is set to", "json log files"],
|
|
|
+ ),
|
|
|
+], ids=lambda argvals: argvals[0])
|
|
|
+def test_check_logging_config_master_failed(name, pods, logging_driver, words):
|
|
|
+ def execute_module(module_name, args):
|
|
|
+ if module_name == "docker_info":
|
|
|
+ return {
|
|
|
+ "info": {
|
|
|
+ "LoggingDriver": logging_driver,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return {}
|
|
|
+
|
|
|
+ task_vars = dict(
|
|
|
+ group_names=["masters"],
|
|
|
+ openshift=dict(
|
|
|
+ common=dict(config_base=""),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ def get_pods(namespace, logging_component):
|
|
|
+ return pods, None
|
|
|
+
|
|
|
+ check = FluentdConfig(execute_module, task_vars)
|
|
|
+ check.execute_module = execute_module
|
|
|
+ check.get_pods_for_component = get_pods
|
|
|
+ error = check.check_logging_config()
|
|
|
+
|
|
|
+ assert error is not None
|
|
|
+ for word in words:
|
|
|
+ assert word in error
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.parametrize('name, pods, response, logging_driver, extra_words', [
|
|
|
+ (
|
|
|
+ 'test OpenShiftCheckException with no running containers',
|
|
|
+ [canned_fluentd_pod([])],
|
|
|
+ {
|
|
|
+ "failed": True,
|
|
|
+ "result": "unexpected",
|
|
|
+ },
|
|
|
+ "json-file",
|
|
|
+ ['no running containers'],
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ 'test OpenShiftCheckException one container and no env vars set',
|
|
|
+ [canned_fluentd_pod(
|
|
|
+ [
|
|
|
+ {
|
|
|
+ "name": "container1",
|
|
|
+ "env": [],
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ )],
|
|
|
+ {
|
|
|
+ "failed": True,
|
|
|
+ "result": "unexpected",
|
|
|
+ },
|
|
|
+ "json-file",
|
|
|
+ ['no environment variables'],
|
|
|
+ ),
|
|
|
+], ids=lambda argvals: argvals[0])
|
|
|
+def test_check_logging_config_master_fails_on_unscheduled_deployment(name, pods, response, logging_driver, extra_words):
|
|
|
+ def execute_module(module_name, args):
|
|
|
+ if module_name == "docker_info":
|
|
|
+ return {
|
|
|
+ "info": {
|
|
|
+ "LoggingDriver": logging_driver,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return {}
|
|
|
+
|
|
|
+ task_vars = dict(
|
|
|
+ group_names=["masters"],
|
|
|
+ openshift=dict(
|
|
|
+ common=dict(config_base=""),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ def get_pods(namespace, logging_component):
|
|
|
+ return pods, None
|
|
|
+
|
|
|
+ check = FluentdConfig(execute_module, task_vars)
|
|
|
+ check.get_pods_for_component = get_pods
|
|
|
+
|
|
|
+ with pytest.raises(OpenShiftCheckException) as error:
|
|
|
+ check.check_logging_config()
|
|
|
+
|
|
|
+ assert error is not None
|
|
|
+ for word in extra_words:
|
|
|
+ assert word in str(error)
|