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  }