Skip to content

Commit

Permalink
[Feature] Instance Group Memberships (#2557)
Browse files Browse the repository at this point in the history
* Data Source of Instance Group Memberships

* Removed log statements

* Datasource and Resource for InstanceGroup Memebership

* Examples and Documentation update

* documentation changes
  • Loading branch information
SunithaGudisagarIBM authored May 26, 2021
1 parent a517b7a commit 08e1aef
Show file tree
Hide file tree
Showing 13 changed files with 974 additions and 0 deletions.
1 change: 1 addition & 0 deletions examples/ibm-is-instance-group/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ data "ibm_is_instance_group_manager_policy" "instance_group_manager_policy" {
| profile | Instance profile type. | `string` | no |
| zone | VPC Zone name where instance template is created. | `string` | no |
| instance\_group\_name | Name of the vpc instance group. | `string` | no |
| instance\_group\_membership | Name of the vpc instance group membership. | `string` | no |
| instance\_count | The number of instances managed in the instance group. | `integer` | no |
| instance\_group\_manager\_name | The manager name under instance group. | `string` | no |
| aggregation\_window | The time window in seconds to aggregate metrics prior to evaluation | `integer` | no |
Expand Down
15 changes: 15 additions & 0 deletions examples/ibm-is-instance-group/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@ resource "ibm_is_instance_group" "instance_group" {
subnets = [ibm_is_subnet.subnet2.id]
}

data "ibm_is_instance_group_memberships" "is_instance_group_memberships" {
instance_group = ibm_is_instance_group.instance_group.id
}

resource "ibm_is_instance_group_membership" "is_instance_group_membership" {
instance_group = ibm_is_instance_group.instance_group.id
instance_group_membership = data.ibm_is_instance_group_memberships.is_instance_group_memberships.memberships.0.instance_group_membership
name = var.instance_group_membership
}

resource "ibm_is_instance_group_manager" "instance_group_manager" {
name = var.instance_group_manager_name
aggregation_window = var.aggregation_window
Expand Down Expand Up @@ -68,4 +78,9 @@ data "ibm_is_instance_group_manager_policy" "instance_group_manager_policy" {
instance_group = ibm_is_instance_group_manager_policy.cpuPolicy.instance_group
instance_group_manager = ibm_is_instance_group_manager_policy.cpuPolicy.instance_group_manager
name = ibm_is_instance_group_manager_policy.cpuPolicy.name
}

data "ibm_is_instance_group_membership" "is_instance_group_membership" {
instance_group = ibm_is_instance_group.instance_group.id
name = var.instance_group_membership
}
4 changes: 4 additions & 0 deletions examples/ibm-is-instance-group/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ variable "instance_group_name" {
default = "myinstancegroup"
}

variable "instance_group_membership" {
default = "myinstancegroupmembership"
}

variable "instance_count" {
default = 2
}
Expand Down
164 changes: 164 additions & 0 deletions ibm/data_source_ibm_is_instance_group_membership.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
// Copyright IBM Corp. 2021 All Rights Reserved.
// Licensed under the Mozilla Public License v2.0

package ibm

import (
"fmt"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"

"github.com/IBM/vpc-go-sdk/vpcv1"
)

func dataSourceIBMISInstanceGroupMembership() *schema.Resource {
return &schema.Resource{
Read: dataSourceIBMISInstanceGroupMembershipRead,

Schema: map[string]*schema.Schema{
isInstanceGroup: {
Type: schema.TypeString,
Required: true,
Description: "The instance group identifier.",
},
isInstanceGroupMembershipName: {
Type: schema.TypeString,
Required: true,
Description: "The user-defined name for this instance group membership. Names must be unique within the instance group.",
},
isInstanceGroupMemershipDeleteInstanceOnMembershipDelete: {
Type: schema.TypeBool,
Computed: true,
Description: "If set to true, when deleting the membership the instance will also be deleted.",
},
isInstanceGroupMembership: {
Type: schema.TypeString,
Computed: true,
Description: "The unique identifier for this instance group membership.",
},
isInstanceGroupMemershipInstance: {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
isInstanceGroupMembershipCrn: {
Type: schema.TypeString,
Computed: true,
Description: "The CRN for this virtual server instance.",
},
isInstanceGroupMembershipVirtualServerInstance: {
Type: schema.TypeString,
Computed: true,
Description: "The unique identifier for this virtual server instance.",
},
isInstanceGroupMemershipInstanceName: {
Type: schema.TypeString,
Computed: true,
Description: "The user-defined name for this virtual server instance (and default system hostname).",
},
},
},
},
isInstanceGroupMemershipInstanceTemplate: {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
isInstanceGroupMembershipCrn: {
Type: schema.TypeString,
Computed: true,
Description: "The CRN for this instance template.",
},
isInstanceGroupMemershipInstanceTemplate: {
Type: schema.TypeString,
Computed: true,
Description: "The unique identifier for this instance template.",
},
isInstanceGroupMemershipInstanceTemplateName: {
Type: schema.TypeString,
Computed: true,
Description: "The unique user-defined name for this instance template.",
},
},
},
},
isInstanceGroupMembershipLoadBalancerPoolMember: {
Type: schema.TypeString,
Computed: true,
Description: "The unique identifier for this load balancer pool member.",
},
isInstanceGroupMembershipStatus: {
Type: schema.TypeString,
Computed: true,
Description: "The status of the instance group membership- `deleting`: Membership is deleting dependent resources- `failed`: Membership was unable to maintain dependent resources- `healthy`: Membership is active and serving in the group- `pending`: Membership is waiting for dependent resources- `unhealthy`: Membership has unhealthy dependent resources.",
},
},
}
}

