github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/provider/openstack/client_test.go (about) 1 // Copyright 2020 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package openstack 5 6 import ( 7 "github.com/go-goose/goose/v5/client" 8 "github.com/go-goose/goose/v5/identity" 9 "github.com/juju/errors" 10 jc "github.com/juju/testing/checkers" 11 "go.uber.org/mock/gomock" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/cloud" 15 environscloudspec "github.com/juju/juju/environs/cloudspec" 16 "github.com/juju/juju/testing" 17 ) 18 19 type clientSuite struct { 20 testing.BaseSuite 21 } 22 23 var _ = gc.Suite(&clientSuite{}) 24 25 func (s *clientSuite) TestFactoryInit(c *gc.C) { 26 ctrl := gomock.NewController(c) 27 defer ctrl.Finish() 28 29 factory := s.setupMockFactory(ctrl, 1) 30 31 err := factory.Init() 32 c.Assert(err, jc.ErrorIsNil) 33 } 34 35 func (s *clientSuite) TestFactoryNova(c *gc.C) { 36 ctrl := gomock.NewController(c) 37 defer ctrl.Finish() 38 39 factory := s.setupMockFactory(ctrl, 1) 40 41 err := factory.Init() 42 c.Assert(err, jc.ErrorIsNil) 43 44 nova, err := factory.Nova() 45 c.Assert(err, jc.ErrorIsNil) 46 c.Assert(nova, gc.NotNil) 47 } 48 49 func (s *clientSuite) TestFactoryNeutron(c *gc.C) { 50 ctrl := gomock.NewController(c) 51 defer ctrl.Finish() 52 53 factory := s.setupMockFactory(ctrl, 2) 54 55 err := factory.Init() 56 c.Assert(err, jc.ErrorIsNil) 57 58 nova, err := factory.Neutron() 59 c.Assert(err, jc.ErrorIsNil) 60 c.Assert(nova, gc.NotNil) 61 } 62 63 func (s *clientSuite) TestFactoryAuthFallbackSuccess(c *gc.C) { 64 err := s.testFactoryAuthFallback(c, nil) 65 c.Assert(err, gc.IsNil) 66 } 67 68 func (s *clientSuite) TestFactoryAuthFallbackError(c *gc.C) { 69 err := s.testFactoryAuthFallback(c, errors.New("bad auth")) 70 c.Assert(err, gc.ErrorMatches, "bad auth") 71 } 72 73 func (s *clientSuite) testFactoryAuthFallback(c *gc.C, authErr error) error { 74 ctrl := gomock.NewController(c) 75 defer ctrl.Finish() 76 77 mockClient := NewMockAuthenticatingClient(ctrl) 78 mockClient.EXPECT().SetRequiredServiceTypes([]string{"compute"}).AnyTimes() 79 mockClient.EXPECT().IdentityAuthOptions().Return(identity.AuthOptions{ 80 { 81 Mode: identity.AuthUserPassV3, 82 Endpoint: "https://sharedhost.foo:443/identity/v3/", 83 }, 84 }, nil) 85 mockClient.EXPECT().Authenticate().Return(authErr) 86 87 mockConfig := NewMockSSLHostnameConfig(ctrl) 88 mockConfig.EXPECT().SSLHostnameVerification().Return(true).AnyTimes() 89 90 cred := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{ 91 CredAttrUserName: "admin", 92 CredAttrPassword: "password", 93 CredAttrProjectDomainName: "default", 94 CredAttrUserDomainName: "", 95 CredAttrDomainName: "default", 96 CredAttrVersion: "2", 97 }) 98 99 spec := environscloudspec.CloudSpec{ 100 Region: "default", 101 Endpoint: "https://sharedhost.foo:443/identity/v3/", 102 Credential: &cred, 103 } 104 105 factory := NewClientFactory(spec, mockConfig) 106 factory.clientFunc = makeClientFunc(mockClient) 107 108 return factory.Init() 109 } 110 111 func (s *clientSuite) setupMockFactory(ctrl *gomock.Controller, times int) *ClientFactory { 112 mockClient := NewMockAuthenticatingClient(ctrl) 113 mockClient.EXPECT().SetRequiredServiceTypes([]string{"compute"}).Times(times) 114 115 mockConfig := NewMockSSLHostnameConfig(ctrl) 116 mockConfig.EXPECT().SSLHostnameVerification().Return(true).Times(times) 117 118 cred := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{ 119 CredAttrUserName: "admin", 120 CredAttrPassword: "password", 121 CredAttrProjectDomainName: "default", 122 CredAttrUserDomainName: "", 123 CredAttrDomainName: "default", 124 CredAttrVersion: "3", 125 }) 126 127 spec := environscloudspec.CloudSpec{ 128 Region: "default", 129 Endpoint: "https://sharedhost.foo:443/identity/v3/", 130 Credential: &cred, 131 } 132 133 factory := NewClientFactory(spec, mockConfig) 134 factory.clientFunc = makeClientFunc(mockClient) 135 136 return factory 137 } 138 139 func makeClientFunc(mockClient *MockAuthenticatingClient) ClientFunc { 140 return func(identity.Credentials, identity.AuthMode, ...ClientOption) (client.AuthenticatingClient, error) { 141 return mockClient, nil 142 } 143 }