github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/ibm/ibm_is_vpc.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 21 "github.com/GoogleCloudPlatform/terraformer/terraformutils" 22 "github.com/IBM/go-sdk-core/v4/core" 23 "github.com/IBM/vpc-go-sdk/vpcv1" 24 ) 25 26 // VPCGenerator ... 27 type VPCGenerator struct { 28 IBMService 29 } 30 31 func (g VPCGenerator) createVPCResources(vpcID, vpcName string) terraformutils.Resource { 32 resource := terraformutils.NewResource( 33 vpcID, 34 normalizeResourceName(vpcName, false), 35 "ibm_is_vpc", 36 "ibm", 37 map[string]string{}, 38 []string{}, 39 map[string]interface{}{}) 40 41 // Deprecated parameters 42 resource.IgnoreKeys = append(resource.IgnoreKeys, 43 "^default_network_acl$", 44 ) 45 46 return resource 47 } 48 49 func (g VPCGenerator) createVPCAddressPrefixResources(vpcID, addPrefixID, addPrefixName string, dependsOn []string) terraformutils.Resource { 50 resource := terraformutils.NewResource( 51 fmt.Sprintf("%s/%s", vpcID, addPrefixID), 52 normalizeResourceName(addPrefixName, false), 53 "ibm_is_vpc_address_prefix", 54 "ibm", 55 map[string]string{}, 56 []string{}, 57 map[string]interface{}{ 58 "depends_on": dependsOn, 59 }) 60 61 return resource 62 } 63 64 func (g VPCGenerator) createVPCRouteResources(vpcID, routeID, routeName string, dependsOn []string) terraformutils.Resource { 65 resources := terraformutils.NewResource( 66 fmt.Sprintf("%s/%s", vpcID, routeID), 67 normalizeResourceName(routeName, false), 68 "ibm_is_vpc_route", 69 "ibm", 70 map[string]string{}, 71 []string{}, 72 map[string]interface{}{ 73 "depends_on": dependsOn, 74 }) 75 return resources 76 } 77 78 func (g VPCGenerator) createVPCRouteTableResources(vpcID, routeTableID, routeTableName string, dependsOn []string) terraformutils.Resource { 79 resources := terraformutils.NewResource( 80 fmt.Sprintf("%s/%s", vpcID, routeTableID), 81 normalizeResourceName(routeTableName, false), 82 "ibm_is_vpc_routing_table", 83 "ibm", 84 map[string]string{ 85 "vpc": vpcID, 86 }, 87 []string{}, 88 map[string]interface{}{ 89 "depends_on": dependsOn, 90 }) 91 return resources 92 } 93 94 func (g VPCGenerator) createVPCRouteTableRouteResources(vpcID, routeTableID, routeTableRouteID, routeTableRouteName string, dependsOn []string) terraformutils.Resource { 95 resource := terraformutils.NewResource( 96 fmt.Sprintf("%s/%s/%s", vpcID, routeTableID, routeTableRouteID), 97 normalizeResourceName(routeTableRouteName, false), 98 "ibm_is_vpc_routing_table_route", 99 "ibm", 100 map[string]string{ 101 "vpc": vpcID, 102 "routing_table": routeTableID, 103 "action": "deliver", 104 }, 105 []string{}, 106 map[string]interface{}{ 107 "depends_on": dependsOn, 108 }) 109 110 // Deprecated parameters 111 resource.IgnoreKeys = append(resource.IgnoreKeys, 112 "^action$", 113 ) 114 return resource 115 } 116 117 // InitResources ... 118 func (g *VPCGenerator) InitResources() error { 119 region := g.Args["region"].(string) 120 apiKey := os.Getenv("IC_API_KEY") 121 if apiKey == "" { 122 return fmt.Errorf("no API key set") 123 } 124 125 vpcurl := fmt.Sprintf("https://%s.iaas.cloud.ibm.com/v1", region) 126 vpcoptions := &vpcv1.VpcV1Options{ 127 URL: envFallBack([]string{"IBMCLOUD_IS_API_ENDPOINT"}, vpcurl), 128 Authenticator: &core.IamAuthenticator{ 129 ApiKey: apiKey, 130 }, 131 } 132 vpcclient, err := vpcv1.NewVpcV1(vpcoptions) 133 if err != nil { 134 return err 135 } 136 start := "" 137 var allrecs []vpcv1.VPC 138 for { 139 listVpcsOptions := &vpcv1.ListVpcsOptions{} 140 if start != "" { 141 listVpcsOptions.Start = &start 142 } 143 if rg := g.Args["resource_group"].(string); rg != "" { 144 rg, err = GetResourceGroupID(apiKey, rg, region) 145 if err != nil { 146 return fmt.Errorf("Error Fetching Resource Group Id %s", err) 147 } 148 listVpcsOptions.ResourceGroupID = &rg 149 } 150 vpcs, response, err := vpcclient.ListVpcs(listVpcsOptions) 151 if err != nil { 152 return fmt.Errorf("Error Fetching vpcs %s\n%s", err, response) 153 } 154 start = GetNext(vpcs.Next) 155 allrecs = append(allrecs, vpcs.Vpcs...) 156 if start == "" { 157 break 158 } 159 } 160 161 for _, vpc := range allrecs { 162 var dependsOn []string 163 g.Resources = append(g.Resources, g.createVPCResources(*vpc.ID, *vpc.Name)) 164 resourceName := g.Resources[len(g.Resources)-1:][0].ResourceName 165 dependsOn = append(dependsOn, "ibm_is_vpc."+resourceName) 166 listVPCAddressPrefixesOptions := &vpcv1.ListVPCAddressPrefixesOptions{ 167 VPCID: vpc.ID, 168 } 169 addprefixes, response, err := vpcclient.ListVPCAddressPrefixes(listVPCAddressPrefixesOptions) 170 if err != nil { 171 return fmt.Errorf("Error Fetching vpc address prefixes %s\n%s", err, response) 172 } 173 for _, addprefix := range addprefixes.AddressPrefixes { 174 g.Resources = append(g.Resources, g.createVPCAddressPrefixResources(*vpc.ID, *addprefix.ID, *addprefix.Name, dependsOn)) 175 } 176 177 listVPCRoutesOptions := &vpcv1.ListVPCRoutesOptions{ 178 VPCID: vpc.ID, 179 } 180 routes, response, err := vpcclient.ListVPCRoutes(listVPCRoutesOptions) 181 if err != nil { 182 return fmt.Errorf("Error Fetching vpc routes %s\n%s", err, response) 183 } 184 for _, route := range routes.Routes { 185 g.Resources = append(g.Resources, g.createVPCRouteResources(*vpc.ID, *route.ID, *route.Name, dependsOn)) 186 } 187 188 listVPCRoutingTablesOptions := &vpcv1.ListVPCRoutingTablesOptions{ 189 VPCID: vpc.ID, 190 } 191 tables, response, err := vpcclient.ListVPCRoutingTables(listVPCRoutingTablesOptions) 192 if err != nil { 193 return fmt.Errorf("Error Fetching vpc routing tables %s\n%s", err, response) 194 } 195 for _, table := range tables.RoutingTables { 196 g.Resources = append(g.Resources, g.createVPCRouteTableResources(*vpc.ID, *table.ID, *table.Name, dependsOn)) 197 resourceName := g.Resources[len(g.Resources)-1:][0].ResourceName 198 dependsOn = append(dependsOn, "ibm_is_vpc_routing_table."+resourceName) 199 listVPCRoutingTableRoutesOptions := &vpcv1.ListVPCRoutingTableRoutesOptions{ 200 VPCID: vpc.ID, 201 RoutingTableID: table.ID, 202 } 203 tableroutes, response, err := vpcclient.ListVPCRoutingTableRoutes(listVPCRoutingTableRoutesOptions) 204 if err != nil { 205 return fmt.Errorf("Error Fetching vpc route table routes %s\n%s", err, response) 206 } 207 for _, tableroute := range tableroutes.Routes { 208 g.Resources = append(g.Resources, g.createVPCRouteTableRouteResources(*vpc.ID, *table.ID, *tableroute.ID, *tableroute.Name, dependsOn)) 209 } 210 } 211 } 212 return nil 213 }