func dataSourceIBMISInstanceGroupMembershipRead(d *schema.ResourceData, meta interface{}) error {
sess, err := vpcClient(meta)
if err != nil {
return err
}
instanceGroupID := d.Get(isInstanceGroup).(string)
// Support for pagination
start := ""
allrecs := []vpcv1.InstanceGroupMembership{}

for {
listInstanceGroupMembershipsOptions := vpcv1.ListInstanceGroupMembershipsOptions{
InstanceGroupID: &instanceGroupID,
}
instanceGroupMembershipCollection, response, err := sess.ListInstanceGroupMemberships(&listInstanceGroupMembershipsOptions)
if err != nil || instanceGroupMembershipCollection == nil {
return fmt.Errorf("Error Getting InstanceGroup Membership Collection %s\n%s", err, response)
}

start = GetNext(instanceGroupMembershipCollection.Next)
allrecs = append(allrecs, instanceGroupMembershipCollection.Memberships...)

if start == "" {
break
}

}

instanceGroupMembershipName := d.Get(isInstanceGroupMembershipName).(string)
for _, instanceGroupMembership := range allrecs {
if instanceGroupMembershipName == *instanceGroupMembership.Name {
d.SetId(fmt.Sprintf("%s/%s", instanceGroupID, *instanceGroupMembership.Instance.ID))
d.Set(isInstanceGroupMemershipDeleteInstanceOnMembershipDelete, *instanceGroupMembership.DeleteInstanceOnMembershipDelete)
d.Set(isInstanceGroupMembership, *instanceGroupMembership.ID)
d.Set(isInstanceGroupMembershipStatus, *instanceGroupMembership.Status)

instances := make([]map[string]interface{}, 0)
if instanceGroupMembership.Instance != nil {
instance := map[string]interface{}{
isInstanceGroupMembershipCrn: *instanceGroupMembership.Instance.CRN,
isInstanceGroupMembershipVirtualServerInstance: *instanceGroupMembership.Instance.ID,
isInstanceGroupMemershipInstanceName: *instanceGroupMembership.Instance.Name,
}
instances = append(instances, instance)
}
d.Set(isInstanceGroupMemershipInstance, instances)

instance_templates := make([]map[string]interface{}, 0)
if instanceGroupMembership.InstanceTemplate != nil {
instance_template := map[string]interface{}{
isInstanceGroupMembershipCrn: *instanceGroupMembership.InstanceTemplate.CRN,
isInstanceGroupMemershipInstanceTemplate: *instanceGroupMembership.InstanceTemplate.ID,
isInstanceGroupMemershipInstanceTemplateName: *instanceGroupMembership.InstanceTemplate.Name,
}
instance_templates = append(instance_templates, instance_template)
}
d.Set(isInstanceGroupMemershipInstanceTemplate, instance_templates)

if instanceGroupMembership.PoolMember != nil && instanceGroupMembership.PoolMember.ID != nil {
d.Set(isInstanceGroupMembershipLoadBalancerPoolMember, *instanceGroupMembership.PoolMember.ID)
}
return nil
}
}
return fmt.Errorf("Instance group membership %s not found", instanceGroupMembershipName)
}
46 changes: 46 additions & 0 deletions ibm/data_source_ibm_is_instance_group_membership_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// Copyright IBM Corp. 2021 All Rights Reserved.
// Licensed under the Mozilla Public License v2.0

