Skip to content

Commit a2ec62c

Browse files
committed
[nat64_appliance] Add support for downloading pre-built images
Introduce cifmw_nat64_appliance_image_url parameter to download pre-built NAT64 images, with optional checksum verification support. Signed-off-by: Miguel Angel Nieto Jimenez <[email protected]>
1 parent 5f5393f commit a2ec62c

File tree

6 files changed

+175
-48
lines changed

6 files changed

+175
-48
lines changed

docs/dictionary/en-custom.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ dib
153153
dicts
154154
dirs
155155
disablecertificateverification
156+
diskimage
156157
disksize
157158
distro
158159
dlrn

roles/nat64_appliance/README.md

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,38 @@
2525
* `cifmw_nat64_appliance_memory`: (Integer) Memory in GiB for the nat64 appliance VM. Defaults to: `2`.
2626
* `cifmw_nat64_appliance_cpus`: (Integer) Virtual CPUs for the nat64 appliance VM. Defaults to: `2`.
2727
* `cifmw_nat64_appliance_ssh_pub_keys`: (List) List of SSH public key for the nat64 appliance VM. Defaults to: `[]`.
28+
* `cifmw_nat64_appliance_image_url`: (String) URL to download a pre-built NAT64 appliance image. If empty, the image will be built from source using diskimage-builder. Defaults to: `""`.
29+
* `cifmw_nat64_appliance_image_checksum`: (String) Optional checksum for the downloaded image in the format `algorithm:hash` (e.g., `sha256:xxxxx`). Only used when `cifmw_nat64_appliance_image_url` is set. Defaults to: undefined.
30+
* `cifmw_nat64_appliance_download_timeout`: (Integer) Timeout in seconds for image download. Only used when `cifmw_nat64_appliance_image_url` is set. Defaults to: `600`.
2831
* `cifmw_nat64_ipv6_prefix`: (String) IPv6 prefix for nat64. Defaults to: `fc00:abcd:abcd:fc00::/64`.
2932
* `cifmw_nat64_ipv6_tayga_address`: (String) Tayga IPv6 address. Defaults to: `fc00:abcd:abcd:fc00::3`.
3033

3134
## Building the image
3235

3336
Include the `nat64_appliance` role in a playbook. For example:
3437

38+
### Build from source
39+
40+
```yaml
41+
- name: Build nat64-appliance from source
42+
hosts: "{{ cifmw_target_host | default('localhost') }}"
43+
roles:
44+
- nat64_appliance
3545
```
36-
- name: Build nat64-appliance
46+
47+
### Download pre-built image
48+
49+
```yaml
50+
- name: Download pre-built nat64-appliance image
3751
hosts: "{{ cifmw_target_host | default('localhost') }}"
52+
vars:
53+
cifmw_nat64_appliance_image_url: "http://example.com/nat64-appliance.qcow2"
54+
# cifmw_nat64_appliance_image_checksum: "sha256:xxxxx" # Optional
3855
roles:
3956
- nat64_appliance
4057
```
4158
42-
The built image will be in: `{{ cifmw_nat64_appliance_workdir }}/nat64-appliance.qcow2`
59+
The image will be in: `{{ cifmw_nat64_appliance_workdir }}/nat64-appliance.qcow2`
4360

4461
## Using the nat64-appliance
4562

roles/nat64_appliance/defaults/main.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ cifmw_nat64_appliance_memory: 2
4040
cifmw_nat64_appliance_cpus: 2
4141
cifmw_nat64_appliance_ssh_pub_keys: []
4242

43+
# Image download configuration
44+
# Set cifmw_nat64_appliance_image_url to download a pre-built image
45+
cifmw_nat64_appliance_image_url: ""
46+
cifmw_nat64_appliance_download_timeout: 600 # 10 minutes
4347

4448
cifmw_nat64_ipv6_prefix: "2620:cf:cf:fc00::/64"
4549
cifmw_nat64_ipv6_tayga_address: "2620:cf:cf:fc00::3"

roles/nat64_appliance/molecule/default/converge.yml

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
# License for the specific language governing permissions and limitations
1515
# under the License.
1616

17+
# This scenario tests both BUILD and DOWNLOAD modes of the nat64_appliance role:
18+
# PHASE 1: Build image from source using diskimage-builder and deploy/test it
19+
# PHASE 2: Serve the built image via HTTP, download it, and verify integrity
20+
1721
- name: Converge
1822
hosts: instance
1923
vars:
@@ -85,6 +89,82 @@
8589
owner: "{{ ansible_user_id }}"
8690
group: "{{ ansible_user_gid }}"
8791

