diff --git a/cmd/pinning/pinning_test.go b/cmd/pinning/pinning_test.go index d0f9fed..b7ed3a2 100644 --- a/cmd/pinning/pinning_test.go +++ b/cmd/pinning/pinning_test.go @@ -4,15 +4,14 @@ import ( "bytes" "encoding/json" "html/template" - "io/ioutil" "os" "path/filepath" . "github.com/benjamintf1/unmarshalledmatchers" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/operator-framework/operator-manifest-tools/pkg/imageresolver" "github.com/operator-framework/operator-manifest-tools/internal/utils" + "github.com/operator-framework/operator-manifest-tools/pkg/imageresolver" "gopkg.in/yaml.v3" ) @@ -35,13 +34,22 @@ var _ = Describe("pinning", func() { // Delims("{", "}").Parse(CSV_TEMPLATE_WITH_RELATED_IMAGES)) resolved = template.Must(template.New("resolved").Parse(CSV_RESOLVED_TEMPLATE)) - dir, _ = ioutil.TempDir("", "script") - manifestDir, _ = ioutil.TempDir("", "pinning_test_") + dir, err := os.MkdirTemp("", "script") + Expect(err).To(Succeed()) + DeferCleanup(func() { + Expect(os.RemoveAll(dir)).To(Succeed()) + }) + + manifestDir, err = os.MkdirTemp("", "pinning_test_") + Expect(err).To(Succeed()) + DeferCleanup(func() { + Expect(os.RemoveAll(manifestDir)).To(Succeed()) + }) csvFilePath = filepath.Join(manifestDir, "clusterserviceversion.yaml") resolverScript := filepath.Join(dir, "resolver.sh") - ioutil.WriteFile(resolverScript, []byte(`#!/bin/bash + err = os.WriteFile(resolverScript, []byte(`#!/bin/bash if [ "$1" == "registry.example.com/eggs:9.8" ]; then echo -n "2" exit 0 @@ -54,6 +62,7 @@ fi exit 1 `), 0700) + Expect(err).To(Succeed()) resolver, _ = imageresolver.GetResolver(imageresolver.ResolverScript, map[string]string{ "path": resolverScript, @@ -89,7 +98,7 @@ exit 1 extractData := bytes.Buffer{} extract(manifestDir, &extractData) - extractJson := []interface{}{} + extractJson := []any{} Expect(json.Unmarshal(extractData.Bytes(), &extractJson)).To(Succeed()) Expect(extractJson).To(HaveLen(2)) @@ -118,7 +127,7 @@ exit 1 }, }) - extractData, _ = json.Marshal([]interface{}{ + extractData, _ = json.Marshal([]any{ "registry.example.com/eggs:9.8", "registry.example.com/maps/spam-operator:1.2", }) @@ -129,11 +138,11 @@ exit 1 err := resolve(resolver, bytes.NewReader(extractData), &resolveData) Expect(err).To(Succeed()) - resolveJson := map[string]interface{}{} + resolveJson := map[string]any{} Expect(json.Unmarshal(resolveData.Bytes(), &resolveJson)).To(Succeed()) Expect(resolveJson).To(HaveLen(2)) Expect(resolveJson).To(Equal( - map[string]interface{}{ + map[string]any{ "registry.example.com/eggs:9.8": "registry.example.com/eggs@sha256:2", "registry.example.com/maps/spam-operator:1.2": "registry.example.com/maps/spam-operator@sha256:1", })) @@ -177,7 +186,7 @@ exit 1 resolvedFile = resolvedFileBuffer.Bytes() - resolveData, _ = json.Marshal(map[string]interface{}{ + resolveData, _ = json.Marshal(map[string]any{ "registry.example.com/eggs:9.8": "registry.example.com/eggs@sha256:2", "registry.example.com/maps/spam-operator:1.2": "registry.example.com/maps/spam-operator@sha256:1", }) @@ -187,7 +196,7 @@ exit 1 err := replace(manifestDir, bytes.NewReader(resolveData)) Expect(err).To(Succeed()) - fileData, err := ioutil.ReadFile(csvFilePath) + fileData, err := os.ReadFile(csvFilePath) Expect(err).To(Succeed()) Expect(fileData).To(MatchUnorderedYAML(resolvedFile)) @@ -220,12 +229,12 @@ exit 1 }, }) - extractFile, err = ioutil.TempFile(dir, "extract") + extractFile, err = os.CreateTemp(dir, "extract") Expect(err).To(Succeed()) outputExtract = utils.NewOutputParam() outputExtract.Name = extractFile.Name() - replaceFile, err = ioutil.TempFile(dir, "replace") + replaceFile, err = os.CreateTemp(dir, "replace") Expect(err).To(Succeed()) outputReplace = utils.NewOutputParam() outputReplace.Name = replaceFile.Name() @@ -261,7 +270,7 @@ exit 1 extractAnswer, err := os.ReadFile(outputExtract.Name) Expect(err).To(Succeed()) - extractJson := []interface{}{} + extractJson := []any{} Expect(json.Unmarshal(extractAnswer, &extractJson)).To(Succeed()) Expect(extractJson).To(HaveLen(2)) @@ -271,11 +280,11 @@ exit 1 resolveAnswer, err := os.ReadFile(outputReplace.Name) Expect(err).To(Succeed()) - resolveJson := map[string]interface{}{} + resolveJson := map[string]any{} Expect(json.Unmarshal(resolveAnswer, &resolveJson)).To(Succeed()) Expect(resolveJson).To(HaveLen(2)) Expect(resolveJson).To(Equal( - map[string]interface{}{ + map[string]any{ "registry.example.com/eggs:9.8": "registry.example.com/eggs@sha256:2", "registry.example.com/maps/spam-operator:1.2": "registry.example.com/maps/spam-operator@sha256:1", })) @@ -284,7 +293,7 @@ exit 1 Expect(err).To(Succeed()) Expect(replaceAnswer).To(MatchUnorderedYAML(resolvedFile)) - validYaml := map[string]interface{}{} + validYaml := map[string]any{} Expect(yaml.Unmarshal(replaceAnswer, &validYaml)).To(Succeed()) }) }) diff --git a/internal/utils/error.go b/internal/utils/error.go index d266052..2e0e0e9 100644 --- a/internal/utils/error.go +++ b/internal/utils/error.go @@ -28,7 +28,7 @@ type errBase struct { err error } -func NewError(cause error, format string, args ...interface{}) error { +func NewError(cause error, format string, args ...any) error { return errBase{ err: fmt.Errorf(format, args...), cause: cause, diff --git a/internal/utils/lens.go b/internal/utils/lens.go index da84aa4..7b68bcb 100644 --- a/internal/utils/lens.go +++ b/internal/utils/lens.go @@ -7,19 +7,19 @@ import ( // lensBuilder is used to construct lens type lensBuilder struct { - funcs []func(interface{}) (interface{}, error) + funcs []func(any) (any, error) path []string } -// lens holds a series of functions that helps navigate a map[string]interface{} data structure +// lens holds a series of functions that helps navigate a map[string]any data structure type lens struct { - funcs []func(interface{}) (interface{}, error) + funcs []func(any) (any, error) } // newLens creates a new lens builder func Lens() *lensBuilder { return &lensBuilder{ - funcs: []func(interface{}) (interface{}, error){}, + funcs: []func(any) (any, error){}, path: []string{}, } } @@ -27,19 +27,18 @@ func Lens() *lensBuilder { // L will create a step on a lens to navigate a slice by integer func (d *lensBuilder) L(i int) *lensBuilder { d.path = append(d.path, strconv.Itoa(i)) - d.funcs = append(d.funcs, func(data interface{}) (interface{}, error) { - localI := i - slice, ok := data.([]interface{}) + d.funcs = append(d.funcs, func(data any) (any, error) { + slice, ok := data.([]any) if !ok { - return nil, NewError(ErrNotFound, "expected a []interface{} type on step %s path %s", strconv.Itoa(localI), strings.Join(d.path, ",")) + return nil, NewError(ErrNotFound, "expected a []any type on step %s path %s", strconv.Itoa(i), strings.Join(d.path, ",")) } if i < 0 || i >= len(slice) { - return nil, NewError(ErrNotFound, "not found on step %s path %s", strconv.Itoa(localI), strings.Join(d.path, ",")) + return nil, NewError(ErrNotFound, "not found on step %s path %s", strconv.Itoa(i), strings.Join(d.path, ",")) } - return slice[localI], nil + return slice[i], nil }) return d @@ -48,17 +47,16 @@ func (d *lensBuilder) L(i int) *lensBuilder { // M will create a step on a lens to navigate a map by a key func (d *lensBuilder) M(key string) *lensBuilder { d.path = append(d.path, key) - d.funcs = append(d.funcs, func(data interface{}) (interface{}, error) { - localKey := key - mmap, ok := data.(map[string]interface{}) + d.funcs = append(d.funcs, func(data any) (any, error) { + mmap, ok := data.(map[string]any) if !ok { - return nil, NewError(ErrNotFound, "expected a map[string]interface{} type on step %s path %s", localKey, strings.Join(d.path, ",")) + return nil, NewError(ErrNotFound, "expected a map[string]any type on step %s path %s", key, strings.Join(d.path, ",")) } v, ok := mmap[key] if !ok { - return nil, NewError(ErrNotFound, "not found on step %s path %s", localKey, strings.Join(d.path, ",")) + return nil, NewError(ErrNotFound, "not found on step %s path %s", key, strings.Join(d.path, ",")) } return v, nil @@ -70,20 +68,19 @@ func (d *lensBuilder) M(key string) *lensBuilder { // lens to each element. func (d *lensBuilder) Apply(l lens) *lensBuilder { d.path = append(d.path, "*") - d.funcs = append(d.funcs, func(data interface{}) (interface{}, error) { - localLens := l - slice, ok := data.([]interface{}) + d.funcs = append(d.funcs, func(data any) (any, error) { + slice, ok := data.([]any) if !ok { - return nil, NewError(ErrNotFound, "expected a []interface{} type on step * path %s", strings.Join(d.path, ",")) + return nil, NewError(ErrNotFound, "expected a []any type on step * path %s", strings.Join(d.path, ",")) } - results := make([]interface{}, 0, len(slice)) + results := make([]any, 0, len(slice)) for i := range slice { data := slice[i] - result, err := localLens.Lookup(data) + result, err := l.Lookup(data) if err != nil { continue @@ -101,12 +98,8 @@ func (d *lensBuilder) Apply(l lens) *lensBuilder { // Build finalizes the lens steps and makes it able to return results. func (d *lensBuilder) Build() lens { - funcs := make([]func(interface{}) (interface{}, error), 0, len(d.funcs)) - - for i := range d.funcs { - localFunc := d.funcs[i] - funcs = append(funcs, localFunc) - } + funcs := make([]func(any) (any, error), 0, len(d.funcs)) + funcs = append(funcs, d.funcs...) return lens{ funcs: funcs, @@ -114,7 +107,7 @@ func (d *lensBuilder) Build() lens { } // Lookup will run the lens against data, returning a result or error. -func (l lens) Lookup(data interface{}) (result interface{}, err error) { +func (l lens) Lookup(data any) (result any, err error) { result = data for _, fun := range l.funcs { result, err = fun(result) @@ -128,17 +121,17 @@ func (l lens) Lookup(data interface{}) (result interface{}, err error) { } // L is an alias for Lookup that will attempt to map the result of the lookup to a slice. -func (l lens) L(data interface{}) ([]interface{}, error) { +func (l lens) L(data any) ([]any, error) { answer, err := l.Lookup(data) if err != nil { return nil, err } - listAnswer, ok := answer.([]interface{}) + listAnswer, ok := answer.([]any) if !ok { - return nil, NewError(nil, "expected a []interface{} type") + return nil, NewError(nil, "expected a []any type") } return listAnswer, nil @@ -146,33 +139,33 @@ func (l lens) L(data interface{}) ([]interface{}, error) { // LFunc is an alias for Lookup that will attempt to map the result of the lookup to a slice and wrap // the results in a callback. -func (l lens) LFunc(data interface{}) func() ([]interface{}, error) { - return func() ([]interface{}, error) { +func (l lens) LFunc(data any) func() ([]any, error) { + return func() ([]any, error) { return l.L(data) } } -// M is an alias for Lookup that will attempt to map the result of the lookup to a map[string]interface{}. -func (l lens) M(data interface{}) (map[string]interface{}, error) { +// M is an alias for Lookup that will attempt to map the result of the lookup to a map[string]any. +func (l lens) M(data any) (map[string]any, error) { answer, err := l.Lookup(data) if err != nil { return nil, err } - mapAnswer, ok := answer.(map[string]interface{}) + mapAnswer, ok := answer.(map[string]any) if !ok { - return nil, NewError(nil, "expected a []interface{} type") + return nil, NewError(nil, "expected a map[string]any type but got a %T instead", answer) } return mapAnswer, nil } -// M is an alias for Lookup that will attempt to map the result of the lookup to a map[string]interface{} and wrap -// the resutls in a callback. -func (l lens) MFunc(data interface{}) func() (map[string]interface{}, error) { - return func() (map[string]interface{}, error) { +// M is an alias for Lookup that will attempt to map the result of the lookup to a map[string]any and wrap +// the results in a callback. +func (l lens) MFunc(data any) func() (map[string]any, error) { + return func() (map[string]any, error) { return l.M(data) } } diff --git a/internal/utils/lens_test.go b/internal/utils/lens_test.go index 6b555f3..77300ef 100644 --- a/internal/utils/lens_test.go +++ b/internal/utils/lens_test.go @@ -6,15 +6,15 @@ import ( ) var _ = Describe("lens", func() { - var data map[string]interface{} + var data map[string]any BeforeEach(func() { - data = map[string]interface{}{ + data = map[string]any{ "a": "b", - "c": []interface{}{ - map[string]interface{}{ + "c": []any{ + map[string]any{ "d": 1, }, - map[string]interface{}{ + map[string]any{ "d": 2, }, }, @@ -63,7 +63,7 @@ var _ = Describe("lens", func() { myLens := Lens().M("c").Apply(Lens().M("d").Build()).Build() answer, err := myLens.L(data) Expect(err).To(Succeed()) - Expect(answer).To(Equal([]interface{}{1, 2})) + Expect(answer).To(Equal([]any{1, 2})) myLens = Lens().M("c").Apply(Lens().M("nothere").Build()).Build() answer, err = myLens.L(data) diff --git a/internal/utils/vars_test.go b/internal/utils/vars_test.go index 288cd34..8cb49e1 100644 --- a/internal/utils/vars_test.go +++ b/internal/utils/vars_test.go @@ -3,7 +3,6 @@ package utils import ( "bytes" "io" - "io/ioutil" "os" "path/filepath" @@ -31,11 +30,13 @@ var _ = Describe("Vars", func() { }) It("should and open a file if a valid filepath", func() { - f, err := ioutil.TempFile(os.TempDir(), "file-*.txt") + f, err := os.CreateTemp(os.TempDir(), "file-*.txt") Expect(err).To(Succeed()) defer os.Remove(f.Name()) + defer f.Close() - ioutil.WriteFile(f.Name(), []byte("foo"), 0666) + err = os.WriteFile(f.Name(), []byte("foo"), 0666) + Expect(err).To(Succeed()) sut.Name = f.Name() diff --git a/pkg/imageresolver/script_test.go b/pkg/imageresolver/script_test.go index 735b4e2..2d8f805 100644 --- a/pkg/imageresolver/script_test.go +++ b/pkg/imageresolver/script_test.go @@ -1,7 +1,7 @@ package imageresolver import ( - "io/ioutil" + "os" "path/filepath" . "github.com/onsi/ginkgo" @@ -14,17 +14,17 @@ var _ = Describe("script image resolver", func() { var badScript string BeforeEach(func() { - dir, err := ioutil.TempDir("", "script") + dir, err := os.MkdirTemp("", "script") Expect(err).To(Succeed()) goodScript = filepath.Join(dir, "good.sh") badScript = filepath.Join(dir, "bad.sh") - Expect(ioutil.WriteFile(goodScript, []byte(`#!/bin/bash + Expect(os.WriteFile(goodScript, []byte(`#!/bin/bash echo -n "foo" exit 0 `), 0700)).To(Succeed()) - Expect(ioutil.WriteFile(badScript, []byte(`#!/bin/bash + Expect(os.WriteFile(badScript, []byte(`#!/bin/bash exit 1 `), 0700)).To(Succeed()) }) diff --git a/pkg/imageresolver/skopeo.go b/pkg/imageresolver/skopeo.go index 9c09643..bb82c1e 100644 --- a/pkg/imageresolver/skopeo.go +++ b/pkg/imageresolver/skopeo.go @@ -44,7 +44,7 @@ const ( timeout = "300s" ) -func (skopeo *Skopeo) getSkopeoResults(args ...string) ([]byte, map[string]interface{}, error) { +func (skopeo *Skopeo) getSkopeoResults(args ...string) ([]byte, map[string]any, error) { baseArgs := []string{"--command-timeout", timeout, "inspect"} name := "skopeo" if skopeo.path != "" { @@ -57,7 +57,7 @@ func (skopeo *Skopeo) getSkopeoResults(args ...string) ([]byte, map[string]inter return nil, nil, err } - var skopeoJSON map[string]interface{} + var skopeoJSON map[string]any err = json.Unmarshal(skopeoRaw, &skopeoJSON) if err != nil { @@ -85,9 +85,9 @@ func (skopeo *Skopeo) ResolveImageReference(imageReference string) (string, erro retryAttempts := 3 var skopeoRaw []byte - var skopeoJSON map[string]interface{} + var skopeoJSON map[string]any - for i := 0; i < retryAttempts; i++ { + for range retryAttempts { rawArgs := append(args, "--raw") log.Println("skopeo inspect raw args are ", rawArgs) skopeoRaw, skopeoJSON, err = skopeo.getSkopeoResults(rawArgs...) diff --git a/pkg/pullspec/heuristic.go b/pkg/pullspec/heuristic.go index bb9267b..5c3e18b 100644 --- a/pkg/pullspec/heuristic.go +++ b/pkg/pullspec/heuristic.go @@ -60,13 +60,13 @@ var ( full = regexp.MustCompile(mustExecute(templates, `^{{ template "pullspec" . }}$`, "alnum", alnum, "name", name, "base16", base16)) ) -// mustExecute executes a template, panicing on error -func mustExecute(templates *template.Template, templ string, data ...interface{}) string { +// mustExecute executes a template, panicking on error +func mustExecute(templates *template.Template, templ string, data ...any) string { if len(data)%2 != 0 { panic("data length must be 2") } - templateData := map[string]interface{}{} + templateData := map[string]any{} for i := 0; i < len(data); i = i + 2 { key := data[i].(string) @@ -98,16 +98,22 @@ type Heuristic func(text string) [][]int // DefaultHeuristic attempts to find all pullspecs in arbitrary structured/unstructured text. // Returns a list of (start, end) tuples such that: -// text[start:end] == for all (start, end) +// +// text[start:end] == for all (start, end) +// // The basic idea: // - Find continuous sequences of characters that might appear in a pullspec // - That being + "/-._@:" +// // - For each such sequence: // - Strip non-alphanumeric characters from both ends // - Match remainder against the pullspec regex +// // Put simply, this heuristic should find anything in the form: -// registry/namespace*/repo:tag -// registry/namespace*/repo@sha256:digest +// +// registry/namespace*/repo:tag +// registry/namespace*/repo@sha256:digest +// // Where registry must contain at least one '.' and all parts follow various // restrictions on the format (most typical pullspecs should be caught). Any // number of namespaces, including 0, is valid. diff --git a/pkg/pullspec/pullspec.go b/pkg/pullspec/pullspec.go index 336b317..c654b3e 100644 --- a/pkg/pullspec/pullspec.go +++ b/pkg/pullspec/pullspec.go @@ -8,6 +8,7 @@ import ( "log" "os" "path/filepath" + "slices" "strings" "io/fs" @@ -25,14 +26,14 @@ type NamedPullSpec interface { fmt.Stringer Name() string Image() string - Data() map[string]interface{} + Data() map[string]any SetImage(string) - AsYamlObject() map[string]interface{} + AsYamlObject() map[string]any } type namedPullSpec struct { imageKey string - data map[string]interface{} + data map[string]any } // Name returns the name of the pull spec data. @@ -46,7 +47,7 @@ func (named *namedPullSpec) Image() string { } // Data returns the namedPullSpec as a json map -func (named *namedPullSpec) Data() map[string]interface{} { +func (named *namedPullSpec) Data() map[string]any { return named.data } @@ -56,8 +57,8 @@ func (named *namedPullSpec) SetImage(image string) { } // AsYamlObject returns the pull spec as an object -func (named *namedPullSpec) AsYamlObject() map[string]interface{} { - return map[string]interface{}{ +func (named *namedPullSpec) AsYamlObject() map[string]any { + return map[string]any{ "name": named.Name(), "image": named.Image(), } @@ -74,11 +75,11 @@ func (container *Container) String() string { } // NewContainer returns a container pullspec -func NewContainer(data interface{}) (*Container, error) { - dataMap, ok := data.(map[string]interface{}) +func NewContainer(data any) (*Container, error) { + dataMap, ok := data.(map[string]any) if !ok { - return nil, errors.New("expected map[string]interface{} type") + return nil, errors.New("expected map[string]any type") } if _, ok := dataMap["image"]; !ok { @@ -105,11 +106,11 @@ func (container *InitContainer) String() string { } // NewInitContainer returns a new init container pullspec. -func NewInitContainer(data interface{}) (*InitContainer, error) { - dataMap, ok := data.(map[string]interface{}) +func NewInitContainer(data any) (*InitContainer, error) { + dataMap, ok := data.(map[string]any) if !ok { - return nil, errors.New("expected map[string]interface{} type") + return nil, errors.New("expected map[string]any type") } if _, ok := dataMap["image"]; !ok { @@ -135,11 +136,11 @@ func (relatedImage *RelatedImage) String() string { } // NewRelatedImage returns a new related image pullspec. -func NewRelatedImage(data interface{}) (*RelatedImage, error) { - dataMap, ok := data.(map[string]interface{}) +func NewRelatedImage(data any) (*RelatedImage, error) { + dataMap, ok := data.(map[string]any) if !ok { - return nil, errors.New("expected map[string]interface{} type") + return nil, errors.New("expected map[string]any type") } return &RelatedImage{ @@ -167,16 +168,16 @@ func (relatedImageEnv *RelatedImageEnv) Name() string { return strings.TrimSpace(strings.ToLower(text[len("RELATED_IMAGE_"):])) } -// AsYamlObject returns the pullspec as a map[string]interface{}. -func (relatedImageEnv *RelatedImageEnv) AsYamlObject() map[string]interface{} { - return map[string]interface{}{ +// AsYamlObject returns the pullspec as a map[string]any. +func (relatedImageEnv *RelatedImageEnv) AsYamlObject() map[string]any { + return map[string]any{ "name": relatedImageEnv.Name(), "image": relatedImageEnv.Image(), } } -// NewRelatedImageEnv returns a new related iamge env pullspec. -func NewRelatedImageEnv(data map[string]interface{}) *RelatedImageEnv { +// NewRelatedImageEnv returns a new related image env pullspec. +func NewRelatedImageEnv(data map[string]any) *RelatedImageEnv { return &RelatedImageEnv{ namedPullSpec: namedPullSpec{ imageKey: "value", @@ -193,7 +194,7 @@ type Annotation struct { } // NewAnnotation returns a new annotation pullspec. -func NewAnnotation(data map[string]interface{}, key string, startI, endI int) *Annotation { +func NewAnnotation(data map[string]any, key string, startI, endI int) *Annotation { return &Annotation{ namedPullSpec: namedPullSpec{ imageKey: key, @@ -234,9 +235,9 @@ func (annotation *Annotation) Name() string { return fmt.Sprintf("%s-%s-annotation", image.Repo, tag) } -// AsYamlObject returns the annotation pullspec as a map[string]interface{}. -func (annotation *Annotation) AsYamlObject() map[string]interface{} { - return map[string]interface{}{ +// AsYamlObject returns the annotation pullspec as a map[string]any. +func (annotation *Annotation) AsYamlObject() map[string]any { + return map[string]any{ "name": annotation.Name(), "image": annotation.Image(), } @@ -427,7 +428,7 @@ func (csv *OperatorCSV) HasRelatedImageEnvs() bool { // GetPullSpecs will return a list of all the images found in via pullspecs. func (csv *OperatorCSV) GetPullSpecs() ([]*imagename.ImageName, error) { - pullspecs := make(map[imagename.ImageName]interface{}) + pullspecs := make(map[imagename.ImageName]any) namedList, err := csv.namedPullSpecs() @@ -445,8 +446,7 @@ func (csv *OperatorCSV) GetPullSpecs() ([]*imagename.ImageName, error) { imageList := make([]*imagename.ImageName, 0, len(pullspecs)) for key := range pullspecs { - localKey := key - imageList = append(imageList, &localKey) + imageList = append(imageList, &key) } return imageList, nil @@ -549,7 +549,7 @@ func (csv *OperatorCSV) SetRelatedImages() error { return fmt.Errorf("%s - Found conflicts when setting relatedImages:\n%s", csv.path, strings.Join(conflicts, "\n")) } - relatedImages := []map[string]interface{}{} + relatedImages := []map[string]any{} for _, p := range byName { log.Printf("%s - Set relateImage %s (from %s): %s\n", csv.path, p.Name(), p.String(), p.Image()) @@ -558,18 +558,18 @@ func (csv *OperatorCSV) SetRelatedImages() error { spec, ok := csv.data.Object["spec"] if !ok { - spec = map[string]interface{}{ + spec = map[string]any{ "relatedImages": relatedImages, } csv.data.Object["spec"] = spec } else { - spec.(map[string]interface{})["relatedImages"] = relatedImages + spec.(map[string]any)["relatedImages"] = relatedImages } return nil } -var knownAnnotationKeys = stringSlice{"containerImage"} +var knownAnnotationKeys = []string{"containerImage"} func (csv *OperatorCSV) namedPullSpecs() ([]NamedPullSpec, error) { pullspecs := []NamedPullSpec{} @@ -656,7 +656,7 @@ func (csv *OperatorCSV) relatedImageEnvPullspecs() ([][]int, error) { var deploymentLens = utils.Lens().M("spec").M("install").M("spec").M("deployments").Build() -func (csv *OperatorCSV) deployments() ([]interface{}, error) { +func (csv *OperatorCSV) deployments() ([]any, error) { return deploymentLens.L(csv.data.Object) } @@ -760,13 +760,13 @@ func (csv *OperatorCSV) relatedImageEnvPullSpecs() ([]NamedPullSpec, error) { continue } - envMaps, ok := env.([]interface{}) + envMaps, ok := env.([]any) if !ok { return nil, errors.New("expected type slice") } for j := range envMaps { - envMap, ok := envMaps[j].(map[string]interface{}) + envMap, ok := envMaps[j].(map[string]any) if !ok { return nil, errors.New("expected type map") @@ -789,7 +789,7 @@ func (csv *OperatorCSV) relatedImageEnvPullSpecs() ([]NamedPullSpec, error) { return relatedImageEnvs, nil } -func (csv *OperatorCSV) annotationPullSpecs(keyFilter stringSlice) ([]NamedPullSpec, error) { +func (csv *OperatorCSV) annotationPullSpecs(keyFilter []string) ([]NamedPullSpec, error) { pullSpecs := []NamedPullSpec{} annotationObjects, err := csv.findAllAnnotations() @@ -804,7 +804,7 @@ func (csv *OperatorCSV) annotationPullSpecs(keyFilter stringSlice) ([]NamedPullS key := rKey val := obj[key] - if keyFilter != nil && !keyFilter.Contains(key) { + if keyFilter != nil && !slices.Contains(keyFilter, key) { continue } @@ -818,7 +818,8 @@ func (csv *OperatorCSV) annotationPullSpecs(keyFilter stringSlice) ([]NamedPullS } } - return namedPullSpecSlice(pullSpecs).Reverse(), nil + slices.Reverse(pullSpecs) + return pullSpecs, nil } var ( @@ -830,21 +831,21 @@ var ( Build() ) -func (csv *OperatorCSV) findAllAnnotations() ([]map[string]interface{}, error) { - findAnnotationMaps := []func() (map[string]interface{}, error){ +func (csv *OperatorCSV) findAllAnnotations() ([]map[string]any, error) { + findAnnotationMaps := []func() (map[string]any, error){ csvAnnotations.MFunc(csv.data.Object), } - findAnnotationSlices := []func() ([]interface{}, error){ + findAnnotationSlices := []func() ([]any, error){ deploymentsAnnotations.LFunc(csv.data.Object), - func() ([]interface{}, error) { - results := []interface{}{} + func() ([]any, error) { + results := []any{} err := csv.findRandomCSVAnnotations(csv.data.Object, &results, false) return results, err }, } - annotations := []map[string]interface{}{} + annotations := []map[string]any{} for _, findAnnotation := range findAnnotationMaps { result, err := findAnnotation() @@ -870,7 +871,7 @@ func (csv *OperatorCSV) findAllAnnotations() ([]map[string]interface{}, error) { } for _, result := range results { - annotationResult := result.(map[string]interface{}) + annotationResult := result.(map[string]any) annotations = append(annotations, annotationResult) } } @@ -880,7 +881,7 @@ func (csv *OperatorCSV) findAllAnnotations() ([]map[string]interface{}, error) { var annotations = utils.Lens().M("metadata").M("annotations").Build() -func (csv *OperatorCSV) findRandomCSVAnnotations(root map[string]interface{}, results *[]interface{}, underMetadata bool) error { +func (csv *OperatorCSV) findRandomCSVAnnotations(root map[string]any, results *[]any, underMetadata bool) error { annos, err := annotations.M(root) if err != nil && !errors.Is(err, utils.ErrNotFound) { @@ -902,10 +903,10 @@ func (csv *OperatorCSV) findRandomCSVAnnotations(root map[string]interface{}, re isUnderMetadata = true } - if slicev, ok := root[key].([]interface{}); ok { + if slicev, ok := root[key].([]any); ok { for i := range slicev { - if datav, ok := slicev[i].(map[string]interface{}); ok { + if datav, ok := slicev[i].(map[string]any); ok { err := csv.findRandomCSVAnnotations(datav, results, isUnderMetadata) if err != nil { @@ -915,7 +916,7 @@ func (csv *OperatorCSV) findRandomCSVAnnotations(root map[string]interface{}, re } } - if datav, ok := root[key].(map[string]interface{}); ok { + if datav, ok := root[key].(map[string]any); ok { err := csv.findRandomCSVAnnotations(datav, results, isUnderMetadata) if err != nil { @@ -927,7 +928,7 @@ func (csv *OperatorCSV) findRandomCSVAnnotations(root map[string]interface{}, re return nil } -func (csv *OperatorCSV) findPotentialPullSpecsNotInAnnotations(root map[string]interface{}, specs *[]NamedPullSpec) error { +func (csv *OperatorCSV) findPotentialPullSpecsNotInAnnotations(root map[string]any, specs *[]NamedPullSpec) error { for rKey := range root { key := rKey val := root[key] @@ -946,10 +947,10 @@ func (csv *OperatorCSV) findPotentialPullSpecsNotInAnnotations(root map[string]i continue } - if slicev, ok := root[key].([]interface{}); ok { + if slicev, ok := root[key].([]any); ok { for i := range slicev { - if datav, ok := slicev[i].(map[string]interface{}); ok { + if datav, ok := slicev[i].(map[string]any); ok { err := csv.findPotentialPullSpecsNotInAnnotations(datav, specs) if err != nil { @@ -959,7 +960,7 @@ func (csv *OperatorCSV) findPotentialPullSpecsNotInAnnotations(root map[string]i } } - if datav, ok := root[key].(map[string]interface{}); ok { + if datav, ok := root[key].(map[string]any); ok { err := csv.findPotentialPullSpecsNotInAnnotations(datav, specs) if err != nil { @@ -971,27 +972,6 @@ func (csv *OperatorCSV) findPotentialPullSpecsNotInAnnotations(root map[string]i return nil } -type stringSlice []string - -func (l stringSlice) Contains(in string) bool { - for _, key := range l { - if key == in { - return true - } - } - return false -} - -type namedPullSpecSlice []NamedPullSpec - -func (n namedPullSpecSlice) Reverse() namedPullSpecSlice { - for i := 0; i < len(n)/2; i++ { - j := len(n) - i - 1 - n[i], n[j] = n[j], n[i] - } - return n -} - func closeFile(f *os.File) { err := f.Close() if err != nil {