github.com/subuk/terraform@v0.6.14-0.20160317140351-de1567c2e732/builtin/providers/google/resource_compute_network.go (about) 1 package google 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/hashicorp/terraform/helper/schema" 8 "google.golang.org/api/compute/v1" 9 "google.golang.org/api/googleapi" 10 ) 11 12 func resourceComputeNetwork() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceComputeNetworkCreate, 15 Read: resourceComputeNetworkRead, 16 Delete: resourceComputeNetworkDelete, 17 18 Schema: map[string]*schema.Schema{ 19 "name": &schema.Schema{ 20 Type: schema.TypeString, 21 Required: true, 22 ForceNew: true, 23 }, 24 25 "ipv4_range": &schema.Schema{ 26 Type: schema.TypeString, 27 Optional: true, 28 ForceNew: true, 29 Deprecated: "Please use google_compute_subnetwork resources instead.", 30 }, 31 32 "gateway_ipv4": &schema.Schema{ 33 Type: schema.TypeString, 34 Computed: true, 35 }, 36 37 "auto_create_subnetworks": &schema.Schema{ 38 Type: schema.TypeBool, 39 Optional: true, 40 ForceNew: true, 41 /* Ideally this would default to true as per the API, but that would cause 42 existing Terraform configs which have not been updated to report this as 43 a change. Perhaps we can bump this for a minor release bump rather than 44 a point release. 45 Default: false, */ 46 ConflictsWith: []string{"ipv4_range"}, 47 }, 48 49 "description": &schema.Schema{ 50 Type: schema.TypeString, 51 Optional: true, 52 ForceNew: true, 53 }, 54 55 "self_link": &schema.Schema{ 56 Type: schema.TypeString, 57 Computed: true, 58 }, 59 }, 60 } 61 } 62 63 func resourceComputeNetworkCreate(d *schema.ResourceData, meta interface{}) error { 64 config := meta.(*Config) 65 66 // 67 // Possible modes: 68 // - 1 Legacy mode - Create a network in the legacy mode. ipv4_range is set. auto_create_subnetworks must not be 69 // set (enforced by ConflictsWith schema attribute) 70 // - 2 Distributed Mode - Create a new generation network that supports subnetworks: 71 // - 2.a - Auto subnet mode - auto_create_subnetworks = true, Google will generate 1 subnetwork per region 72 // - 2.b - Custom subnet mode - auto_create_subnetworks = false & ipv4_range not set, 73 // 74 autoCreateSubnetworks := d.Get("auto_create_subnetworks").(bool) 75 76 // Build the network parameter 77 network := &compute.Network{ 78 Name: d.Get("name").(string), 79 AutoCreateSubnetworks: autoCreateSubnetworks, 80 Description: d.Get("description").(string), 81 } 82 83 if v, ok := d.GetOk("ipv4_range"); ok { 84 log.Printf("[DEBUG] Setting IPv4Range (%#v) for legacy network mode", v.(string)) 85 network.IPv4Range = v.(string) 86 } else { 87 // custom subnet mode, so make sure AutoCreateSubnetworks field is included in request otherwise 88 // google will create a network in legacy mode. 89 network.ForceSendFields = []string{"AutoCreateSubnetworks"} 90 } 91 92 log.Printf("[DEBUG] Network insert request: %#v", network) 93 op, err := config.clientCompute.Networks.Insert( 94 config.Project, network).Do() 95 if err != nil { 96 return fmt.Errorf("Error creating network: %s", err) 97 } 98 99 // It probably maybe worked, so store the ID now 100 d.SetId(network.Name) 101 102 err = computeOperationWaitGlobal(config, op, "Creating Network") 103 if err != nil { 104 return err 105 } 106 107 return resourceComputeNetworkRead(d, meta) 108 } 109 110 func resourceComputeNetworkRead(d *schema.ResourceData, meta interface{}) error { 111 config := meta.(*Config) 112 113 network, err := config.clientCompute.Networks.Get( 114 config.Project, d.Id()).Do() 115 if err != nil { 116 if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { 117 log.Printf("[WARN] Removing Network %q because it's gone", d.Get("name").(string)) 118 // The resource doesn't exist anymore 119 d.SetId("") 120 121 return nil 122 } 123 124 return fmt.Errorf("Error reading network: %s", err) 125 } 126 127 d.Set("gateway_ipv4", network.GatewayIPv4) 128 d.Set("self_link", network.SelfLink) 129 130 return nil 131 } 132 133 func resourceComputeNetworkDelete(d *schema.ResourceData, meta interface{}) error { 134 config := meta.(*Config) 135 136 // Delete the network 137 op, err := config.clientCompute.Networks.Delete( 138 config.Project, d.Id()).Do() 139 if err != nil { 140 return fmt.Errorf("Error deleting network: %s", err) 141 } 142 143 err = computeOperationWaitGlobal(config, op, "Deleting Network") 144 if err != nil { 145 return err 146 } 147 148 d.SetId("") 149 return nil 150 }