Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 6fdd3e9

Browse files
committed
adding cleanup method
1 parent f2a1360 commit 6fdd3e9

File tree

6 files changed

+285
-3
lines changed

6 files changed

+285
-3
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ CAPI_KIND_CLUSTER_NAME ?= capi-test
231231
# It is set by Prow GIT_TAG, a git-based tag of the form vYYYYMMDD-hash, e.g., v20210120-v0.3.10-308-gc61521971
232232

233233
# Next release is: v1.0.0-preview
234-
TAG ?= v1.0.0-preview.2
234+
TAG ?= v1.0.0-preview.5
235235
ARCH ?= $(shell go env GOARCH)
236236
ALL_ARCH = amd64 arm arm64
237237

config/default/manager_image_patch.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ spec:
77
template:
88
spec:
99
containers:
10-
- image: ghcr.io/patricklaabs/cluster-api-addon-provider-cdk8s/cluster-api-cdk8s-controller:v1.0.0-preview.1
10+
- image: ghcr.io/patricklaabs/cluster-api-addon-provider-cdk8s/cluster-api-cdk8s-controller:v1.0.0-preview.5
1111
name: manager

config/default/manager_image_patch.yaml-e

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ spec:
77
template:
88
spec:
99
containers:
10-
- image: ghcr.io/patricklaabs/cluster-api-addon-provider-cdk8s/cluster-api-cdk8s-controller:v1.0.0-preview.1
10+
- image: ghcr.io/patricklaabs/cluster-api-addon-provider-cdk8s/cluster-api-cdk8s-controller:v1.0.0-preview.5
1111
name: manager

controllers/cdk8sappproxy/cdk8sappproxy_reconciler.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ func (r *Reconciler) reconcileNormal(ctx context.Context, cdk8sAppProxy *addonsv
151151
logger.Error(err, "Prepare source for reconciliation")
152152
}
153153

