Skip to content

Commit a223776

Browse files
author
Olve S. Hansen
committed
* 'master' of https://github.com/olvesh/terraform-provider-google: (24 commits) Cleanup after v1.14.0 release v1.14.0 Update CHANGELOG.md Add new google_compute_regions (hashicorp#1603) Update CHANGELOG.md Fix forwarding rule data source test (hashicorp#1606) Update CHANGELOG.md Fix redis authorized network and tests. The Redis API currently only accepts partial links. The tests weren't failing because they weren't actually using the network (oops). There were a few other test issues that I fixed while I was there. Fixes hashicorp#1571. (hashicorp#1599) update auth docs (hashicorp#1587) Fix network_tier tests. Add documentation for network tier (hashicorp#1593) Warn about ip_version with ip_address in global forwarding rule (hashicorp#616) Update CHANGELOG.md add support for network tiers (hashicorp#1530) Update CHANGELOG.md Allow using in repo configuration for cloudbuild trigger (hashicorp#1557) Update CHANGELOG.md add update support for redis (hashicorp#1590) Update CHANGELOG.md Added GCP Netblock Data Source (hashicorp#1416) (hashicorp#1580) ...
2 parents 189c9f9 + 8b28f4c commit a223776

38 files changed

+1464
-189
lines changed

CHANGELOG.md

+26-18
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,35 @@
1-
## 1.13.1 (Unreleased)
1+
## 1.14.1 (Unreleased)
2+
## 1.14.0 (June 07, 2018)
23

