本文整理汇总了Golang中github.com/appc/spec/schema.ImageManifest类的典型用法代码示例。如果您正苦于以下问题:Golang ImageManifest类的具体用法?Golang ImageManifest怎么用?Golang ImageManifest使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了ImageManifest类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: validate
func validate(imOK bool, im io.Reader, rfsOK bool, files []string) error {
defer func() {
if rc, ok := im.(io.Closer); ok {
rc.Close()
}
}()
if !imOK {
return ErrNoManifest
}
if !rfsOK {
return ErrNoRootFS
}
b, err := ioutil.ReadAll(im)
if err != nil {
return fmt.Errorf("error reading image manifest: %v", err)
}
var a schema.ImageManifest
if err := a.UnmarshalJSON(b); err != nil {
return fmt.Errorf("image manifest validation failed: %v", err)
}
if a.ACVersion.LessThanMajor(schema.AppContainerVersion) {
return ErrOldVersion{
version: a.ACVersion,
}
}
for _, f := range files {
if !strings.HasPrefix(f, "rootfs") {
return fmt.Errorf("unrecognized file path in layout: %q", f)
}
}
return nil
}
示例2: ManifestFromImage
// ManifestFromImage extracts a new schema.ImageManifest from the given ACI image.
func ManifestFromImage(rs io.ReadSeeker) (*schema.ImageManifest, error) {
var im schema.ImageManifest
tr, err := NewCompressedTarReader(rs)
if err != nil {
return nil, err
}
defer tr.Close()
for {
hdr, err := tr.Next()
switch err {
case io.EOF:
return nil, errors.New("missing manifest")
case nil:
if filepath.Clean(hdr.Name) == ManifestFile {
data, err := ioutil.ReadAll(tr)
if err != nil {
return nil, err
}
if err := im.UnmarshalJSON(data); err != nil {
return nil, err
}
return &im, nil
}
default:
return nil, fmt.Errorf("error extracting tarball: %v", err)
}
}
}
示例3: createImageManifest
func createImageManifest(imj string) (*schema.ImageManifest, error) {
var im schema.ImageManifest
err := im.UnmarshalJSON([]byte(imj))
if err != nil {
return nil, err
}
return &im, nil
}
示例4: loadAndValidateACI
func loadAndValidateACI(path, server string) (data []byte, labels map[string]string, err error) {
rc, err := openFileMaybeGzipped(path)
if err != nil {
return nil, nil, fmt.Errorf("Failed to open %q: %v", path, err)
}
defer rc.Close()
tr := tar.NewReader(rc)
var manifest []byte
var foundRootfs bool
for {
header, err := tr.Next()
if err != nil {
break
}
if header.Name == "manifest" {
buf := bytes.NewBuffer(nil)
if _, err := io.Copy(buf, tr); err != nil {
return nil, nil, fmt.Errorf("Failed reading archive: %v", err)
}
manifest = buf.Bytes()
} else if header.Name == "rootfs" {
foundRootfs = true
} else if !strings.HasPrefix(header.Name, "rootfs/") {
return nil, nil, fmt.Errorf("Invalid aci, contains unexpected filename: %q.", header.Name)
}
}
if !foundRootfs {
return nil, nil, fmt.Errorf("Didn't find rootfs.")
}
var im schema.ImageManifest
if err := im.UnmarshalJSON(manifest); err != nil {
return nil, nil, fmt.Errorf("Failed to parse manifest: %v", err)
}
labels = make(map[string]string)
for _, label := range im.Labels {
switch label.Name.String() {
case "version":
labels["version"] = label.Value
case "os":
labels["os"] = label.Value
case "arch":
labels["arch"] = label.Value
}
}
if labels["version"] == "" {
return nil, nil, fmt.Errorf("Unspecified version is not supported.")
}
// if !strings.HasPrefix(im.Name.String(), server+"/") && server != testServer {
// return nil, nil, fmt.Errorf("Image name is %q which is not part of the server %q.", im.Name, server)
// }
labels["name"] = im.Name.String()
data, err = ioutil.ReadFile(path)
if err != nil {
return nil, nil, fmt.Errorf("Unable to read file %q: %v", path, err)
}
return data, labels, nil
}
示例5: readManifest
func readManifest(path string) (*schema.ImageManifest, error) {
b, err := ioutil.ReadFile(path)
if err != nil {
return nil, errorf(err.Error())
}
i := schema.ImageManifest{}
if err := i.UnmarshalJSON(b); err != nil {
return nil, errorf(err.Error())
}
return &i, nil
}
示例6: prettyPrintMan
func prettyPrintMan(manblob []byte) []byte {
var man schema.ImageManifest
err := man.UnmarshalJSON(manblob)
if err != nil {
panic(err)
}
manblob2, err := json.MarshalIndent(man, "", " ")
if err != nil {
panic(err)
}
return manblob2
}
示例7: PrintManifest
// PrintManifest will print the given manifest to stdout, optionally inserting
// whitespace to make it more human readable.
func PrintManifest(man *schema.ImageManifest, prettyPrint bool) error {
var manblob []byte
var err error
if prettyPrint {
manblob, err = json.MarshalIndent(man, "", " ")
} else {
manblob, err = man.MarshalJSON()
}
if err != nil {
return err
}
fmt.Println(string(manblob))
return nil
}
示例8: CatManifest
// CatManifest will print to stdout the manifest from the ACI stored at
// aciPath, optionally inserting whitespace to make it more human readable.
func CatManifest(aciPath string, prettyPrint bool) (err error) {
finfo, err := os.Stat(aciPath)
switch {
case os.IsNotExist(err):
return fmt.Errorf("no such file or directory: %s", aciPath)
case err != nil:
return err
case finfo.IsDir():
return fmt.Errorf("%s is a directory, not an ACI", aciPath)
default:
break
}
file, err := os.Open(aciPath)
if err != nil {
return err
}
defer file.Close()
tr, err := aci.NewCompressedTarReader(file)
if err != nil {
return fmt.Errorf("error decompressing image: %v", err)
}
defer tr.Close()
for {
hdr, err := tr.Next()
switch {
case err == io.EOF:
return fmt.Errorf("manifest not found in ACI %s", aciPath)
case err != nil:
return err
case hdr.Name == "manifest":
manblob, err := ioutil.ReadAll(tr)
if err != nil {
return err
}
var man schema.ImageManifest
err = man.UnmarshalJSON(manblob)
if err != nil {
return err
}
return util.PrintManifest(&man, prettyPrint)
}
}
}
示例9: PrepareACIDir
// PrepareACIDir takes a manifest and a path to rootfs and lay them out in a
// temp directory that conforms to the layout of ACI image.
func PrepareACIDir(manifest *schema.ImageManifest, rootfs string) (string, error) {
// Create a temp directory to hold the manifest and rootfs
tmpDir, err := ioutil.TempDir("", "")
if err != nil {
return "", fmt.Errorf("error creating temp directory: %v", err)
}
// Write the manifest file
tmpManifest, err := os.Create(filepath.Join(tmpDir, aci.ManifestFile))
if err != nil {
return "", fmt.Errorf("error creating temporary manifest: %v", err)
}
defer tmpManifest.Close()
manifestBytes, err := manifest.MarshalJSON()
if err != nil {
return "", fmt.Errorf("error marshalling manifest: %v", err)
}
_, err = tmpManifest.Write(manifestBytes)
if err != nil {
return "", fmt.Errorf("error writing manifest to temp file: %v", err)
}
if err := tmpManifest.Sync(); err != nil {
return "", fmt.Errorf("error syncing manifest file: %v", err)
}
if rootfs == "" {
// Create an (empty) rootfs
if err := os.Mkdir(filepath.Join(tmpDir, aci.RootfsDir), 0755); err != nil {
return "", fmt.Errorf("error making an empty rootfs directory: %v", err)
}
} else {
if err := shutil.CopyTree(rootfs, filepath.Join(tmpDir, aci.RootfsDir), &shutil.CopyTreeOptions{
Symlinks: true,
IgnoreDanglingSymlinks: true,
CopyFunction: shutil.Copy,
}); err != nil {
return "", fmt.Errorf("Unable to copy rootfs to a temporary directory: %s", err)
}
}
return tmpDir, nil
}
示例10: checkManifest
func checkManifest(t *testing.T, workingDir string, wantedManifest schema.ImageManifest) {
acipath := path.Join(workingDir, ".acbuild", "currentaci")
manblob, err := ioutil.ReadFile(path.Join(acipath, aci.ManifestFile))
if err != nil {
panic(err)
}
var man schema.ImageManifest
err = man.UnmarshalJSON(manblob)
if err != nil {
t.Errorf("invalid manifest schema: %v", err)
}
if str := pretty.Compare(man, wantedManifest); str != "" {
t.Errorf("unexpected manifest:\n%s", str)
}
}
示例11: ExtractManifestFromAci
func ExtractManifestFromAci(aciPath string) schema.ImageManifest {
input, err := os.Open(aciPath)
if err != nil {
panic("cat-manifest: Cannot open %s: %v" + aciPath + err.Error())
}
defer input.Close()
tr, err := aci.NewCompressedTarReader(input)
if err != nil {
panic("cat-manifest: Cannot open tar %s: %v" + aciPath + err.Error())
}
im := schema.ImageManifest{}
Tar:
for {
hdr, err := tr.Next()
switch err {
case io.EOF:
break Tar
case nil:
if filepath.Clean(hdr.Name) == aci.ManifestFile {
bytes, err := ioutil.ReadAll(tr)
if err != nil {
panic(err)
}
err = im.UnmarshalJSON(bytes)
if err != nil {
panic(err)
}
return im
}
default:
panic("error reading tarball: %v" + err.Error())
}
}
panic("Cannot found manifest if aci")
return im
}
示例12: NewACI
// NewACI creates a new ACI in the given directory with the given image
// manifest and entries.
// Used for testing.
func NewACI(dir string, manifest string, entries []*ACIEntry) (*os.File, error) {
var im schema.ImageManifest
if err := im.UnmarshalJSON([]byte(manifest)); err != nil {
return nil, errwrap.Wrap(errors.New("invalid image manifest"), err)
}
tf, err := ioutil.TempFile(dir, "")
if err != nil {
return nil, err
}
defer os.Remove(tf.Name())
tw := tar.NewWriter(tf)
aw := NewImageWriter(im, tw)
for _, entry := range entries {
// Add default mode
if entry.Header.Mode == 0 {
if entry.Header.Typeflag == tar.TypeDir {
entry.Header.Mode = 0755
} else {
entry.Header.Mode = 0644
}
}
// Add calling user uid and gid or tests will fail
entry.Header.Uid = os.Getuid()
entry.Header.Gid = os.Getgid()
sr := strings.NewReader(entry.Contents)
if err := aw.AddFile(entry.Header, sr); err != nil {
return nil, err
}
}
if err := aw.Close(); err != nil {
return nil, err
}
return tf, nil
}
示例13: GetDependencyDgrVersion
func GetDependencyDgrVersion(acName common.ACFullname) (int, error) {
depFields := data.WithField("dependency", acName.String())
out, err := Home.Rkt.CatManifest(acName.String())
if err != nil {
return 0, errs.WithEF(err, depFields, "Dependency not found")
}
im := schema.ImageManifest{}
if err := im.UnmarshalJSON([]byte(out)); err != nil {
return 0, errs.WithEF(err, depFields.WithField("content", out), "Cannot read manifest cat by rkt image")
}
version, ok := im.Annotations.Get(common.ManifestDrgVersion)
var val int
if ok {
val, err = strconv.Atoi(version)
if err != nil {
return 0, errs.WithEF(err, depFields.WithField("version", version), "Failed to parse "+common.ManifestDrgVersion+" from manifest")
}
}
return val, nil
}
示例14: createACI
func createACI(dir string, fs map[string]*deb, image string, m *schema.ImageManifest) error {
idir, err := ioutil.TempDir(dir, "image")
if err != nil {
return errorf(err.Error())
}
rootfs := filepath.Join(idir, "rootfs")
os.MkdirAll(rootfs, 0755)
for _, d := range fs {
err := run(exec.Command("cp", "-a", d.Path+"/.", rootfs))
if err != nil {
return err
}
i, err := types.SanitizeACIdentifier(
fmt.Sprintf("debian.org/deb/%v", d.Name))
if err != nil {
return errorf(err.Error())
}
a, err := types.NewACIdentifier(i)
if err != nil {
return errorf(err.Error())
}
m.Annotations.Set(
*a, fmt.Sprintf("%v/%v", d.Arch, d.Version))
}
bytes, err := m.MarshalJSON()
if err != nil {
return errorf(err.Error())
}
if err := ioutil.WriteFile(filepath.Join(idir, "manifest"), bytes, 0644); err != nil {
return errorf(err.Error())
}
if err := run(exec.Command("actool", "build", "-overwrite", idir, image)); err != nil {
return err
}
return nil
}
示例15: testCat
func testCat(t *testing.T, workingDir string) {
wantedManblob, err := ioutil.ReadFile(path.Join(workingDir, ".acbuild", "currentaci", aci.ManifestFile))
if err != nil {
panic(err)
}
wantedManblob = append(wantedManblob, byte('\n'))
var man schema.ImageManifest
err = man.UnmarshalJSON(wantedManblob)
if err != nil {
panic(err)
}
_, manblob, _, err := runACBuild(workingDir, "cat-manifest")
if err != nil {
t.Fatalf("%v", err)
}
if manblob != string(wantedManblob) {
t.Fatalf("printed manifest and manifest on disk differ")
}
wantedManblob = prettyPrintMan(wantedManblob)
wantedManblob = append(wantedManblob, byte('\n'))
_, manblob, _, err = runACBuild(workingDir, "cat-manifest", "--pretty-print")
if err != nil {
t.Fatalf("%v", err)
}
if manblob != string(wantedManblob) {
t.Fatalf("pretty printed manifest and manifest on disk differ")
}
checkManifest(t, workingDir, man)
checkEmptyRootfs(t, workingDir)
}