From d748a7de7b16fd792e6e3d8d6b60a951f6031ac3 Mon Sep 17 00:00:00 2001 From: Pavel Boldyrev <627562+bpg@users.noreply.github.com> Date: Sun, 2 Jul 2023 20:45:06 -0400 Subject: [PATCH] fix(provider): fix config environment variables handling caused "rpc error" (#397) fix(provider): fix config environment variables handling causing "rpc error" --- proxmoxtf/provider/provider.go | 66 ++++++++++++++++++++++++++-------- proxmoxtf/provider/schema.go | 59 ++++++------------------------ 2 files changed, 62 insertions(+), 63 deletions(-) diff --git a/proxmoxtf/provider/provider.go b/proxmoxtf/provider/provider.go index 402da9d2..1a7f8794 100644 --- a/proxmoxtf/provider/provider.go +++ b/proxmoxtf/provider/provider.go @@ -18,6 +18,7 @@ import ( "github.com/bpg/terraform-provider-proxmox/proxmox/nodes" "github.com/bpg/terraform-provider-proxmox/proxmox/ssh" "github.com/bpg/terraform-provider-proxmox/proxmoxtf" + "github.com/bpg/terraform-provider-proxmox/utils" ) // ProxmoxVirtualEnvironment returns the object for this provider. @@ -43,18 +44,42 @@ func providerConfigure(_ context.Context, d *schema.ResourceData) (interface{}, var conn *api.Connection - creds, err = api.NewCredentials( - d.Get(mkProviderUsername).(string), - d.Get(mkProviderPassword).(string), - d.Get(mkProviderOTP).(string), - d.Get(mkProviderAPIToken).(string), - ) + // Check environment variables + apiToken := utils.GetAnyStringEnv("PROXMOX_VE_API_TOKEN", "PM_VE_API_TOKEN") + endpoint := utils.GetAnyStringEnv("PROXMOX_VE_ENDPOINT", "PM_VE_ENDPOINT") + insecure := utils.GetAnyBoolEnv("PROXMOX_VE_INSECURE", "PM_VE_INSECURE") + username := utils.GetAnyStringEnv("PROXMOX_VE_USERNAME", "PM_VE_USERNAME") + password := utils.GetAnyStringEnv("PROXMOX_VE_PASSWORD", "PM_VE_PASSWORD") + otp := utils.GetAnyStringEnv("PROXMOX_VE_OTP", "PM_VE_OTP") + + if v, ok := d.GetOk(mkProviderAPIToken); ok { + apiToken = v.(string) + } + + if v, ok := d.GetOk(mkProviderEndpoint); ok { + endpoint = v.(string) + } + + if v, ok := d.GetOk(mkProviderInsecure); ok { + insecure = v.(bool) + } + + if v, ok := d.GetOk(mkProviderUsername); ok { + username = v.(string) + } + + if v, ok := d.GetOk(mkProviderPassword); ok { + password = v.(string) + } + + if v, ok := d.GetOk(mkProviderOTP); ok { + otp = v.(string) + } + + creds, err = api.NewCredentials(username, password, otp, apiToken) diags = append(diags, diag.FromErr(err)...) - conn, err = api.NewConnection( - d.Get(mkProviderEndpoint).(string), - d.Get(mkProviderInsecure).(bool), - ) + conn, err = api.NewConnection(endpoint, insecure) diags = append(diags, diag.FromErr(err)...) if diags.HasError() { @@ -75,20 +100,33 @@ func providerConfigure(_ context.Context, d *schema.ResourceData) (interface{}, sshConf = sshBlock[0].(map[string]interface{}) } + sshUsername := utils.GetAnyStringEnv("PROXMOX_VE_SSH_USERNAME", "PM_VE_SSH_USERNAME") + sshPassword := utils.GetAnyStringEnv("PROXMOX_VE_SSH_PASSWORD", "PM_VE_SSH_PASSWORD") + sshAgent := utils.GetAnyBoolEnv("PROXMOX_VE_SSH_AGENT", "PM_VE_SSH_AGENT") + sshAgentSocket := utils.GetAnyStringEnv("SSH_AUTH_SOCK", "PROXMOX_VE_SSH_AUTH_SOCK", "PM_VE_SSH_AUTH_SOCK") + if v, ok := sshConf[mkProviderSSHUsername]; !ok || v.(string) == "" { - sshConf[mkProviderSSHUsername] = strings.Split(creds.Username, "@")[0] + if sshUsername != "" { + sshConf[mkProviderSSHUsername] = sshUsername + } else { + sshConf[mkProviderSSHUsername] = strings.Split(creds.Username, "@")[0] + } } if v, ok := sshConf[mkProviderSSHPassword]; !ok || v.(string) == "" { - sshConf[mkProviderSSHPassword] = creds.Password + if sshPassword != "" { + sshConf[mkProviderSSHPassword] = sshPassword + } else { + sshConf[mkProviderSSHPassword] = creds.Password + } } if _, ok := sshConf[mkProviderSSHAgent]; !ok { - sshConf[mkProviderSSHAgent] = false + sshConf[mkProviderSSHAgent] = sshAgent } if _, ok := sshConf[mkProviderSSHAgentSocket]; !ok { - sshConf[mkProviderSSHAgentSocket] = "" + sshConf[mkProviderSSHAgentSocket] = sshAgentSocket } nodeOverrides := map[string]string{} diff --git a/proxmoxtf/provider/schema.go b/proxmoxtf/provider/schema.go index 3b0357a8..d28ce982 100644 --- a/proxmoxtf/provider/schema.go +++ b/proxmoxtf/provider/schema.go @@ -36,30 +36,15 @@ const ( func createSchema() map[string]*schema.Schema { return map[string]*schema.Schema{ mkProviderEndpoint: { - Type: schema.TypeString, - Optional: true, - Description: "The endpoint for the Proxmox VE API.", - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"PROXMOX_VE_ENDPOINT", "PM_VE_ENDPOINT"}, - nil, - ), + Type: schema.TypeString, + Optional: true, + Description: "The endpoint for the Proxmox VE API.", ValidateFunc: validation.IsURLWithHTTPorHTTPS, }, mkProviderInsecure: { Type: schema.TypeBool, Optional: true, Description: "Whether to skip the TLS verification step.", - DefaultFunc: func() (interface{}, error) { - for _, k := range []string{"PROXMOX_VE_INSECURE", "PM_VE_INSECURE"} { - v := os.Getenv(k) - - if v == "true" || v == "1" { - return true, nil - } - } - - return false, nil - }, }, mkProviderOTP: { Type: schema.TypeString, @@ -67,38 +52,18 @@ func createSchema() map[string]*schema.Schema { Description: "The one-time password for the Proxmox VE API.", Deprecated: "The `otp` attribute is deprecated and will be removed in a future release. " + "Please use the `api_token` attribute instead.", - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"PROXMOX_VE_OTP", "PM_VE_OTP"}, - nil, - ), }, mkProviderPassword: { - Type: schema.TypeString, - Optional: true, - Sensitive: true, - Description: "The password for the Proxmox VE API.", - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"PROXMOX_VE_PASSWORD", "PM_VE_PASSWORD"}, - nil, - ), - AtLeastOneOf: []string{ - mkProviderPassword, - mkProviderAPIToken, - }, + Type: schema.TypeString, + Optional: true, + Sensitive: true, + Description: "The password for the Proxmox VE API.", ValidateFunc: validation.StringIsNotEmpty, }, mkProviderUsername: { - Type: schema.TypeString, - Optional: true, - Description: "The username for the Proxmox VE API.", - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"PROXMOX_VE_USERNAME", "PM_VE_USERNAME"}, - nil, - ), - AtLeastOneOf: []string{ - mkProviderUsername, - mkProviderAPIToken, - }, + Type: schema.TypeString, + Optional: true, + Description: "The username for the Proxmox VE API.", ValidateFunc: validation.StringIsNotEmpty, }, mkProviderAPIToken: { @@ -106,10 +71,6 @@ func createSchema() map[string]*schema.Schema { Optional: true, Sensitive: true, Description: "The API token for the Proxmox VE API.", - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"PROXMOX_VE_API_TOKEN", "PM_VE_API_TOKEN"}, - nil, - ), ValidateDiagFunc: validation.ToDiagFunc(validation.StringMatch( regexp.MustCompile(`^\S+@\w+!\S+=([a-zA-Z0-9-]+)$`), "Must be a valid API token, e.g. 'USER@REALM!TOKENID=UUID'",