Skip to content

Commit

Permalink
new resource azurerm_spring_cloud_app_mysql_association (#11229)
Browse files Browse the repository at this point in the history
  • Loading branch information
njuCZ authored Apr 13, 2021
1 parent ef610f2 commit 8b40243
Show file tree
Hide file tree
Showing 5 changed files with 478 additions and 1 deletion.
1 change: 1 addition & 0 deletions azurerm/internal/services/springcloud/registration.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ func (r Registration) SupportedResources() map[string]*schema.Resource {
return map[string]*schema.Resource{
"azurerm_spring_cloud_active_deployment": resourceSpringCloudActiveDeployment(),
"azurerm_spring_cloud_app": resourceSpringCloudApp(),
"azurerm_spring_cloud_app_mysql_association": resourceSpringCloudAppMysqlAssociation(),
"azurerm_spring_cloud_app_redis_association": resourceSpringCloudAppRedisAssociation(),
"azurerm_spring_cloud_certificate": resourceSpringCloudCertificate(),
"azurerm_spring_cloud_custom_domain": resourceSpringCloudCustomDomain(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ import (
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts"
)

const springCloudAppAssociationTypeRedis = "Microsoft.Cache"
const (
springCloudAppAssociationTypeMysql = "Microsoft.DBforMySQL"
springCloudAppAssociationTypeRedis = "Microsoft.Cache"
)

func importSpringCloudAppAssociation(resourceType string) func(d *schema.ResourceData, meta interface{}) (data []*schema.ResourceData, err error) {
return func(d *schema.ResourceData, meta interface{}) (data []*schema.ResourceData, err error) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
package springcloud

import (
"fmt"
"log"
"time"

"github.com/Azure/azure-sdk-for-go/services/preview/appplatform/mgmt/2020-11-01-preview/appplatform"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
mysqlValidate "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/mysql/validate"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/springcloud/parse"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/springcloud/validate"
azSchema "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tf/schema"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

const (
springCloudAppMysqlAssociationKeyDatabase = "databaseName"
springCloudAppMysqlAssociationKeyUsername = "username"
)

func resourceSpringCloudAppMysqlAssociation() *schema.Resource {
return &schema.Resource{
Create: resourceSpringCloudAppMysqlAssociationCreateUpdate,
Read: resourceSpringCloudAppMysqlAssociationRead,
Update: resourceSpringCloudAppMysqlAssociationCreateUpdate,
Delete: resourceSpringCloudAppMysqlAssociationDelete,

Importer: azSchema.ValidateResourceIDPriorToImportThen(func(id string) error {
_, err := parse.SpringCloudAppAssociationID(id)
return err
}, importSpringCloudAppAssociation(springCloudAppAssociationTypeMysql)),

Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(30 * time.Minute),
Read: schema.DefaultTimeout(5 * time.Minute),
Update: schema.DefaultTimeout(30 * time.Minute),
Delete: schema.DefaultTimeout(30 * time.Minute),
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validate.SpringCloudAppAssociationName,
},

"spring_cloud_app_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validate.SpringCloudAppID,
},

"mysql_server_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: mysqlValidate.ServerID,
},

"database_name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringIsNotEmpty,
},

"username": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringIsNotEmpty,
},

"password": {
Type: schema.TypeString,
Required: true,
Sensitive: true,
ValidateFunc: validation.StringIsNotEmpty,
},
},
}
}

func resourceSpringCloudAppMysqlAssociationCreateUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).AppPlatform.BindingsClient
ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d)
defer cancel()

appId, err := parse.SpringCloudAppID(d.Get("spring_cloud_app_id").(string))
if err != nil {
return err
}

id := parse.NewSpringCloudAppAssociationID(appId.SubscriptionId, appId.ResourceGroup, appId.SpringName, appId.AppName, d.Get("name").(string))
if d.IsNewResource() {
existing, err := client.Get(ctx, id.ResourceGroup, id.SpringName, id.AppName, id.BindingName)
if err != nil {
if !utils.ResponseWasNotFound(existing.Response) {
return fmt.Errorf("checking for presence of existing %s: %+v", id, err)
}
}
if !utils.ResponseWasNotFound(existing.Response) {
return tf.ImportAsExistsError("azurerm_spring_cloud_app_mysql_association", id.ID())
}
}

