Skip to content

Commit 806939c

Browse files
committed
add ip_address
1 parent 3099fc7 commit 806939c

4 files changed

Lines changed: 234 additions & 16 deletions

File tree

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package packet
2+
3+
import (
4+
"github.com/hashicorp/terraform/helper/schema"
5+
"github.com/packethost/packngo"
6+
)
7+
8+
func resourcePacketIPAddress() *schema.Resource {
9+
return &schema.Resource{
10+
Create: resourcePacketIPAddressCreate,
11+
Read: resourcePacketIPAddressRead,
12+
Delete: resourcePacketIPAddressDelete,
13+
14+
Schema: map[string]*schema.Schema{
15+
"address": &schema.Schema{
16+
Type: schema.TypeString,
17+
Required: true,
18+
Optional: true,
19+
Computed: true,
20+
},
21+
22+
"gateway": &schema.Schema{
23+
Type: schema.TypeString,
24+
Computed: true,
25+
},
26+
27+
"network": &schema.Schema{
28+
Type: schema.TypeString,
29+
Computed: true,
30+
},
31+
32+
"family": &schema.Schema{
33+
Type: schema.TypeInt,
34+
Computed: true,
35+
},
36+
37+
"netmask": &schema.Schema{
38+
Type: schema.TypeInt,
39+
Computed: true,
40+
},
41+
42+
"cidr": &schema.Schema{
43+
Type: schema.TypeInt,
44+
Computed: true,
45+
},
46+
47+
"public": &schema.Schema{
48+
Type: schema.TypeBool,
49+
Computed: true,
50+
},
51+
52+
"assigned_to": &schema.Schema{
53+
Type: schema.TypeBool,
54+
Computed: true,
55+
},
56+
57+
"created": &schema.Schema{
58+
Type: schema.TypeString,
59+
Computed: true,
60+
},
61+
62+
"updated": &schema.Schema{
63+
Type: schema.TypeString,
64+
Computed: true,
65+
},
66+
},
67+
}
68+
}
69+
70+
func resourcePacketIPAddressCreate(d *schema.ResourceData, meta interface{}) error {
71+
client := meta.(*packngo.Client)
72+
73+
createRequest := &packngo.IPAddressAssignRequest{
74+
Address: d.Get("address").(string),
75+
}
76+
77+
device_id := ""
78+
if attr, ok := d.GetOk("instance_id"); ok {
79+
device_id = attr.(string)
80+
}
81+
82+
newIPAddress, _, err := client.Ips.Assign(device_id, createRequest)
83+
if err != nil {
84+
return friendlyError(err)
85+
}
86+
87+
d.SetId(newIPAddress.ID)
88+
89+
return resourcePacketIPAddressRead(d, meta)
90+
}
91+
92+
func resourcePacketIPAddressRead(d *schema.ResourceData, meta interface{}) error {
93+
client := meta.(*packngo.Client)
94+
95+
ip_address, _, err := client.Ips.Get(d.Id())
96+
if err != nil {
97+
err = friendlyError(err)
98+
99+
// If the volume somehow already destroyed, mark as succesfully gone.
100+
if isNotFound(err) {
101+
d.SetId("")
102+
return nil
103+
}
104+
105+
return err
106+
}
107+
108+
d.Set("address", ip_address.Address)
109+
d.Set("gateway", ip_address.Gateway)
110+
d.Set("network", ip_address.Network)
111+
d.Set("family", ip_address.AddressFamily)
112+
d.Set("netmask", ip_address.Netmask)
113+
d.Set("public", ip_address.Public)
114+
d.Set("cidr", ip_address.Cidr)
115+
d.Set("assigned_to", ip_address.AssignedTo)
116+
d.Set("created", ip_address.Created)
117+
d.Set("updated", ip_address.Updated)
118+
119+
return nil
120+
}
121+
122+
func resourcePacketIPAddressDelete(d *schema.ResourceData, meta interface{}) error {
123+
client := meta.(*packngo.Client)
124+
125+
if _, err := client.Ips.Unassign(d.Id()); err != nil {
126+
return friendlyError(err)
127+
}
128+
129+
return nil
130+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package packet
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform/helper/resource"
8+
"github.com/hashicorp/terraform/terraform"
9+
"github.com/packethost/packngo"
10+
)
11+
12+
func TestAccPacketIPAddress_Basic(t *testing.T) {
13+
var ip_address packngo.IPAddress
14+
15+
resource.Test(t, resource.TestCase{
16+
PreCheck: func() { testAccPreCheck(t) },
17+
Providers: testAccProviders,
18+
CheckDestroy: testAccCheckPacketIPAddressDestroy,
19+
Steps: []resource.TestStep{
20+
resource.TestStep{
21+
Config: testAccCheckPacketIPAddressConfig_basic,
22+
Check: resource.ComposeTestCheckFunc(
23+
testAccCheckPacketIPAddressExists("packet_ip_address.foobar", &ip_address),
24+
testAccCheckPacketIPAddressAttributes(&ip_address),
25+
resource.TestCheckResourceAttr(
26+
"packet_ip_address.foobar", "address", "foobar"),
27+
),
28+
},
29+
},
30+
})
31+
}
32+
33+
func testAccCheckPacketIPAddressDestroy(s *terraform.State) error {
34+
client := testAccProvider.Meta().(*packngo.Client)
35+
36+
for _, rs := range s.RootModule().Resources {
37+
if rs.Type != "packet_ip_address" {
38+
continue
39+
}
40+
if _, _, err := client.Ips.Get(rs.Primary.ID); err == nil {
41+
return fmt.Errorf("IPAddress cstill exists")
42+
}
43+
}
44+
45+
return nil
46+
}
47+
48+
func testAccCheckPacketIPAddressAttributes(ip_address *packngo.IPAddress) resource.TestCheckFunc {
49+
return func(s *terraform.State) error {
50+
if ip_address.Address != "foobar" {
51+
return fmt.Errorf("Bad address: %s", ip_address.Address)
52+
}
53+
return nil
54+
}
55+
}
56+
57+
func testAccCheckPacketIPAddressExists(n string, ip_address *packngo.IPAddress) resource.TestCheckFunc {
58+
return func(s *terraform.State) error {
59+
rs, ok := s.RootModule().Resources[n]
60+
if !ok {
61+
return fmt.Errorf("Not found: %s", n)
62+
}
63+
if rs.Primary.ID == "" {
64+
return fmt.Errorf("No Record ID is set")
65+
}
66+
67+
client := testAccProvider.Meta().(*packngo.Client)
68+
69+
foundIPAddress, _, err := client.Ips.Get(rs.Primary.ID)
70+
if err != nil {
71+
return err
72+
}
73+
if foundIPAddress.ID != rs.Primary.ID {
74+
return fmt.Errorf("Record not found: %v - %v", rs.Primary.ID, foundIPAddress)
75+
}
76+
77+
*ip_address = *foundIPAddress
78+
79+
return nil
80+
}
81+
}
82+
83+
var testAccCheckPacketIPAddressConfig_basic = fmt.Sprintf(`
84+
resource "packet_ip_address" "foobar" {
85+
address = "foobar"
86+
}`)

