vendor: Updates to Gophercloud (#11318)

This update fixes two upstream bugs:

* Instance Personality was broke
* Instance Floating IPs could not be unmarshaled in certain situations
This commit is contained in:
Joe Topjian 2017-01-23 14:25:30 -07:00 committed by Paul Stack
parent 4887844302
commit 7838bbb598
5 changed files with 271 additions and 93 deletions

148
vendor/github.com/gophercloud/gophercloud/FAQ.md generated vendored Normal file
View File

@ -0,0 +1,148 @@
# Tips
## Implementing default logging and re-authentication attempts
You can implement custom logging and/or limit re-auth attempts by creating a custom HTTP client
like the following and setting it as the provider client's HTTP Client (via the
`gophercloud.ProviderClient.HTTPClient` field):
```go
//...
// LogRoundTripper satisfies the http.RoundTripper interface and is used to
// customize the default Gophercloud RoundTripper to allow for logging.
type LogRoundTripper struct {
rt http.RoundTripper
numReauthAttempts int
}
// newHTTPClient return a custom HTTP client that allows for logging relevant
// information before and after the HTTP request.
func newHTTPClient() http.Client {
return http.Client{
Transport: &LogRoundTripper{
rt: http.DefaultTransport,
},
}
}
// RoundTrip performs a round-trip HTTP request and logs relevant information about it.
func (lrt *LogRoundTripper) RoundTrip(request *http.Request) (*http.Response, error) {
glog.Infof("Request URL: %s\n", request.URL)
response, err := lrt.rt.RoundTrip(request)
if response == nil {
return nil, err
}
if response.StatusCode == http.StatusUnauthorized {
if lrt.numReauthAttempts == 3 {
return response, fmt.Errorf("Tried to re-authenticate 3 times with no success.")
}
lrt.numReauthAttempts++
}
glog.Debugf("Response Status: %s\n", response.Status)
return response, nil
}
endpoint := "https://127.0.0.1/auth"
pc := openstack.NewClient(endpoint)
pc.HTTPClient = newHTTPClient()
//...
```
## Implementing custom objects
OpenStack request/response objects may differ among variable names or types.
### Custom request objects
To pass custom options to a request, implement the desired `<ACTION>OptsBuilder` interface. For
example, to pass in
```go
type MyCreateServerOpts struct {
Name string
Size int
}
```
to `servers.Create`, simply implement the `servers.CreateOptsBuilder` interface:
```go
func (o MyCreateServeropts) ToServerCreateMap() (map[string]interface{}, error) {
return map[string]interface{}{
"name": o.Name,
"size": o.Size,
}, nil
}
```
create an instance of your custom options object, and pass it to `servers.Create`:
```go
// ...
myOpts := MyCreateServerOpts{
Name: "s1",
Size: "100",
}
server, err := servers.Create(computeClient, myOpts).Extract()
// ...
```
### Custom response objects
Some OpenStack services have extensions. Extensions that are supported in Gophercloud can be
combined to create a custom object:
```go
// ...
type MyVolume struct {
volumes.Volume
tenantattr.VolumeExt
}
var v struct {
MyVolume `json:"volume"`
}
err := volumes.Get(client, volID).ExtractInto(&v)
// ...
```
## Overriding default `UnmarshalJSON` method
For some response objects, a field may be a custom type or may be allowed to take on
different types. In these cases, overriding the default `UnmarshalJSON` method may be
necessary. To do this, declare the JSON `struct` field tag as "-" and create an `UnmarshalJSON`
method on the type:
```go
// ...
type MyVolume struct {
ID string `json: "id"`
TimeCreated time.Time `json: "-"`
}
func (r *MyVolume) UnmarshalJSON(b []byte) error {
type tmp MyVolume
var s struct {
tmp
TimeCreated gophercloud.JSONRFC3339MilliNoZ `json:"created_at"`
}
err := json.Unmarshal(b, &s)
if err != nil {
return err
}
*r = Volume(s.tmp)
r.TimeCreated = time.Time(s.CreatedAt)
return err
}
// ...
```

View File

