Skip to content

Commit b6b74ec

Browse files
committed
task: encode various Jinja variables as JSON for manifests
We use Jinja2 to template our manifest files, but Jinja itself is unaware of the output format (e.g., YAML). It simply renders text, so it's up to us to ensure that variable values result in valid YAML. In most cases, this means setting a Jinja variable to something that is a valid YAML value. For example: name: {{ pod_name }} port: {{ ingress_port }} YAML is a superset of JSON, so encoding simple values with json.dumps() ensures they are safe and valid in most contexts. However, not all uses are simple. Consider {{ port }} in different roles: manifests/svc-cluster-ip.yaml.j2: - name: tft-clusterip-service-udp-{{ port }} manifests/svc-cluster-ip.yaml.j2- protocol: UDP manifests/svc-cluster-ip.yaml.j2: port: {{ port }} manifests/svc-cluster-ip.yaml.j2- selector: manifests/svc-cluster-ip.yaml.j2: tft-port: "{{ port }}" Here, "port" is used as a string fragment, a raw int, and a quoted string—so no single encoding works everywhere. This commit ensures that, where variables are used in simple, well-defined ways, we encode them as JSON to reduce risk. We must still reason about each template's context to set variables correctly. Signed-off-by: Thomas Haller <thaller@redhat.com>
1 parent 1d5ed44 commit b6b74ec

10 files changed

Lines changed: 40 additions & 41 deletions

manifests/allow-egress-mnp.yaml.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ metadata:
44
namespace: {{ name_space }}
55
name: allow-egress-mnp
66
labels:
7-
tft-tests: "{{ index }}"
7+
tft-tests: {{ label_tft_tests }}
88
annotations:
99
k8s.v1.cni.cncf.io/policy-for: {{ secondary_network_nad }}
1010
spec:

manifests/allow-ingress-mnp.yaml.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ metadata:
44
namespace: {{ name_space }}
55
name: allow-ingress-mnp
66
labels:
7-
tft-tests: "{{ index }}"
7+
tft-tests: {{ label_tft_tests }}
88
annotations:
99
k8s.v1.cni.cncf.io/policy-for: {{ secondary_network_nad }}
1010
spec:

manifests/host-pod.yaml.j2

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ apiVersion: v1
22
kind: Pod
33
metadata:
44
namespace: {{ name_space }}
5-
name: "{{ pod_name }}"
5+
name: {{ pod_name }}
66
labels:
7-
tft-tests: "{{ index }}"
7+
tft-tests: {{ label_tft_tests }}
88
tft-port: "{{ port }}"
99
spec:
1010
hostNetwork: true
1111
dnsPolicy: ClusterFirstWithHostNet
1212
nodeSelector:
13-
kubernetes.io/hostname: "{{ node_name }}"
13+
kubernetes.io/hostname: {{ node_name }}
1414
containers:
15-
- name: "{{ pod_name }}"
15+
- name: {{ pod_name }}
1616
image: {{ test_image }}
1717
command: {{ command }}
1818
args: {{ args }}

manifests/pod-secondary-network.yaml.j2

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ apiVersion: v1
22
kind: Pod
33
metadata:
44
namespace: {{ name_space }}
5-
name: "{{ pod_name }}"
5+
name: {{ pod_name }}
66
labels:
7-
tft-tests: "{{ index }}"
7+
tft-tests: {{ label_tft_tests }}
88
tft-port: "{{ port }}"
99
annotations:
1010
k8s.v1.cni.cncf.io/networks: {{ secondary_network_nad }}
1111
spec:
1212
nodeSelector:
13-
kubernetes.io/hostname: "{{ node_name }}"
13+
kubernetes.io/hostname: {{ node_name }}
1414
containers:
15-
- name: "{{ pod_name }}"
15+
- name: {{ pod_name }}
1616
image: {{ test_image }}
1717
command: {{ command }}
1818
args: {{ args }}

manifests/pod.yaml.j2

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ apiVersion: v1
22
kind: Pod
33
metadata:
44
namespace: {{ name_space }}
5-
name: "{{ pod_name }}"
5+
name: {{ pod_name }}
66
labels:
7-
tft-tests: "{{ index }}"
7+
tft-tests: {{ label_tft_tests }}
88
tft-port: "{{ port }}"
99
spec:
1010
nodeSelector:
11-
kubernetes.io/hostname: "{{ node_name }}"
11+
kubernetes.io/hostname: {{ node_name }}
1212
containers:
13-
- name: "{{ pod_name }}"
13+
- name: {{ pod_name }}
1414
image: {{ test_image }}
1515
command: {{ command }}
1616
args: {{ args }}