builtin/providers/packet/resource_packet_volume.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ func resourcePacketVolumeCreate(d *schema.ResourceData, meta interface{}) error
152152
func resourcePacketVolumeRead(d *schema.ResourceData, meta interface{}) error {
153153
client := meta.(*packngo.Client)
154154

155-
device, _, err := client.Volumes.Get(d.Id())
155+
volume, _, err := client.Volumes.Get(d.Id())
156156
if err != nil {
157157
err = friendlyError(err)
158158

@@ -165,25 +165,25 @@ func resourcePacketVolumeRead(d *schema.ResourceData, meta interface{}) error {
165165
return err
166166
}
167167

168-
d.Set("name", device.Name)
169-
d.Set("description", device.Description)
170-
d.Set("size", device.Size)
171-
d.Set("plan", device.Plan.Slug)
172-
d.Set("facility", device.Facility.Code)
173-
d.Set("state", device.State)
174-
d.Set("billing_cycle", device.BillingCycle)
175-
d.Set("locked", device.Locked)
176-
d.Set("created", device.Created)
177-
d.Set("updated", device.Updated)
178-
179-
snapshot_policies := make([]*packngo.SnapshotPolicy, 0, len(device.SnapshotPolicies))
180-
for _, snapshot_policy := range device.SnapshotPolicies {
168+
d.Set("name", volume.Name)
169+
d.Set("description", volume.Description)
170+
d.Set("size", volume.Size)
171+
d.Set("plan", volume.Plan.Slug)
172+
d.Set("facility", volume.Facility.Code)
173+
d.Set("state", volume.State)
174+
d.Set("billing_cycle", volume.BillingCycle)
175+
d.Set("locked", volume.Locked)
176+
d.Set("created", volume.Created)
177+
d.Set("updated", volume.Updated)
178+
179+
snapshot_policies := make([]*packngo.SnapshotPolicy, 0, len(volume.SnapshotPolicies))
180+
for _, snapshot_policy := range volume.SnapshotPolicies {
181181
snapshot_policies = append(snapshot_policies, snapshot_policy)
182182
}
183183
d.Set("snapshot_policies", snapshot_policies)
184184

185-
attachments := make([]*packngo.Attachment, 0, len(device.Attachments))
186-
for _, attachment := range device.Attachments {
185+
attachments := make([]*packngo.Attachment, 0, len(volume.Attachments))
186+
for _, attachment := range volume.Attachments {
187187
attachments = append(attachments, attachment)
188188
}
189189
d.Set("attachments", attachments)

vendor/github.com/packethost/packngo/ip.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)