---
- name: Test helm diff functionality
  vars:
    test_chart_ref: "/tmp/test-chart"
    redis_chart_version: '17.0.5'

  block:

    - name: Install helm diff
      helm_plugin:
        binary_path: "{{ helm_binary }}"
        state: present
        plugin_path: https://github.com/databus23/helm-diff
        plugin_version: 3.4.0

    - name: Copy test chart
      copy:
        src: "test-chart/"
        dest: "{{ test_chart_ref }}"

    - name: Install local chart
      helm:
        binary_path: "{{ helm_binary }}"
        name: test-chart
        namespace: "{{ helm_namespace }}"
        chart_ref: "{{ test_chart_ref }}"
        create_namespace: yes
      register: install

    - assert:
        that:
          - install is changed

    - name: Modify local chart
      blockinfile:
        create: yes
        path: "{{ test_chart_ref }}/templates/anothermap.yaml"
        block: !unsafe |
          apiVersion: v1
          kind: ConfigMap
          metadata:
            name: test-chart-another-configmap
          data:
            foo: {{ .Values.foo | default "bar" }}

    - name: Test helm diff in check mode
      helm:
        binary_path: "{{ helm_binary }}"
        name: test-chart
        namespace: "{{ helm_namespace }}"
        chart_ref: "{{ test_chart_ref }}"
      check_mode: yes
      diff: yes
      register: diff_result

    - name: Check if helm diff check is correct
      vars:
        foo_bar_value: "+   foo: bar"
      assert:
        that:
          - foo_bar_value in diff_result.diff.prepared

    - name: Upgrade local chart with modifications
      helm:
        binary_path: "{{ helm_binary }}"
        name: test-chart
        namespace: "{{ helm_namespace }}"
        chart_ref: "{{ test_chart_ref }}"
      register: install

    - assert:
        that:
          - install is changed

    - name: No diff in check mode when no change
      helm:
        binary_path: "{{ helm_binary }}"
        name: test-chart
        namespace: "{{ helm_namespace }}"
        chart_ref: "{{ test_chart_ref }}"
      check_mode: yes
      diff: yes
      register: diff_result

    - name: Check if no diff in check mode when no change
      assert:
        that:
          - '"diff" not in diff_result'

    - name: Upgrade modified local chart idempotency check
      helm:
        binary_path: "{{ helm_binary }}"
        name: test-chart
        namespace: "{{ helm_namespace }}"
        chart_ref: "{{ test_chart_ref }}"
      register: install

    - assert:
        that:
          - install is not changed

    - name: Modify values
      blockinfile:
        create: yes
        path: "{{ test_chart_ref }}/values.yml"
        block: |
          ---
          foo: baz

    - name: Upgrade with values file
      helm:
        binary_path: "{{ helm_binary }}"
        name: test-chart
        namespace: "{{ helm_namespace }}"
        chart_ref: "{{ test_chart_ref }}"
        values_files:
          - "{{ test_chart_ref }}/values.yml"
      register: install

    - assert:
        that:
          - install is changed

    - name: Upgrade with values file idempotency check
      helm:
        binary_path: "{{ helm_binary }}"
        name: test-chart
        namespace: "{{ helm_namespace }}"
        chart_ref: "{{ test_chart_ref }}"
        values_files:
          - "{{ test_chart_ref }}/values.yml"
      register: install

    - assert:
        that:
          - install is not changed

    - name: Upgrade with values
      helm:
        binary_path: "{{ helm_binary }}"
        name: test-chart
        namespace: "{{ helm_namespace }}"
        chart_ref: "{{ test_chart_ref }}"
        values:
          foo: gaz
        values_files:
          - "{{ test_chart_ref }}/values.yml"
      register: install

    - assert:
        that:
          - install is changed

    - name: Upgrade with values idempotency check
      helm:
        binary_path: "{{ helm_binary }}"
        name: test-chart
        namespace: "{{ helm_namespace }}"
        chart_ref: "{{ test_chart_ref }}"
        values:
          foo: gaz
        values_files:
          - "{{ test_chart_ref }}/values.yml"
      register: install

    - assert:
        that:
          - install is not changed

    - name: Upgrade with set_values
      helm:
        binary_path: "{{ helm_binary }}"
        name: test-chart
        namespace: "{{ helm_namespace }}"
        chart_ref: "{{ test_chart_ref }}"
        values:
          foo: gaz
        values_files:
          - "{{ test_chart_ref }}/values.yml"
        set_values:
          - value: foo=qux
            value_type: string
      register: install

    - assert:
        that:
          - install is changed

    - name: Upgrade with set_values idempotency check
      helm:
        binary_path: "{{ helm_binary }}"
        name: test-chart
        namespace: "{{ helm_namespace }}"
        chart_ref: "{{ test_chart_ref }}"
        values:
          foo: gaz
        values_files:
          - "{{ test_chart_ref }}/values.yml"
        set_values:
          - value: foo=qux
            value_type: string
      register: install

    - assert:
        that:
          - install is not changed

    # Test helm diff with chart_repo_url
    - name: Define Redis chart values
      set_fact:
        redis_chart_values:
          commonLabels:
            phase: testing
            company: RedHat
          image:
            tag: 6.2.6-debian-10-r135
          architecture: standalone

    - name: Install Redis chart
      helm:
        binary_path: "{{ helm_binary }}"
        chart_repo_url: https://charts.bitnami.com/bitnami
        chart_ref: redis
        namespace: "{{ helm_namespace }}"
        name: redis-chart
        chart_version: "{{ redis_chart_version }}"
        release_values: "{{ redis_chart_values }}"

    - name: Upgrade Redis chart
      helm:
        binary_path: "{{ helm_binary }}"
        chart_repo_url: https://charts.bitnami.com/bitnami
        chart_ref: redis
        namespace: "{{ helm_namespace }}"
        name: redis-chart
        chart_version: "{{ redis_chart_version }}"
        release_values: "{{ redis_chart_values }}"
      check_mode: yes
      register: redis_upgrade

    - name: Assert that module raised a warning
      assert:
        that:
          - not redis_upgrade.changed
          - redis_upgrade.warnings is defined
          - redis_upgrade.warnings | length == 1
          - redis_upgrade.warnings[0] == "The default idempotency check can fail to report changes in certain cases. Install helm diff >= 3.4.1 for better results."

    - name: Uninstall helm diff
      helm_plugin:
        binary_path: "{{ helm_binary }}"
        state: absent
        plugin_name: diff
      ignore_errors: yes

    - name: Install helm diff (version=3.4.1)
      helm_plugin:
        binary_path: "{{ helm_binary }}"
        state: present
        plugin_path: https://github.com/databus23/helm-diff
        plugin_version: 3.4.1

    - name: Upgrade Redis chart once again
      helm:
        binary_path: "{{ helm_binary }}"
        chart_repo_url: https://charts.bitnami.com/bitnami
        chart_ref: redis
        namespace: "{{ helm_namespace }}"
        name: redis-chart
        chart_version: "{{ redis_chart_version }}"
        release_values: "{{ redis_chart_values }}"
      check_mode: yes
      register: redis_upgrade_2

    - name: Assert that module raised a warning
      assert:
        that:
          - redis_upgrade_2.changed
          - redis_upgrade_2.warnings is not defined

  always:
    - name: Remove chart directory
      file:
        path: "{{ test_chart_ref }}"
        state: absent
      ignore_errors: yes

    - name: Uninstall helm diff
      helm_plugin:
        binary_path: "{{ helm_binary }}"
        state: absent
        plugin_name: diff
      ignore_errors: yes

    - name: Remove helm namespace
      k8s:
        api_version: v1
        kind: Namespace
        name: "{{ helm_namespace }}"
        state: absent
        wait: true
      ignore_errors: yes

- include_tasks: reuse_values.yml