92+
# =============================================================
93+
# PHASE 2: Test download functionality
94+
# =============================================================
95+
- name: Set download test directory
96+
ansible.builtin.set_fact:
97+
cifmw_nat64_download_dir: "{{ cifmw_basedir }}/nat64_download"
98+
cifmw_nat64_http_port: 8765
99+
100+
- name: Start HTTP server to serve the built image
101+
ansible.builtin.shell: |
102+
cd {{ cifmw_basedir }}/nat64_appliance
103+
nohup python3 -m http.server {{ cifmw_nat64_http_port }} > /tmp/nat64_http_server.log 2>&1 &
104+
echo $! > /tmp/nat64_http_server.pid
105+
sleep 2
106+
107+
- name: Verify HTTP server is running
108+
ansible.builtin.uri:
109+
url: "http://localhost:{{ cifmw_nat64_http_port }}/nat64-appliance.qcow2"
110+
method: HEAD
111+
register: _http_check
112+
until: _http_check.status == 200
113+
retries: 5
114+
delay: 2
115+
116+
- name: Download nat64 appliance image from HTTP server
117+
vars:
118+
cifmw_nat64_appliance_basedir: "{{ cifmw_nat64_download_dir }}"
119+
cifmw_nat64_appliance_image_url: "http://localhost:{{ cifmw_nat64_http_port }}/nat64-appliance.qcow2"
120+
ansible.builtin.include_role:
121+
name: nat64_appliance
122+
123+
- name: Verify downloaded image exists
124+
ansible.builtin.stat:
125+
path: "{{ cifmw_nat64_download_dir }}/nat64_appliance/nat64-appliance.qcow2"
126+
checksum_algorithm: sha256
127+
register: _downloaded_image
128+
failed_when: not _downloaded_image.stat.exists
129+
130+
- name: Get built image info with checksum
131+
ansible.builtin.stat:
132+
path: "{{ cifmw_basedir }}/nat64_appliance/nat64-appliance.qcow2"
133+
checksum_algorithm: sha256
134+
register: _built_image
135+
136+
- name: Show download test results
137+
ansible.builtin.debug:
138+
msg:
139+
- "Built image: {{ _built_image.stat.path }} ({{ _built_image.stat.size }} bytes, SHA256: {{ _built_image.stat.checksum }})"
140+
- "Downloaded image: {{ _downloaded_image.stat.path }} ({{ _downloaded_image.stat.size }} bytes, SHA256: {{ _downloaded_image.stat.checksum }})"
141+
142+
- name: Verify images are identical using checksum
143+
ansible.builtin.assert:
144+
that:
145+
- _downloaded_image.stat.size > 0
146+
- _built_image.stat.size > 0
147+
- _downloaded_image.stat.checksum == _built_image.stat.checksum
148+
fail_msg: |
149+
Downloaded image differs from built image!
150+
Built: {{ _built_image.stat.size }} bytes, SHA256: {{ _built_image.stat.checksum }}
151+
Downloaded: {{ _downloaded_image.stat.size }} bytes, SHA256: {{ _downloaded_image.stat.checksum }}
152+
success_msg: "Images are identical - SHA256: {{ _built_image.stat.checksum }} ({{ _built_image.stat.size }} bytes)"
153+
154+
- name: Stop HTTP server
155+
ansible.builtin.shell: |
156+
if [ -f /tmp/nat64_http_server.pid ]; then
157+
kill $(cat /tmp/nat64_http_server.pid) || true
158+
rm -f /tmp/nat64_http_server.pid
159+
fi
160+
161+
- name: Copy downloaded image to working location for deployment
162+
ansible.builtin.copy:
163+
src: "{{ cifmw_nat64_download_dir }}/nat64_appliance/nat64-appliance.qcow2"
164+
dest: "{{ cifmw_basedir }}/nat64_appliance/nat64-appliance.qcow2"
165+
remote_src: true
166+
mode: "0644"
167+
88168
- name: "Deploy the nat64 appliance and networks"
89169
vars:
90170
cifmw_nat64_appliance_ssh_pub_keys:

roles/nat64_appliance/tasks/cleanup.yml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,19 @@
3232
community.libvirt.virt:
3333
command: list_vms
3434

35-
- name: Stop the nat64_appliance VM
35+
- name: Get nat64_appliance VM state
3636
when: cifmw_nat64_appliance_name in _list_vms.list_vms
37+
register: _vm_state
38+
community.libvirt.virt:
39+
command: status
40+
name: "{{ cifmw_nat64_appliance_name }}"
41+
uri: "{{ cifmw_nat64_libvirt_uri }}"
42+
43+
- name: Stop the nat64_appliance VM
44+
when:
45+
- cifmw_nat64_appliance_name in _list_vms.list_vms
46+
- _vm_state.status is defined
47+
- _vm_state.status == "running"
3748
community.libvirt.virt:
3849
command: destroy
3950
name: "{{ cifmw_nat64_appliance_name }}"

roles/nat64_appliance/tasks/main.yml

Lines changed: 59 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -29,52 +29,66 @@
2929
state: directory
3030
mode: "0755"
3131

32-
- name: Install required RPM packages
33-
tags:
34-
- packages
35-
become: true
36-
ansible.builtin.package:
37-
name:
38-
- python3-pip
39-
- qemu-img
40-
- dosfstools
41-
- xfsprogs
42-
state: present
32+
- name: Build NAT64 appliance image from source
33+
when:
34+
- cifmw_nat64_appliance_image_url | length == 0
35+
block:
36+
- name: Install required RPM packages
37+
tags:
38+
- packages
39+
become: true
40+
ansible.builtin.package:
41+
name:
42+
- python3-pip
43+
- qemu-img
44+
- dosfstools
45+
- xfsprogs
46+
state: present
4347

