diff --git a/builder/azure/dtl/builder.go b/builder/azure/dtl/builder.go index 3e45434e4..68a1cf286 100644 --- a/builder/azure/dtl/builder.go +++ b/builder/azure/dtl/builder.go @@ -14,6 +14,7 @@ import ( "github.com/Azure/go-autorest/autorest/adal" "github.com/dgrijalva/jwt-go" + "github.com/hashicorp/hcl/v2/hcldec" packerAzureCommon "github.com/hashicorp/packer/builder/azure/common" "github.com/hashicorp/packer/builder/azure/common/constants" "github.com/hashicorp/packer/builder/azure/common/lin" @@ -34,10 +35,12 @@ const ( DefaultSecretName = "packerKeyVaultSecret" ) -func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { +func (b *Builder) ConfigSpec() hcldec.ObjectSpec { return b.config.FlatMapstructure().HCL2Spec() } + +func (b *Builder) Prepare(raws ...interface{}) ([]string, []string, error) { c, warnings, errs := newConfig(raws...) if errs != nil { - return warnings, errs + return nil, warnings, errs } b.config = c @@ -46,7 +49,7 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { b.configureStateBag(b.stateBag) b.setTemplateParameters(b.stateBag) - return warnings, errs + return nil, warnings, errs } func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (packer.Artifact, error) { diff --git a/builder/azure/dtl/builder_test.go b/builder/azure/dtl/builder_test.go index a26701ef8..7456be9ce 100644 --- a/builder/azure/dtl/builder_test.go +++ b/builder/azure/dtl/builder_test.go @@ -8,7 +8,7 @@ import ( func TestStateBagShouldBePopulatedExpectedValues(t *testing.T) { var testSubject = &Builder{} - _, err := testSubject.Prepare(getArmBuilderConfiguration(), getPackerConfiguration()) + _, _, err := testSubject.Prepare(getArmBuilderConfiguration(), getPackerConfiguration()) if err != nil { t.Fatalf("failed to prepare: %s", err) } diff --git a/builder/azure/dtl/config.go b/builder/azure/dtl/config.go index 0f7725aad..46b44618a 100644 --- a/builder/azure/dtl/config.go +++ b/builder/azure/dtl/config.go @@ -1,4 +1,5 @@ //go:generate struct-markdown +//go:generate mapstructure-to-hcl2 -type Config,SharedImageGallery,SharedImageGalleryDestination,DtlArtifact,ArtifactParameter package dtl diff --git a/builder/azure/dtl/config.hcl2spec.go b/builder/azure/dtl/config.hcl2spec.go new file mode 100644 index 000000000..7c35f28b2 --- /dev/null +++ b/builder/azure/dtl/config.hcl2spec.go @@ -0,0 +1,326 @@ +// Code generated by "mapstructure-to-hcl2 -type Config,SharedImageGallery,SharedImageGalleryDestination,DtlArtifact,ArtifactParameter"; DO NOT EDIT. +package dtl + +import ( + "github.com/hashicorp/hcl/v2/hcldec" + "github.com/zclconf/go-cty/cty" +) + +// FlatArtifactParameter is an auto-generated flat version of ArtifactParameter. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatArtifactParameter struct { + Name *string `mapstructure:"name" cty:"name"` + Value *string `mapstructure:"value" cty:"value"` + Type *string `mapstructure:"type" cty:"type"` +} + +// FlatMapstructure returns a new FlatArtifactParameter. +// FlatArtifactParameter is an auto-generated flat version of ArtifactParameter. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*ArtifactParameter) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatArtifactParameter) +} + +// HCL2Spec returns the hcl spec of a ArtifactParameter. +// This spec is used by HCL to read the fields of ArtifactParameter. +// The decoded values from this spec will then be applied to a FlatArtifactParameter. +func (*FlatArtifactParameter) HCL2Spec() map[string]hcldec.Spec { + s := map[string]hcldec.Spec{ + "name": &hcldec.AttrSpec{Name: "name", Type: cty.String, Required: false}, + "value": &hcldec.AttrSpec{Name: "value", Type: cty.String, Required: false}, + "type": &hcldec.AttrSpec{Name: "type", Type: cty.String, Required: false}, + } + return s +} + +// FlatConfig is an auto-generated flat version of Config. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatConfig struct { + PackerBuildName *string `mapstructure:"packer_build_name" cty:"packer_build_name"` + PackerBuilderType *string `mapstructure:"packer_builder_type" cty:"packer_builder_type"` + PackerDebug *bool `mapstructure:"packer_debug" cty:"packer_debug"` + PackerForce *bool `mapstructure:"packer_force" cty:"packer_force"` + PackerOnError *string `mapstructure:"packer_on_error" cty:"packer_on_error"` + PackerUserVars map[string]string `mapstructure:"packer_user_variables" cty:"packer_user_variables"` + PackerSensitiveVars []string `mapstructure:"packer_sensitive_variables" cty:"packer_sensitive_variables"` + CloudEnvironmentName *string `mapstructure:"cloud_environment_name" required:"false" cty:"cloud_environment_name"` + ClientID *string `mapstructure:"client_id" cty:"client_id"` + ClientSecret *string `mapstructure:"client_secret" cty:"client_secret"` + ClientCertPath *string `mapstructure:"client_cert_path" cty:"client_cert_path"` + ClientJWT *string `mapstructure:"client_jwt" cty:"client_jwt"` + ObjectID *string `mapstructure:"object_id" cty:"object_id"` + TenantID *string `mapstructure:"tenant_id" required:"false" cty:"tenant_id"` + SubscriptionID *string `mapstructure:"subscription_id" cty:"subscription_id"` + CaptureNamePrefix *string `mapstructure:"capture_name_prefix" cty:"capture_name_prefix"` + CaptureContainerName *string `mapstructure:"capture_container_name" cty:"capture_container_name"` + SharedGallery *FlatSharedImageGallery `mapstructure:"shared_image_gallery" cty:"shared_image_gallery"` + SharedGalleryDestination *FlatSharedImageGalleryDestination `mapstructure:"shared_image_gallery_destination" cty:"shared_image_gallery_destination"` + SharedGalleryTimeout *string `mapstructure:"shared_image_gallery_timeout" cty:"shared_image_gallery_timeout"` + ImagePublisher *string `mapstructure:"image_publisher" cty:"image_publisher"` + ImageOffer *string `mapstructure:"image_offer" cty:"image_offer"` + ImageSku *string `mapstructure:"image_sku" cty:"image_sku"` + ImageVersion *string `mapstructure:"image_version" cty:"image_version"` + ImageUrl *string `mapstructure:"image_url" cty:"image_url"` + CustomManagedImageResourceGroupName *string `mapstructure:"custom_managed_image_resource_group_name" cty:"custom_managed_image_resource_group_name"` + CustomManagedImageName *string `mapstructure:"custom_managed_image_name" cty:"custom_managed_image_name"` + Location *string `mapstructure:"location" cty:"location"` + VMSize *string `mapstructure:"vm_size" cty:"vm_size"` + ManagedImageResourceGroupName *string `mapstructure:"managed_image_resource_group_name" cty:"managed_image_resource_group_name"` + ManagedImageName *string `mapstructure:"managed_image_name" cty:"managed_image_name"` + ManagedImageStorageAccountType *string `mapstructure:"managed_image_storage_account_type" required:"false" cty:"managed_image_storage_account_type"` + AzureTags map[string]*string `mapstructure:"azure_tags" required:"false" cty:"azure_tags"` + PlanID *string `mapstructure:"plan_id" required:"false" cty:"plan_id"` + PollingDurationTimeout *string `mapstructure:"polling_duration_timeout" required:"false" cty:"polling_duration_timeout"` + OSType *string `mapstructure:"os_type" required:"false" cty:"os_type"` + OSDiskSizeGB *int32 `mapstructure:"os_disk_size_gb" required:"false" cty:"os_disk_size_gb"` + AdditionalDiskSize []int32 `mapstructure:"disk_additional_size" required:"false" cty:"disk_additional_size"` + DiskCachingType *string `mapstructure:"disk_caching_type" required:"false" cty:"disk_caching_type"` + StorageType *string `mapstructure:"storage_type" cty:"storage_type"` + LabVirtualNetworkName *string `mapstructure:"lab_virtual_network_name" required:"false" cty:"lab_virtual_network_name"` + LabName *string `mapstructure:"lab_name" cty:"lab_name"` + LabSubnetName *string `mapstructure:"lab_subnet_name" required:"false" cty:"lab_subnet_name"` + LabResourceGroupName *string `mapstructure:"lab_resource_group_name" cty:"lab_resource_group_name"` + DtlArtifacts []FlatDtlArtifact `mapstructure:"dtl_artifacts" cty:"dtl_artifacts"` + VMName *string `mapstructure:"vm_name" required:"false" cty:"vm_name"` + UserName *string `cty:"user_name"` + Password *string `cty:"password"` + VMCreationResourceGroup *string `cty:"vm_creation_resource_group"` + Type *string `mapstructure:"communicator" cty:"communicator"` + PauseBeforeConnect *string `mapstructure:"pause_before_connecting" cty:"pause_before_connecting"` + SSHHost *string `mapstructure:"ssh_host" cty:"ssh_host"` + SSHPort *int `mapstructure:"ssh_port" cty:"ssh_port"` + SSHUsername *string `mapstructure:"ssh_username" cty:"ssh_username"` + SSHPassword *string `mapstructure:"ssh_password" cty:"ssh_password"` + SSHKeyPairName *string `mapstructure:"ssh_keypair_name" cty:"ssh_keypair_name"` + SSHTemporaryKeyPairName *string `mapstructure:"temporary_key_pair_name" cty:"temporary_key_pair_name"` + SSHClearAuthorizedKeys *bool `mapstructure:"ssh_clear_authorized_keys" cty:"ssh_clear_authorized_keys"` + SSHPrivateKeyFile *string `mapstructure:"ssh_private_key_file" cty:"ssh_private_key_file"` + SSHPty *bool `mapstructure:"ssh_pty" cty:"ssh_pty"` + SSHTimeout *string `mapstructure:"ssh_timeout" cty:"ssh_timeout"` + SSHAgentAuth *bool `mapstructure:"ssh_agent_auth" cty:"ssh_agent_auth"` + SSHDisableAgentForwarding *bool `mapstructure:"ssh_disable_agent_forwarding" cty:"ssh_disable_agent_forwarding"` + SSHHandshakeAttempts *int `mapstructure:"ssh_handshake_attempts" cty:"ssh_handshake_attempts"` + SSHBastionHost *string `mapstructure:"ssh_bastion_host" cty:"ssh_bastion_host"` + SSHBastionPort *int `mapstructure:"ssh_bastion_port" cty:"ssh_bastion_port"` + SSHBastionAgentAuth *bool `mapstructure:"ssh_bastion_agent_auth" cty:"ssh_bastion_agent_auth"` + SSHBastionUsername *string `mapstructure:"ssh_bastion_username" cty:"ssh_bastion_username"` + SSHBastionPassword *string `mapstructure:"ssh_bastion_password" cty:"ssh_bastion_password"` + SSHBastionPrivateKeyFile *string `mapstructure:"ssh_bastion_private_key_file" cty:"ssh_bastion_private_key_file"` + SSHFileTransferMethod *string `mapstructure:"ssh_file_transfer_method" cty:"ssh_file_transfer_method"` + SSHProxyHost *string `mapstructure:"ssh_proxy_host" cty:"ssh_proxy_host"` + SSHProxyPort *int `mapstructure:"ssh_proxy_port" cty:"ssh_proxy_port"` + SSHProxyUsername *string `mapstructure:"ssh_proxy_username" cty:"ssh_proxy_username"` + SSHProxyPassword *string `mapstructure:"ssh_proxy_password" cty:"ssh_proxy_password"` + SSHKeepAliveInterval *string `mapstructure:"ssh_keep_alive_interval" cty:"ssh_keep_alive_interval"` + SSHReadWriteTimeout *string `mapstructure:"ssh_read_write_timeout" cty:"ssh_read_write_timeout"` + SSHRemoteTunnels []string `mapstructure:"ssh_remote_tunnels" cty:"ssh_remote_tunnels"` + SSHLocalTunnels []string `mapstructure:"ssh_local_tunnels" cty:"ssh_local_tunnels"` + SSHPublicKey []byte `mapstructure:"ssh_public_key" cty:"ssh_public_key"` + SSHPrivateKey []byte `mapstructure:"ssh_private_key" cty:"ssh_private_key"` + WinRMUser *string `mapstructure:"winrm_username" cty:"winrm_username"` + WinRMPassword *string `mapstructure:"winrm_password" cty:"winrm_password"` + WinRMHost *string `mapstructure:"winrm_host" cty:"winrm_host"` + WinRMPort *int `mapstructure:"winrm_port" cty:"winrm_port"` + WinRMTimeout *string `mapstructure:"winrm_timeout" cty:"winrm_timeout"` + WinRMUseSSL *bool `mapstructure:"winrm_use_ssl" cty:"winrm_use_ssl"` + WinRMInsecure *bool `mapstructure:"winrm_insecure" cty:"winrm_insecure"` + WinRMUseNTLM *bool `mapstructure:"winrm_use_ntlm" cty:"winrm_use_ntlm"` + AsyncResourceGroupDelete *bool `mapstructure:"async_resourcegroup_delete" cty:"async_resourcegroup_delete"` +} + +// FlatMapstructure returns a new FlatConfig. +// FlatConfig is an auto-generated flat version of Config. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*Config) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatConfig) +} + +// HCL2Spec returns the hcl spec of a Config. +// This spec is used by HCL to read the fields of Config. +// The decoded values from this spec will then be applied to a FlatConfig. +func (*FlatConfig) HCL2Spec() map[string]hcldec.Spec { + s := map[string]hcldec.Spec{ + "packer_build_name": &hcldec.AttrSpec{Name: "packer_build_name", Type: cty.String, Required: false}, + "packer_builder_type": &hcldec.AttrSpec{Name: "packer_builder_type", Type: cty.String, Required: false}, + "packer_debug": &hcldec.AttrSpec{Name: "packer_debug", Type: cty.Bool, Required: false}, + "packer_force": &hcldec.AttrSpec{Name: "packer_force", Type: cty.Bool, Required: false}, + "packer_on_error": &hcldec.AttrSpec{Name: "packer_on_error", Type: cty.String, Required: false}, + "packer_user_variables": &hcldec.BlockAttrsSpec{TypeName: "packer_user_variables", ElementType: cty.String, Required: false}, + "packer_sensitive_variables": &hcldec.AttrSpec{Name: "packer_sensitive_variables", Type: cty.List(cty.String), Required: false}, + "cloud_environment_name": &hcldec.AttrSpec{Name: "cloud_environment_name", Type: cty.String, Required: false}, + "client_id": &hcldec.AttrSpec{Name: "client_id", Type: cty.String, Required: false}, + "client_secret": &hcldec.AttrSpec{Name: "client_secret", Type: cty.String, Required: false}, + "client_cert_path": &hcldec.AttrSpec{Name: "client_cert_path", Type: cty.String, Required: false}, + "client_jwt": &hcldec.AttrSpec{Name: "client_jwt", Type: cty.String, Required: false}, + "object_id": &hcldec.AttrSpec{Name: "object_id", Type: cty.String, Required: false}, + "tenant_id": &hcldec.AttrSpec{Name: "tenant_id", Type: cty.String, Required: false}, + "subscription_id": &hcldec.AttrSpec{Name: "subscription_id", Type: cty.String, Required: false}, + "capture_name_prefix": &hcldec.AttrSpec{Name: "capture_name_prefix", Type: cty.String, Required: false}, + "capture_container_name": &hcldec.AttrSpec{Name: "capture_container_name", Type: cty.String, Required: false}, + "shared_image_gallery": &hcldec.BlockSpec{TypeName: "shared_image_gallery", Nested: hcldec.ObjectSpec((*FlatSharedImageGallery)(nil).HCL2Spec())}, + "shared_image_gallery_destination": &hcldec.BlockSpec{TypeName: "shared_image_gallery_destination", Nested: hcldec.ObjectSpec((*FlatSharedImageGalleryDestination)(nil).HCL2Spec())}, + "shared_image_gallery_timeout": &hcldec.AttrSpec{Name: "shared_image_gallery_timeout", Type: cty.String, Required: false}, + "image_publisher": &hcldec.AttrSpec{Name: "image_publisher", Type: cty.String, Required: false}, + "image_offer": &hcldec.AttrSpec{Name: "image_offer", Type: cty.String, Required: false}, + "image_sku": &hcldec.AttrSpec{Name: "image_sku", Type: cty.String, Required: false}, + "image_version": &hcldec.AttrSpec{Name: "image_version", Type: cty.String, Required: false}, + "image_url": &hcldec.AttrSpec{Name: "image_url", Type: cty.String, Required: false}, + "custom_managed_image_resource_group_name": &hcldec.AttrSpec{Name: "custom_managed_image_resource_group_name", Type: cty.String, Required: false}, + "custom_managed_image_name": &hcldec.AttrSpec{Name: "custom_managed_image_name", Type: cty.String, Required: false}, + "location": &hcldec.AttrSpec{Name: "location", Type: cty.String, Required: false}, + "vm_size": &hcldec.AttrSpec{Name: "vm_size", Type: cty.String, Required: false}, + "managed_image_resource_group_name": &hcldec.AttrSpec{Name: "managed_image_resource_group_name", Type: cty.String, Required: false}, + "managed_image_name": &hcldec.AttrSpec{Name: "managed_image_name", Type: cty.String, Required: false}, + "managed_image_storage_account_type": &hcldec.AttrSpec{Name: "managed_image_storage_account_type", Type: cty.String, Required: false}, + "azure_tags": &hcldec.BlockAttrsSpec{TypeName: "azure_tags", ElementType: cty.String, Required: false}, + "plan_id": &hcldec.AttrSpec{Name: "plan_id", Type: cty.String, Required: false}, + "polling_duration_timeout": &hcldec.AttrSpec{Name: "polling_duration_timeout", Type: cty.String, Required: false}, + "os_type": &hcldec.AttrSpec{Name: "os_type", Type: cty.String, Required: false}, + "os_disk_size_gb": &hcldec.AttrSpec{Name: "os_disk_size_gb", Type: cty.Number, Required: false}, + "disk_additional_size": &hcldec.AttrSpec{Name: "disk_additional_size", Type: cty.List(cty.Number), Required: false}, + "disk_caching_type": &hcldec.AttrSpec{Name: "disk_caching_type", Type: cty.String, Required: false}, + "storage_type": &hcldec.AttrSpec{Name: "storage_type", Type: cty.String, Required: false}, + "lab_virtual_network_name": &hcldec.AttrSpec{Name: "lab_virtual_network_name", Type: cty.String, Required: false}, + "lab_name": &hcldec.AttrSpec{Name: "lab_name", Type: cty.String, Required: false}, + "lab_subnet_name": &hcldec.AttrSpec{Name: "lab_subnet_name", Type: cty.String, Required: false}, + "lab_resource_group_name": &hcldec.AttrSpec{Name: "lab_resource_group_name", Type: cty.String, Required: false}, + "dtl_artifacts": &hcldec.BlockListSpec{TypeName: "dtl_artifacts", Nested: hcldec.ObjectSpec((*FlatDtlArtifact)(nil).HCL2Spec())}, + "vm_name": &hcldec.AttrSpec{Name: "vm_name", Type: cty.String, Required: false}, + "user_name": &hcldec.AttrSpec{Name: "user_name", Type: cty.String, Required: false}, + "password": &hcldec.AttrSpec{Name: "password", Type: cty.String, Required: false}, + "vm_creation_resource_group": &hcldec.AttrSpec{Name: "vm_creation_resource_group", Type: cty.String, Required: false}, + "communicator": &hcldec.AttrSpec{Name: "communicator", Type: cty.String, Required: false}, + "pause_before_connecting": &hcldec.AttrSpec{Name: "pause_before_connecting", Type: cty.String, Required: false}, + "ssh_host": &hcldec.AttrSpec{Name: "ssh_host", Type: cty.String, Required: false}, + "ssh_port": &hcldec.AttrSpec{Name: "ssh_port", Type: cty.Number, Required: false}, + "ssh_username": &hcldec.AttrSpec{Name: "ssh_username", Type: cty.String, Required: false}, + "ssh_password": &hcldec.AttrSpec{Name: "ssh_password", Type: cty.String, Required: false}, + "ssh_keypair_name": &hcldec.AttrSpec{Name: "ssh_keypair_name", Type: cty.String, Required: false}, + "temporary_key_pair_name": &hcldec.AttrSpec{Name: "temporary_key_pair_name", Type: cty.String, Required: false}, + "ssh_clear_authorized_keys": &hcldec.AttrSpec{Name: "ssh_clear_authorized_keys", Type: cty.Bool, Required: false}, + "ssh_private_key_file": &hcldec.AttrSpec{Name: "ssh_private_key_file", Type: cty.String, Required: false}, + "ssh_pty": &hcldec.AttrSpec{Name: "ssh_pty", Type: cty.Bool, Required: false}, + "ssh_timeout": &hcldec.AttrSpec{Name: "ssh_timeout", Type: cty.String, Required: false}, + "ssh_agent_auth": &hcldec.AttrSpec{Name: "ssh_agent_auth", Type: cty.Bool, Required: false}, + "ssh_disable_agent_forwarding": &hcldec.AttrSpec{Name: "ssh_disable_agent_forwarding", Type: cty.Bool, Required: false}, + "ssh_handshake_attempts": &hcldec.AttrSpec{Name: "ssh_handshake_attempts", Type: cty.Number, Required: false}, + "ssh_bastion_host": &hcldec.AttrSpec{Name: "ssh_bastion_host", Type: cty.String, Required: false}, + "ssh_bastion_port": &hcldec.AttrSpec{Name: "ssh_bastion_port", Type: cty.Number, Required: false}, + "ssh_bastion_agent_auth": &hcldec.AttrSpec{Name: "ssh_bastion_agent_auth", Type: cty.Bool, Required: false}, + "ssh_bastion_username": &hcldec.AttrSpec{Name: "ssh_bastion_username", Type: cty.String, Required: false}, + "ssh_bastion_password": &hcldec.AttrSpec{Name: "ssh_bastion_password", Type: cty.String, Required: false}, + "ssh_bastion_private_key_file": &hcldec.AttrSpec{Name: "ssh_bastion_private_key_file", Type: cty.String, Required: false}, + "ssh_file_transfer_method": &hcldec.AttrSpec{Name: "ssh_file_transfer_method", Type: cty.String, Required: false}, + "ssh_proxy_host": &hcldec.AttrSpec{Name: "ssh_proxy_host", Type: cty.String, Required: false}, + "ssh_proxy_port": &hcldec.AttrSpec{Name: "ssh_proxy_port", Type: cty.Number, Required: false}, + "ssh_proxy_username": &hcldec.AttrSpec{Name: "ssh_proxy_username", Type: cty.String, Required: false}, + "ssh_proxy_password": &hcldec.AttrSpec{Name: "ssh_proxy_password", Type: cty.String, Required: false}, + "ssh_keep_alive_interval": &hcldec.AttrSpec{Name: "ssh_keep_alive_interval", Type: cty.String, Required: false}, + "ssh_read_write_timeout": &hcldec.AttrSpec{Name: "ssh_read_write_timeout", Type: cty.String, Required: false}, + "ssh_remote_tunnels": &hcldec.AttrSpec{Name: "ssh_remote_tunnels", Type: cty.List(cty.String), Required: false}, + "ssh_local_tunnels": &hcldec.AttrSpec{Name: "ssh_local_tunnels", Type: cty.List(cty.String), Required: false}, + "ssh_public_key": &hcldec.AttrSpec{Name: "ssh_public_key", Type: cty.List(cty.Number), Required: false}, + "ssh_private_key": &hcldec.AttrSpec{Name: "ssh_private_key", Type: cty.List(cty.Number), Required: false}, + "winrm_username": &hcldec.AttrSpec{Name: "winrm_username", Type: cty.String, Required: false}, + "winrm_password": &hcldec.AttrSpec{Name: "winrm_password", Type: cty.String, Required: false}, + "winrm_host": &hcldec.AttrSpec{Name: "winrm_host", Type: cty.String, Required: false}, + "winrm_port": &hcldec.AttrSpec{Name: "winrm_port", Type: cty.Number, Required: false}, + "winrm_timeout": &hcldec.AttrSpec{Name: "winrm_timeout", Type: cty.String, Required: false}, + "winrm_use_ssl": &hcldec.AttrSpec{Name: "winrm_use_ssl", Type: cty.Bool, Required: false}, + "winrm_insecure": &hcldec.AttrSpec{Name: "winrm_insecure", Type: cty.Bool, Required: false}, + "winrm_use_ntlm": &hcldec.AttrSpec{Name: "winrm_use_ntlm", Type: cty.Bool, Required: false}, + "async_resourcegroup_delete": &hcldec.AttrSpec{Name: "async_resourcegroup_delete", Type: cty.Bool, Required: false}, + } + return s +} + +// FlatDtlArtifact is an auto-generated flat version of DtlArtifact. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatDtlArtifact struct { + ArtifactName *string `mapstructure:"artifact_name" cty:"artifact_name"` + RepositoryName *string `mapstructure:"repository_name" cty:"repository_name"` + ArtifactId *string `mapstructure:"artifact_id" cty:"artifact_id"` + Parameters []FlatArtifactParameter `mapstructure:"parameters" cty:"parameters"` +} + +// FlatMapstructure returns a new FlatDtlArtifact. +// FlatDtlArtifact is an auto-generated flat version of DtlArtifact. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*DtlArtifact) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatDtlArtifact) +} + +// HCL2Spec returns the hcl spec of a DtlArtifact. +// This spec is used by HCL to read the fields of DtlArtifact. +// The decoded values from this spec will then be applied to a FlatDtlArtifact. +func (*FlatDtlArtifact) HCL2Spec() map[string]hcldec.Spec { + s := map[string]hcldec.Spec{ + "artifact_name": &hcldec.AttrSpec{Name: "artifact_name", Type: cty.String, Required: false}, + "repository_name": &hcldec.AttrSpec{Name: "repository_name", Type: cty.String, Required: false}, + "artifact_id": &hcldec.AttrSpec{Name: "artifact_id", Type: cty.String, Required: false}, + "parameters": &hcldec.BlockListSpec{TypeName: "parameters", Nested: hcldec.ObjectSpec((*FlatArtifactParameter)(nil).HCL2Spec())}, + } + return s +} + +// FlatSharedImageGallery is an auto-generated flat version of SharedImageGallery. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatSharedImageGallery struct { + Subscription *string `mapstructure:"subscription" cty:"subscription"` + ResourceGroup *string `mapstructure:"resource_group" cty:"resource_group"` + GalleryName *string `mapstructure:"gallery_name" cty:"gallery_name"` + ImageName *string `mapstructure:"image_name" cty:"image_name"` + ImageVersion *string `mapstructure:"image_version" cty:"image_version"` +} + +// FlatMapstructure returns a new FlatSharedImageGallery. +// FlatSharedImageGallery is an auto-generated flat version of SharedImageGallery. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*SharedImageGallery) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatSharedImageGallery) +} + +// HCL2Spec returns the hcl spec of a SharedImageGallery. +// This spec is used by HCL to read the fields of SharedImageGallery. +// The decoded values from this spec will then be applied to a FlatSharedImageGallery. +func (*FlatSharedImageGallery) HCL2Spec() map[string]hcldec.Spec { + s := map[string]hcldec.Spec{ + "subscription": &hcldec.AttrSpec{Name: "subscription", Type: cty.String, Required: false}, + "resource_group": &hcldec.AttrSpec{Name: "resource_group", Type: cty.String, Required: false}, + "gallery_name": &hcldec.AttrSpec{Name: "gallery_name", Type: cty.String, Required: false}, + "image_name": &hcldec.AttrSpec{Name: "image_name", Type: cty.String, Required: false}, + "image_version": &hcldec.AttrSpec{Name: "image_version", Type: cty.String, Required: false}, + } + return s +} + +// FlatSharedImageGalleryDestination is an auto-generated flat version of SharedImageGalleryDestination. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatSharedImageGalleryDestination struct { + SigDestinationResourceGroup *string `mapstructure:"resource_group" cty:"resource_group"` + SigDestinationGalleryName *string `mapstructure:"gallery_name" cty:"gallery_name"` + SigDestinationImageName *string `mapstructure:"image_name" cty:"image_name"` + SigDestinationImageVersion *string `mapstructure:"image_version" cty:"image_version"` + SigDestinationReplicationRegions []string `mapstructure:"replication_regions" cty:"replication_regions"` +} + +// FlatMapstructure returns a new FlatSharedImageGalleryDestination. +// FlatSharedImageGalleryDestination is an auto-generated flat version of SharedImageGalleryDestination. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*SharedImageGalleryDestination) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatSharedImageGalleryDestination) +} + +// HCL2Spec returns the hcl spec of a SharedImageGalleryDestination. +// This spec is used by HCL to read the fields of SharedImageGalleryDestination. +// The decoded values from this spec will then be applied to a FlatSharedImageGalleryDestination. +func (*FlatSharedImageGalleryDestination) HCL2Spec() map[string]hcldec.Spec { + s := map[string]hcldec.Spec{ + "resource_group": &hcldec.AttrSpec{Name: "resource_group", Type: cty.String, Required: false}, + "gallery_name": &hcldec.AttrSpec{Name: "gallery_name", Type: cty.String, Required: false}, + "image_name": &hcldec.AttrSpec{Name: "image_name", Type: cty.String, Required: false}, + "image_version": &hcldec.AttrSpec{Name: "image_version", Type: cty.String, Required: false}, + "replication_regions": &hcldec.AttrSpec{Name: "replication_regions", Type: cty.List(cty.String), Required: false}, + } + return s +} diff --git a/go.sum b/go.sum index ae80d571e..7ab09fc2a 100644 --- a/go.sum +++ b/go.sum @@ -300,8 +300,11 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +<<<<<<< HEAD github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +======= +>>>>>>> Fixing the latest changes from the merge github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= diff --git a/provisioner/azure-dtlartifact/provisioner.go b/provisioner/azure-dtlartifact/provisioner.go index 6ff8c00cb..93cc6b1c6 100644 --- a/provisioner/azure-dtlartifact/provisioner.go +++ b/provisioner/azure-dtlartifact/provisioner.go @@ -1,4 +1,5 @@ -// This package implements a provisioner for Packer that uses +//go:generate mapstructure-to-hcl2 -type Config,DtlArtifact,ArtifactParameter + package devtestlabsartifacts import ( @@ -7,6 +8,7 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/services/devtestlabs/mgmt/2018-09-15/dtl" + "github.com/hashicorp/hcl/v2/hcldec" "github.com/hashicorp/packer/builder/azure/common/client" dtlBuilder "github.com/hashicorp/packer/builder/azure/dtl" @@ -65,6 +67,8 @@ type Provisioner struct { guestCommands *provisioner.GuestCommands } +func (p *Provisioner) ConfigSpec() hcldec.ObjectSpec { return p.config.FlatMapstructure().HCL2Spec() } + func (p *Provisioner) Prepare(raws ...interface{}) error { // // Create passthrough for winrm password so we can fill it in once we know // // it @@ -93,7 +97,7 @@ func (p *Provisioner) Communicator() packer.Communicator { return p.communicator } -func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.Communicator) error { +func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.Communicator, _ map[string]interface{}) error { p.communicator = comm diff --git a/provisioner/azure-dtlartifact/provisioner.hcl2spec.go b/provisioner/azure-dtlartifact/provisioner.hcl2spec.go new file mode 100644 index 000000000..e6bec30fa --- /dev/null +++ b/provisioner/azure-dtlartifact/provisioner.hcl2spec.go @@ -0,0 +1,126 @@ +// Code generated by "mapstructure-to-hcl2 -type Config,DtlArtifact,ArtifactParameter"; DO NOT EDIT. +package devtestlabsartifacts + +import ( + "github.com/hashicorp/hcl/v2/hcldec" + "github.com/zclconf/go-cty/cty" +) + +// FlatArtifactParameter is an auto-generated flat version of ArtifactParameter. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatArtifactParameter struct { + Name *string `mapstructure:"name" cty:"name"` + Value *string `mapstructure:"value" cty:"value"` + Type *string `mapstructure:"type" cty:"type"` +} + +// FlatMapstructure returns a new FlatArtifactParameter. +// FlatArtifactParameter is an auto-generated flat version of ArtifactParameter. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*ArtifactParameter) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatArtifactParameter) +} + +// HCL2Spec returns the hcl spec of a ArtifactParameter. +// This spec is used by HCL to read the fields of ArtifactParameter. +// The decoded values from this spec will then be applied to a FlatArtifactParameter. +func (*FlatArtifactParameter) HCL2Spec() map[string]hcldec.Spec { + s := map[string]hcldec.Spec{ + "name": &hcldec.AttrSpec{Name: "name", Type: cty.String, Required: false}, + "value": &hcldec.AttrSpec{Name: "value", Type: cty.String, Required: false}, + "type": &hcldec.AttrSpec{Name: "type", Type: cty.String, Required: false}, + } + return s +} + +// FlatConfig is an auto-generated flat version of Config. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatConfig struct { + PackerBuildName *string `mapstructure:"packer_build_name" cty:"packer_build_name"` + PackerBuilderType *string `mapstructure:"packer_builder_type" cty:"packer_builder_type"` + PackerDebug *bool `mapstructure:"packer_debug" cty:"packer_debug"` + PackerForce *bool `mapstructure:"packer_force" cty:"packer_force"` + PackerOnError *string `mapstructure:"packer_on_error" cty:"packer_on_error"` + PackerUserVars map[string]string `mapstructure:"packer_user_variables" cty:"packer_user_variables"` + PackerSensitiveVars []string `mapstructure:"packer_sensitive_variables" cty:"packer_sensitive_variables"` + CloudEnvironmentName *string `mapstructure:"cloud_environment_name" required:"false" cty:"cloud_environment_name"` + ClientID *string `mapstructure:"client_id" cty:"client_id"` + ClientSecret *string `mapstructure:"client_secret" cty:"client_secret"` + ClientCertPath *string `mapstructure:"client_cert_path" cty:"client_cert_path"` + ClientJWT *string `mapstructure:"client_jwt" cty:"client_jwt"` + ObjectID *string `mapstructure:"object_id" cty:"object_id"` + TenantID *string `mapstructure:"tenant_id" required:"false" cty:"tenant_id"` + SubscriptionID *string `mapstructure:"subscription_id" cty:"subscription_id"` + DtlArtifacts []FlatDtlArtifact `mapstructure:"dtl_artifacts" cty:"dtl_artifacts"` + LabName *string `mapstructure:"lab_name" cty:"lab_name"` + ResourceGroupName *string `mapstructure:"resource_group_name" cty:"resource_group_name"` + VMName *string `mapstructure:"vm_name" cty:"vm_name"` + PollingDurationTimeout *string `mapstructure:"polling_duration_timeout" required:"false" cty:"polling_duration_timeout"` + AzureTags map[string]*string `mapstructure:"azure_tags" cty:"azure_tags"` + Json map[string]interface{} `cty:"json"` +} + +// FlatMapstructure returns a new FlatConfig. +// FlatConfig is an auto-generated flat version of Config. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*Config) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatConfig) +} + +// HCL2Spec returns the hcl spec of a Config. +// This spec is used by HCL to read the fields of Config. +// The decoded values from this spec will then be applied to a FlatConfig. +func (*FlatConfig) HCL2Spec() map[string]hcldec.Spec { + s := map[string]hcldec.Spec{ + "packer_build_name": &hcldec.AttrSpec{Name: "packer_build_name", Type: cty.String, Required: false}, + "packer_builder_type": &hcldec.AttrSpec{Name: "packer_builder_type", Type: cty.String, Required: false}, + "packer_debug": &hcldec.AttrSpec{Name: "packer_debug", Type: cty.Bool, Required: false}, + "packer_force": &hcldec.AttrSpec{Name: "packer_force", Type: cty.Bool, Required: false}, + "packer_on_error": &hcldec.AttrSpec{Name: "packer_on_error", Type: cty.String, Required: false}, + "packer_user_variables": &hcldec.BlockAttrsSpec{TypeName: "packer_user_variables", ElementType: cty.String, Required: false}, + "packer_sensitive_variables": &hcldec.AttrSpec{Name: "packer_sensitive_variables", Type: cty.List(cty.String), Required: false}, + "cloud_environment_name": &hcldec.AttrSpec{Name: "cloud_environment_name", Type: cty.String, Required: false}, + "client_id": &hcldec.AttrSpec{Name: "client_id", Type: cty.String, Required: false}, + "client_secret": &hcldec.AttrSpec{Name: "client_secret", Type: cty.String, Required: false}, + "client_cert_path": &hcldec.AttrSpec{Name: "client_cert_path", Type: cty.String, Required: false}, + "client_jwt": &hcldec.AttrSpec{Name: "client_jwt", Type: cty.String, Required: false}, + "object_id": &hcldec.AttrSpec{Name: "object_id", Type: cty.String, Required: false}, + "tenant_id": &hcldec.AttrSpec{Name: "tenant_id", Type: cty.String, Required: false}, + "subscription_id": &hcldec.AttrSpec{Name: "subscription_id", Type: cty.String, Required: false}, + "dtl_artifacts": &hcldec.BlockListSpec{TypeName: "dtl_artifacts", Nested: hcldec.ObjectSpec((*FlatDtlArtifact)(nil).HCL2Spec())}, + "lab_name": &hcldec.AttrSpec{Name: "lab_name", Type: cty.String, Required: false}, + "resource_group_name": &hcldec.AttrSpec{Name: "resource_group_name", Type: cty.String, Required: false}, + "vm_name": &hcldec.AttrSpec{Name: "vm_name", Type: cty.String, Required: false}, + "polling_duration_timeout": &hcldec.AttrSpec{Name: "polling_duration_timeout", Type: cty.String, Required: false}, + "azure_tags": &hcldec.BlockAttrsSpec{TypeName: "azure_tags", ElementType: cty.String, Required: false}, + "json": &hcldec.BlockAttrsSpec{TypeName: "json", ElementType: cty.String, Required: false}, + } + return s +} + +// FlatDtlArtifact is an auto-generated flat version of DtlArtifact. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatDtlArtifact struct { + ArtifactName *string `mapstructure:"artifact_name" cty:"artifact_name"` + ArtifactId *string `mapstructure:"artifact_id" cty:"artifact_id"` + Parameters []FlatArtifactParameter `mapstructure:"parameters" cty:"parameters"` +} + +// FlatMapstructure returns a new FlatDtlArtifact. +// FlatDtlArtifact is an auto-generated flat version of DtlArtifact. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*DtlArtifact) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatDtlArtifact) +} + +// HCL2Spec returns the hcl spec of a DtlArtifact. +// This spec is used by HCL to read the fields of DtlArtifact. +// The decoded values from this spec will then be applied to a FlatDtlArtifact. +func (*FlatDtlArtifact) HCL2Spec() map[string]hcldec.Spec { + s := map[string]hcldec.Spec{ + "artifact_name": &hcldec.AttrSpec{Name: "artifact_name", Type: cty.String, Required: false}, + "artifact_id": &hcldec.AttrSpec{Name: "artifact_id", Type: cty.String, Required: false}, + "parameters": &hcldec.BlockListSpec{TypeName: "parameters", Nested: hcldec.ObjectSpec((*FlatArtifactParameter)(nil).HCL2Spec())}, + } + return s +} diff --git a/website/source/partials/builder/azure/dtl/_Config-not-required.html.md b/website/source/partials/builder/azure/dtl/_Config-not-required.html.md index b226a1756..0b4b26b9a 100644 --- a/website/source/partials/builder/azure/dtl/_Config-not-required.html.md +++ b/website/source/partials/builder/azure/dtl/_Config-not-required.html.md @@ -111,7 +111,7 @@ type for a managed image. Valid values are Standard_LRS and Premium_LRS. The default is Standard_LRS. -- `azure_tags` (map[string]\*string) - the user can define up to 15 +- `azure_tags` (map[string]\*string) - The user can define up to 15 tags. Tag names cannot exceed 512 characters, and tag values cannot exceed 256 characters. Tags are applied to every resource deployed by a Packer build, i.e. Resource Group, VM, NIC, VNET, Public IP, KeyVault, etc. @@ -148,13 +148,41 @@ - `disk_caching_type` (string) - Specify the disk caching type. Valid values are None, ReadOnly, and ReadWrite. The default value is ReadWrite. -- `storage_type` (string) - DTL values +- `storage_type` (string) - Storage Type +- `lab_virtual_network_name` (string) - The virtual netowrk which is used for the Lab Virtual machines creation. This should be specified with + LabSubnetName that the user wishes to create the virtual machine. If both LabVirtualNetworkName and LabSubnetName + are not specified then packer picks the first network that it can find. The build can fail if this subnetname picked is + not empty. + +- `lab_name` (string) - The name of the DevTest Lab in which user creates the virtual machine and the image. + +- `lab_subnet_name` (string) - The DevTest Lab subnet in which the user wishes to create the temporary virtual machine. Should be specified + with LabVirtualNetworkName + +- `lab_resource_group_name` (string) - The resource group in which DevTest Lab is located + +- `dtl_artifacts` ([]DtlArtifact) - The list of DevTest labs artifacts that can be applied while preparing the Virtual machine. It is often recommended and + faster to install the artifacts during the creation of the Virtual Machine. For example, + { + "artifact_name": "linux-apt-package", + "parameters" : [{ + "name": "packages", + "value": "vim" + }, + { + "name":"update", + "value": "true" + }, + { + "name": "options", + "value": "--fix-broken" + } + ]}, + { + "artifact_name": "linux-install-mongodb" + } + +- `vm_name` (string) - Name of the temporary virtual machine that can be optionally specified. -- `lab_virtual_network_name` (string) - Lab Virtual Network Name -- `lab_name` (string) - Lab Name -- `lab_subnet_name` (string) - Lab Subnet Name -- `lab_resource_group_name` (string) - Lab Resource Group Name -- `dtl_artifacts` ([]DtlArtifact) - Dtl Artifacts -- `vm_name` (string) - VM Name - `async_resourcegroup_delete` (bool) - Cleanup \ No newline at end of file