package ibm

import (
"fmt"
"strings"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

func TestAccIbmIsInstanceGroupMembershipDataSource_Basic(t *testing.T) {
randInt := acctest.RandIntRange(600, 700)
instanceGroupName := fmt.Sprintf("testinstancegroup%d", randInt)
publicKey := strings.TrimSpace(`
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQ+WiiUR1Jg3oGSmB/2//GJ3XnotriBiGN6t3iwGces6sUsvRkza1t0Mf05DKZxC/zp0WvDTvbit2gTkF9sD37OZSn5aCJk1F5URk/JNPmz25ZogkICFL4OUfhrE3mnyKio6Bk1JIEIypR5PRtGxY9vFDUfruADDLfRi+dGwHF6U9RpvrDRo3FNtI8T0GwvWwFE7bg63vLz65CjYY5XqH9z/YWz/asH6BKumkwiphLGhuGn03+DV6DkIZqr3Oh13UDjMnTdgv1y/Kou5UM3CK1dVsmLRXPEf2KUWUq1EwRfrJXkPOrBwn8to+Yydo57FgrRM9Qw8uzvKmnVxfKW6iG3oSGA0L6ROuCq1lq0MD8ySLd56+d1ftSDaUq+0/Yt9vK3olzVP0/iZobD7chbGqTLMCzL4/CaIUR/UmX08EA0Oh0DdyAdj3UUNETAj3W8gBrV6xLR7fZAJ8roX2BKb4K8Ed3YqzgiY0zgjqvpBYl9xZl0jgVX0qMFaEa6+CeGI8= root@ffd8363b1226
`)
vpcName := fmt.Sprintf("testvpc%d", randInt)
subnetName := fmt.Sprintf("testsubnet%d", randInt)
templateName := fmt.Sprintf("testtemplate%d", randInt)
sshKeyName := fmt.Sprintf("testsshkey%d", randInt)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: testAccCheckIbmIsInstanceGroupMembershipDataSourceConfigBasic(vpcName, subnetName, sshKeyName, publicKey, templateName, instanceGroupName),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("data.ibm_is_instance_group_membership.is_instance_group_membership", "instance_group"),
),
},
},
})
}

func testAccCheckIbmIsInstanceGroupMembershipDataSourceConfigBasic(vpcName, subnetName, sshKeyName, publicKey, templateName, instanceGroupName string) string {
return testAccCheckIbmIsInstanceGroupMembershipsDataSourceConfigBasic(vpcName, subnetName, sshKeyName, publicKey, templateName, instanceGroupName) + fmt.Sprintf(`
data "ibm_is_instance_group_membership" "is_instance_group_membership" {
instance_group = ibm_is_instance_group.instance_group.id
name = data.ibm_is_instance_group_memberships.is_instance_group_memberships.memberships.0.name
}
`)
}
Loading

0 comments on commit 08e1aef

Please sign in to comment.