34
FEATURES:
4-
* **New Datasource**: `google_service_account` [GH-1535]
5-
* **New Datasource**: `google_service_account_key` [GH-1535]
5+
* **New Datasource**: `google_service_account` ([#1535](https://github.com/terraform-providers/terraform-provider-google/issues/1535))
6+
* **New Datasource**: `google_service_account_key` ([#1535](https://github.com/terraform-providers/terraform-provider-google/issues/1535))
7+
* **New Datasource**: `google_netblock_ip_ranges` ([#1580](https://github.com/terraform-providers/terraform-provider-google/issues/1580))
8+
* **New Datasource**: `google_compute_regions` ([#1603](https://github.com/terraform-providers/terraform-provider-google/issues/1603))
69

710
IMPROVEMENTS:
8-
* compute: As part of migrating `google_compute_disk` to be autogenerated, enabled encrypted source snapshot & images. [GH-1521].
9-
* compute: Accept subnetwork name only in `google_forwarding_rule` [GH-1552]
10-
* compute: Add disabled property to `google_compute_firewall` [GH-1536]
11-
* compute: Add support for custom request headers in `google_compute_backend_service` [GH-1537]
12-
* compute: Add support for `ssl_policy` to `google_compute_target_ssl_proxy` [GH-1568]
13-
* cloudbuild: Use the project defined in `trigger_template` when creating a `google_cloudbuild_trigger` [GH-1556]
14-
* kms: Add basic update for `google_kms_crypto_key` resource [GH-1511]
15-
* project: Use default provider project for `google_project_services` if project field is empty [GH-1553]
16-
* project: Added support for restoring default organization policies [GH-1477]
17-
* project: Handle spurious Cloud API errors and performance issues for `google_project_service(s)` [GH-1565]
18-
* sql: Add labels support in `sql_database_instance` [GH-1567]
11+
* compute: As part of migrating `google_compute_disk` to be autogenerated, enabled encrypted source snapshot & images. [[#1521](https://github.com/terraform-providers/terraform-provider-google/issues/1521)].
12+
* compute: Accept subnetwork name only in `google_forwarding_rule` ([#1552](https://github.com/terraform-providers/terraform-provider-google/issues/1552))
13+
* compute: Add disabled property to `google_compute_firewall` ([#1536](https://github.com/terraform-providers/terraform-provider-google/issues/1536))
14+
* compute: Add support for custom request headers in `google_compute_backend_service` ([#1537](https://github.com/terraform-providers/terraform-provider-google/issues/1537))
15+
* compute: Add support for `ssl_policy` to `google_compute_target_ssl_proxy` ([#1568](https://github.com/terraform-providers/terraform-provider-google/issues/1568))
16+
* compute: Add support for `version`s in instance group manager ([#1499](https://github.com/terraform-providers/terraform-provider-google/issues/1499))
17+
* compute: Add support for `network_tier` to address, instance and instance_template ([#1530](https://github.com/terraform-providers/terraform-provider-google/issues/1530))
18+
* cloudbuild: Use the project defined in `trigger_template` when creating a `google_cloudbuild_trigger` ([#1556](https://github.com/terraform-providers/terraform-provider-google/issues/1556))
19+
* cloudbuild: Support configuration file in repository for `google_cloudbuild_trigger` ([#1557](https://github.com/terraform-providers/terraform-provider-google/issues/1557))
20+
* kms: Add basic update for `google_kms_crypto_key` resource ([#1511](https://github.com/terraform-providers/terraform-provider-google/issues/1511))
21+
* project: Use default provider project for `google_project_services` if project field is empty ([#1553](https://github.com/terraform-providers/terraform-provider-google/issues/1553))
22+
* project: Added support for restoring default organization policies ([#1477](https://github.com/terraform-providers/terraform-provider-google/issues/1477))
23+
* project: Handle spurious Cloud API errors and performance issues for `google_project_service(s)` ([#1565](https://github.com/terraform-providers/terraform-provider-google/issues/1565))
24+
* redis: Add update support for Redis Instances ([#1590](https://github.com/terraform-providers/terraform-provider-google/issues/1590))
25+
* sql: Add labels support in `sql_database_instance` ([#1567](https://github.com/terraform-providers/terraform-provider-google/issues/1567))
1926

2027
BUG FIXES:
21-
* dns: Suppress diff for ipv6 address in `google_dns_record_set` [GH-1551]
22-
* storage: Support removing a label in `google_storage_bucket` [GH-1550]
23-
* compute: Fix perpetual diff caused by the `google_instance_group` self_link in `google_regional_instance_group_manager` [GH-1549]
24-
* project: Retry while listing enabled services [GH-1573]
28+
* dns: Suppress diff for ipv6 address in `google_dns_record_set` ([#1551](https://github.com/terraform-providers/terraform-provider-google/issues/1551))
29+
* storage: Support removing a label in `google_storage_bucket` ([#1550](https://github.com/terraform-providers/terraform-provider-google/issues/1550))
30+
* compute: Fix perpetual diff caused by the `google_instance_group` self_link in `google_regional_instance_group_manager` ([#1549](https://github.com/terraform-providers/terraform-provider-google/issues/1549))
31+
* project: Retry while listing enabled services ([#1573](https://github.com/terraform-providers/terraform-provider-google/issues/1573))
32+
* redis: Allow self links for redis authorized network ([#1599](https://github.com/terraform-providers/terraform-provider-google/issues/1599))
2533

2634
## 1.13.0 (May 24, 2018)
2735

google/compute_instance_helpers.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ func flattenAccessConfigs(accessConfigs []*computeBeta.AccessConfig) ([]map[stri
4949
for i, ac := range accessConfigs {
5050
flattened[i] = map[string]interface{}{
5151
"nat_ip": ac.NatIP,
52+
"network_tier": ac.NetworkTier,
5253
"assigned_nat_ip": ac.NatIP,
5354
}
5455
if ac.SetPublicPtr {
@@ -103,8 +104,9 @@ func expandAccessConfigs(configs []interface{}) []*computeBeta.AccessConfig {
103104
for i, raw := range configs {
104105
data := raw.(map[string]interface{})
105106
acs[i] = &computeBeta.AccessConfig{
106-
Type: "ONE_TO_ONE_NAT",
107-
NatIP: data["nat_ip"].(string),
107+
Type: "ONE_TO_ONE_NAT",
108+
NatIP: data["nat_ip"].(string),
109+
NetworkTier: data["network_tier"].(string),
108110
}
109111
if ptr, ok := data["public_ptr_domain_name"]; ok && ptr != "" {
110112
acs[i].SetPublicPtr = true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package google
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"sort"
7+
"time"
8+
9+
"github.com/hashicorp/terraform/helper/schema"
10+
"github.com/hashicorp/terraform/helper/validation"
11+
"google.golang.org/api/compute/v1"
12+
)
13+
14+
func dataSourceGoogleComputeRegions() *schema.Resource {
15+
return &schema.Resource{
16+
Read: dataSourceGoogleComputeRegionsRead,
17+
Schema: map[string]*schema.Schema{
18+
"project": &schema.Schema{
19+
Type: schema.TypeString,
20+
Optional: true,
21+
Computed: true,
22+
},
23+
"names": {
24+
Type: schema.TypeList,
25+
Computed: true,
26+
Elem: &schema.Schema{Type: schema.TypeString},
27+
},
28+
"status": {
29+
Type: schema.TypeString,
30+
Optional: true,
31+
ValidateFunc: validation.StringInSlice([]string{"UP", "DOWN"}, false),
32+
},
33+
},
34+
}
35+
}
36+
37+
func dataSourceGoogleComputeRegionsRead(d *schema.ResourceData, meta interface{}) error {
38+
config := meta.(*Config)
39+
40+
project, err := getProject(d, config)
41+
if err != nil {
42+
return err
43+
}
44+
filter := ""
45+
if s, ok := d.GetOk("status"); ok {
46+
filter = fmt.Sprintf(" (status eq %s)", s)
47+
}
48+
49+
call := config.clientCompute.Regions.List(project).Filter(filter)
50+
51+
resp, err := call.Do()
52+
if err != nil {
53+
return err
54+
}
55+
56+
regions := flattenRegions(resp.Items)
57+
log.Printf("[DEBUG] Received Google Compute Regions: %q", regions)
58+
59+
d.Set("names", regions)
60+
d.Set("project", project)
61+
d.SetId(time.Now().UTC().String())
62+
63+
return nil
64+
}
65+
66+
func flattenRegions(regions []*compute.Region) []string {
67+
result := make([]string, len(regions), len(regions))
68+
for i, region := range regions {
69+
result[i] = region.Name
70+
}
71+
sort.Strings(result)
72+
return result
73+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package google
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"strconv"
7+
"testing"
8+
9+
"github.com/hashicorp/terraform/helper/resource"
10+
"github.com/hashicorp/terraform/terraform"
11+
)
12+
13+
func TestAccComputeRegions_basic(t *testing.T) {
14+
t.Parallel()
15+
16+
resource.Test(t, resource.TestCase{
17+
PreCheck: func() { testAccPreCheck(t) },
18+
Providers: testAccProviders,
19+
Steps: []resource.TestStep{
20+
{
21+
Config: testAccCheckGoogleComputeRegionsConfig,
22+
Check: resource.ComposeTestCheckFunc(
23+
testAccCheckGoogleComputeRegionsMeta("data.google_compute_regions.available"),
24+
),
25+
},
26+
},
27+
})
28+
}
29+
30+
func testAccCheckGoogleComputeRegionsMeta(n string) resource.TestCheckFunc {
31+
return func(s *terraform.State) error {
32+
rs, ok := s.RootModule().Resources[n]
33+
if !ok {
34+
return fmt.Errorf("Can't find regions data source: %s", n)
35+
}
36+
37+
if rs.Primary.ID == "" {
38+
return errors.New("regions data source ID not set.")
39+
}
40+
41+
count, ok := rs.Primary.Attributes["names.#"]
42+
if !ok {
43+
return errors.New("can't find 'names' attribute")
44+
}
45+
46+
noOfNames, err := strconv.Atoi(count)
47+
if err != nil {
48+
return errors.New("failed to read number of regions")
49+
}
50+
if noOfNames < 2 {
51+
return fmt.Errorf("expected at least 2 regions, received %d, this is most likely a bug",
52+
noOfNames)
53+
}
54+
55+
for i := 0; i < noOfNames; i++ {
56+
idx := "names." + strconv.Itoa(i)
57+
v, ok := rs.Primary.Attributes[idx]
58+
if !ok {
59+
return fmt.Errorf("region list is corrupt (%q not found), this is definitely a bug", idx)
60+
}
61+
if len(v) < 1 {
62+
return fmt.Errorf("Empty region name (%q), this is definitely a bug", idx)
63+
}
64+
}
65+
66+
return nil
67+
}
68+
}
69+
70+
var testAccCheckGoogleComputeRegionsConfig = `
71+
data "google_compute_regions" "available" {}
72+
`
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package google
2+
3+
import (
4+
"fmt"
5+
"github.com/hashicorp/terraform/helper/schema"
6+
"io/ioutil"
7+
"net/http"
8+
"strings"
9+
)
10+
11+
func dataSourceGoogleNetblockIpRanges() *schema.Resource {
12+
return &schema.Resource{
13+
Read: dataSourceGoogleNetblockIpRangesRead,
14+
15+
Schema: map[string]*schema.Schema{
16+
"cidr_blocks": {
17+
Type: schema.TypeList,
18+
Elem: &schema.Schema{Type: schema.TypeString},
19+
Computed: true,
20+
},
21+
"cidr_blocks_ipv4": {
22+
Type: schema.TypeList,
23+
Elem: &schema.Schema{Type: schema.TypeString},
24+
Computed: true,
25+
},
26+
"cidr_blocks_ipv6": {
27+
Type: schema.TypeList,
28+
Elem: &schema.Schema{Type: schema.TypeString},
29+
Computed: true,
30+
},
31+
},
32+
}
33+
}
34+
35+
func dataSourceGoogleNetblockIpRangesRead(d *schema.ResourceData, meta interface{}) error {
36+
d.SetId("netblock-ip-ranges")
37+
38+
// https://cloud.google.com/compute/docs/faq#where_can_i_find_product_name_short_ip_ranges
39+
CidrBlocks, err := getCidrBlocks()
40+
41+
if err != nil {
42+
return err
43+
}
44+
45+
d.Set("cidr_blocks", CidrBlocks["cidr_blocks"])
46+
d.Set("cidr_blocks_ipv4", CidrBlocks["cidr_blocks_ipv4"])
47+
d.Set("cidr_blocks_ipv6", CidrBlocks["cidr_blocks_ipv6"])
48+
49+
return nil
50+
}
51+
52+
func netblock_request(name string) (string, error) {
53+
const DNS_URL = "https://dns.google.com/resolve?name=%s&type=TXT"
54+
55+
response, err := http.Get(fmt.Sprintf("https://dns.google.com/resolve?name=%s&type=TXT", name))
56+
57+
if err != nil {
58+
return "", fmt.Errorf("Error from _cloud-netblocks: %s", err)
59+
}
60+
61+
defer response.Body.Close()
62+
body, err := ioutil.ReadAll(response.Body)
63+
64+
if err != nil {
65+
return "", fmt.Errorf("Error to retrieve the domains list: %s", err)
66+
}
67+
68+
return string(body), nil
69+
}
70+
71+
func getCidrBlocks() (map[string][]string, error) {
72+
const INITIAL_NETBLOCK_DNS = "_cloud-netblocks.googleusercontent.com"
73+
var dnsNetblockList []string
74+
cidrBlocks := make(map[string][]string)
75+
76+
response, err := netblock_request(INITIAL_NETBLOCK_DNS)
77+
78+
if err != nil {
79+
return nil, err
80+
}
81+
82+
splitedResponse := strings.Split(string(response), " ")
83+
84+
for _, sp := range splitedResponse {
85+
if strings.HasPrefix(sp, "include:") {
86+
dnsNetblock := strings.Replace(sp, "include:", "", 1)
87+
dnsNetblockList = append(dnsNetblockList, dnsNetblock)
88+
}
89+
}
90+
91+
for len(dnsNetblockList) > 0 {
92+
93+
dnsNetblock := dnsNetblockList[0]
94+
95+
dnsNetblockList[0] = ""
96+
dnsNetblockList = dnsNetblockList[1:len(dnsNetblockList)]
97+
98+
response, err = netblock_request(dnsNetblock)
99+
100+
if err != nil {
101+
return nil, err
102+
}
103+
104+
splitedResponse = strings.Split(string(response), " ")
105+
106+
for _, sp := range splitedResponse {
107+
if strings.HasPrefix(sp, "ip") {
108+
109+
cdrBlock := strings.Split(sp, ":")[1]
110+
cidrBlocks["cidr_blocks"] = append(cidrBlocks["cidr_blocks"], cdrBlock)
111+
112+
if strings.HasPrefix(sp, "ip4") {
113+
cdrBlock := strings.Replace(sp, "ip4:", "", 1)
114+
cidrBlocks["cidr_blocks_ipv4"] = append(cidrBlocks["cidr_blocks_ipv4"], cdrBlock)
115+
116+
} else if strings.HasPrefix(sp, "ip6") {
117+
cdrBlock := strings.Replace(sp, "ip6:", "", 1)
118+
cidrBlocks["cidr_blocks_ipv6"] = append(cidrBlocks["cidr_blocks_ipv6"], cdrBlock)
119+
}
120+
} else if strings.HasPrefix(sp, "include:") {
121+
cidr_block := strings.Replace(sp, "include:", "", 1)
122+
dnsNetblockList = append(dnsNetblockList, cidr_block)
123+
}
124+
}
125+
}
126+
127+
return cidrBlocks, nil
128+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package google
2+
3+
import (
4+
"regexp"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform/helper/resource"
8+
)
9+
10+
func TestAccDataSourceGoogleNetblockIpRanges_basic(t *testing.T) {
11+
resource.Test(t, resource.TestCase{
12+
PreCheck: func() { testAccPreCheck(t) },
13+
Providers: testAccProviders,
14+
Steps: []resource.TestStep{
15+
resource.TestStep{
16+
Config: testAccNetblockIpRangesConfig,
17+
Check: resource.ComposeTestCheckFunc(
18+
resource.TestMatchResourceAttr("data.google_netblock_ip_ranges.some",
19+
"cidr_blocks.#", regexp.MustCompile(("^[1-9]+[0-9]*$"))),
20+
resource.TestMatchResourceAttr("data.google_netblock_ip_ranges.some",
21+
"cidr_blocks.0", regexp.MustCompile("^[0-9./:]+$")),
22+
resource.TestMatchResourceAttr("data.google_netblock_ip_ranges.some",
23+
"cidr_blocks_ipv4.#", regexp.MustCompile(("^[1-9]+[0-9]*$"))),
24+
resource.TestMatchResourceAttr("data.google_netblock_ip_ranges.some",
25+
"cidr_blocks_ipv4.0", regexp.MustCompile("^[0-9./]+$")),
26+
resource.TestMatchResourceAttr("data.google_netblock_ip_ranges.some",
27+
"cidr_blocks_ipv6.#", regexp.MustCompile(("^[1-9]+[0-9]*$"))),
28+
resource.TestMatchResourceAttr("data.google_netblock_ip_ranges.some",
29+
"cidr_blocks_ipv6.0", regexp.MustCompile("^[0-9./:]+$")),
30+
),
31+
},
32+
},
33+
})
34+
}
35+
36+
const testAccNetblockIpRangesConfig = `
37+
data "google_netblock_ip_ranges" "some" {}
38+
`

0 commit comments

Comments
 (0)