manifests/sriov-pod.yaml.j2

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ apiVersion: v1
22
kind: Pod
33
metadata:
44
namespace: {{ name_space }}
5-
name: "{{ pod_name }}"
5+
name: {{ pod_name }}
66
annotations: {% if not use_secondary_network %}
77
v1.multus-cni.io/default-network: {{ default_network }} {% else %}
88
k8s.v1.cni.cncf.io/networks: {{ secondary_network_nad }} {% endif %}
99
labels:
10-
tft-tests: "{{ index }}"
10+
tft-tests: {{ label_tft_tests }}
1111
tft-port: "{{ port }}"
1212
spec:
1313
nodeSelector:
14-
kubernetes.io/hostname: "{{ node_name }}"
14+
kubernetes.io/hostname: {{ node_name }}
1515
containers:
16-
- name: "{{ pod_name }}"
16+
- name: {{ pod_name }}
1717
image: {{ test_image }}
1818
command: {{ command }}
1919
args: {{ args }}

manifests/svc-cluster-ip.yaml.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ metadata:
44
name: tft-clusterip-service
55
namespace: {{ name_space }}
66
labels:
7-
tft-tests: "{{ index }}"
7+
tft-tests: {{ label_tft_tests }}
88
spec:
99
type: ClusterIP
1010
ports:

manifests/svc-node-port.yaml.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ metadata:
44
name: tft-nodeport-service
55
namespace: {{ name_space }}
66
labels:
7-
tft-tests: "{{ index }}"
7+
tft-tests: {{ label_tft_tests }}
88
spec:
99
type: NodePort
1010
ports:

manifests/tools-pod.yaml.j2

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ apiVersion: v1
22
kind: Pod
33
metadata:
44
namespace: {{ name_space }}
5-
name: "{{ pod_name }}"
5+
name: {{ pod_name }}
66
labels:
7-
tft-tests: "{{ index }}"
7+
tft-tests: {{ label_tft_tests }}
88
spec:
99
nodeSelector:
10-
kubernetes.io/hostname: "{{ node_name }}"
10+
kubernetes.io/hostname: {{ node_name }}
1111
hostNetwork: true
1212
containers:
13-
- name: "{{ pod_name }}"
13+
- name: {{ pod_name }}
1414
image: {{ test_image }}
1515
command: {{ command }}
1616
args: {{ args }}

task.py

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
from tftbase import TaskRole
3838

3939

40+
_j = json.dumps
41+
4042
logger = common.ExtendedLogger("tft." + __name__)
4143

4244

@@ -336,20 +338,17 @@ def _fetch_default_resource_name(
336338

337339
def get_template_args(self) -> dict[str, str | list[str]]:
338340
return {
339-
"name_space": self.get_namespace(),
340-
"test_image": tftbase.get_tft_test_image(),
341-
"image_pull_policy": tftbase.get_tft_image_pull_policy(),
342-
"command": ["/usr/bin/container-entry-point.sh"],
343-
"args": self._get_template_args_args(),
344-
"index": f"{self.index}",
345-
"node_name": self.node_name,
346-
"pod_name": self.pod_name,
341+
"name_space": _j(self.get_namespace()),
342+
"test_image": _j(tftbase.get_tft_test_image()),
343+
"image_pull_policy": _j(tftbase.get_tft_image_pull_policy()),
344+
"command": _j(["/usr/bin/container-entry-point.sh"]),
345+
"args": _j(self._get_template_args_args()),
346+
"label_tft_tests": _j(f"{self.index}"),
347+
"node_name": _j(self.node_name),
348+
"pod_name": _j(self.pod_name),
349+
"privileged_pod": _j(self._get_template_args_privileged_pod()),
347350
"port": self._get_template_args_port(),
348-
"privileged_pod": common.bool_to_str(
349-
self._get_template_args_privileged_pod(),
350-
format="true",
351-
),
352-
"secondary_network_nad": self.ts.connection.effective_secondary_network_nad,
351+
"secondary_network_nad": _j(self.ts.connection.effective_secondary_network_nad),
353352
"use_secondary_network": (
354353
"1" if self.ts.connection.secondary_network_nad else ""
355354
),
@@ -362,7 +361,7 @@ def get_template_args(self) -> dict[str, str | list[str]]:
362361
)
363362
or ""
364363
),
365-
"default_network": self.node.default_network,
364+
"default_network": _j(self.node.default_network),
366365
}
367366

368367
def _get_template_args_privileged_pod(self) -> bool:
@@ -545,7 +544,7 @@ def create_node_port_service(self, nodeport: int) -> str:
545544

546545
template_args = {
547546
**self.get_template_args(),
548-
"nodeport_svc_port": f"{nodeport}",
547+
"nodeport_svc_port": _j(nodeport),
549548
}
550549

551550
self.render_file(
@@ -567,7 +566,7 @@ def create_ingress_multi_network_policy(self, ingressPort: int) -> str:
567566

568567
template_args = {
569568
**self.get_template_args(),
570-
"ingress_port": f"{ingressPort}",
569+
"ingress_port": _j(ingressPort),
571570
}
572571

573572
self.render_file(
@@ -592,7 +591,7 @@ def create_egress_multi_network_policy(self, egressPort: int) -> str:
592591

593592
template_args = {
594593
**self.get_template_args(),
595-
"egress_port": f"{egressPort}",
594+
"egress_port": _j(egressPort),
596595
}
597596

598597
self.render_file(

0 commit comments

Comments
 (0)