github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/tencentcloud/mysql.go (about) 1 // Copyright 2021 The Terraformer Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package tencentcloud 16 17 import ( 18 "github.com/GoogleCloudPlatform/terraformer/terraformutils" 19 cdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb/v20170320" 20 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" 21 ) 22 23 type MysqlGenerator struct { 24 TencentCloudService 25 } 26 27 func (g *MysqlGenerator) InitResources() error { 28 args := g.GetArgs() 29 region := args["region"].(string) 30 credential := args["credential"].(common.Credential) 31 profile := NewTencentCloudClientProfile() 32 client, err := cdb.NewClient(&credential, region, profile) 33 if err != nil { 34 return err 35 } 36 37 if err := g.loadMysqlMaster(client); err != nil { 38 return err 39 } 40 if err := g.loadMysqlReadOnly(client); err != nil { 41 return err 42 } 43 44 return nil 45 } 46 47 func (g *MysqlGenerator) loadMysqlMaster(client *cdb.Client) error { 48 request := cdb.NewDescribeDBInstancesRequest() 49 var instanceTypeMaster uint64 = 1 50 request.InstanceTypes = []*uint64{&instanceTypeMaster} 51 52 var offset uint64 = 0 53 var pageSize uint64 = 50 54 allInstances := make([]*cdb.InstanceInfo, 0) 55 56 for { 57 request.Offset = &offset 58 request.Limit = &pageSize 59 response, err := client.DescribeDBInstances(request) 60 if err != nil { 61 return err 62 } 63 64 allInstances = append(allInstances, response.Response.Items...) 65 if len(response.Response.Items) < int(pageSize) { 66 break 67 } 68 offset += pageSize 69 } 70 71 for _, instance := range allInstances { 72 resource := terraformutils.NewResource( 73 *instance.InstanceId, 74 *instance.InstanceName+"_"+*instance.InstanceId, 75 "tencentcloud_mysql_instance", 76 "tencentcloud", 77 map[string]string{}, 78 []string{}, 79 map[string]interface{}{}, 80 ) 81 g.Resources = append(g.Resources, resource) 82 } 83 84 return nil 85 } 86 87 func (g *MysqlGenerator) loadMysqlReadOnly(client *cdb.Client) error { 88 request := cdb.NewDescribeDBInstancesRequest() 89 var instanceTypeMaster uint64 = 3 90 request.InstanceTypes = []*uint64{&instanceTypeMaster} 91 92 var offset uint64 = 0 93 var pageSize uint64 = 50 94 allInstances := make([]*cdb.InstanceInfo, 0) 95 96 for { 97 request.Offset = &offset 98 request.Limit = &pageSize 99 response, err := client.DescribeDBInstances(request) 100 if err != nil { 101 return err 102 } 103 104 allInstances = append(allInstances, response.Response.Items...) 105 if len(response.Response.Items) < int(pageSize) { 106 break 107 } 108 offset += pageSize 109 } 110 111 for _, instance := range allInstances { 112 resource := terraformutils.NewResource( 113 *instance.InstanceId, 114 *instance.InstanceName+"_"+*instance.InstanceId, 115 "tencentcloud_mysql_readonly_instance", 116 "tencentcloud", 117 map[string]string{}, 118 []string{}, 119 map[string]interface{}{}, 120 ) 121 g.Resources = append(g.Resources, resource) 122 } 123 124 return nil 125 } 126 127 func (g *MysqlGenerator) PostConvertHook() error { 128 for i, resource := range g.Resources { 129 if resource.InstanceInfo.Type == "tencentcloud_mysql_instance" { 130 delete(resource.Item, "pay_type") 131 delete(resource.Item, "period") 132 } 133 134 if resource.InstanceInfo.Type != "tencentcloud_mysql_readonly_instance" { 135 if masterID, exist := resource.InstanceState.Attributes["master_instance_id"]; exist { 136 for _, r := range g.Resources { 137 if r.InstanceInfo.Type != "tencentcloud_mysql_instance" { 138 continue 139 } 140 if masterID == r.InstanceState.Attributes["id"] { 141 g.Resources[i].Item["master_instance_id"] = "${tencentcloud_mysql_instance." + r.ResourceName + ".id}" 142 } 143 } 144 } 145 } 146 } 147 148 return nil 149 }