diff --git a/Makefile b/Makefile index b08ca9a3b..a072ae57b 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ lint: @go test github.com/moby/tool/cmd/moby test: moby - ./moby build test/test.yml + ./moby build -output tar test/test.yml rm moby test.tar PHONY: install diff --git a/cmd/moby/build.go b/cmd/moby/build.go index b44abbb1e..7e4570e5c 100644 --- a/cmd/moby/build.go +++ b/cmd/moby/build.go @@ -10,6 +10,7 @@ import ( "io/ioutil" "os" "path/filepath" + "sort" "strings" log "github.com/Sirupsen/logrus" @@ -17,8 +18,30 @@ import ( const defaultNameForStdin = "moby" +type outputList []string + +func (o *outputList) String() string { + return fmt.Sprint(*o) +} + +func (o *outputList) Set(value string) error { + // allow comma seperated options or multiple options + for _, cs := range strings.Split(value, ",") { + *o = append(*o, cs) + } + return nil +} + // Process the build arguments and execute build func build(args []string) { + var buildOut outputList + + outputTypes := []string{} + for k := range outFuns { + outputTypes = append(outputTypes, k) + } + sort.Strings(outputTypes) + buildCmd := flag.NewFlagSet("build", flag.ExitOnError) buildCmd.Usage = func() { fmt.Printf("USAGE: %s build [options] [.yml] | -\n\n", os.Args[0]) @@ -27,12 +50,19 @@ func build(args []string) { } buildName := buildCmd.String("name", "", "Name to use for output files") buildPull := buildCmd.Bool("pull", false, "Always pull images") + buildCmd.Var(&buildOut, "output", "Output types to create [ "+strings.Join(outputTypes, " ")+" ]") if err := buildCmd.Parse(args); err != nil { log.Fatal("Unable to parse args") } remArgs := buildCmd.Args() + if len(buildOut) == 0 { + buildOut = outputList{"kernel+initrd"} + } + + log.Debugf("Outputs selected: %s", buildOut.String()) + if len(remArgs) == 0 { fmt.Println("Please specify a configuration file") buildCmd.Usage() @@ -71,7 +101,7 @@ func build(args []string) { image := buildInternal(m, name, *buildPull) log.Infof("Create outputs:") - err = outputs(m, name, image) + err = outputs(name, image, buildOut) if err != nil { log.Fatalf("Error writing outputs: %v", err) } diff --git a/cmd/moby/config.go b/cmd/moby/config.go index d52e54bc2..dd445e0bf 100644 --- a/cmd/moby/config.go +++ b/cmd/moby/config.go @@ -38,9 +38,6 @@ type Moby struct { Contents string Source string } - Outputs []struct { - Format string - } } // TrustConfig is the type of a content trust config diff --git a/cmd/moby/config_test.go b/cmd/moby/config_test.go index e5554057a..bc47860e5 100644 --- a/cmd/moby/config_test.go +++ b/cmd/moby/config_test.go @@ -12,7 +12,7 @@ import ( func TestOverrides(t *testing.T) { var yamlCaps = []string{"CAP_SYS_ADMIN"} - var yaml MobyImage = MobyImage{ + var yaml = MobyImage{ Name: "test", Image: "testimage", Capabilities: &yamlCaps, @@ -20,7 +20,7 @@ func TestOverrides(t *testing.T) { var labelCaps = []string{"CAP_SYS_CHROOT"} - var label MobyImage = MobyImage{ + var label = MobyImage{ Capabilities: &labelCaps, Cwd: "/label/directory", } diff --git a/cmd/moby/output.go b/cmd/moby/output.go index 21989dc99..60fb65fa9 100644 --- a/cmd/moby/output.go +++ b/cmd/moby/output.go @@ -21,94 +21,118 @@ const ( vmdk = "linuxkit/mkimage-vmdk:182b541474ca7965c8e8f987389b651859f760da@sha256:99638c5ddb17614f54c6b8e11bd9d49d1dea9d837f38e0f6c1a5f451085d449b" ) -func outputs(m Moby, base string, image []byte) error { - log.Debugf("output: %s %s", m.Outputs, base) +var outFuns = map[string]func(string, []byte) error{ + "tar": func(base string, image []byte) error { + err := outputTar(base, image) + if err != nil { + return fmt.Errorf("Error writing tar output: %v", err) + } + return nil + }, + "kernel+initrd": func(base string, image []byte) error { + kernel, initrd, cmdline, err := tarToInitrd(image) + if err != nil { + return fmt.Errorf("Error converting to initrd: %v", err) + } + err = outputKernelInitrd(base, kernel, initrd, cmdline) + if err != nil { + return fmt.Errorf("Error writing kernel+initrd output: %v", err) + } + return nil + }, + "iso-bios": func(base string, image []byte) error { + kernel, initrd, cmdline, err := tarToInitrd(image) + if err != nil { + return fmt.Errorf("Error converting to initrd: %v", err) + } + err = outputImg(bios, base+".iso", kernel, initrd, cmdline) + if err != nil { + return fmt.Errorf("Error writing iso-bios output: %v", err) + } + return nil + }, + "iso-efi": func(base string, image []byte) error { + kernel, initrd, cmdline, err := tarToInitrd(image) + if err != nil { + return fmt.Errorf("Error converting to initrd: %v", err) + } + err = outputImg(efi, base+"-efi.iso", kernel, initrd, cmdline) + if err != nil { + return fmt.Errorf("Error writing iso-efi output: %v", err) + } + return nil + }, + "img-gz": func(base string, image []byte) error { + kernel, initrd, cmdline, err := tarToInitrd(image) + if err != nil { + return fmt.Errorf("Error converting to initrd: %v", err) + } + err = outputImgSize(img, base+".img.gz", kernel, initrd, cmdline, "1G") + if err != nil { + return fmt.Errorf("Error writing img-gz output: %v", err) + } + return nil + }, + "gcp-img": func(base string, image []byte) error { + kernel, initrd, cmdline, err := tarToInitrd(image) + if err != nil { + return fmt.Errorf("Error converting to initrd: %v", err) + } + err = outputImg(gcp, base+".img.tar.gz", kernel, initrd, cmdline) + if err != nil { + return fmt.Errorf("Error writing gcp-img output: %v", err) + } + return nil + }, + "qcow2": func(base string, image []byte) error { + kernel, initrd, cmdline, err := tarToInitrd(image) + if err != nil { + return fmt.Errorf("Error converting to initrd: %v", err) + } + err = outputImg(qcow, base+".qcow2", kernel, initrd, cmdline) + if err != nil { + return fmt.Errorf("Error writing qcow2 output: %v", err) + } + return nil + }, + "vhd": func(base string, image []byte) error { + kernel, initrd, cmdline, err := tarToInitrd(image) + if err != nil { + return fmt.Errorf("Error converting to initrd: %v", err) + } + err = outputImg(vhd, base+".vhd", kernel, initrd, cmdline) + if err != nil { + return fmt.Errorf("Error writingvhd output: %v", err) + } + return nil + }, + "vmdk": func(base string, image []byte) error { + kernel, initrd, cmdline, err := tarToInitrd(image) + if err != nil { + return fmt.Errorf("Error converting to initrd: %v", err) + } + err = outputImg(vmdk, base+".vmdk", kernel, initrd, cmdline) + if err != nil { + return fmt.Errorf("Error writing vmdk output: %v", err) + } + return nil + }, +} - for _, o := range m.Outputs { - switch o.Format { - case "tar": - err := outputTar(base, image) - if err != nil { - return fmt.Errorf("Error writing %s output: %v", o.Format, err) - } - case "kernel+initrd": - kernel, initrd, cmdline, err := tarToInitrd(image) - if err != nil { - return fmt.Errorf("Error converting to initrd: %v", err) - } - err = outputKernelInitrd(base, kernel, initrd, cmdline) - if err != nil { - return fmt.Errorf("Error writing %s output: %v", o.Format, err) - } - case "iso-bios": - kernel, initrd, cmdline, err := tarToInitrd(image) - if err != nil { - return fmt.Errorf("Error converting to initrd: %v", err) - } - err = outputImg(bios, base+".iso", kernel, initrd, cmdline) - if err != nil { - return fmt.Errorf("Error writing %s output: %v", o.Format, err) - } - case "iso-efi": - kernel, initrd, cmdline, err := tarToInitrd(image) - if err != nil { - return fmt.Errorf("Error converting to initrd: %v", err) - } - err = outputImg(efi, base+"-efi.iso", kernel, initrd, cmdline) - if err != nil { - return fmt.Errorf("Error writing %s output: %v", o.Format, err) - } - case "img-gz": - kernel, initrd, cmdline, err := tarToInitrd(image) - if err != nil { - return fmt.Errorf("Error converting to initrd: %v", err) - } - err = outputImgSize(img, base+".img.gz", kernel, initrd, cmdline, "1G") - if err != nil { - return fmt.Errorf("Error writing %s output: %v", o.Format, err) - } - case "gcp-img": - kernel, initrd, cmdline, err := tarToInitrd(image) - if err != nil { - return fmt.Errorf("Error converting to initrd: %v", err) - } - err = outputImg(gcp, base+".img.tar.gz", kernel, initrd, cmdline) - if err != nil { - return fmt.Errorf("Error writing %s output: %v", o.Format, err) - } - case "qcow", "qcow2": - kernel, initrd, cmdline, err := tarToInitrd(image) - if err != nil { - return fmt.Errorf("Error converting to initrd: %v", err) - } - err = outputImg(qcow, base+".qcow2", kernel, initrd, cmdline) - if err != nil { - return fmt.Errorf("Error writing %s output: %v", o.Format, err) - } - case "vhd": - kernel, initrd, cmdline, err := tarToInitrd(image) - if err != nil { - return fmt.Errorf("Error converting to initrd: %v", err) - } - err = outputImg(vhd, base+".vhd", kernel, initrd, cmdline) - if err != nil { - return fmt.Errorf("Error writing %s output: %v", o.Format, err) - } - case "vmdk": - kernel, initrd, cmdline, err := tarToInitrd(image) - if err != nil { - return fmt.Errorf("Error converting to initrd: %v", err) - } - err = outputImg(vmdk, base+".vmdk", kernel, initrd, cmdline) - if err != nil { - return fmt.Errorf("Error writing %s output: %v", o.Format, err) - } - case "": - return fmt.Errorf("No format specified for output") - default: - return fmt.Errorf("Unknown output type %s", o.Format) +func outputs(base string, image []byte, out outputList) error { + log.Debugf("output: %v %s", out, base) + + for _, o := range out { + f := outFuns[o] + if f == nil { + return fmt.Errorf("Unknown output type %s", o) + } + err := f(base, image) + if err != nil { + return err } } + return nil } diff --git a/cmd/moby/schema.go b/cmd/moby/schema.go index 3b26164c0..75a70b73b 100644 --- a/cmd/moby/schema.go +++ b/cmd/moby/schema.go @@ -29,17 +29,6 @@ var schema = string(` "type": "array", "items": { "$ref": "#/definitions/file" } }, - "output": { - "type": "object", - "additionalProperties": false, - "properties": { - "format": {"type": "string"} - } - }, - "outputs": { - "type": "array", - "items": { "$ref": "#/definitions/output" } - }, "trust": { "type": "object", "additionalProperties": false, @@ -116,8 +105,7 @@ var schema = string(` "onboot": { "$ref": "#/definitions/images" }, "services": { "$ref": "#/definitions/images" }, "trust": { "$ref": "#/definitions/trust" }, - "files": { "$ref": "#/definitions/files" }, - "outputs": { "$ref": "#/definitions/outputs" } + "files": { "$ref": "#/definitions/files" } } } `) diff --git a/test/test.yml b/test/test.yml index c316cadc0..f0e21126e 100644 --- a/test/test.yml +++ b/test/test.yml @@ -56,5 +56,3 @@ trust: - linuxkit/kernel - linuxkit/binfmt - linuxkit/rngd -outputs: - - format: tar