@@ -32,6 +32,94 @@ check_service_health() {
3232 fi
3333}
3434
35+ preload_block_node_images_for_kind () {
36+ local cluster_name=" $1 "
37+ local mirror_registry=" hub.mirror.docker.lat.ope.eng.hashgraph.io"
38+ local max_attempts=3
39+ local node source_image image_prefix source_registry short_image dockerhub_qualified_image
40+ local pull_candidate pulled_image attempt
41+ local -a pull_candidates
42+ local kind_nodes
43+ local preload_failed=0
44+ local preload_images=(
45+ " docker.io/library/maven:3-eclipse-temurin-25-alpine"
46+ " docker.io/library/busybox:latest"
47+ )
48+
49+ if ! command -v docker > /dev/null 2>&1 || ! command -v kind > /dev/null 2>&1 ; then
50+ echo " Skipping block-node image preload: docker and/or kind not available."
51+ return 0
52+ fi
53+
54+ kind_nodes=" $( kind get nodes --name " ${cluster_name} " 2> /dev/null || true) "
55+ if [ -z " ${kind_nodes} " ]; then
56+ echo " Warning: unable to resolve kind nodes for cluster ${cluster_name} ; skipping block-node image preload."
57+ return 0
58+ fi
59+
60+ echo " Preloading block-node init images into kind cluster '${cluster_name} ' via ${mirror_registry} with Docker Hub fallback"
61+ for source_image in " ${preload_images[@]} " ; do
62+ image_prefix=" ${source_image%%/* } "
63+ if [[ " ${image_prefix} " == * .* || " ${image_prefix} " == * :* || " ${image_prefix} " == " localhost" ]]; then
64+ source_registry=" ${image_prefix} "
65+ short_image=" ${source_image#*/ } "
66+ else
67+ source_registry=" docker.io"
68+ short_image=" ${source_image} "
69+ fi
70+
71+ dockerhub_qualified_image=" docker.io/${short_image} "
72+ pull_candidates=()
73+ if [[ " ${source_registry} " == " docker.io" || " ${source_registry} " == " registry-1.docker.io" ]]; then
74+ pull_candidates=(
75+ " ${mirror_registry} /${short_image} "
76+ " ${dockerhub_qualified_image} "
77+ " registry-1.docker.io/${short_image} "
78+ )
79+ else
80+ pull_candidates=(" ${source_image} " )
81+ fi
82+
83+ while IFS= read -r node; do
84+ [ -z " ${node} " ] && continue
85+ attempt=1
86+ while [ " ${attempt} " -le " ${max_attempts} " ]; do
87+ pulled_image=" "
88+ for pull_candidate in " ${pull_candidates[@]} " ; do
89+ if docker exec " ${node} " ctr --namespace=k8s.io images pull " ${pull_candidate} " > /dev/null 2>&1 ; then
90+ pulled_image=" ${pull_candidate} "
91+ break
92+ fi
93+ done
94+
95+ if [ -n " ${pulled_image} " ]; then
96+ docker exec " ${node} " ctr --namespace=k8s.io images tag " ${pulled_image} " " ${dockerhub_qualified_image} " > /dev/null 2>&1 || true
97+ docker exec " ${node} " ctr --namespace=k8s.io images tag " ${pulled_image} " " ${short_image} " > /dev/null 2>&1 || true
98+ docker exec " ${node} " ctr --namespace=k8s.io images tag " ${pulled_image} " " ${source_image} " > /dev/null 2>&1 || true
99+ echo " Preloaded ${source_image} on node ${node} from ${pulled_image} "
100+ break
101+ fi
102+
103+ if [ " ${attempt} " -eq " ${max_attempts} " ]; then
104+ echo " ERROR: failed to preload ${source_image} on ${node} after ${max_attempts} attempts."
105+ preload_failed=1
106+ else
107+ echo " Retrying preload ${source_image} on ${node} (attempt ${attempt} /${max_attempts} )..."
108+ sleep 3
109+ fi
110+ attempt=$(( attempt + 1 ))
111+ done
112+ done <<< " ${kind_nodes}"
113+ done
114+
115+ if [ " ${preload_failed} " -ne 0 ]; then
116+ echo " Block-node image preload failed; aborting early to avoid long pod readiness timeout."
117+ return 1
118+ fi
119+
120+ return 0
121+ }
122+
35123if [ -z " ${STORAGE_TYPE} " ]; then
36124 storageType=" minio_only"
37125else
145233
146234 npm run solo-test -- keys consensus generate --gossip-keys --tls-keys -i node1 --deployment " ${SOLO_DEPLOYMENT} "
147235
236+ preload_block_node_images_for_kind " ${SOLO_CLUSTER_NAME} "
237+
148238 npm run solo-test -- block node add --deployment " ${SOLO_DEPLOYMENT} "
149239
150240 npm run solo-test -- consensus network deploy --deployment " ${SOLO_DEPLOYMENT} " -i node1 \
0 commit comments