Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a resource for fine-grained management of named ports #3236

Merged
merged 6 commits into from
Mar 19, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions products/compute/ansible.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ datasources: !ruby/object:Overrides::ResourceOverrides
# Readonly resources.
DiskType: !ruby/object:Overrides::Ansible::ResourceOverride
exclude: true
InstanceGroupNamedPort: !ruby/object:Overrides::Ansible::ResourceOverride
exclude: true
License: !ruby/object:Overrides::Ansible::ResourceOverride
exclude: true
MachineType: !ruby/object:Overrides::Ansible::ResourceOverride
Expand Down Expand Up @@ -301,6 +303,8 @@ overrides: !ruby/object:Overrides::ResourceOverrides
exclude: true
DiskType: !ruby/object:Overrides::Ansible::ResourceOverride
exclude: true
InstanceGroupNamedPort: !ruby/object:Overrides::Ansible::ResourceOverride
exclude: true
License: !ruby/object:Overrides::Ansible::ResourceOverride
exclude: true
MachineType: !ruby/object:Overrides::Ansible::ResourceOverride
Expand Down
76 changes: 76 additions & 0 deletions products/compute/api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6475,6 +6475,82 @@ objects:
The target number of running instances for this managed instance
group. Deleting or abandoning instances reduces this number. Resizing
the group changes this number.
- !ruby/object:Api::Resource
name: 'InstanceGroupNamedPort'
base_url: 'projects/{{project}}/zones/{{zone}}/instanceGroups/{{group}}'
self_link: 'projects/{{project}}/zones/{{zone}}/instanceGroups/{{group}}'
input: true
description: |
Mange the named ports setting for a managed instance group without
managing the group as whole. This resource is primarily intended for use
with GKE-generated groups that shouldn't otherwise be managed by other
tools.
create_verb: :POST
create_url: 'projects/{{project}}/zones/{{zone}}/instanceGroups/{{group}}/setNamedPorts'
delete_verb: :POST
delete_url: 'projects/{{project}}/zones/{{zone}}/instanceGroups/{{group}}/setNamedPorts'
identity:
- port
- name
nested_query: !ruby/object:Api::Resource::NestedQuery
modify_by_patch: true
keys:
- namedPorts
references: !ruby/object:Api::Resource::ReferenceLinks
guides:
'Official Documentation': 'https://cloud.google.com/compute/docs/instance-groups/'
api: 'https://cloud.google.com/compute/docs/reference/rest/v1/instanceGroup'
async: !ruby/object:Api::OpAsync
operation: !ruby/object:Api::OpAsync::Operation
kind: 'compute#operation'
path: 'name'
base_url: 'projects/{{project}}/zones/{{zone}}/operations/{{op_id}}'
wait_ms: 1000
timeouts: !ruby/object:Api::Timeouts
insert_minutes: 6
update_minutes: 6
delete_minutes: 6
result: !ruby/object:Api::OpAsync::Result
path: 'targetLink'
status: !ruby/object:Api::OpAsync::Status
path: 'status'
complete: 'DONE'
allowed:
- 'PENDING'
- 'RUNNING'
- 'DONE'
error: !ruby/object:Api::OpAsync::Error
path: 'error/errors'
message: 'message'
parameters:
- !ruby/object:Api::Type::ResourceRef
name: 'group'
resource: 'InstanceGroup'
imports: 'name'
required: true
url_param_only: true
description: |
The name of the instance group.
- !ruby/object:Api::Type::ResourceRef
name: 'zone'
resource: 'Zone'
imports: 'name'
required: true
url_param_only: true
description: |
The zone of the instance group.
properties:
- !ruby/object:Api::Type::String
name: 'name'
required: true
description: |
The name for this named port. The name must be 1-63 characters
long, and comply with RFC1035.
- !ruby/object:Api::Type::Integer
name: 'port'
required: true
description:
The port number, which can be a value between 1 and 65535.
- !ruby/object:Api::Resource
name: 'RegionInstanceGroupManager'
kind: 'compute#instanceGroupManager'
Expand Down
2 changes: 2 additions & 0 deletions products/compute/inspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ overrides: !ruby/object:Overrides::ResourceOverrides
override_name: "instance_group_id"
name: !ruby/object:Overrides::Inspec::PropertyOverride
override_name: "instance_group_name"
InstanceGroupNamedPort: !ruby/object:Overrides::Inspec::ResourceOverride
exclude: true
InterconnectAttachment: !ruby/object:Overrides::Inspec::ResourceOverride
exclude: true
License: !ruby/object:Overrides::Inspec::ResourceOverride
Expand Down
21 changes: 21 additions & 0 deletions products/compute/terraform.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -942,6 +942,27 @@ overrides: !ruby/object:Overrides::ResourceOverrides
exclude: true
InstanceGroupManager: !ruby/object:Overrides::Terraform::ResourceOverride
exclude: true
InstanceGroupNamedPort: !ruby/object:Overrides::Terraform::ResourceOverride
id_format: 'projects/{{project}}/zones/{{zone}}/instanceGroups/{{group}}/{{port}}/{{name}}'
rileykarson marked this conversation as resolved.
Show resolved Hide resolved
import_format: ['projects/{{project}}/zones/{{zone}}/instanceGroups/{{group}}/{{port}}/{{name}}']
mutex: 'projects/{{project}}/zones/{{zone}}/instanceGroups/{{group}}'
examples:
- !ruby/object:Provider::Terraform::Examples
name: "instance_group_named_port_gke"
primary_resource_id: "my_port"
vars:
network_name: "container-network"
subnetwork_name: "container-subnetwork"
gke_cluster_name: "my-cluster"
properties:
group: !ruby/object:Overrides::Terraform::PropertyOverride
diff_suppress_func: 'compareResourceNames'
zone: !ruby/object:Overrides::Terraform::PropertyOverride
required: false
default_from_api: true
ignore_read: true
custom_code: !ruby/object:Provider::Terraform::CustomCode
encoder: 'templates/terraform/encoders/normalize_group.go.erb'
InstanceTemplate: !ruby/object:Overrides::Terraform::ResourceOverride
exclude: true
InterconnectAttachment: !ruby/object:Overrides::Terraform::ResourceOverride
Expand Down
11 changes: 11 additions & 0 deletions templates/terraform/encoders/normalize_group.go.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
config := meta.(*Config)
ig, err := ParseInstanceGroupFieldValue(d.Get("group").(string), d, config)
if err != nil {
return nil, err
}

