Skip to content

Commit

Permalink
feat(reana_dev): add --live-logs flag (#827)
Browse files Browse the repository at this point in the history
  • Loading branch information
jlemesh committed Oct 7, 2024
1 parent ec0cf6c commit 92d00fc
Show file tree
Hide file tree
Showing 2 changed files with 195 additions and 2 deletions.
15 changes: 13 additions & 2 deletions reana/reana_dev/cluster.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@ def cluster_build(
default="reana",
help="REANA instance name",
)
@click.option("--live-logs", is_flag=True, help="Enable live job logs.")
def cluster_deploy(
namespace,
job_mounts,
Expand All @@ -303,6 +304,7 @@ def cluster_deploy(
admin_email,
admin_password,
instance_name,
live_logs,
): # noqa: D301
"""Deploy REANA cluster.
Expand Down Expand Up @@ -338,7 +340,7 @@ def job_mounts_to_config(job_mounts):

values_dict = {}
with open(os.path.join(get_srcdir("reana"), values)) as f:
values_dict = yaml.safe_load(f.read())
values_dict = yaml.safe_load(f.read()) or {}

job_mount_config = job_mounts_to_config(job_mounts)
if job_mount_config:
Expand All @@ -349,12 +351,21 @@ def job_mounts_to_config(job_mounts):
if mode in ("debug"):
values_dict.setdefault("debug", {})["enabled"] = True

if live_logs:
values_dict.setdefault("opensearch", {})["enabled"] = True
values_dict.setdefault("fluent-bit", {})["enabled"] = True
values_dict.setdefault("components", {}).setdefault(
"reana_workflow_controller", {}
).setdefault("environment", {})["REANA_OPENSEARCH_ENABLED"] = True

if exclude_components:
standard_named_exclude_components = [
find_standard_component_name(c) for c in exclude_components.split(",")
]
if "reana-ui" in standard_named_exclude_components:
values_dict["components"]["reana_ui"]["enabled"] = False
values_dict.setdefault("components", {}).setdefault("reana_ui", {})[
"enabled"
] = False

values_yaml = yaml.dump(values_dict) if values_dict else ""
helm_install = f"cat <<EOF | helm install {instance_name} helm/reana -n {namespace} --create-namespace --wait -f -\n{values_yaml}\nEOF"
Expand Down
182 changes: 182 additions & 0 deletions tests/test_cluster.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
# -*- coding: utf-8 -*-
#
# This file is part of REANA
# Copyright (C) 2024 CERN.
#
# REANA is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.

"""REANA CLI cluster command tests."""

from __future__ import absolute_import, print_function

import pytest

from click.testing import CliRunner
from mock import patch, mock_open
from unittest.mock import call


helm_command = """cat <<EOF | helm install reana helm/reana -n default --create-namespace --wait -f -
components:
reana_ui:
enabled: false
reana_workflow_controller:
environment:
REANA_OPENSEARCH_ENABLED: true
debug:
enabled: true
fluent-bit:
enabled: true
opensearch:
enabled: true
EOF"""


@pytest.mark.parametrize(
"options, run_command_calls, run_command_side_effects, exit_code, open_calls, open_mock_read_value",
[
(
[
"--admin-email",
"[email protected]",
"--admin-password",
"admin",
"--live-logs",
"--values",
"alternative-values-dev.yaml",
"--mode",
"debug",
"--exclude-components",
"reana-ui,reana-workflow-controller",
],
[
call("reana-dev python-install-eggs", "reana"),
call("reana-dev git-submodule --update", "reana"),
call("helm dep update helm/reana", "reana"),
call(helm_command, "reana"),
call(
"kubectl config set-context --current --namespace=default", "reana"
),
call(
"/code/src/reana/scripts/create-admin-user.sh default reana [email protected] admin",
"reana",
),
],
[None] * 6,
0,
[call("/code/src/reana/alternative-values-dev.yaml")],
"",
),
(
[
"--admin-email",
"[email protected]",
"--admin-password",
"admin",
],
[
call("helm dep update helm/reana", "reana"),
call(
"cat <<EOF | helm install reana helm/reana -n default --create-namespace --wait -f -\ncomponents:\n reana_workflow_controller:\n environment:\n REANA_OPENSEARCH_ENABLED: true\ndebug:\n enabled: true\n\nEOF",
"reana",
),
call(
"kubectl config set-context --current --namespace=default", "reana"
),
call(
"/code/src/reana/scripts/create-admin-user.sh default reana [email protected] admin",
"reana",
),
],
[None] * 4,
0,
[call("/code/src/reana/helm/configurations/values-dev.yaml")],
"debug:\n enabled: true\ncomponents:\n reana_workflow_controller:\n environment:\n REANA_OPENSEARCH_ENABLED: true\n",
),
(
[
"--admin-email",
"[email protected]",
"--admin-password",
"admin",
"--mode",
"releasehelm",
],
[
call("helm dep update helm/reana", "reana"),
call(
"cat <<EOF | helm install reana helm/reana -n default --create-namespace --wait -f -\n\nEOF",
"reana",
),
call(
"kubectl config set-context --current --namespace=default", "reana"
),
call(
"/code/src/reana/scripts/create-admin-user.sh default reana [email protected] admin",
"reana",
),
],
[None] * 4,
0,
[call("/code/src/reana/helm/reana/values.yaml")],
"",
),
(
[
"--admin-email",
"[email protected]",
"--admin-password",
"admin",
],
[
call("helm dep update helm/reana", "reana"),
call(
"cat <<EOF | helm install reana helm/reana -n default --create-namespace --wait -f -\n\nEOF",
"reana",
),
call(
"kubectl config set-context --current --namespace=default", "reana"
),
call(
"/code/src/reana/scripts/create-admin-user.sh default reana [email protected] admin",
"reana",
),
],
[None, None, None, ValueError()],
1,
[call("/code/src/reana/helm/configurations/values-dev.yaml")],
"",
),
],
)
@patch("reana.reana_dev.cluster.get_srcdir")
@patch("reana.reana_dev.cluster.run_command")
@patch("builtins.open", new_callable=mock_open)
def test_cluster_deploy(
open_mock,
run_command_mock,
get_srcdir_mock,
options,
run_command_calls,
run_command_side_effects,
exit_code,
open_calls,
open_mock_read_value,
):
"""Test cluster-deploy command."""
from reana.reana_dev.cluster import cluster_deploy

run_command_count = len(run_command_calls)
open_mock.return_value.read.return_value = open_mock_read_value

run_command_mock.side_effect = run_command_side_effects
get_srcdir_mock.return_value = "/code/src/reana"
runner = CliRunner()
result = runner.invoke(cluster_deploy, options)
assert run_command_mock.call_count == run_command_count
assert run_command_mock.call_args_list == run_command_calls
assert result.exit_code == exit_code
assert open_mock.call_count == len(open_calls)
assert open_mock.call_args_list == open_calls

0 comments on commit 92d00fc

Please sign in to comment.