@@ -3,31 +3,27 @@ package ovh
3
3
import (
4
4
"fmt"
5
5
"log"
6
- "net"
6
+ "net/url "
7
7
"strings"
8
8
9
9
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10
10
"github.com/ovh/terraform-provider-ovh/ovh/helpers"
11
-
12
- "github.com/ovh/go-ovh/ovh"
13
11
)
14
12
15
- type OvhIpReverse struct {
16
- IpReverse string `json:"ipReverse"`
17
- Reverse string `json:"reverse"`
18
- }
19
-
20
- func resourceOvhIpReverse () * schema.Resource {
13
+ func resourceIpReverse () * schema.Resource {
21
14
return & schema.Resource {
22
- Create : resourceOvhIpReverseCreate ,
23
- Read : resourceOvhIpReverseRead ,
24
- Update : resourceOvhIpReverseUpdate ,
25
- Delete : resourceOvhIpReverseDelete ,
15
+ Create : resourceIpReverseCreate ,
16
+ Read : resourceIpReverseRead ,
17
+ Delete : resourceIpReverseDelete ,
18
+ Importer : & schema.ResourceImporter {
19
+ State : resourceIpReverseImportState ,
20
+ },
26
21
27
22
Schema : map [string ]* schema.Schema {
28
23
"ip" : {
29
24
Type : schema .TypeString ,
30
25
Required : true ,
26
+ ForceNew : true ,
31
27
ValidateFunc : func (v interface {}, k string ) (ws []string , errors []error ) {
32
28
err := helpers .ValidateIpBlock (v .(string ))
33
29
if err != nil {
@@ -36,9 +32,11 @@ func resourceOvhIpReverse() *schema.Resource {
36
32
return
37
33
},
38
34
},
39
- "ipreverse" : {
35
+
36
+ "ip_reverse" : {
40
37
Type : schema .TypeString ,
41
- Optional : true ,
38
+ Required : true ,
39
+ ForceNew : true ,
42
40
ValidateFunc : func (v interface {}, k string ) (ws []string , errors []error ) {
43
41
err := helpers .ValidateIp (v .(string ))
44
42
if err != nil {
@@ -47,130 +45,92 @@ func resourceOvhIpReverse() *schema.Resource {
47
45
return
48
46
},
49
47
},
48
+
50
49
"reverse" : {
51
50
Type : schema .TypeString ,
51
+ ForceNew : true ,
52
52
Required : true ,
53
53
},
54
54
},
55
55
}
56
56
}
57
57
58
- func resourceOvhIpReverseCreate (d * schema.ResourceData , meta interface {}) error {
59
- provider := meta .(* Config )
60
-
61
- // Create the new reverse
62
- newIp := d .Get ("ip" ).(string )
63
- newReverse := & OvhIpReverse {
64
- Reverse : d .Get ("reverse" ).(string ),
65
- }
66
-
67
- newIpReverse , ok := d .GetOk ("ipreverse" )
68
- if ! ok || newIpReverse == "" {
69
- ipAddr , ipNet , _ := net .ParseCIDR (newIp )
70
- prefixSize , _ := ipNet .Mask .Size ()
71
-
72
- if ipAddr .To4 () != nil && prefixSize != 32 {
73
- return fmt .Errorf ("ipreverse must be set if ip (%s) is not a /32" , newIp )
74
- } else if ipAddr .To4 () == nil && prefixSize != 128 {
75
- return fmt .Errorf ("ipreverse must be set if ip (%s) is not a /128" , newIp )
76
- }
77
-
78
- newIpReverse = ipAddr .String ()
79
- d .Set ("ipreverse" , newIpReverse )
58
+ func resourceIpReverseImportState (d * schema.ResourceData , meta interface {}) ([]* schema.ResourceData , error ) {
59
+ givenId := d .Id ()
60
+ splitId := strings .SplitN (givenId , ":" , 2 )
61
+ if len (splitId ) != 2 {
62
+ return nil , fmt .Errorf ("Import Id is not ip:ip_reverse formatted" )
80
63
}
64
+ ip := splitId [0 ]
65
+ ipReverse := splitId [1 ]
66
+ d .SetId (ipReverse )
67
+ d .Set ("ip" , ip )
68
+
69
+ results := make ([]* schema.ResourceData , 1 )
70
+ results [0 ] = d
71
+ return results , nil
72
+ }
81
73
82
- newReverse .IpReverse = newIpReverse .(string )
83
-
84
- log .Printf ("[DEBUG] OVH IP Reverse create configuration: %#v" , newReverse )
85
-
86
- resultReverse := OvhIpReverse {}
74
+ func resourceIpReverseCreate (d * schema.ResourceData , meta interface {}) error {
75
+ config := meta .(* Config )
87
76
88
- err := provider .OVHClient .Post (
89
- fmt .Sprintf ("/ip/%s/reverse" , strings .Replace (newIp , "/" , "%2F" , 1 )),
90
- newReverse ,
91
- & resultReverse ,
77
+ // Create the new reverse
78
+ ip := d .Get ("ip" ).(string )
79
+ opts := (& IpReverseCreateOpts {}).FromResource (d )
80
+ res := & IpReverse {}
81
+
82
+ err := config .OVHClient .Post (
83
+ fmt .Sprintf ("/ip/%s/reverse" , url .PathEscape (ip )),
84
+ opts ,
85
+ & res ,
92
86
)
93
87
if err != nil {
94
88
return fmt .Errorf ("Failed to create OVH IP Reverse: %s" , err )
95
89
}
96
90
97
- d .SetId (fmt . Sprintf ( "%s_%s" , newIp , resultReverse . IpReverse ) )
91
+ d .SetId (res . IpReverse )
98
92
99
- return resourceOvhIpReverseRead (d , meta )
93
+ return resourceIpReverseRead (d , meta )
100
94
}
101
95
102
- func resourceOvhIpReverseRead (d * schema.ResourceData , meta interface {}) error {
103
- provider := meta .(* Config )
96
+ func resourceIpReverseRead (d * schema.ResourceData , meta interface {}) error {
97
+ config := meta .(* Config )
104
98
105
- reverse := OvhIpReverse {}
99
+ ip := d .Get ("ip" ).(string )
100
+
101
+ res := & IpReverse {}
106
102
endpoint := fmt .Sprintf (
107
103
"/ip/%s/reverse/%s" ,
108
- strings . Replace ( d . Get ( "ip" ).( string ), "/" , "%2F" , 1 ),
109
- d . Get ( "ipreverse" ).( string ),
104
+ url . PathEscape ( ip ),
105
+ url . PathEscape ( d . Id () ),
110
106
)
111
107
112
- if err := provider .OVHClient .Get (endpoint , & reverse ); err != nil {
108
+ if err := config .OVHClient .Get (endpoint , & res ); err != nil {
113
109
return helpers .CheckDeleted (d , err , endpoint )
114
110
}
115
111
116
- d .Set ("ipreverse" , reverse .IpReverse )
117
- d .Set ("reverse" , reverse .Reverse )
118
-
119
- return nil
120
- }
121
-
122
- func resourceOvhIpReverseUpdate (d * schema.ResourceData , meta interface {}) error {
123
- provider := meta .(* Config )
124
-
125
- reverse := OvhIpReverse {}
126
-
127
- if attr , ok := d .GetOk ("ipreverse" ); ok {
128
- reverse .IpReverse = attr .(string )
129
- }
130
- if attr , ok := d .GetOk ("reverse" ); ok {
131
- reverse .Reverse = attr .(string )
112
+ for k , v := range res .ToMap () {
113
+ d .Set (k , v )
132
114
}
133
115
134
- log .Printf ("[DEBUG] OVH IP Reverse update configuration: %#v" , reverse )
135
-
136
- err := provider .OVHClient .Post (
137
- fmt .Sprintf ("/ip/%s/reverse" , strings .Replace (d .Get ("ip" ).(string ), "/" , "%2F" , 1 )),
138
- reverse ,
139
- nil ,
140
- )
141
- if err != nil {
142
- return fmt .Errorf ("Failed to update OVH IP Reverse: %s" , err )
143
- }
144
-
145
- return resourceOvhIpReverseRead (d , meta )
116
+ return nil
146
117
}
147
118
148
- func resourceOvhIpReverseDelete (d * schema.ResourceData , meta interface {}) error {
149
- provider := meta .(* Config )
119
+ func resourceIpReverseDelete (d * schema.ResourceData , meta interface {}) error {
120
+ config := meta .(* Config )
150
121
151
- log .Printf ("[INFO] Deleting OVH IP Reverse: %s->%s" , d .Get ("reverse" ).(string ), d .Get ("ipreverse" ).(string ))
152
-
153
- err := provider .OVHClient .Delete (
154
- fmt .Sprintf ("/ip/%s/reverse/%s" , strings .Replace (d .Get ("ip" ).(string ), "/" , "%2F" , 1 ), d .Get ("ipreverse" ).(string )),
155
- nil ,
122
+ log .Printf ("[INFO] Deleting OVH IP Reverse: %s->%s" , d .Get ("reverse" ).(string ), d .Get ("ip_reverse" ).(string ))
123
+ ip := d .Get ("ip" ).(string )
124
+ endpoint := fmt .Sprintf (
125
+ "/ip/%s/reverse/%s" ,
126
+ url .PathEscape (ip ),
127
+ url .PathEscape (d .Id ()),
156
128
)
157
129
158
- if err != nil {
159
- return fmt .Errorf ("Error deleting OVH IP Reverse: %s" , err )
160
- }
161
-
162
- return nil
163
- }
164
-
165
- func resourceOvhIpReverseExists (ip , ipreverse string , c * ovh.Client ) error {
166
- reverse := OvhIpReverse {}
167
- endpoint := fmt .Sprintf ("/ip/%s/reverse/%s" , strings .Replace (ip , "/" , "%2F" , 1 ), ipreverse )
168
-
169
- err := c .Get (endpoint , & reverse )
170
- if err != nil {
171
- return fmt .Errorf ("calling %s:\n \t %q" , endpoint , err )
130
+ if err := config .OVHClient .Delete (endpoint , nil ); err != nil {
131
+ return helpers .CheckDeleted (d , err , endpoint )
172
132
}
173
- log .Printf ("[DEBUG] Read IP reverse: %s" , reverse )
174
133
134
+ d .SetId ("" )
175
135
return nil
176
136
}
0 commit comments