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

Commit 8258ed2

Browse files
author
Faris Huskovic
committed
dynamically require org flag based on whether or not user is multi org member
1 parent 4aae69c commit 8258ed2

File tree

2 files changed

+61
-17
lines changed

2 files changed

+61
-17
lines changed

internal/cmd/ceapi.go

+36-16
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ func findEnv(ctx context.Context, client *coder.Client, envName, userEmail strin
8383
)
8484
}
8585

86-
func findImg(ctx context.Context, client *coder.Client, email, imgName string) (*coder.Image, error) {
87-
userImgs, err := lookupUserImgs(ctx, client, email, imgName)
86+
func findImg(ctx context.Context, client *coder.Client, email, imgName, orgName string) (*coder.Image, error) {
87+
userImgs, err := lookupUserImgs(ctx, client, email, imgName, orgName)
8888
if err != nil {
8989
return nil, err
9090
}
@@ -111,8 +111,8 @@ func findImg(ctx context.Context, client *coder.Client, email, imgName string) (
111111
return &userImgs[0], nil
112112
}
113113

114-
func getImgs(ctx context.Context, client *coder.Client, userEmail string) ([]coder.Image, error) {
115-
u, err := client.UserByEmail(ctx, userEmail)
114+
func getImgs(ctx context.Context, client *coder.Client, email, orgName string) ([]coder.Image, error) {
115+
u, err := client.UserByEmail(ctx, email)
116116
if err != nil {
117117
return nil, err
118118
}
@@ -123,32 +123,29 @@ func getImgs(ctx context.Context, client *coder.Client, userEmail string) ([]cod
123123
}
124124

125125
orgs = lookupUserOrgs(u, orgs)
126-
var importedImgs []coder.Image
127126

128-
// Get all of the imported images for all of the orgs the user belongs to.
129127
for _, org := range orgs {
130-
imgs, err := client.GetOrganizationImages(ctx, org.ID)
131-
if err != nil {
132-
return nil, err
128+
if orgName == org.Name {
129+
imgs, err := client.GetOrganizationImages(ctx, org.ID)
130+
if err != nil {
131+
return nil, err
132+
}
133+
return imgs, nil
133134
}
134-
importedImgs = append(importedImgs, imgs...)
135135
}
136-
return importedImgs, nil
136+
return nil, xerrors.Errorf("org name %q not found", orgName)
137137
}
138138

139139
// returns all images that contain imgName as a substring and have been imported by the user.
140-
func lookupUserImgs(ctx context.Context, client *coder.Client, email, imgName string) ([]coder.Image, error) {
140+
func lookupUserImgs(ctx context.Context, client *coder.Client, email, imgName, orgName string) ([]coder.Image, error) {
141141
switch {
142-
case client == nil:
143-
return nil, xerrors.New("nil client")
144142
case email == "":
145143
return nil, xerrors.New("user email unset")
146144
case imgName == "":
147145
return nil, xerrors.New("image name unset")
148146
}
149147

150-
// Get all imported images for each org the user belongs to.
151-
imgs, err := getImgs(ctx, client, email)
148+
imgs, err := getImgs(ctx, client, email, orgName)
152149
if err != nil {
153150
return nil, err
154151
}
@@ -172,3 +169,26 @@ func lookupUserImgs(ctx context.Context, client *coder.Client, email, imgName st
172169
}
173170
return userImgs, nil
174171
}
172+
173+
func isMultiOrgMember(email string) (*bool, error) {
174+
ctx, cancel := context.WithCancel(context.Background())
175+
defer cancel()
176+
177+
client, err := newClient()
178+
if err != nil {
179+
return nil, err
180+
}
181+
182+
u, err := client.UserByEmail(ctx, email)
183+
if err != nil {
184+
return nil, xerrors.New("email not found")
185+
}
186+
187+
orgs, err := client.Organizations(ctx)
188+
if err != nil {
189+
return nil, err
190+
}
191+
192+
isMulti := len(lookupUserOrgs(u, orgs)) > 1
193+
return &isMulti, nil
194+
}

internal/cmd/envs.go

+25-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ coder envs create --cpu 4 --disk 100 --memory 8 --image 5f443b16-30652892427b955
174174
return err
175175
}
176176

177-
importedImg, err := findImg(cmd.Context(), client, *user, img)
177+
importedImg, err := findImg(cmd.Context(), client, *user, img, org)
178178
if err != nil {
179179
return err
180180
}
@@ -233,11 +233,22 @@ coder envs create --cpu 4 --disk 100 --memory 8 --image 5f443b16-30652892427b955
233233
cmd.Flags().StringVarP(&img, "image", "i", "", "name of the image to base the environment off of.")
234234
cmd.Flags().BoolVar(&follow, "follow", false, "follow buildlog after initiating rebuild")
235235
_ = cmd.MarkFlagRequired("image")
236+
237+
multiOrgMember, err := isMultiOrgMember(*user)
238+
if err != nil {
239+
clog.Fatal(fmt.Sprintf("checking if user is mutli-org member: %s", err.Error()))
240+
}
241+
242+
// if the user belongs to multiple organizations we need them to specify which one.
243+
if *multiOrgMember {
244+
_ = cmd.MarkFlagRequired("org")
245+
}
236246
return cmd
237247
}
238248

239249
func editEnvCommand(user *string) *cobra.Command {
240250
var (
251+
org string
241252
img string
242253
tag string
243254
cpuCores float32
@@ -301,13 +312,26 @@ coder envs edit back-end-env --disk 20`,
301312
return nil
302313
},
303314
}
315+
cmd.Flags().StringVarP(&org, "org", "o", defaultOrg, "name of the organization the environment should be created under.")
304316
cmd.Flags().StringVarP(&img, "image", "i", "", "name of the image you wan't the environment to be based off of.")
305317
cmd.Flags().StringVarP(&tag, "tag", "t", "latest", "image tag of the image you wan't to base the environment off of.")
306318
cmd.Flags().Float32P("cpu", "c", cpuCores, "The number of cpu cores the environment should be provisioned with.")
307319
cmd.Flags().Float32P("memory", "m", memGB, "The amount of RAM an environment should be provisioned with.")
308320
cmd.Flags().IntP("disk", "d", diskGB, "The amount of disk storage an environment should be provisioned with.")
309321
cmd.Flags().IntP("gpu", "g", gpus, "The amount of disk storage to provision the environment with.")
310322
cmd.Flags().BoolVar(&follow, "follow", false, "follow buildlog after initiating rebuild")
323+
// if the image is being changed we need to know whether or not we should require the org flag.
324+
if img != "" {
325+
multiOrgMember, err := isMultiOrgMember(*user)
326+
if err != nil {
327+
clog.Fatal(fmt.Sprintf("checking if user is mutli-org member: %s", err.Error()))
328+
}
329+
330+
// if the user belongs to multiple organizations we need them to specify which one.
331+
if *multiOrgMember {
332+
_ = cmd.MarkFlagRequired("org")
333+
}
334+
}
311335
return cmd
312336
}
313337

0 commit comments

Comments
 (0)