# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
# with the License. A copy of the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "LICENSE.txt" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions and
# limitations under the License.
import pytest

from pcluster.config.cluster_config import CloudWatchLogs, LogRotation, Logs
from pcluster.validators.monitoring_validators import DetailedMonitoringValidator, LogRotationValidator
from tests.pcluster.validators.utils import assert_failure_messages


@pytest.mark.parametrize(
    "logs, expected_message",
    [
        (Logs(cloud_watch=CloudWatchLogs(enabled=True), rotation=LogRotation(enabled=True)), None),
        (Logs(cloud_watch=CloudWatchLogs(enabled=False), rotation=LogRotation(enabled=False)), None),
        (Logs(rotation=LogRotation(enabled=False)), None),
        (Logs(rotation=LogRotation(enabled=True)), None),
        (
            Logs(cloud_watch=CloudWatchLogs(enabled=False), rotation=LogRotation(enabled=True)),
            "Cloudwatch Logging is disabled but Log Rotation is enabled. Logs will be rotated and removed from the "
            "cluster once they reach a certain size. If you want to keep logs locally within the cluster, please "
            "set `Monitoring / Logs / Rotation / Enabled` to false.",
        ),
    ],
)
def test_compute_console_logging_validator(logs, expected_message):
    actual_failures = LogRotationValidator().execute(logs)
    assert_failure_messages(actual_failures, expected_message)


@pytest.mark.parametrize(
    "is_detailed_monitoring_enabled, expected_message",
    [
        (False, None),
        (
            True,
            "Detailed Monitoring is enabled for EC2 instances in your compute fleet. The Amazon EC2 console will "
            "display monitoring graphs with a 1-minute period for these instances. Note that this will increase "
            "the cost. If you want to avoid this and use basic monitoring instead, please set "
            "`Monitoring / DetailedMonitoring` to false.",
        ),
    ],
)
def test_detailed_monitoring_validator(is_detailed_monitoring_enabled, expected_message):
    actual_failures = DetailedMonitoringValidator().execute(is_detailed_monitoring_enabled)
    assert_failure_messages(actual_failures, expected_message)