Skip to content

Commit 0b368d7

Browse files
Merge pull request openshift#7683 from miyamotoh/check-if-per-enabled
MULTIARCH-3965: Check if PER is enabled in the target PowerVS workspace
2 parents 53d1215 + 196d7d2 commit 0b368d7

File tree

702 files changed

+78754
-2624
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

702 files changed

+78754
-2624
lines changed

go.mod

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ require (
1414
github.com/Azure/go-autorest/autorest v0.11.29
1515
github.com/Azure/go-autorest/autorest/to v0.4.0
1616
github.com/IBM-Cloud/bluemix-go v0.0.0-20211102075456-ffc4e11dfb16
17-
github.com/IBM-Cloud/power-go-client v1.2.0
18-
github.com/IBM/go-sdk-core/v5 v5.13.2
17+
github.com/IBM-Cloud/power-go-client v1.5.3
18+
github.com/IBM/go-sdk-core/v5 v5.14.1
1919
github.com/IBM/networking-go-sdk v0.42.2
2020
github.com/IBM/platform-services-go-sdk v0.42.0
2121
github.com/IBM/vpc-go-sdk v0.20.0
@@ -32,9 +32,9 @@ require (
3232
github.com/daixiang0/gci v0.9.0
3333
github.com/diskfs/go-diskfs v1.4.0
3434
github.com/form3tech-oss/jwt-go v3.2.3+incompatible
35-
github.com/go-openapi/errors v0.20.3
36-
github.com/go-openapi/strfmt v0.21.5
37-
github.com/go-openapi/swag v0.22.3
35+
github.com/go-openapi/errors v0.20.4
36+
github.com/go-openapi/strfmt v0.21.7
37+
github.com/go-openapi/swag v0.22.4
3838
github.com/go-playground/validator/v10 v10.13.0
3939
github.com/golang-jwt/jwt v3.2.2+incompatible
4040
github.com/golang/mock v1.7.0-rc.1
@@ -151,13 +151,13 @@ require (
151151
github.com/go-logr/logr v1.2.4 // indirect
152152
github.com/go-logr/stdr v1.2.2 // indirect
153153
github.com/go-logr/zapr v1.2.4 // indirect
154-
github.com/go-openapi/analysis v0.21.2 // indirect
154+
github.com/go-openapi/analysis v0.21.4 // indirect
155155
github.com/go-openapi/jsonpointer v0.19.6 // indirect
156156
github.com/go-openapi/jsonreference v0.20.2 // indirect
157-
github.com/go-openapi/loads v0.21.1 // indirect
158-
github.com/go-openapi/runtime v0.23.0 // indirect
159-
github.com/go-openapi/spec v0.20.7 // indirect
160-
github.com/go-openapi/validate v0.22.0 // indirect
157+
github.com/go-openapi/loads v0.21.2 // indirect
158+
github.com/go-openapi/runtime v0.26.0 // indirect
159+
github.com/go-openapi/spec v0.20.8 // indirect
160+
github.com/go-openapi/validate v0.22.1 // indirect
161161
github.com/go-playground/locales v0.14.1 // indirect
162162
github.com/go-playground/universal-translator v0.18.1 // indirect
163163
github.com/gobuffalo/flect v1.0.2 // indirect

go.sum

Lines changed: 23 additions & 62 deletions
Large diffs are not rendered by default.

pkg/asset/installconfig/platformprovisioncheck.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ func (a *PlatformProvisionCheck) Generate(dependencies asset.Parents) error {
160160
return err
161161
}
162162

163+
err = powervsconfig.ValidatePERAvailability(client, ic.Config)
164+
if err != nil {
165+
return err
166+
}
167+
163168
err = powervsconfig.ValidatePreExistingDNS(client, ic.Config, ic.PowerVS)
164169
if err != nil {
165170
return err

pkg/asset/installconfig/powervs/client.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"time"
99

1010
"github.com/IBM-Cloud/bluemix-go/crn"
11+
"github.com/IBM-Cloud/power-go-client/power/client/datacenters"
1112
"github.com/IBM/go-sdk-core/v5/core"
1213
"github.com/IBM/networking-go-sdk/dnsrecordsv1"
1314
"github.com/IBM/networking-go-sdk/dnssvcsv1"
@@ -40,6 +41,7 @@ type API interface {
4041
ListResourceGroups(ctx context.Context) (*resourcemanagerv2.ResourceGroupList, error)
4142
ListServiceInstances(ctx context.Context) ([]string, error)
4243
ServiceInstanceIDToCRN(ctx context.Context, id string) (string, error)
44+
GetDatacenterCapabilities(ctx context.Context, region string) (map[string]bool, error)
4345
}
4446

4547
// Client makes calls to the PowerVS API.
@@ -746,3 +748,20 @@ func (c *Client) ServiceInstanceIDToCRN(ctx context.Context, id string) (string,
746748

747749
return "", nil
748750
}
751+
752+
// GetDatacenterCapabilities retrieves the capabilities of the specified datacenter.
753+
func (c *Client) GetDatacenterCapabilities(ctx context.Context, region string) (map[string]bool, error) {
754+
var err error
755+
if c.BXCli.PISession == nil {
756+
err = c.BXCli.NewPISession()
757+
if err != nil {
758+
return nil, fmt.Errorf("failed to initialize PISession in GetDatacenterCapabilities: %w", err)
759+
}
760+
}
761+
params := datacenters.NewV1DatacentersGetParamsWithContext(ctx).WithDatacenterRegion(region)
762+
getOk, err := c.BXCli.PISession.Power.Datacenters.V1DatacentersGet(params)
763+
if err != nil {
764+
return nil, fmt.Errorf("failed to get datacenter capabilities: %w", err)
765+
}
766+
return getOk.Payload.Capabilities, nil
767+
}

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

Lines changed: 15 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/validation.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,24 @@ func validateMachinePool(fldPath *field.Path, machinePool *types.MachinePool) fi
4848
return allErrs
4949
}
5050

51+
// ValidatePERAvailability ensures the target datacenter has PER enabled.
52+
func ValidatePERAvailability(client API, ic *types.InstallConfig) error {
53+
capabilities, err := client.GetDatacenterCapabilities(context.TODO(), ic.PowerVS.Zone)
54+
if err != nil {
55+
return err
56+
}
57+
const per = "power-edge-router"
58+
perAvail, ok := capabilities[per]
59+
if !ok {
60+
return fmt.Errorf("%s capability unknown at: %s", per, ic.PowerVS.Zone)
61+
}
62+
if !perAvail {
63+
return fmt.Errorf("%s is not available at: %s", per, ic.PowerVS.Zone)
64+
}
65+
66+
return nil
67+
}
68+
5169
// ValidatePreExistingDNS ensures no pre-existing DNS record exists in the CIS
5270
// DNS zone or IBM DNS zone for cluster's Kubernetes API.
5371
func ValidatePreExistingDNS(client API, ic *types.InstallConfig, metadata MetadataAPI) error {

pkg/asset/installconfig/powervs/validation_test.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,23 @@ var (
113113
ID: &validRG,
114114
},
115115
}
116+
regionWithPER = "dal10"
117+
regionWithoutPER = "foo99"
118+
regionPERUnknown = "bah77"
119+
mapWithPERFalse = map[string]bool{
120+
"disaster-recover-site": true,
121+
"power-edge-router": false,
122+
"vpn-connections": true,
123+
}
124+
mapWithPERTrue = map[string]bool{
125+
"disaster-recover-site": true,
126+
"power-edge-router": true,
127+
"vpn-connections": true,
128+
}
129+
mapPERUnknown = map[string]bool{
130+
"disaster-recover-site": true,
131+
"power-vpn-connections": false,
132+
}
116133
)
117134

118135
func validInstallConfig() *types.InstallConfig {
@@ -471,6 +488,74 @@ func createComputes(numComputes int32, compute *machinev1.PowerVSMachineProvider
471488
return computes
472489
}
473490

491+
func TestValidatePERAvailability(t *testing.T) {
492+
cases := []struct {
493+
name string
494+
edits editFunctions
495+
errorMsg string
496+
}{
497+
{
498+
name: "Region without PER",
499+
edits: editFunctions{
500+
func(ic *types.InstallConfig) {
501+
ic.Platform.PowerVS.Zone = regionWithoutPER
502+
},
503+
},
504+
errorMsg: fmt.Sprintf("power-edge-router is not available at: %s", regionWithoutPER),
505+
},
506+
{
507+
name: "Region with PER",
508+
edits: editFunctions{
509+
func(ic *types.InstallConfig) {
510+
ic.Platform.PowerVS.Zone = regionWithPER
511+
},
512+
},
513+
errorMsg: "",
514+
},
515+
{
516+
name: "Region with no PER availability info",
517+
edits: editFunctions{
518+
func(ic *types.InstallConfig) {
519+
ic.Platform.PowerVS.Zone = regionPERUnknown
520+
},
521+
},
522+
errorMsg: fmt.Sprintf("power-edge-router capability unknown at: %s", regionPERUnknown),
523+
},
524+
}
525+
setMockEnvVars()
526+
527+
mockCtrl := gomock.NewController(t)
528+
defer mockCtrl.Finish()
529+
530+
powervsClient := mock.NewMockAPI(mockCtrl)
531+
532+
// Mocks: PER-absent region results in false
533+
powervsClient.EXPECT().GetDatacenterCapabilities(gomock.Any(), regionWithoutPER).Return(mapWithPERFalse, nil)
534+
535+
// Mocks: PER-enabled region results in true
536+
powervsClient.EXPECT().GetDatacenterCapabilities(gomock.Any(), regionWithPER).Return(mapWithPERTrue, nil)
537+
538+
// Mocks: PER-unknown region results in false
539+
powervsClient.EXPECT().GetDatacenterCapabilities(gomock.Any(), regionPERUnknown).Return(mapPERUnknown, nil)
540+
541+
// Run tests
542+
for _, tc := range cases {
543+
t.Run(tc.name, func(t *testing.T) {
544+
editedInstallConfig := validInstallConfig()
545+
for _, edit := range tc.edits {
546+
edit(editedInstallConfig)
547+
}
548+
549+
aggregatedErrors := powervs.ValidatePERAvailability(powervsClient, editedInstallConfig)
550+
if tc.errorMsg != "" {
551+
assert.Regexp(t, tc.errorMsg, aggregatedErrors)
552+
} else {
553+
assert.NoError(t, aggregatedErrors)
554+
}
555+
})
556+
}
557+
}
558+
474559
func setMockEnvVars() {
475560
os.Setenv("POWERVS_AUTH_FILEPATH", "./tmp/powervs/config.json")
476561
os.Setenv("IBMID", "foo")

vendor/github.com/IBM-Cloud/power-go-client/clients/instance/ibm-pi-clonevolumes.go

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

0 commit comments

Comments
 (0)