From 865fb0d6480a8f37de7efb677e50fe305abeb448 Mon Sep 17 00:00:00 2001 From: Pablo RUTH Date: Tue, 15 Feb 2022 17:07:13 +0100 Subject: [PATCH] add import on vs, rs, pool and pool member (#53) --- docs/resources/loadbalance_pool.md | 10 +++- docs/resources/loadbalance_pool_member.md | 10 +++- docs/resources/loadbalance_real_server.md | 10 +++- docs/resources/loadbalance_virtual_server.md | 10 +++- .../resource_fortiadc_loadbalance_pool.go | 13 +++-- ...source_fortiadc_loadbalance_pool_member.go | 50 +++++++++++++++---- ...source_fortiadc_loadbalance_real_server.go | 11 ++-- ...rce_fortiadc_loadbalance_virtual_server.go | 47 +++++++++-------- 8 files changed, 116 insertions(+), 45 deletions(-) diff --git a/docs/resources/loadbalance_pool.md b/docs/resources/loadbalance_pool.md index 68b4451..9f5dd54 100644 --- a/docs/resources/loadbalance_pool.md +++ b/docs/resources/loadbalance_pool.md @@ -23,4 +23,12 @@ resource "fortiadc_loadbalance_pool" "mypool" { ## Attribute Reference -* `id` - Pool Mkey (internal ID). \ No newline at end of file +* `id` - Pool Mkey (internal ID). + +## Import + +Pools can be imported using their name: + +``` +$ terraform import fortiadc_loadbalance_pool.mypool mypool +``` \ No newline at end of file diff --git a/docs/resources/loadbalance_pool_member.md b/docs/resources/loadbalance_pool_member.md index e75b7f5..5ff3bd0 100644 --- a/docs/resources/loadbalance_pool_member.md +++ b/docs/resources/loadbalance_pool_member.md @@ -40,4 +40,12 @@ resource "fortiadc_loadbalance_pool_member" "mymember" { ## Attribute Reference -* `id` - Member Mkey (internal ID). \ No newline at end of file +* `id` - Member Mkey (internal ID). + +## Import + +Pool members can be imported using their pool and name joined by a dot: + +``` +$ terraform import fortiadc_loadbalance_pool_member.mymember mypool.mymember +``` \ No newline at end of file diff --git a/docs/resources/loadbalance_real_server.md b/docs/resources/loadbalance_real_server.md index a3073be..9097691 100644 --- a/docs/resources/loadbalance_real_server.md +++ b/docs/resources/loadbalance_real_server.md @@ -22,4 +22,12 @@ resource "fortiadc_loadbalance_real_server" "myrealserver" { ## Attribute Reference -* `id` - Real server Mkey (internal ID). \ No newline at end of file +* `id` - Real server Mkey (internal ID). + +## Import + +Real servers can be imported using their name: + +``` +$ terraform import fortiadc_loadbalance_real_server.myrealserver myrealserver +``` \ No newline at end of file diff --git a/docs/resources/loadbalance_virtual_server.md b/docs/resources/loadbalance_virtual_server.md index 0dbed48..730d620 100644 --- a/docs/resources/loadbalance_virtual_server.md +++ b/docs/resources/loadbalance_virtual_server.md @@ -58,4 +58,12 @@ resource "fortiadc_loadbalance_virtual_server" "myvirtualserver" { ## Attribute Reference -* `id` - Virtual server Mkey (internal ID). \ No newline at end of file +* `id` - Virtual server Mkey (internal ID). + +## Import + +Virtual servers can be imported using their name: + +``` +$ terraform import fortiadc_loadbalance_virtual_server.myvirtualserver myvirtualserver +``` \ No newline at end of file diff --git a/fortiadc/resource_fortiadc_loadbalance_pool.go b/fortiadc/resource_fortiadc_loadbalance_pool.go index 52fb40b..42d3660 100644 --- a/fortiadc/resource_fortiadc_loadbalance_pool.go +++ b/fortiadc/resource_fortiadc_loadbalance_pool.go @@ -14,24 +14,27 @@ func resourceFortiadcLoadbalancePool() *schema.Resource { Read: resourceFortiadcLoadbalancePoolRead, Update: resourceFortiadcLoadbalancePoolUpdate, Delete: resourceFortiadcLoadbalancePoolDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ + "name": { Type: schema.TypeString, Required: true, ForceNew: true, }, - "pool_type": &schema.Schema{ + "pool_type": { Type: schema.TypeString, Optional: true, Default: "ipv4", }, - "healtcheck_enable": &schema.Schema{ + "healtcheck_enable": { Type: schema.TypeBool, Optional: true, Default: false, }, - "healtcheck_relationship": &schema.Schema{ + "healtcheck_relationship": { Type: schema.TypeString, Optional: true, Default: "AND", @@ -41,7 +44,7 @@ func resourceFortiadcLoadbalancePool() *schema.Resource { Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, }, - "real_server_ssl_profile": &schema.Schema{ + "real_server_ssl_profile": { Type: schema.TypeString, Optional: true, Default: "NONE", diff --git a/fortiadc/resource_fortiadc_loadbalance_pool_member.go b/fortiadc/resource_fortiadc_loadbalance_pool_member.go index 2f14c70..f5cadc6 100644 --- a/fortiadc/resource_fortiadc_loadbalance_pool_member.go +++ b/fortiadc/resource_fortiadc_loadbalance_pool_member.go @@ -1,9 +1,11 @@ package fortiadc import ( + "context" "errors" "fmt" "strconv" + "strings" "github.com/Ouest-France/gofortiadc" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -15,53 +17,81 @@ func resourceFortiadcLoadbalancePoolMember() *schema.Resource { Read: resourceFortiadcLoadbalancePoolMemberRead, Update: resourceFortiadcLoadbalancePoolMemberUpdate, Delete: resourceFortiadcLoadbalancePoolMemberDelete, + Importer: &schema.ResourceImporter{ + StateContext: func(ctx context.Context, d *schema.ResourceData, m interface{}) ([]*schema.ResourceData, error) { + client := m.(*gofortiadc.Client) + + // Split id to pool and member names + idParts := strings.Split(d.Id(), ".") + if len(idParts) != 2 || idParts[0] == "" || idParts[1] == "" { + return nil, fmt.Errorf("unexpected format of ID (%q), expected POOL.MEMBER", d.Id()) + } + pool := idParts[0] + member := idParts[1] + + // Read member ID + mkey, err := client.LoadbalanceGetPoolMemberID(pool, member) + if err != nil { + return nil, err + } + + // Set pool and member + err = d.Set("pool", pool) + if err != nil { + return nil, err + } + d.SetId(mkey) + + return []*schema.ResourceData{d}, nil + }, + }, Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ + "name": { Type: schema.TypeString, Required: true, ForceNew: true, }, - "pool": &schema.Schema{ + "pool": { Type: schema.TypeString, Required: true, ForceNew: true, }, - "status": &schema.Schema{ + "status": { Type: schema.TypeString, Optional: true, Default: "enable", }, - "port": &schema.Schema{ + "port": { Type: schema.TypeInt, Required: true, }, - "weight": &schema.Schema{ + "weight": { Type: schema.TypeInt, Optional: true, Default: 1, }, - "conn_limit": &schema.Schema{ + "conn_limit": { Type: schema.TypeInt, Optional: true, Default: 0, }, - "recover": &schema.Schema{ + "recover": { Type: schema.TypeInt, Optional: true, Default: 0, }, - "warmup": &schema.Schema{ + "warmup": { Type: schema.TypeInt, Optional: true, Default: 0, }, - "warmrate": &schema.Schema{ + "warmrate": { Type: schema.TypeInt, Optional: true, Default: 100, }, - "conn_rate_limit": &schema.Schema{ + "conn_rate_limit": { Type: schema.TypeInt, Optional: true, Default: 0, diff --git a/fortiadc/resource_fortiadc_loadbalance_real_server.go b/fortiadc/resource_fortiadc_loadbalance_real_server.go index 33f18a1..436b4d5 100644 --- a/fortiadc/resource_fortiadc_loadbalance_real_server.go +++ b/fortiadc/resource_fortiadc_loadbalance_real_server.go @@ -13,23 +13,26 @@ func resourceFortiadcLoadbalanceRealServer() *schema.Resource { Read: resourceFortiadcLoadbalanceRealServerRead, Update: resourceFortiadcLoadbalanceRealServerUpdate, Delete: resourceFortiadcLoadbalanceRealServerDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ + "name": { Type: schema.TypeString, Required: true, ForceNew: true, }, - "address": &schema.Schema{ + "address": { Type: schema.TypeString, Required: true, }, - "address6": &schema.Schema{ + "address6": { Type: schema.TypeString, Optional: true, Default: "::", }, - "status": &schema.Schema{ + "status": { Type: schema.TypeString, Optional: true, Default: "enable", diff --git a/fortiadc/resource_fortiadc_loadbalance_virtual_server.go b/fortiadc/resource_fortiadc_loadbalance_virtual_server.go index a60fbaf..580f721 100644 --- a/fortiadc/resource_fortiadc_loadbalance_virtual_server.go +++ b/fortiadc/resource_fortiadc_loadbalance_virtual_server.go @@ -16,52 +16,55 @@ func resourceFortiadcLoadbalanceVirtualServer() *schema.Resource { Read: resourceFortiadcLoadbalanceVirtualServerRead, Update: resourceFortiadcLoadbalanceVirtualServerUpdate, Delete: resourceFortiadcLoadbalanceVirtualServerDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ + "name": { Type: schema.TypeString, Required: true, ForceNew: true, }, - "status": &schema.Schema{ + "status": { Type: schema.TypeString, Optional: true, Default: "enable", }, - "type": &schema.Schema{ + "type": { Type: schema.TypeString, Optional: true, Default: "l4-load-balance", }, - "address_type": &schema.Schema{ + "address_type": { Type: schema.TypeString, Optional: true, Default: "ipv4", }, - "address": &schema.Schema{ + "address": { Type: schema.TypeString, Required: true, }, - "packet_forward_method": &schema.Schema{ + "packet_forward_method": { Type: schema.TypeString, Optional: true, Default: "NAT", }, - "source_pool_list": &schema.Schema{ + "source_pool_list": { Type: schema.TypeList, Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, }, - "port": &schema.Schema{ + "port": { Type: schema.TypeInt, Required: true, }, - "connection_limit": &schema.Schema{ + "connection_limit": { Type: schema.TypeInt, Optional: true, Default: 0, }, - "content_routing_enable": &schema.Schema{ + "content_routing_enable": { Type: schema.TypeBool, Optional: true, Default: false, @@ -71,7 +74,7 @@ func resourceFortiadcLoadbalanceVirtualServer() *schema.Resource { Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, }, - "content_rewriting_enable": &schema.Schema{ + "content_rewriting_enable": { Type: schema.TypeBool, Optional: true, Default: false, @@ -81,56 +84,56 @@ func resourceFortiadcLoadbalanceVirtualServer() *schema.Resource { Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, }, - "connection_rate_limit": &schema.Schema{ + "connection_rate_limit": { Type: schema.TypeInt, Optional: true, Default: 0, }, - "error_page": &schema.Schema{ + "error_page": { Type: schema.TypeString, Optional: true, Default: "", }, - "error_msg": &schema.Schema{ + "error_msg": { Type: schema.TypeString, Optional: true, Default: "Server-unavailable!", }, - "interface": &schema.Schema{ + "interface": { Type: schema.TypeString, Optional: true, Default: "port1", }, - "profile": &schema.Schema{ + "profile": { Type: schema.TypeString, Optional: true, Default: "LB_PROF_TCP", }, - "method": &schema.Schema{ + "method": { Type: schema.TypeString, Optional: true, Default: "LB_METHOD_ROUND_ROBIN", }, - "pool": &schema.Schema{ + "pool": { Type: schema.TypeString, Required: true, }, - "client_ssl_profile": &schema.Schema{ + "client_ssl_profile": { Type: schema.TypeString, Optional: true, Default: "", }, - "http_to_https": &schema.Schema{ + "http_to_https": { Type: schema.TypeBool, Optional: true, Default: false, }, - "persistence": &schema.Schema{ + "persistence": { Type: schema.TypeString, Optional: true, Default: "", }, - "traffic_log": &schema.Schema{ + "traffic_log": { Type: schema.TypeBool, Optional: true, Default: false,