github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/ibm/ibm_private_dns.go (about) 1 // Copyright 2019 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 ibm 16 17 import ( 18 "fmt" 19 "os" 20 "strings" 21 22 "github.com/GoogleCloudPlatform/terraformer/terraformutils" 23 "github.com/IBM-Cloud/bluemix-go" 24 "github.com/IBM-Cloud/bluemix-go/api/resource/resourcev1/catalog" 25 "github.com/IBM-Cloud/bluemix-go/api/resource/resourcev2/controllerv2" 26 "github.com/IBM-Cloud/bluemix-go/session" 27 "github.com/IBM/go-sdk-core/v3/core" 28 dns "github.com/IBM/networking-go-sdk/dnssvcsv1" 29 ) 30 31 // privateDNSTemplateGenerator ... 32 type privateDNSTemplateGenerator struct { 33 IBMService 34 } 35 36 // loadPrivateDNS ... 37 func (g privateDNSTemplateGenerator) loadPrivateDNS() func(pDNSID, pDNSName, resGrpID string) terraformutils.Resource { 38 names := make(map[string]struct{}) 39 random := true 40 return func(pDNSID, pDNSName, resGrpID string) terraformutils.Resource { 41 names, random = getRandom(names, pDNSName, random) 42 resource := terraformutils.NewResource( 43 pDNSID, 44 normalizeResourceName(pDNSName, random), 45 "ibm_resource_instance", 46 "ibm", 47 map[string]string{ 48 "resource_group_id": resGrpID, 49 }, 50 []string{}, 51 map[string]interface{}{}) 52 return resource 53 } 54 } 55 56 // loadPrivateDNSZone ... 57 func (g privateDNSTemplateGenerator) loadPrivateDNSZone(pDNSGuid string, zoneID string, dependsOn []string) terraformutils.Resource { 58 resources := terraformutils.NewResource( 59 fmt.Sprintf("%s/%s", pDNSGuid, zoneID), 60 normalizeResourceName("ibm_dns_zone", true), 61 "ibm_dns_zone", 62 "ibm", 63 map[string]string{}, 64 []string{}, 65 map[string]interface{}{ 66 "depends_on": dependsOn, 67 }) 68 return resources 69 } 70 71 // loadPrivateDNSPermittedNetwork ... 72 func (g privateDNSTemplateGenerator) loadPrivateDNSPermittedNetwork(pDNSGuid string, zoneID string, permittedNetworkID string, dependsOn []string) terraformutils.Resource { 73 resources := terraformutils.NewResource( 74 fmt.Sprintf("%s/%s/%s", pDNSGuid, zoneID, permittedNetworkID), 75 normalizeResourceName("ibm_dns_permitted_network", true), 76 "ibm_dns_permitted_network", 77 "ibm", 78 map[string]string{}, 79 []string{}, 80 map[string]interface{}{ 81 "depends_on": dependsOn, 82 }) 83 return resources 84 } 85 86 // loadPrivateDNSResourceRecord ... 87 func (g privateDNSTemplateGenerator) loadPrivateDNSResourceRecord() func(pDNSGuid, zoneID, recordID, recordName string, dependsOn []string) terraformutils.Resource { 88 names := make(map[string]struct{}) 89 random := false 90 return func(pDNSGuid, zoneID, recordID, recordName string, dependsOn []string) terraformutils.Resource { 91 names, random = getRandom(names, recordName, random) 92 resources := terraformutils.NewResource( 93 fmt.Sprintf("%s/%s/%s", pDNSGuid, zoneID, recordID), 94 normalizeResourceName(recordName, random), 95 "ibm_dns_resource_record", 96 "ibm", 97 map[string]string{}, 98 []string{}, 99 map[string]interface{}{ 100 "depends_on": dependsOn, 101 }) 102 return resources 103 } 104 } 105 106 // loadPrivateDNSGLBMonitor ... 107 func (g privateDNSTemplateGenerator) loadPrivateDNSGLBMonitor() func(pDNSGuid, monitorID, monitorName string, dependsOn []string) terraformutils.Resource { 108 names := make(map[string]struct{}) 109 random := false 110 return func(pDNSGuid, monitorID, monitorName string, dependsOn []string) terraformutils.Resource { 111 names, random = getRandom(names, monitorName, random) 112 resources := terraformutils.NewResource( 113 fmt.Sprintf("%s/%s", pDNSGuid, monitorID), 114 normalizeResourceName(monitorName, random), 115 "ibm_dns_glb_monitor", 116 "ibm", 117 map[string]string{}, 118 []string{}, 119 map[string]interface{}{ 120 "depends_on": dependsOn, 121 }) 122 return resources 123 } 124 } 125 126 // loadPrivateDNSGLBPool ... 127 func (g privateDNSTemplateGenerator) loadPrivateDNSGLBPool() func(pDNSGuid, poolID, poolName string, dependsOn []string) terraformutils.Resource { 128 names := make(map[string]struct{}) 129 random := false 130 return func(pDNSGuid, poolID, poolName string, dependsOn []string) terraformutils.Resource { 131 names, random = getRandom(names, poolName, random) 132 resources := terraformutils.NewResource( 133 fmt.Sprintf("%s/%s", pDNSGuid, poolID), 134 normalizeResourceName(poolName, random), 135 "ibm_dns_glb_pool", 136 "ibm", 137 map[string]string{}, 138 []string{}, 139 map[string]interface{}{ 140 "depends_on": dependsOn, 141 }) 142 return resources 143 } 144 } 145 146 // loadPrivateDNSGLB ... 147 func (g privateDNSTemplateGenerator) loadPrivateDNSGLB() func(pDNSGuid, zoneID, lbID, lbName string, dependsOn []string) terraformutils.Resource { 148 names := make(map[string]struct{}) 149 random := false 150 return func(pDNSGuid, zoneID, lbID, lbName string, dependsOn []string) terraformutils.Resource { 151 names, random = getRandom(names, lbName, random) 152 resources := terraformutils.NewResource( 153 fmt.Sprintf("%s/%s/%s", pDNSGuid, zoneID, lbID), 154 normalizeResourceName(lbName, random), 155 "ibm_dns_glb", 156 "ibm", 157 map[string]string{}, 158 []string{}, 159 map[string]interface{}{ 160 "depends_on": dependsOn, 161 }) 162 return resources 163 } 164 } 165 166 // InitResources ... 167 func (g *privateDNSTemplateGenerator) InitResources() error { 168 169 region := g.Args["region"].(string) 170 bmxConfig := &bluemix.Config{ 171 BluemixAPIKey: os.Getenv("IC_API_KEY"), 172 Region: region, 173 } 174 sess, err := session.New(bmxConfig) 175 if err != nil { 176 return err 177 } 178 defaultDNSURL := "https://api.dns-svcs.cloud.ibm.com/v1" 179 180 err = authenticateAPIKey(sess) 181 if err != nil { 182 return err 183 } 184 185 bluemixToken := "" 186 if strings.HasPrefix(sess.Config.IAMAccessToken, "Bearer") { 187 bluemixToken = sess.Config.IAMAccessToken[7:len(sess.Config.IAMAccessToken)] 188 } else { 189 bluemixToken = sess.Config.IAMAccessToken 190 } 191 192 catalogClient, err := catalog.New(sess) 193 if err != nil { 194 return err 195 } 196 197 controllerClient, err := controllerv2.New(sess) 198 if err != nil { 199 return err 200 } 201 202 serviceID, err := catalogClient.ResourceCatalog().FindByName("dns-svcs", true) 203 if err != nil { 204 return err 205 } 206 query := controllerv2.ServiceInstanceQuery{ 207 ServiceID: serviceID[0].ID, 208 } 209 pDNSInstances, err := controllerClient.ResourceServiceInstanceV2().ListInstances(query) 210 if err != nil { 211 return err 212 } 213 214 for _, instance := range pDNSInstances { 215 instanceID := instance.ID 216 instanceGUID := instance.Guid 217 // Instance 218 fnObjt := g.loadPrivateDNS() 219 g.Resources = append(g.Resources, fnObjt(instanceID, instance.Name, instance.ResourceGroupID)) 220 resourceName := g.Resources[len(g.Resources)-1:][0].ResourceName 221 var pDNSDependsOn []string 222 pDNSDependsOn = append(pDNSDependsOn, 223 "ibm_resource_instance."+resourceName) 224 225 // Zones 226 zoneOpts := &dns.DnsSvcsV1Options{ 227 URL: defaultDNSURL, 228 Authenticator: &core.BearerTokenAuthenticator{ 229 BearerToken: bluemixToken, 230 }, 231 } 232 233 zService, err := dns.NewDnsSvcsV1(zoneOpts) 234 if err != nil { 235 return err 236 } 237 zoneOpt := dns.ListDnszonesOptions{ 238 InstanceID: &instanceGUID, 239 } 240 zoneList, _, err := zService.ListDnszones(&zoneOpt) 241 if err != nil { 242 return fmt.Errorf("error Listing Zones %s", err) 243 } 244 for _, zone := range zoneList.Dnszones { 245 zoneID := *zone.ID 246 g.Resources = append(g.Resources, g.loadPrivateDNSZone(instanceGUID, zoneID, pDNSDependsOn)) 247 domainResourceName := g.Resources[len(g.Resources)-1:][0].ResourceName 248 domainDependsOn := makeDependsOn(pDNSDependsOn, "ibm_dns_zone."+domainResourceName) 249 250 // Permitted Network Records 251 permittedNetworkOpt := dns.ListPermittedNetworksOptions{ 252 InstanceID: &instanceGUID, 253 DnszoneID: &zoneID, 254 } 255 permittedNetworkList, _, err := zService.ListPermittedNetworks(&permittedNetworkOpt) 256 if err != nil { 257 return fmt.Errorf("error Listing Permitted Networks %s", err) 258 } 259 for _, permittedNetwork := range permittedNetworkList.PermittedNetworks { 260 permittedNetworkID := *permittedNetwork.ID 261 g.Resources = append(g.Resources, g.loadPrivateDNSPermittedNetwork(instanceGUID, zoneID, permittedNetworkID, domainDependsOn)) 262 } 263 264 // Resource Records 265 dnsRecordOpt := dns.ListResourceRecordsOptions{ 266 InstanceID: &instanceGUID, 267 DnszoneID: &zoneID, 268 } 269 resourceRecordList, _, err := zService.ListResourceRecords(&dnsRecordOpt) 270 if err != nil { 271 return fmt.Errorf("error Listing Resource Records %s", err) 272 } 273 274 pdnsFnObjt := g.loadPrivateDNSResourceRecord() 275 for _, record := range resourceRecordList.ResourceRecords { 276 g.Resources = append(g.Resources, pdnsFnObjt(instanceGUID, zoneID, *record.ID, *record.Name, domainDependsOn)) 277 } 278 279 // GLB Records 280 glbOpt := dns.ListLoadBalancersOptions{ 281 InstanceID: &instanceGUID, 282 DnszoneID: &zoneID, 283 } 284 glbOptList, _, err := zService.ListLoadBalancers(&glbOpt) 285 if err != nil { 286 return fmt.Errorf("error Listing GLBs %s", err) 287 } 288 glbFntObj := g.loadPrivateDNSGLB() 289 for _, lb := range glbOptList.LoadBalancers { 290 g.Resources = append(g.Resources, glbFntObj(instanceGUID, zoneID, *lb.ID, *lb.Name, domainDependsOn)) 291 } 292 } 293 // Monitor Records 294 monitorOpt := dns.ListMonitorsOptions{ 295 InstanceID: &instanceGUID, 296 } 297 glbMonitorList, _, err := zService.ListMonitors(&monitorOpt) 298 if err != nil { 299 return fmt.Errorf("error Listing GLB Monitor %s", err) 300 } 301 302 lbMonitorObjt := g.loadPrivateDNSGLBMonitor() 303 for _, monitor := range glbMonitorList.Monitors { 304 g.Resources = append(g.Resources, lbMonitorObjt(instanceGUID, *monitor.ID, *monitor.Name, pDNSDependsOn)) 305 } 306 307 // Pool Records 308 glbPoolOpt := dns.ListPoolsOptions{ 309 InstanceID: &instanceGUID, 310 } 311 glbPoolOptList, _, err := zService.ListPools(&glbPoolOpt) 312 if err != nil { 313 return fmt.Errorf("error Listing GLB Pools %s", err) 314 } 315 dnsGlbfnObj := g.loadPrivateDNSGLBPool() 316 for _, pool := range glbPoolOptList.Pools { 317 g.Resources = append(g.Resources, dnsGlbfnObj(instanceGUID, *pool.ID, *pool.Name, pDNSDependsOn)) 318 } 319 320 } 321 322 return nil 323 }