func (pp *TestPostProcessor) PostProcess(ui packer.Ui, a packer.Artifact) (packer.Artifact, bool, error) { pp.ppCalled = true pp.ppArtifact = a pp.ppArtifactId = a.Id() pp.ppUi = ui return testPostProcessorArtifact, false, nil }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { ppName, ok := builtins[artifact.BuilderId()] if !ok { return nil, false, fmt.Errorf("Unknown artifact type, can't build box: %s", artifact.BuilderId()) } // Use the premade PostProcessor if we have one. Otherwise, we // create it and configure it here. pp, ok := p.premade[ppName] if !ok { log.Printf("Premade post-processor for '%s' not found. Creating.", ppName) var err error pp, err = p.subPostProcessor(ppName, nil, p.extraConfig) if err != nil { return nil, false, err } if pp == nil { return nil, false, fmt.Errorf("Vagrant box post-processor not found: %s", ppName) } } ui.Say(fmt.Sprintf("Creating Vagrant box for '%s' provider", ppName)) return pp.PostProcess(ui, artifact) }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, error) { ppName, ok := builtins[artifact.BuilderId()] if !ok { return nil, fmt.Errorf("Unknown artifact type, can't build box: %s", artifact.BuilderId()) } // Use the premade PostProcessor if we have one. Otherwise, we // create it and configure it here. pp, ok := p.premade[ppName] if !ok { log.Printf("Premade post-processor for '%s' not found. Creating.", ppName) pp = keyToPostProcessor(ppName) if pp == nil { return nil, fmt.Errorf("Vagrant box post-processor not found: %s", ppName) } config := map[string]string{"output": p.config.OutputPath} if err := pp.Configure(config); err != nil { return nil, err } } ui.Say(fmt.Sprintf("Creating Vagrant box for '%s' provider", ppName)) return pp.PostProcess(ui, artifact) }
func (p *VBoxBoxPostProcessor) findBaseMacAddress(a packer.Artifact) (string, error) { log.Println("Looking for OVF for base mac address...") var ovf string for _, f := range a.Files() { if strings.HasSuffix(f, ".ovf") { log.Printf("OVF found: %s", f) ovf = f break } } if ovf == "" { return "", errors.New("ovf file couldn't be found") } f, err := os.Open(ovf) if err != nil { return "", err } defer f.Close() data, err := ioutil.ReadAll(f) if err != nil { return "", err } re := regexp.MustCompile(`<Adapter slot="0".+?MACAddress="(.+?)"`) matches := re.FindSubmatch(data) if matches == nil { return "", errors.New("can't find base mac address in OVF") } log.Printf("Base mac address: %s", string(matches[1])) return string(matches[1]), nil }
func getAmiMap(artifact packer.Artifact) map[string]string { meta := artifact.State("atlas.artifact.metadata") if meta == nil { log.Println("Artifact has no AWS info: artifact.State(atlas.artifact.metadata)") return nil } regionMap, ok := meta.(map[interface{}]interface{}) if !ok { return nil } amiMap := make(map[string]string) for reg, ami := range regionMap { r, ok := reg.(string) if !ok { log.Printf("Couldnt convert Region to string: %#v \n", reg) } a, ok := ami.(string) if !ok { log.Printf("Couldnt convert Ami to string: %#v \n", ami) } r = strings.TrimPrefix(r, "region.") amiMap[r] = a } return amiMap }
func (p *AWSProvider) Process(ui packer.Ui, artifact packer.Artifact, dir string) (vagrantfile string, metadata map[string]interface{}, err error) { // Create the metadata metadata = map[string]interface{}{"provider": "aws"} // Build up the template data to build our Vagrantfile tplData := &awsVagrantfileTemplate{ Images: make(map[string]string), } for _, regions := range strings.Split(artifact.Id(), ",") { parts := strings.Split(regions, ":") if len(parts) != 2 { err = fmt.Errorf("Poorly formatted artifact ID: %s", artifact.Id()) return } tplData.Images[parts[0]] = parts[1] } // Build up the contents var contents bytes.Buffer t := template.Must(template.New("vf").Parse(defaultAWSVagrantfile)) err = t.Execute(&contents, tplData) vagrantfile = contents.String() return }
func (p *PostProcessor) artifactType(artifact packer.Artifact) string { if !p.config.TypeOverride { if v := artifact.State(ArtifactStateType); v != nil { return v.(string) } } return p.config.Type }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { if artifact.BuilderId() != "mitchellh.post-processor.vagrant" { return nil, false, fmt.Errorf( "Unknown artifact type, requires box from vagrant post-processor: %s", artifact.BuilderId()) } box := artifact.Files()[0] if !strings.HasSuffix(box, ".box") { return nil, false, fmt.Errorf( "Unknown files in artifact from vagrant post-processor: %s", artifact.Files()) } provider := providerFromBuilderName(artifact.Id()) file, err := os.Open(box) if err != nil { return nil, false, err } defer file.Close() info, err := file.Stat() if err != nil { return nil, false, err } size := info.Size() ui.Message(fmt.Sprintf("Box size: %s (%d bytes)", box, size)) metadata, err := p.getMetadata() if err != nil { return nil, false, err } ui.Message("Generating checksum") checksum, err := sum256(file) if err != nil { return nil, false, err } ui.Message(fmt.Sprintf("Checksum is %s", checksum)) ui.Message(fmt.Sprintf("Adding %s %s box to metadata", provider, p.config.Version)) if err := metadata.Add(p.config.Version, &Provider{ Name: provider, Url: fmt.Sprintf("%s/%s/%s", p.config.UrlPrefix, p.config.BoxDir, path.Base(box)), ChecksumType: "sha256", Checksum: checksum, }); err != nil { return nil, false, err } ui.Message(fmt.Sprintf("Saving the metadata: %s", p.config.MetadataPath)) if err := p.putMetadata(metadata); err != nil { return nil, false, err } return &Artifact{fmt.Sprintf("%s/%s", p.config.UrlPrefix, p.config.MetadataPath)}, true, nil }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { r, _ := regexp.Compile("ami-[a-z0-9]+") amiId := r.FindString(artifact.Id()) if err := ioutil.WriteFile(p.config.OutputPath, []byte(amiId), 0644); err != nil { return artifact, false, err } return artifact, true, nil }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { keep := p.config.KeepInputArtifact importName := p.config.ImportName metaData := Metadata{importName, "virtualbox"} var stdout bytes.Buffer var stderr bytes.Buffer stdout.Reset() stderr.Reset() outputDir := filepath.Dir(artifact.Files()[0]) marshalledJson, err := json.Marshal(metaData) if err != nil { panic(err) } ui.Say(fmt.Sprintf("Creating metadata file: %s", outputDir+"/metadata.json")) f, err := os.Create(outputDir + "/metadata.json") if err != nil { panic(err) } _, err = f.Write(marshalledJson) if err != nil { panic(err) } f.Sync() vagrant.DirToBox("./output.box", filepath.Dir(artifact.Files()[0]), ui, 0) ui.Say(fmt.Sprintf("Importing box into vagrant: %s", importName)) if _, err := os.Stat("./output.box"); err != nil { return nil, false, fmt.Errorf("Unable to find box: ./output.box") } cmd := exec.Command("sh", "-c", fmt.Sprintf("vagrant box add --name %s ./output.box", importName)) cmd.Stdout = &stdout cmd.Stderr = &stderr err = cmd.Run() stdoutString := strings.TrimSpace(stdout.String()) stderrString := strings.TrimSpace(stderr.String()) os.Remove("./output.box") if err != nil { return nil, false, fmt.Errorf("Error importing: %s", stderrString) } log.Printf("stdout: %s", stdoutString) log.Printf("stderr: %s", stderrString) return artifact, keep, nil }
func (p *HypervProvider) Process(ui packer.Ui, artifact packer.Artifact, dir string) (vagrantfile string, metadata map[string]interface{}, err error) { // Create the metadata metadata = map[string]interface{}{"provider": "hyperv"} // ui.Message(fmt.Sprintf("artifacts all: %+v", artifact)) var outputDir string // Vargant requires specific dir structure for hyperv // hyperv builder creates the structure in the output dir // we have to keep the structure in a temp dir // hack little bit but string in artifact usually have output dir artifactString := artifact.String() d := strings.Split(artifactString, ": ") outputDir = d[1] // ui.Message(fmt.Sprintf("artifact dir from string: %s", outputDir)) // Copy all of the original contents into the temporary directory for _, path := range artifact.Files() { ui.Message(fmt.Sprintf("Copying: %s", path)) var rel string rel, err = filepath.Rel(outputDir, filepath.Dir(path)) // ui.Message(fmt.Sprintf("rel is: %s", rel)) if err != nil { ui.Message(fmt.Sprintf("err in: %s", rel)) return } dstDir := filepath.Join(dir, rel) // ui.Message(fmt.Sprintf("dstdir is: %s", dstDir)) if _, err = os.Stat(dstDir); err != nil { if err = os.MkdirAll(dstDir, 0755); err != nil { ui.Message(fmt.Sprintf("err in creating: %s", dstDir)) return } } dstPath := filepath.Join(dstDir, filepath.Base(path)) if err = CopyContents(dstPath, path); err != nil { ui.Message(fmt.Sprintf("err in copying: %s to %s", path, dstPath)) return } ui.Message(fmt.Sprintf("Copyed %s to %s", path, dstPath)) } return }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { if artifact.BuilderId() != docker.BuilderId { err := fmt.Errorf( "Unknown artifact type: %s\nCan only import from Docker builder artifacts.", artifact.BuilderId()) return nil, false, err } importRepo := p.config.Repository if p.config.Tag != "" { importRepo += ":" + p.config.Tag } driver := &docker.DockerDriver{Ctx: &p.config.ctx, Ui: ui} ui.Message("Importing image: " + artifact.Id()) ui.Message("Repository: " + importRepo) id, err := driver.Import(artifact.Files()[0], importRepo) if err != nil { return nil, false, err } ui.Message("Imported ID: " + id) // Build the artifact artifact = &docker.ImportArtifact{ BuilderIdValue: BuilderId, Driver: driver, IdValue: importRepo, } return artifact, false, nil }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { if artifact.BuilderId() != dockerimport.BuilderId { err := fmt.Errorf( "Unknown artifact type: %s\nCan only tag from Docker builder artifacts.", artifact.BuilderId()) return nil, false, err } driver := p.Driver if driver == nil { // If no driver is set, then we use the real driver driver = &docker.DockerDriver{Ctx: &p.config.ctx, Ui: ui} } importRepo := p.config.Repository if p.config.Tag != "" { importRepo += ":" + p.config.Tag } ui.Message("Tagging image: " + artifact.Id()) ui.Message("Repository: " + importRepo) err := driver.TagImage(artifact.Id(), importRepo, p.config.Force) if err != nil { return nil, false, err } // Build the artifact artifact = &docker.ImportArtifact{ BuilderIdValue: BuilderId, Driver: driver, IdValue: importRepo, } return artifact, true, nil }
func makeAmiList(a packer.Artifact) (map[string]string, error) { type Amis map[string]string amis := make(Amis) // converting from Artifact interface via Id() regionAmiList := strings.Split(a.Id(), ",") for _, regionAmi := range regionAmiList { // region:ami-id amiInfo := strings.Split(regionAmi, ":") amis[amiInfo[0]] = amiInfo[1] } return amis, nil }
func NewArtifact(artifact packer.Artifact) *Artifact { return &Artifact{ builderId: artifact.BuilderId(), files: artifact.Files(), id: artifact.Id(), str: artifact.String(), } }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { if p.config.AmiId != nil { r, _ := regexp.Compile("ami-[a-z0-9]+") amiId := r.FindString(artifact.Id()) for file, properties := range p.config.AmiId { err := UpdateJsonFile(file, properties, amiId, ui) if err != nil { return artifact, false, err } } } return artifact, true, nil }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { name, ok := builtins[artifact.BuilderId()] if !ok { return nil, false, fmt.Errorf( "Unknown artifact type, can't build box: %s", artifact.BuilderId()) } provider := providerForName(name) if provider == nil { // This shouldn't happen since we hard code all of these ourselves panic(fmt.Sprintf("bad provider name: %s", name)) } return p.PostProcessProvider(name, provider, ui, artifact) }
// ProcessOutputPath takes an output path template and executes it, // replacing variables with their respective values. func ProcessOutputPath(path string, provider string, artifact packer.Artifact) (string, error) { var buf bytes.Buffer tplData := &OutputPathTemplate{ ArtifactId: artifact.Id(), Provider: provider, } t, err := template.New("output").Parse(path) if err != nil { return "", err } err = t.Execute(&buf, tplData) return buf.String(), err }
func (p *VMwareProvider) Process(ui packer.Ui, artifact packer.Artifact, dir string) (vagrantfile string, metadata map[string]interface{}, err error) { // Create the metadata metadata = map[string]interface{}{"provider": "vmware_desktop"} // Copy all of the original contents into the temporary directory for _, path := range artifact.Files() { ui.Message(fmt.Sprintf("Copying: %s", path)) dstPath := filepath.Join(dir, filepath.Base(path)) if err = CopyContents(dstPath, path); err != nil { return } } return }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { if artifact.BuilderId() != dockerimport.BuilderId && artifact.BuilderId() != dockertag.BuilderId { err := fmt.Errorf( "Unknown artifact type: %s\nCan only import from docker-import and docker-tag artifacts.", artifact.BuilderId()) return nil, false, err } driver := p.Driver if driver == nil { // If no driver is set, then we use the real driver driver = &docker.DockerDriver{Ctx: &p.config.ctx, Ui: ui} } if p.config.EcrLogin { ui.Message("Fetching ECR credentials...") username, password, err := p.config.EcrGetLogin(p.config.LoginServer) if err != nil { return nil, false, err } p.config.LoginUsername = username p.config.LoginPassword = password } if p.config.Login || p.config.EcrLogin { ui.Message("Logging in...") err := driver.Login( p.config.LoginServer, p.config.LoginEmail, p.config.LoginUsername, p.config.LoginPassword) if err != nil { return nil, false, fmt.Errorf( "Error logging in to Docker: %s", err) } defer func() { ui.Message("Logging out...") if err := driver.Logout(p.config.LoginServer); err != nil { ui.Error(fmt.Sprintf("Error logging out: %s", err)) } }() } // Get the name. name := artifact.Id() ui.Message("Pushing: " + name) if err := driver.Push(name); err != nil { return nil, false, err } return nil, false, nil }
func (self *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { name, ok := builtins[artifact.BuilderId()] if !ok { return nil, false, fmt.Errorf( "Unknown artifact type, can't build diskimage: %s", artifact.BuilderId()) } // Sanity check since all of these are hardcoded in the application. provider := providerForName(name) if provider == nil { panic(fmt.Sprintf("Bad provider name: %s", name)) } ui.Say(fmt.Sprintf("Creating diskimage for '%s' provider", name)) return NewArtifact(name, outputPath), provider.KeepInputArtifact(), nil }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { if _, ok := builtins[artifact.BuilderId()]; !ok { return nil, p.config.KeepInputArtifact, fmt.Errorf("Unknown artifact type, can't build box: %s", artifact.BuilderId()) } source := "" for _, path := range artifact.Files() { if strings.HasSuffix(path, ".vmx") || strings.HasSuffix(path, ".ovf") || strings.HasSuffix(path, ".ova") { source = path break } } if source == "" { return nil, p.config.KeepInputArtifact, fmt.Errorf("VMX, OVF or OVA file not found") } ovftool_uri := fmt.Sprintf("vi://%s:%s@%s/%s/host/%s", url.QueryEscape(p.config.Username), url.QueryEscape(p.config.Password), p.config.Host, p.config.Datacenter, p.config.Cluster) if p.config.ResourcePool != "" { ovftool_uri += "/Resources/" + p.config.ResourcePool } args, err := p.BuildArgs(source, ovftool_uri) if err != nil { ui.Message(fmt.Sprintf("Failed: %s\n", err)) } ui.Message(fmt.Sprintf("Uploading %s to vSphere", source)) log.Printf("Starting ovftool with parameters: %s", strings.Join(args, " ")) cmd := exec.Command("ovftool", args...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { return nil, p.config.KeepInputArtifact, fmt.Errorf("Failed: %s\n", err) } return artifact, p.config.KeepInputArtifact, nil }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { if artifact.BuilderId() != dockerimport.BuilderId && artifact.BuilderId() != dockertag.BuilderId { err := fmt.Errorf( "Unknown artifact type: %s\nCan only import from docker-import and docker-tag artifacts.", artifact.BuilderId()) return nil, false, err } driver := p.Driver if driver == nil { // If no driver is set, then we use the real driver driver = &docker.DockerDriver{Ctx: &p.config.ctx, Ui: ui} } if p.config.Login { ui.Message("Logging in...") err := driver.Login( p.config.LoginServer, p.config.LoginEmail, p.config.LoginUsername, p.config.LoginPassword) if err != nil { return nil, false, fmt.Errorf( "Error logging in to Docker: %s", err) } defer func() { ui.Message("Logging out...") if err := driver.Logout(p.config.LoginServer); err != nil { ui.Error(fmt.Sprintf("Error logging out: %s", err)) } }() } // Get the name. We strip off any tags from the name because the // push doesn't use those. name := artifact.Id() if i := strings.Index(name, "/"); i >= 0 { // This should always be true because the / is required. But we have // to get the index to this so we don't accidentally strip off the port if j := strings.Index(name[i:], ":"); j >= 0 { name = name[:i+j] } } ui.Message("Pushing: " + name) if err := driver.Push(name); err != nil { return nil, false, err } return nil, false, nil }
func (p *LibVirtProvider) Process(ui packer.Ui, artifact packer.Artifact, dir string) (vagrantfile string, metadata map[string]interface{}, err error) { diskName := artifact.State("diskName").(string) // Copy the disk image into the temporary directory (as box.img) for _, path := range artifact.Files() { if strings.HasSuffix(path, "/"+diskName) { ui.Message(fmt.Sprintf("Copying from artifact: %s", path)) dstPath := filepath.Join(dir, "box.img") if err = CopyContents(dstPath, path); err != nil { return } } } format := artifact.State("diskType").(string) origSize := artifact.State("diskSize").(uint64) size := origSize / 1024 // In MB, want GB if origSize%1024 > 0 { // Make sure we don't make the size smaller size++ } domainType := artifact.State("domainType").(string) // Convert domain type to libvirt driver var driver string switch domainType { case "none", "tcg": driver = "qemu" case "kvm": driver = domainType default: return "", nil, fmt.Errorf("Unknown libvirt domain type: %s", domainType) } // Create the metadata metadata = map[string]interface{}{ "provider": "libvirt", "format": format, "virtual_size": size, } vagrantfile = fmt.Sprintf(libvirtVagrantfile, driver) return }
// PostProcess is the main entry point. It calls a Provider's Convert() method // to delegate conversion to that Provider's command-line tool. func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { provider, err := providerForBuilderId(artifact.BuilderId()) if err != nil { return nil, false, err } ui.Say(fmt.Sprintf("Converting %s image to VHD file...", provider)) // Render output path. p.config.ctx.Data = &outputPathTemplate{ ArtifactId: artifact.Id(), BuildName: p.config.PackerBuildName, Provider: provider.Name(), } outputPath, err := interpolate.Render(p.config.OutputPath, &p.config.ctx) if err != nil { return nil, false, err } // Check if VHD file exists. Remove if the user specified `force` in the // template or `--force` on the command-line. // This differs from the Vagrant post-processor because the the VHD can be // used (and written to) immediately. It is comparable to a Builder // end-product. if _, err = os.Stat(outputPath); err == nil { if p.config.PackerForce || p.config.Force { ui.Message(fmt.Sprintf("Removing existing VHD file at %s", outputPath)) os.Remove(outputPath) } else { return nil, false, fmt.Errorf("VHD file exists: %s\nUse the force flag to delete it.", outputPath) } } err = provider.Convert(ui, artifact, outputPath) if err != nil { return nil, false, err } ui.Say(fmt.Sprintf("Converted VHD: %s", outputPath)) artifact = NewArtifact(provider.String(), outputPath) keep := p.config.KeepInputArtifact return artifact, keep, nil }
// Convert a VirtualBox VMDK artifact to a VHD file. func (p *VirtualBoxProvider) Convert(ui packer.Ui, artifact packer.Artifact, outputPath string) (err error) { var files []string // Unpack the VirtualBox artifact if necessary (if in the OVA format). for _, path := range artifact.Files() { if ext := filepath.Ext(path); ext == ".ova" { // Extract OVA files in place. ui.Message(fmt.Sprintf("Unpacking OVA: %s", path)) dir := filepath.Dir(path) if err = vagrant.DecompressOva(dir, path); err != nil { return err } // Prepare new slice of files to search. glob := filepath.Join(dir, "*") files, err = filepath.Glob(glob) if err != nil { return err } continue } else { files = artifact.Files() } } // Find VirtualBox VMDK. vmdk, err := findVMDK(files...) if err != nil { return err } ui.Message(fmt.Sprintf("Found VirtualBox VMDK: %s", vmdk)) // Convert VMDK to VHD. ui.Message("Cloning VMDK as VHD...") command := []string{ "clonehd", "--format", "VHD", vmdk, outputPath, } if err = p.Execute(ui, command...); err != nil { return fmt.Errorf("Error creating VHD: %s", err) } return nil }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { files := artifact.Files() var h hash.Hash var checksumFile string newartifact := NewArtifact(artifact.Files()) for _, ct := range p.config.ChecksumTypes { h = getHash(ct) for _, art := range files { checksumFile = p.config.OutputPath if _, err := os.Stat(checksumFile); err != nil { newartifact.files = append(newartifact.files, checksumFile) } if err := os.MkdirAll(filepath.Dir(checksumFile), os.FileMode(0755)); err != nil { return nil, false, fmt.Errorf("unable to create dir: %s", err.Error()) } fw, err := os.OpenFile(checksumFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.FileMode(0644)) if err != nil { return nil, false, fmt.Errorf("unable to create file %s: %s", checksumFile, err.Error()) } fr, err := os.Open(art) if err != nil { fw.Close() return nil, false, fmt.Errorf("unable to open file %s: %s", art, err.Error()) } if _, err = io.Copy(h, fr); err != nil { fr.Close() fw.Close() return nil, false, fmt.Errorf("unable to compute %s hash for %s", ct, art) } fr.Close() fw.WriteString(fmt.Sprintf("%x\t%s\n", h.Sum(nil), filepath.Base(art))) fw.Close() h.Reset() } } return newartifact, true, nil }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { if artifact.BuilderId() != dockerimport.BuilderId { err := fmt.Errorf( "Unknown artifact type: %s\nCan only tag from Docker builder artifacts.", artifact.BuilderId()) return nil, false, err } dockerfile, template_err := p.render_template(trim_artifact_id(artifact.Id())) if template_err != nil { // could not render template return nil, false, template_err } log.Printf("[DEBUG] Dockerfile: %s\n", dockerfile.String()) if image_id, err := p.docker_build_fn(dockerfile); err != nil { // docker build command failed ui.Error("docker build command failed: " + err.Error()) return nil, false, err } else { ui.Message("Built image: " + image_id) new_artifact := &docker.ImportArtifact{ BuilderIdValue: dockerimport.BuilderId, Driver: &docker.DockerDriver{Ui: ui, Tpl: nil}, IdValue: image_id, } log.Printf("[DEBUG] artifact: %#v\n", new_artifact) return new_artifact, true, nil } }
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { if artifact.BuilderId() != dockerimport.BuilderId { err := fmt.Errorf( "Unknown artifact type: %s\nCan only import from docker-import artifacts.", artifact.BuilderId()) return nil, false, err } driver := p.Driver if driver == nil { // If no driver is set, then we use the real driver driver = &docker.DockerDriver{Tpl: p.config.tpl, Ui: ui} } // Get the name. We strip off any tags from the name because the // push doesn't use those. name := artifact.Id() if i := strings.Index(name, "/"); i >= 0 { // This should always be true because the / is required. But we have // to get the index to this so we don't accidentally strip off the port if j := strings.Index(name[i:], ":"); j >= 0 { name = name[:i+j] } } ui.Message("Pushing: " + name) if err := driver.Push(name); err != nil { return nil, false, err } return nil, false, nil }
func (p *DigitalOceanProvider) Process(ui packer.Ui, artifact packer.Artifact, dir string) (vagrantfile string, metadata map[string]interface{}, err error) { // Create the metadata metadata = map[string]interface{}{"provider": "digital_ocean"} // Determine the image and region... tplData := &digitalOceanVagrantfileTemplate{} parts := strings.Split(artifact.Id(), ":") if len(parts) != 2 { err = fmt.Errorf("Poorly formatted artifact ID: %s", artifact.Id()) return } tplData.Region = parts[0] tplData.Image = parts[1] // Build up the Vagrantfile var contents bytes.Buffer t := template.Must(template.New("vf").Parse(defaultDigitalOceanVagrantfile)) err = t.Execute(&contents, tplData) vagrantfile = contents.String() return }