diff --git a/.github/workflows/tests_role_ravendb_node.yml b/.github/workflows/tests_role_ravendb_node.yml index e680aad..6139d88 100644 --- a/.github/workflows/tests_role_ravendb_node.yml +++ b/.github/workflows/tests_role_ravendb_node.yml @@ -125,7 +125,19 @@ jobs: - name: Run Debian unsecured scenario working-directory: roles/ravendb_node run: molecule test -s unsecured - + + - name: Run Debian-11 unsecured scenario + working-directory: roles/ravendb_node + run: molecule test -s debian11 + + - name: Run Debian-12 unsecured scenario + working-directory: roles/ravendb_node + run: molecule test -s debian12 + + - name: Run Debian-13 unsecured scenario + working-directory: roles/ravendb_node + run: molecule test -s debian13 + - name: Run Debian update scenario working-directory: roles/ravendb_node run: molecule test -s update diff --git a/roles/ravendb_node/molecule/debian11/converge.yml b/roles/ravendb_node/molecule/debian11/converge.yml new file mode 100644 index 0000000..c0a3985 --- /dev/null +++ b/roles/ravendb_node/molecule/debian11/converge.yml @@ -0,0 +1,16 @@ +--- +- name: Unsecured + hosts: all + tasks: + - name: "Include ravendb_node" + include_role: + name: ravendb.ravendb.ravendb_node + vars: + ravendb_state: present + ravendb_version: latest + ravendb_version_minor: 6.2 + ravendb_release_channel: stable + ravendb_arch: linux-x64 + ravendb_settings_preset: default + ravendb_settings_override: + Logs.Mode: "Information" diff --git a/roles/ravendb_node/molecule/debian11/molecule.yml b/roles/ravendb_node/molecule/debian11/molecule.yml new file mode 100644 index 0000000..e641f5f --- /dev/null +++ b/roles/ravendb_node/molecule/debian11/molecule.yml @@ -0,0 +1,32 @@ +dependency: + name: galaxy +driver: + name: docker + port_bindings: + '8080': 80 + '38888': 38888 + '44443': 443 +platforms: + - name: debian-11 + image: docker.io/geerlingguy/docker-debian11-ansible:latest + privileged: true + command: /sbin/init + volumes: + - '/sys/fs/cgroup:/sys/fs/cgroup:rw' + tmpfs: + - /run + - /tmp + cgroupns_mode: host +provisioner: + name: ansible + log: true +scenario: + name: debian11 + test_sequence: + - destroy + - create + - prepare + - converge + - verify +verifier: + name: ansible diff --git a/roles/ravendb_node/molecule/debian11/prepare.yml b/roles/ravendb_node/molecule/debian11/prepare.yml new file mode 100644 index 0000000..9bff8eb --- /dev/null +++ b/roles/ravendb_node/molecule/debian11/prepare.yml @@ -0,0 +1,11 @@ +- name: Prepare + hosts: all + become: true + gather_facts: yes + tasks: + - name: Ensure adduser present + ansible.builtin.apt: + name: adduser + state: present + update_cache: yes + when: ansible_facts.os_family | lower == 'debian' \ No newline at end of file diff --git a/roles/ravendb_node/molecule/debian11/verify.yml b/roles/ravendb_node/molecule/debian11/verify.yml new file mode 100644 index 0000000..48fe272 --- /dev/null +++ b/roles/ravendb_node/molecule/debian11/verify.yml @@ -0,0 +1,65 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + + - name: Load settings.json + become: true + slurp: + src: "/etc/ravendb/settings.json" + register: settings_file + + - name: Decode and parse settings.json + set_fact: + settings: "{{ settings_file['content'] | b64decode | from_json }}" + + - name: Assert that settings override was applied + ansible.builtin.assert: + that: + - settings['Logs.Mode'] == "Information" + + - name: Assert it's unsecured + ansible.builtin.assert: + that: + - settings['ServerUrl'] is not regex('^https:') + + - name: Get service status + become: true + ansible.builtin.systemd: + name: ravendb.service + state: started + register: service_status + + - name: Assert service state + ansible.builtin.assert: + that: + - service_status.status['ActiveState'] == 'active' + + - name: Check if can get RavenDB studio HTML + ansible.builtin.uri: + url: http://localhost:8080/studio/index.html + + - name: Get databases + ansible.builtin.uri: + url: http://localhost:8080/databases + register: databases + + - name: Set random DB name + set_fact: + db_name: "db{{ 1000000 | random }}" + + - name: Create a database + ansible.builtin.uri: + url: "http://localhost:8080/admin/databases?name={{ db_name }}&replicationFactor=1" + method: PUT + body_format: json + body: | + { + "DatabaseName": "{{ db_name }}", + "Settings": {}, + "Disabled": false, + "Encrypted": false, + "Topology": { "DynamicNodesDistribution": false } + } + status_code: 201 diff --git a/roles/ravendb_node/molecule/debian12/converge.yml b/roles/ravendb_node/molecule/debian12/converge.yml new file mode 100644 index 0000000..c0a3985 --- /dev/null +++ b/roles/ravendb_node/molecule/debian12/converge.yml @@ -0,0 +1,16 @@ +--- +- name: Unsecured + hosts: all + tasks: + - name: "Include ravendb_node" + include_role: + name: ravendb.ravendb.ravendb_node + vars: + ravendb_state: present + ravendb_version: latest + ravendb_version_minor: 6.2 + ravendb_release_channel: stable + ravendb_arch: linux-x64 + ravendb_settings_preset: default + ravendb_settings_override: + Logs.Mode: "Information" diff --git a/roles/ravendb_node/molecule/debian12/molecule.yml b/roles/ravendb_node/molecule/debian12/molecule.yml new file mode 100644 index 0000000..f75caac --- /dev/null +++ b/roles/ravendb_node/molecule/debian12/molecule.yml @@ -0,0 +1,32 @@ +dependency: + name: galaxy +driver: + name: docker + port_bindings: + '8080': 80 + '38888': 38888 + '44443': 443 +platforms: + - name: debian-12 + image: docker.io/geerlingguy/docker-debian12-ansible:latest + privileged: true + command: /usr/sbin/init + volumes: + - '/sys/fs/cgroup:/sys/fs/cgroup:rw' + tmpfs: + - /run + - /tmp + cgroupns_mode: host +provisioner: + name: ansible + log: true +scenario: + name: debian12 + test_sequence: + - destroy + - create + - prepare + - converge + - verify +verifier: + name: ansible diff --git a/roles/ravendb_node/molecule/debian12/prepare.yml b/roles/ravendb_node/molecule/debian12/prepare.yml new file mode 100644 index 0000000..9bff8eb --- /dev/null +++ b/roles/ravendb_node/molecule/debian12/prepare.yml @@ -0,0 +1,11 @@ +- name: Prepare + hosts: all + become: true + gather_facts: yes + tasks: + - name: Ensure adduser present + ansible.builtin.apt: + name: adduser + state: present + update_cache: yes + when: ansible_facts.os_family | lower == 'debian' \ No newline at end of file diff --git a/roles/ravendb_node/molecule/debian12/verify.yml b/roles/ravendb_node/molecule/debian12/verify.yml new file mode 100644 index 0000000..48fe272 --- /dev/null +++ b/roles/ravendb_node/molecule/debian12/verify.yml @@ -0,0 +1,65 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + + - name: Load settings.json + become: true + slurp: + src: "/etc/ravendb/settings.json" + register: settings_file + + - name: Decode and parse settings.json + set_fact: + settings: "{{ settings_file['content'] | b64decode | from_json }}" + + - name: Assert that settings override was applied + ansible.builtin.assert: + that: + - settings['Logs.Mode'] == "Information" + + - name: Assert it's unsecured + ansible.builtin.assert: + that: + - settings['ServerUrl'] is not regex('^https:') + + - name: Get service status + become: true + ansible.builtin.systemd: + name: ravendb.service + state: started + register: service_status + + - name: Assert service state + ansible.builtin.assert: + that: + - service_status.status['ActiveState'] == 'active' + + - name: Check if can get RavenDB studio HTML + ansible.builtin.uri: + url: http://localhost:8080/studio/index.html + + - name: Get databases + ansible.builtin.uri: + url: http://localhost:8080/databases + register: databases + + - name: Set random DB name + set_fact: + db_name: "db{{ 1000000 | random }}" + + - name: Create a database + ansible.builtin.uri: + url: "http://localhost:8080/admin/databases?name={{ db_name }}&replicationFactor=1" + method: PUT + body_format: json + body: | + { + "DatabaseName": "{{ db_name }}", + "Settings": {}, + "Disabled": false, + "Encrypted": false, + "Topology": { "DynamicNodesDistribution": false } + } + status_code: 201 diff --git a/roles/ravendb_node/molecule/debian13/converge.yml b/roles/ravendb_node/molecule/debian13/converge.yml new file mode 100644 index 0000000..c0a3985 --- /dev/null +++ b/roles/ravendb_node/molecule/debian13/converge.yml @@ -0,0 +1,16 @@ +--- +- name: Unsecured + hosts: all + tasks: + - name: "Include ravendb_node" + include_role: + name: ravendb.ravendb.ravendb_node + vars: + ravendb_state: present + ravendb_version: latest + ravendb_version_minor: 6.2 + ravendb_release_channel: stable + ravendb_arch: linux-x64 + ravendb_settings_preset: default + ravendb_settings_override: + Logs.Mode: "Information" diff --git a/roles/ravendb_node/molecule/debian13/molecule.yml b/roles/ravendb_node/molecule/debian13/molecule.yml new file mode 100644 index 0000000..5450049 --- /dev/null +++ b/roles/ravendb_node/molecule/debian13/molecule.yml @@ -0,0 +1,32 @@ +dependency: + name: galaxy +driver: + name: docker + port_bindings: + '8080': 80 + '38888': 38888 + '44443': 443 +platforms: + - name: debian-13 + image: docker.io/geerlingguy/docker-debian13-ansible:latest + privileged: true + command: /usr/sbin/init + volumes: + - '/sys/fs/cgroup:/sys/fs/cgroup:rw' + tmpfs: + - /run + - /tmp + cgroupns_mode: host +provisioner: + name: ansible + log: true +scenario: + name: debian13 + test_sequence: + - destroy + - create + - prepare + - converge + - verify +verifier: + name: ansible diff --git a/roles/ravendb_node/molecule/debian13/prepare.yml b/roles/ravendb_node/molecule/debian13/prepare.yml new file mode 100644 index 0000000..9bff8eb --- /dev/null +++ b/roles/ravendb_node/molecule/debian13/prepare.yml @@ -0,0 +1,11 @@ +- name: Prepare + hosts: all + become: true + gather_facts: yes + tasks: + - name: Ensure adduser present + ansible.builtin.apt: + name: adduser + state: present + update_cache: yes + when: ansible_facts.os_family | lower == 'debian' \ No newline at end of file diff --git a/roles/ravendb_node/molecule/debian13/verify.yml b/roles/ravendb_node/molecule/debian13/verify.yml new file mode 100644 index 0000000..48fe272 --- /dev/null +++ b/roles/ravendb_node/molecule/debian13/verify.yml @@ -0,0 +1,65 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + + - name: Load settings.json + become: true + slurp: + src: "/etc/ravendb/settings.json" + register: settings_file + + - name: Decode and parse settings.json + set_fact: + settings: "{{ settings_file['content'] | b64decode | from_json }}" + + - name: Assert that settings override was applied + ansible.builtin.assert: + that: + - settings['Logs.Mode'] == "Information" + + - name: Assert it's unsecured + ansible.builtin.assert: + that: + - settings['ServerUrl'] is not regex('^https:') + + - name: Get service status + become: true + ansible.builtin.systemd: + name: ravendb.service + state: started + register: service_status + + - name: Assert service state + ansible.builtin.assert: + that: + - service_status.status['ActiveState'] == 'active' + + - name: Check if can get RavenDB studio HTML + ansible.builtin.uri: + url: http://localhost:8080/studio/index.html + + - name: Get databases + ansible.builtin.uri: + url: http://localhost:8080/databases + register: databases + + - name: Set random DB name + set_fact: + db_name: "db{{ 1000000 | random }}" + + - name: Create a database + ansible.builtin.uri: + url: "http://localhost:8080/admin/databases?name={{ db_name }}&replicationFactor=1" + method: PUT + body_format: json + body: | + { + "DatabaseName": "{{ db_name }}", + "Settings": {}, + "Disabled": false, + "Encrypted": false, + "Topology": { "DynamicNodesDistribution": false } + } + status_code: 201 diff --git a/roles/ravendb_node/tasks/debian.yml b/roles/ravendb_node/tasks/debian.yml index d9012e5..f1a3765 100644 --- a/roles/ravendb_node/tasks/debian.yml +++ b/roles/ravendb_node/tasks/debian.yml @@ -11,9 +11,8 @@ - openssl - ca-certificates -- name: Determine Ubuntu version and architecture +- name: Determine architecture set_fact: - ubuntu_version: "{{ ansible_facts['lsb']['release'] }}" arch: "{{ ansible_facts['architecture'] }}" - name: Fail if architecture is unsupported @@ -21,10 +20,54 @@ msg: "Unsupported architecture: {{ arch }}" when: arch not in ['x86_64', 'aarch64'] +- name: Define Debian -> Ubuntu LTS + ICU map and arch + set_fact: + deb_arch: "{{ 'amd64' if arch == 'x86_64' else 'arm64' }}" + debian_icu_map: + '11': { 'ubuntu': '20.04', 'icu_pkg': 'libicu66', 'icu_ver': '66.1-2ubuntu2.1' } + '12': { 'ubuntu': '22.04', 'icu_pkg': 'libicu70', 'icu_ver': '70.1-2ubuntu1' } + '13': { 'ubuntu': '24.04', 'icu_pkg': 'libicu74', 'icu_ver': '74.2-1ubuntu3.1' } + default_icu_map: { 'ubuntu': '24.04', 'icu_pkg': 'libicu74', 'icu_ver': '74.2-1ubuntu3.1' } + +- name: Select ICU mapping entry for this host + set_fact: + mapped: "{{ debian_icu_map.get(ansible_facts.distribution_major_version | string, default_icu_map) }}" + +- name: Compute ubuntu_version and ICU package URL + set_fact: + ubuntu_version: >- + {{ (ansible_facts.distribution == 'Ubuntu') + | ternary(ansible_facts.distribution_version, mapped.ubuntu) }} + icu_pkg: "{{ '' if ansible_facts.distribution == 'Ubuntu' else mapped.icu_pkg }}" + icu_ver: "{{ '' if ansible_facts.distribution == 'Ubuntu' else mapped.icu_ver }}" + icu_vendor_url: >- + {{ '' if ansible_facts.distribution == 'Ubuntu' + else 'https://archive.ubuntu.com/ubuntu/pool/main/i/icu/' ~ mapped.icu_pkg ~ '_' ~ mapped.icu_ver ~ '_' ~ deb_arch ~ '.deb' }} + +- name: Download ICU package (Debian only) + ansible.builtin.get_url: + url: "{{ icu_vendor_url }}" + dest: "/tmp/{{ icu_pkg }}_{{ icu_ver }}_{{ deb_arch }}.deb" + when: + - ansible_facts.distribution == 'Debian' + - icu_vendor_url != '' + +- name: Install ICU package (Debian only) + ansible.builtin.apt: + deb: "/tmp/{{ icu_pkg }}_{{ icu_ver }}_{{ deb_arch }}.deb" + when: + - ansible_facts.distribution == 'Debian' + - icu_vendor_url != '' + - name: Message debug: - msg: "Downloading RavenDB {{ ravendb_version }}..." - + msg: + info: "Downloading RavenDB {{ ravendb_version }}..." + distribution: "{{ ansible_facts.distribution }}" + distro_major: "{{ ansible_facts.distribution_major_version }}" + ubuntu_version: "{{ ubuntu_version }}" + icu_pkg: "{{ icu_pkg }}" + - block: - name: Determine download url for latest version set_fact: