github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/openstack/networking.go (about) 1 // Copyright 2018 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 openstack 16 17 import ( 18 "log" 19 20 "github.com/GoogleCloudPlatform/terraformer/terraformutils" 21 "github.com/gophercloud/gophercloud" 22 "github.com/gophercloud/gophercloud/openstack" 23 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups" 24 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules" 25 "github.com/gophercloud/gophercloud/pagination" 26 ) 27 28 type NetworkingGenerator struct { 29 OpenStackService 30 } 31 32 // createResources iterate on all openstack_networking_secgroup_v2 33 func (g *NetworkingGenerator) createSecgroupResources(list *pagination.Pager) []terraformutils.Resource { 34 resources := []terraformutils.Resource{} 35 36 err := list.EachPage(func(page pagination.Page) (bool, error) { 37 groups, err := groups.ExtractGroups(page) 38 if err != nil { 39 return false, err 40 } 41 42 for _, grp := range groups { 43 resource := terraformutils.NewSimpleResource( 44 grp.ID, 45 grp.Name, 46 "openstack_networking_secgroup_v2", 47 "openstack", 48 []string{}, 49 ) 50 resources = append(resources, resource) 51 resources = append(resources, g.createSecgroupRuleResources(grp.Rules)...) 52 } 53 54 return true, nil 55 }) 56 if err != nil { 57 log.Println(err) 58 } 59 return resources 60 } 61 62 // createResources iterate on all openstack_networking_secgroup_v2 63 func (g *NetworkingGenerator) createSecgroupRuleResources(rules []rules.SecGroupRule) []terraformutils.Resource { 64 resources := []terraformutils.Resource{} 65 for _, r := range rules { 66 resource := terraformutils.NewSimpleResource( 67 r.ID, 68 r.ID, 69 "openstack_networking_secgroup_rule_v2", 70 "openstack", 71 []string{}, 72 ) 73 resources = append(resources, resource) 74 } 75 return resources 76 } 77 78 // Generate TerraformResources from OpenStack API, 79 func (g *NetworkingGenerator) InitResources() error { 80 opts, err := openstack.AuthOptionsFromEnv() 81 if err != nil { 82 return err 83 } 84 85 provider, err := openstack.AuthenticatedClient(opts) 86 if err != nil { 87 return err 88 } 89 90 client, err := openstack.NewNetworkV2(provider, gophercloud.EndpointOpts{ 91 Region: g.GetArgs()["region"].(string), 92 }) 93 if err != nil { 94 return err 95 } 96 97 list := groups.List(client, groups.ListOpts{}) 98 99 g.Resources = g.createSecgroupResources(&list) 100 101 return nil 102 } 103 104 func (g *NetworkingGenerator) PostConvertHook() error { 105 for i, r := range g.Resources { 106 if r.InstanceInfo.Type != "openstack_networking_secgroup_rule_v2" { 107 continue 108 } 109 for _, sg := range g.Resources { 110 if sg.InstanceInfo.Type != "openstack_networking_secgroup_v2" { 111 continue 112 } 113 if r.InstanceState.Attributes["security_group_id"] == sg.InstanceState.Attributes["id"] { 114 g.Resources[i].Item["security_group_id"] = "${openstack_networking_secgroup_v2." + sg.ResourceName + ".id}" 115 } 116 } 117 } 118 119 return nil 120 }