alicloud/resource_alicloud_mongodb_public_network_address.go (100 lines of code) (raw):

package alicloud import ( "time" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/samber/lo" ) func resourceAlicloudMongoDBPublicNetworkAddress() *schema.Resource { return &schema.Resource{ Create: resourceAlicloudMongoDBPublicNetworkAddressCreate, Read: resourceAlicloudMongoDBPublicNetworkAddressRead, Delete: resourceAlicloudMongoDBPublicNetworkAddressDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, Schema: map[string]*schema.Schema{ "db_instance_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, "replica_sets": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "connection_port": { Type: schema.TypeString, Computed: true, }, "replica_set_role": { Type: schema.TypeString, Computed: true, }, "connection_domain": { Type: schema.TypeString, Computed: true, }, "network_type": { // Though this should be always "Public". Type: schema.TypeString, Computed: true, }, "role_id": { Type: schema.TypeString, Computed: true, }, "connection_type": { Type: schema.TypeString, Computed: true, }, }, }, }, }, } } func resourceAlicloudMongoDBPublicNetworkAddressCreate(d *schema.ResourceData, meta interface{}) error { // only one public network address per instance. instanceId := d.Get("db_instance_id").(string) d.SetId(instanceId) client := meta.(*connectivity.AliyunClient) ddsService := MongoDBService{client} if err := ddsService.AllocatePublicNetworkAddress(instanceId); err != nil { return WrapError(err) } stateConf := BuildStateConf([]string{}, []string{"Running"}, d.Timeout(schema.TimeoutCreate), 1*time.Minute, ddsService.RdsMongodbDBInstanceStateRefreshFunc(d.Id(), []string{"Deleting"})) if _, err := stateConf.WaitForState(); err != nil { return WrapError(err) } return resourceAlicloudMongoDBPublicNetworkAddressRead(d, meta) } func resourceAlicloudMongoDBPublicNetworkAddressRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) ddsService := MongoDBService{client} object, err := ddsService.DescribeReplicaSetRole(d.Id()) if err != nil { return WrapError(err) } replicaSets := transferToMongoReplicaSets(object, true) allPublicNetworkAddresses := lo.Filter(replicaSets, func(replica map[string]interface{}, idx int) bool { if networkType, ok := replica["network_type"]; ok && networkType.(string) == "Public" { return true } return false }) d.Set("db_instance_id", d.Id()) d.Set("replica_sets", allPublicNetworkAddresses) return nil } func resourceAlicloudMongoDBPublicNetworkAddressDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) ddsService := MongoDBService{client} if err := ddsService.ReleasePublicNetworkAddress(d.Id()); err != nil { return WrapError(err) } stateConf := BuildStateConf([]string{}, []string{"NotExist"}, d.Timeout(schema.TimeoutDelete), 1*time.Minute, ddsService.RdsMongoDBPublicNetworkAddressStateRefreshFunc(d.Id())) if _, err := stateConf.WaitForState(); err != nil { return WrapError(err) } return nil }