From 84f28d7605459e6cd35e8293ebfea52f78653b29 Mon Sep 17 00:00:00 2001 From: Ujjwal Kumar Date: Mon, 17 Oct 2022 18:20:48 +0530 Subject: [PATCH] enhancement(bare_metal_server_network_interface_allow_float) : added new floating_bare_metal_server attribute --- ...al_server_network_interface_allow_float.go | 18 ++++++++++--- ...rver_network_interface_allow_float_test.go | 16 ++++++++++++ ...ver_network_interface_allow_float.markdown | 1 + ...ver_network_interface_floating_ip.markdown | 26 +++++++++++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/ibm/service/vpc/resource_ibm_is_bare_metal_server_network_interface_allow_float.go b/ibm/service/vpc/resource_ibm_is_bare_metal_server_network_interface_allow_float.go index 1f2aa4561c..a90b0a2f80 100644 --- a/ibm/service/vpc/resource_ibm_is_bare_metal_server_network_interface_allow_float.go +++ b/ibm/service/vpc/resource_ibm_is_bare_metal_server_network_interface_allow_float.go @@ -17,6 +17,10 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) +const ( + isFloatedBareMetalServerID = "floating_bare_metal_server" +) + func ResourceIBMIsBareMetalServerNetworkInterfaceAllowFloat() *schema.Resource { return &schema.Resource{ CreateContext: resourceIBMISBareMetalServerNetworkInterfaceAllowFloatCreate, @@ -39,6 +43,12 @@ func ResourceIBMIsBareMetalServerNetworkInterfaceAllowFloat() *schema.Resource { DiffSuppressFunc: flex.ApplyOnce, Description: "Bare metal server identifier", }, + + isFloatedBareMetalServerID: { + Type: schema.TypeString, + Computed: true, + Description: "Bare metal server identifier of the server to which nic is floating to", + }, isBareMetalServerNicID: { Type: schema.TypeString, Computed: true, @@ -294,7 +304,7 @@ func createVlanTypeNetworkInterfaceAllowFloat(context context.Context, d *schema if err != nil || nic == nil { return fmt.Errorf("[DEBUG] Create bare metal server (%s) network interface err %s\n%s", bareMetalServerId, err, response) } - + d.Set(isFloatedBareMetalServerID, bareMetalServerId) switch reflect.TypeOf(nic).String() { case "*vpcv1.BareMetalServerNetworkInterfaceByPci": { @@ -329,6 +339,7 @@ func createVlanTypeNetworkInterfaceAllowFloat(context context.Context, d *schema func resourceIBMISBareMetalServerNetworkInterfaceAllowFloatRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { bareMetalServerId, nicID, err := ParseNICTerraformID(d.Id()) + d.Set(isFloatedBareMetalServerID, bareMetalServerId) if err != nil { return diag.FromErr(err) } @@ -345,7 +356,7 @@ func resourceIBMISBareMetalServerNetworkInterfaceAllowFloatRead(context context. nicIntf, response, err := sess.GetBareMetalServerNetworkInterfaceWithContext(context, options) if (err != nil || nicIntf == nil) && response != nil { //if original nic is not present, try fetching nic without server id - nicIntf, response, err = findNicsWithoutBMS(context, sess, nicID) + nicIntf, response, err = findNicsWithoutBMS(context, d, sess, nicID) // response here can be either nil or not nil and if it returns 404 means nic is deleted if response != nil && response.StatusCode == 404 { d.SetId("") @@ -367,7 +378,7 @@ func resourceIBMISBareMetalServerNetworkInterfaceAllowFloatRead(context context. return nil } -func findNicsWithoutBMS(context context.Context, sess *vpcv1.VpcV1, nicId string) (result vpcv1.BareMetalServerNetworkInterfaceIntf, response *core.DetailedResponse, err error) { +func findNicsWithoutBMS(context context.Context, d *schema.ResourceData, sess *vpcv1.VpcV1, nicId string) (result vpcv1.BareMetalServerNetworkInterfaceIntf, response *core.DetailedResponse, err error) { // listing all servers start := "" allrecs := []vpcv1.BareMetalServer{} @@ -396,6 +407,7 @@ func findNicsWithoutBMS(context context.Context, sess *vpcv1.VpcV1, nicId string ID: &nicId, } //return response of the server nic matches + d.Set(isFloatedBareMetalServerID, *server.ID) return sess.GetBareMetalServerNetworkInterfaceWithContext(context, options) } } diff --git a/ibm/service/vpc/resource_ibm_is_bare_metal_server_network_interface_allow_float_test.go b/ibm/service/vpc/resource_ibm_is_bare_metal_server_network_interface_allow_float_test.go index 58fb4e4b2c..a3af18216d 100644 --- a/ibm/service/vpc/resource_ibm_is_bare_metal_server_network_interface_allow_float_test.go +++ b/ibm/service/vpc/resource_ibm_is_bare_metal_server_network_interface_allow_float_test.go @@ -59,6 +59,14 @@ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKVmnMOlHKcZK8tpt3MP1lqOLAcqcJzhsvJcjscgVE } return nil }), + resource.TestCheckResourceAttrSet( + "ibm_is_bare_metal_server.testacc_bms", "floating_bare_metal_server"), + resource.TestCheckResourceAttrWith("ibm_is_bare_metal_server_network_interface_allow_float.bms_nic", "floating_bare_metal_server", func(v string) error { + if v == "" { + return fmt.Errorf("Attribute 'floating_bare_metal_server' %s is not populated", v) + } + return nil + }), ), }, }, @@ -99,6 +107,14 @@ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKVmnMOlHKcZK8tpt3MP1lqOLAcqcJzhsvJcjscgVE } return nil }), + resource.TestCheckResourceAttrSet( + "ibm_is_bare_metal_server.testacc_bms", "floating_bare_metal_server"), + resource.TestCheckResourceAttrWith("ibm_is_bare_metal_server_network_interface_allow_float.bms_nic", "floating_bare_metal_server", func(v string) error { + if v == "" { + return fmt.Errorf("Attribute 'floating_bare_metal_server' %s is not populated", v) + } + return nil + }), ), }, }, diff --git a/website/docs/r/is_bare_metal_server_network_interface_allow_float.markdown b/website/docs/r/is_bare_metal_server_network_interface_allow_float.markdown index 99c5c7a9f3..e4d3ddf05d 100644 --- a/website/docs/r/is_bare_metal_server_network_interface_allow_float.markdown +++ b/website/docs/r/is_bare_metal_server_network_interface_allow_float.markdown @@ -103,6 +103,7 @@ Review the argument references that you can specify for your resource. In addition to the argument reference list, you can access the following attribute references after your data source is created. - `allow_interface_to_float` - (Boolean) Indicates if the interface can float to any other server within the same resource_group. The interface will float automatically if the network detects a GARP or RARP on another bare metal server in the resource group. Applies only to vlan type interfaces. +- `floating_bare_metal_server` - (String) Bare metal server id of the server to which the network interface is floating to. (Same as `bare_metal_server` if its not floating) - `floating_ips` - (List) The floating IPs associated with this network interface. Nested scheme for `floating_ips`: diff --git a/website/docs/r/is_bare_metal_server_network_interface_floating_ip.markdown b/website/docs/r/is_bare_metal_server_network_interface_floating_ip.markdown index 3860ac63ad..555d34015e 100644 --- a/website/docs/r/is_bare_metal_server_network_interface_floating_ip.markdown +++ b/website/docs/r/is_bare_metal_server_network_interface_floating_ip.markdown @@ -75,6 +75,32 @@ resource "ibm_is_bare_metal_server_network_interface_floating_ip" "bms_nic_fip" ``` +## Example usage +The following example shows how to create a allow float network interface and associate a floating IP address to an allow float network interface on the server. + +``` +resource "ibm_is_floating_ip" "fip2" { + name = "testfip2" + zone = "us-south-3" +} + +resource "ibm_is_bare_metal_server_network_interface_allow_float" "allow_float" { + bare_metal_server = ibm_is_bare_metal_server.bms.id + subnet = ibm_is_subnet.subnet.id + name = "eth2" + allow_ip_spoofing = false + vlan = 101 +} + +resource "ibm_is_bare_metal_server_network_interface_floating_ip" "bms_nic_fip" { + bare_metal_server = ibm_is_bare_metal_server_network_interface_allow_float.allow_float.floating_bare_metal_server + network_interface = ibm_is_bare_metal_server_network_interface_allow_float.allow_float.network_interface + floating_ip = ibm_is_floating_ip.fip2.id +} + +``` + + ## Timeouts The `ibm_is_bare_metal_server_network_interface_floating_ip` provides the following [Timeouts](https://www.terraform.io/docs/language/resources/syntax.html) configuration options: