github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/azurerm/resource_arm_virtual_network_peering.go (about)

     1  package azurerm
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"net/http"
     7  	"sync"
     8  
     9  	"github.com/Azure/azure-sdk-for-go/arm/network"
    10  	"github.com/hashicorp/terraform/helper/schema"
    11  )
    12  
    13  // peerMutex is used to prevet multiple Peering resources being creaed, updated
    14  // or deleted at the same time
    15  var peerMutex = &sync.Mutex{}
    16  
    17  func resourceArmVirtualNetworkPeering() *schema.Resource {
    18  	return &schema.Resource{
    19  		Create: resourceArmVirtualNetworkPeeringCreate,
    20  		Read:   resourceArmVirtualNetworkPeeringRead,
    21  		Update: resourceArmVirtualNetworkPeeringCreate,
    22  		Delete: resourceArmVirtualNetworkPeeringDelete,
    23  		Importer: &schema.ResourceImporter{
    24  			State: schema.ImportStatePassthrough,
    25  		},
    26  
    27  		Schema: map[string]*schema.Schema{
    28  			"name": {
    29  				Type:     schema.TypeString,
    30  				Required: true,
    31  				ForceNew: true,
    32  			},
    33  
    34  			"resource_group_name": {
    35  				Type:     schema.TypeString,
    36  				Required: true,
    37  				ForceNew: true,
    38  			},
    39  
    40  			"virtual_network_name": {
    41  				Type:     schema.TypeString,
    42  				Required: true,
    43  				ForceNew: true,
    44  			},
    45  
    46  			"remote_virtual_network_id": {
    47  				Type:     schema.TypeString,
    48  				Required: true,
    49  				ForceNew: true,
    50  			},
    51  
    52  			"allow_virtual_network_access": {
    53  				Type:     schema.TypeBool,
    54  				Optional: true,
    55  				Computed: true,
    56  			},
    57  
    58  			"allow_forwarded_traffic": {
    59  				Type:     schema.TypeBool,
    60  				Optional: true,
    61  				Computed: true,
    62  			},
    63  
    64  			"allow_gateway_transit": {
    65  				Type:     schema.TypeBool,
    66  				Optional: true,
    67  				Computed: true,
    68  			},
    69  
    70  			"use_remote_gateways": {
    71  				Type:     schema.TypeBool,
    72  				Optional: true,
    73  				Computed: true,
    74  			},
    75  		},
    76  	}
    77  }
    78  
    79  func resourceArmVirtualNetworkPeeringCreate(d *schema.ResourceData, meta interface{}) error {
    80  	client := meta.(*ArmClient).vnetPeeringsClient
    81  
    82  	log.Printf("[INFO] preparing arguments for Azure ARM virtual network peering creation.")
    83  
    84  	name := d.Get("name").(string)
    85  	vnetName := d.Get("virtual_network_name").(string)
    86  	resGroup := d.Get("resource_group_name").(string)
    87  
    88  	peer := network.VirtualNetworkPeering{
    89  		Name: &name,
    90  		VirtualNetworkPeeringPropertiesFormat: getVirtualNetworkPeeringProperties(d),
    91  	}
    92  
    93  	peerMutex.Lock()
    94  	defer peerMutex.Unlock()
    95  
    96  	_, err := client.CreateOrUpdate(resGroup, vnetName, name, peer, make(chan struct{}))
    97  	if err != nil {
    98  		return err
    99  	}
   100  
   101  	read, err := client.Get(resGroup, vnetName, name)
   102  	if err != nil {
   103  		return err
   104  	}
   105  	if read.ID == nil {
   106  		return fmt.Errorf("Cannot read Virtual Network Peering %s (resource group %s) ID", name, resGroup)
   107  	}
   108  
   109  	d.SetId(*read.ID)
   110  
   111  	return resourceArmVirtualNetworkPeeringRead(d, meta)
   112  }
   113  
   114  func resourceArmVirtualNetworkPeeringRead(d *schema.ResourceData, meta interface{}) error {
   115  	client := meta.(*ArmClient).vnetPeeringsClient
   116  
   117  	id, err := parseAzureResourceID(d.Id())
   118  	if err != nil {
   119  		return err
   120  	}
   121  	resGroup := id.ResourceGroup
   122  	vnetName := id.Path["virtualNetworks"]
   123  	name := id.Path["virtualNetworkPeerings"]
   124  
   125  	resp, err := client.Get(resGroup, vnetName, name)
   126  	if err != nil {
   127  		if resp.StatusCode == http.StatusNotFound {
   128  			d.SetId("")
   129  			return nil
   130  		}
   131  		return fmt.Errorf("Error making Read request on Azure virtual network peering %s: %s", name, err)
   132  	}
   133  
   134  	peer := *resp.VirtualNetworkPeeringPropertiesFormat
   135  
   136  	// update appropriate values
   137  	d.Set("resource_group_name", resGroup)
   138  	d.Set("name", resp.Name)
   139  	d.Set("virtual_network_name", vnetName)
   140  	d.Set("allow_virtual_network_access", peer.AllowVirtualNetworkAccess)
   141  	d.Set("allow_forwarded_traffic", peer.AllowForwardedTraffic)
   142  	d.Set("allow_gateway_transit", peer.AllowGatewayTransit)
   143  	d.Set("use_remote_gateways", peer.UseRemoteGateways)
   144  	d.Set("remote_virtual_network_id", peer.RemoteVirtualNetwork.ID)
   145  
   146  	return nil
   147  }
   148  
   149  func resourceArmVirtualNetworkPeeringDelete(d *schema.ResourceData, meta interface{}) error {
   150  	client := meta.(*ArmClient).vnetPeeringsClient
   151  
   152  	id, err := parseAzureResourceID(d.Id())
   153  	if err != nil {
   154  		return err
   155  	}
   156  	resGroup := id.ResourceGroup
   157  	vnetName := id.Path["virtualNetworks"]
   158  	name := id.Path["virtualNetworkPeerings"]
   159  
   160  	peerMutex.Lock()
   161  	defer peerMutex.Unlock()
   162  
   163  	_, err = client.Delete(resGroup, vnetName, name, make(chan struct{}))
   164  
   165  	return err
   166  }
   167  
   168  func getVirtualNetworkPeeringProperties(d *schema.ResourceData) *network.VirtualNetworkPeeringPropertiesFormat {
   169  	allowVirtualNetworkAccess := d.Get("allow_virtual_network_access").(bool)
   170  	allowForwardedTraffic := d.Get("allow_forwarded_traffic").(bool)
   171  	allowGatewayTransit := d.Get("allow_gateway_transit").(bool)
   172  	useRemoteGateways := d.Get("use_remote_gateways").(bool)
   173  	remoteVirtualNetworkID := d.Get("remote_virtual_network_id").(string)
   174  
   175  	return &network.VirtualNetworkPeeringPropertiesFormat{
   176  		AllowVirtualNetworkAccess: &allowVirtualNetworkAccess,
   177  		AllowForwardedTraffic:     &allowForwardedTraffic,
   178  		AllowGatewayTransit:       &allowGatewayTransit,
   179  		UseRemoteGateways:         &useRemoteGateways,
   180  		RemoteVirtualNetwork: &network.SubResource{
   181  			ID: &remoteVirtualNetworkID,
   182  		},
   183  	}
   184  }