Skip to content

Commit 9c973c6

Browse files
authored
Merge pull request kubernetes#75515 from dougm/vsphere-token-auth
vSphere: add token auth support for tags client
2 parents b0158ce + 85907f6 commit 9c973c6

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

+54843
-321
lines changed

Godeps/Godeps.json

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

pkg/cloudprovider/providers/vsphere/vclib/connection.go

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -86,34 +86,27 @@ func (connection *VSphereConnection) Connect(ctx context.Context) error {
8686
return nil
8787
}
8888

89-
// login calls SessionManager.LoginByToken if certificate and private key are configured,
90-
// otherwise calls SessionManager.Login with user and password.
91-
func (connection *VSphereConnection) login(ctx context.Context, client *vim25.Client) error {
92-
m := session.NewManager(client)
93-
connection.credentialsLock.Lock()
94-
defer connection.credentialsLock.Unlock()
95-
89+
// Signer returns an sts.Signer for use with SAML token auth if connection is configured for such.
90+
// Returns nil if username/password auth is configured for the connection.
91+
func (connection *VSphereConnection) Signer(ctx context.Context, client *vim25.Client) (*sts.Signer, error) {
9692
// TODO: Add separate fields for certificate and private-key.
9793
// For now we can leave the config structs and validation as-is and
9894
// decide to use LoginByToken if the username value is PEM encoded.
9995
b, _ := pem.Decode([]byte(connection.Username))
10096
if b == nil {
101-
klog.V(3).Infof("SessionManager.Login with username '%s'", connection.Username)
102-
return m.Login(ctx, neturl.UserPassword(connection.Username, connection.Password))
97+
return nil, nil
10398
}
10499

105-
klog.V(3).Infof("SessionManager.LoginByToken with certificate '%s'", connection.Username)
106-
107100
cert, err := tls.X509KeyPair([]byte(connection.Username), []byte(connection.Password))
108101
if err != nil {
109102
klog.Errorf("Failed to load X509 key pair. err: %+v", err)
110-
return err
103+
return nil, err
111104
}
112105

113106
tokens, err := sts.NewClient(ctx, client)
114107
if err != nil {
115108
klog.Errorf("Failed to create STS client. err: %+v", err)
116-
return err
109+
return nil, err
117110
}
118111

119112
req := sts.TokenRequest{
@@ -123,9 +116,31 @@ func (connection *VSphereConnection) login(ctx context.Context, client *vim25.Cl
123116
signer, err := tokens.Issue(ctx, req)
124117
if err != nil {
125118
klog.Errorf("Failed to issue SAML token. err: %+v", err)
119+
return nil, err
120+
}
121+
122+
return signer, nil
123+
}
124+
125+
// login calls SessionManager.LoginByToken if certificate and private key are configured,
126+
// otherwise calls SessionManager.Login with user and password.
127+
func (connection *VSphereConnection) login(ctx context.Context, client *vim25.Client) error {
128+
m := session.NewManager(client)
129+
connection.credentialsLock.Lock()
130+
defer connection.credentialsLock.Unlock()
131+
132+
signer, err := connection.Signer(ctx, client)
133+
if err != nil {
126134
return err
127135
}
128136

137+
if signer == nil {
138+
klog.V(3).Infof("SessionManager.Login with username %q", connection.Username)
139+
return m.Login(ctx, neturl.UserPassword(connection.Username, connection.Password))
140+
}
141+
142+
klog.V(3).Infof("SessionManager.LoginByToken with certificate %q", connection.Username)
143+
129144
header := soap.Header{Security: signer}
130145

131146
return m.LoginByToken(client.WithHeader(ctx, header))

pkg/cloudprovider/providers/vsphere/vsphere.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import (
3838
"github.com/vmware/govmomi/vapi/tags"
3939
"github.com/vmware/govmomi/vim25/mo"
4040
vmwaretypes "github.com/vmware/govmomi/vim25/types"
41-
"k8s.io/api/core/v1"
41+
v1 "k8s.io/api/core/v1"
4242
k8stypes "k8s.io/apimachinery/pkg/types"
4343
"k8s.io/apimachinery/pkg/util/sets"
4444
"k8s.io/client-go/informers"
@@ -1432,10 +1432,20 @@ func (vs *VSphere) NodeManager() (nodeManager *NodeManager) {
14321432

14331433
func withTagsClient(ctx context.Context, connection *vclib.VSphereConnection, f func(c *rest.Client) error) error {
14341434
c := rest.NewClient(connection.Client)
1435-
user := url.UserPassword(connection.Username, connection.Password)
1436-
if err := c.Login(ctx, user); err != nil {
1435+
signer, err := connection.Signer(ctx, connection.Client)
1436+
if err != nil {
14371437
return err
14381438
}
1439+
if signer == nil {
1440+
user := url.UserPassword(connection.Username, connection.Password)
1441+
err = c.Login(ctx, user)
1442+
} else {
1443+
err = c.LoginByToken(c.WithSigner(ctx, signer))
1444+
}
1445+
if err != nil {
1446+
return err
1447+
}
1448+
14391449
defer func() {
14401450
if err := c.Logout(ctx); err != nil {
14411451
klog.Errorf("failed to logout: %v", err)

pkg/cloudprovider/providers/vsphere/vsphere_test.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"crypto/x509"
2323
"io/ioutil"
2424
"log"
25+
"net/url"
2526
"os"
2627
"reflect"
2728
"sort"
@@ -40,7 +41,7 @@ import (
4041
"github.com/vmware/govmomi/vapi/tags"
4142
"github.com/vmware/govmomi/vim25/mo"
4243
vmwaretypes "github.com/vmware/govmomi/vim25/types"
43-
"k8s.io/api/core/v1"
44+
v1 "k8s.io/api/core/v1"
4445
"k8s.io/apimachinery/pkg/types"
4546
"k8s.io/apimachinery/pkg/util/rand"
4647
cloudprovider "k8s.io/cloud-provider"
@@ -343,6 +344,10 @@ func TestZones(t *testing.T) {
343344
cfg, cleanup := configFromSim()
344345
defer cleanup()
345346

347+
// Configure for SAML token auth
348+
cfg.Global.User = localhostCert
349+
cfg.Global.Password = localhostKey
350+
346351
// Create vSphere configuration object
347352
vs, err := newControllerNode(cfg)
348353
if err != nil {
@@ -381,6 +386,13 @@ func TestZones(t *testing.T) {
381386

382387
// Tag manager instance
383388
m := tags.NewManager(rest.NewClient(vsi.conn.Client))
389+
signer, err := vsi.conn.Signer(ctx, vsi.conn.Client)
390+
if err != nil {
391+
t.Fatal(err)
392+
}
393+
if err = m.LoginByToken(m.WithSigner(ctx, signer)); err != nil {
394+
t.Fatal(err)
395+
}
384396

385397
// Create a region category
386398
regionID, err := m.CreateCategory(ctx, &tags.Category{Name: vs.cfg.Labels.Region})
@@ -560,6 +572,10 @@ func TestGetZoneToHosts(t *testing.T) {
560572

561573
// Tag manager instance
562574
m := tags.NewManager(rest.NewClient(vsi.conn.Client))
575+
user := url.UserPassword(vsi.conn.Username, vsi.conn.Password)
576+
if err = m.Login(ctx, user); err != nil {
577+
t.Fatal(err)
578+
}
563579

564580
// Create a region category
565581
regionCat, err := m.CreateCategory(ctx, &tags.Category{Name: vs.cfg.Labels.Region})

vendor/github.com/vmware/govmomi/.gitignore

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

0 commit comments

Comments
 (0)