Skip to content

Commit

Permalink
Generate db specific list for kubedb (#10)
Browse files Browse the repository at this point in the history
Signed-off-by: Tamal Saha <[email protected]>
  • Loading branch information
tamalsaha authored Sep 29, 2024
1 parent 48d7afc commit 65fd6c5
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 26 deletions.
41 changes: 34 additions & 7 deletions pkg/cmds/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,14 @@ package cmds
import (
"os"
"path/filepath"
"sort"
"strings"

"kmodules.xyz/image-packer/pkg/lib"

"github.com/spf13/cobra"
"gopkg.in/yaml.v2"
"k8s.io/apimachinery/pkg/runtime/schema"
)

func NewCmdListImages() *cobra.Command {
Expand All @@ -37,19 +40,31 @@ func NewCmdListImages() *cobra.Command {
DisableFlagsInUseLine: true,
DisableAutoGenTag: true,
RunE: func(cmd *cobra.Command, args []string) error {
images, err := lib.ListImages(rootDir)
imgmap, err := lib.MapImages(rootDir)
if err != nil {
return err
}

data, err := yaml.Marshal(images)
if err != nil {
return err
if lib.HasGroupKind(imgmap, schema.GroupKind{Group: "catalog.kubedb.com"}) {
var rest []string
for key, list := range lib.GroupImages(imgmap) {
gk := schema.ParseGroupKind(key)
if gk.Group == "catalog.kubedb.com" {
sort.Strings(list)
err := write(list, filepath.Join(outDir, strings.ToLower(gk.Kind)+"s.yaml"))
if err != nil {
return err
}
} else {
rest = append(rest, list...)
}
}

sort.Strings(rest)
return write(rest, filepath.Join(outDir, "imagelist.yaml"))
}

filename := filepath.Join(outDir, "imagelist.yaml")
err = os.WriteFile(filename, data, 0o644)
return err
return write(lib.ListImages(imgmap), filepath.Join(outDir, "imagelist.yaml"))
},
}

Expand All @@ -60,3 +75,15 @@ func NewCmdListImages() *cobra.Command {

return cmd
}

func write(images []string, filename string) error {
sort.Strings(images)

data, err := yaml.Marshal(images)
if err != nil {
return err
}

err = os.WriteFile(filename, data, 0o644)
return err
}
70 changes: 51 additions & 19 deletions pkg/lib/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,19 @@ import (
"kmodules.xyz/client-go/tools/parser"

shell "gomodules.xyz/go-sh"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/klog/v2"
)

func ListImages(rootDir string) ([]string, error) {
func ListDockerImages(rootDir string) ([]string, error) {
images, err := MapImages(rootDir)
if err != nil {
return nil, err
}
return ListImages(images), nil
}

func MapImages(rootDir string) (map[string]string, error) {
entries, err := os.ReadDir(rootDir)
if err != nil {
return nil, err
Expand All @@ -39,7 +47,7 @@ func ListImages(rootDir string) ([]string, error) {
sh.SetDir(rootDir)
sh.ShowCMD = true

images := sets.New[string]()
images := map[string]string{}
for _, entry := range entries {
if !entry.IsDir() {
continue
Expand Down Expand Up @@ -67,39 +75,63 @@ func ListImages(rootDir string) ([]string, error) {
}

for _, ri := range helmout {
collectImages(ri.Object.UnstructuredContent(), images)
collectImages(ri.Object.UnstructuredContent(), images, ri.Object.GetObjectKind().GroupVersionKind().GroupKind().String())
}
} else {
klog.Infof("Skipping %s due to error: %v", entry.Name(), err)
}
}

result := make([]string, 0, images.Len())
for _, img := range images.UnsortedList() {
if strings.Contains(img, "${") {
continue
}
result = append(result, img)
}
sort.Strings(result)

return result, nil
return images, nil
}

func collectImages(obj map[string]any, images sets.Set[string]) {
func collectImages(obj map[string]any, images map[string]string, srcGK string) {
for k, v := range obj {
if k == "image" {
if s, ok := v.(string); ok {
images.Insert(s)
images[s] = srcGK
}
} else if m, ok := v.(map[string]any); ok {
collectImages(m, images)
collectImages(m, images, srcGK)
} else if items, ok := v.([]any); ok {
for _, item := range items {
if m, ok := item.(map[string]any); ok {
collectImages(m, images)
collectImages(m, images, srcGK)
}
}
}
}
}

func GroupImages(images map[string]string) map[string][]string {
result := map[string][]string{}
for img, srcGK := range images {
if strings.Contains(img, "${") {
continue
}
result[srcGK] = append(result[srcGK], img)
}
return result
}

func ListImages(images map[string]string) []string {
result := make([]string, 0, len(images))
for img := range images {
if strings.Contains(img, "${") {
continue
}
result = append(result, img)
}
sort.Strings(result)

return result
}

func HasGroupKind(images map[string]string, in schema.GroupKind) bool {
for _, srcGK := range images {
gk := schema.ParseGroupKind(srcGK)
if gk.Group == in.Group && (in.Kind == "" || gk.Kind == in.Kind) {
return true
}
}
return false
}

0 comments on commit 65fd6c5

Please sign in to comment.