Skip to content

Commit b295d78

Browse files
authored
fix: add support for regions in interactive kafka create (#1438)
1 parent fc467cd commit b295d78

File tree

6 files changed

+59
-30
lines changed

6 files changed

+59
-30
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ require (
2424
github.com/pkg/errors v0.9.1
2525
github.com/redhat-developer/app-services-sdk-go/accountmgmt v0.1.0
2626
github.com/redhat-developer/app-services-sdk-go/kafkainstance v0.4.0
27-
github.com/redhat-developer/app-services-sdk-go/kafkamgmt v0.8.2
27+
github.com/redhat-developer/app-services-sdk-go/kafkamgmt v0.9.0
2828
github.com/redhat-developer/app-services-sdk-go/registryinstance v0.3.1
2929
github.com/redhat-developer/app-services-sdk-go/registrymgmt v0.6.1
3030
github.com/redhat-developer/service-binding-operator v0.9.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -703,8 +703,8 @@ github.com/redhat-developer/app-services-sdk-go/accountmgmt v0.1.0 h1:MOljVN8AKT
703703
github.com/redhat-developer/app-services-sdk-go/accountmgmt v0.1.0/go.mod h1:0LX7ZCEmMKAbncO05/zRYsV0K5wsds7AGPpOFC7KWGo=
704704
github.com/redhat-developer/app-services-sdk-go/kafkainstance v0.4.0 h1:eAtKA1umUzWMCtfgC28k59xTYS4uAoxIOiSlzdF8NhU=
705705
github.com/redhat-developer/app-services-sdk-go/kafkainstance v0.4.0/go.mod h1:6CxhBFDnXyrl5rWiLX2iBVs30o7Yhbt63SxGk4ZAnu0=
706-
github.com/redhat-developer/app-services-sdk-go/kafkamgmt v0.8.2 h1:kpLSSOqMTd+aAN9vIQ0B8tOwFeFAcvTWe1rmM+tW4BU=
707-
github.com/redhat-developer/app-services-sdk-go/kafkamgmt v0.8.2/go.mod h1:Bs/YQI9ZuZLzBoeBAWV6KmkO8Jwm8NcrUn3VFp8eleo=
706+
github.com/redhat-developer/app-services-sdk-go/kafkamgmt v0.9.0 h1:wb335WbgyhFZRIHOwqHJm+D877l50MPMacrONCmknnw=
707+
github.com/redhat-developer/app-services-sdk-go/kafkamgmt v0.9.0/go.mod h1:Bs/YQI9ZuZLzBoeBAWV6KmkO8Jwm8NcrUn3VFp8eleo=
708708
github.com/redhat-developer/app-services-sdk-go/registryinstance v0.3.1 h1:xRq5XJzRDs/Z7e/9SDt6zbNRIyesC4LTqN9ajHKwjHo=
709709
github.com/redhat-developer/app-services-sdk-go/registryinstance v0.3.1/go.mod h1:Z/gr/snlpsqYg4vftmcx97vCR3qMQJhALGelDHx4pMA=
710710
github.com/redhat-developer/app-services-sdk-go/registrymgmt v0.6.1 h1:3sUmQ3nAawsYWg7ZCO2Q8HF2J7MW6YA38h/YFL3ao6o=

pkg/cmd/kafka/create/create.go

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ func runCreate(opts *options) error {
173173
if opts.interactive {
174174
opts.Logger.Debug()
175175

176-
payload, err = promptKafkaPayload(opts)
176+
payload, err = promptKafkaPayload(opts, constants)
177177
if err != nil {
178178
return err
179179
}
@@ -188,19 +188,20 @@ func runCreate(opts *options) error {
188188
opts.region = defaultRegion
189189
}
190190

191+
if !opts.bypassAmsCheck {
192+
err = validateProviderAndRegion(opts, constants, conn)
193+
if err != nil {
194+
return err
195+
}
196+
}
197+
191198
payload = &kafkamgmtclient.KafkaRequestPayload{
192199
Name: opts.name,
193200
Region: &opts.region,
194201
CloudProvider: &opts.provider,
195202
MultiAz: &opts.multiAZ,
196203
}
197-
}
198204

199-
if !opts.bypassAmsCheck {
200-
err = validateProviderAndRegion(opts, constants, conn)
201-
if err != nil {
202-
return err
203-
}
204205
}
205206

206207
api := conn.API()
@@ -387,8 +388,16 @@ func validateProviderRegion(conn connection.Connection, opts *options, selectedP
387388
return nil
388389
}
389390

391+
// set type to store the answers from the prompt with defaults
392+
type promptAnswers struct {
393+
Name string
394+
Region string
395+
MultiAZ bool
396+
CloudProvider string
397+
}
398+
390399
// Show a prompt to allow the user to interactively insert the data for their Kafka
391-
func promptKafkaPayload(opts *options) (payload *kafkamgmtclient.KafkaRequestPayload, err error) {
400+
func promptKafkaPayload(opts *options, constants *remote.DynamicServiceConstants) (payload *kafkamgmtclient.KafkaRequestPayload, err error) {
392401
conn, err := opts.Connection(connection.DefaultConfigSkipMasAuth)
393402
if err != nil {
394403
return nil, err
@@ -401,21 +410,15 @@ func promptKafkaPayload(opts *options) (payload *kafkamgmtclient.KafkaRequestPay
401410
Connection: opts.Connection,
402411
}
403412

404-
// set type to store the answers from the prompt with defaults
405-
answers := struct {
406-
Name string
407-
Region string
408-
MultiAZ bool
409-
CloudProvider string
410-
}{
411-
MultiAZ: defaultMultiAZ,
412-
}
413-
414413
promptName := &survey.Input{
415414
Message: opts.localizer.MustLocalize("kafka.create.input.name.message"),
416415
Help: opts.localizer.MustLocalize("kafka.create.input.name.help"),
417416
}
418417

418+
answers := &promptAnswers{
419+
MultiAZ: defaultMultiAZ,
420+
}
421+
419422
err = survey.AskOne(promptName, &answers.Name, survey.WithValidator(validator.ValidateName), survey.WithValidator(validator.ValidateNameIsAvailable))
420423
if err != nil {
421424
return nil, err
@@ -453,8 +456,14 @@ func promptKafkaPayload(opts *options) (payload *kafkamgmtclient.KafkaRequestPay
453456
return nil, err
454457
}
455458

459+
userInstanceTypes, err := accountmgmtutil.GetUserSupportedInstanceTypes(opts.Context, constants.Kafka.Ams, conn)
460+
if err != nil {
461+
opts.Logger.Debug("Cannot retrieve user supported instance types. Skipping validation", err)
462+
return payload, err
463+
}
464+
456465
regions := cloudRegionResponse.GetItems()
457-
regionIDs := pkgKafka.GetEnabledCloudRegionIDs(regions)
466+
regionIDs := pkgKafka.GetEnabledCloudRegionIDs(regions, &userInstanceTypes)
458467

459468
regionPrompt := &survey.Select{
460469
Message: opts.localizer.MustLocalize("kafka.create.input.cloudRegion.message"),

pkg/cmd/kafka/list/list.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ func runList(opts *options) error {
145145
func mapResponseItemsToRows(kafkas []kafkamgmtclient.KafkaRequest, selectedId string) []kafkaRow {
146146
rows := make([]kafkaRow, len(kafkas))
147147

148-
for i, k := range kafkas {
148+
for i := range kafkas {
149+
k := kafkas[i]
149150
name := k.GetName()
150151
if k.GetId() == selectedId {
151152
name = fmt.Sprintf("%s %s", name, icon.Emoji("✔", "(current)"))

pkg/cmd/serviceaccount/list/list.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func mapResponseItemsToRows(svcAccts []kafkamgmtclient.ServiceAccountListItem) [
106106
ID: sa.GetId(),
107107
Name: sa.GetName(),
108108
ClientID: sa.GetClientId(),
109-
Owner: sa.GetOwner(),
109+
Owner: sa.GetCreatedBy(),
110110
CreatedAt: sa.GetCreatedAt().String(),
111111
}
112112

pkg/shared/kafkautil/util.go

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ func RegisterNameFlagCompletionFunc(cmd *cobra.Command, f *factory.Factory) erro
3232
}
3333

3434
items := kafkas.GetItems()
35-
for _, kafka := range items {
36-
validNames = append(validNames, kafka.GetName())
35+
for index := range items {
36+
validNames = append(validNames, items[index].GetName())
3737
}
3838

3939
return validNames, directive
@@ -85,7 +85,7 @@ func GetCloudProviderRegionCompletionValues(f *factory.Factory, providerID strin
8585
}
8686

8787
cloudProviders := cloudProviderResponse.GetItems()
88-
validRegions = GetEnabledCloudRegionIDs(cloudProviders)
88+
validRegions = GetEnabledCloudRegionIDs(cloudProviders, nil)
8989

9090
return validRegions, directive
9191
}
@@ -112,16 +112,35 @@ func FindCloudProviderByName(cloudProviders []kafkamgmtclient.CloudProvider, nam
112112
}
113113

114114
// GetEnabledCloudRegionIDs extracts and returns a slice of the unique IDs of all enabled regions
115-
func GetEnabledCloudRegionIDs(regions []kafkamgmtclient.CloudRegion) []string {
115+
func GetEnabledCloudRegionIDs(regions []kafkamgmtclient.CloudRegion, userAllowedInstanceTypes *[]string) []string {
116116
var regionIDs []string
117-
for _, region := range regions {
117+
for i, region := range regions {
118118
if region.GetEnabled() {
119-
regionIDs = append(regionIDs, region.GetId())
119+
if userAllowedInstanceTypes != nil {
120+
if IsRegionAllowed(&regions[i], userAllowedInstanceTypes) {
121+
regionIDs = append(regionIDs, region.GetId())
122+
}
123+
} else {
124+
regionIDs = append(regionIDs, region.GetId())
125+
}
120126
}
121127
}
122128
return regionIDs
123129
}
124130

131+
func IsRegionAllowed(region *kafkamgmtclient.CloudRegion, userAllowedInstanceTypes *[]string) bool {
132+
for _, userInstanceType := range *userAllowedInstanceTypes {
133+
if region.GetSupportedInstanceTypes() != nil {
134+
for _, instanceType := range region.GetSupportedInstanceTypes() {
135+
if instanceType == userInstanceType {
136+
return true
137+
}
138+
}
139+
}
140+
}
141+
return false
142+
}
143+
125144
// FilterValidTopicNameArgs filters topics from the API and returns the names
126145
// This is used in for dynamic completion of topic names
127146
func FilterValidTopicNameArgs(f *factory.Factory, toComplete string) (validNames []string, directive cobra.ShellCompDirective) {

0 commit comments

Comments
 (0)