bindingResource := appplatform.BindingResource{
Properties: &appplatform.BindingResourceProperties{
BindingParameters: map[string]interface{}{
springCloudAppMysqlAssociationKeyDatabase: d.Get("database_name").(string),
springCloudAppMysqlAssociationKeyUsername: d.Get("username").(string),
},
Key: utils.String(d.Get("password").(string)),
ResourceID: utils.String(d.Get("mysql_server_id").(string)),
},
}

if _, err := client.CreateOrUpdate(ctx, id.ResourceGroup, id.SpringName, id.AppName, id.BindingName, bindingResource); err != nil {
return fmt.Errorf("creating %s: %+v", id, err)
}

d.SetId(id.ID())
return resourceSpringCloudAppMysqlAssociationRead(d, meta)
}

func resourceSpringCloudAppMysqlAssociationRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).AppPlatform.BindingsClient
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d)
defer cancel()

id, err := parse.SpringCloudAppAssociationID(d.Id())
if err != nil {
return err
}

resp, err := client.Get(ctx, id.ResourceGroup, id.SpringName, id.AppName, id.BindingName)
if err != nil {
if utils.ResponseWasNotFound(resp.Response) {
log.Printf("[INFO] Spring Cloud App Association %q does not exist - removing from state", d.Id())
d.SetId("")
return nil
}
return fmt.Errorf("reading %s: %+v", id, err)
}

d.Set("name", id.BindingName)
d.Set("spring_cloud_app_id", parse.NewSpringCloudAppID(id.SubscriptionId, id.ResourceGroup, id.SpringName, id.AppName).ID())
if props := resp.Properties; props != nil {
d.Set("mysql_server_id", props.ResourceID)

databaseName := ""
if v, ok := props.BindingParameters[springCloudAppMysqlAssociationKeyDatabase]; ok {
databaseName = v.(string)
}
d.Set("database_name", databaseName)

username := ""
if v, ok := props.BindingParameters[springCloudAppMysqlAssociationKeyUsername]; ok {
username = v.(string)
}
d.Set("username", username)
}
return nil
}

func resourceSpringCloudAppMysqlAssociationDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).AppPlatform.BindingsClient
ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d)
defer cancel()

id, err := parse.SpringCloudAppAssociationID(d.Id())
if err != nil {
return err
}

if _, err := client.Delete(ctx, id.ResourceGroup, id.SpringName, id.AppName, id.BindingName); err != nil {
return fmt.Errorf("deleting %s: %+v", id, err)
}

return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
package springcloud_test

