github.com/ggreg80/ketos@v0.0.0-20171109040536-049616f51ddb/cmd/push/command.go (about) 1 package push 2 3 import ( 4 "github.com/setekhid/ketos/pkg/metadata" 5 "github.com/spf13/cobra" 6 "os" 7 ) 8 9 var ( 10 Command = &cobra.Command{ 11 Use: "push", 12 Short: "push [tag]", 13 Args: cobra.MaximumNArgs(1), 14 15 RunE: pushMain, 16 } 17 ) 18 19 func pushMain(cmd *cobra.Command, args []string) error { 20 21 tag := "latest" 22 if len(args) > 0 { 23 tag = args[0] 24 } 25 26 // metadata folder 27 meta, err := metadata.CurrentMetadatas() 28 if err != nil { 29 return err 30 } 31 32 // repository 33 repo, err := meta.ConnectRegistry() 34 if err != nil { 35 return err 36 } 37 38 manifest, err := meta.GetManifest(tag) 39 if err != nil { 40 return err 41 } 42 43 // sync layers 44 for _, layer := range manifest.FSLayers { 45 46 packFile := meta.PackFile(layer.BlobSum) 47 has, err := repo.HasLayer(layer.BlobSum) 48 if err != nil { 49 return err 50 } 51 52 if !has { 53 54 err = func() error { 55 pack, err := os.Open(packFile) 56 if err != nil { 57 return err 58 } 59 defer pack.Close() 60 61 return repo.PutLayer(layer.BlobSum, pack) 62 }() 63 if err != nil { 64 return err 65 } 66 } 67 } 68 69 // sync manifest 70 return repo.PutManifest(tag, manifest) 71 }