Commit 8a9cfdf8 authored by guangxuli's avatar guangxuli

make function ReadDockerConfigFile more flexible

rename the variable make parameter more flexible handle docker config file path use a single set of paths delete debug print gofmt delete the empty line comment is not correct move the comment to the correct place keep original signature godoc
parent 0a62dab5
...@@ -74,16 +74,30 @@ func GetPreferredDockercfgPath() string { ...@@ -74,16 +74,30 @@ func GetPreferredDockercfgPath() string {
return preferredPath return preferredPath
} }
func ReadDockerConfigFile() (cfg DockerConfig, err error) { //DefaultDockercfgPaths returns default search paths of .dockercfg
// Try happy path first - latest config file func DefaultDockercfgPaths() []string {
dockerConfigJsonLocations := []string{GetPreferredDockercfgPath(), workingDirPath, homeJsonDirPath, rootJsonDirPath} return []string{GetPreferredDockercfgPath(), workingDirPath, homeDirPath, rootDirPath}
for _, configPath := range dockerConfigJsonLocations { }
absDockerConfigFileLocation, err := filepath.Abs(filepath.Join(configPath, configJsonFileName))
//DefaultDockerConfigJSONPaths returns default search paths of .docker/config.json
func DefaultDockerConfigJSONPaths() []string {
return []string{GetPreferredDockercfgPath(), workingDirPath, homeJsonDirPath, rootJsonDirPath}
}
// ReadDockercfgFile attempts to read a legacy dockercfg file from the given paths.
// if searchPaths is empty, the default paths are used.
func ReadDockercfgFile(searchPaths []string) (cfg DockerConfig, err error) {
if len(searchPaths) == 0 {
searchPaths = DefaultDockercfgPaths()
}
for _, configPath := range searchPaths {
absDockerConfigFileLocation, err := filepath.Abs(filepath.Join(configPath, configFileName))
if err != nil { if err != nil {
glog.Errorf("while trying to canonicalize %s: %v", configPath, err) glog.Errorf("while trying to canonicalize %s: %v", configPath, err)
continue continue
} }
glog.V(4).Infof("looking for .docker/config.json at %s", absDockerConfigFileLocation) glog.V(4).Infof("looking for .dockercfg at %s", absDockerConfigFileLocation)
contents, err := ioutil.ReadFile(absDockerConfigFileLocation) contents, err := ioutil.ReadFile(absDockerConfigFileLocation)
if os.IsNotExist(err) { if os.IsNotExist(err) {
continue continue
...@@ -92,23 +106,29 @@ func ReadDockerConfigFile() (cfg DockerConfig, err error) { ...@@ -92,23 +106,29 @@ func ReadDockerConfigFile() (cfg DockerConfig, err error) {
glog.V(4).Infof("while trying to read %s: %v", absDockerConfigFileLocation, err) glog.V(4).Infof("while trying to read %s: %v", absDockerConfigFileLocation, err)
continue continue
} }
cfg, err := readDockerConfigJsonFileFromBytes(contents) cfg, err := readDockerConfigFileFromBytes(contents)
if err == nil { if err == nil {
glog.V(4).Infof("found .docker/config.json at %s", absDockerConfigFileLocation) glog.V(4).Infof("found .dockercfg at %s", absDockerConfigFileLocation)
return cfg, nil return cfg, nil
} }
} }
glog.V(4).Infof("couldn't find valid .docker/config.json after checking in %v", dockerConfigJsonLocations) return nil, fmt.Errorf("couldn't find valid .dockercfg after checking in %v", searchPaths)
}
// ReadDockerConfigJSONFile attempts to read a docker config.json file from the given paths.
// if searchPaths is empty, the default paths are used.
func ReadDockerConfigJSONFile(searchPaths []string) (cfg DockerConfig, err error) {
if len(searchPaths) == 0 {
searchPaths = DefaultDockerConfigJSONPaths()
}
// Can't find latest config file so check for the old one for _, configPath := range searchPaths {
dockerConfigFileLocations := []string{GetPreferredDockercfgPath(), workingDirPath, homeDirPath, rootDirPath} absDockerConfigFileLocation, err := filepath.Abs(filepath.Join(configPath, configJsonFileName))
for _, configPath := range dockerConfigFileLocations {
absDockerConfigFileLocation, err := filepath.Abs(filepath.Join(configPath, configFileName))
if err != nil { if err != nil {
glog.Errorf("while trying to canonicalize %s: %v", configPath, err) glog.Errorf("while trying to canonicalize %s: %v", configPath, err)
continue continue
} }
glog.V(4).Infof("looking for .dockercfg at %s", absDockerConfigFileLocation) glog.V(4).Infof("looking for .docker/config.json at %s", absDockerConfigFileLocation)
contents, err := ioutil.ReadFile(absDockerConfigFileLocation) contents, err := ioutil.ReadFile(absDockerConfigFileLocation)
if os.IsNotExist(err) { if os.IsNotExist(err) {
continue continue
...@@ -117,13 +137,21 @@ func ReadDockerConfigFile() (cfg DockerConfig, err error) { ...@@ -117,13 +137,21 @@ func ReadDockerConfigFile() (cfg DockerConfig, err error) {
glog.V(4).Infof("while trying to read %s: %v", absDockerConfigFileLocation, err) glog.V(4).Infof("while trying to read %s: %v", absDockerConfigFileLocation, err)
continue continue
} }
cfg, err := readDockerConfigFileFromBytes(contents) cfg, err := readDockerConfigJsonFileFromBytes(contents)
if err == nil { if err == nil {
glog.V(4).Infof("found .dockercfg at %s", absDockerConfigFileLocation) glog.V(4).Infof("found .docker/config.json at %s", absDockerConfigFileLocation)
return cfg, nil return cfg, nil
} }
} }
return nil, fmt.Errorf("couldn't find valid .dockercfg after checking in %v", dockerConfigFileLocations) return nil, fmt.Errorf("couldn't find valid .docker/config.json after checking in %v", searchPaths)
}
func ReadDockerConfigFile() (cfg DockerConfig, err error) {
if cfg, err := ReadDockerConfigJSONFile(nil); err == nil {
return cfg, nil
}
// Can't find latest config file so check for the old one
return ReadDockercfgFile(nil)
} }
// HttpError wraps a non-StatusOK error code as an error. // HttpError wraps a non-StatusOK error code as an error.
......
...@@ -18,10 +18,51 @@ package credentialprovider ...@@ -18,10 +18,51 @@ package credentialprovider
import ( import (
"encoding/json" "encoding/json"
"io/ioutil"
"os"
"path/filepath"
"reflect" "reflect"
"testing" "testing"
) )
func TestReadDockerConfigFile(t *testing.T) {
configJsonFileName := "config.json"
var fileInfo *os.File
preferredPaths := []string{}
//test dockerconfig json
inputDockerconfigJsonFile := "{ \"auths\": { \"http://foo.example.com\":{\"auth\":\"Zm9vOmJhcgo=\",\"email\":\"foo@example.com\"}}}"
preferredPath, err := ioutil.TempDir("", "test_foo_bar_dockerconfigjson_")
if err != nil {
t.Fatalf("Creating tmp dir fail: %v", err)
return
}
defer os.RemoveAll(preferredPath)
preferredPaths = append(preferredPaths, preferredPath)
absDockerConfigFileLocation, err := filepath.Abs(filepath.Join(preferredPath, configJsonFileName))
if err != nil {
t.Fatalf("While trying to canonicalize %s: %v", preferredPath, err)
}
if _, err := os.Stat(absDockerConfigFileLocation); os.IsNotExist(err) {
//create test cfg file
fileInfo, err = os.OpenFile(absDockerConfigFileLocation, os.O_CREATE|os.O_RDWR, 0664)
if err != nil {
t.Fatalf("While trying to create file %s: %v", absDockerConfigFileLocation, err)
}
defer fileInfo.Close()
}
fileInfo.WriteString(inputDockerconfigJsonFile)
orgPreferredPath := GetPreferredDockercfgPath()
SetPreferredDockercfgPath(preferredPath)
defer SetPreferredDockercfgPath(orgPreferredPath)
if _, err := ReadDockerConfigFile(); err != nil {
t.Errorf("Getting docker config file fail : %v preferredPath : %q", err, preferredPath)
}
}
func TestDockerConfigJsonJSONDecode(t *testing.T) { func TestDockerConfigJsonJSONDecode(t *testing.T) {
input := []byte(`{"auths": {"http://foo.example.com":{"username": "foo", "password": "bar", "email": "foo@example.com"}, "http://bar.example.com":{"username": "bar", "password": "baz", "email": "bar@example.com"}}}`) input := []byte(`{"auths": {"http://foo.example.com":{"username": "foo", "password": "bar", "email": "foo@example.com"}, "http://bar.example.com":{"username": "bar", "password": "baz", "email": "bar@example.com"}}}`)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment