mirror of
https://github.com/project-zot/zot.git
synced 2024-12-16 21:56:37 -05:00
9000adba60
dist-spec community is now maintaining its own conformance suite hosted at https://oci.bloodorange.io which over time will be more complete. This makes zot's compliance cli superfluous. Hence, deprecating the cli. However, we keep the unit tests itself though.
102 lines
2.8 KiB
Go
102 lines
2.8 KiB
Go
package cli
|
|
|
|
import (
|
|
"github.com/anuvu/zot/errors"
|
|
"github.com/anuvu/zot/pkg/api"
|
|
"github.com/anuvu/zot/pkg/storage"
|
|
"github.com/mitchellh/mapstructure"
|
|
dspec "github.com/opencontainers/distribution-spec"
|
|
"github.com/rs/zerolog/log"
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
// metadataConfig reports metadata after parsing, which we use to track
|
|
// errors
|
|
func metadataConfig(md *mapstructure.Metadata) viper.DecoderConfigOption {
|
|
return func(c *mapstructure.DecoderConfig) {
|
|
c.Metadata = md
|
|
}
|
|
}
|
|
|
|
func NewRootCmd() *cobra.Command {
|
|
showVersion := false
|
|
config := api.NewConfig()
|
|
|
|
// "serve"
|
|
serveCmd := &cobra.Command{
|
|
Use: "serve <config>",
|
|
Aliases: []string{"serve"},
|
|
Short: "`serve` stores and distributes OCI images",
|
|
Long: "`serve` stores and distributes OCI images",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
if len(args) > 0 {
|
|
viper.SetConfigFile(args[0])
|
|
if err := viper.ReadInConfig(); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
md := &mapstructure.Metadata{}
|
|
if err := viper.Unmarshal(&config, metadataConfig(md)); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// if haven't found a single key or there were unused keys, report it as
|
|
// a error
|
|
if len(md.Keys) == 0 || len(md.Unused) > 0 {
|
|
panic(errors.ErrBadConfig)
|
|
}
|
|
}
|
|
c := api.NewController(config)
|
|
if err := c.Run(); err != nil {
|
|
panic(err)
|
|
}
|
|
},
|
|
}
|
|
|
|
// "garbage-collect"
|
|
gcDelUntagged := false
|
|
gcDryRun := false
|
|
|
|
gcCmd := &cobra.Command{
|
|
Use: "garbage-collect <config>",
|
|
Aliases: []string{"gc"},
|
|
Short: "`garbage-collect` deletes layers not referenced by any manifests",
|
|
Long: "`garbage-collect` deletes layers not referenced by any manifests",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
log.Info().Interface("values", config).Msg("configuration settings")
|
|
if config.Storage.RootDirectory != "" {
|
|
if err := storage.Scrub(config.Storage.RootDirectory, gcDryRun); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
},
|
|
}
|
|
|
|
gcCmd.Flags().StringVarP(&config.Storage.RootDirectory, "storage-root-dir", "r", "",
|
|
"Use specified directory for filestore backing image data")
|
|
|
|
_ = gcCmd.MarkFlagRequired("storage-root-dir")
|
|
gcCmd.Flags().BoolVarP(&gcDelUntagged, "delete-untagged", "m", false,
|
|
"delete manifests that are not currently referenced via tag")
|
|
gcCmd.Flags().BoolVarP(&gcDryRun, "dry-run", "d", false,
|
|
"do everything except remove the blobs")
|
|
|
|
rootCmd := &cobra.Command{
|
|
Use: "zot",
|
|
Short: "`zot`",
|
|
Long: "`zot`",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
if showVersion {
|
|
log.Info().Str("distribution-spec", dspec.Version).Str("commit", api.Commit).Msg("version")
|
|
}
|
|
_ = cmd.Usage()
|
|
},
|
|
}
|
|
|
|
rootCmd.AddCommand(serveCmd)
|
|
rootCmd.AddCommand(gcCmd)
|
|
rootCmd.Flags().BoolVarP(&showVersion, "version", "v", false, "show the version and exit")
|
|
|
|
return rootCmd
|
|
}
|