compose/azure/convert/registrycredentials_test.go

193 lines
6.1 KiB
Go

package convert
import (
"strconv"
"github.com/Azure/go-autorest/autorest/to"
"github.com/compose-spec/compose-go/types"
cliconfigtypes "github.com/docker/cli/cli/config/types"
"github.com/docker/api/compose"
"github.com/Azure/azure-sdk-for-go/profiles/latest/containerinstance/mgmt/containerinstance"
"testing"
. "github.com/onsi/gomega"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/suite"
)
const getAllCredentials = "getAllRegistryCredentials"
type RegistryConvertTestSuite struct {
suite.Suite
loader *MockRegistryLoader
}
func (suite *RegistryConvertTestSuite) BeforeTest(suiteName, testName string) {
suite.loader = &MockRegistryLoader{}
}
func (suite *RegistryConvertTestSuite) TestHubPrivateImage() {
suite.loader.On(getAllCredentials).Return(registry("https://index.docker.io", userPwdCreds("toto", "pwd")), nil)
creds, err := getRegistryCredentials(composeServices("gtardif/privateimg"), suite.loader)
Expect(err).To(BeNil())
Expect(creds).To(Equal([]containerinstance.ImageRegistryCredential{
{
Server: to.StringPtr(dockerHub),
Username: to.StringPtr("toto"),
Password: to.StringPtr("pwd"),
},
}))
}
func (suite *RegistryConvertTestSuite) TestRegistryNameWithoutProtocol() {
suite.loader.On(getAllCredentials).Return(registry("index.docker.io", userPwdCreds("toto", "pwd")), nil)
creds, err := getRegistryCredentials(composeServices("gtardif/privateimg"), suite.loader)
Expect(err).To(BeNil())
Expect(creds).To(Equal([]containerinstance.ImageRegistryCredential{
{
Server: to.StringPtr(dockerHub),
Username: to.StringPtr("toto"),
Password: to.StringPtr("pwd"),
},
}))
}
func (suite *RegistryConvertTestSuite) TestImageWithDotInName() {
suite.loader.On(getAllCredentials).Return(registry("index.docker.io", userPwdCreds("toto", "pwd")), nil)
creds, err := getRegistryCredentials(composeServices("my.image"), suite.loader)
Expect(err).To(BeNil())
Expect(creds).To(Equal([]containerinstance.ImageRegistryCredential{
{
Server: to.StringPtr(dockerHub),
Username: to.StringPtr("toto"),
Password: to.StringPtr("pwd"),
},
}))
}
func (suite *RegistryConvertTestSuite) TestAcrPrivateImage() {
suite.loader.On(getAllCredentials).Return(registry("https://mycontainerregistrygta.azurecr.io", tokenCreds("123456")), nil)
creds, err := getRegistryCredentials(composeServices("mycontainerregistrygta.azurecr.io/privateimg"), suite.loader)
Expect(err).To(BeNil())
Expect(creds).To(Equal([]containerinstance.ImageRegistryCredential{
{
Server: to.StringPtr("mycontainerregistrygta.azurecr.io"),
Username: to.StringPtr(tokenUsername),
Password: to.StringPtr("123456"),
},
}))
}
func (suite *RegistryConvertTestSuite) TestNoMoreRegistriesThanImages() {
configs := map[string]cliconfigtypes.AuthConfig{
"https://mycontainerregistrygta.azurecr.io": tokenCreds("123456"),
"https://index.docker.io": userPwdCreds("toto", "pwd"),
}
suite.loader.On(getAllCredentials).Return(configs, nil)
creds, err := getRegistryCredentials(composeServices("mycontainerregistrygta.azurecr.io/privateimg"), suite.loader)
Expect(err).To(BeNil())
Expect(creds).To(Equal([]containerinstance.ImageRegistryCredential{
{
Server: to.StringPtr("mycontainerregistrygta.azurecr.io"),
Username: to.StringPtr(tokenUsername),
Password: to.StringPtr("123456"),
},
}))
creds, err = getRegistryCredentials(composeServices("someuser/privateimg"), suite.loader)
Expect(err).To(BeNil())
Expect(creds).To(Equal([]containerinstance.ImageRegistryCredential{
{
Server: to.StringPtr(dockerHub),
Username: to.StringPtr("toto"),
Password: to.StringPtr("pwd"),
},
}))
}
func (suite *RegistryConvertTestSuite) TestHubAndSeveralACRRegistries() {
configs := map[string]cliconfigtypes.AuthConfig{
"https://mycontainerregistry1.azurecr.io": tokenCreds("123456"),
"https://mycontainerregistry2.azurecr.io": tokenCreds("456789"),
"https://mycontainerregistry3.azurecr.io": tokenCreds("123456789"),
"https://index.docker.io": userPwdCreds("toto", "pwd"),
"https://other.registry.io": userPwdCreds("user", "password"),
}
suite.loader.On(getAllCredentials).Return(configs, nil)
creds, err := getRegistryCredentials(composeServices("mycontainerregistry1.azurecr.io/privateimg", "someuser/privateImg2", "mycontainerregistry2.azurecr.io/privateimg"), suite.loader)
Expect(err).To(BeNil())
Expect(creds).To(ContainElement(containerinstance.ImageRegistryCredential{
Server: to.StringPtr("mycontainerregistry1.azurecr.io"),
Username: to.StringPtr(tokenUsername),
Password: to.StringPtr("123456"),
}))
Expect(creds).To(ContainElement(containerinstance.ImageRegistryCredential{
Server: to.StringPtr("mycontainerregistry2.azurecr.io"),
Username: to.StringPtr(tokenUsername),
Password: to.StringPtr("456789"),
}))
Expect(creds).To(ContainElement(containerinstance.ImageRegistryCredential{
Server: to.StringPtr(dockerHub),
Username: to.StringPtr("toto"),
Password: to.StringPtr("pwd"),
}))
}
func composeServices(images ...string) compose.Project {
var services []types.ServiceConfig
for index, name := range images {
service := types.ServiceConfig{
Name: "service" + strconv.Itoa(index),
Image: name,
}
services = append(services, service)
}
return compose.Project{
Config: types.Config{
Services: services,
},
}
}
func registry(host string, configregistryData cliconfigtypes.AuthConfig) map[string]cliconfigtypes.AuthConfig {
return map[string]cliconfigtypes.AuthConfig{
host: configregistryData,
}
}
func userPwdCreds(user string, password string) cliconfigtypes.AuthConfig {
return cliconfigtypes.AuthConfig{
Username: user,
Password: password,
}
}
func tokenCreds(token string) cliconfigtypes.AuthConfig {
return cliconfigtypes.AuthConfig{
IdentityToken: token,
}
}
func TestRegistryConvertTestSuite(t *testing.T) {
RegisterTestingT(t)
suite.Run(t, new(RegistryConvertTestSuite))
}
type MockRegistryLoader struct {
mock.Mock
}
func (s *MockRegistryLoader) getAllRegistryCredentials() (map[string]cliconfigtypes.AuthConfig, error) {
args := s.Called()
return args.Get(0).(map[string]cliconfigtypes.AuthConfig), args.Error(1)
}