|
@@ -21,7 +21,7 @@ const (
|
|
|
|
|
|
func spawnTestRegistrySession(t *testing.T) *Session {
|
|
func spawnTestRegistrySession(t *testing.T) *Session {
|
|
authConfig := &AuthConfig{}
|
|
authConfig := &AuthConfig{}
|
|
- endpoint, err := NewEndpoint(makeURL("/v1/"), insecureRegistries)
|
|
|
|
|
|
+ endpoint, err := NewEndpoint(makeIndex("/v1/"))
|
|
if err != nil {
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
@@ -32,16 +32,139 @@ func spawnTestRegistrySession(t *testing.T) *Session {
|
|
return r
|
|
return r
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func TestPublicSession(t *testing.T) {
|
|
|
|
+ authConfig := &AuthConfig{}
|
|
|
|
+
|
|
|
|
+ getSessionDecorators := func(index *IndexInfo) int {
|
|
|
|
+ endpoint, err := NewEndpoint(index)
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+ r, err := NewSession(authConfig, utils.NewHTTPRequestFactory(), endpoint, true)
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+ return len(r.reqFactory.GetDecorators())
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ decorators := getSessionDecorators(makeIndex("/v1/"))
|
|
|
|
+ assertEqual(t, decorators, 0, "Expected no decorator on http session")
|
|
|
|
+
|
|
|
|
+ decorators = getSessionDecorators(makeHttpsIndex("/v1/"))
|
|
|
|
+ assertNotEqual(t, decorators, 0, "Expected decorator on https session")
|
|
|
|
+
|
|
|
|
+ decorators = getSessionDecorators(makePublicIndex())
|
|
|
|
+ assertEqual(t, decorators, 0, "Expected no decorator on public session")
|
|
|
|
+}
|
|
|
|
+
|
|
func TestPingRegistryEndpoint(t *testing.T) {
|
|
func TestPingRegistryEndpoint(t *testing.T) {
|
|
- ep, err := NewEndpoint(makeURL("/v1/"), insecureRegistries)
|
|
|
|
- if err != nil {
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
|
+ testPing := func(index *IndexInfo, expectedStandalone bool, assertMessage string) {
|
|
|
|
+ ep, err := NewEndpoint(index)
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+ regInfo, err := ep.Ping()
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ assertEqual(t, regInfo.Standalone, expectedStandalone, assertMessage)
|
|
}
|
|
}
|
|
- regInfo, err := ep.Ping()
|
|
|
|
- if err != nil {
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
|
+
|
|
|
|
+ testPing(makeIndex("/v1/"), true, "Expected standalone to be true (default)")
|
|
|
|
+ testPing(makeHttpsIndex("/v1/"), true, "Expected standalone to be true (default)")
|
|
|
|
+ testPing(makePublicIndex(), false, "Expected standalone to be false for public index")
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestEndpoint(t *testing.T) {
|
|
|
|
+ // Simple wrapper to fail test if err != nil
|
|
|
|
+ expandEndpoint := func(index *IndexInfo) *Endpoint {
|
|
|
|
+ endpoint, err := NewEndpoint(index)
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+ return endpoint
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ assertInsecureIndex := func(index *IndexInfo) {
|
|
|
|
+ index.Secure = true
|
|
|
|
+ _, err := NewEndpoint(index)
|
|
|
|
+ assertNotEqual(t, err, nil, index.Name+": Expected error for insecure index")
|
|
|
|
+ assertEqual(t, strings.Contains(err.Error(), "insecure-registry"), true, index.Name+": Expected insecure-registry error for insecure index")
|
|
|
|
+ index.Secure = false
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ assertSecureIndex := func(index *IndexInfo) {
|
|
|
|
+ index.Secure = true
|
|
|
|
+ _, err := NewEndpoint(index)
|
|
|
|
+ assertNotEqual(t, err, nil, index.Name+": Expected cert error for secure index")
|
|
|
|
+ assertEqual(t, strings.Contains(err.Error(), "certificate signed by unknown authority"), true, index.Name+": Expected cert error for secure index")
|
|
|
|
+ index.Secure = false
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ index := &IndexInfo{}
|
|
|
|
+ index.Name = makeURL("/v1/")
|
|
|
|
+ endpoint := expandEndpoint(index)
|
|
|
|
+ assertEqual(t, endpoint.String(), index.Name, "Expected endpoint to be "+index.Name)
|
|
|
|
+ if endpoint.Version != APIVersion1 {
|
|
|
|
+ t.Fatal("Expected endpoint to be v1")
|
|
|
|
+ }
|
|
|
|
+ assertInsecureIndex(index)
|
|
|
|
+
|
|
|
|
+ index.Name = makeURL("")
|
|
|
|
+ endpoint = expandEndpoint(index)
|
|
|
|
+ assertEqual(t, endpoint.String(), index.Name+"/v1/", index.Name+": Expected endpoint to be "+index.Name+"/v1/")
|
|
|
|
+ if endpoint.Version != APIVersion1 {
|
|
|
|
+ t.Fatal("Expected endpoint to be v1")
|
|
|
|
+ }
|
|
|
|
+ assertInsecureIndex(index)
|
|
|
|
+
|
|
|
|
+ httpURL := makeURL("")
|
|
|
|
+ index.Name = strings.SplitN(httpURL, "://", 2)[1]
|
|
|
|
+ endpoint = expandEndpoint(index)
|
|
|
|
+ assertEqual(t, endpoint.String(), httpURL+"/v1/", index.Name+": Expected endpoint to be "+httpURL+"/v1/")
|
|
|
|
+ if endpoint.Version != APIVersion1 {
|
|
|
|
+ t.Fatal("Expected endpoint to be v1")
|
|
|
|
+ }
|
|
|
|
+ assertInsecureIndex(index)
|
|
|
|
+
|
|
|
|
+ index.Name = makeHttpsURL("/v1/")
|
|
|
|
+ endpoint = expandEndpoint(index)
|
|
|
|
+ assertEqual(t, endpoint.String(), index.Name, "Expected endpoint to be "+index.Name)
|
|
|
|
+ if endpoint.Version != APIVersion1 {
|
|
|
|
+ t.Fatal("Expected endpoint to be v1")
|
|
|
|
+ }
|
|
|
|
+ assertSecureIndex(index)
|
|
|
|
+
|
|
|
|
+ index.Name = makeHttpsURL("")
|
|
|
|
+ endpoint = expandEndpoint(index)
|
|
|
|
+ assertEqual(t, endpoint.String(), index.Name+"/v1/", index.Name+": Expected endpoint to be "+index.Name+"/v1/")
|
|
|
|
+ if endpoint.Version != APIVersion1 {
|
|
|
|
+ t.Fatal("Expected endpoint to be v1")
|
|
|
|
+ }
|
|
|
|
+ assertSecureIndex(index)
|
|
|
|
+
|
|
|
|
+ httpsURL := makeHttpsURL("")
|
|
|
|
+ index.Name = strings.SplitN(httpsURL, "://", 2)[1]
|
|
|
|
+ endpoint = expandEndpoint(index)
|
|
|
|
+ assertEqual(t, endpoint.String(), httpsURL+"/v1/", index.Name+": Expected endpoint to be "+httpsURL+"/v1/")
|
|
|
|
+ if endpoint.Version != APIVersion1 {
|
|
|
|
+ t.Fatal("Expected endpoint to be v1")
|
|
|
|
+ }
|
|
|
|
+ assertSecureIndex(index)
|
|
|
|
+
|
|
|
|
+ badEndpoints := []string{
|
|
|
|
+ "http://127.0.0.1/v1/",
|
|
|
|
+ "https://127.0.0.1/v1/",
|
|
|
|
+ "http://127.0.0.1",
|
|
|
|
+ "https://127.0.0.1",
|
|
|
|
+ "127.0.0.1",
|
|
|
|
+ }
|
|
|
|
+ for _, address := range badEndpoints {
|
|
|
|
+ index.Name = address
|
|
|
|
+ _, err := NewEndpoint(index)
|
|
|
|
+ checkNotEqual(t, err, nil, "Expected error while expanding bad endpoint")
|
|
}
|
|
}
|
|
- assertEqual(t, regInfo.Standalone, true, "Expected standalone to be true (default)")
|
|
|
|
}
|
|
}
|
|
|
|
|
|
func TestGetRemoteHistory(t *testing.T) {
|
|
func TestGetRemoteHistory(t *testing.T) {
|
|
@@ -156,30 +279,413 @@ func TestPushImageLayerRegistry(t *testing.T) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-func TestResolveRepositoryName(t *testing.T) {
|
|
|
|
- _, _, err := ResolveRepositoryName("https://github.com/docker/docker")
|
|
|
|
- assertEqual(t, err, ErrInvalidRepositoryName, "Expected error invalid repo name")
|
|
|
|
- ep, repo, err := ResolveRepositoryName("fooo/bar")
|
|
|
|
- if err != nil {
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
|
+func TestValidateRepositoryName(t *testing.T) {
|
|
|
|
+ validRepoNames := []string{
|
|
|
|
+ "docker/docker",
|
|
|
|
+ "library/debian",
|
|
|
|
+ "debian",
|
|
|
|
+ "docker.io/docker/docker",
|
|
|
|
+ "docker.io/library/debian",
|
|
|
|
+ "docker.io/debian",
|
|
|
|
+ "index.docker.io/docker/docker",
|
|
|
|
+ "index.docker.io/library/debian",
|
|
|
|
+ "index.docker.io/debian",
|
|
|
|
+ "127.0.0.1:5000/docker/docker",
|
|
|
|
+ "127.0.0.1:5000/library/debian",
|
|
|
|
+ "127.0.0.1:5000/debian",
|
|
|
|
+ "thisisthesongthatneverendsitgoesonandonandonthisisthesongthatnev",
|
|
|
|
+ }
|
|
|
|
+ invalidRepoNames := []string{
|
|
|
|
+ "https://github.com/docker/docker",
|
|
|
|
+ "docker/Docker",
|
|
|
|
+ "docker///docker",
|
|
|
|
+ "docker.io/docker/Docker",
|
|
|
|
+ "docker.io/docker///docker",
|
|
|
|
+ "1a3f5e7d9c1b3a5f7e9d1c3b5a7f9e1d3c5b7a9f1e3d5d7c9b1a3f5e7d9c1b3a",
|
|
|
|
+ "docker.io/1a3f5e7d9c1b3a5f7e9d1c3b5a7f9e1d3c5b7a9f1e3d5d7c9b1a3f5e7d9c1b3a",
|
|
}
|
|
}
|
|
- assertEqual(t, ep, IndexServerAddress(), "Expected endpoint to be index server address")
|
|
|
|
- assertEqual(t, repo, "fooo/bar", "Expected resolved repo to be foo/bar")
|
|
|
|
|
|
|
|
- u := makeURL("")[7:]
|
|
|
|
- ep, repo, err = ResolveRepositoryName(u + "/private/moonbase")
|
|
|
|
- if err != nil {
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
|
+ for _, name := range invalidRepoNames {
|
|
|
|
+ err := ValidateRepositoryName(name)
|
|
|
|
+ assertNotEqual(t, err, nil, "Expected invalid repo name: "+name)
|
|
}
|
|
}
|
|
- assertEqual(t, ep, u, "Expected endpoint to be "+u)
|
|
|
|
- assertEqual(t, repo, "private/moonbase", "Expected endpoint to be private/moonbase")
|
|
|
|
|
|
|
|
- ep, repo, err = ResolveRepositoryName("ubuntu-12.04-base")
|
|
|
|
- if err != nil {
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
|
+ for _, name := range validRepoNames {
|
|
|
|
+ err := ValidateRepositoryName(name)
|
|
|
|
+ assertEqual(t, err, nil, "Expected valid repo name: "+name)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err := ValidateRepositoryName(invalidRepoNames[0])
|
|
|
|
+ assertEqual(t, err, ErrInvalidRepositoryName, "Expected ErrInvalidRepositoryName: "+invalidRepoNames[0])
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestParseRepositoryInfo(t *testing.T) {
|
|
|
|
+ expectedRepoInfos := map[string]RepositoryInfo{
|
|
|
|
+ "fooo/bar": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "fooo/bar",
|
|
|
|
+ LocalName: "fooo/bar",
|
|
|
|
+ CanonicalName: "fooo/bar",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "library/ubuntu": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "library/ubuntu",
|
|
|
|
+ LocalName: "ubuntu",
|
|
|
|
+ CanonicalName: "ubuntu",
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ "nonlibrary/ubuntu": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "nonlibrary/ubuntu",
|
|
|
|
+ LocalName: "nonlibrary/ubuntu",
|
|
|
|
+ CanonicalName: "nonlibrary/ubuntu",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "ubuntu": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "library/ubuntu",
|
|
|
|
+ LocalName: "ubuntu",
|
|
|
|
+ CanonicalName: "ubuntu",
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ "other/library": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "other/library",
|
|
|
|
+ LocalName: "other/library",
|
|
|
|
+ CanonicalName: "other/library",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "127.0.0.1:8000/private/moonbase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: "127.0.0.1:8000",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "private/moonbase",
|
|
|
|
+ LocalName: "127.0.0.1:8000/private/moonbase",
|
|
|
|
+ CanonicalName: "127.0.0.1:8000/private/moonbase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "127.0.0.1:8000/privatebase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: "127.0.0.1:8000",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "privatebase",
|
|
|
|
+ LocalName: "127.0.0.1:8000/privatebase",
|
|
|
|
+ CanonicalName: "127.0.0.1:8000/privatebase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "localhost:8000/private/moonbase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: "localhost:8000",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "private/moonbase",
|
|
|
|
+ LocalName: "localhost:8000/private/moonbase",
|
|
|
|
+ CanonicalName: "localhost:8000/private/moonbase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "localhost:8000/privatebase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: "localhost:8000",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "privatebase",
|
|
|
|
+ LocalName: "localhost:8000/privatebase",
|
|
|
|
+ CanonicalName: "localhost:8000/privatebase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "example.com/private/moonbase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: "example.com",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "private/moonbase",
|
|
|
|
+ LocalName: "example.com/private/moonbase",
|
|
|
|
+ CanonicalName: "example.com/private/moonbase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "example.com/privatebase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: "example.com",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "privatebase",
|
|
|
|
+ LocalName: "example.com/privatebase",
|
|
|
|
+ CanonicalName: "example.com/privatebase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "example.com:8000/private/moonbase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: "example.com:8000",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "private/moonbase",
|
|
|
|
+ LocalName: "example.com:8000/private/moonbase",
|
|
|
|
+ CanonicalName: "example.com:8000/private/moonbase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "example.com:8000/privatebase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: "example.com:8000",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "privatebase",
|
|
|
|
+ LocalName: "example.com:8000/privatebase",
|
|
|
|
+ CanonicalName: "example.com:8000/privatebase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "localhost/private/moonbase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: "localhost",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "private/moonbase",
|
|
|
|
+ LocalName: "localhost/private/moonbase",
|
|
|
|
+ CanonicalName: "localhost/private/moonbase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "localhost/privatebase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: "localhost",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "privatebase",
|
|
|
|
+ LocalName: "localhost/privatebase",
|
|
|
|
+ CanonicalName: "localhost/privatebase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ IndexServerName() + "/public/moonbase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "public/moonbase",
|
|
|
|
+ LocalName: "public/moonbase",
|
|
|
|
+ CanonicalName: "public/moonbase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "index." + IndexServerName() + "/public/moonbase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "public/moonbase",
|
|
|
|
+ LocalName: "public/moonbase",
|
|
|
|
+ CanonicalName: "public/moonbase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ IndexServerName() + "/public/moonbase": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "public/moonbase",
|
|
|
|
+ LocalName: "public/moonbase",
|
|
|
|
+ CanonicalName: "public/moonbase",
|
|
|
|
+ Official: false,
|
|
|
|
+ },
|
|
|
|
+ "ubuntu-12.04-base": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "library/ubuntu-12.04-base",
|
|
|
|
+ LocalName: "ubuntu-12.04-base",
|
|
|
|
+ CanonicalName: "ubuntu-12.04-base",
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ IndexServerName() + "/ubuntu-12.04-base": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "library/ubuntu-12.04-base",
|
|
|
|
+ LocalName: "ubuntu-12.04-base",
|
|
|
|
+ CanonicalName: "ubuntu-12.04-base",
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ IndexServerName() + "/ubuntu-12.04-base": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "library/ubuntu-12.04-base",
|
|
|
|
+ LocalName: "ubuntu-12.04-base",
|
|
|
|
+ CanonicalName: "ubuntu-12.04-base",
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ "index." + IndexServerName() + "/ubuntu-12.04-base": {
|
|
|
|
+ Index: &IndexInfo{
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ RemoteName: "library/ubuntu-12.04-base",
|
|
|
|
+ LocalName: "ubuntu-12.04-base",
|
|
|
|
+ CanonicalName: "ubuntu-12.04-base",
|
|
|
|
+ Official: true,
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for reposName, expectedRepoInfo := range expectedRepoInfos {
|
|
|
|
+ repoInfo, err := ParseRepositoryInfo(reposName)
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Error(err)
|
|
|
|
+ } else {
|
|
|
|
+ checkEqual(t, repoInfo.Index.Name, expectedRepoInfo.Index.Name, reposName)
|
|
|
|
+ checkEqual(t, repoInfo.RemoteName, expectedRepoInfo.RemoteName, reposName)
|
|
|
|
+ checkEqual(t, repoInfo.LocalName, expectedRepoInfo.LocalName, reposName)
|
|
|
|
+ checkEqual(t, repoInfo.CanonicalName, expectedRepoInfo.CanonicalName, reposName)
|
|
|
|
+ checkEqual(t, repoInfo.Index.Official, expectedRepoInfo.Index.Official, reposName)
|
|
|
|
+ checkEqual(t, repoInfo.Official, expectedRepoInfo.Official, reposName)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestNewIndexInfo(t *testing.T) {
|
|
|
|
+ testIndexInfo := func(config *ServiceConfig, expectedIndexInfos map[string]*IndexInfo) {
|
|
|
|
+ for indexName, expectedIndexInfo := range expectedIndexInfos {
|
|
|
|
+ index, err := config.NewIndexInfo(indexName)
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Fatal(err)
|
|
|
|
+ } else {
|
|
|
|
+ checkEqual(t, index.Name, expectedIndexInfo.Name, indexName+" name")
|
|
|
|
+ checkEqual(t, index.Official, expectedIndexInfo.Official, indexName+" is official")
|
|
|
|
+ checkEqual(t, index.Secure, expectedIndexInfo.Secure, indexName+" is secure")
|
|
|
|
+ checkEqual(t, len(index.Mirrors), len(expectedIndexInfo.Mirrors), indexName+" mirrors")
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ config := NewServiceConfig(nil)
|
|
|
|
+ noMirrors := make([]string, 0)
|
|
|
|
+ expectedIndexInfos := map[string]*IndexInfo{
|
|
|
|
+ IndexServerName(): {
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ Secure: true,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ "index." + IndexServerName(): {
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ Secure: true,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ "example.com": {
|
|
|
|
+ Name: "example.com",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: true,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ "127.0.0.1:5000": {
|
|
|
|
+ Name: "127.0.0.1:5000",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: false,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ testIndexInfo(config, expectedIndexInfos)
|
|
|
|
+
|
|
|
|
+ publicMirrors := []string{"http://mirror1.local", "http://mirror2.local"}
|
|
|
|
+ config = makeServiceConfig(publicMirrors, []string{"example.com"})
|
|
|
|
+
|
|
|
|
+ expectedIndexInfos = map[string]*IndexInfo{
|
|
|
|
+ IndexServerName(): {
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ Secure: true,
|
|
|
|
+ Mirrors: publicMirrors,
|
|
|
|
+ },
|
|
|
|
+ "index." + IndexServerName(): {
|
|
|
|
+ Name: IndexServerName(),
|
|
|
|
+ Official: true,
|
|
|
|
+ Secure: true,
|
|
|
|
+ Mirrors: publicMirrors,
|
|
|
|
+ },
|
|
|
|
+ "example.com": {
|
|
|
|
+ Name: "example.com",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: false,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ "example.com:5000": {
|
|
|
|
+ Name: "example.com:5000",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: true,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ "127.0.0.1": {
|
|
|
|
+ Name: "127.0.0.1",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: false,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ "127.0.0.1:5000": {
|
|
|
|
+ Name: "127.0.0.1:5000",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: false,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ "other.com": {
|
|
|
|
+ Name: "other.com",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: true,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ testIndexInfo(config, expectedIndexInfos)
|
|
|
|
+
|
|
|
|
+ config = makeServiceConfig(nil, []string{"42.42.0.0/16"})
|
|
|
|
+ expectedIndexInfos = map[string]*IndexInfo{
|
|
|
|
+ "example.com": {
|
|
|
|
+ Name: "example.com",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: false,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ "example.com:5000": {
|
|
|
|
+ Name: "example.com:5000",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: false,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ "127.0.0.1": {
|
|
|
|
+ Name: "127.0.0.1",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: false,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ "127.0.0.1:5000": {
|
|
|
|
+ Name: "127.0.0.1:5000",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: false,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
|
|
+ "other.com": {
|
|
|
|
+ Name: "other.com",
|
|
|
|
+ Official: false,
|
|
|
|
+ Secure: true,
|
|
|
|
+ Mirrors: noMirrors,
|
|
|
|
+ },
|
|
}
|
|
}
|
|
- assertEqual(t, ep, IndexServerAddress(), "Expected endpoint to be "+IndexServerAddress())
|
|
|
|
- assertEqual(t, repo, "ubuntu-12.04-base", "Expected endpoint to be ubuntu-12.04-base")
|
|
|
|
|
|
+ testIndexInfo(config, expectedIndexInfos)
|
|
}
|
|
}
|
|
|
|
|
|
func TestPushRegistryTag(t *testing.T) {
|
|
func TestPushRegistryTag(t *testing.T) {
|
|
@@ -232,7 +738,7 @@ func TestSearchRepositories(t *testing.T) {
|
|
assertEqual(t, results.Results[0].StarCount, 42, "Expected 'fakeimage' a ot hae 42 stars")
|
|
assertEqual(t, results.Results[0].StarCount, 42, "Expected 'fakeimage' a ot hae 42 stars")
|
|
}
|
|
}
|
|
|
|
|
|
-func TestValidRepositoryName(t *testing.T) {
|
|
|
|
|
|
+func TestValidRemoteName(t *testing.T) {
|
|
validRepositoryNames := []string{
|
|
validRepositoryNames := []string{
|
|
// Sanity check.
|
|
// Sanity check.
|
|
"docker/docker",
|
|
"docker/docker",
|
|
@@ -247,7 +753,7 @@ func TestValidRepositoryName(t *testing.T) {
|
|
"____/____",
|
|
"____/____",
|
|
}
|
|
}
|
|
for _, repositoryName := range validRepositoryNames {
|
|
for _, repositoryName := range validRepositoryNames {
|
|
- if err := validateRepositoryName(repositoryName); err != nil {
|
|
|
|
|
|
+ if err := validateRemoteName(repositoryName); err != nil {
|
|
t.Errorf("Repository name should be valid: %v. Error: %v", repositoryName, err)
|
|
t.Errorf("Repository name should be valid: %v. Error: %v", repositoryName, err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -277,7 +783,7 @@ func TestValidRepositoryName(t *testing.T) {
|
|
"docker/",
|
|
"docker/",
|
|
}
|
|
}
|
|
for _, repositoryName := range invalidRepositoryNames {
|
|
for _, repositoryName := range invalidRepositoryNames {
|
|
- if err := validateRepositoryName(repositoryName); err == nil {
|
|
|
|
|
|
+ if err := validateRemoteName(repositoryName); err == nil {
|
|
t.Errorf("Repository name should be invalid: %v", repositoryName)
|
|
t.Errorf("Repository name should be invalid: %v", repositoryName)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -350,13 +856,13 @@ func TestAddRequiredHeadersToRedirectedRequests(t *testing.T) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-func TestIsSecure(t *testing.T) {
|
|
|
|
|
|
+func TestIsSecureIndex(t *testing.T) {
|
|
tests := []struct {
|
|
tests := []struct {
|
|
addr string
|
|
addr string
|
|
insecureRegistries []string
|
|
insecureRegistries []string
|
|
expected bool
|
|
expected bool
|
|
}{
|
|
}{
|
|
- {IndexServerURL.Host, nil, true},
|
|
|
|
|
|
+ {IndexServerName(), nil, true},
|
|
{"example.com", []string{}, true},
|
|
{"example.com", []string{}, true},
|
|
{"example.com", []string{"example.com"}, false},
|
|
{"example.com", []string{"example.com"}, false},
|
|
{"localhost", []string{"localhost:5000"}, false},
|
|
{"localhost", []string{"localhost:5000"}, false},
|
|
@@ -383,10 +889,9 @@ func TestIsSecure(t *testing.T) {
|
|
{"invalid.domain.com:5000", []string{"invalid.domain.com:5000"}, false},
|
|
{"invalid.domain.com:5000", []string{"invalid.domain.com:5000"}, false},
|
|
}
|
|
}
|
|
for _, tt := range tests {
|
|
for _, tt := range tests {
|
|
- // TODO: remove this once we remove localhost insecure by default
|
|
|
|
- insecureRegistries := append(tt.insecureRegistries, "127.0.0.0/8")
|
|
|
|
- if sec, err := isSecure(tt.addr, insecureRegistries); err != nil || sec != tt.expected {
|
|
|
|
- t.Fatalf("isSecure failed for %q %v, expected %v got %v. Error: %v", tt.addr, insecureRegistries, tt.expected, sec, err)
|
|
|
|
|
|
+ config := makeServiceConfig(nil, tt.insecureRegistries)
|
|
|
|
+ if sec := config.isSecureIndex(tt.addr); sec != tt.expected {
|
|
|
|
+ t.Errorf("isSecureIndex failed for %q %v, expected %v got %v", tt.addr, tt.insecureRegistries, tt.expected, sec)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|