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  }