packer/command/vendored_plugins.go
hashicorp-copywrite[bot] 19055df3ec
[COMPLIANCE] License changes (#12568)
* Updating the license from MPL to Business Source License

Going forward, this project will be licensed under the Business Source License v1.1. Please see our blog post for more details at https://hashi.co/bsl-blog, FAQ at https://hashi.co/license-faq, and details of the license at www.hashicorp.com/bsl.

* Update copyright file headers to BUSL-1.1

---------

Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com>
2023-08-10 15:53:29 -07:00

303 lines
13 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package command
import (
"fmt"
"log"
"strings"
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
// Previously core-bundled components, split into their own plugins but
// still vendored with Packer for now. Importing as library instead of
// forcing use of packer init.
amazonchrootbuilder "github.com/hashicorp/packer-plugin-amazon/builder/chroot"
amazonebsbuilder "github.com/hashicorp/packer-plugin-amazon/builder/ebs"
amazonebssurrogatebuilder "github.com/hashicorp/packer-plugin-amazon/builder/ebssurrogate"
amazonebsvolumebuilder "github.com/hashicorp/packer-plugin-amazon/builder/ebsvolume"
amazoninstancebuilder "github.com/hashicorp/packer-plugin-amazon/builder/instance"
amazonamidatasource "github.com/hashicorp/packer-plugin-amazon/datasource/ami"
amazonsecretsmanagerdatasource "github.com/hashicorp/packer-plugin-amazon/datasource/secretsmanager"
anazibimportpostprocessor "github.com/hashicorp/packer-plugin-amazon/post-processor/import"
ansibleprovisioner "github.com/hashicorp/packer-plugin-ansible/provisioner/ansible"
ansiblelocalprovisioner "github.com/hashicorp/packer-plugin-ansible/provisioner/ansible-local"
azurearmbuilder "github.com/hashicorp/packer-plugin-azure/builder/azure/arm"
azurechrootbuilder "github.com/hashicorp/packer-plugin-azure/builder/azure/chroot"
azuredtlbuilder "github.com/hashicorp/packer-plugin-azure/builder/azure/dtl"
azuredtlartifactprovisioner "github.com/hashicorp/packer-plugin-azure/provisioner/azure-dtlartifact"
dockerbuilder "github.com/hashicorp/packer-plugin-docker/builder/docker"
dockerimportpostprocessor "github.com/hashicorp/packer-plugin-docker/post-processor/docker-import"
dockerpushpostprocessor "github.com/hashicorp/packer-plugin-docker/post-processor/docker-push"
dockersavepostprocessor "github.com/hashicorp/packer-plugin-docker/post-processor/docker-save"
dockertagpostprocessor "github.com/hashicorp/packer-plugin-docker/post-processor/docker-tag"
googlecomputebuilder "github.com/hashicorp/packer-plugin-googlecompute/builder/googlecompute"
googlecomputeexportpostprocessor "github.com/hashicorp/packer-plugin-googlecompute/post-processor/googlecompute-export"
googlecomputeimportpostprocessor "github.com/hashicorp/packer-plugin-googlecompute/post-processor/googlecompute-import"
qemubuilder "github.com/hashicorp/packer-plugin-qemu/builder/qemu"
vagrantbuilder "github.com/hashicorp/packer-plugin-vagrant/builder/vagrant"
vagrantpostprocessor "github.com/hashicorp/packer-plugin-vagrant/post-processor/vagrant"
vagrantcloudpostprocessor "github.com/hashicorp/packer-plugin-vagrant/post-processor/vagrant-cloud"
virtualboxisobuilder "github.com/hashicorp/packer-plugin-virtualbox/builder/virtualbox/iso"
virtualboxovfbuilder "github.com/hashicorp/packer-plugin-virtualbox/builder/virtualbox/ovf"
virtualboxvmbuilder "github.com/hashicorp/packer-plugin-virtualbox/builder/virtualbox/vm"
vmwareisobuilder "github.com/hashicorp/packer-plugin-vmware/builder/vmware/iso"
vmwarevmxbuilder "github.com/hashicorp/packer-plugin-vmware/builder/vmware/vmx"
vsphereclonebuilder "github.com/hashicorp/packer-plugin-vsphere/builder/vsphere/clone"
vsphereisobuilder "github.com/hashicorp/packer-plugin-vsphere/builder/vsphere/iso"
vspherepostprocessor "github.com/hashicorp/packer-plugin-vsphere/post-processor/vsphere"
vspheretemplatepostprocessor "github.com/hashicorp/packer-plugin-vsphere/post-processor/vsphere-template"
)
// VendoredDatasources are datasource components that were once bundled with the
// Packer core, but are now being imported from their counterpart plugin repos
var VendoredDatasources = map[string]packersdk.Datasource{
"amazon-ami": new(amazonamidatasource.Datasource),
"amazon-secretsmanager": new(amazonsecretsmanagerdatasource.Datasource),
}
// VendoredBuilders are builder components that were once bundled with the
// Packer core, but are now being imported from their counterpart plugin repos
var VendoredBuilders = map[string]packersdk.Builder{
"amazon-ebs": new(amazonebsbuilder.Builder),
"amazon-chroot": new(amazonchrootbuilder.Builder),
"amazon-ebssurrogate": new(amazonebssurrogatebuilder.Builder),
"amazon-ebsvolume": new(amazonebsvolumebuilder.Builder),
"amazon-instance": new(amazoninstancebuilder.Builder),
"azure-arm": new(azurearmbuilder.Builder),
"azure-chroot": new(azurechrootbuilder.Builder),
"azure-dtl": new(azuredtlbuilder.Builder),
"docker": new(dockerbuilder.Builder),
"googlecompute": new(googlecomputebuilder.Builder),
"qemu": new(qemubuilder.Builder),
"vagrant": new(vagrantbuilder.Builder),
"vsphere-clone": new(vsphereclonebuilder.Builder),
"vsphere-iso": new(vsphereisobuilder.Builder),
"virtualbox-iso": new(virtualboxisobuilder.Builder),
"virtualbox-ovf": new(virtualboxovfbuilder.Builder),
"virtualbox-vm": new(virtualboxvmbuilder.Builder),
"vmware-iso": new(vmwareisobuilder.Builder),
"vmware-vmx": new(vmwarevmxbuilder.Builder),
}
// VendoredProvisioners are provisioner components that were once bundled with the
// Packer core, but are now being imported from their counterpart plugin repos
var VendoredProvisioners = map[string]packersdk.Provisioner{
"azure-dtlartifact": new(azuredtlartifactprovisioner.Provisioner),
"ansible": new(ansibleprovisioner.Provisioner),
"ansible-local": new(ansiblelocalprovisioner.Provisioner),
}
// VendoredPostProcessors are post-processor components that were once bundled with the
// Packer core, but are now being imported from their counterpart plugin repos
var VendoredPostProcessors = map[string]packersdk.PostProcessor{
"amazon-import": new(anazibimportpostprocessor.PostProcessor),
"docker-import": new(dockerimportpostprocessor.PostProcessor),
"docker-push": new(dockerpushpostprocessor.PostProcessor),
"docker-save": new(dockersavepostprocessor.PostProcessor),
"docker-tag": new(dockertagpostprocessor.PostProcessor),
"googlecompute-export": new(googlecomputeexportpostprocessor.PostProcessor),
"googlecompute-import": new(googlecomputeimportpostprocessor.PostProcessor),
"vagrant": new(vagrantpostprocessor.PostProcessor),
"vagrant-cloud": new(vagrantcloudpostprocessor.PostProcessor),
"vsphere-template": new(vspheretemplatepostprocessor.PostProcessor),
"vsphere": new(vspherepostprocessor.PostProcessor),
}
// bundledStatus is used to know if one of the bundled components is loaded from
// an external plugin, or from the bundled plugins.
//
// We keep track of this to produce a warning if a user relies on one
// such plugin, as they will be removed in a later version of Packer.
var bundledStatus = map[string]bool{
"packer-builder-amazon-ebs": false,
"packer-builder-amazon-chroot": false,
"packer-builder-amazon-ebssurrogate": false,
"packer-builder-amazon-ebsvolume": false,
"packer-builder-amazon-instance": false,
"packer-post-processor-amazon-import": false,
"packer-datasource-amazon-ami": false,
"packer-datasource-amazon-secretsmanager": false,
"packer-provisioner-ansible": false,
"packer-provisioner-ansible-local": false,
"packer-provisioner-azure-dtlartifact": false,
"packer-builder-azure-arm": false,
"packer-builder-azure-chroot": false,
"packer-builder-azure-dtl": false,
"packer-builder-docker": false,
"packer-post-processor-docker-import": false,
"packer-post-processor-docker-push": false,
"packer-post-processor-docker-save": false,
"packer-post-processor-docker-tag": false,
"packer-builder-googlecompute": false,
"packer-post-processor-googlecompute-export": false,
"packer-post-processor-googlecompute-import": false,
"packer-builder-qemu": false,
"packer-builder-vagrant": false,
"packer-post-processor-vagrant": false,
"packer-post-processor-vagrant-cloud": false,
"packer-builder-virtualbox-iso": false,
"packer-builder-virtualbox-ovf": false,
"packer-builder-virtualbox-vm": false,
"packer-builder-vmware-iso": false,
"packer-builder-vmware-vmx": false,
"packer-builder-vsphere-clone": false,
"packer-builder-vsphere-iso": false,
"packer-post-processor-vsphere-template": false,
"packer-post-processor-vsphere": false,
}
// TrackBundledPlugin marks a component as loaded from Packer's bundled plugins
// instead of from an externally loaded plugin.
//
// NOTE: `pluginName' must be in the format `packer-<type>-<component_name>'
func TrackBundledPlugin(pluginName string) {
_, exists := bundledStatus[pluginName]
if !exists {
return
}
bundledStatus[pluginName] = true
}
var componentPluginMap = map[string]string{
"packer-builder-amazon-ebs": "github.com/hashicorp/amazon",
"packer-builder-amazon-chroot": "github.com/hashicorp/amazon",
"packer-builder-amazon-ebssurrogate": "github.com/hashicorp/amazon",
"packer-builder-amazon-ebsvolume": "github.com/hashicorp/amazon",
"packer-builder-amazon-instance": "github.com/hashicorp/amazon",
"packer-post-processor-amazon-import": "github.com/hashicorp/amazon",
"packer-datasource-amazon-ami": "github.com/hashicorp/amazon",
"packer-datasource-amazon-secretsmanager": "github.com/hashicorp/amazon",
"packer-provisioner-ansible": "github.com/hashicorp/ansible",
"packer-provisioner-ansible-local": "github.com/hashicorp/ansible",
"packer-provisioner-azure-dtlartifact": "github.com/hashicorp/azure",
"packer-builder-azure-arm": "github.com/hashicorp/azure",
"packer-builder-azure-chroot": "github.com/hashicorp/azure",
"packer-builder-azure-dtl": "github.com/hashicorp/azure",
"packer-builder-docker": "github.com/hashicorp/docker",
"packer-post-processor-docker-import": "github.com/hashicorp/docker",
"packer-post-processor-docker-push": "github.com/hashicorp/docker",
"packer-post-processor-docker-save": "github.com/hashicorp/docker",
"packer-post-processor-docker-tag": "github.com/hashicorp/docker",
"packer-builder-googlecompute": "github.com/hashicorp/googlecompute",
"packer-post-processor-googlecompute-export": "github.com/hashicorp/googlecompute",
"packer-post-processor-googlecompute-import": "github.com/hashicorp/googlecompute",
"packer-builder-qemu": "github.com/hashicorp/qemu",
"packer-builder-vagrant": "github.com/hashicorp/vagrant",
"packer-post-processor-vagrant": "github.com/hashicorp/vagrant",
"packer-post-processor-vagrant-cloud": "github.com/hashicorp/vagrant",
"packer-builder-virtualbox-iso": "github.com/hashicorp/virtualbox",
"packer-builder-virtualbox-ovf": "github.com/hashicorp/virtualbox",
"packer-builder-virtualbox-vm": "github.com/hashicorp/virtualbox",
"packer-builder-vmware-iso": "github.com/hashicorp/vmware",
"packer-builder-vmware-vmx": "github.com/hashicorp/vmware",
"packer-builder-vsphere-clone": "github.com/hashicorp/vsphere",
"packer-builder-vsphere-iso": "github.com/hashicorp/vsphere",
"packer-post-processor-vsphere-template": "github.com/hashicorp/vsphere",
"packer-post-processor-vsphere": "github.com/hashicorp/vsphere",
}
// compileBundledPluginList returns a list of plugins to import in a config
//
// This only works on bundled plugins and serves as a way to inform users that
// they should not rely on a bundled plugin anymore, but give them recommendations
// on how to manage those plugins instead.
func compileBundledPluginList(componentMap map[string]struct{}) []string {
plugins := map[string]struct{}{}
for component := range componentMap {
plugin, ok := componentPluginMap[component]
if !ok {
log.Printf("Unknown bundled plugin component: %q", component)
continue
}
plugins[plugin] = struct{}{}
}
pluginList := make([]string, 0, len(plugins))
for plugin := range plugins {
pluginList = append(pluginList, plugin)
}
return pluginList
}
func generateRequiredPluginsBlock(plugins []string) string {
if len(plugins) == 0 {
return ""
}
buf := &strings.Builder{}
buf.WriteString(`
packer {
required_plugins {`)
for _, plugin := range plugins {
pluginName := strings.Replace(plugin, "github.com/hashicorp/", "", 1)
fmt.Fprintf(buf, `
%s = {
source = %q
version = "~> 1"
}`, pluginName, plugin)
}
buf.WriteString(`
}
}
`)
return buf.String()
}
// Upon init lets load up any plugins that were vendored manually into the default
// set of plugins.
func init() {
for k, v := range VendoredDatasources {
if _, ok := Datasources[k]; ok {
continue
}
Datasources[k] = v
}
for k, v := range VendoredBuilders {
if _, ok := Builders[k]; ok {
continue
}
Builders[k] = v
}
for k, v := range VendoredProvisioners {
if _, ok := Provisioners[k]; ok {
continue
}
Provisioners[k] = v
}
for k, v := range VendoredPostProcessors {
if _, ok := PostProcessors[k]; ok {
continue
}
PostProcessors[k] = v
}
}