Skip to content

Commit 0aed926

Browse files
authored
Merge pull request #111 from weaveworks/handle-404-git-empty
Handle empty artifacts in directory processing.
2 parents 2dfb9be + cbc34da commit 0aed926

File tree

4 files changed

+77
-49
lines changed

4 files changed

+77
-49
lines changed

controllers/templates/generators/gitrepository/git_repository.go

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -64,45 +64,31 @@ func (g *GitRepositoryGenerator) Generate(ctx context.Context, sg *templatesv1.G
6464
}
6565

6666
func (g *GitRepositoryGenerator) generateParamsFromGitFiles(ctx context.Context, sg *templatesv1.GitOpsSetGenerator, ks *templatesv1.GitOpsSet) ([]map[string]any, error) {
67-
var gr sourcev1.GitRepository
68-
repoName := client.ObjectKey{Name: sg.GitRepository.RepositoryRef, Namespace: ks.GetNamespace()}
69-
if err := g.Client.Get(ctx, repoName, &gr); err != nil {
70-
return nil, fmt.Errorf("could not load GitRepository: %w", err)
71-
}
72-
73-
// No artifact? nothing to generate...
74-
if gr.Status.Artifact == nil {
75-
g.Logger.Info("GitRepository does not have an artifact", "repository", repoName)
76-
return nil, generators.ArtifactError("GitRepository", repoName)
67+
repo, err := g.loadGitRepository(ctx, sg.GitRepository, ks)
68+
if err != nil {
69+
return nil, err
7770
}
7871

79-
g.Logger.Info("fetching archive URL", "repoURL", gr.Spec.URL, "artifactURL", gr.Status.Artifact.URL,
80-
"digest", gr.Status.Artifact.Digest, "revision", gr.Status.Artifact.Revision)
72+
g.Logger.Info("fetching archive URL", "repoURL", repo.Spec.URL, "artifactURL", repo.Status.Artifact.URL,
73+
"digest", repo.Status.Artifact.Digest, "revision", repo.Status.Artifact.Revision)
8174

8275
parser := parser.NewRepositoryParser(g.Logger, g.Fetcher)
8376

84-
return parser.GenerateFromFiles(ctx, gr.Status.Artifact.URL, gr.Status.Artifact.Digest, sg.GitRepository.Files)
77+
return parser.GenerateFromFiles(ctx, repo.Status.Artifact.URL, repo.Status.Artifact.Digest, sg.GitRepository.Files)
8578
}
8679

8780
func (g *GitRepositoryGenerator) generateParamsFromGitDirectories(ctx context.Context, sg *templatesv1.GitOpsSetGenerator, ks *templatesv1.GitOpsSet) ([]map[string]any, error) {
88-
var gr sourcev1.GitRepository
89-
repoName := client.ObjectKey{Name: sg.GitRepository.RepositoryRef, Namespace: ks.GetNamespace()}
90-
if err := g.Client.Get(ctx, repoName, &gr); err != nil {
91-
return nil, fmt.Errorf("could not load GitRepository: %w", err)
81+
repo, err := g.loadGitRepository(ctx, sg.GitRepository, ks)
82+
if err != nil {
83+
return nil, err
9284
}
9385

94-
// No artifact? nothing to generate...
95-
if gr.Status.Artifact == nil {
96-
g.Logger.Info("GitRepository does not have an artifact", "repository", repoName)
97-
return []map[string]any{}, nil
98-
}
99-
100-
g.Logger.Info("fetching archive URL", "repoURL", gr.Spec.URL, "artifactURL", gr.Status.Artifact.URL,
101-
"digest", gr.Status.Artifact.Digest, "revision", gr.Status.Artifact.Revision)
86+
g.Logger.Info("fetching archive URL", "repoURL", repo.Spec.URL, "artifactURL", repo.Status.Artifact.URL,
87+
"digest", repo.Status.Artifact.Digest, "revision", repo.Status.Artifact.Revision)
10288

10389
parser := parser.NewRepositoryParser(g.Logger, g.Fetcher)
10490

105-
return parser.GenerateFromDirectories(ctx, gr.Status.Artifact.URL, gr.Status.Artifact.Digest, sg.GitRepository.Directories)
91+
return parser.GenerateFromDirectories(ctx, repo.Status.Artifact.URL, repo.Status.Artifact.Digest, sg.GitRepository.Directories)
10692
}
10793

10894
// Interval is an implementation of the Generator interface.
@@ -111,3 +97,20 @@ func (g *GitRepositoryGenerator) generateParamsFromGitDirectories(ctx context.Co
11197
func (g *GitRepositoryGenerator) Interval(sg *templatesv1.GitOpsSetGenerator) time.Duration {
11298
return generators.NoRequeueInterval
11399
}
100+
101+
func (g *GitRepositoryGenerator) loadGitRepository(ctx context.Context, gen *templatesv1.GitRepositoryGenerator, ks *templatesv1.GitOpsSet) (*sourcev1.GitRepository, error) {
102+
repoName := client.ObjectKey{Name: gen.RepositoryRef, Namespace: ks.GetNamespace()}
103+
104+
var gr sourcev1.GitRepository
105+
if err := g.Client.Get(ctx, repoName, &gr); err != nil {
106+
return nil, fmt.Errorf("could not load GitRepository: %w", err)
107+
}
108+
109+
// No artifact? nothing to generate...
110+
if gr.Status.Artifact == nil {
111+
g.Logger.Info("GitRepository does not have an artifact", "repository", repoName)
112+
return nil, generators.ArtifactError("GitRepository", repoName)
113+
}
114+
115+
return &gr, nil
116+
}

controllers/templates/generators/gitrepository/git_repository_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,17 @@ func TestGenerate_errors(t *testing.T) {
161161
objects: []runtime.Object{test.NewGitRepository()},
162162
wantErr: "no artifact for GitRepository default/test-repository",
163163
},
164+
{
165+
name: "no artifact in GitRepository with dirs",
166+
generator: &templatesv1.GitRepositoryGenerator{
167+
RepositoryRef: "test-repository",
168+
Directories: []templatesv1.RepositoryGeneratorDirectoryItem{
169+
{Path: "applications/*"},
170+
},
171+
},
172+
objects: []runtime.Object{test.NewGitRepository()},
173+
wantErr: "no artifact for GitRepository default/test-repository",
174+
},
164175
}
165176

166177
for _, tt := range testCases {

controllers/templates/generators/ocirepository/oci_repository.go

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -64,45 +64,48 @@ func (g *OCIRepositoryGenerator) Generate(ctx context.Context, sg *templatesv1.G
6464
}
6565

6666
func (g *OCIRepositoryGenerator) generateParamsFromOCIFiles(ctx context.Context, sg *templatesv1.GitOpsSetGenerator, ks *templatesv1.GitOpsSet) ([]map[string]any, error) {
67-
var gr sourcev1.OCIRepository
68-
repoName := client.ObjectKey{Name: sg.OCIRepository.RepositoryRef, Namespace: ks.GetNamespace()}
69-
if err := g.Client.Get(ctx, repoName, &gr); err != nil {
70-
return nil, fmt.Errorf("could not load OCIRepository: %w", err)
67+
repo, err := g.loadOCIRepository(ctx, sg.OCIRepository, ks)
68+
if err != nil {
69+
return nil, err
7170
}
7271

73-
// No artifact? nothing to generate...
74-
if gr.Status.Artifact == nil {
75-
g.Logger.Info("OCIRepository does not have an artifact", "repository", repoName)
76-
return nil, generators.ArtifactError("OCIRepository", repoName)
72+
g.Logger.Info("fetching archive URL", "repoURL", repo.Spec.URL, "artifactURL", repo.Status.Artifact.URL,
73+
"digest", repo.Status.Artifact.Digest, "revision", repo.Status.Artifact.Revision)
74+
75+
parser := parser.NewRepositoryParser(g.Logger, g.Fetcher)
76+
77+
return parser.GenerateFromFiles(ctx, repo.Status.Artifact.URL, repo.Status.Artifact.Digest, sg.OCIRepository.Files)
78+
}
79+
80+
func (g *OCIRepositoryGenerator) generateParamsFromOCIDirectories(ctx context.Context, sg *templatesv1.GitOpsSetGenerator, ks *templatesv1.GitOpsSet) ([]map[string]any, error) {
81+
repo, err := g.loadOCIRepository(ctx, sg.OCIRepository, ks)
82+
if err != nil {
83+
return nil, err
7784
}
7885

79-
g.Logger.Info("fetching archive URL", "repoURL", gr.Spec.URL, "artifactURL", gr.Status.Artifact.URL,
80-
"digest", gr.Status.Artifact.Digest, "revision", gr.Status.Artifact.Revision)
86+
g.Logger.Info("fetching archive URL", "repoURL", repo.Spec.URL, "artifactURL", repo.Status.Artifact.URL,
87+
"digest", repo.Status.Artifact.Digest, "revision", repo.Status.Artifact.Revision)
8188

8289
parser := parser.NewRepositoryParser(g.Logger, g.Fetcher)
8390

84-
return parser.GenerateFromFiles(ctx, gr.Status.Artifact.URL, gr.Status.Artifact.Digest, sg.OCIRepository.Files)
91+
return parser.GenerateFromDirectories(ctx, repo.Status.Artifact.URL, repo.Status.Artifact.Digest, sg.OCIRepository.Directories)
8592
}
8693

87-
func (g *OCIRepositoryGenerator) generateParamsFromOCIDirectories(ctx context.Context, sg *templatesv1.GitOpsSetGenerator, ks *templatesv1.GitOpsSet) ([]map[string]any, error) {
88-
var gr sourcev1.OCIRepository
89-
repoName := client.ObjectKey{Name: sg.OCIRepository.RepositoryRef, Namespace: ks.GetNamespace()}
90-
if err := g.Client.Get(ctx, repoName, &gr); err != nil {
94+
func (g *OCIRepositoryGenerator) loadOCIRepository(ctx context.Context, gen *templatesv1.OCIRepositoryGenerator, ks *templatesv1.GitOpsSet) (*sourcev1.OCIRepository, error) {
95+
repoName := client.ObjectKey{Name: gen.RepositoryRef, Namespace: ks.GetNamespace()}
96+
97+
var or sourcev1.OCIRepository
98+
if err := g.Client.Get(ctx, repoName, &or); err != nil {
9199
return nil, fmt.Errorf("could not load OCIRepository: %w", err)
92100
}
93101

94102
// No artifact? nothing to generate...
95-
if gr.Status.Artifact == nil {
103+
if or.Status.Artifact == nil {
96104
g.Logger.Info("OCIRepository does not have an artifact", "repository", repoName)
97-
return []map[string]any{}, nil
105+
return nil, generators.ArtifactError("OCIRepository", repoName)
98106
}
99107

100-
g.Logger.Info("fetching archive URL", "repoURL", gr.Spec.URL, "artifactURL", gr.Status.Artifact.URL,
101-
"digest", gr.Status.Artifact.Digest, "revision", gr.Status.Artifact.Revision)
102-
103-
parser := parser.NewRepositoryParser(g.Logger, g.Fetcher)
104-
105-
return parser.GenerateFromDirectories(ctx, gr.Status.Artifact.URL, gr.Status.Artifact.Digest, sg.OCIRepository.Directories)
108+
return &or, nil
106109
}
107110

108111
// Interval is an implementation of the Generator interface.

controllers/templates/generators/ocirepository/oci_repository_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,17 @@ func TestGenerate_errors(t *testing.T) {
161161
objects: []runtime.Object{newOCIRepository()},
162162
wantErr: "no artifact for OCIRepository default/test-repository",
163163
},
164+
{
165+
name: "no artifact in OCIRepository with dirs",
166+
generator: &templatesv1.OCIRepositoryGenerator{
167+
RepositoryRef: "test-repository",
168+
Directories: []templatesv1.RepositoryGeneratorDirectoryItem{
169+
{Path: "files/*"},
170+
},
171+
},
172+
objects: []runtime.Object{newOCIRepository()},
173+
wantErr: "no artifact for OCIRepository default/test-repository",
174+
},
164175
}
165176

166177
for _, tt := range testCases {

0 commit comments

Comments
 (0)