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  }