karmada/pkg/util/imageparser/parser_test.go

232 lines
6.6 KiB
Go

/*
Copyright 2021 The Karmada Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package imageparser
import (
"fmt"
"testing"
"github.com/karmada-io/karmada/pkg/util/names"
)
func TestParse(t *testing.T) {
tests := []struct {
name string
image string
expectHostname string
expectRepository string
expectTag string
expectDigest string
}{
{
name: "simple",
image: "pause",
expectHostname: "",
expectRepository: "pause",
expectTag: "",
},
{
name: "repository",
image: "subpath/imagename:v1.0.0",
expectHostname: "",
expectRepository: "subpath/imagename",
expectTag: "v1.0.0",
},
{
name: "normal",
image: "fictional.registry.example/imagename:v1.0.0",
expectHostname: "fictional.registry.example",
expectRepository: "imagename",
expectTag: "v1.0.0",
},
{
name: "hostname with port",
image: "fictional.registry.example:10443/subpath/imagename:v1.0.0",
expectHostname: "fictional.registry.example:10443",
expectRepository: "subpath/imagename",
expectTag: "v1.0.0",
},
{
name: "digest",
image: "fictional.registry.example:10443/subpath/imagename@sha256:50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c",
expectHostname: "fictional.registry.example:10443",
expectRepository: "subpath/imagename",
expectDigest: "sha256:50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c",
},
}
for _, test := range tests {
tc := test
t.Run(tc.name, func(t *testing.T) {
comp, err := Parse(tc.image)
if err != nil {
t.Fatalf("unexpected error but got: %v", err)
}
if comp.String() != tc.image {
t.Fatalf("full name changed from %s to %s", tc.image, comp.String())
}
if comp.Hostname() != tc.expectHostname {
t.Fatalf("expected registry: %s, but got: %s", tc.expectHostname, comp.Hostname())
}
if comp.Repository() != tc.expectRepository {
t.Fatalf("expected name: %s, but got: %s", tc.expectRepository, comp.Repository())
}
if comp.Tag() != tc.expectTag {
t.Fatalf("expected tag: %s, but got: %s", tc.expectTag, comp.Tag())
}
if comp.Digest() != tc.expectDigest {
t.Fatalf("expected digest: %s, but got: %s", tc.expectDigest, comp.Digest())
}
})
}
}
func TestSplitHostname(t *testing.T) {
tests := []struct {
name string
input string
expectedHostname string
expectedRepository string
}{
{
name: "empty image got nothing",
input: "",
expectedHostname: "",
expectedRepository: "",
},
{
name: "simple repository",
input: "imagename",
expectedHostname: "",
expectedRepository: "imagename",
},
{
name: "repository with sub-path",
input: "subpath/imagename",
expectedHostname: "",
expectedRepository: "subpath/imagename",
},
{
name: "canonical image",
input: "fictional.registry.example/subpath/imagename",
expectedHostname: "fictional.registry.example",
expectedRepository: "subpath/imagename",
},
{
name: "hostname with port",
input: "fictional.registry.example:10443/subpath/imagename",
expectedHostname: "fictional.registry.example:10443",
expectedRepository: "subpath/imagename",
},
{
name: "hostname with IP",
input: "10.10.10.10:10443/subpath/imagename",
expectedHostname: "10.10.10.10:10443",
expectedRepository: "subpath/imagename",
},
}
for _, test := range tests {
tc := test
t.Run(tc.name, func(t *testing.T) {
hostname, repository := SplitHostname(tc.input)
if hostname != tc.expectedHostname {
t.Fatalf("expected hostname: %s, but got: %s", tc.expectedHostname, hostname)
}
if repository != tc.expectedRepository {
t.Fatalf("expected repository: %s, but got: %s", tc.expectedRepository, repository)
}
})
}
}
func ExampleComponents_SetHostname() {
image := "imagename:v1.0.0"
comp, err := Parse(image)
if err != nil {
panic(err)
}
comp.SetHostname("fictional.registry.example") // add hostname
fmt.Println(comp.String())
comp.SetHostname("gcr.io") // update hostname
fmt.Println(comp.String())
comp.RemoveHostname() // remove hostname
fmt.Println(comp.String())
// Output:
// fictional.registry.example/imagename:v1.0.0
// gcr.io/imagename:v1.0.0
// imagename:v1.0.0
}
func ExampleComponents_SetRepository() {
image := "gcr.io/kube-apiserver:v1.19.0"
comp, err := Parse(image)
if err != nil {
panic(err)
}
comp.SetRepository("kube-controller-manager") // update
fmt.Println(comp.String())
// Output:
// gcr.io/kube-controller-manager:v1.19.0
}
func ExampleComponents_SetTagOrDigest() {
image := "gcr.io/kube-apiserver"
comp, err := Parse(image)
if err != nil {
panic(err)
}
comp.SetTagOrDigest("v1.19.0") // set
fmt.Println(comp.String())
comp.RemoveTagOrDigest() // remove tag
fmt.Println(comp.String())
comp.SetTagOrDigest("sha256:50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c") // update
fmt.Println(comp.String())
comp.RemoveTagOrDigest() // remove digest
fmt.Println(comp.String())
// Output:
// gcr.io/kube-apiserver:v1.19.0
// gcr.io/kube-apiserver
// gcr.io/kube-apiserver@sha256:50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
// gcr.io/kube-apiserver
}
func ExampleComponents_String() {
key := Components{
hostname: "fictional.registry.example",
repository: names.KarmadaSchedulerComponentName,
tag: "v1.0.0",
}
pKey := &key
fmt.Printf("%s\n", key)
fmt.Printf("%v\n", key)
fmt.Printf("%s\n", key.String())
fmt.Printf("%s\n", pKey)
fmt.Printf("%v\n", pKey)
fmt.Printf("%s\n", pKey.String())
// Output:
// fictional.registry.example/karmada-scheduler:v1.0.0
// fictional.registry.example/karmada-scheduler:v1.0.0
// fictional.registry.example/karmada-scheduler:v1.0.0
// fictional.registry.example/karmada-scheduler:v1.0.0
// fictional.registry.example/karmada-scheduler:v1.0.0
// fictional.registry.example/karmada-scheduler:v1.0.0
}