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  }