mirror of
https://github.com/Quiq/docker-registry-ui.git
synced 2025-07-17 07:41:18 +00:00
Rename -purge-from-repos to -purge-include-repos, add -purge-exclude-repos
This commit is contained in:
parent
d29c24a78f
commit
86ee1d56bd
11
main.go
11
main.go
@ -23,16 +23,17 @@ func main() {
|
|||||||
var (
|
var (
|
||||||
a apiClient
|
a apiClient
|
||||||
|
|
||||||
configFile, loggingLevel string
|
configFile, loggingLevel string
|
||||||
purgeFromRepos string
|
purgeTags, purgeDryRun bool
|
||||||
purgeTags, purgeDryRun bool
|
purgeIncludeRepos, purgeExcludeRepos string
|
||||||
)
|
)
|
||||||
flag.StringVar(&configFile, "config-file", "config.yml", "path to the config file")
|
flag.StringVar(&configFile, "config-file", "config.yml", "path to the config file")
|
||||||
flag.StringVar(&loggingLevel, "log-level", "info", "logging level")
|
flag.StringVar(&loggingLevel, "log-level", "info", "logging level")
|
||||||
|
|
||||||
flag.BoolVar(&purgeTags, "purge-tags", false, "purge old tags instead of running a web server")
|
flag.BoolVar(&purgeTags, "purge-tags", false, "purge old tags instead of running a web server")
|
||||||
flag.BoolVar(&purgeDryRun, "dry-run", false, "dry-run for purging task, does not delete anything")
|
flag.BoolVar(&purgeDryRun, "dry-run", false, "dry-run for purging task, does not delete anything")
|
||||||
flag.StringVar(&purgeFromRepos, "purge-from-repos", "", "comma-separated list of repos to purge instead of all")
|
flag.StringVar(&purgeIncludeRepos, "purge-include-repos", "", "comma-separated list of repos to purge tags from, otherwise all")
|
||||||
|
flag.StringVar(&purgeExcludeRepos, "purge-exclude-repos", "", "comma-separated list of repos to skip from purging tags, otherwise none")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
// Setup logging
|
// Setup logging
|
||||||
@ -56,7 +57,7 @@ func main() {
|
|||||||
|
|
||||||
// Execute CLI task and exit.
|
// Execute CLI task and exit.
|
||||||
if purgeTags {
|
if purgeTags {
|
||||||
registry.PurgeOldTags(a.client, purgeDryRun, purgeFromRepos)
|
registry.PurgeOldTags(a.client, purgeDryRun, purgeIncludeRepos, purgeExcludeRepos)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,11 +42,20 @@ func (p timeSlice) Swap(i, j int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PurgeOldTags purge old tags.
|
// PurgeOldTags purge old tags.
|
||||||
func PurgeOldTags(client *Client, purgeDryRun bool, purgeFromRepos string) {
|
func PurgeOldTags(client *Client, purgeDryRun bool, purgeIncludeRepos, purgeExcludeRepos string) {
|
||||||
logger := SetupLogging("registry.tasks.PurgeOldTags")
|
logger := SetupLogging("registry.tasks.PurgeOldTags")
|
||||||
|
keepDays := viper.GetInt("purge_tags.keep_days")
|
||||||
|
keepCount := viper.GetInt("purge_tags.keep_count")
|
||||||
|
keepRegexp := viper.GetString("purge_tags.keep_regexp")
|
||||||
|
keepFromFile := viper.GetString("purge_tags.keep_from_file")
|
||||||
|
|
||||||
|
dryRunText := ""
|
||||||
|
if purgeDryRun {
|
||||||
|
logger.Warn("Dry-run mode enabled.")
|
||||||
|
dryRunText = "skipped"
|
||||||
|
}
|
||||||
|
|
||||||
var dataFromFile gjson.Result
|
var dataFromFile gjson.Result
|
||||||
keepFromFile := viper.GetString("purge_tags.keep_from_file")
|
|
||||||
if keepFromFile != "" {
|
if keepFromFile != "" {
|
||||||
if _, err := os.Stat(keepFromFile); os.IsNotExist(err) {
|
if _, err := os.Stat(keepFromFile); os.IsNotExist(err) {
|
||||||
logger.Warnf("Cannot open %s: %s", keepFromFile, err)
|
logger.Warnf("Cannot open %s: %s", keepFromFile, err)
|
||||||
@ -62,21 +71,25 @@ func PurgeOldTags(client *Client, purgeDryRun bool, purgeFromRepos string) {
|
|||||||
dataFromFile = gjson.ParseBytes(data)
|
dataFromFile = gjson.ParseBytes(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
dryRunText := ""
|
|
||||||
if purgeDryRun {
|
|
||||||
logger.Warn("Dry-run mode enabled.")
|
|
||||||
dryRunText = "skipped"
|
|
||||||
}
|
|
||||||
|
|
||||||
catalog := []string{}
|
catalog := []string{}
|
||||||
if purgeFromRepos != "" {
|
if purgeIncludeRepos != "" {
|
||||||
logger.Infof("Working on repositories [%s] to scan their tags and creation dates...", purgeFromRepos)
|
logger.Infof("Including repositories: %s", purgeIncludeRepos)
|
||||||
catalog = append(catalog, strings.Split(purgeFromRepos, ",")...)
|
catalog = append(catalog, strings.Split(purgeIncludeRepos, ",")...)
|
||||||
} else {
|
} else {
|
||||||
logger.Info("Scanning registry for repositories, tags and their creation dates...")
|
|
||||||
client.RefreshCatalog()
|
client.RefreshCatalog()
|
||||||
catalog = client.GetRepos()
|
catalog = client.GetRepos()
|
||||||
}
|
}
|
||||||
|
if purgeExcludeRepos != "" {
|
||||||
|
logger.Infof("Excluding repositories: %s", purgeExcludeRepos)
|
||||||
|
tmpCatalog := []string{}
|
||||||
|
for _, repo := range catalog {
|
||||||
|
if !ItemInSlice(repo, strings.Split(purgeExcludeRepos, ",")) {
|
||||||
|
tmpCatalog = append(tmpCatalog, repo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catalog = tmpCatalog
|
||||||
|
}
|
||||||
|
logger.Infof("Working on repositories: %s", catalog)
|
||||||
|
|
||||||
now := time.Now().UTC()
|
now := time.Now().UTC()
|
||||||
repos := map[string]timeSlice{}
|
repos := map[string]timeSlice{}
|
||||||
@ -91,7 +104,7 @@ func PurgeOldTags(client *Client, purgeDryRun bool, purgeFromRepos string) {
|
|||||||
imageRef := repo + ":" + tag
|
imageRef := repo + ":" + tag
|
||||||
created := client.GetImageCreated(imageRef)
|
created := client.GetImageCreated(imageRef)
|
||||||
if created.IsZero() {
|
if created.IsZero() {
|
||||||
// Image manifest with zero creation time, e.g. cosign one
|
// Image manifest with zero creation time, e.g. cosign w/o --record-creation-timestamp
|
||||||
logger.Debugf("[%s] tag with zero creation time: %s", repo, tag)
|
logger.Debugf("[%s] tag with zero creation time: %s", repo, tag)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -100,16 +113,12 @@ func PurgeOldTags(client *Client, purgeDryRun bool, purgeFromRepos string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logger.Infof("Scanned %d repositories.", len(catalog))
|
logger.Infof("Scanned %d repositories.", len(catalog))
|
||||||
|
|
||||||
keepDays := viper.GetInt("purge_tags.keep_days")
|
|
||||||
keepCount := viper.GetInt("purge_tags.keep_count")
|
|
||||||
logger.Infof("Filtering out tags for purging: keep %d days, keep count %d", keepDays, keepCount)
|
logger.Infof("Filtering out tags for purging: keep %d days, keep count %d", keepDays, keepCount)
|
||||||
keepRegexp := viper.GetString("purge_tags.keep_regexp")
|
|
||||||
if keepRegexp != "" {
|
if keepRegexp != "" {
|
||||||
logger.Infof("Keeping tags matching regexp: %s", keepRegexp)
|
logger.Infof("Keeping tags matching regexp: %s", keepRegexp)
|
||||||
}
|
}
|
||||||
if keepFromFile != "" {
|
if keepFromFile != "" {
|
||||||
logger.Infof("Keeping tags for repos from the file: %+v", dataFromFile)
|
logger.Infof("Keeping tags from file: %+v", dataFromFile)
|
||||||
}
|
}
|
||||||
purgeTags := map[string][]string{}
|
purgeTags := map[string][]string{}
|
||||||
keepTags := map[string][]string{}
|
keepTags := map[string][]string{}
|
||||||
|
Loading…
Reference in New Issue
Block a user