Rough out the beginnings of v1 config updates

Rough out simple image configuration edits, though apparently there's
more out there than just OCI v1.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
This commit is contained in:
Nalin Dahyabhai
2017-01-27 12:29:37 +01:00
parent e1927c12bb
commit eca2a67a47

View File

@@ -1,28 +1,119 @@
package main
import (
"bytes"
"encoding/json"
"runtime"
"strings"
"time"
"github.com/Sirupsen/logrus"
"github.com/opencontainers/runtime-tools/generate"
"github.com/opencontainers/image-spec/specs-go/v1"
"github.com/urfave/cli"
)
var (
configFlags = []cli.Flag{}
configFlags = []cli.Flag{
cli.StringFlag{
Name: "author",
Usage: "image author contact information",
},
cli.StringFlag{
Name: "arch",
Usage: "image target architecture",
},
cli.StringFlag{
Name: "os",
Usage: "image target operating system",
},
cli.StringFlag{
Name: "user",
Usage: "user name to run containers as",
},
cli.StringSliceFlag{
Name: "port",
Usage: "ports to expose when running containers",
},
cli.StringSliceFlag{
Name: "env",
Usage: "environment variable to set when running containers",
},
cli.StringSliceFlag{
Name: "entrypoint",
Usage: "container entry point",
},
cli.StringSliceFlag{
Name: "cmd",
Usage: "container command",
},
cli.StringSliceFlag{
Name: "volume",
Usage: "container volume",
},
cli.StringFlag{
Name: "workingdir",
Usage: "container working directory",
},
cli.StringSliceFlag{
Name: "label",
Usage: "container label",
},
}
)
func updateConfig(c *cli.Context, config []byte) []byte {
buffer := bytes.Buffer{}
g, err := generate.NewFromTemplate(bytes.NewReader(config))
image := v1.Image{}
if err := json.Unmarshal(config, &image); err != nil {
if len(config) > 0 {
logrus.Errorf("error importing image configuration, using original configuration")
return config
}
}
createdBytes, err := time.Now().MarshalText()
if err != nil {
logrus.Errorf("error importing template configuration, using original configuration")
logrus.Errorf("error setting image creation time: %v", err)
} else {
image.Created = string(createdBytes)
}
if image.Architecture == "" {
image.Architecture = runtime.GOARCH
}
if image.OS == "" {
image.OS = runtime.GOOS
}
if c.IsSet("author") {
image.Author = c.String("author")
}
if c.IsSet("arch") {
image.Architecture = c.String("arch")
}
if c.IsSet("os") {
image.OS = c.String("os")
}
if c.IsSet("env") {
for _, envSpec := range c.StringSlice("env") {
image.Config.Env = append(append([]string{}, image.Config.Env...), envSpec)
}
}
if c.IsSet("label") {
for _, labelSpec := range c.StringSlice("label") {
label := strings.SplitN(labelSpec, "=", 2)
if image.Config.Labels == nil {
image.Config.Labels = make(map[string]string)
}
if len(label) > 1 {
image.Config.Labels[label[0]] = label[1]
} else {
delete(image.Config.Labels, label[0])
}
}
}
if c.IsSet("workingdir") {
image.Config.WorkingDir = c.String("workingdir")
}
updatedImage, err := json.Marshal(&image)
if err != nil {
logrus.Errorf("error exporting updated image configuration, using original configuration")
return config
}
options := generate.ExportOptions{}
err = g.Save(buffer, options)
if err != nil {
logrus.Errorf("error exporting updated configuration, using original configuration")
return config
}
return buffer.Bytes()
return updatedImage
}