154+
if err = gitImpl.CleanUp(appSourcePath, 1*time.Minute); err != nil {
155+
logger.Error(err, "Failed to clean up old git repository clone directory", "appSourcePath", appSourcePath)
156+
}
157+
154158
// Synthesize and parse resources
155159
_, err := r.synthesizeAndParseResources(appSourcePath, logger)
156160
if err != nil {

controllers/cdk8sappproxy/git/git.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@ import (
99
"github.com/go-git/go-git/v5/plumbing"
1010
"net/url"
1111
"os"
12+
"path/filepath"
13+
"strings"
14+
"time"
1215
)
1316

1417
// GitOperator defines the interface for git operations.
1518
type GitOperator interface {
1619
Clone(repoUrl string, writer *bytes.Buffer) (directory string, err error)
1720
Poll(repo string, branch string, directory string, writer *bytes.Buffer) (changes bool, err error)
1821
Hash(repo string, branch string) (hash string, err error)
22+
CleanUp(directory string, maxAge time.Duration) (err error)
1923
}
2024

2125
// GitImplementer implements the GitOperator interface.
@@ -134,6 +138,46 @@ func (g *GitImplementer) Hash(repo string, branch string) (hash string, err erro
134138
return hash, err
135139
}
136140

141+
// CleanUp removes the local directory if it is older than maxAge.
142+
func (g *GitImplementer) CleanUp(directory string, maxAge time.Duration) (err error) {
143+
tempDir := os.TempDir()
144+
145+
entries, err := os.ReadDir(tempDir)
146+
if err != nil {
147+
return fmt.Errorf("failed to read temporary directory: %v", err)
148+
}
149+
150+
for _, entry := range entries {
151+
if !entry.IsDir() {
152+
continue
153+
}
154+
155+
if !strings.HasPrefix(entry.Name(), "cdk8s-git-clone-") &&
156+
!strings.HasPrefix(entry.Name(), "jsii-runtime.") {
157+
continue
158+
}
159+
160+
fullPath := filepath.Join(tempDir, entry.Name())
161+
162+
if fullPath == directory {
163+
continue
164+
}
165+
166+
info, err := entry.Info()
167+
if err != nil {
168+
continue
169+
}
170+
171+
if time.Since(info.ModTime()) > maxAge {
172+
if err := os.RemoveAll(fullPath); err != nil {
173+
continue
174+
}
175+
}
176+
}
177+
178+
return err
179+
}
180+
137181
// isUrl checks if the given string is a valid URL.
138182
func isUrl(repo string) bool {
139183
if repo == "" {

controllers/cdk8sappproxy/git/git_test.go

Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,240 @@ func TestHash(t *testing.T) {
472472
})
473473
}
474474

475+
func TestCleanUp(t *testing.T) {
476+
gitImplementer := &GitImplementer{}
477+
478+
t.Run("cleanup old directories but preserve current", func(t *testing.T) {
479+
// Create old directories that should be cleaned up
480+
oldDir1, err := os.MkdirTemp("", "cdk8s-git-clone-")
481+
if err != nil {
482+
t.Fatalf("Failed to create temp dir: %v", err)
483+
}
484+
485+
oldDir2, err := os.MkdirTemp("", "cdk8s-git-clone-")
486+
if err != nil {
487+
t.Fatalf("Failed to create temp dir: %v", err)
488+
}
489+
490+
// Create current directory (should be preserved)
491+
currentDir, err := os.MkdirTemp("", "cdk8s-git-clone-")
492+
if err != nil {
493+
t.Fatalf("Failed to create temp dir: %v", err)
494+
}
495+
496+
// Age the old directories
497+
oldTime := time.Now().Add(-2 * time.Hour)
498+
if err := os.Chtimes(oldDir1, oldTime, oldTime); err != nil {
499+
t.Fatalf("Failed to change times for old dir 1: %v", err)
500+
}
501+
if err := os.Chtimes(oldDir2, oldTime, oldTime); err != nil {
502+
t.Fatalf("Failed to change times for old dir 2: %v", err)
503+
}
504+
505+
// Run cleanup with 1 hour max age
506+
err = gitImplementer.CleanUp(currentDir, 1*time.Hour)
507+
if err != nil {
508+
t.Errorf("CleanUp returned error: %v", err)
509+
}
510+
511+
// Verify old directories were removed
512+
if _, err := os.Stat(oldDir1); !os.IsNotExist(err) {
513+
t.Error("Old directory 1 should have been removed")
514+
os.RemoveAll(oldDir1) // cleanup
515+
}
516+
517+
if _, err := os.Stat(oldDir2); !os.IsNotExist(err) {
518+
t.Error("Old directory 2 should have been removed")
519+
os.RemoveAll(oldDir2) // cleanup
520+
}
521+
522+
// Verify current directory is preserved
523+
if _, err := os.Stat(currentDir); os.IsNotExist(err) {
524+
t.Error("Current directory should not have been removed")
525+
} else {
526+
os.RemoveAll(currentDir) // cleanup
527+
}
528+
})
529+
530+
t.Run("respects maxAge parameter", func(t *testing.T) {
531+
// Create recent directory that shouldn't be cleaned
532+
recentDir, err := os.MkdirTemp("", "cdk8s-git-clone-")
533+
if err != nil {
534+
t.Fatalf("Failed to create temp dir: %v", err)
535+
}
536+
defer os.RemoveAll(recentDir)
537+
538+
currentDir, err := os.MkdirTemp("", "cdk8s-git-clone-")
539+
if err != nil {
540+
t.Fatalf("Failed to create temp dir: %v", err)
541+
}
542+
defer os.RemoveAll(currentDir)
543+
544+
// Age the recent directory only slightly
545+
recentTime := time.Now().Add(-30 * time.Minute)
546+
if err := os.Chtimes(recentDir, recentTime, recentTime); err != nil {
547+
t.Fatalf("Failed to change times for recent dir: %v", err)
548+
}
549+
550+
// Run cleanup with 1 hour max age
551+
err = gitImplementer.CleanUp(currentDir, 1*time.Hour)
552+
if err != nil {
553+
t.Errorf("CleanUp returned error: %v", err)
554+
}
555+
556+
// Recent directory should still exist
557+
if _, err := os.Stat(recentDir); os.IsNotExist(err) {
558+
t.Error("Recent directory should not have been removed")
559+
}
560+
})
561+
562+
t.Run("ignores non-matching directories", func(t *testing.T) {
563+
// Create directory with different prefix
564+
otherDir, err := os.MkdirTemp("", "other-prefix-")
565+
if err != nil {
566+
t.Fatalf("Failed to create temp dir: %v", err)
567+
}
568+
defer os.RemoveAll(otherDir)
569+
570+
currentDir, err := os.MkdirTemp("", "cdk8s-git-clone-")
571+
if err != nil {
572+
t.Fatalf("Failed to create temp dir: %v", err)
573+
}
574+
defer os.RemoveAll(currentDir)
575+
576+
// Age the other directory
577+
oldTime := time.Now().Add(-2 * time.Hour)
578+
if err := os.Chtimes(otherDir, oldTime, oldTime); err != nil {
579+
t.Fatalf("Failed to change times for other dir: %v", err)
580+
}
581+
582+
// Run cleanup
583+
err = gitImplementer.CleanUp(currentDir, 1*time.Hour)
584+
if err != nil {
585+
t.Errorf("CleanUp returned error: %v", err)
586+
}
587+
588+
// Other directory should still exist (different prefix)
589+
if _, err := os.Stat(otherDir); os.IsNotExist(err) {
590+
t.Error("Directory with different prefix should not have been removed")
591+
}
592+
})
593+
594+
t.Run("handles empty current directory parameter", func(t *testing.T) {
595+
// Create old directory
596+
oldDir, err := os.MkdirTemp("", "cdk8s-git-clone-")
597+
if err != nil {
598+
t.Fatalf("Failed to create temp dir: %v", err)
599+
}
600+
601+
// Age the directory
602+
oldTime := time.Now().Add(-2 * time.Hour)
603+
if err := os.Chtimes(oldDir, oldTime, oldTime); err != nil {
604+
t.Fatalf("Failed to change times for old dir: %v", err)
605+
}
606+
607+
// Run cleanup with empty current directory
608+
err = gitImplementer.CleanUp("", 1*time.Hour)
609+
if err != nil {
610+
t.Errorf("CleanUp returned error: %v", err)
611+
}
612+
613+
// Old directory should be removed since no current directory to preserve
614+
if _, err := os.Stat(oldDir); !os.IsNotExist(err) {
615+
t.Error("Old directory should have been removed when no current directory specified")
616+
os.RemoveAll(oldDir) // cleanup
617+
}
618+
})
619+
620+
t.Run("cleanup with zero max age removes all old directories", func(t *testing.T) {
621+
// Create multiple directories
622+
dirs := make([]string, 3)
623+
for i := 0; i < 3; i++ {
624+
dir, err := os.MkdirTemp("", "cdk8s-git-clone-")
625+
if err != nil {
626+
t.Fatalf("Failed to create temp dir: %v", err)
627+
}
628+
dirs[i] = dir
629+
}
630+
631+
currentDir := dirs[2] // Last one is current
632+
633+
// Age the first two directories slightly
634+
oldTime := time.Now().Add(-1 * time.Second)
635+
if err := os.Chtimes(dirs[0], oldTime, oldTime); err != nil {
636+
t.Fatalf("Failed to change times for dir 0: %v", err)
637+
}
638+
if err := os.Chtimes(dirs[1], oldTime, oldTime); err != nil {
639+
t.Fatalf("Failed to change times for dir 1: %v", err)
640+
}
641+
642+
// Run cleanup with zero max age
643+
err := gitImplementer.CleanUp(currentDir, 0)
644+
if err != nil {
645+
t.Errorf("CleanUp returned error: %v", err)
646+
}
647+
648+
// First two should be removed
649+
for i := 0; i < 2; i++ {
650+
if _, err := os.Stat(dirs[i]); !os.IsNotExist(err) {
651+
t.Errorf("Directory %d should have been removed", i)
652+
os.RemoveAll(dirs[i])
653+
}
654+
}
655+
656+
// Current should remain
657+
if _, err := os.Stat(currentDir); os.IsNotExist(err) {
658+
t.Error("Current directory should not have been removed")
659+
} else {
660+
os.RemoveAll(currentDir)
661+
}
662+
})
663+
664+
t.Run("handles directories with files inside", func(t *testing.T) {
665+
// Create directory with files (simulating actual git clone)
666+
oldDir, err := os.MkdirTemp("", "cdk8s-git-clone-")
667+
if err != nil {
668+
t.Fatalf("Failed to create temp dir: %v", err)
669+
}
670+
671+
// Create some files inside
672+
testFile := filepath.Join(oldDir, "test.txt")
673+
if err := os.WriteFile(testFile, []byte("test content"), 0644); err != nil {
674+
t.Fatalf("Failed to create test file: %v", err)
675+
}
676+
677+
// Create subdirectory
678+
subDir := filepath.Join(oldDir, "subdir")
679+
if err := os.Mkdir(subDir, 0755); err != nil {
680+
t.Fatalf("Failed to create subdirectory: %v", err)
681+
}
682+
683+
currentDir, err := os.MkdirTemp("", "cdk8s-git-clone-")
684+
if err != nil {
685+
t.Fatalf("Failed to create temp dir: %v", err)
686+
}
687+
defer os.RemoveAll(currentDir)
688+
689+
// Age the old directory
690+
oldTime := time.Now().Add(-2 * time.Hour)
691+
if err := os.Chtimes(oldDir, oldTime, oldTime); err != nil {
692+
t.Fatalf("Failed to change times for old dir: %v", err)
693+
}
694+
695+
// Run cleanup
696+
err = gitImplementer.CleanUp(currentDir, 1*time.Hour)
697+
if err != nil {
698+
t.Errorf("CleanUp returned error: %v", err)
699+
}
700+
701+
// Directory and all contents should be removed
702+
if _, err := os.Stat(oldDir); !os.IsNotExist(err) {
703+
t.Error("Directory with contents should have been removed")
704+
os.RemoveAll(oldDir) // cleanup
705+
}
706+
})
707+
}
708+
475709
func TestIsUrl(t *testing.T) {
476710
tests := []struct {
477711
name string

0 commit comments

Comments
 (0)