import (
"context"
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/terraform"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance/check"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/springcloud/parse"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

type SpringCloudAppMysqlAssociationResource struct {
}

func TestAccSpringCloudAppMysqlAssociation_basic(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_spring_cloud_app_mysql_association", "test")
r := SpringCloudAppMysqlAssociationResource{}

data.ResourceTest(t, r, []resource.TestStep{
{
Config: r.basic(data),
Check: resource.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep("password"),
})
}

func TestAccSpringCloudAppMysqlAssociation_requiresImport(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_spring_cloud_app_mysql_association", "test")
r := SpringCloudAppMysqlAssociationResource{}

data.ResourceTest(t, r, []resource.TestStep{
{
Config: r.basic(data),
Check: resource.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.RequiresImportErrorStep(r.requiresImport),
})
}

func TestAccSpringCloudAppMysqlAssociation_update(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_spring_cloud_app_mysql_association", "test")
r := SpringCloudAppMysqlAssociationResource{}

data.ResourceTest(t, r, []resource.TestStep{
{
Config: r.basic(data),
Check: resource.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep("password"),
{
Config: r.update(data),
Check: resource.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep("password"),
})
}

func (r SpringCloudAppMysqlAssociationResource) Exists(ctx context.Context, clients *clients.Client, state *terraform.InstanceState) (*bool, error) {
id, err := parse.SpringCloudAppAssociationID(state.ID)
if err != nil {
return nil, err
}

resp, err := clients.AppPlatform.BindingsClient.Get(ctx, id.ResourceGroup, id.SpringName, id.AppName, id.BindingName)
if err != nil {
return nil, fmt.Errorf("reading %s: %+v", id, err)
}

return utils.Bool(resp.Properties != nil), nil
}

func (r SpringCloudAppMysqlAssociationResource) basic(data acceptance.TestData) string {
return fmt.Sprintf(`
%s
resource "azurerm_spring_cloud_app_mysql_association" "test" {
name = "acctestscamb-%d"
spring_cloud_app_id = azurerm_spring_cloud_app.test.id
mysql_server_id = azurerm_mysql_server.test.id
database_name = azurerm_mysql_database.test.name
username = azurerm_mysql_server.test.administrator_login
password = azurerm_mysql_server.test.administrator_login_password
}
`, r.template(data), data.RandomInteger)
}

func (r SpringCloudAppMysqlAssociationResource) requiresImport(data acceptance.TestData) string {
return fmt.Sprintf(`
%s
resource "azurerm_spring_cloud_app_mysql_association" "import" {
name = azurerm_spring_cloud_app_mysql_association.test.name
spring_cloud_app_id = azurerm_spring_cloud_app_mysql_association.test.spring_cloud_app_id
mysql_server_id = azurerm_spring_cloud_app_mysql_association.test.mysql_server_id
database_name = azurerm_spring_cloud_app_mysql_association.test.database_name
username = azurerm_spring_cloud_app_mysql_association.test.username
password = azurerm_spring_cloud_app_mysql_association.test.password
}
`, r.basic(data))
}

func (r SpringCloudAppMysqlAssociationResource) update(data acceptance.TestData) string {
return fmt.Sprintf(`
%s
resource "azurerm_mysql_database" "updated" {
name = "acctest-db2-%d"
resource_group_name = azurerm_resource_group.test.name
server_name = azurerm_mysql_server.test.name
charset = "utf8"
collation = "utf8_unicode_ci"
}
resource "azurerm_spring_cloud_app_mysql_association" "test" {
name = "acctestscamb-%d"
spring_cloud_app_id = azurerm_spring_cloud_app.test.id
mysql_server_id = azurerm_mysql_server.test.id
database_name = azurerm_mysql_database.updated.name
username = azurerm_mysql_server.test.administrator_login
password = azurerm_mysql_server.test.administrator_login_password
}
`, r.template(data), data.RandomInteger, data.RandomInteger)
}

func (r SpringCloudAppMysqlAssociationResource) template(data acceptance.TestData) string {
return fmt.Sprintf(`
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "test" {
name = "acctestRG-spring-%d"
location = "%s"
}
resource "azurerm_spring_cloud_service" "test" {
name = "acctest-sc-%d"
location = azurerm_resource_group.test.location
resource_group_name = azurerm_resource_group.test.name
}
resource "azurerm_spring_cloud_app" "test" {
name = "acctest-sca-%d"
resource_group_name = azurerm_spring_cloud_service.test.resource_group_name
service_name = azurerm_spring_cloud_service.test.name
}
resource "azurerm_mysql_server" "test" {
name = "acctestmysqlsvr-%d"
location = azurerm_resource_group.test.location
resource_group_name = azurerm_resource_group.test.name
sku_name = "GP_Gen5_2"
administrator_login = "acctestun"
administrator_login_password = "H@Sh1CoR3!"
ssl_enforcement_enabled = true
ssl_minimal_tls_version_enforced = "TLS1_1"
storage_mb = 51200
version = "5.7"
}
resource "azurerm_mysql_database" "test" {
name = "acctest-db-%d"
resource_group_name = azurerm_resource_group.test.name
server_name = azurerm_mysql_server.test.name
charset = "utf8"
collation = "utf8_unicode_ci"
}
`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger, data.RandomInteger)
}
Loading

0 comments on commit 8b40243

Please sign in to comment.