33package cleaner
44
55import (
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
0 commit comments