@@ -5,14 +5,20 @@ import (
5
5
"errors"
6
6
"fmt"
7
7
"net/url"
8
+ "strconv"
9
+ "strings"
8
10
"time"
9
11
12
+ "github.com/hashicorp/terraform-plugin-framework/path"
10
13
"github.com/hashicorp/terraform-plugin-framework/resource"
14
+ "github.com/hashicorp/terraform-plugin-log/tflog"
11
15
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry"
12
16
"github.com/ovh/go-ovh/ovh"
17
+ ovhtypes "github.com/ovh/terraform-provider-ovh/ovh/types"
13
18
)
14
19
15
20
var _ resource.ResourceWithConfigure = (* ipFirewallRuleResource )(nil )
21
+ var _ resource.ResourceWithImportState = (* ipFirewallRuleResource )(nil )
16
22
17
23
func NewIpFirewallRuleResource () resource.Resource {
18
24
return & ipFirewallRuleResource {}
@@ -47,6 +53,26 @@ func (d *ipFirewallRuleResource) Schema(ctx context.Context, req resource.Schema
47
53
resp .Schema = IpFirewallRuleResourceSchema (ctx )
48
54
}
49
55
56
+ func (r * ipFirewallRuleResource ) ImportState (ctx context.Context , req resource.ImportStateRequest , resp * resource.ImportStateResponse ) {
57
+ splits := strings .Split (req .ID , "|" )
58
+ if len (splits ) != 3 {
59
+ resp .Diagnostics .AddError ("Given ID is malformed" , "ID must be formatted like the following: <ip>|<ip_on_firewall>|<sequence>" )
60
+ return
61
+ }
62
+
63
+ ip := splits [0 ]
64
+ ipOnFirewall := splits [1 ]
65
+ sequence , err := strconv .Atoi (splits [2 ])
66
+ if err != nil {
67
+ resp .Diagnostics .AddError ("Given firewall sequence number must be an integer" , err .Error ())
68
+ return
69
+ }
70
+
71
+ resp .Diagnostics .Append (resp .State .SetAttribute (ctx , path .Root ("ip" ), ip )... )
72
+ resp .Diagnostics .Append (resp .State .SetAttribute (ctx , path .Root ("ip_on_firewall" ), ipOnFirewall )... )
73
+ resp .Diagnostics .Append (resp .State .SetAttribute (ctx , path .Root ("sequence" ), sequence )... )
74
+ }
75
+
50
76
func (r * ipFirewallRuleResource ) Create (ctx context.Context , req resource.CreateRequest , resp * resource.CreateResponse ) {
51
77
var (
52
78
data IpFirewallRuleModel
@@ -129,6 +155,27 @@ func (r *ipFirewallRuleResource) Read(ctx context.Context, req resource.ReadRequ
129
155
130
156
responseData .MergeWith (& data )
131
157
158
+ // In case the resource is being imported, the fields `source_port` and `destination_port` are not returned
159
+ // by the API, so we must use fields `source_port_desc` and `destination_port_desc` to retrieve the values.
160
+ if responseData .SourcePort .IsNull () && strings .HasPrefix (responseData .SourcePortDesc .ValueString (), "eq " ) {
161
+ port := strings .TrimPrefix (responseData .SourcePortDesc .ValueString (), "eq " )
162
+ portNumber , err := strconv .ParseInt (port , 10 , 64 )
163
+ if err != nil {
164
+ tflog .Warn (ctx , fmt .Sprintf ("failed to parse source port from desc: %s" , err ))
165
+ } else {
166
+ responseData .SourcePort = ovhtypes .NewTfInt64Value (portNumber )
167
+ }
168
+ }
169
+ if responseData .DestinationPort .IsNull () && strings .HasPrefix (responseData .DestinationPortDesc .ValueString (), "eq " ) {
170
+ port := strings .TrimPrefix (responseData .DestinationPortDesc .ValueString (), "eq " )
171
+ portNumber , err := strconv .ParseInt (port , 10 , 64 )
172
+ if err != nil {
173
+ tflog .Warn (ctx , fmt .Sprintf ("failed to parse destination port from desc: %s" , err ))
174
+ } else {
175
+ responseData .DestinationPort = ovhtypes .NewTfInt64Value (portNumber )
176
+ }
177
+ }
178
+
132
179
// Save updated data into Terraform state
133
180
resp .Diagnostics .Append (resp .State .Set (ctx , & responseData )... )
134
181
}
0 commit comments