44-
- name: Install diskimage-builder in virtualenv
45-
tags:
46-
- packages
47-
ansible.builtin.pip:
48-
virtualenv_command: "python3 -m venv"
49-
virtualenv: "{{ cifmw_nat64_appliance_venv_dir }}"
50-
name:
51-
- diskimage-builder
52-
- setuptools
48+
- name: Install diskimage-builder in virtualenv
49+
tags:
50+
- packages
51+
ansible.builtin.pip:
52+
virtualenv_command: "python3 -m venv"
53+
virtualenv: "{{ cifmw_nat64_appliance_venv_dir }}"
54+
name:
55+
- diskimage-builder
56+
- setuptools
5357

54-
- name: Copy files to cifmw_nat64_appliance_dir
55-
ansible.builtin.copy:
56-
src: "{{ item }}"
57-
dest: "{{ cifmw_nat64_appliance_workdir }}/{{ item }}"
58-
mode: preserve
59-
loop:
60-
- "elements/"
61-
- nat64-appliance.yaml
58+
- name: Copy files to cifmw_nat64_appliance_dir
59+
ansible.builtin.copy:
60+
src: "{{ item }}"
61+
dest: "{{ cifmw_nat64_appliance_workdir }}/{{ item }}"
62+
mode: preserve
63+
loop:
64+
- "elements/"
65+
- nat64-appliance.yaml
66+
67+
- name: Clone edpm-image-builder (reset-bls-entries dib element)
68+
ansible.builtin.git:
69+
repo: https://github.com/openstack-k8s-operators/edpm-image-builder.git
70+
dest: "{{ cifmw_nat64_appliance_workdir }}/edpm-image-builder"
71+
version: main
6272

63-
- name: Clone edpm-image-builder (reset-bls-entries dib element)
64-
ansible.builtin.git:
65-
repo: https://github.com/openstack-k8s-operators/edpm-image-builder.git
66-
dest: "{{ cifmw_nat64_appliance_workdir }}/edpm-image-builder"
67-
version: main
73+
- name: Build the nat64-appliance image using DIB
74+
become: "{{ cifmw_nat64_appliance_run_dib_as_root | default(false) | bool }}"
75+
environment:
76+
ELEMENTS_PATH: "{{ cifmw_nat64_appliance_workdir }}/elements:{{ cifmw_nat64_appliance_workdir }}/edpm-image-builder/dib/"
77+
DIB_IMAGE_CACHE: "{{ cifmw_nat64_appliance_workdir }}/cache"
78+
DIB_DEBUG_TRACE: '1'
79+
cifmw.general.ci_script:
80+
chdir: "{{ cifmw_nat64_appliance_workdir }}"
81+
output_dir: "{{ cifmw_nat64_appliance_basedir }}/artifacts"
82+
creates: "{{ cifmw_nat64_appliance_workdir }}/nat64-appliance.qcow2"
83+
script: "{{ cifmw_nat64_appliance_venv_dir }}/bin/diskimage-builder nat64-appliance.yaml {{ extra_args | default('') }}"
84+
executable: "/bin/bash"
6885

69-
- name: Build the nat64-appliance image using DIB
70-
become: "{{ cifmw_nat64_appliance_run_dib_as_root | default(false) | bool }}"
71-
environment:
72-
ELEMENTS_PATH: "{{ cifmw_nat64_appliance_workdir }}/elements:{{ cifmw_nat64_appliance_workdir }}/edpm-image-builder/dib/"
73-
DIB_IMAGE_CACHE: "{{ cifmw_nat64_appliance_workdir }}/cache"
74-
DIB_DEBUG_TRACE: '1'
75-
cifmw.general.ci_script:
76-
chdir: "{{ cifmw_nat64_appliance_workdir }}"
77-
output_dir: "{{ cifmw_nat64_appliance_basedir }}/artifacts"
78-
creates: "{{ cifmw_nat64_appliance_workdir }}/nat64-appliance.qcow2"
79-
script: "{{ cifmw_nat64_appliance_venv_dir }}/bin/diskimage-builder nat64-appliance.yaml {{ extra_args | default('') }}"
80-
executable: "/bin/bash"
86+
- name: Download pre-built NAT64 appliance image
87+
when:
88+
- cifmw_nat64_appliance_image_url | length > 0
89+
ansible.builtin.get_url:
90+
url: "{{ cifmw_nat64_appliance_image_url }}"
91+
dest: "{{ cifmw_nat64_appliance_workdir }}/nat64-appliance.qcow2"
92+
checksum: "{{ cifmw_nat64_appliance_image_checksum | default(omit) }}"
93+
timeout: "{{ cifmw_nat64_appliance_download_timeout }}"
94+
mode: "0644"

0 commit comments

Comments
 (0)