Skip to content

Commit 439f39c

Browse files
Merge pull request openshift#6885 from hamzy/powervs-MULTIARCH-2517
MULTIARCH-2517: PowerVS: create install-config improvements
2 parents 948bed9 + c8eb389 commit 439f39c

File tree

11 files changed

+525
-102
lines changed

11 files changed

+525
-102
lines changed

pkg/asset/installconfig/platformcredscheck.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,7 @@ func (a *PlatformCredsCheck) Generate(dependencies asset.Parents) error {
7878
return errors.Wrap(err, "creating IBM Cloud session")
7979
}
8080
case powervs.Name:
81-
bxCli, err := powervsconfig.NewBxClient()
82-
if err != nil {
83-
return err
84-
}
85-
err = bxCli.NewPISession()
81+
_, err = powervsconfig.NewClient()
8682
if err != nil {
8783
return errors.Wrap(err, "creating IBM Cloud session")
8884
}

pkg/asset/installconfig/platformpermscheck.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ func (a *PlatformPermsCheck) Generate(dependencies asset.Parents) error {
9191
case ibmcloud.Name:
9292
// TODO: IBM[#90]: platformpermscheck
9393
case powervs.Name:
94-
bxCli, err := powervsconfig.NewBxClient()
94+
bxCli, err := powervsconfig.NewBxClient(false)
9595
if err != nil {
9696
return err
9797
}

pkg/asset/installconfig/platformprovisioncheck.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,14 +131,26 @@ func (a *PlatformProvisionCheck) Generate(dependencies asset.Parents) error {
131131
if err != nil {
132132
return err
133133
}
134+
134135
err = powervsconfig.ValidatePreExistingDNS(client, ic.Config, ic.PowerVS)
135136
if err != nil {
136137
return err
137138
}
139+
138140
err = powervsconfig.ValidateCustomVPCSetup(client, ic.Config)
139141
if err != nil {
140142
return err
141143
}
144+
145+
err = powervsconfig.ValidateResourceGroup(client, ic.Config)
146+
if err != nil {
147+
return err
148+
}
149+
150+
err = powervsconfig.ValidateServiceInstance(client, ic.Config)
151+
if err != nil {
152+
return err
153+
}
142154
case libvirt.Name, none.Name:
143155
// no special provisioning requirements to check
144156
case nutanix.Name:

pkg/asset/installconfig/powervs/client.go

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,14 @@ type API interface {
3737
GetAPIKey() string
3838
SetVPCServiceURLForRegion(ctx context.Context, region string) error
3939
GetVPCs(ctx context.Context, region string) ([]vpcv1.VPC, error)
40+
ListResourceGroups(ctx context.Context) (*resourcemanagerv2.ResourceGroupList, error)
41+
ListServiceInstances(ctx context.Context) ([]string, error)
4042
}
4143

4244
// Client makes calls to the PowerVS API.
4345
type Client struct {
4446
APIKey string
47+
BXCli *BxClient
4548
managementAPI *resourcemanagerv2.ResourceManagerV2
4649
controllerAPI *resourcecontrollerv2.ResourceControllerV2
4750
vpcAPI *vpcv1.VpcV1
@@ -82,19 +85,47 @@ type DNSRecordResponse struct {
8285

8386
// NewClient initializes a client with a session.
8487
func NewClient() (*Client, error) {
85-
bxCli, err := NewBxClient()
88+
bxCli, err := NewBxClient(false)
8689
if err != nil {
8790
return nil, err
8891
}
8992

9093
client := &Client{
9194
APIKey: bxCli.APIKey,
95+
BXCli: bxCli,
9296
}
9397

9498
if err := client.loadSDKServices(); err != nil {
9599
return nil, errors.Wrap(err, "failed to load IBM SDK services")
96100
}
97101

102+
if bxCli.PowerVSResourceGroup == "Default" {
103+
// Here we are initialized enough to handle a default resource group
104+
ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Minute)
105+
defer cancel()
106+
107+
resourceGroups, err := client.ListResourceGroups(ctx)
108+
if err != nil {
109+
return nil, errors.Wrap(err, "client.ListResourceGroups failed")
110+
}
111+
if resourceGroups == nil {
112+
return nil, errors.New("client.ListResourceGroups returns nil")
113+
}
114+
115+
found := false
116+
for _, resourceGroup := range resourceGroups.Resources {
117+
if resourceGroup.Default != nil && *resourceGroup.Default {
118+
bxCli.PowerVSResourceGroup = *resourceGroup.Name
119+
found = true
120+
break
121+
}
122+
}
123+
124+
if !found {
125+
return nil, errors.New("no default resource group found")
126+
}
127+
}
128+
98129
return client, nil
99130
}
100131

@@ -535,3 +566,83 @@ func (c *Client) GetVPCs(ctx context.Context, region string) ([]vpcv1.VPC, error
535566

536567
return vpcs.Vpcs, nil
537568
}
569+
570+
// ListResourceGroups returns a list of resource groups.
571+
func (c *Client) ListResourceGroups(ctx context.Context) (*resourcemanagerv2.ResourceGroupList, error) {
572+
listResourceGroupsOptions := c.managementAPI.NewListResourceGroupsOptions()
573+
574+
resourceGroups, _, err := c.managementAPI.ListResourceGroups(listResourceGroupsOptions)
575+
if err != nil {
576+
return nil, err
577+
}
578+
579+
return resourceGroups, err
580+
}
581+
582+
const (
583+
// resource Id for Power Systems Virtual Server in the Global catalog.
584+
powerIAASResourceID = "abd259f0-9990-11e8-acc8-b9f54a8f1661"
585+
)
586+
587+
// ListServiceInstances lists all service instances in the cloud.
588+
func (c *Client) ListServiceInstances(ctx context.Context) ([]string, error) {
589+
var (
590+
serviceInstances []string
591+
options *resourcecontrollerv2.ListResourceInstancesOptions
592+
resources *resourcecontrollerv2.ResourceInstancesList
593+
err error
594+
perPage int64 = 10
595+
moreData = true
596+
nextURL *string
597+
)
598+
599+
options = c.controllerAPI.NewListResourceInstancesOptions()
600+
options.SetResourceGroupID(c.BXCli.PowerVSResourceGroup)
601+
// resource ID for Power Systems Virtual Server in the Global catalog
602+
options.SetResourceID(powerIAASResourceID)
603+
options.SetLimit(perPage)
604+
605+
for moreData {
606+
resources, _, err = c.controllerAPI.ListResourceInstancesWithContext(ctx, options)
607+
if err != nil {
608+
return nil, errors.Wrap(err, "Failed to list resource instance")
609+
}
610+
611+
for _, resource := range resources.Resources {
612+
var (
613+
getResourceOptions *resourcecontrollerv2.GetResourceInstanceOptions
614+
resourceInstance *resourcecontrollerv2.ResourceInstance
615+
response *core.DetailedResponse
616+
)
617+
618+
getResourceOptions = c.controllerAPI.NewGetResourceInstanceOptions(*resource.ID)
619+
620+
resourceInstance, response, err = c.controllerAPI.GetResourceInstance(getResourceOptions)
621+
if err != nil {
622+
return nil, errors.Wrap(err, "Failed to get instance")
623+
}
624+
if response != nil && response.StatusCode == http.StatusNotFound || response.StatusCode == http.StatusInternalServerError {
625+
continue
626+
}
627+
628+
if resourceInstance.Type != nil && *resourceInstance.Type == "service_instance" {
629+
serviceInstances = append(serviceInstances, fmt.Sprintf("%s %s", *resource.Name, *resource.GUID))
630+
}
631+
}
632+
633+
// Based on: https://cloud.ibm.com/apidocs/resource-controller/resource-controller?code=go#list-resource-instances
634+
nextURL, err = core.GetQueryParam(resources.NextURL, "start")
635+
if err != nil {
636+
return nil, errors.Wrap(err, "Failed to GetQueryParam on start")
637+
}
638+
if nextURL == nil {
639+
options.SetStart("")
640+
} else {
641+
options.SetStart(*nextURL)
642+
}
643+
644+
moreData = *resources.RowsCount == perPage
645+
}
646+
647+
return serviceInstances, nil
648+
}

pkg/asset/installconfig/powervs/mock/powervsclient_generated.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/asset/installconfig/powervs/platform.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,7 @@ import (
99
// Platform collects powervs-specific configuration.
1010
func Platform() (*powervs.Platform, error) {
1111

12-
bxCli, err := NewBxClient()
13-
if err != nil {
14-
return nil, err
15-
}
16-
17-
err = bxCli.NewPISession()
12+
bxCli, err := NewBxClient(true)
1813
if err != nil {
1914
return nil, err
2015
}
@@ -28,9 +23,11 @@ func Platform() (*powervs.Platform, error) {
2823
p.ClusterOSImage = osOverride
2924
}
3025

31-
p.Region = bxCli.PISession.Options.Region
32-
p.Zone = bxCli.PISession.Options.Zone
33-
p.UserID = bxCli.PISession.Options.UserAccount
26+
p.Region = bxCli.Region
27+
p.Zone = bxCli.Zone
28+
p.UserID = bxCli.User.ID
29+
p.ServiceInstanceID = bxCli.ServiceInstanceID
30+
p.PowerVSResourceGroup = bxCli.PowerVSResourceGroup
3431

3532
return &p, nil
3633
}

pkg/asset/installconfig/powervs/regions.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func IsKnownZone(region string, zone string) bool {
4949
}
5050

5151
// GetRegion prompts the user to select a region and returns that region.
52-
func GetRegion() (string, error) {
52+
func GetRegion(defaultRegion string) (string, error) {
5353
regions := knownRegions()
5454

5555
longRegions := make([]string, 0, len(regions))
@@ -72,12 +72,19 @@ func GetRegion() (string, error) {
7272
}
7373

7474
var region string
75+
li := sort.SearchStrings(shortRegions, defaultRegion)
76+
if li == len(shortRegions) || shortRegions[li] != defaultRegion {
77+
defaultRegion = ""
78+
} else {
79+
defaultRegion = longRegions[li]
80+
}
7581

7682
err := survey.Ask([]*survey.Question{
7783
{
7884
Prompt: &survey.Select{
7985
Message: "Region",
8086
Help: "The Power VS region to be used for installation.",
87+
Default: defaultRegion,
8188
Options: longRegions,
8289
},
8390
Validate: survey.ComposeValidators(survey.Required, func(ans interface{}) error {
@@ -99,9 +106,11 @@ func GetRegion() (string, error) {
99106
}
100107

101108
// GetZone prompts the user for a zone given a zone.
102-
func GetZone(region string) (string, error) {
109+
func GetZone(region string, defaultZone string) (string, error) {
103110
zones := knownZones(region)
104-
defaultZone := zones[0]
111+
if len(defaultZone) == 0 {
112+
defaultZone = zones[0]
113+
}
105114

106115
var zoneTransform survey.Transformer = func(ans interface{}) interface{} {
107116
switch v := ans.(type) {

0 commit comments

Comments
 (0)