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

Commit 779e939

Browse files
authored
refactor go routine for project region output (#1506)
Signed-off-by: Joshua Silverio <[email protected]>
1 parent 3f53a0c commit 779e939

File tree

2 files changed

+51
-37
lines changed

2 files changed

+51
-37
lines changed

pkg/cli/project.go

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,26 +84,31 @@ func (a *Project) Run(cmd *cobra.Command, args []string) error {
8484
}
8585

8686
out := table.NewWriter(tables.ProjectClient, a.Quiet, a.Output)
87-
projectDetails, err := project.GetDetails(cmd.Context(), a.client.Options(), projectNames)
88-
if err != nil {
89-
return err
90-
}
87+
projectDetails := project.GetDetails(cmd.Context(), a.client.Options(), projectNames)
88+
9189
sort.Slice(projectDetails, func(i, j int) bool {
9290
return projectDetails[i].FullName < projectDetails[j].FullName
9391
})
92+
9493
for _, projectItem := range projectDetails {
95-
supportedRegions := projectItem.Project.GetSupportedRegions()
96-
defaultRegion := projectItem.Project.GetRegion()
97-
for i, supportedRegion := range supportedRegions {
98-
if supportedRegion == defaultRegion {
99-
supportedRegions[i] = supportedRegion + "*"
94+
if projectItem.Err != nil {
95+
logrus.Warnf("Could not list details of project [%s]: %v", projectItem.FullName, projectItem.Err)
96+
continue
97+
}
98+
if projectItem.Project != nil {
99+
supportedRegions := projectItem.Project.GetSupportedRegions()
100+
defaultRegion := projectItem.Project.GetRegion()
101+
for i, supportedRegion := range supportedRegions {
102+
if supportedRegion == defaultRegion {
103+
supportedRegions[i] = supportedRegion + "*"
104+
}
100105
}
106+
out.Write(projectEntry{
107+
Name: projectItem.FullName,
108+
Default: defaultProject == projectItem.FullName,
109+
Regions: supportedRegions,
110+
})
101111
}
102-
out.Write(projectEntry{
103-
Name: projectItem.FullName,
104-
Default: defaultProject == projectItem.FullName,
105-
Regions: supportedRegions,
106-
})
107112
}
108113

109114
return out.Err()

pkg/project/operations.go

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ type listResult struct {
117117
type DetailProject struct {
118118
FullName string
119119
Project *apiv1.Project
120+
Err error
120121
}
121122

122123
func listHubServers(ctx context.Context, wg *sync.WaitGroup, creds *credentials.Store, cfg *config.CLIConfig, result chan<- listResult) {
@@ -190,37 +191,45 @@ func List(ctx context.Context, opts Options) (projects []string, warnings map[st
190191
return projects, warnings, nil
191192
}
192193

193-
func GetDetails(ctx context.Context, opts Options, projectNames []string) (result []DetailProject, err error) {
194-
entryCh := make(chan DetailProject)
195-
errCh := make(chan error)
194+
func GetDetails(ctx context.Context, opts Options, projectNames []string) (projects []DetailProject) {
195+
var (
196+
wg sync.WaitGroup
197+
result = make(chan DetailProject)
198+
)
199+
200+
getProjectDetails(ctx, &wg, result, opts, projectNames)
201+
202+
go func() {
203+
wg.Wait()
204+
close(result)
205+
}()
206+
207+
for detailProject := range result {
208+
projects = append(projects, detailProject)
209+
}
196210

197-
// Launch a goroutine for each project to retrieve its information
211+
return projects
212+
}
213+
214+
func getProjectDetails(ctx context.Context, wg *sync.WaitGroup, result chan<- DetailProject, opts Options, projectNames []string) {
198215
for _, projectName := range projectNames {
199-
go func(proj string, opts Options) {
200-
opts.Project = proj
216+
wg.Add(1)
217+
go func(projectName string, opts Options) {
218+
defer wg.Done()
219+
// Launch a goroutine for each project to retrieve its information
220+
opts.Project = projectName
201221
c, err := Client(ctx, opts)
202222
if err != nil {
203-
errCh <- err
223+
logrus.Warnf("unable to get client for %s: %s", projectName, err)
224+
// just ignore invalid clients
225+
return
204226
}
205227
project, err := c.ProjectGet(ctx, lastPart(opts.Project))
206-
if err != nil {
207-
errCh <- err
208-
}
209-
entryCh <- DetailProject{
210-
FullName: proj,
228+
result <- DetailProject{
229+
FullName: projectName,
211230
Project: project,
231+
Err: err,
212232
}
213233
}(projectName, opts)
214234
}
215-
216-
for i := 0; i < len(projectNames); i++ {
217-
select {
218-
case entry := <-entryCh:
219-
result = append(result, entry)
220-
case err := <-errCh:
221-
return nil, err
222-
}
223-
}
224-
225-
return result, nil
226235
}

0 commit comments

Comments
 (0)