Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

feat: add image:tag label to resources top #300

Merged
merged 4 commits into from
Mar 23, 2021
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fixup! reorder img label and remove "vCPU"
  • Loading branch information
cmoog committed Mar 23, 2021
commit df81c13dda18a648b94ab13e98dea4eb2bf559e6
65 changes: 40 additions & 25 deletions internal/cmd/resourcemanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,20 @@ func runResourceTop(options *resourceTopOptions) func(cmd *cobra.Command, args [

var groups []groupable
var labeler envLabeler
data := entities{
providers: providers.Kubernetes,
users: users,
orgs: orgs,
envs: envs,
images: images,
}
switch options.group {
case "user":
groups, labeler = aggregateByUser(providers.Kubernetes, users, orgs, envs, images, *options)
groups, labeler = aggregateByUser(data, *options)
case "org":
groups, labeler = aggregateByOrg(providers.Kubernetes, users, orgs, envs, images, *options)
groups, labeler = aggregateByOrg(data, *options)
case "provider":
groups, labeler = aggregateByProvider(providers.Kubernetes, users, orgs, envs, images, *options)
groups, labeler = aggregateByProvider(data, *options)
default:
return xerrors.Errorf("unknown --group %q", options.group)
}
Expand All @@ -117,27 +124,35 @@ func runResourceTop(options *resourceTopOptions) func(cmd *cobra.Command, args [
}
}

func aggregateByUser(providers []coder.KubernetesProvider, users []coder.User, orgs []coder.Organization, envs []coder.Environment, images map[string]*coder.Image, options resourceTopOptions) ([]groupable, envLabeler) {
type entities struct {
providers []coder.KubernetesProvider
users []coder.User
orgs []coder.Organization
envs []coder.Environment
images map[string]*coder.Image
}

func aggregateByUser(data entities, options resourceTopOptions) ([]groupable, envLabeler) {
var groups []groupable
providerIDMap := providerIDs(providers)
providerIDMap := providerIDs(data.providers)
orgIDMap := make(map[string]coder.Organization)
for _, o := range orgs {
for _, o := range data.orgs {
orgIDMap[o.ID] = o
}
userEnvs := make(map[string][]coder.Environment, len(users))
for _, e := range envs {
userEnvs := make(map[string][]coder.Environment, len(data.users))
for _, e := range data.envs {
if options.org != "" && orgIDMap[e.OrganizationID].Name != options.org {
continue
}
userEnvs[e.UserID] = append(userEnvs[e.UserID], e)
}
for _, u := range users {
for _, u := range data.users {
if options.user != "" && u.Email != options.user {
continue
}
groups = append(groups, userGrouping{user: u, envs: userEnvs[u.ID]})
}
return groups, labelAll(imgLabeler(images), providerLabeler(providerIDMap), orgLabeler(orgIDMap))
return groups, labelAll(imgLabeler(data.images), providerLabeler(providerIDMap), orgLabeler(orgIDMap))
}

func userIDs(users []coder.User) map[string]coder.User {
Expand All @@ -148,24 +163,24 @@ func userIDs(users []coder.User) map[string]coder.User {
return userIDMap
}

func aggregateByOrg(providers []coder.KubernetesProvider, users []coder.User, orgs []coder.Organization, envs []coder.Environment, images map[string]*coder.Image, options resourceTopOptions) ([]groupable, envLabeler) {
func aggregateByOrg(data entities, options resourceTopOptions) ([]groupable, envLabeler) {
var groups []groupable
providerIDMap := providerIDs(providers)
orgEnvs := make(map[string][]coder.Environment, len(orgs))
userIDMap := userIDs(users)
for _, e := range envs {
providerIDMap := providerIDs(data.providers)
orgEnvs := make(map[string][]coder.Environment, len(data.orgs))
userIDMap := userIDs(data.users)
for _, e := range data.envs {
if options.user != "" && userIDMap[e.UserID].Email != options.user {
continue
}
orgEnvs[e.OrganizationID] = append(orgEnvs[e.OrganizationID], e)
}
for _, o := range orgs {
for _, o := range data.orgs {
if options.org != "" && o.Name != options.org {
continue
}
groups = append(groups, orgGrouping{org: o, envs: orgEnvs[o.ID]})
}
return groups, labelAll(imgLabeler(images), userLabeler(userIDMap), providerLabeler(providerIDMap))
return groups, labelAll(imgLabeler(data.images), userLabeler(userIDMap), providerLabeler(providerIDMap))
}

func providerIDs(providers []coder.KubernetesProvider) map[string]coder.KubernetesProvider {
Expand All @@ -176,24 +191,24 @@ func providerIDs(providers []coder.KubernetesProvider) map[string]coder.Kubernet
return providerIDMap
}

func aggregateByProvider(providers []coder.KubernetesProvider, users []coder.User, _ []coder.Organization, envs []coder.Environment, images map[string]*coder.Image, options resourceTopOptions) ([]groupable, envLabeler) {
func aggregateByProvider(data entities, options resourceTopOptions) ([]groupable, envLabeler) {
var groups []groupable
providerIDMap := providerIDs(providers)
userIDMap := userIDs(users)
providerEnvs := make(map[string][]coder.Environment, len(providers))
for _, e := range envs {
providerIDMap := providerIDs(data.providers)
userIDMap := userIDs(data.users)
providerEnvs := make(map[string][]coder.Environment, len(data.providers))
for _, e := range data.envs {
if options.provider != "" && providerIDMap[e.ResourcePoolID].Name != options.provider {
continue
}
providerEnvs[e.ResourcePoolID] = append(providerEnvs[e.ResourcePoolID], e)
}
for _, p := range providers {
for _, p := range data.providers {
if options.provider != "" && p.Name != options.provider {
continue
}
groups = append(groups, providerGrouping{provider: p, envs: providerEnvs[p.ID]})
}
return groups, labelAll(imgLabeler(images), userLabeler(userIDMap)) // TODO: consider adding an org label here
return groups, labelAll(imgLabeler(data.images), userLabeler(userIDMap)) // TODO: consider adding an org label here
}

// groupable specifies a structure capable of being an aggregation group of environments (user, org, all).
Expand Down Expand Up @@ -330,7 +345,7 @@ func resourcesFromEnv(env coder.Environment) resources {
}

func fmtEnvResources(env coder.Environment, labeler envLabeler) string {
return fmt.Sprintf("%s\t%s\t%s", env.Name, resourcesFromEnv(env), labeler.label(env))
return fmt.Sprintf("%s\t%s\t%s", truncate(env.Name, 20, "..."), resourcesFromEnv(env), labeler.label(env))
}

type envLabeler interface {
Expand Down