From 01be44189a8f3a3882098d0d417631cd01bcd80b Mon Sep 17 00:00:00 2001 From: Thiery Ouattara Date: Mon, 11 Mar 2024 14:58:55 +0000 Subject: [PATCH 1/4] Update go modules --- go.mod | 16 ++++++++-------- go.sum | 34 +++++++++++++++++----------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index 0cfe9ec37..b4307d042 100644 --- a/go.mod +++ b/go.mod @@ -3,14 +3,14 @@ module github.com/terraform-providers/terraform-provider-outscale go 1.19 require ( - github.com/aws/aws-sdk-go v1.45.25 + github.com/aws/aws-sdk-go v1.50.37 github.com/davecgh/go-spew v1.1.1 github.com/go-test/deep v1.0.6 github.com/hashicorp/errwrap v1.0.0 github.com/hashicorp/terraform v0.14.0 github.com/hashicorp/terraform-plugin-sdk v1.17.2 github.com/nav-inc/datetime v0.1.3 - github.com/outscale/osc-sdk-go/v2 v2.18.2 + github.com/outscale/osc-sdk-go/v2 v2.19.0 github.com/spf13/cast v1.3.1 ) @@ -32,7 +32,7 @@ require ( github.com/bgentry/speakeasy v0.1.0 // indirect github.com/fatih/color v1.7.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.3.1 // indirect @@ -79,11 +79,11 @@ require ( github.com/zclconf/go-cty v1.8.2 // indirect github.com/zclconf/go-cty-yaml v1.0.2 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.19.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.17.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/api v0.147.0 // indirect @@ -92,5 +92,5 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a // indirect google.golang.org/grpc v1.58.3 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect ) diff --git a/go.sum b/go.sum index 21efd1e6e..cd185fac5 100644 --- a/go.sum +++ b/go.sum @@ -256,8 +256,8 @@ github.com/aws/aws-sdk-go v1.31.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.44.103/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.45.25 h1:c4fLlh5sLdK2DCRTY1z0hyuJZU4ygxX8m1FswL6/nF4= -github.com/aws/aws-sdk-go v1.45.25/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.50.37 h1:gnAf6eYPSTb4QpVwugtWFqD07QXOoX7LewRrtLUx3lI= +github.com/aws/aws-sdk-go v1.50.37/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= @@ -386,8 +386,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -662,8 +662,8 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/outscale/osc-sdk-go/v2 v2.18.2 h1:tnv6f57L0lg1czaujHTP+veZesJHICk5DbyRfgYpe5Q= -github.com/outscale/osc-sdk-go/v2 v2.18.2/go.mod h1:kzhtUErCzKYl87bZ+kDMphDafmnwbsyFJY9iHF7NgNE= +github.com/outscale/osc-sdk-go/v2 v2.19.0 h1:lunUeIB0AfklKztI4LH9yTIvG5t/fnRXVzSAZLX9EjY= +github.com/outscale/osc-sdk-go/v2 v2.19.0/go.mod h1:kzhtUErCzKYl87bZ+kDMphDafmnwbsyFJY9iHF7NgNE= github.com/packer-community/winrmcp v0.0.0-20180921211025-c76d91c1e7db/go.mod h1:f6Izs6JvFTdnRbziASagjZ2vmf55NSIkC/weStxCHqk= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -786,8 +786,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -883,8 +883,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -910,8 +910,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1005,12 +1005,12 @@ golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1318,8 +1318,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From e9e1f3f74670538b6e8501bb9239a47610db6c1f Mon Sep 17 00:00:00 2001 From: Thiery Ouattara Date: Tue, 12 Mar 2024 10:14:34 +0000 Subject: [PATCH 2/4] Enable to set a route table as Main --- outscale/provider.go | 1 + ...resource_outscale_main_route_table_link.go | 183 ++++++++++++++++++ ...rce_outscale_main_route_table_link_test.go | 145 ++++++++++++++ 3 files changed, 329 insertions(+) create mode 100644 outscale/resource_outscale_main_route_table_link.go create mode 100644 outscale/resource_outscale_main_route_table_link_test.go diff --git a/outscale/provider.go b/outscale/provider.go index 7ed82e53c..c9aaa7748 100644 --- a/outscale/provider.go +++ b/outscale/provider.go @@ -107,6 +107,7 @@ func Provider() terraform.ResourceProvider { "outscale_ca": resourceOutscaleOAPICa(), "outscale_api_access_rule": resourceOutscaleOAPIApiAccessRule(), "outscale_api_access_policy": resourceOutscaleOAPIApiAccessPolicy(), + "outscale_main_route_table_link": resourceLinkMainRouteTable(), }, DataSourcesMap: map[string]*schema.Resource{ "outscale_vm": dataSourceOutscaleOAPIVM(), diff --git a/outscale/resource_outscale_main_route_table_link.go b/outscale/resource_outscale_main_route_table_link.go new file mode 100644 index 000000000..a2d379bb1 --- /dev/null +++ b/outscale/resource_outscale_main_route_table_link.go @@ -0,0 +1,183 @@ +package outscale + +import ( + "context" + "fmt" + "time" + + oscgo "github.com/outscale/osc-sdk-go/v2" + "github.com/terraform-providers/terraform-provider-outscale/utils" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func resourceLinkMainRouteTable() *schema.Resource { + return &schema.Resource{ + Create: resourceLinkMainRouteTableCreate, + Read: resourceLinkMainRouteTableRead, + Delete: resourceLinkMainRouteTableDelete, + Schema: map[string]*schema.Schema{ + "net_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + "route_table_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + "link_route_table_id": { + Type: schema.TypeString, + Computed: true, + }, + "default_route_table_id": { + Type: schema.TypeString, + Computed: true, + }, + "subnet_id": { + Type: schema.TypeString, + Computed: true, + }, + "main": { + Type: schema.TypeBool, + Computed: true, + }, + "request_id": { + Type: schema.TypeString, + Computed: true, + }, + }, + } +} + +func resourceLinkMainRouteTableCreate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*OutscaleClient).OSCAPI + netID := d.Get("net_id").(string) + + routeTable, err := readMainLinkRouteTable(meta.(*OutscaleClient), netID) + if err != nil { + return err + } + linkRouteTable := routeTable.GetLinkRouteTables() + oldLinkRouteTableId := linkRouteTable[0].GetLinkRouteTableId() + defaultRouteTableId := linkRouteTable[0].GetRouteTableId() + + updateRequest := oscgo.UpdateRouteTableLinkRequest{ + RouteTableId: d.Get("route_table_id").(string), + } + updateRequest.SetLinkRouteTableId(oldLinkRouteTableId) + resp := oscgo.UpdateRouteTableLinkResponse{} + err = resource.Retry(5*time.Minute, func() *resource.RetryError { + rp, httpResp, err := conn.RouteTableApi.UpdateRouteTableLink( + context.Background()).UpdateRouteTableLinkRequest(updateRequest).Execute() + if err != nil { + return utils.CheckThrottling(httpResp, err) + } + resp = rp + return nil + }) + if err != nil { + return err + } + + if err := d.Set("default_route_table_id", defaultRouteTableId); err != nil { + return err + } + d.SetId(resp.GetLinkRouteTableId()) + + return resourceOutscaleOAPILinkRouteTableRead(d, meta) +} + +func resourceLinkMainRouteTableRead(d *schema.ResourceData, meta interface{}) error { + netID := d.Get("net_id").(string) + routeTable, err := readMainLinkRouteTable(meta.(*OutscaleClient), netID) + if err != nil { + return err + } + linkRTable := routeTable.GetLinkRouteTables() + if linkRTable == nil { + utils.LogManuallyDeleted("RouteTableLink", d.Id()) + d.SetId("") + return nil + } + + if err := d.Set("net_id", linkRTable[0].GetNetId()); err != nil { + return err + } + if linkRTable[0].GetSubnetId() != "" { + if err := d.Set("subnet_id", linkRTable[0].GetSubnetId()); err != nil { + return err + } + } + if err := d.Set("link_route_table_id", linkRTable[0].GetLinkRouteTableId()); err != nil { + return err + } + if err := d.Set("main", linkRTable[0].GetMain()); err != nil { + return err + } + if err := d.Set("route_table_id", linkRTable[0].GetRouteTableId()); err != nil { + return err + } + + return nil +} + +func resourceLinkMainRouteTableDelete(d *schema.ResourceData, meta interface{}) error { + var err error + conn := meta.(*OutscaleClient).OSCAPI + + updateRequest := oscgo.UpdateRouteTableLinkRequest{ + LinkRouteTableId: d.Get("link_route_table_id").(string), + RouteTableId: d.Get("default_route_table_id").(string), + } + + err = resource.Retry(5*time.Minute, func() *resource.RetryError { + _, httpResp, err := conn.RouteTableApi.UpdateRouteTableLink( + context.Background()).UpdateRouteTableLinkRequest(updateRequest).Execute() + if err != nil { + return utils.CheckThrottling(httpResp, err) + } + return nil + }) + + if err != nil { + return fmt.Errorf("Error deleting link route table: %s", err) + } + + return nil +} + +func readMainLinkRouteTable(meta *OutscaleClient, netID string) (oscgo.RouteTable, error) { + conn := meta.OSCAPI + + var resp oscgo.ReadRouteTablesResponse + var err error + var routeTable oscgo.RouteTable + + rtbRequest := oscgo.ReadRouteTablesRequest{} + rtbRequest.Filters = &oscgo.FiltersRouteTable{ + NetIds: &[]string{netID}, + LinkRouteTableMain: &[]bool{true}[0], + } + err = resource.Retry(15*time.Minute, func() *resource.RetryError { + var err error + rp, httpResp, err := conn.RouteTableApi.ReadRouteTables( + context.Background()).ReadRouteTablesRequest(rtbRequest).Execute() + if err != nil { + return utils.CheckThrottling(httpResp, err) + } + resp = rp + return nil + }) + + if err != nil { + return routeTable, err + } + if len(resp.GetRouteTables()) == 0 { + return routeTable, nil + } + + return resp.GetRouteTables()[0], nil +} diff --git a/outscale/resource_outscale_main_route_table_link_test.go b/outscale/resource_outscale_main_route_table_link_test.go new file mode 100644 index 000000000..3de82ef27 --- /dev/null +++ b/outscale/resource_outscale_main_route_table_link_test.go @@ -0,0 +1,145 @@ +package outscale + +import ( + "context" + "fmt" + "strings" + "testing" + "time" + + oscgo "github.com/outscale/osc-sdk-go/v2" + "github.com/terraform-providers/terraform-provider-outscale/utils" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/terraform" +) + +func TestAccNet_WithLinkMainRouteTable_basic(t *testing.T) { + t.Parallel() + var v oscgo.RouteTable + resourceName := "outscale_main_route_table_link.main" + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckLinkMainRouteTableDestroy, + Steps: []resource.TestStep{ + { + Config: testAccLinkMainRouteTableConfig, + Check: resource.ComposeTestCheckFunc( + testAccCheckLinkMainRouteTableExists( + resourceName, &v), + resource.TestCheckResourceAttrSet(resourceName, "link_route_table_id"), + resource.TestCheckResourceAttrSet(resourceName, "main"), + resource.TestCheckResourceAttr(resourceName, "main", "true"), + ), + }, + }, + }) +} + +func testAccCheckLinkMainRouteTableDestroy(s *terraform.State) error { + conn := testAccProvider.Meta().(*OutscaleClient).OSCAPI + + for _, rs := range s.RootModule().Resources { + if rs.Type != "outscale_main_route_table_link" { + continue + } + params := oscgo.ReadRouteTablesRequest{ + Filters: &oscgo.FiltersRouteTable{ + RouteTableIds: &[]string{rs.Primary.Attributes["route_table_id"]}, + }, + } + var resp oscgo.ReadRouteTablesResponse + var err error + err = resource.Retry(2*time.Minute, func() *resource.RetryError { + rp, httpResp, err := conn.RouteTableApi.ReadRouteTables(context.Background()).ReadRouteTablesRequest(params).Execute() + if err != nil { + return utils.CheckThrottling(httpResp, err) + } + resp = rp + return nil + }) + + if err != nil { + if strings.Contains(fmt.Sprint(err), "InvalidRouteTableID.NotFound") { + return nil + } + return err + } + + if len(resp.GetRouteTables()) > 0 { + return fmt.Errorf( + "RouteTable: %s has LinkRouteTables", resp.GetRouteTables()[0].GetRouteTableId()) + } + } + return nil +} + +func testAccCheckLinkMainRouteTableExists(n string, v *oscgo.RouteTable) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("No ID is set") + } + + conn := testAccProvider.Meta().(*OutscaleClient).OSCAPI + + params := oscgo.ReadRouteTablesRequest{ + Filters: &oscgo.FiltersRouteTable{ + RouteTableIds: &[]string{rs.Primary.Attributes["route_table_id"]}, + }, + } + var resp oscgo.ReadRouteTablesResponse + var err error + err = resource.Retry(2*time.Minute, func() *resource.RetryError { + rp, httpResp, err := conn.RouteTableApi.ReadRouteTables(context.Background()).ReadRouteTablesRequest(params).Execute() + if err != nil { + return utils.CheckThrottling(httpResp, err) + } + resp = rp + return nil + }) + + if err != nil { + return err + } + if len(resp.GetRouteTables()) == 0 { + return fmt.Errorf("RouteTable not found") + } + + *v = resp.GetRouteTables()[0] + if len(v.GetLinkRouteTables()) == 0 { + return fmt.Errorf("RouteTable: %s has no LinkRouteTables", v.GetRouteTableId()) + } + + return nil + } +} + +const testAccLinkMainRouteTableConfig = ` + resource "outscale_net" "main_net" { + ip_range = "10.1.0.0/16" + tags { + key = "Name" + value = "testacc-mainRTable-link" + } + } + + resource "outscale_subnet" "mainSubnet" { + net_id = outscale_net.main_net.net_id + ip_range = "10.1.1.0/24" + } + + resource "outscale_route_table" "mainRTable" { + net_id = outscale_net.main_net.net_id + } + + resource "outscale_main_route_table_link" "main" { + net_id = outscale_net.main_net.net_id + route_table_id = outscale_route_table.mainRTable.id + } +` From d237fb4378879e57b424fc8b6e7c4e2503dd2eb6 Mon Sep 17 00:00:00 2001 From: Thiery Ouattara Date: Thu, 14 Mar 2024 10:21:28 +0000 Subject: [PATCH 3/4] Update integration tests --- ...e_gpu_catalog_datasource_attributes_ok.ref | 48 +++++++++++-------- ...3.vm_resource_update_security_group_ok.ref | 12 ++--- ...resource_update_deletion_protection_ok.ref | 12 ++--- .../step5.vm_resource_update_bdm_ok.ref | 12 ++--- ...tep6.vm_resource_update_performance_ok.ref | 12 ++--- .../step7.vm_resource_update_vm_type_ok.ref | 12 ++--- .../step8.vm_resource_update_user_data_ok.ref | 12 ++--- ...m_resource_update_shtdown_behaviour_ok.ref | 36 +++++++------- 8 files changed, 83 insertions(+), 73 deletions(-) diff --git a/tests/qa_provider_oapi/data/flexible_gpu_catalog/TF-176_flexible_gpu_catalog_datasource_attributes_ok/step1.flexible_gpu_catalog_datasource_attributes_ok.ref b/tests/qa_provider_oapi/data/flexible_gpu_catalog/TF-176_flexible_gpu_catalog_datasource_attributes_ok/step1.flexible_gpu_catalog_datasource_attributes_ok.ref index 04fce4358..b2a757515 100644 --- a/tests/qa_provider_oapi/data/flexible_gpu_catalog/TF-176_flexible_gpu_catalog_datasource_attributes_ok/step1.flexible_gpu_catalog_datasource_attributes_ok.ref +++ b/tests/qa_provider_oapi/data/flexible_gpu_catalog/TF-176_flexible_gpu_catalog_datasource_attributes_ok/step1.flexible_gpu_catalog_datasource_attributes_ok.ref @@ -18,21 +18,21 @@ "flexible_gpu_catalog": [ { "generations": [ - "v5", - "v6" + "v3", + "v4" ], - "max_cpu": 35, - "max_ram": 250, - "model_name": "nvidia-a100", - "v_ram": 40000 + "max_cpu": 80, + "max_ram": 512, + "model_name": "nvidia-m60", + "v_ram": 16000 }, { "generations": [ "v5" ], - "max_cpu": 80, - "max_ram": 512, - "model_name": "nvidia-p6", + "max_cpu": 35, + "max_ram": 250, + "model_name": "nvidia-v100", "v_ram": 16000 }, { @@ -46,13 +46,13 @@ }, { "generations": [ - "v3", - "v4" + "v5", + "v6" ], - "max_cpu": 80, - "max_ram": 512, - "model_name": "nvidia-k2", - "v_ram": 4096 + "max_cpu": 35, + "max_ram": 250, + "model_name": "nvidia-a10", + "v_ram": 24000 }, { "generations": [ @@ -67,10 +67,20 @@ "generations": [ "v5" ], + "max_cpu": 80, + "max_ram": 512, + "model_name": "nvidia-p6", + "v_ram": 16000 + }, + { + "generations": [ + "v5", + "v6" + ], "max_cpu": 35, "max_ram": 250, - "model_name": "nvidia-v100", - "v_ram": 16000 + "model_name": "nvidia-a100", + "v_ram": 40000 }, { "generations": [ @@ -79,8 +89,8 @@ ], "max_cpu": 80, "max_ram": 512, - "model_name": "nvidia-m60", - "v_ram": 16000 + "model_name": "nvidia-k2", + "v_ram": 4096 } ], "id": "##id-0##", diff --git a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step3.vm_resource_update_security_group_ok.ref b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step3.vm_resource_update_security_group_ok.ref index 64f3560a0..b59756be8 100644 --- a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step3.vm_resource_update_security_group_ok.ref +++ b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step3.vm_resource_update_security_group_ok.ref @@ -170,18 +170,18 @@ "root_device_name": "/dev/sda1", "root_device_type": "ebs", "security_group_ids": [ - "##id-4##", - "##id-3##" + "##id-3##", + "##id-4##" ], "security_group_names": null, "security_groups": [ - { - "security_group_id": "##id-4##", - "security_group_name": "terraform-sg-TF66-1" - }, { "security_group_id": "##id-3##", "security_group_name": "terraform-sg-TF66-0" + }, + { + "security_group_id": "##id-4##", + "security_group_name": "terraform-sg-TF66-1" } ], "state": "running", diff --git a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step4.vm_resource_update_deletion_protection_ok.ref b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step4.vm_resource_update_deletion_protection_ok.ref index 42a50d216..50c70f50a 100644 --- a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step4.vm_resource_update_deletion_protection_ok.ref +++ b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step4.vm_resource_update_deletion_protection_ok.ref @@ -170,18 +170,18 @@ "root_device_name": "/dev/sda1", "root_device_type": "ebs", "security_group_ids": [ - "##id-4##", - "##id-3##" + "##id-3##", + "##id-4##" ], "security_group_names": null, "security_groups": [ - { - "security_group_id": "##id-4##", - "security_group_name": "terraform-sg-TF66-1" - }, { "security_group_id": "##id-3##", "security_group_name": "terraform-sg-TF66-0" + }, + { + "security_group_id": "##id-4##", + "security_group_name": "terraform-sg-TF66-1" } ], "state": "running", diff --git a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step5.vm_resource_update_bdm_ok.ref b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step5.vm_resource_update_bdm_ok.ref index a6390cfb5..3d0dcda58 100644 --- a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step5.vm_resource_update_bdm_ok.ref +++ b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step5.vm_resource_update_bdm_ok.ref @@ -170,18 +170,18 @@ "root_device_name": "/dev/sda1", "root_device_type": "ebs", "security_group_ids": [ - "##id-4##", - "##id-3##" + "##id-3##", + "##id-4##" ], "security_group_names": null, "security_groups": [ - { - "security_group_id": "##id-4##", - "security_group_name": "terraform-sg-TF66-1" - }, { "security_group_id": "##id-3##", "security_group_name": "terraform-sg-TF66-0" + }, + { + "security_group_id": "##id-4##", + "security_group_name": "terraform-sg-TF66-1" } ], "state": "running", diff --git a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step6.vm_resource_update_performance_ok.ref b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step6.vm_resource_update_performance_ok.ref index a06091f41..217aebd33 100644 --- a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step6.vm_resource_update_performance_ok.ref +++ b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step6.vm_resource_update_performance_ok.ref @@ -170,18 +170,18 @@ "root_device_name": "/dev/sda1", "root_device_type": "ebs", "security_group_ids": [ - "##id-4##", - "##id-3##" + "##id-3##", + "##id-4##" ], "security_group_names": null, "security_groups": [ - { - "security_group_id": "##id-4##", - "security_group_name": "terraform-sg-TF66-1" - }, { "security_group_id": "##id-3##", "security_group_name": "terraform-sg-TF66-0" + }, + { + "security_group_id": "##id-4##", + "security_group_name": "terraform-sg-TF66-1" } ], "state": "running", diff --git a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step7.vm_resource_update_vm_type_ok.ref b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step7.vm_resource_update_vm_type_ok.ref index 17809ca49..a8b345e62 100644 --- a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step7.vm_resource_update_vm_type_ok.ref +++ b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step7.vm_resource_update_vm_type_ok.ref @@ -170,18 +170,18 @@ "root_device_name": "/dev/sda1", "root_device_type": "ebs", "security_group_ids": [ - "##id-4##", - "##id-3##" + "##id-3##", + "##id-4##" ], "security_group_names": null, "security_groups": [ - { - "security_group_id": "##id-4##", - "security_group_name": "terraform-sg-TF66-1" - }, { "security_group_id": "##id-3##", "security_group_name": "terraform-sg-TF66-0" + }, + { + "security_group_id": "##id-4##", + "security_group_name": "terraform-sg-TF66-1" } ], "state": "running", diff --git a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step8.vm_resource_update_user_data_ok.ref b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step8.vm_resource_update_user_data_ok.ref index f9a8eb656..b4d79c624 100644 --- a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step8.vm_resource_update_user_data_ok.ref +++ b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step8.vm_resource_update_user_data_ok.ref @@ -170,18 +170,18 @@ "root_device_name": "/dev/sda1", "root_device_type": "ebs", "security_group_ids": [ - "##id-4##", - "##id-3##" + "##id-3##", + "##id-4##" ], "security_group_names": null, "security_groups": [ - { - "security_group_id": "##id-4##", - "security_group_name": "terraform-sg-TF66-1" - }, { "security_group_id": "##id-3##", "security_group_name": "terraform-sg-TF66-0" + }, + { + "security_group_id": "##id-4##", + "security_group_name": "terraform-sg-TF66-1" } ], "state": "running", diff --git a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step9.vm_resource_update_shtdown_behaviour_ok.ref b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step9.vm_resource_update_shtdown_behaviour_ok.ref index cba87be78..51d377027 100644 --- a/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step9.vm_resource_update_shtdown_behaviour_ok.ref +++ b/tests/qa_provider_oapi/data/vm/TF-178_vm_resource_update_attributes_ok/step9.vm_resource_update_shtdown_behaviour_ok.ref @@ -181,17 +181,17 @@ ], "secondary_private_ip_count": 0, "security_group_ids": [ - "##id-4##", - "##id-3##" + "##id-3##", + "##id-4##" ], "security_groups": [ - { - "security_group_id": "##id-4##", - "security_group_name": "terraform-sg-TF66-1" - }, { "security_group_id": "##id-3##", "security_group_name": "terraform-sg-TF66-0" + }, + { + "security_group_id": "##id-4##", + "security_group_name": "terraform-sg-TF66-1" } ], "state": "in-use", @@ -232,17 +232,17 @@ ], "secondary_private_ip_count": 0, "security_group_ids": [ - "##id-4##", - "##id-3##" + "##id-3##", + "##id-4##" ], "security_groups": [ - { - "security_group_id": "##id-4##", - "security_group_name": "terraform-sg-TF66-1" - }, { "security_group_id": "##id-3##", "security_group_name": "terraform-sg-TF66-0" + }, + { + "security_group_id": "##id-4##", + "security_group_name": "terraform-sg-TF66-1" } ], "state": "in-use", @@ -262,18 +262,18 @@ "root_device_name": "/dev/sda1", "root_device_type": "ebs", "security_group_ids": [ - "##id-4##", - "##id-3##" + "##id-3##", + "##id-4##" ], "security_group_names": null, "security_groups": [ - { - "security_group_id": "##id-4##", - "security_group_name": "terraform-sg-TF66-1" - }, { "security_group_id": "##id-3##", "security_group_name": "terraform-sg-TF66-0" + }, + { + "security_group_id": "##id-4##", + "security_group_name": "terraform-sg-TF66-1" } ], "state": "running", From 1a5d2e23256d9a7c98883e57febbdf40d8a6b128 Mon Sep 17 00:00:00 2001 From: Thiery Ouattara Date: Thu, 14 Mar 2024 10:23:18 +0000 Subject: [PATCH 4/4] Refactoring --- .../data_source_outscale_security_group.go | 2 -- .../resource_outscale_route_table_link.go | 26 +++++-------------- ...resource_outscale_route_table_link_test.go | 8 +++--- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/outscale/data_source_outscale_security_group.go b/outscale/data_source_outscale_security_group.go index c1ad10d72..b17ff9132 100644 --- a/outscale/data_source_outscale_security_group.go +++ b/outscale/data_source_outscale_security_group.go @@ -250,8 +250,6 @@ func buildOutscaleOAPIDataSourceSecurityGroupFilters(set *schema.Set) oscgo.Filt } switch name := m["name"].(string); name { - case "account_ids": - filters.SetAccountIds(filterValues) case "descriptions": filters.SetDescriptions(filterValues) case "inbound_rule_account_ids": diff --git a/outscale/resource_outscale_route_table_link.go b/outscale/resource_outscale_route_table_link.go index b974155bb..1f3170a89 100644 --- a/outscale/resource_outscale_route_table_link.go +++ b/outscale/resource_outscale_route_table_link.go @@ -4,8 +4,6 @@ import ( "context" "errors" "fmt" - "log" - "net/http" "strings" "time" @@ -57,16 +55,13 @@ func resourceOutscaleOAPILinkRouteTable() *schema.Resource { func resourceOutscaleOAPILinkRouteTableCreate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*OutscaleClient).OSCAPI - subnetID := d.Get("subnet_id").(string) - routeTableID := d.Get("route_table_id").(string) - log.Printf("[INFO] Creating route table link: %s => %s", subnetID, routeTableID) - linkRouteTableOpts := oscgo.LinkRouteTableRequest{ - RouteTableId: routeTableID, - SubnetId: subnetID, - } - var resp oscgo.LinkRouteTableResponse var err error + + linkRouteTableOpts := oscgo.LinkRouteTableRequest{ + RouteTableId: d.Get("route_table_id").(string), + SubnetId: d.Get("subnet_id").(string), + } err = resource.Retry(5*time.Minute, func() *resource.RetryError { var err error rp, httpResp, err := conn.RouteTableApi.LinkRouteTable(context.Background()).LinkRouteTableRequest(linkRouteTableOpts).Execute() @@ -120,25 +115,16 @@ func resourceOutscaleOAPILinkRouteTableRead(d *schema.ResourceData, meta interfa func resourceOutscaleOAPILinkRouteTableDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*OutscaleClient).OSCAPI - log.Printf("[INFO] Deleting link route table: %s", d.Id()) - - var err error - var statusCode int - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err := resource.Retry(5*time.Minute, func() *resource.RetryError { _, httpResp, err := conn.RouteTableApi.UnlinkRouteTable(context.Background()).UnlinkRouteTableRequest(oscgo.UnlinkRouteTableRequest{ LinkRouteTableId: d.Id(), }).Execute() if err != nil { return utils.CheckThrottling(httpResp, err) } - statusCode = httpResp.StatusCode return nil }) - if err != nil { - if statusCode == http.StatusNotFound { - return nil - } return fmt.Errorf("Error deleting link route table: %s", err) } diff --git a/outscale/resource_outscale_route_table_link_test.go b/outscale/resource_outscale_route_table_link_test.go index 1ce60de2d..13143d411 100644 --- a/outscale/resource_outscale_route_table_link_test.go +++ b/outscale/resource_outscale_route_table_link_test.go @@ -163,16 +163,16 @@ const testAccOAPILinkRouteTableConfig = ` } resource "outscale_subnet" "foo" { - net_id = "${outscale_net.foo.id}" + net_id = outscale_net.foo.id ip_range = "10.1.1.0/24" } resource "outscale_route_table" "foo" { - net_id = "${outscale_net.foo.id}" + net_id = outscale_net.foo.id } resource "outscale_route_table_link" "foo" { - route_table_id = "${outscale_route_table.foo.id}" - subnet_id = "${outscale_subnet.foo.id}" + route_table_id = outscale_route_table.foo.id + subnet_id = outscale_subnet.foo.id } `