providers/openstack/networking.go (87 lines of code) (raw):

// Copyright 2018 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 openstack import ( "log" "github.com/GoogleCloudPlatform/terraformer/terraformutils" "github.com/gophercloud/gophercloud" "github.com/gophercloud/gophercloud/openstack" "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups" "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules" "github.com/gophercloud/gophercloud/pagination" ) type NetworkingGenerator struct { OpenStackService } // createResources iterate on all openstack_networking_secgroup_v2 func (g *NetworkingGenerator) createSecgroupResources(list *pagination.Pager) []terraformutils.Resource { resources := []terraformutils.Resource{} err := list.EachPage(func(page pagination.Page) (bool, error) { groups, err := groups.ExtractGroups(page) if err != nil { return false, err } for _, grp := range groups { resource := terraformutils.NewSimpleResource( grp.ID, grp.Name, "openstack_networking_secgroup_v2", "openstack", []string{}, ) resources = append(resources, resource) resources = append(resources, g.createSecgroupRuleResources(grp.Rules)...) } return true, nil }) if err != nil { log.Println(err) } return resources } // createResources iterate on all openstack_networking_secgroup_v2 func (g *NetworkingGenerator) createSecgroupRuleResources(rules []rules.SecGroupRule) []terraformutils.Resource { resources := []terraformutils.Resource{} for _, r := range rules { resource := terraformutils.NewSimpleResource( r.ID, r.ID, "openstack_networking_secgroup_rule_v2", "openstack", []string{}, ) resources = append(resources, resource) } return resources } // Generate TerraformResources from OpenStack API, func (g *NetworkingGenerator) InitResources() error { opts, err := openstack.AuthOptionsFromEnv() if err != nil { return err } provider, err := openstack.AuthenticatedClient(opts) if err != nil { return err } client, err := openstack.NewNetworkV2(provider, gophercloud.EndpointOpts{ Region: g.GetArgs()["region"].(string), }) if err != nil { return err } list := groups.List(client, groups.ListOpts{}) g.Resources = g.createSecgroupResources(&list) return nil } func (g *NetworkingGenerator) PostConvertHook() error { for i, r := range g.Resources { if r.InstanceInfo.Type != "openstack_networking_secgroup_rule_v2" { continue } for _, sg := range g.Resources { if sg.InstanceInfo.Type != "openstack_networking_secgroup_v2" { continue } if r.InstanceState.Attributes["security_group_id"] == sg.InstanceState.Attributes["id"] { g.Resources[i].Item["security_group_id"] = "${openstack_networking_secgroup_v2." + sg.ResourceName + ".id}" } } } return nil }