d.Set("group", ig.Name)
d.Set("zone", ig.Zone)
d.Set("project", ig.Project)

return obj, nil
41 changes: 41 additions & 0 deletions templates/terraform/examples/instance_group_named_port_gke.tf.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
resource "google_compute_instance_group_named_port" "<%= ctx[:primary_resource_id] %>" {
rileykarson marked this conversation as resolved.
Show resolved Hide resolved
group = google_container_cluster.my_cluster.instance_group_urls[0]
zone = "us-central1-a"

name = "http"
port = 8080
}

resource "google_compute_instance_group_named_port" "<%= ctx[:primary_resource_id] %>s" {
group = google_container_cluster.my_cluster.instance_group_urls[0]
zone = "us-central1-a"

name = "https"
port = 4443
}

resource "google_compute_network" "container_network" {
name = "<%= ctx[:vars]['network_name'] %>"
auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "container_subnetwork" {
name = "<%= ctx[:vars]['subnetwork_name'] %>"
region = "us-central1"
network = google_compute_network.container_network.name
ip_cidr_range = "10.0.36.0/24"
}

resource "google_container_cluster" "my_cluster" {
name = "<%= ctx[:vars]['gke_cluster_name'] %>"
location = "us-central1-a"
initial_node_count = 1

network = google_compute_network.container_network.name
subnetwork = google_compute_subnetwork.container_subnetwork.name

ip_allocation_policy {
cluster_ipv4_cidr_block = "/19"
services_ipv4_cidr_block = "/22"
}
}
11 changes: 9 additions & 2 deletions templates/terraform/flatten_property_method.erb
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,16 @@ func flatten<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d
if strVal, ok := v.(string); ok {
if intVal, err := strconv.ParseInt(strVal, 10, 64); err == nil {
return intVal
} // let terraform core handle it if we can't convert the string to an int.
}
}
return v

// number values are represented as float64
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The patchencoder for the fine-grained resource deep-compared the returned value, including the type. Terraform stores TypeInt as int, so we need to return that to compare properly. Before, we passed the value onto TF core where it did the conversion.

if floatVal, ok := v.(float64); ok {
intVal := int(floatVal)
return intVal
}

return v // let terraform core handle it otherwise
<% elsif property.is_a?(Api::Type::Array) && property.item_type.is_a?(Api::Type::ResourceRef) -%>
if v == nil {
return v
Expand Down
4 changes: 4 additions & 0 deletions third_party/terraform/website-compiled/google.erb
Original file line number Diff line number Diff line change
Expand Up @@ -672,6 +672,10 @@
<a href="/docs/providers/google/r/compute_instance_group_manager.html">google_compute_instance_group_manager</a>
</li>

<li<%%= sidebar_current("docs-google-compute-instance-group-named-port") %>>
<a href="/docs/providers/google/r/compute_instance_group_named_port.html">google_compute_instance_group_named_port</a>
</li>

<li<%%= sidebar_current("docs-google-compute-instance-template") %>>
<a href="/docs/providers/google/r/compute_instance_template.html">google_compute_instance_template</a>
</li>
Expand Down