Skip to content

Commit d188734

Browse files
author
Genevieve L'Esperance
committed
GCP: mark attached disks for auto delete when deleting instance.
1 parent 319f0a6 commit d188734

File tree

6 files changed

+71
-8
lines changed

6 files changed

+71
-8
lines changed

gcp/compute/client.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,10 @@ func (c client) ListDisks(zone string) ([]*gcpcompute.Disk, error) {
185185
return list, nil
186186
}
187187

188+
func (c client) SetDiskAutoDelete(zone, instance, disk string) error {
189+
return c.wait(c.instances.SetDiskAutoDelete(c.project, zone, instance, true, disk))
190+
}
191+
188192
func (c client) DeleteDisk(zone, disk string) error {
189193
return c.wait(c.disks.Delete(c.project, zone, disk))
190194
}

gcp/compute/fakes/instances_client.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,19 @@ type InstancesClient struct {
4242
}
4343
Stub func(string) ([]*gcpcompute.Instance, error)
4444
}
45+
SetDiskAutoDeleteCall struct {
46+
sync.Mutex
47+
CallCount int
48+
Receives struct {
49+
Zone string
50+
Instance string
51+
Disk string
52+
}
53+
Returns struct {
54+
Error error
55+
}
56+
Stub func(string, string, string) error
57+
}
4558
}
4659

4760
func (f *InstancesClient) DeleteInstance(param1 string, param2 string) error {
@@ -75,3 +88,15 @@ func (f *InstancesClient) ListInstances(param1 string) ([]*gcpcompute.Instance,
7588
}
7689
return f.ListInstancesCall.Returns.InstanceSlice, f.ListInstancesCall.Returns.Error
7790
}
91+
func (f *InstancesClient) SetDiskAutoDelete(param1 string, param2 string, param3 string) error {
92+
f.SetDiskAutoDeleteCall.Lock()
93+
defer f.SetDiskAutoDeleteCall.Unlock()
94+
f.SetDiskAutoDeleteCall.CallCount++
95+
f.SetDiskAutoDeleteCall.Receives.Zone = param1
96+
f.SetDiskAutoDeleteCall.Receives.Instance = param2
97+
f.SetDiskAutoDeleteCall.Receives.Disk = param3
98+
if f.SetDiskAutoDeleteCall.Stub != nil {
99+
return f.SetDiskAutoDeleteCall.Stub(param1, param2, param3)
100+
}
101+
return f.SetDiskAutoDeleteCall.Returns.Error
102+
}

gcp/compute/fakes/target_https_proxies_client.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package fakes
33
import (
44
"sync"
55

6-
gcp "google.golang.org/api/compute/v1"
6+
gcpcompute "google.golang.org/api/compute/v1"
77
)
88

99
type TargetHttpsProxiesClient struct {
@@ -22,10 +22,10 @@ type TargetHttpsProxiesClient struct {
2222
sync.Mutex
2323
CallCount int
2424
Returns struct {
25-
TargetHttpsProxyList *gcp.TargetHttpsProxyList
25+
TargetHttpsProxyList *gcpcompute.TargetHttpsProxyList
2626
Error error
2727
}
28-
Stub func() (*gcp.TargetHttpsProxyList, error)
28+
Stub func() (*gcpcompute.TargetHttpsProxyList, error)
2929
}
3030
}
3131

