-
Notifications
You must be signed in to change notification settings - Fork 645
/
resource_ibm_is_virtual_network_interface_ip.go
156 lines (130 loc) · 5.55 KB
/
resource_ibm_is_virtual_network_interface_ip.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// Copyright IBM Corp. 2023 All Rights VirtualNetworkInterface.
// Licensed under the Mozilla Public License v2.0
package vpc
import (
"context"
"fmt"
"log"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex"
"github.com/IBM/go-sdk-core/v5/core"
"github.com/IBM/vpc-go-sdk/vpcv1"
)
func ResourceIBMIsVirtualNetworkInterfaceIP() *schema.Resource {
return &schema.Resource{
CreateContext: resourceIBMIsVirtualNetworkInterfaceIPCreate,
ReadContext: resourceIBMIsVirtualNetworkInterfaceIPRead,
DeleteContext: resourceIBMIsVirtualNetworkInterfaceIPDelete,
Importer: &schema.ResourceImporter{},
Schema: map[string]*schema.Schema{
"virtual_network_interface": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "The virtual network interface identifier.",
},
"reserved_ip": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "The reserved ip identifier.",
},
"address": &schema.Schema{
Type: schema.TypeString,
Computed: true,
Description: "The IP address.If the address has not yet been selected, the value will be `0.0.0.0`.This property may add support for IPv6 addresses in the future. When processing a value in this property, verify that the address is in an expected format. If it is not, log an error. Optionally halt processing and surface the error, or bypass the resource on which the unexpected IP address format was encountered.",
},
"name": &schema.Schema{
Type: schema.TypeString,
Computed: true,
Description: "The name for this reserved IP. The name is unique across all reserved IPs in a subnet.",
},
"href": &schema.Schema{
Type: schema.TypeString,
Computed: true,
Description: "The URL for this reserved IP.",
},
"resource_type": &schema.Schema{
Type: schema.TypeString,
Computed: true,
Description: "The resource type.",
},
},
}
}
func resourceIBMIsVirtualNetworkInterfaceIPCreate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
vpcClient, err := vpcClient(meta)
if err != nil {
return diag.FromErr(err)
}
addVirtualNetworkInterfaceIPOptions := &vpcv1.AddVirtualNetworkInterfaceIPOptions{}
addVirtualNetworkInterfaceIPOptions.SetVirtualNetworkInterfaceID(d.Get("virtual_network_interface").(string))
addVirtualNetworkInterfaceIPOptions.SetID(d.Get("reserved_ip").(string))
reservedIP, response, err := vpcClient.AddVirtualNetworkInterfaceIPWithContext(context, addVirtualNetworkInterfaceIPOptions)
if err != nil {
log.Printf("[DEBUG] AddVirtualNetworkInterfaceIPWithContext failed %s\n%s", err, response)
return diag.FromErr(fmt.Errorf("AddVirtualNetworkInterfaceIPWithContext failed %s\n%s", err, response))
}
d.SetId(fmt.Sprintf("%s/%s", *addVirtualNetworkInterfaceIPOptions.VirtualNetworkInterfaceID, *reservedIP.ID))
return resourceIBMIsVirtualNetworkInterfaceIPRead(context, d, meta)
}
func resourceIBMIsVirtualNetworkInterfaceIPRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
vpcClient, err := vpcClient(meta)
if err != nil {
return diag.FromErr(err)
}
getVirtualNetworkInterfaceIPOptions := &vpcv1.GetVirtualNetworkInterfaceIPOptions{}
parts, err := flex.SepIdParts(d.Id(), "/")
if err != nil {
return diag.FromErr(err)
}
getVirtualNetworkInterfaceIPOptions.SetVirtualNetworkInterfaceID(parts[0])
getVirtualNetworkInterfaceIPOptions.SetID(parts[1])
reservedIP, response, err := vpcClient.GetVirtualNetworkInterfaceIPWithContext(context, getVirtualNetworkInterfaceIPOptions)
if err != nil {
if response != nil && response.StatusCode == 404 {
d.SetId("")
return nil
}
log.Printf("[DEBUG] GetVirtualNetworkInterfaceIPWithContext failed %s\n%s", err, response)
return diag.FromErr(fmt.Errorf("GetVirtualNetworkInterfaceIPWithContext failed for resource %s\n%s", err, response))
}
if !core.IsNil(reservedIP.Address) {
if err = d.Set("address", reservedIP.Address); err != nil {
return diag.FromErr(fmt.Errorf("Error setting address: %s", err))
}
}
if !core.IsNil(reservedIP.Name) {
if err = d.Set("name", reservedIP.Name); err != nil {
return diag.FromErr(fmt.Errorf("Error setting name: %s", err))
}
}
if err = d.Set("href", reservedIP.Href); err != nil {
return diag.FromErr(fmt.Errorf("Error setting href: %s", err))
}
if err = d.Set("resource_type", reservedIP.ResourceType); err != nil {
return diag.FromErr(fmt.Errorf("Error setting resource_type: %s", err))
}
return nil
}
func resourceIBMIsVirtualNetworkInterfaceIPDelete(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
vpcClient, err := vpcClient(meta)
if err != nil {
return diag.FromErr(err)
}
removeVirtualNetworkInterfaceIPOptions := &vpcv1.RemoveVirtualNetworkInterfaceIPOptions{}
parts, err := flex.SepIdParts(d.Id(), "/")
if err != nil {
return diag.FromErr(err)
}
removeVirtualNetworkInterfaceIPOptions.SetVirtualNetworkInterfaceID(parts[0])
removeVirtualNetworkInterfaceIPOptions.SetID(parts[1])
response, err := vpcClient.RemoveVirtualNetworkInterfaceIPWithContext(context, removeVirtualNetworkInterfaceIPOptions)
if err != nil {
log.Printf("[DEBUG] RemoveVirtualNetworkInterfaceIPWithContext failed %s\n%s", err, response)
return diag.FromErr(fmt.Errorf("RemoveVirtualNetworkInterfaceIPWithContext failed %s\n%s", err, response))
}
d.SetId("")
return nil
}