Merge pull request #7397 from vhaidamaka/fix-7321

Add vagrant-cloud post-processor support for the vagrant builder
This commit is contained in:
Megan Marsh 2019-03-15 16:00:05 -07:00 committed by GitHub
commit 24c42e4a1f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 36 additions and 27 deletions

View File

@ -15,14 +15,16 @@ const BuilderId = "vagrant"
type artifact struct {
OutputDir string
BoxName string
Provider string
}
// NewArtifact returns a vagrant artifact containing the .box file
func NewArtifact(dir string) (packer.Artifact, error) {
func NewArtifact(provider, dir string) packer.Artifact {
return &artifact{
OutputDir: dir,
BoxName: "package.box",
}, nil
Provider: provider,
}
}
func (*artifact) BuilderId() string {
@ -30,15 +32,15 @@ func (*artifact) BuilderId() string {
}
func (a *artifact) Files() []string {
return []string{a.BoxName}
return []string{filepath.Join(a.OutputDir, a.BoxName)}
}
func (a *artifact) Id() string {
return filepath.Join(a.OutputDir, a.BoxName)
return a.Provider
}
func (a *artifact) String() string {
return fmt.Sprintf("Vagrant box is %s", a.Id())
return fmt.Sprintf("Vagrant box '%s' for '%s' provider", a.BoxName, a.Provider)
}
func (a *artifact) State(name string) interface{} {

View File

@ -20,13 +20,11 @@ func TestArtifactId(t *testing.T) {
a := &artifact{
OutputDir: "/my/dir",
BoxName: "package.box",
Provider: "virtualbox",
}
expected := "/my/dir/package.box"
if runtime.GOOS == "windows" {
expected = strings.Replace(expected, "/", "\\", -1)
}
if strings.Compare(a.Id(), expected) != 0 {
expected := "virtualbox"
if a.Id() != expected {
t.Fatalf("artifact ID should match: expected: %s received: %s", expected, a.Id())
}
}
@ -35,8 +33,9 @@ func TestArtifactString(t *testing.T) {
a := &artifact{
OutputDir: "/my/dir",
BoxName: "package.box",
Provider: "virtualbox",
}
expected := "Vagrant box is /my/dir/package.box"
expected := "Vagrant box 'package.box' for 'virtualbox' provider"
if runtime.GOOS == "windows" {
expected = strings.Replace(expected, "/", "\\", -1)
}

View File

@ -259,7 +259,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook) (packer.Artifact, error) {
return nil, errors.New("Build was halted.")
}
return NewArtifact(b.config.OutputDir)
return NewArtifact(b.config.Provider, b.config.OutputDir), nil
}
// Cancel.

View File

@ -1,7 +1,7 @@
// vagrant_cloud implements the packer.PostProcessor interface and adds a
// post-processor that uploads artifacts from the vagrant post-processor
// to Vagrant Cloud (vagrantcloud.com) or manages self hosted boxes on the
// Vagrant Cloud
// and vagrant builder to Vagrant Cloud (vagrantcloud.com) or manages
// self hosted boxes on the Vagrant Cloud
package vagrantcloud
import (
@ -17,6 +17,11 @@ import (
"github.com/hashicorp/packer/template/interpolate"
)
var builtins = map[string]string{
"mitchellh.post-processor.vagrant": "vagrant",
"vagrant": "vagrant",
}
const VAGRANT_CLOUD_URL = "https://vagrantcloud.com/api/v1"
type Config struct {
@ -113,16 +118,15 @@ func (p *PostProcessor) Configure(raws ...interface{}) error {
}
func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) {
// Only accepts input from the vagrant post-processor
if artifact.BuilderId() != "mitchellh.post-processor.vagrant" {
if _, ok := builtins[artifact.BuilderId()]; !ok {
return nil, false, fmt.Errorf(
"Unknown artifact type, requires box from vagrant post-processor: %s", artifact.BuilderId())
"Unknown artifact type, requires box from vagrant post-processor or vagrant builder: %s", artifact.BuilderId())
}
// We assume that there is only one .box file to upload
if !strings.HasSuffix(artifact.Files()[0], ".box") {
return nil, false, fmt.Errorf(
"Unknown files in artifact from vagrant post-processor: %s", artifact.Files())
"Unknown files in artifact, vagrant box is required: %s", artifact.Files())
}
if p.warnAtlasToken {

View File

@ -27,7 +27,7 @@ You can change the behavior so that the builder doesn't destroy the box by
setting the `teardown_method` option. You can change the behavior so the builder
doesn't package it (not all provisioners support the `vagrant package` command)
by setting the `skip package` option. You can also change the behavior so that
rather than inititalizing a new Vagrant workspace, you use an already defined
rather than initializing a new Vagrant workspace, you use an already defined
one, by using `global_id` instead of `source_box`.
## Configuration Reference
@ -61,6 +61,10 @@ one, by using `global_id` instead of `source_box`.
to Vagrant, this is the name to give it. If left blank, will default to
"packer_" plus your buildname.
- `provider` (string) - The vagrant [provider](docs/post-processors/vagrant.html).
This parameter is required to use vagrant builder with the `vagrant-cloud`
post-processor. Defaults to unset.
- `checksum` (string) - The checksum for the .box file. The type of the
checksum is specified with `checksum_type`, documented below.
@ -76,8 +80,8 @@ one, by using `global_id` instead of `source_box`.
{{ .SyncedFolder }}, which correspond to the Packer options `box_name` and
`synced_folder`
- `skip_add` (string) - Don't call "vagrant add" to add the box to your local
environment; this is necesasry if you want to launch a box that is already
- `skip_add` (bool) - Don't call "vagrant add" to add the box to your local
environment; this is necessary if you want to launch a box that is already
added to your vagrant environment.
- `teardown_method` (string) - Whether to halt, suspend, or destroy the box when

View File

@ -1,9 +1,9 @@
---
description: |
The Packer Vagrant Cloud post-processor receives a Vagrant box from the
`vagrant` post-processor and pushes it to Vagrant Cloud. Vagrant Cloud hosts
and serves boxes to Vagrant, allowing you to version and distribute boxes to an
organization in a simple way.
`vagrant` post-processor or vagrant builder and pushes it to Vagrant Cloud.
Vagrant Cloud hosts and serves boxes to Vagrant, allowing you to version and
distribute boxes to an organization in a simple way.
layout: docs
page_title: 'Vagrant Cloud - Post-Processors'
sidebar_current: 'docs-post-processors-vagrant-cloud'
@ -14,9 +14,9 @@ sidebar_current: 'docs-post-processors-vagrant-cloud'
Type: `vagrant-cloud`
The Packer Vagrant Cloud post-processor receives a Vagrant box from the
`vagrant` post-processor and pushes it to Vagrant Cloud. [Vagrant
Cloud](https://app.vagrantup.com/boxes/search) hosts and serves boxes to
Vagrant, allowing you to version and distribute boxes to an organization in a
`vagrant` post-processor or vagrant builder and pushes it to Vagrant Cloud.
[Vagrant Cloud](https://app.vagrantup.com/boxes/search) hosts and serves boxes
to Vagrant, allowing you to version and distribute boxes to an organization in a
simple way.
You'll need to be familiar with Vagrant Cloud, have an upgraded account to