package owners import ( "context" "flag" "fmt" "github.com/peterbourgon/ff/v3/ffcli" dsdssandboxes "edge-infra.dev/pkg/sds/lib/ci/dsds-sandboxes" ) type OwnerFlagConfig struct { ProjectsFilePath string ProjectName string } func NewCmd() *ffcli.Command { ownerFlagSet := flag.NewFlagSet("owners", flag.ExitOnError) ownerFlagConfig := &OwnerFlagConfig{} bindOwnerFlags(ownerFlagSet, ownerFlagConfig) return &ffcli.Command{ Name: "owners", ShortUsage: "billingcli owners", ShortHelp: "List owners for each project", Exec: func(_ context.Context, _ []string) error { return ownersCmd(ownerFlagConfig) }, FlagSet: ownerFlagSet, } } func bindOwnerFlags(flags *flag.FlagSet, config *OwnerFlagConfig) { flags.StringVar( &config.ProjectsFilePath, "project-dir", dsdssandboxes.DefaultPlaypitDir, "Location of the CI project YAML within edge-infra", ) flags.StringVar( &config.ProjectName, "project", "", "Optionally restrict finding owners to a single project", ) } func ownersCmd(config *OwnerFlagConfig) error { confs, err := dsdssandboxes.GetBillingConfs(config.ProjectsFilePath) if err != nil { return err } confs = filterConfsByProjectName(config.ProjectName, confs) for project, conf := range confs { report, err := ownersReport(conf) if err != nil { return err } printOwners(project, report) } return nil } func filterConfsByProjectName(name string, confs map[string]*dsdssandboxes.BillingConf) map[string]*dsdssandboxes.BillingConf { if name == "" { return confs } val, ok := confs[name] if ok { return map[string]*dsdssandboxes.BillingConf{name: val} } return map[string]*dsdssandboxes.BillingConf{} } func ownersReport(conf *dsdssandboxes.BillingConf) ([]string, error) { client, err := dsdssandboxes.NewIamPolicyClient() if err != nil { return nil, err } return client.GetProjectOwners(conf.Metadata.Name) } func printOwners(project string, members []string) { fmt.Printf("--%v--\n", project) for _, member := range members { fmt.Println(member) } fmt.Print("\n") }