diff --git a/internal/juju/applications.go b/internal/juju/applications.go index afd7dd18..93b0d246 100644 --- a/internal/juju/applications.go +++ b/internal/juju/applications.go @@ -182,12 +182,12 @@ func (input CreateApplicationInput) validateAndTransform(conn api.Connection) (p if err != nil { return parsed, err } - kwownSpaceNames := set.NewStrings() + knownSpaceNames := set.NewStrings() for _, space := range knownSpaces { - kwownSpaceNames.Add(space.Name) + knownSpaceNames.Add(space.Name) } for endpoint, space := range input.EndpointBindings { - if !kwownSpaceNames.Contains(space) { + if !knownSpaceNames.Contains(space) { return parsed, fmt.Errorf("unknown space %q", space) } endpointBindings[endpoint] = space diff --git a/internal/provider/resource_application.go b/internal/provider/resource_application.go index 5bcab3a6..bd4a2f66 100644 --- a/internal/provider/resource_application.go +++ b/internal/provider/resource_application.go @@ -6,7 +6,6 @@ package provider import ( "context" "fmt" - "strings" "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" @@ -177,13 +176,13 @@ func (r *applicationResource) Schema(_ context.Context, _ resource.SchemaRequest stringplanmodifier.UseStateForUnknown(), }, }, - "endpoint_bindings": schema.SetNestedAttribute{ + EndpointBindingsKey: schema.SetNestedAttribute{ Description: "Configure endpoint bindings", Optional: true, NestedObject: schema.NestedAttributeObject{ Attributes: map[string]schema.Attribute{ "endpoint": schema.StringAttribute{ - Description: "Name of the endpoint to bind to a space.", + Description: "Name of the endpoint to bind to a space. Keep null (or undefined) to define default binding.", Optional: true, }, "space": schema.StringAttribute{ diff --git a/internal/provider/resource_application_test.go b/internal/provider/resource_application_test.go index 4fbf7de1..9a7b880b 100644 --- a/internal/provider/resource_application_test.go +++ b/internal/provider/resource_application_test.go @@ -299,10 +299,10 @@ func TestAcc_ResourceApplication_EndpointBindings(t *testing.T) { PreConfig: func() {}, Config: testAccResourceApplicationEndpointBindings(modelName, appName, constraints, map[string]string{"": managementSpace, "ubuntu": publicSpace}), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr("juju_application.this", "model", modelName), - resource.TestCheckResourceAttr("juju_application.this", "endpoint_bindings.#", "2"), - resource.TestCheckTypeSetElemNestedAttrs("juju_application.this", "endpoint_bindings.*", map[string]string{"endpoint": "", "space": managementSpace}), - resource.TestCheckTypeSetElemNestedAttrs("juju_application.this", "endpoint_bindings.*", map[string]string{"endpoint": "ubuntu", "space": publicSpace}), + resource.TestCheckResourceAttr(fmt.Sprintf("juju_application.%s", appName), "model", modelName), + resource.TestCheckResourceAttr(fmt.Sprintf("juju_application.%s", appName), "endpoint_bindings.#", "2"), + resource.TestCheckTypeSetElemNestedAttrs(fmt.Sprintf("juju_application.%s", appName), "endpoint_bindings.*", map[string]string{"endpoint": "", "space": managementSpace}), + resource.TestCheckTypeSetElemNestedAttrs(fmt.Sprintf("juju_application.%s", appName), "endpoint_bindings.*", map[string]string{"endpoint": "ubuntu", "space": publicSpace}), testCheckEndpointsAreSetToCorrectSpace(modelName, appName, managementSpace, map[string]string{"": managementSpace, "ubuntu": publicSpace}), ), }, @@ -330,9 +330,9 @@ func TestAcc_ResourceApplication_UpdateEndpointBindings(t *testing.T) { PreConfig: func() {}, Config: testAccResourceApplicationEndpointBindings(modelName, appName, constraints, map[string]string{"": managementSpace}), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr("juju_application.this", "model", modelName), - resource.TestCheckResourceAttr("juju_application.this", "endpoint_bindings.#", "1"), - resource.TestCheckTypeSetElemNestedAttrs("juju_application.this", "endpoint_bindings.*", map[string]string{"endpoint": "", "space": managementSpace}), + resource.TestCheckResourceAttr(fmt.Sprintf("juju_application.%s", appName), "model", modelName), + resource.TestCheckResourceAttr(fmt.Sprintf("juju_application.%s", appName), "endpoint_bindings.#", "1"), + resource.TestCheckTypeSetElemNestedAttrs(fmt.Sprintf("juju_application.%s", appName), "endpoint_bindings.*", map[string]string{"endpoint": "", "space": managementSpace}), testCheckEndpointsAreSetToCorrectSpace(modelName, appName, managementSpace, map[string]string{"": managementSpace}), ), }, @@ -342,9 +342,9 @@ func TestAcc_ResourceApplication_UpdateEndpointBindings(t *testing.T) { PreConfig: func() {}, Config: testAccResourceApplicationEndpointBindings(modelName, appName, constraints, map[string]string{"": publicSpace}), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr("juju_application.this", "model", modelName), - resource.TestCheckResourceAttr("juju_application.this", "endpoint_bindings.#", "1"), - resource.TestCheckTypeSetElemNestedAttrs("juju_application.this", "endpoint_bindings.*", map[string]string{"endpoint": "", "space": publicSpace}), + resource.TestCheckResourceAttr(fmt.Sprintf("juju_application.%s", appName), "model", modelName), + resource.TestCheckResourceAttr(fmt.Sprintf("juju_application.%s", appName), "endpoint_bindings.#", "1"), + resource.TestCheckTypeSetElemNestedAttrs(fmt.Sprintf("juju_application.%s", appName), "endpoint_bindings.*", map[string]string{"endpoint": "", "space": publicSpace}), testCheckEndpointsAreSetToCorrectSpace(modelName, appName, publicSpace, map[string]string{"": publicSpace, "ubuntu": publicSpace, "another": publicSpace}), ), }, @@ -354,10 +354,10 @@ func TestAcc_ResourceApplication_UpdateEndpointBindings(t *testing.T) { PreConfig: func() {}, Config: testAccResourceApplicationEndpointBindings(modelName, appName, constraints, map[string]string{"": managementSpace, "ubuntu": publicSpace}), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr("juju_application.this", "model", modelName), - resource.TestCheckResourceAttr("juju_application.this", "endpoint_bindings.#", "2"), - resource.TestCheckTypeSetElemNestedAttrs("juju_application.this", "endpoint_bindings.*", map[string]string{"endpoint": "", "space": managementSpace}), - resource.TestCheckTypeSetElemNestedAttrs("juju_application.this", "endpoint_bindings.*", map[string]string{"endpoint": "ubuntu", "space": publicSpace}), + resource.TestCheckResourceAttr(fmt.Sprintf("juju_application.%s", appName), "model", modelName), + resource.TestCheckResourceAttr(fmt.Sprintf("juju_application.%s", appName), "endpoint_bindings.#", "2"), + resource.TestCheckTypeSetElemNestedAttrs(fmt.Sprintf("juju_application.%s", appName), "endpoint_bindings.*", map[string]string{"endpoint": "", "space": managementSpace}), + resource.TestCheckTypeSetElemNestedAttrs(fmt.Sprintf("juju_application.%s", appName), "endpoint_bindings.*", map[string]string{"endpoint": "ubuntu", "space": publicSpace}), testCheckEndpointsAreSetToCorrectSpace(modelName, appName, managementSpace, map[string]string{"": managementSpace, "ubuntu": publicSpace, "another": managementSpace}), ), }, @@ -676,25 +676,29 @@ func testAccResourceApplicationEndpointBindings(modelName, appName, constraints `, endpoint, space) } } - - return fmt.Sprintf(` -data "juju_model" "this" { - name = %q + return internaltesting.GetStringFromTemplateWithData("testAccResourceApplicationEndpointBindings", ` +data "juju_model" "{{.ModelName}}" { + name = "{{.ModelName}}" } -resource "juju_application" "this" { - model = data.juju_model.this.name - name = %q - constraints = %q +resource "juju_application" "{{.AppName}}" { + model = data.juju_model.{{.ModelName}}.name + name = "{{.AppName}}" + constraints = "{{.Constraints}}" charm { name = "jameinel-ubuntu-lite" revision = 10 } endpoint_bindings = [ - %s + {{.EndpointBindings}} ] } -`, modelName, appName, constraints, endpoints) +`, internaltesting.TemplateData{ + "ModelName": modelName, + "AppName": appName, + "Constraints": constraints, + "EndpointBindings": endpoints, + }) } func testCheckEndpointsAreSetToCorrectSpace(modelName, appName, defaultSpace string, configuredEndpoints map[string]string) resource.TestCheckFunc {