/alicloud/data_source_alicloud_polardb_clusters.go

https://github.com/terraform-providers/terraform-provider-alicloud · Go · 328 lines · 303 code · 22 blank · 3 comment · 32 complexity · 1c091cee40dbe461148d0a3dec866e6c MD5 · raw file

  1. package alicloud
  2. import (
  3. "regexp"
  4. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
  5. "github.com/aliyun/alibaba-cloud-sdk-go/services/polardb"
  6. "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
  7. "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
  8. "github.com/hashicorp/terraform-plugin-sdk/helper/validation"
  9. )
  10. func dataSourceAlicloudPolarDBClusters() *schema.Resource {
  11. return &schema.Resource{
  12. Read: dataSourceAlicloudPolarDBClustersRead,
  13. Schema: map[string]*schema.Schema{
  14. "description_regex": {
  15. Type: schema.TypeString,
  16. Optional: true,
  17. ValidateFunc: validation.ValidateRegexp,
  18. },
  19. "ids": {
  20. Type: schema.TypeList,
  21. Optional: true,
  22. Computed: true,
  23. Elem: &schema.Schema{Type: schema.TypeString},
  24. },
  25. "status": {
  26. Type: schema.TypeString,
  27. Optional: true,
  28. },
  29. "db_type": {
  30. Type: schema.TypeString,
  31. Optional: true,
  32. },
  33. "tags": tagsSchema(),
  34. "output_file": {
  35. Type: schema.TypeString,
  36. Optional: true,
  37. },
  38. // Computed values
  39. "descriptions": {
  40. Type: schema.TypeList,
  41. Computed: true,
  42. Elem: &schema.Schema{Type: schema.TypeString},
  43. },
  44. "clusters": {
  45. Type: schema.TypeList,
  46. Computed: true,
  47. Elem: &schema.Resource{
  48. Schema: map[string]*schema.Schema{
  49. "id": {
  50. Type: schema.TypeString,
  51. Computed: true,
  52. },
  53. "description": {
  54. Type: schema.TypeString,
  55. Computed: true,
  56. },
  57. "charge_type": {
  58. Type: schema.TypeString,
  59. Computed: true,
  60. },
  61. "network_type": {
  62. Type: schema.TypeString,
  63. Computed: true,
  64. },
  65. "region_id": {
  66. Type: schema.TypeString,
  67. Computed: true,
  68. },
  69. "zone_id": {
  70. Type: schema.TypeString,
  71. Computed: true,
  72. },
  73. "expire_time": {
  74. Type: schema.TypeString,
  75. Computed: true,
  76. },
  77. "expired": {
  78. Type: schema.TypeString,
  79. Computed: true,
  80. },
  81. "status": {
  82. Type: schema.TypeString,
  83. Computed: true,
  84. },
  85. "engine": {
  86. Type: schema.TypeString,
  87. Computed: true,
  88. },
  89. "db_type": {
  90. Type: schema.TypeString,
  91. Computed: true,
  92. },
  93. "db_version": {
  94. Type: schema.TypeString,
  95. Computed: true,
  96. },
  97. "lock_mode": {
  98. Type: schema.TypeString,
  99. Computed: true,
  100. },
  101. "delete_lock": {
  102. Type: schema.TypeInt,
  103. Computed: true,
  104. },
  105. "create_time": {
  106. Type: schema.TypeString,
  107. Computed: true,
  108. },
  109. "vpc_id": {
  110. Type: schema.TypeString,
  111. Computed: true,
  112. },
  113. "db_node_number": {
  114. Type: schema.TypeInt,
  115. Computed: true,
  116. },
  117. "db_node_class": {
  118. Type: schema.TypeString,
  119. Computed: true,
  120. },
  121. "storage_used": {
  122. Type: schema.TypeInt,
  123. Computed: true,
  124. },
  125. "db_nodes": {
  126. Type: schema.TypeList,
  127. Computed: true,
  128. Elem: &schema.Resource{
  129. Schema: map[string]*schema.Schema{
  130. "db_node_class": {
  131. Type: schema.TypeString,
  132. Computed: true,
  133. },
  134. "max_iops": {
  135. Type: schema.TypeInt,
  136. Computed: true,
  137. },
  138. "region_id": {
  139. Type: schema.TypeString,
  140. Computed: true,
  141. },
  142. "db_node_role": {
  143. Type: schema.TypeString,
  144. Computed: true,
  145. },
  146. "max_connections": {
  147. Type: schema.TypeInt,
  148. Computed: true,
  149. },
  150. "zone_id": {
  151. Type: schema.TypeString,
  152. Computed: true,
  153. },
  154. "db_node_status": {
  155. Type: schema.TypeString,
  156. Computed: true,
  157. },
  158. "db_node_id": {
  159. Type: schema.TypeString,
  160. Computed: true,
  161. },
  162. "create_time": {
  163. Type: schema.TypeString,
  164. Computed: true,
  165. },
  166. },
  167. },
  168. },
  169. },
  170. },
  171. },
  172. },
  173. }
  174. }
  175. func dataSourceAlicloudPolarDBClustersRead(d *schema.ResourceData, meta interface{}) error {
  176. client := meta.(*connectivity.AliyunClient)
  177. request := polardb.CreateDescribeDBClustersRequest()
  178. request.RegionId = client.RegionId
  179. request.DBClusterStatus = d.Get("status").(string)
  180. request.DBType = d.Get("db_type").(string)
  181. request.PageSize = requests.NewInteger(PageSizeLarge)
  182. request.PageNumber = requests.NewInteger(1)
  183. var dbi []polardb.DBCluster
  184. var descriptionRegex *regexp.Regexp
  185. if v, ok := d.GetOk("description_regex"); ok {
  186. r, err := regexp.Compile(v.(string))
  187. if err != nil {
  188. return WrapError(err)
  189. }
  190. descriptionRegex = r
  191. }
  192. // ids
  193. idsMap := make(map[string]string)
  194. if v, ok := d.GetOk("ids"); ok {
  195. for _, vv := range v.([]interface{}) {
  196. idsMap[vv.(string)] = vv.(string)
  197. }
  198. }
  199. if v, ok := d.GetOk("tags"); ok {
  200. var reqTags []polardb.DescribeDBClustersTag
  201. for key, value := range v.(map[string]interface{}) {
  202. reqTags = append(reqTags, polardb.DescribeDBClustersTag{
  203. Key: key,
  204. Value: value.(string),
  205. })
  206. }
  207. request.Tag = &reqTags
  208. }
  209. for {
  210. raw, err := client.WithPolarDBClient(func(polardbClient *polardb.Client) (interface{}, error) {
  211. return polardbClient.DescribeDBClusters(request)
  212. })
  213. if err != nil {
  214. return WrapErrorf(err, DataDefaultErrorMsg, "alicloud_polardb_clusters", request.GetActionName(), AlibabaCloudSdkGoERROR)
  215. }
  216. addDebug(request.GetActionName(), raw, request.RpcRequest, request)
  217. response, _ := raw.(*polardb.DescribeDBClustersResponse)
  218. if len(response.Items.DBCluster) < 1 {
  219. break
  220. }
  221. for _, item := range response.Items.DBCluster {
  222. if descriptionRegex != nil {
  223. if !descriptionRegex.MatchString(item.DBClusterDescription) {
  224. continue
  225. }
  226. }
  227. if len(idsMap) > 0 {
  228. if _, ok := idsMap[item.DBClusterId]; !ok {
  229. continue
  230. }
  231. }
  232. dbi = append(dbi, item)
  233. }
  234. if len(response.Items.DBCluster) < PageSizeLarge {
  235. break
  236. }
  237. if page, err := getNextpageNumber(request.PageNumber); err != nil {
  238. return WrapError(err)
  239. } else {
  240. request.PageNumber = page
  241. }
  242. }
  243. return polarDBClustersDescription(d, dbi)
  244. }
  245. func polarDBClustersDescription(d *schema.ResourceData, dbi []polardb.DBCluster) error {
  246. var ids []string
  247. var descriptions []string
  248. var s []map[string]interface{}
  249. for _, item := range dbi {
  250. var nodes []map[string]interface{}
  251. for _, node := range item.DBNodes.DBNode {
  252. nodeMap := map[string]interface{}{
  253. "db_node_class": node.DBNodeClass,
  254. "max_iops": node.MaxIOPS,
  255. "db_node_role": node.DBNodeRole,
  256. "region_id": node.RegionId,
  257. "max_connections": node.MaxConnections,
  258. "zone_id": node.ZoneId,
  259. "db_node_status": node.DBNodeStatus,
  260. "db_node_id": node.DBNodeId,
  261. "create_time": node.CreationTime,
  262. }
  263. nodes = append(nodes, nodeMap)
  264. }
  265. mapping := map[string]interface{}{
  266. "id": item.DBClusterId,
  267. "description": item.DBClusterDescription,
  268. "charge_type": getChargeType(item.PayType),
  269. "network_type": item.DBClusterNetworkType,
  270. "region_id": item.RegionId,
  271. "zone_id": item.ZoneId,
  272. "expire_time": item.ExpireTime,
  273. "expired": item.Expired,
  274. "status": item.DBClusterStatus,
  275. "engine": item.Engine,
  276. "db_type": item.DBType,
  277. "db_version": item.DBVersion,
  278. "lock_mode": item.LockMode,
  279. "delete_lock": item.DeletionLock,
  280. "create_time": item.CreateTime,
  281. "vpc_id": item.VpcId,
  282. "db_node_number": item.DBNodeNumber,
  283. "db_node_class": item.DBNodeClass,
  284. "storage_used": item.StorageUsed,
  285. "db_nodes": nodes,
  286. }
  287. ids = append(ids, item.DBClusterId)
  288. descriptions = append(descriptions, item.DBClusterDescription)
  289. s = append(s, mapping)
  290. }
  291. d.SetId(dataResourceIdHash(ids))
  292. if err := d.Set("clusters", s); err != nil {
  293. return WrapError(err)
  294. }
  295. if err := d.Set("ids", ids); err != nil {
  296. return WrapError(err)
  297. }
  298. if err := d.Set("descriptions", descriptions); err != nil {
  299. return WrapError(err)
  300. }
  301. // create a json file in current directory and write data source to it
  302. if output, ok := d.GetOk("output_file"); ok && output.(string) != "" {
  303. writeToFile(output.(string), s)
  304. }
  305. return nil
  306. }