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  }