github.com/ggreg80/ketos@v0.0.0-20171109040536-049616f51ddb/cmd/pull/command.go (about) 1 package pull 2 3 import ( 4 "os" 5 6 "github.com/setekhid/ketos/pkg/metadata" 7 "github.com/setekhid/ketos/pkg/registry" 8 "github.com/spf13/cobra" 9 ) 10 11 var ( 12 Command = &cobra.Command{ 13 Use: "pull", 14 Short: "pull [tag]", 15 Args: cobra.MaximumNArgs(1), 16 17 RunE: pullMain, 18 } 19 ) 20 21 func init() { 22 } 23 24 func pullMain(cmd *cobra.Command, args []string) error { 25 26 tag := "latest" 27 if len(args) > 0 { 28 tag = args[0] 29 } 30 31 // metadata folder 32 meta, err := metadata.CurrentMetadatas() 33 if err != nil { 34 return err 35 } 36 37 // repository 38 repo, err := meta.ConnectRegistry() 39 if err != nil { 40 return err 41 } 42 43 manifest, err := repo.GetManifest(tag) 44 if err != nil { 45 return err 46 } 47 48 // sync layers 49 for _, layer := range manifest.FSLayers { 50 51 layerPath := meta.LayerPath(layer.BlobSum) 52 packFile := meta.PackFile(layer.BlobSum) 53 54 // cache pack 55 err := func() error { 56 57 pack, err := os.Create(packFile) 58 if err != nil { 59 return err 60 } 61 defer pack.Close() 62 63 err = repo.GetLayer(layer.BlobSum, pack) 64 if err != nil { 65 return err 66 } 67 68 return nil 69 }() 70 if err != nil { 71 return err 72 } 73 74 // untar layer 75 err = func() error { 76 77 pack, err := os.Open(packFile) 78 if err != nil { 79 return err 80 } 81 defer pack.Close() 82 83 err = registry.UntarLayerDirectory(pack, layerPath) 84 if err != nil { 85 return err 86 } 87 88 return nil 89 }() 90 if err != nil { 91 return err 92 } 93 } 94 95 // sync manifest 96 return meta.PutManifest(tag, manifest) 97 }