experimental/main.go (106 lines of code) (raw):
package experimental
import (
"flag"
"os"
"os/signal"
"sync"
"github.com/Sirupsen/logrus"
)
var (
config = flag.String("config", "", "Path to registry config file")
ignoreBlobs = flag.Bool("ignore-blobs", false, "Ignore blobs processing and recycling")
jobs = flag.Int("jobs", 10, "Number of concurrent jobs to execute")
parallelWalkJobs = flag.Int("parallel-walk-jobs", 10, "Number of concurrent parallel walk jobs to execute")
debug = flag.Bool("debug", false, "Print debug messages")
verbose = flag.Bool("verbose", true, "Print verbose messages")
softErrors = flag.Bool("soft-errors", false, "Print errors, but do not fail")
parallelRepositoryWalk = flag.Bool("parallel-repository-walk", false, "Allow to use parallel repository walker")
parallelBlobWalk = flag.Bool("parallel-blob-walk", false, "Allow to use parallel blob walker")
repositoryCsvOutput = flag.String("repository-csv-output", "repositories.csv", "File to which CSV will be written with all metrics")
deleteOldTagVersions = flag.Bool("delete-old-tag-versions", true, "Delete old tag versions")
delete = flag.Bool("delete", false, "Delete data, instead of dry run")
softDelete = flag.Bool("soft-delete", true, "When deleting, do not remove, but move to backup/ folder")
)
var (
jobsRunner = make(jobsData)
parallelWalkRunner = make(jobsData)
)
func logErrorln(args ...interface{}) {
if *softErrors {
logrus.Errorln(args...)
} else {
logrus.Fatalln(args...)
}
}
func Main() {
flag.Parse()
if *debug {
logrus.SetLevel(logrus.DebugLevel)
} else if *verbose {
logrus.SetLevel(logrus.InfoLevel)
} else {
logrus.SetLevel(logrus.WarnLevel)
}
logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true})
if *config == "" {
flag.Usage()
os.Exit(1)
}
var err error
currentStorage, err = storageFromConfig(*config)
if err != nil {
logrus.Fatalln(err)
}
blobs := make(blobsData)
repositories := make(repositoriesData)
jobsRunner.run(*jobs)
parallelWalkRunner.run(*parallelWalkJobs)
signals := make(chan os.Signal)
signal.Notify(signals, os.Interrupt, os.Kill)
go func() {
for signal := range signals {
currentStorage.Info()
logrus.Fatalln("Signal received:", signal)
}
}()
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
err := repositories.walk(*parallelRepositoryWalk)
if err != nil {
logErrorln(err)
}
}()
go func() {
defer wg.Done()
if *ignoreBlobs {
return
}
err := blobs.walk(*parallelBlobWalk)
if err != nil {
logErrorln(err)
}
}()
wg.Wait()
logrus.Infoln("Marking REPOSITORIES...")
err = repositories.mark(blobs)
if err != nil {
logErrorln(err)
}
logrus.Infoln("Sweeping REPOSITORIES...")
err = repositories.sweep()
if err != nil {
logErrorln(err)
}
logrus.Infoln("Sweeping BLOBS...")
err = blobs.sweep()
if err != nil {
logErrorln(err)
}
logrus.Infoln("Summary...")
repositories.info(blobs, *repositoryCsvOutput)
blobs.info()
deletesInfo()
currentStorage.Info()
}