Skip to content

Commit a6cd30f

Browse files
Merge pull request openshift#8025 from miyamotoh/auth-with-platform-services-sdk
OCPBUGS-30200: Authn with platform-services-go-sdk for PowerVS
2 parents a9da892 + b65d463 commit a6cd30f

Some content is hidden

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

79 files changed

+25
-7082
lines changed

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ require (
3939
github.com/go-openapi/strfmt v0.21.7
4040
github.com/go-openapi/swag v0.22.9
4141
github.com/go-playground/validator/v10 v10.13.0
42-
github.com/golang-jwt/jwt v3.2.2+incompatible
4342
github.com/golang/mock v1.7.0-rc.1
4443
github.com/golang/protobuf v1.5.3
4544
github.com/google/go-cmp v0.6.0

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,8 +440,6 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV
440440
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
441441
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
442442
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
443-
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
444-
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
445443
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
446444
github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
447445
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=

pkg/asset/installconfig/powervs/session.go

Lines changed: 19 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,16 @@ import (
55
"encoding/json"
66
"errors"
77
"fmt"
8-
gohttp "net/http"
98
"os"
109
"path/filepath"
1110
"strings"
1211
"time"
1312

1413
survey "github.com/AlecAivazis/survey/v2"
15-
"github.com/IBM-Cloud/bluemix-go"
16-
"github.com/IBM-Cloud/bluemix-go/authentication"
17-
"github.com/IBM-Cloud/bluemix-go/http"
18-
"github.com/IBM-Cloud/bluemix-go/rest"
19-
bxsession "github.com/IBM-Cloud/bluemix-go/session"
2014
"github.com/IBM-Cloud/power-go-client/ibmpisession"
2115
"github.com/IBM/go-sdk-core/v5/core"
2216
"github.com/form3tech-oss/jwt-go"
2317
"github.com/sirupsen/logrus"
24-
25-
"github.com/openshift/installer/pkg/types/powervs"
2618
)
2719

2820
var (
@@ -33,7 +25,6 @@ var (
3325

3426
// BxClient is struct which provides bluemix session details
3527
type BxClient struct {
36-
*bxsession.Session
3728
APIKey string
3829
Region string
3930
Zone string
@@ -67,28 +58,32 @@ type SessionVars struct {
6758
PowerVSResourceGroup string
6859
}
6960

70-
func authenticateAPIKey(sess *bxsession.Session) error {
71-
config := sess.Config
72-
tokenRefresher, err := authentication.NewIAMAuthRepository(config, &rest.Client{
73-
DefaultHeader: gohttp.Header{
74-
"User-Agent": []string{http.UserAgent()},
75-
},
76-
})
61+
func authenticateAPIKey(apikey string) (string, error) {
62+
a, err := core.NewIamAuthenticatorBuilder().SetApiKey(apikey).Build()
7763
if err != nil {
78-
return err
64+
return "", err
7965
}
80-
return tokenRefresher.AuthenticateAPIKey(config.BluemixAPIKey)
66+
token, err := a.GetToken()
67+
if err != nil {
68+
return "", err
69+
}
70+
return token, nil
8171
}
8272

83-
func fetchUserDetails(sess *bxsession.Session) (*User, error) {
84-
config := sess.Config
73+
// FetchUserDetails returns User details from the given API key.
74+
func FetchUserDetails(apikey string) (*User, error) {
8575
user := User{}
8676
var bluemixToken string
8777

88-
if strings.HasPrefix(config.IAMAccessToken, "Bearer") {
89-
bluemixToken = config.IAMAccessToken[7:len(config.IAMAccessToken)]
78+
iamToken, err := authenticateAPIKey(apikey)
79+
if err != nil {
80+
return &user, err
81+
}
82+
83+
if strings.HasPrefix(iamToken, "Bearer ") {
84+
bluemixToken = iamToken[len("Bearer "):]
9085
} else {
91-
bluemixToken = config.IAMAccessToken
86+
bluemixToken = iamToken
9287
}
9388

9489
token, err := jwt.Parse(bluemixToken, func(token *jwt.Token) (interface{}, error) {
@@ -121,29 +116,10 @@ func NewBxClient(survey bool) (*BxClient, error) {
121116
c.Zone = sv.Zone
122117
c.PowerVSResourceGroup = sv.PowerVSResourceGroup
123118

124-
bxSess, err := bxsession.New(&bluemix.Config{
125-
BluemixAPIKey: sv.APIKey,
126-
})
119+
c.User, err = FetchUserDetails(c.APIKey)
127120
if err != nil {
128121
return nil, err
129122
}
130-
if bxSess == nil {
131-
return nil, errors.New("failed to create bxsession.New in NewBxClient")
132-
}
133-
134-
c.Session = bxSess
135-
136-
err = authenticateAPIKey(bxSess)
137-
if err != nil {
138-
return nil, err
139-
}
140-
141-
c.User, err = fetchUserDetails(bxSess)
142-
if err != nil {
143-
return nil, err
144-
}
145-
146-
c.Session.Config.Region = powervs.Regions[sv.Region].VPCRegion
147123

148124
return c, nil
149125
}

pkg/destroy/powervs/powervs.go

Lines changed: 6 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,7 @@ import (
1010
"sync"
1111
"time"
1212

13-
"github.com/IBM-Cloud/bluemix-go"
14-
"github.com/IBM-Cloud/bluemix-go/api/resource/resourcev2/controllerv2"
15-
"github.com/IBM-Cloud/bluemix-go/authentication"
1613
"github.com/IBM-Cloud/bluemix-go/crn"
17-
"github.com/IBM-Cloud/bluemix-go/http"
18-
"github.com/IBM-Cloud/bluemix-go/rest"
19-
bxsession "github.com/IBM-Cloud/bluemix-go/session"
2014
"github.com/IBM-Cloud/power-go-client/clients/instance"
2115
"github.com/IBM-Cloud/power-go-client/ibmpisession"
2216
"github.com/IBM/go-sdk-core/v5/core"
@@ -28,7 +22,6 @@ import (
2822
"github.com/IBM/platform-services-go-sdk/resourcecontrollerv2"
2923
"github.com/IBM/platform-services-go-sdk/resourcemanagerv2"
3024
"github.com/IBM/vpc-go-sdk/vpcv1"
31-
"github.com/golang-jwt/jwt"
3225
"github.com/sirupsen/logrus"
3326
utilerrors "k8s.io/apimachinery/pkg/util/errors"
3427
"k8s.io/apimachinery/pkg/util/wait"
@@ -74,42 +67,6 @@ type User struct {
7467
generation int `default:"2"`
7568
}
7669

77-
func fetchUserDetails(bxSession *bxsession.Session, generation int) (*User, error) {
78-
config := bxSession.Config
79-
user := User{}
80-
var bluemixToken string
81-
82-
if strings.HasPrefix(config.IAMAccessToken, "Bearer") {
83-
bluemixToken = config.IAMAccessToken[7:len(config.IAMAccessToken)]
84-
} else {
85-
bluemixToken = config.IAMAccessToken
86-
}
87-
88-
token, err := jwt.Parse(bluemixToken, func(token *jwt.Token) (interface{}, error) {
89-
return "", nil
90-
})
91-
if err != nil && !strings.Contains(err.Error(), "key is of invalid type") {
92-
return &user, err
93-
}
94-
95-
claims := token.Claims.(jwt.MapClaims)
96-
if email, ok := claims["email"]; ok {
97-
user.Email = email.(string)
98-
}
99-
user.ID = claims["id"].(string)
100-
user.Account = claims["account"].(map[string]interface{})["bss"].(string)
101-
iss := claims["iss"].(string)
102-
if strings.Contains(iss, "https://iam.cloud.ibm.com") {
103-
user.cloudName = "bluemix"
104-
} else {
105-
user.cloudName = "staging"
106-
}
107-
user.cloudType = "public"
108-
109-
user.generation = generation
110-
return &user, nil
111-
}
112-
11370
// ClusterUninstaller holds the various options for the cluster we want to delete.
11471
type ClusterUninstaller struct {
11572
APIKey string
@@ -414,23 +371,14 @@ func (o *ClusterUninstaller) newAuthenticator(apikey string) (core.Authenticator
414371

415372
func (o *ClusterUninstaller) loadSDKServices() error {
416373
var (
417-
bxSession *bxsession.Session
418-
tokenProviderEndpoint = "https://iam.cloud.ibm.com" //nolint:gosec // not a credential despite `token` in its name
419-
tokenRefresher *authentication.IAMAuthRepository
420-
err error
421-
ctrlv2 controllerv2.ResourceControllerAPIV2
422-
resourceClientV2 controllerv2.ResourceServiceInstanceRepository
423-
authenticator core.Authenticator
424-
versionDate = "2023-07-04"
425-
tgOptions *transitgatewayapisv1.TransitGatewayApisV1Options
426-
serviceName string
374+
err error
375+
authenticator core.Authenticator
376+
versionDate = "2023-07-04"
377+
tgOptions *transitgatewayapisv1.TransitGatewayApisV1Options
378+
serviceName string
427379
)
428380

429381
defer func() {
430-
o.Logger.Debugf("loadSDKServices: bxSession = %v", bxSession)
431-
o.Logger.Debugf("loadSDKServices: tokenRefresher = %v", tokenRefresher)
432-
o.Logger.Debugf("loadSDKServices: ctrlv2 = %v", ctrlv2)
433-
o.Logger.Debugf("loadSDKServices: resourceClientV2 = %v", resourceClientV2)
434382
o.Logger.Debugf("loadSDKServices: o.ServiceGUID = %v", o.ServiceGUID)
435383
o.Logger.Debugf("loadSDKServices: o.piSession = %v", o.piSession)
436384
o.Logger.Debugf("loadSDKServices: o.instanceClient = %v", o.instanceClient)
@@ -446,43 +394,11 @@ func (o *ClusterUninstaller) loadSDKServices() error {
446394
return fmt.Errorf("loadSDKServices: missing APIKey in metadata.json")
447395
}
448396

449-
bxSession, err = bxsession.New(&bluemix.Config{
450-
BluemixAPIKey: o.APIKey,
451-
TokenProviderEndpoint: &tokenProviderEndpoint,
452-
Debug: false,
453-
})
454-
if err != nil {
455-
return fmt.Errorf("loadSDKServices: bxsession.New: %w", err)
456-
}
457-
458-
tokenRefresher, err = authentication.NewIAMAuthRepository(bxSession.Config, &rest.Client{
459-
DefaultHeader: gohttp.Header{
460-
"User-Agent": []string{http.UserAgent()},
461-
},
462-
})
463-
if err != nil {
464-
return fmt.Errorf("loadSDKServices: authentication.NewIAMAuthRepository: %w", err)
465-
}
466-
err = tokenRefresher.AuthenticateAPIKey(bxSession.Config.BluemixAPIKey)
467-
if err != nil {
468-
return fmt.Errorf("loadSDKServices: tokenRefresher.AuthenticateAPIKey: %w", err)
469-
}
470-
471-
user, err := fetchUserDetails(bxSession, 2)
397+
user, err := powervs.FetchUserDetails(o.APIKey)
472398
if err != nil {
473399
return fmt.Errorf("loadSDKServices: fetchUserDetails: %w", err)
474400
}
475401

476-
ctrlv2, err = controllerv2.New(bxSession)
477-
if err != nil {
478-
return fmt.Errorf("loadSDKServices: controllerv2.New: %w", err)
479-
}
480-
481-
resourceClientV2 = ctrlv2.ResourceServiceInstanceV2()
482-
if err != nil {
483-
return fmt.Errorf("loadSDKServices: ctrlv2.ResourceServiceInstanceV2: %w", err)
484-
}
485-
486402
authenticator, err = o.newAuthenticator(o.APIKey)
487403
if err != nil {
488404
return err

vendor/github.com/IBM-Cloud/bluemix-go/.gitignore

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)