github.com/ggreg80/ketos@v0.0.0-20171109040536-049616f51ddb/pkg/metadata/ketos_folder.go (about)

     1  package metadata
     2  
     3  import (
     4  	"gopkg.in/yaml.v2"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	"github.com/opencontainers/go-digest"
    10  	"github.com/pkg/errors"
    11  	"github.com/setekhid/ketos/pkg/registry"
    12  )
    13  
    14  const KetosMetaFolder = ".ketos"
    15  
    16  // SeekKetosFolder seek .ketos from path to root
    17  func SeekKetosFolder(path string) (string, error) {
    18  
    19  	path, err := filepath.Abs(path)
    20  	if err != nil {
    21  		return "", errors.Wrap(err, "abs path")
    22  	}
    23  
    24  	for {
    25  
    26  		mayKetos := filepath.Join(path, KetosMetaFolder)
    27  		_, err := os.Stat(mayKetos)
    28  		if err == nil {
    29  			return mayKetos, nil
    30  		}
    31  
    32  		if !os.IsNotExist(err) {
    33  			return "", errors.Wrap(err, "open ketos metadata")
    34  		}
    35  
    36  		parent := filepath.Dir(path)
    37  		if path == parent {
    38  			return "", errors.New("didn't find metadata")
    39  		}
    40  		path = parent
    41  	}
    42  }
    43  
    44  // KetosFolder seek .ketos from current working directory to root
    45  func KetosFolder() (string, error) {
    46  
    47  	wd, err := os.Getwd()
    48  	if err != nil {
    49  		return "", errors.Wrap(err, "get current working directory")
    50  	}
    51  
    52  	return SeekKetosFolder(wd)
    53  }
    54  
    55  // MetaFolders represents ketos metadata folders
    56  type MetaFolders string
    57  
    58  // InitFS initialize file system
    59  func (m MetaFolders) InitFolders() error {
    60  
    61  	err := os.MkdirAll(filepath.Dir(m.Config()), os.ModePerm)
    62  	if err != nil {
    63  		return errors.Wrap(err, "mkdir directory of config")
    64  	}
    65  
    66  	err = os.MkdirAll(m.Container(), os.ModePerm)
    67  	if err != nil {
    68  		return errors.Wrap(err, "mkdir container directory")
    69  	}
    70  
    71  	err = os.MkdirAll(m.Layers(), os.ModePerm)
    72  	if err != nil {
    73  		return errors.Wrap(err, "mkdir layers")
    74  	}
    75  
    76  	err = os.MkdirAll(m.Packs(), os.ModePerm)
    77  	if err != nil {
    78  		return errors.Wrap(err, "mkdir layers")
    79  	}
    80  
    81  	err = os.MkdirAll(m.Manifests(), os.ModePerm)
    82  	if err != nil {
    83  		return errors.Wrap(err, "mkdir manifests")
    84  	}
    85  
    86  	return nil
    87  }
    88  
    89  // InitConfig initialize config file for ketos repo
    90  func (m MetaFolders) InitConfig(image string) error {
    91  
    92  	config := &KetosConfig{}
    93  	config.InitImageName = image
    94  
    95  	config.Repository.Registry, config.Repository.Name, _ =
    96  		registry.DockerImage(image).Split()
    97  
    98  	content, err := yaml.Marshal(config)
    99  	if err != nil {
   100  		return errors.Wrap(err, "marshal ketos config")
   101  	}
   102  
   103  	err = ioutil.WriteFile(m.Config(), content, os.ModePerm)
   104  	if err != nil {
   105  		return errors.Wrap(err, "write down config file")
   106  	}
   107  
   108  	return nil
   109  }
   110  
   111  // Config get the config file path
   112  func (m MetaFolders) Config() string {
   113  	return filepath.Join(string(m), "config.yaml")
   114  }
   115  
   116  // Container return the top working layer
   117  func (m MetaFolders) Container() string {
   118  	return filepath.Dir(string(m))
   119  }
   120  
   121  // Layers return the layers folder path
   122  func (m MetaFolders) Layers() string {
   123  	return filepath.Join(string(m), "layers")
   124  }
   125  
   126  // Layer return the specified layer directory
   127  func (m MetaFolders) Layer(digest digest.Digest) string {
   128  	return filepath.Join(m.Layers(), digest.String())
   129  }
   130  
   131  // FIXME store all layer to packs and make layers folder act as a cache
   132  
   133  // Packs return the cached packs folder
   134  func (m MetaFolders) Packs() string {
   135  	return filepath.Join(string(m), "packs")
   136  }
   137  
   138  // Pack return the spcified pack
   139  func (m MetaFolders) Pack(digest digest.Digest) string {
   140  	return filepath.Join(m.Packs(), digest.String())
   141  }
   142  
   143  // MetaLayer return the json file of config layer
   144  func (m MetaFolders) MetaLayer(digest digest.Digest) string {
   145  	return filepath.Join(m.Layers(), digest.Hex()+".json")
   146  }
   147  
   148  // Manifests return the manifests folder path
   149  func (m MetaFolders) Manifests() string {
   150  	return filepath.Join(string(m), "manifests")
   151  }
   152  
   153  // Manifest get the specific manifest
   154  func (m MetaFolders) Manifest(tag string) string {
   155  	return filepath.Join(m.Manifests(), tag+".json")
   156  }