@@ -58,6 +58,29 @@ func (l *repoLayersPruner) Prune(ctx context.Context) error {
58
58
return nil
59
59
}
60
60
61
+ type repoPruner struct {
62
+ storageDriver driver.StorageDriver
63
+ name string
64
+ }
65
+
66
+ func (r * repoPruner ) Prune (ctx context.Context ) error {
67
+ if len (r .name ) == 0 {
68
+ return nil
69
+ }
70
+
71
+ logger := context .GetLogger (ctx )
72
+ vacuum := storage .NewVacuum (ctx , r .storageDriver )
73
+
74
+ logger .Debugln ("Removing %s repository" , r .name )
75
+ if err := vacuum .RemoveRepository (r .name ); err != nil {
76
+ return fmt .Errorf ("unable to remove the repository %s: %v" , r .name , err )
77
+ }
78
+
79
+ r .name = ""
80
+
81
+ return nil
82
+ }
83
+
61
84
// Prune removes blobs which are not used by Images in OpenShift.
62
85
//
63
86
// On error, the Summary will contain what was deleted so far.
@@ -107,13 +130,18 @@ func Prune(ctx context.Context, storageDriver driver.StorageDriver, registry dis
107
130
var stats Summary
108
131
109
132
layersPruner := & repoLayersPruner {}
133
+ repoPruner := & repoPruner {
134
+ storageDriver : storageDriver ,
135
+ }
110
136
111
- var reposToDelete []string
112
137
err = repositoryEnumerator .Enumerate (ctx , func (repoName string ) error {
113
138
if ! dryRun {
114
139
if err := layersPruner .Prune (ctx ); err != nil {
115
140
return err
116
141
}
142
+ if err := repoPruner .Prune (ctx ); err != nil {
143
+ return err
144
+ }
117
145
}
118
146
119
147
logger .Debugln ("Processing repository" , repoName )
@@ -132,8 +160,12 @@ func Prune(ctx context.Context, storageDriver driver.StorageDriver, registry dis
132
160
if kerrors .IsNotFound (err ) {
133
161
logger .Printf ("The image stream %s/%s is not found, will remove the whole repository" , ref .Namespace , ref .Name )
134
162
135
- // We cannot delete the repository at this point, because it would break Enumerate.
136
- reposToDelete = append (reposToDelete , repoName )
163
+ if ! dryRun {
164
+ // We cannot delete the repository at this point, because it would break Enumerate.
165
+ repoPruner .name = repoName
166
+ } else {
167
+ logger .Printf ("Would delete repository: %s" , repoName )
168
+ }
137
169
138
170
return nil
139
171
} else if err != nil {
@@ -190,21 +222,12 @@ func Prune(ctx context.Context, storageDriver driver.StorageDriver, registry dis
190
222
if err := layersPruner .Prune (ctx ); err != nil {
191
223
return stats , err
192
224
}
225
+ if err := repoPruner .Prune (ctx ); err != nil {
226
+ return stats , err
227
+ }
193
228
194
229
vacuum := storage .NewVacuum (ctx , storageDriver )
195
230
196
- logger .Debugln ("Removing repositories" )
197
- for _ , repoName := range reposToDelete {
198
- if dryRun {
199
- logger .Printf ("Would delete repository: %s" , repoName )
200
- continue
201
- }
202
-
203
- if err = vacuum .RemoveRepository (repoName ); err != nil {
204
- return stats , fmt .Errorf ("unable to remove the repository %s: %v" , repoName , err )
205
- }
206
- }
207
-
208
231
logger .Debugln ("Processing blobs" )
209
232
blobStatter := registry .BlobStatter ()
210
233
err = registry .Blobs ().Enumerate (ctx , func (dgst digest.Digest ) error {
0 commit comments