Skip to content

Commit e478c44

Browse files
mnietojihjensas
authored andcommitted
[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 057f5ea commit e478c44

File tree

6 files changed

+171
-48
lines changed

6 files changed

+171
-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: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
retries: 60
5656
delay: 10
5757

58+
# Build the image
5859
- name: Build nat64 appliance image
5960
vars:
6061
# TODO(hjensas): Running as root should not be required here.
@@ -85,6 +86,81 @@
8586
owner: "{{ ansible_user_id }}"
8687
group: "{{ ansible_user_gid }}"
8788

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