@@ -4,8 +4,11 @@ import (
44 "context"
55 "encoding/json"
66 "fmt"
7+ "io/ioutil"
8+ "os"
79
810 corev1 "k8s.io/api/core/v1"
11+ apierrors "k8s.io/apimachinery/pkg/api/errors"
912 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1013 restclient "k8s.io/client-go/rest"
1114 "k8s.io/kubernetes/test/e2e/framework"
@@ -113,3 +116,66 @@ func DetermineImageFromRelease(ctx context.Context, oc *CLI, imageTagName string
113116 }
114117 return "" , fmt .Errorf ("Could not find image: %s" , imageTagName )
115118}
119+
120+ // prepareImagePullSecretAndCABundle prepares the image pull secret and optional user CA bundle for use,
121+ // returning the necessary command-line arguments, or an error if setup fails.
122+ func PrepareImagePullSecretAndCABundle (oc * CLI ) (func (), []string , error ) {
123+ kubeClient := oc .AdminKubeClient ()
124+ // Try to use the same pull secret as the cluster under test
125+ imagePullSecret , err := kubeClient .CoreV1 ().Secrets ("openshift-config" ).Get (context .Background (), "pull-secret" , metav1.GetOptions {})
126+ if err != nil {
127+ return nil , nil , fmt .Errorf ("unable to get pull secret from cluster: %v" , err )
128+ }
129+
130+ // cache file to local temp location
131+ imagePullFile , err := ioutil .TempFile ("" , "image-pull-secret" )
132+ if err != nil {
133+ return nil , nil , fmt .Errorf ("unable to create a temporary file: %v" , err )
134+ }
135+ cleanup := func () {
136+ os .Remove (imagePullFile .Name ())
137+ }
138+
139+ // write the content
140+ imagePullSecretBytes := imagePullSecret .Data [".dockerconfigjson" ]
141+ if _ , err = imagePullFile .Write (imagePullSecretBytes ); err != nil {
142+ return cleanup , nil , fmt .Errorf ("unable to write pull secret to temp file: %v" , err )
143+ }
144+ if err = imagePullFile .Close (); err != nil {
145+ return cleanup , nil , fmt .Errorf ("unable to close file: %v" , err )
146+ }
147+
148+ cmdArgs := []string {"--registry-config" , imagePullFile .Name ()}
149+
150+ // Trust also user trusted CA from the cluster under test
151+ userCaBundle , err := kubeClient .CoreV1 ().ConfigMaps ("openshift-config" ).Get (context .Background (), "user-ca-bundle" , metav1.GetOptions {})
152+ if err != nil {
153+ if ! apierrors .IsNotFound (err ) {
154+ return cleanup , nil , fmt .Errorf ("unable to get user-ca-bundle configmap from cluster: %v" , err )
155+ }
156+ }
157+
158+ if userCaBundle != nil {
159+ // cache file to local temp location
160+ userCaBundleFile , err := ioutil .TempFile ("" , "user-ca-bundle" )
161+ if err != nil {
162+ return cleanup , nil , fmt .Errorf ("unable to create a temporary file: %v" , err )
163+ }
164+
165+ cleanup = func () {
166+ os .Remove (imagePullFile .Name ())
167+ os .Remove (userCaBundleFile .Name ())
168+ }
169+
170+ // write the content
171+ userCaBundleString := userCaBundle .Data ["ca-bundle.crt" ]
172+ if _ , err = userCaBundleFile .WriteString (userCaBundleString ); err != nil {
173+ return cleanup , nil , fmt .Errorf ("unable to write user CA bundle to temp file: %v" , err )
174+ }
175+ if err = userCaBundleFile .Close (); err != nil {
176+ return cleanup , nil , fmt .Errorf ("unable to close file: %v" , err )
177+ }
178+ cmdArgs = append (cmdArgs , "--certificate-authority" , userCaBundleFile .Name ())
179+ }
180+ return cleanup , cmdArgs , nil
181+ }
0 commit comments