mirror of https://github.com/knative/func.git
100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
//go:build e2e || e2elc
|
|
// +build e2e e2elc
|
|
|
|
package e2e
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"strings"
|
|
"testing"
|
|
|
|
"knative.dev/func/test/common"
|
|
)
|
|
|
|
func TestMain(t *testing.M) {
|
|
|
|
if common.GetRegistry() == common.DefaultRegistry {
|
|
err := patchOrCreateDockerConfigFile()
|
|
if err != nil {
|
|
panic(err.Error())
|
|
}
|
|
}
|
|
t.Run()
|
|
}
|
|
|
|
// Here is a trick to avoid calling docker or podman at e2e tests.
|
|
// Let's check for default registry credentials in one of the auth sources
|
|
// In case it is not present let's create it.
|
|
func patchOrCreateDockerConfigFile() error {
|
|
userHome, err := os.UserHomeDir()
|
|
if err != nil {
|
|
return fmt.Errorf("unable retrieve user home dir to verify default container authentication. " + err.Error())
|
|
}
|
|
dockerConfigFile := filepath.Join(userHome, ".docker", "config.json")
|
|
_, err = os.Stat(dockerConfigFile)
|
|
if err != nil && os.IsNotExist(err) {
|
|
log.Println("Creating ./docker/config.json file with default registry authentication.")
|
|
err = createConfigAuth(dockerConfigFile, "")
|
|
} else {
|
|
// Read and update it
|
|
err = updateConfigAuth(dockerConfigFile)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func createConfigAuth(dockerConfigFile string, content string) error {
|
|
f, err := os.Create(dockerConfigFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
if content == "" {
|
|
content = `{
|
|
"auths": {
|
|
"localhost:50000": {
|
|
"auth": "dXNlcjpwYXNzd29yZA=="
|
|
}
|
|
}
|
|
}
|
|
`
|
|
}
|
|
_, err = f.WriteString(content)
|
|
if err != nil {
|
|
return fmt.Errorf("unable to create .docker/config.json file" + err.Error())
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func updateConfigAuth(dockerConfigFile string) error {
|
|
|
|
bcontent, err := os.ReadFile(dockerConfigFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
content := string(bcontent)
|
|
if !strings.Contains(content, strings.Split(common.DefaultRegistry, "/")[0]) {
|
|
// default registry is not present on .docker/config.json, so let's add it
|
|
log.Println("Updating ./docker/config.json file with default registry authentication.")
|
|
exp := regexp.MustCompile(`"auths"[\s]*?[:][\s]*?{`)
|
|
newContent := exp.ReplaceAll(bcontent, []byte(`"auths": {
|
|
"localhost:50000": {
|
|
"auth": "dXNlcjpwYXNzd29yZA=="
|
|
},`))
|
|
|
|
// Replace file content
|
|
_ = os.Rename(dockerConfigFile, dockerConfigFile+".e2e")
|
|
err := createConfigAuth(dockerConfigFile, string(newContent))
|
|
if err != nil {
|
|
// rollback config file
|
|
_ = os.Rename(dockerConfigFile+".e2e", dockerConfigFile)
|
|
return err
|
|
}
|
|
_ = os.Remove(dockerConfigFile + ".e2e")
|
|
}
|
|
return nil
|
|
}
|