# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set-strictmode -version latest

. "$(& git rev-parse --show-toplevel)/deploy/Kubernetes/_build/helm-test.ps1"

$tests = @(
  @{
    name = 'basic'
    expected = 0
    matches = @(
      @{
        indent = 6
        lines = @(
          'labels:'
          '  app: test'
          '  app.kubernetes.io/component: test_dynemo_chart'
          '  app.kubernetes.io/instance: test'
          '  app.kubernetes.io/name: test_dynemo_chart'
          '  app.kubernetes.io/part-of: dynemo'
          '  app.kubernetes.io/version: "1.0.0"'
          '  app.kubernetes.io/managed-by: Helm'
          '  helm.sh/chart: "dynemo_component"'
          '  helm.sh/version: "1.0.0"'
        )
      }
      @{
        indent = 8
        lines = @(
          '- containerPort: 8000'
          '  name: health'
        )
      }
      @{
        indent = 8
        lines = @(
          '- containerPort: 9345'
          '  name: request'
        )
      }
      @{
        indent = 8
        lines = @(
          '- containerPort: 443'
          '  name: api'
        )
      }
      @{
        indent = 8
        lines = @(
          '- containerPort: 9347'
          '  name: metrics'
        )
      }
      @{
        indent = 10
        lines = @(
          'limits:'
          '  cpu: 4'
          '  ephemeral-storage: 1Gi'
          '  nvidia.com/gpu: 1'
          '  memory: 16Gi'
        )
      }
      @{
        indent = 10
        lines = @(
          'requests:'
          '  cpu: 4'
          '  ephemeral-storage: 1Gi'
          '  nvidia.com/gpu: 1'
          '  memory: 16Gi'
        )
      }
    )
    options = @()
    values = @(
      'basic.yaml'
    )
  }
  @{
    name = "resource_gpu"
    expected = 0
    matches = @(
      @{
        indent = 14
        lines = @(
          '- key: nvidia.com/gpu'
          '  operator: Exists'
        )
      }
      @{
        indent = 14
        lines = @(
          '- key: nvidia.com/gpu.product'
          '  operator: In'
          '  values:'
          '  - a10g'
        )
      }
      @{
        indent = 10
        lines = @(
          'limits:'
          '  cpu: 4'
          '  ephemeral-storage: 1Gi'
          '  nvidia.com/gpu: 2'
          '  memory: 16Gi'
        )
      }
      @{
        indent = 10
        lines = @(
          'requests:'
          '  cpu: 4'
          '  ephemeral-storage: 1Gi'
          '  nvidia.com/gpu: 2'
          '  memory: 16Gi'
        )
      }
    )
    options = @()
    values = @(
      'basic.yaml'
      'resource_gpu.yaml'
    )
  }
  @{
    name = 'invalid_values'
    expected = 1
    matches = @(
      'Error: values don''t meet the specifications of the schema\(s\) in the following chart\(s\):'
      @{
        indent = 0
        lines = @(
          '- kubernetes.checks.liveness.successThreshold: Must validate one and only one schema (oneOf)'
          '- kubernetes.checks.liveness.successThreshold: Must be greater than or equal to 1'
        )
      }
      @{
        indent = 0
        lines = @(
          '- kubernetes.checks.liveness.failureThreshold: Must validate one and only one schema (oneOf)'
          '- kubernetes.checks.liveness.failureThreshold: Must be greater than or equal to 1'
        )
      }
      @{
        indent = 0
        lines = @(
          '- kubernetes.checks.liveness.initialDelaySeconds: Must validate one and only one schema (oneOf)'
          '- kubernetes.checks.liveness.initialDelaySeconds: Invalid type. Expected: integer, given: number'
        )
      }
      @{
        indent = 0
        lines = @(
          '- kubernetes.checks.liveness.periodSeconds: Must validate one and only one schema (oneOf)'
          '- kubernetes.checks.liveness.periodSeconds: Invalid type. Expected: integer, given: string'
        )
      }
      @{
        indent = 0
        lines = @(
          '- ports.health: Must validate one and only one schema (oneOf)'
          '- ports.health: Must be less than or equal to 65535'
        )
      }
      @{
        indent = 0
        lines = @(
        '- ports.metrics: Must validate one and only one schema (oneOf)'
        '- ports.metrics: Invalid type. Expected: integer, given: string'
        )
      }
      @{
        indent = 0
        lines = @(
        '- ports.request: Must validate one and only one schema (oneOf)'
        '- ports.request: Must be greater than or equal to 1025'
        )
      }
      @{
        indent = 0
        lines = @(
          '- resources.cpu: Must validate one and only one schema (oneOf)'
          '- resources.cpu: Must be greater than or equal to 1'
        )
      }
    )
    options = @()
    values = @(
      'basic.yaml'
      'invalid_values.yaml'
    )
  }
)

$config = initialize_test $args $tests

# Being w/ the state of not having passed.
$is_pass = $false

try {
  $is_pass = $(test_helm_chart $config)
}
catch {
  if (get_is_debug) {
    throw $_
  }

  fatal_exit "$_"
}

# Clean up any NVBUILD environment variables left behind by the build.
cleanup_after

if (-not $is_pass) {
  exit -1
}

exit 0
