providers/ibm/ibm_private_dns.go (265 lines of code) (raw):
// Copyright 2019 The Terraformer Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package ibm
import (
"fmt"
"os"
"strings"
"github.com/GoogleCloudPlatform/terraformer/terraformutils"
"github.com/IBM-Cloud/bluemix-go"
"github.com/IBM-Cloud/bluemix-go/api/resource/resourcev1/catalog"
"github.com/IBM-Cloud/bluemix-go/api/resource/resourcev2/controllerv2"
"github.com/IBM-Cloud/bluemix-go/session"
"github.com/IBM/go-sdk-core/v3/core"
dns "github.com/IBM/networking-go-sdk/dnssvcsv1"
)
// privateDNSTemplateGenerator ...
type privateDNSTemplateGenerator struct {
IBMService
}
// loadPrivateDNS ...
func (g privateDNSTemplateGenerator) loadPrivateDNS() func(pDNSID, pDNSName, resGrpID string) terraformutils.Resource {
names := make(map[string]struct{})
random := true
return func(pDNSID, pDNSName, resGrpID string) terraformutils.Resource {
names, random = getRandom(names, pDNSName, random)
resource := terraformutils.NewResource(
pDNSID,
normalizeResourceName(pDNSName, random),
"ibm_resource_instance",
"ibm",
map[string]string{
"resource_group_id": resGrpID,
},
[]string{},
map[string]interface{}{})
return resource
}
}
// loadPrivateDNSZone ...
func (g privateDNSTemplateGenerator) loadPrivateDNSZone(pDNSGuid string, zoneID string, dependsOn []string) terraformutils.Resource {
resources := terraformutils.NewResource(
fmt.Sprintf("%s/%s", pDNSGuid, zoneID),
normalizeResourceName("ibm_dns_zone", true),
"ibm_dns_zone",
"ibm",
map[string]string{},
[]string{},
map[string]interface{}{
"depends_on": dependsOn,
})
return resources
}
// loadPrivateDNSPermittedNetwork ...
func (g privateDNSTemplateGenerator) loadPrivateDNSPermittedNetwork(pDNSGuid string, zoneID string, permittedNetworkID string, dependsOn []string) terraformutils.Resource {
resources := terraformutils.NewResource(
fmt.Sprintf("%s/%s/%s", pDNSGuid, zoneID, permittedNetworkID),
normalizeResourceName("ibm_dns_permitted_network", true),
"ibm_dns_permitted_network",
"ibm",
map[string]string{},
[]string{},
map[string]interface{}{
"depends_on": dependsOn,
})
return resources
}
// loadPrivateDNSResourceRecord ...
func (g privateDNSTemplateGenerator) loadPrivateDNSResourceRecord() func(pDNSGuid, zoneID, recordID, recordName string, dependsOn []string) terraformutils.Resource {
names := make(map[string]struct{})
random := true
return func(pDNSGuid, zoneID, recordID, recordName string, dependsOn []string) terraformutils.Resource {
names, random = getRandom(names, recordName, random)
resources := terraformutils.NewResource(
fmt.Sprintf("%s/%s/%s", pDNSGuid, zoneID, recordID),
normalizeResourceName(recordName, random),
"ibm_dns_resource_record",
"ibm",
map[string]string{},
[]string{},
map[string]interface{}{
"depends_on": dependsOn,
})
return resources
}
}
// loadPrivateDNSGLBMonitor ...
func (g privateDNSTemplateGenerator) loadPrivateDNSGLBMonitor() func(pDNSGuid, monitorID, monitorName string, dependsOn []string) terraformutils.Resource {
names := make(map[string]struct{})
random := false
return func(pDNSGuid, monitorID, monitorName string, dependsOn []string) terraformutils.Resource {
names, random = getRandom(names, monitorName, random)
resources := terraformutils.NewResource(
fmt.Sprintf("%s/%s", pDNSGuid, monitorID),
normalizeResourceName(monitorName, random),
"ibm_dns_glb_monitor",
"ibm",
map[string]string{},
[]string{},
map[string]interface{}{
"depends_on": dependsOn,
})
return resources
}
}
// loadPrivateDNSGLBPool ...
func (g privateDNSTemplateGenerator) loadPrivateDNSGLBPool() func(pDNSGuid, poolID, poolName string, dependsOn []string) terraformutils.Resource {
names := make(map[string]struct{})
random := false
return func(pDNSGuid, poolID, poolName string, dependsOn []string) terraformutils.Resource {
names, random = getRandom(names, poolName, random)
resources := terraformutils.NewResource(
fmt.Sprintf("%s/%s", pDNSGuid, poolID),
normalizeResourceName(poolName, random),
"ibm_dns_glb_pool",
"ibm",
map[string]string{},
[]string{},
map[string]interface{}{
"depends_on": dependsOn,
})
return resources
}
}
// loadPrivateDNSGLB ...
func (g privateDNSTemplateGenerator) loadPrivateDNSGLB() func(pDNSGuid, zoneID, lbID, lbName string, dependsOn []string) terraformutils.Resource {
names := make(map[string]struct{})
random := false
return func(pDNSGuid, zoneID, lbID, lbName string, dependsOn []string) terraformutils.Resource {
names, random = getRandom(names, lbName, random)
resources := terraformutils.NewResource(
fmt.Sprintf("%s/%s/%s", pDNSGuid, zoneID, lbID),
normalizeResourceName(lbName, random),
"ibm_dns_glb",
"ibm",
map[string]string{},
[]string{},
map[string]interface{}{
"depends_on": dependsOn,
})
return resources
}
}
// InitResources ...
func (g *privateDNSTemplateGenerator) InitResources() error {
region := g.Args["region"].(string)
bmxConfig := &bluemix.Config{
BluemixAPIKey: os.Getenv("IC_API_KEY"),
Region: region,
}
sess, err := session.New(bmxConfig)
if err != nil {
return err
}
defaultDNSURL := "https://api.dns-svcs.cloud.ibm.com/v1"
err = authenticateAPIKey(sess)
if err != nil {
return err
}
bluemixToken := ""
if strings.HasPrefix(sess.Config.IAMAccessToken, "Bearer") {
bluemixToken = sess.Config.IAMAccessToken[7:len(sess.Config.IAMAccessToken)]
} else {
bluemixToken = sess.Config.IAMAccessToken
}
catalogClient, err := catalog.New(sess)
if err != nil {
return err
}
controllerClient, err := controllerv2.New(sess)
if err != nil {
return err
}
serviceID, err := catalogClient.ResourceCatalog().FindByName("dns-svcs", true)
if err != nil {
return err
}
query := controllerv2.ServiceInstanceQuery{
ServiceID: serviceID[0].ID,
}
pDNSInstances, err := controllerClient.ResourceServiceInstanceV2().ListInstances(query)
if err != nil {
return err
}
for _, instance := range pDNSInstances {
instanceID := instance.ID
instanceGUID := instance.Guid
// Instance
fnObjt := g.loadPrivateDNS()
g.Resources = append(g.Resources, fnObjt(instanceID, instance.Name, instance.ResourceGroupID))
resourceName := g.Resources[len(g.Resources)-1:][0].ResourceName
var pDNSDependsOn []string
pDNSDependsOn = append(pDNSDependsOn,
"ibm_resource_instance."+resourceName)
// Zones
zoneOpts := &dns.DnsSvcsV1Options{
URL: defaultDNSURL,
Authenticator: &core.BearerTokenAuthenticator{
BearerToken: bluemixToken,
},
}
zService, err := dns.NewDnsSvcsV1(zoneOpts)
if err != nil {
return err
}
zoneOpt := dns.ListDnszonesOptions{
InstanceID: &instanceGUID,
}
zoneList, _, err := zService.ListDnszones(&zoneOpt)
if err != nil {
return fmt.Errorf("error Listing Zones %s", err)
}
for _, zone := range zoneList.Dnszones {
zoneID := *zone.ID
g.Resources = append(g.Resources, g.loadPrivateDNSZone(instanceGUID, zoneID, pDNSDependsOn))
domainResourceName := g.Resources[len(g.Resources)-1:][0].ResourceName
domainDependsOn := makeDependsOn(pDNSDependsOn, "ibm_dns_zone."+domainResourceName)
// Permitted Network Records
permittedNetworkOpt := dns.ListPermittedNetworksOptions{
InstanceID: &instanceGUID,
DnszoneID: &zoneID,
}
permittedNetworkList, _, err := zService.ListPermittedNetworks(&permittedNetworkOpt)
if err != nil {
return fmt.Errorf("error Listing Permitted Networks %s", err)
}
for _, permittedNetwork := range permittedNetworkList.PermittedNetworks {
permittedNetworkID := *permittedNetwork.ID
g.Resources = append(g.Resources, g.loadPrivateDNSPermittedNetwork(instanceGUID, zoneID, permittedNetworkID, domainDependsOn))
}
// Resource Records
dnsRecordOpt := dns.ListResourceRecordsOptions{
InstanceID: &instanceGUID,
DnszoneID: &zoneID,
}
resourceRecordList, _, err := zService.ListResourceRecords(&dnsRecordOpt)
if err != nil {
return fmt.Errorf("error Listing Resource Records %s", err)
}
pdnsFnObjt := g.loadPrivateDNSResourceRecord()
for _, record := range resourceRecordList.ResourceRecords {
g.Resources = append(g.Resources, pdnsFnObjt(instanceGUID, zoneID, *record.ID, *record.Name, domainDependsOn))
}
// GLB Records
glbOpt := dns.ListLoadBalancersOptions{
InstanceID: &instanceGUID,
DnszoneID: &zoneID,
}
glbOptList, _, err := zService.ListLoadBalancers(&glbOpt)
if err != nil {
return fmt.Errorf("error Listing GLBs %s", err)
}
glbFntObj := g.loadPrivateDNSGLB()
for _, lb := range glbOptList.LoadBalancers {
g.Resources = append(g.Resources, glbFntObj(instanceGUID, zoneID, *lb.ID, *lb.Name, domainDependsOn))
}
}
// Monitor Records
monitorOpt := dns.ListMonitorsOptions{
InstanceID: &instanceGUID,
}
glbMonitorList, _, err := zService.ListMonitors(&monitorOpt)
if err != nil {
return fmt.Errorf("error Listing GLB Monitor %s", err)
}
lbMonitorObjt := g.loadPrivateDNSGLBMonitor()
for _, monitor := range glbMonitorList.Monitors {
g.Resources = append(g.Resources, lbMonitorObjt(instanceGUID, *monitor.ID, *monitor.Name, pDNSDependsOn))
}
// Pool Records
glbPoolOpt := dns.ListPoolsOptions{
InstanceID: &instanceGUID,
}
glbPoolOptList, _, err := zService.ListPools(&glbPoolOpt)
if err != nil {
return fmt.Errorf("error Listing GLB Pools %s", err)
}
dnsGlbfnObj := g.loadPrivateDNSGLBPool()
for _, pool := range glbPoolOptList.Pools {
g.Resources = append(g.Resources, dnsGlbfnObj(instanceGUID, *pool.ID, *pool.Name, pDNSDependsOn))
}
}
return nil
}