65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
|
package vagrant
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"github.com/mitchellh/packer/packer"
|
||
|
"path/filepath"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type LibVirtProvider struct{}
|
||
|
|
||
|
func (p *LibVirtProvider) KeepInputArtifact() bool {
|
||
|
return false
|
||
|
}
|
||
|
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 "kvm", "qemu":
|
||
|
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
|
||
|
}
|
||
|
|
||
|
var libvirtVagrantfile = `
|
||
|
Vagrant.configure("2") do |config|
|
||
|
config.vm.provider :libvirt do |libvirt|
|
||
|
libvirt.driver = "%s"
|
||
|
end
|
||
|
end
|
||
|
`
|