66
77package io .kroxylicious .kubernetes .operator ;
88
9+ import java .util .Objects ;
10+ import java .util .concurrent .TimeUnit ;
11+ import java .util .stream .Collectors ;
12+
13+ import org .slf4j .Logger ;
14+ import org .slf4j .LoggerFactory ;
15+
16+ import io .fabric8 .kubernetes .api .model .ContainerStatus ;
917import io .fabric8 .kubernetes .client .KubernetesClient ;
1018import io .fabric8 .kubernetes .client .KubernetesClientBuilder ;
1119import io .fabric8 .kubernetes .client .KubernetesClientException ;
20+ import io .fabric8 .kubernetes .client .readiness .Readiness ;
1221
22+ import edu .umd .cs .findbugs .annotations .NonNull ;
1323import edu .umd .cs .findbugs .annotations .Nullable ;
1424
25+ import static org .assertj .core .api .Assertions .assertThat ;
26+
1527public class OperatorTestUtils {
1628
29+ private static final Logger LOGGER = LoggerFactory .getLogger (OperatorTestUtils .class );
30+
1731 /**
1832 * The timeouts etc of this client build are tuned to handle the case where Kubernetes isn't present.
1933 * As might be the case on a developer's machine where minikube isn't running.
@@ -28,6 +42,12 @@ public class OperatorTestUtils {
2842 return kubeClientIfAvailable (new KubernetesClientBuilder ());
2943 }
3044
45+ static @ NonNull KubernetesClient kubeClient () {
46+ KubernetesClient kubernetesClient = kubeClientIfAvailable (new KubernetesClientBuilder ());
47+ assertThat (kubernetesClient ).isNotNull ();
48+ return kubernetesClient ;
49+ }
50+
3151 static @ Nullable KubernetesClient kubeClientIfAvailable (KubernetesClientBuilder kubernetesClientBuilder ) {
3252 var client = kubernetesClientBuilder .build ();
3353 try {
@@ -45,4 +65,27 @@ static boolean isKubeClientAvailable() {
4565 return client != null ;
4666 }
4767 }
68+
69+ public static void preloadOperandImage () {
70+ try (var client = kubeClient ()) {
71+ String operandImage = ProxyDeployment .getOperandImage ();
72+ var pod = client .run ().withName ("preload-operand-image" )
73+ .withNewRunConfig ()
74+ .withImage (operandImage )
75+ .withRestartPolicy ("Never" )
76+ .withCommand ("ls" ).done ();
77+ try {
78+ client .resource (pod ).waitUntilCondition (Readiness ::isPodSucceeded , 2 , TimeUnit .MINUTES );
79+ }
80+ finally {
81+ var reread = client .resource (pod ).get ();
82+ if (!Readiness .isPodSucceeded (reread )) {
83+ var reasons = reread .getStatus ().getContainerStatuses ().stream ().map (ContainerStatus ::getState ).map (Objects ::toString )
84+ .collect (Collectors .joining ("," ));
85+ LOGGER .error ("Preloading operand image failed, phase: {}, container state: {}" , reread .getStatus ().getPhase (), reasons );
86+ }
87+ client .resource (pod ).delete ();
88+ }
89+ }
90+ }
4891}
0 commit comments