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 }