~abp998/gwacl/subscription

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
// Copyright 2013 Canonical Ltd.  This software is licensed under the
// GNU Lesser General Public License version 3 (see the file COPYING).

package gwacl

import (
    "fmt"
    . "launchpad.net/gocheck"
    "net/http"
    "time"
)

type deleteDiskSuite struct{}

var _ = Suite(&deleteDiskSuite{})

// Real-world error messages and names.
const (
    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)"
    diskName               = "gwacldiske5w7lkj"
    diskDoesNotExistError  = "DELETE request failed: ResourceNotFound - The disk with the specified name does not exist. (http code 404: Not Found)"
)

func (suite *deleteDiskSuite) TestIsInUseError(c *C) {
    var testValues = []struct {
        errorString    string
        diskName       string
        expectedResult bool
    }{
        {fmt.Sprintf(diskInUseErrorTemplate, diskName), diskName, true},
        {fmt.Sprintf(diskInUseErrorTemplate, diskName), "another-disk", false},
        {"unknown error", diskName, false},
        {diskDoesNotExistError, diskName, false},
    }
    for _, test := range testValues {
        c.Check(isInUseError(test.errorString, test.diskName), Equals, test.expectedResult)
    }
}

func (suite *deleteDiskSuite) TestIsDoneReturnsTrueIfNilError(c *C) {
    poller := diskDeletePoller{nil, "", false}
    randomResponse := x509Response{StatusCode: http.StatusAccepted}
    done, err := poller.isDone(&randomResponse, nil)
    c.Check(done, Equals, true)
    c.Check(err, IsNil)
}

func (suite *deleteDiskSuite) TestIsDoneReturnsFalseIfDiskInUseError(c *C) {
    diskName := "gwacldiske5w7lkj"
    diskInUseError := fmt.Errorf(diskInUseErrorTemplate, diskName)
    poller := diskDeletePoller{nil, diskName, false}
    done, err := poller.isDone(nil, diskInUseError)
    c.Check(done, Equals, false)
    c.Check(err, IsNil)
}

func (suite *deleteDiskSuite) TestIsDoneReturnsTrueIfAnotherError(c *C) {
    anotherError := fmt.Errorf("Unknown error")
    poller := diskDeletePoller{nil, "disk-name", false}
    done, err := poller.isDone(nil, anotherError)
    c.Check(done, Equals, true)
    c.Check(err, Equals, anotherError)
}

func (suite *deleteDiskSuite) TestPollCallsDeleteDisk(c *C) {
    api := makeAPI(c)
    recordedRequests := setUpDispatcher("operationID")
    diskName := "gwacldiske5w7lkj"
    poller := diskDeletePoller{api, diskName, false}

    response, err := poller.poll()

    c.Assert(response, IsNil)
    c.Assert(err, IsNil)
    expectedURL := api.session.composeURL("services/disks/" + diskName)
    checkOneRequest(c, recordedRequests, expectedURL, "2012-08-01", nil, "DELETE")
}

func (suite *deleteDiskSuite) TestManagementAPIDeleteDiskPolls(c *C) {
    firstResponse := DispatcherResponse{
        response:    &x509Response{},
        errorObject: fmt.Errorf(diskInUseErrorTemplate, diskName)}
    secondResponse := DispatcherResponse{
        response:    &x509Response{StatusCode: http.StatusOK},
        errorObject: nil}
    responses := []DispatcherResponse{firstResponse, secondResponse}
    rigPreparedResponseDispatcher(responses)
    recordedRequests := make([]*X509Request, 0)
    rigRecordingDispatcher(&recordedRequests)

    api := makeAPI(c)
    diskName := "gwacldiske5w7lkj"
    poller := diskDeletePoller{api, diskName, false}

    response, err := performPolling(poller, time.Nanosecond, time.Minute)

    c.Assert(response, IsNil)
    c.Assert(err, IsNil)
    expectedURL := api.session.composeURL("services/disks/" + diskName)
    c.Check(len(recordedRequests), Equals, 2)
    checkRequest(c, recordedRequests[0], expectedURL, "2012-08-01", nil, "DELETE")
    checkRequest(c, recordedRequests[1], expectedURL, "2012-08-01", nil, "DELETE")
}