1
// Copyright 2013 Canonical Ltd. This software is licensed under the
2
// GNU Lesser General Public License version 3 (see the file COPYING).
8
. "launchpad.net/gocheck"
13
type deleteDiskSuite struct{}
15
var _ = Suite(&deleteDiskSuite{})
17
// Real-world error messages and names.
19
diskInUseErrorTemplate = "BadRequest - A disk with name %s is currently in use by virtual machine gwaclrolemvo1yab running within hosted service gwacl623yosxtppsa9577xy5, deployment gwaclmachinewes4n64f. (http code 400: Bad Request)"
20
diskName = "gwacldiske5w7lkj"
21
diskDoesNotExistError = "DELETE request failed: ResourceNotFound - The disk with the specified name does not exist. (http code 404: Not Found)"
24
func (suite *deleteDiskSuite) TestIsInUseError(c *C) {
25
var testValues = []struct {
30
{fmt.Sprintf(diskInUseErrorTemplate, diskName), diskName, true},
31
{fmt.Sprintf(diskInUseErrorTemplate, diskName), "another-disk", false},
32
{"unknown error", diskName, false},
33
{diskDoesNotExistError, diskName, false},
35
for _, test := range testValues {
36
c.Check(isInUseError(test.errorString, test.diskName), Equals, test.expectedResult)
40
func (suite *deleteDiskSuite) TestIsDoneReturnsTrueIfNilError(c *C) {
41
poller := diskDeletePoller{nil, ""}
42
randomResponse := x509Response{StatusCode: http.StatusAccepted}
43
done, err := poller.isDone(&randomResponse, nil)
44
c.Check(done, Equals, true)
48
func (suite *deleteDiskSuite) TestIsDoneReturnsFalseIfDiskInUseError(c *C) {
49
diskName := "gwacldiske5w7lkj"
50
diskInUseError := fmt.Errorf(diskInUseErrorTemplate, diskName)
51
poller := diskDeletePoller{nil, diskName}
52
done, err := poller.isDone(nil, diskInUseError)
53
c.Check(done, Equals, false)
57
func (suite *deleteDiskSuite) TestIsDoneReturnsTrueIfAnotherError(c *C) {
58
anotherError := fmt.Errorf("Unknown error")
59
poller := diskDeletePoller{nil, "disk-name"}
60
done, err := poller.isDone(nil, anotherError)
61
c.Check(done, Equals, true)
62
c.Check(err, Equals, anotherError)
65
func (suite *deleteDiskSuite) TestPollCallsDeleteDisk(c *C) {
67
recordedRequests := setUpDispatcher("operationID")
68
diskName := "gwacldiske5w7lkj"
69
poller := diskDeletePoller{api, diskName}
71
response, err := poller.poll()
73
c.Assert(response, IsNil)
75
expectedURL := api.session.composeURL("services/disks/" + diskName)
76
checkOneRequest(c, recordedRequests, expectedURL, []byte{}, "DELETE")
79
func (suite *deleteDiskSuite) TestManagementAPIDeleteDiskPolls(c *C) {
80
firstResponse := DispatcherResponse{
81
response: &x509Response{},
82
errorObject: fmt.Errorf(diskInUseErrorTemplate, diskName)}
83
secondResponse := DispatcherResponse{
84
response: &x509Response{StatusCode: http.StatusOK},
86
responses := []DispatcherResponse{firstResponse, secondResponse}
87
rigPreparedResponseDispatcher(responses)
88
recordedRequests := make([]*x509Request, 0)
89
rigRecordingDispatcher(&recordedRequests)
92
diskName := "gwacldiske5w7lkj"
93
poller := diskDeletePoller{api, diskName}
95
response, err := performPolling(poller, time.Nanosecond, time.Minute)
97
c.Assert(response, IsNil)
99
expectedURL := api.session.composeURL("services/disks/" + diskName)
100
c.Check(len(recordedRequests), Equals, 2)
101
checkRequest(c, recordedRequests[0], expectedURL, []byte{}, "DELETE")
102
checkRequest(c, recordedRequests[1], expectedURL, []byte{}, "DELETE")