@@ -39,7 +39,7 @@ func (f *TargetHttpsProxiesClient) DeleteTargetHttpsProxy(param1 string) error {
3939
}
4040
return f.DeleteTargetHttpsProxyCall.Returns.Error
4141
}
42-
func (f *TargetHttpsProxiesClient) ListTargetHttpsProxies() (*gcp.TargetHttpsProxyList, error) {
42+
func (f *TargetHttpsProxiesClient) ListTargetHttpsProxies() (*gcpcompute.TargetHttpsProxyList, error) {
4343
f.ListTargetHttpsProxiesCall.Lock()
4444
defer f.ListTargetHttpsProxiesCall.Unlock()
4545
f.ListTargetHttpsProxiesCall.CallCount++

gcp/compute/instance.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ type Instance struct {
1212
name string
1313
clearerName string
1414
zone string
15+
diskNames []string
1516
}
1617

17-
func NewInstance(client instancesClient, name, zone string, tags *gcpcompute.Tags, networkInterfaces []*gcpcompute.NetworkInterface) Instance {
18+
func NewInstance(client instancesClient, name, zone string, tags *gcpcompute.Tags, networkInterfaces []*gcpcompute.NetworkInterface, disks []*gcpcompute.AttachedDisk) Instance {
1819
clearerName := name
1920

2021
extra := []string{}
@@ -35,17 +36,29 @@ func NewInstance(client instancesClient, name, zone string, tags *gcpcompute.Tag
3536
clearerName = fmt.Sprintf("%s (%s)", name, strings.Join(extra, ", "))
3637
}
3738

39+
diskNames := []string{}
40+
for _, d := range disks {
41+
diskNames = append(diskNames, d.DeviceName)
42+
}
43+
3844
return Instance{
3945
client: client,
4046
name: name,
4147
clearerName: clearerName,
4248
zone: zone,
49+
diskNames: diskNames,
4350
}
4451
}
4552

4653
func (i Instance) Delete() error {
47-
err := i.client.DeleteInstance(i.zone, i.name)
54+
for _, d := range i.diskNames {
55+
err := i.client.SetDiskAutoDelete(i.zone, i.name, d)
56+
if err != nil {
57+
return fmt.Errorf("Set Disk Auto Delete: %s", err)
58+
}
59+
}
4860

61+
err := i.client.DeleteInstance(i.zone, i.name)
4962
if err != nil {
5063
return fmt.Errorf("Delete: %s", err)
5164
}

gcp/compute/instance_test.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@ var _ = Describe("Instance", func() {
2727
name = "banana"
2828
zone = "zone"
2929
networkInterfaces = []*gcpcompute.NetworkInterface{{Network: "https://www.googleapis.com/compute/v1/projects/id/global/networks/kiwi-network"}}
30+
disks := []*gcpcompute.AttachedDisk{}
3031
tags = &gcpcompute.Tags{Items: []string{"tag-1"}}
3132

3233
client.GetNetworkNameCall.Returns.Name = "kiwi-network"
3334

34-
instance = compute.NewInstance(client, name, zone, tags, networkInterfaces)
35+
instance = compute.NewInstance(client, name, zone, tags, networkInterfaces, disks)
3536
})
3637

3738
Describe("Delete", func() {
@@ -44,6 +45,24 @@ var _ = Describe("Instance", func() {
4445
Expect(client.DeleteInstanceCall.Receives.Zone).To(Equal(zone))
4546
})
4647

48+
Context("when there are attached disks", func() {
49+
BeforeEach(func() {
50+
disks := []*gcpcompute.AttachedDisk{{DeviceName: "yogurt"}}
51+
instance = compute.NewInstance(client, name, zone, tags, networkInterfaces, disks)
52+
})
53+
It("marks all with auto_delete true", func() {
54+
err := instance.Delete()
55+
Expect(err).NotTo(HaveOccurred())
56+
57+
Expect(client.SetDiskAutoDeleteCall.CallCount).To(Equal(1))
58+
Expect(client.SetDiskAutoDeleteCall.Receives.Instance).To(Equal(name))
59+
Expect(client.SetDiskAutoDeleteCall.Receives.Zone).To(Equal(zone))
60+
Expect(client.SetDiskAutoDeleteCall.Receives.Disk).To(Equal("yogurt"))
61+
62+
Expect(client.DeleteInstanceCall.CallCount).To(Equal(1))
63+
})
64+
})
65+
4766
Context("when the client fails to delete", func() {
4867
BeforeEach(func() {
4968
client.DeleteInstanceCall.Returns.Error = errors.New("the-error")

gcp/compute/instances.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ type instancesClient interface {
1313
GetNetworkName(url string) (name string)
1414
ListInstances(zone string) ([]*gcpcompute.Instance, error)
1515
DeleteInstance(zone, instance string) error
16+
17+
SetDiskAutoDelete(zone, instance, disk string) error
1618
}
1719

1820
type Instances struct {
@@ -43,7 +45,7 @@ func (i Instances) List(filter string) ([]common.Deletable, error) {
4345

4446
var resources []common.Deletable
4547
for _, instance := range instances {
46-
resource := NewInstance(i.client, instance.Name, i.zones[instance.Zone], instance.Tags, instance.NetworkInterfaces)
48+
resource := NewInstance(i.client, instance.Name, i.zones[instance.Zone], instance.Tags, instance.NetworkInterfaces, instance.Disks)
4749

4850
if !strings.Contains(resource.Name(), filter) {
4951
continue

0 commit comments

Comments
 (0)