@ -125,6 +125,10 @@ The above code sample creates a new server with the parameters, and embodies the
new resource in the `server` variable (a
[`servers.Server`](http://godoc.org/github.com/gophercloud/gophercloud) struct).
## Advanced Usage
Have a look at the [FAQ](./FAQ.md) for some tips on customizing the way Gophercloud works.
## Backwards-Compatibility Guarantees
None. Vendor it and write tests covering the parts you use.

View File

@ -1,6 +1,9 @@
package floatingips
import (
"encoding/json"
"strconv"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/pagination"
)
@ -8,7 +11,7 @@ import (
// A FloatingIP is an IP that can be associated with an instance
type FloatingIP struct {
// ID is a unique ID of the Floating IP
ID string `json:"id"`
ID string `json:"-"`
// FixedIP is the IP of the instance related to the Floating IP
FixedIP string `json:"fixed_ip,omitempty"`
@ -23,6 +26,29 @@ type FloatingIP struct {
Pool string `json:"pool"`
}
func (r *FloatingIP) UnmarshalJSON(b []byte) error {
type tmp FloatingIP
var s struct {
tmp
ID interface{} `json:"id"`
}
err := json.Unmarshal(b, &s)
if err != nil {
return err
}
*r = FloatingIP(s.tmp)
switch t := s.ID.(type) {
case float64:
r.ID = strconv.FormatFloat(t, 'f', -1, 64)
case string:
r.ID = t
}
return err
}
// FloatingIPPage stores a single, only page of FloatingIPs
// results from a List call.
type FloatingIPPage struct {

View File

@ -160,7 +160,7 @@ type CreateOpts struct {
// Personality includes files to inject into the server at launch.
// Create will base64-encode file contents for you.
Personality Personality `json:"-"`
Personality Personality `json:"personality,omitempty"`
// ConfigDrive enables metadata injection through a configuration drive.
ConfigDrive *bool `json:"config_drive,omitempty"`

182
vendor/vendor.json vendored
View File

@ -1316,268 +1316,268 @@
"revisionTime": "2016-11-07T00:24:06Z"
},
{
"checksumSHA1": "DkbpYqirk9i+2YDR5Ujzpot/oAg=",
"checksumSHA1": "t8C0jff5naj/d2EYrUqdKus8lGY=",
"path": "github.com/gophercloud/gophercloud",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "S3zTth9INyj1RfyHkQEvJAvRWvw=",
"path": "github.com/gophercloud/gophercloud/openstack",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "XAKLUSwXSMGtbp+U874qU4MzT/A=",
"path": "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/volumeactions",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "PFD8SEqhArAy/6jRbIlYb5lp64k=",
"path": "github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "B4IXSmq364HcBruvvV0QjDFxZgc=",
"path": "github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "w2wHF5eEBE89ZYlkS9GAJsSIq9U=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "pUlKsepGmWDd4PqPaK4W85pHsRU=",
"checksumSHA1": "e7AW3YDVYJPKUjpqsB4AL9RRlTw=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "RWwUliHD65cWApdEo4ckOcPSArg=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "tOmntqlmZ/r8aObUChNloddLhwk=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/schedulerhints",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "jNrUTQf+9dYfaD7YqvKwC+kGvyY=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/secgroups",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "ci4gzd7Uy9JC4NcQ2ms19pjtW6s=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "qBpGbX7LQMPATdO8XyQmU7IXDiI=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/startstop",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "5JuziAp9BSRA/z+8pTjVLTWeTw4=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/tenantnetworks",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "2VNgU0F9PDax5VKClvMLmbzuksw=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "a9xDFPigDjHlPlthknKlBduGvKY=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/flavors",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "UGeqrw3KdPNRwDxl315MAYyy/uY=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/images",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "efmzF4m/gZ8nKJ5B9RcdQfgCy/o=",
"checksumSHA1": "S8zR7Y8Yf6dz5+m5jyWYu5ar+vk=",
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/servers",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "1sVqsZBZBNhDXLY9XzjMkcOkcbg=",
"path": "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "AvUU5En9YpG25iLlcAPDgcQODjI=",
"path": "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "ZKyEbJuIlvuZ9aUushINCXJHF4w=",
"path": "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "aTHxjMlfNXFJ3l2TZyvIwqt/3kM=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "14ZhP0wE/WCL/6oujcML755AaH4=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/fwaas/policies",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "sYET5A7WTyJ7dpuxR/VXYoReldw=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/fwaas/rules",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "0UcU/7oQbhlnYKoT+I+T403U8MQ=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "Mjt7GwFygyqPxygY8xZZnUasHmk=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "mCTz2rnyVfhjJ+AD/WihCNcYWiY=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/members",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "B2mtHvADREtFLam72wyijyQh/Ds=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/monitors",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "pTr22CKKJ26yvhgd0SRxFF4jkEs=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/pools",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "E7/Z7g5O9o+ge+8YklheTpKgWNw=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/vips",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "mhpwj5tPv7Uw5aUfC55fhLPBcKo=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/listeners",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "5efJz6UH7JCFeav5ZCCzicXCFTU=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/loadbalancers",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "TVFgBTz7B6bb1R4TWdgAkbE1/fk=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/monitors",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "xirjw9vJIN6rmkT3T56bfPfOLUM=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "FKwSMrpQf7b3TcCOQfh+ovoBShA=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "CsS/kI3VeLcSHzMKviFVDwqwgvk=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "zKOhFTL5BDZPMC58ZzZkryjskno=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/networks",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "BE+CO3QrEGpIgv3Ee2ANZp1WtSo=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/ports",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "wY0MY7RpX0Z2Y0rMmrAuYS6cHYA=",
"path": "github.com/gophercloud/gophercloud/openstack/networking/v2/subnets",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "LtdQKIKKRKe6FOGdBvrBz/bg1Gc=",
"path": "github.com/gophercloud/gophercloud/openstack/objectstorage/v1/accounts",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "1lwXcRrM5A7iCfekbn3bpfNLe3g=",
"path": "github.com/gophercloud/gophercloud/openstack/objectstorage/v1/containers",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "dotTh+ZsNiyv8e9Z4e0chPEZDKE=",
"path": "github.com/gophercloud/gophercloud/openstack/objectstorage/v1/objects",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "roxPPVwS2CjJhf0CApHNQxAX7EA=",
"path": "github.com/gophercloud/gophercloud/openstack/objectstorage/v1/swauth",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "TDOZnaS0TO0NirpxV1QwPerAQTY=",
"path": "github.com/gophercloud/gophercloud/openstack/utils",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "pmpLcbUZ+EgLUmTbzMtGRq3haOU=",
"path": "github.com/gophercloud/gophercloud/pagination",
"revision": "368deee20062b2c7a043f792d7d998abe621872e",
"revisionTime": "2017-01-12T21:19:23Z"
"revision": "ed2f96ce05eb76a9fe89e671467ebf1818f49234",
"revisionTime": "2017-01-20T19:02:54Z"
},
{
"checksumSHA1": "6tvhO5ieOvX9R6o0vtl19s0lr8E=",