Skip to content

Commit dcd1167

Browse files
authored
Fix repository.Manager unit tests (#20)
Follow up to #19 Description of changes: - Fix `repository.Manager` unit tests By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 756060b commit dcd1167

File tree

6 files changed

+71
-48
lines changed

6 files changed

+71
-48
lines changed

cmd/ackdev/cmd/add_repo.go

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,24 @@
1414
package cmd
1515

1616
import (
17-
"errors"
1817
"fmt"
1918
"strings"
2019

20+
"github.com/spf13/cobra"
21+
2122
"github.com/aws-controllers-k8s/dev-tools/pkg/config"
2223
"github.com/aws-controllers-k8s/dev-tools/pkg/repository"
2324
"github.com/aws-controllers-k8s/dev-tools/pkg/util"
24-
"github.com/spf13/cobra"
2525
)
2626

2727
var (
28-
ErrRepositoryAlreadyAdded = errors.New("repository has already been added")
28+
optAddRepoType string
2929
)
3030

31+
func init() {
32+
addRepositoryCmd.PersistentFlags().StringVarP(&optAddRepoType, "type", "t", "controller", "repository type")
33+
}
34+
3135
var addRepositoryCmd = &cobra.Command{
3236
Use: "repository <service> ...",
3337
Aliases: []string{"repo", "repos", "repository", "repositories"},
@@ -36,33 +40,39 @@ var addRepositoryCmd = &cobra.Command{
3640
}
3741

3842
func addRepository(cmd *cobra.Command, args []string) error {
39-
for _, service := range args {
40-
service = strings.ToLower(args[0])
43+
cfg, err := config.Load(ackConfigPath)
44+
if err != nil {
45+
return err
46+
}
4147

42-
ctx := cmd.Context()
48+
repoManager, err := repository.NewManager(cfg)
49+
if err != nil {
50+
return err
51+
}
4352

44-
cfg, err := config.Load(ackConfigPath)
45-
if err != nil {
46-
return err
47-
}
53+
for _, service := range args {
54+
service = strings.ToLower(service)
4855

4956
// Check it doesn't already exist in the configuration
5057
if util.InStrings(service, cfg.Repositories.Services) {
51-
return ErrRepositoryAlreadyAdded
58+
fmt.Printf("repository for service %s has already been added\n", service)
59+
continue
5260
}
5361

54-
repoManager, err := repository.NewManager(cfg)
62+
_, err := repoManager.AddRepository(service, repository.GetRepositoryTypeFromString(optAddRepoType))
5563
if err != nil {
5664
return err
5765
}
5866

59-
serviceRepoName := fmt.Sprintf("%s-controller", service)
60-
if err := repoManager.EnsureRepository(ctx, serviceRepoName); err != nil {
67+
ctx := cmd.Context()
68+
if err := repoManager.EnsureRepository(ctx, service); err != nil {
6169
return err
6270
}
6371

6472
cfg.Repositories.Services = append(cfg.Repositories.Services, service)
65-
config.Save(cfg, ackConfigPath)
73+
if err := config.Save(cfg, ackConfigPath); err != nil {
74+
return err
75+
}
6676
}
6777

6878
return nil

pkg/repository/filter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func NamePrefixFilter(namePrefix string) Filter {
8282
// The only two possible types are 'controller' and 'core'
8383
func TypeFilter(t string) Filter {
8484
return func(r *Repository) bool {
85-
return r.Type == repositoryTypeFromString(t)
85+
return r.Type == GetRepositoryTypeFromString(t)
8686
}
8787
}
8888

pkg/repository/manager.go

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/aws-controllers-k8s/dev-tools/pkg/config"
3030
ackdevgit "github.com/aws-controllers-k8s/dev-tools/pkg/git"
3131
"github.com/aws-controllers-k8s/dev-tools/pkg/github"
32+
"github.com/aws-controllers-k8s/dev-tools/pkg/util"
3233
)
3334

3435
const (
@@ -89,26 +90,42 @@ type Manager struct {
8990
}
9091

9192
// LoadRepository loads information about a single local repository
92-
func (m *Manager) LoadRepository(name string) (*Repository, error) {
93+
func (m *Manager) LoadRepository(name string, t RepositoryType) (*Repository, error) {
9394
// check repo cache
9495
repo, err := m.getRepository(name)
9596
if err == nil {
9697
return repo, nil
9798
}
9899

99-
repoName := name
100+
switch t {
101+
case RepositoryTypeCore:
102+
if !util.InStrings(name, m.cfg.Repositories.Core) {
103+
return nil, ErrUnconfiguredRepository
104+
}
105+
case RepositoryTypeController:
106+
if !util.InStrings(name, m.cfg.Repositories.Services) {
107+
return nil, ErrUnconfiguredRepository
108+
}
109+
}
110+
111+
return m.AddRepository(name, t)
112+
}
113+
114+
// AddRepository creates a new Repository object and adds it to the cache.
115+
func (m *Manager) AddRepository(name string, t RepositoryType) (*Repository, error) {
116+
repo := NewRepository(name, t)
100117

101118
// set expected fork name
102-
expectedForkName := repoName
119+
expectedForkName := repo.Name
103120
if m.cfg.Github.ForkPrefix != "" {
104-
expectedForkName = fmt.Sprintf("%s%s", m.cfg.Github.ForkPrefix, repoName)
121+
expectedForkName = fmt.Sprintf("%s%s", m.cfg.Github.ForkPrefix, repo.Name)
105122
}
106123

107124
var gitHead string
108125
var gitRepo *git.Repository
109-
fullPath := filepath.Join(m.cfg.RootDirectory, repoName)
126+
fullPath := filepath.Join(m.cfg.RootDirectory, repo.Name)
110127

111-
gitRepo, err = m.git.Open(fullPath)
128+
gitRepo, err := m.git.Open(fullPath)
112129
if err != nil && err != git.ErrRepositoryNotExists {
113130
return nil, err
114131
} else if err == nil {
@@ -120,20 +137,10 @@ func (m *Manager) LoadRepository(name string) (*Repository, error) {
120137
gitHead = head.Name().Short()
121138
}
122139

123-
t := RepositoryTypeCore
124-
if strings.HasSuffix(name, "-controller") {
125-
t = RepositoryTypeController
126-
}
127-
128-
repo = &Repository{
129-
Name: repoName,
130-
Type: t,
131-
gitRepo: gitRepo,
132-
GitHead: gitHead,
133-
FullPath: fullPath,
134-
ExpectedForkName: expectedForkName,
135-
}
136-
140+
repo.gitRepo = gitRepo
141+
repo.GitHead = gitHead
142+
repo.FullPath = fullPath
143+
repo.ExpectedForkName = expectedForkName
137144
// cache repository
138145
m.repoCache[name] = repo
139146
return repo, nil
@@ -144,14 +151,14 @@ func (m *Manager) LoadRepository(name string) (*Repository, error) {
144151
func (m *Manager) LoadAll() error {
145152
// collect repositories from config
146153
for _, coreRepo := range m.cfg.Repositories.Core {
147-
_, err := m.LoadRepository(coreRepo)
154+
_, err := m.LoadRepository(coreRepo, RepositoryTypeCore)
148155
if err != nil {
149156
return err
150157
}
151158
}
152159
for _, serviceName := range m.cfg.Repositories.Services {
153160
serviceRepoName := fmt.Sprintf("%s-controller", serviceName)
154-
_, err := m.LoadRepository(serviceRepoName)
161+
_, err := m.LoadRepository(serviceRepoName, RepositoryTypeController)
155162
if err != nil {
156163
return err
157164
}
@@ -174,7 +181,7 @@ func (m *Manager) List(filters ...Filter) []*Repository {
174181
repoNames := append(m.cfg.Repositories.Core, m.cfg.Repositories.Services...)
175182
mainLoop:
176183
for _, repoName := range repoNames {
177-
repo, err := m.LoadRepository(repoName)
184+
repo, err := m.getRepository(repoName)
178185
if err != nil {
179186
continue
180187
}
@@ -190,7 +197,10 @@ mainLoop:
190197

191198
// Clone clones a known repository to the config root directory
192199
func (m *Manager) clone(ctx context.Context, repoName string) error {
193-
repo, err := m.LoadRepository(repoName)
200+
// TODO(a-hilaly) ideally we need to store all repository names (service name, fork name,
201+
// local clone name etc...)
202+
repoName = strings.TrimSuffix(repoName, "-controller")
203+
repo, err := m.getRepository(repoName)
194204
if err != nil {
195205
return fmt.Errorf("cannot clone repository %s: %v", repoName, err)
196206
}
@@ -277,7 +287,7 @@ func (m *Manager) EnsureClone(ctx context.Context, repo *Repository) error {
277287
// EnsureRepository ensures the current user owns a fork of the given repository
278288
// and has cloned it.
279289
func (m *Manager) EnsureRepository(ctx context.Context, name string) error {
280-
repo, err := m.LoadRepository(name)
290+
repo, err := m.getRepository(name)
281291
if err != nil && err != ErrRepositoryDoesntExist {
282292
return err
283293
}

pkg/repository/manager_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func TestManager_LoadAll(t *testing.T) {
164164
git: fakeGit,
165165
repoCache: make(map[string]*Repository),
166166
},
167-
wantErr: false,
167+
wantErr: true,
168168
},
169169
{
170170
name: "unexpected repository error",
@@ -210,19 +210,19 @@ func TestManager_clone(t *testing.T) {
210210
"Clone",
211211
testingCtx,
212212
"https://github.com/ack-bot/ack-ecr-controller.git",
213-
"ack-ecr-controller",
213+
"ecr-controller",
214214
).Return(transport.ErrAuthenticationRequired)
215215
fakeGit.On(
216216
"Clone",
217217
testingCtx,
218218
"https://github.com/ack-bot/ack-mq-controller.git",
219-
"ack-mq-controller",
219+
"mq-controller",
220220
).Return(gitconfig.ErrRemoteConfigNotFound)
221221
fakeGit.On(
222222
"Clone",
223223
testingCtx,
224224
"https://github.com/ack-bot/ack-sagemaker-controller.git",
225-
"ack-sagemaker-controller",
225+
"sagemaker-controller",
226226
).Return(nil)
227227

228228
type fields struct {

pkg/repository/repository.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ import (
2121

2222
// NewRepository returns a pointer to a new repository.
2323
func NewRepository(name string, repoType RepositoryType) *Repository {
24+
if repoType == RepositoryTypeController {
25+
name = fmt.Sprintf("%s-controller", name)
26+
}
2427
return &Repository{
2528
Name: name,
2629
Type: repoType,

pkg/repository/type.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ func (rt RepositoryType) String() string {
3636
}
3737
}
3838

39-
// repositoryTypeFromString casts a string to a RepositoryType
40-
func repositoryTypeFromString(s string) RepositoryType {
39+
// GetRepositoryTypeFromString casts a string to a RepositoryType
40+
func GetRepositoryTypeFromString(s string) RepositoryType {
4141
switch s {
4242
case "core":
4343
return RepositoryTypeCore
4444
case "controller":
4545
return RepositoryTypeController
4646
default:
47-
panic("unsupported repository type")
47+
panic("unsupported repository type: " + s)
4848
}
4949
}

0 commit comments

Comments
 (0)