Skip to content

Commit ff0085e

Browse files
authored
Merge pull request #445 from Joshua-Anderson/object-store
feat(cleaner): delete from object store
2 parents 5233911 + bd97e3e commit ff0085e

3 files changed

Lines changed: 57 additions & 13 deletions

File tree

boot.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func main() {
8989
log.Printf("Starting deleted app cleaner")
9090
cleanerErrCh := make(chan error)
9191
go func() {
92-
if err := cleaner.Run(gitHomeDir, kubeClient.Namespaces(), fs, cnf.CleanerPollSleepDuration()); err != nil {
92+
if err := cleaner.Run(gitHomeDir, kubeClient.Namespaces(), fs, cnf.CleanerPollSleepDuration(), storageDriver); err != nil {
9393
cleanerErrCh <- err
9494
}
9595
}()

pkg/cleaner/cleaner.go

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,20 @@
33
package cleaner
44

55
import (
6+
"fmt"
67
"io/ioutil"
7-
"log"
88
"path/filepath"
9+
"regexp"
910
"strings"
1011
"time"
1112

12-
"k8s.io/kubernetes/pkg/api"
13-
13+
"github.com/deis/builder/pkg/gitreceive"
1414
"github.com/deis/builder/pkg/k8s"
1515
"github.com/deis/builder/pkg/sys"
16+
"github.com/deis/pkg/log"
17+
"github.com/docker/distribution/context"
18+
storagedriver "github.com/docker/distribution/registry/storage/driver"
19+
"k8s.io/kubernetes/pkg/api"
1620
"k8s.io/kubernetes/pkg/fields"
1721
"k8s.io/kubernetes/pkg/labels"
1822
)
@@ -80,19 +84,54 @@ func dirHasGitSuffix(dir string) bool {
8084
return strings.HasSuffix(dir, dotGitSuffix)
8185
}
8286

87+
func deleteFromObjectStore(app string, storageDriver storagedriver.StorageDriver) error {
88+
89+
cacheKey := fmt.Sprintf(gitreceive.CacheKeyPattern, app)
90+
91+
// if cache file exists, delete it
92+
if _, err := storageDriver.Stat(context.Background(), cacheKey); err == nil {
93+
log.Info("Cleaner deleting cache %s for app %s", cacheKey, app)
94+
if err := storageDriver.Delete(context.Background(), cacheKey); err != nil {
95+
return err
96+
}
97+
}
98+
99+
// delete all slug files matching app
100+
objs, err := storageDriver.List(context.Background(), "home")
101+
if err != nil {
102+
return err
103+
}
104+
105+
// regex needs prepended / to match output of List()
106+
gitRegex, err := regexp.Compile(`^/` + fmt.Sprintf(gitreceive.GitKeyPattern, app, ".{8}") + "$")
107+
if err != nil {
108+
return err
109+
}
110+
111+
for _, obj := range objs {
112+
if gitRegex.MatchString(obj) {
113+
log.Info("Cleaner deleting slug %s for app %s", obj, app)
114+
if err := storageDriver.Delete(context.Background(), obj); err != nil {
115+
return err
116+
}
117+
}
118+
}
119+
return nil
120+
}
121+
83122
// Run starts the deleted app cleaner. Every pollSleepDuration, it compares the result of nsLister.List with the directories in the top level of gitHome on the local file system.
84123
// On any error, it uses log messages to output a human readable description of what happened.
85-
func Run(gitHome string, nsLister k8s.NamespaceLister, fs sys.FS, pollSleepDuration time.Duration) error {
124+
func Run(gitHome string, nsLister k8s.NamespaceLister, fs sys.FS, pollSleepDuration time.Duration, storageDriver storagedriver.StorageDriver) error {
86125
for {
87126
nsList, err := nsLister.List(api.ListOptions{LabelSelector: labels.Everything(), FieldSelector: fields.Everything()})
88127
if err != nil {
89-
log.Printf("Cleaner error listing namespaces (%s)", err)
128+
log.Err("Cleaner error listing namespaces (%s)", err)
90129
continue
91130
}
92131

93132
gitDirs, err := localDirs(gitHome, dirHasGitSuffix)
94133
if err != nil {
95-
log.Printf("Cleaner error listing local git directories (%s)", err)
134+
log.Err("Cleaner error listing local git directories (%s)", err)
96135
continue
97136
}
98137

@@ -103,7 +142,10 @@ func Run(gitHome string, nsLister k8s.NamespaceLister, fs sys.FS, pollSleepDurat
103142
for _, appToDelete := range appsToDelete {
104143
dirToDelete := filepath.Join(gitHome, appToDelete+dotGitSuffix)
105144
if err := fs.RemoveAll(dirToDelete); err != nil {
106-
log.Printf("Cleaner error removing deleted app %s (%s)", dirToDelete, err)
145+
log.Err("Cleaner error removing local files for deleted app %s (%s)", dirToDelete, err)
146+
}
147+
if err := deleteFromObjectStore(appToDelete, storageDriver); err != nil {
148+
log.Err("Cleaner error removing object store files for deleted app %s (%s)", appToDelete, err)
107149
}
108150
}
109151

pkg/gitreceive/slug_builder_info.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import (
55
)
66

77
const (
8-
slugTGZName = "slug.tgz"
8+
slugTGZName = "slug.tgz"
9+
CacheKeyPattern = "home/%s/cache"
10+
GitKeyPattern = "home/%s:git-%s"
911
)
1012

1113
// SlugBuilderInfo contains all of the object storage related information needed to pass to a
@@ -19,12 +21,12 @@ type SlugBuilderInfo struct {
1921

2022
// NewSlugBuilderInfo creates and populates a new SlugBuilderInfo based on the given data
2123
func NewSlugBuilderInfo(appName string, shortSha string, disableCaching bool) *SlugBuilderInfo {
22-
slugName := fmt.Sprintf("%s:git-%s", appName, shortSha)
23-
tarKey := fmt.Sprintf("home/%s/tar", slugName)
24+
basePath := fmt.Sprintf(GitKeyPattern, appName, shortSha)
25+
tarKey := fmt.Sprintf("%s/tar", basePath)
2426
// this is where workflow tells slugrunner to download the slug from, so we have to tell slugbuilder to upload it to here
25-
pushKey := fmt.Sprintf("home/%s/push", slugName)
27+
pushKey := fmt.Sprintf("%s/push", basePath)
2628

27-
cacheKey := fmt.Sprintf("home/%s/cache", appName)
29+
cacheKey := fmt.Sprintf(CacheKeyPattern, appName)
2830

2931
return &SlugBuilderInfo{
3032
pushKey: pushKey,

0 commit comments

Comments
 (0)