diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 38f88f9180c..89d05ac049f 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -1090,6 +1090,7 @@ }, { "ImportPath": "github.com/docker/libnetwork/ipvs", + "Comment": "v0.8.0-dev.2-910-gba46b92", "Rev": "ba46b928444931e6865d8618dc03622cac79aa6f" }, { @@ -1628,10 +1629,6 @@ "ImportPath": "github.com/gophercloud/gophercloud/openstack", "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194" }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions", - "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194" - }, { "ImportPath": "github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes", "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194" diff --git a/Godeps/LICENSES b/Godeps/LICENSES index b92844bfd34..505e9b9aa67 100644 --- a/Godeps/LICENSES +++ b/Godeps/LICENSES @@ -55590,205 +55590,6 @@ specific language governing permissions and limitations under the License. ================================================================================ -================================================================================ -= vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions licensed under: = - -Copyright 2012-2013 Rackspace, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. - ------- - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - -= vendor/github.com/gophercloud/gophercloud/LICENSE dd19699707373c2ca31531a659130416 -================================================================================ - - ================================================================================ = vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes licensed under: = diff --git a/pkg/cloudprovider/providers/openstack/BUILD b/pkg/cloudprovider/providers/openstack/BUILD index 74022fef5fa..85d96216ea9 100644 --- a/pkg/cloudprovider/providers/openstack/BUILD +++ b/pkg/cloudprovider/providers/openstack/BUILD @@ -28,7 +28,6 @@ go_library( "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces:go_default_library", @@ -74,7 +73,6 @@ go_test( deps = [ "//pkg/cloudprovider:go_default_library", "//vendor/github.com/gophercloud/gophercloud:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/cloudprovider/providers/openstack/openstack.go b/pkg/cloudprovider/providers/openstack/openstack.go index eb038dc34fe..f09d200e0c9 100644 --- a/pkg/cloudprovider/providers/openstack/openstack.go +++ b/pkg/cloudprovider/providers/openstack/openstack.go @@ -24,13 +24,11 @@ import ( "io/ioutil" "net/http" "regexp" - "sort" "strings" "time" "github.com/gophercloud/gophercloud" "github.com/gophercloud/gophercloud/openstack" - apiversions_v1 "github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces" "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" "github.com/gophercloud/gophercloud/openstack/identity/v3/extensions/trusts" @@ -664,49 +662,6 @@ func (os *OpenStack) Routes() (cloudprovider.Routes, bool) { return r, true } -// Implementation of sort interface for blockstorage version probing -type APIVersionsByID []apiversions_v1.APIVersion - -func (apiVersions APIVersionsByID) Len() int { - return len(apiVersions) -} - -func (apiVersions APIVersionsByID) Swap(i, j int) { - apiVersions[i], apiVersions[j] = apiVersions[j], apiVersions[i] -} - -func (apiVersions APIVersionsByID) Less(i, j int) bool { - return apiVersions[i].ID > apiVersions[j].ID -} - -func autoVersionSelector(apiVersion *apiversions_v1.APIVersion) string { - switch strings.ToLower(apiVersion.ID) { - case "v2.0": - return "v2" - case "v1.0": - return "v1" - default: - return "" - } -} - -func doBsApiVersionAutodetect(availableApiVersions []apiversions_v1.APIVersion) string { - sort.Sort(APIVersionsByID(availableApiVersions)) - for _, status := range []string{"CURRENT", "SUPPORTED"} { - for _, version := range availableApiVersions { - if strings.ToUpper(version.Status) == status { - if detectedApiVersion := autoVersionSelector(&version); detectedApiVersion != "" { - glog.V(3).Infof("Blockstorage API version probing has found a suitable %s api version: %s", status, detectedApiVersion) - return detectedApiVersion - } - } - } - } - - return "" - -} - func (os *OpenStack) volumeService(forceVersion string) (volumeService, error) { bsVersion := "" if forceVersion == "" { @@ -721,43 +676,36 @@ func (os *OpenStack) volumeService(forceVersion string) (volumeService, error) { if err != nil { return nil, err } + glog.V(3).Infof("Using Blockstorage API V1") return &VolumesV1{sClient, os.bsOpts}, nil case "v2": sClient, err := os.NewBlockStorageV2() if err != nil { return nil, err } + glog.V(3).Infof("Using Blockstorage API V2") return &VolumesV2{sClient, os.bsOpts}, nil case "auto": - sClient, err := os.NewBlockStorageV1() + // Currently kubernetes just support Cinder v1 and Cinder v2. + // Choose Cinder v2 firstly, if kubernetes can't initialize cinder v2 client, try to initialize cinder v1 client. + // Return appropriate message when kubernetes can't initialize them. + // TODO(FengyunPan): revisit 'auto' after supporting Cinder v3. + sClient, err := os.NewBlockStorageV2() if err != nil { - return nil, err - } - availableApiVersions := []apiversions_v1.APIVersion{} - err = apiversions_v1.List(sClient).EachPage(func(page pagination.Page) (bool, error) { - // returning false from this handler stops page iteration, error is propagated to the upper function - apiversions, err := apiversions_v1.ExtractAPIVersions(page) + sClient, err = os.NewBlockStorageV1() if err != nil { - glog.Errorf("Unable to extract api versions from page: %v", err) - return false, err + // Nothing suitable found, failed autodetection, just exit with appropriate message + err_txt := "BlockStorage API version autodetection failed. " + + "Please set it explicitly in cloud.conf in section [BlockStorage] with key `bs-version`" + return nil, errors.New(err_txt) + } else { + glog.V(3).Infof("Using Blockstorage API V1") + return &VolumesV1{sClient, os.bsOpts}, nil } - availableApiVersions = append(availableApiVersions, apiversions...) - return true, nil - }) - - if err != nil { - glog.Errorf("Error when retrieving list of supported blockstorage api versions: %v", err) - return nil, err - } - if autodetectedVersion := doBsApiVersionAutodetect(availableApiVersions); autodetectedVersion != "" { - return os.volumeService(autodetectedVersion) } else { - // Nothing suitable found, failed autodetection, just exit with appropriate message - err_txt := "BlockStorage API version autodetection failed. " + - "Please set it explicitly in cloud.conf in section [BlockStorage] with key `bs-version`" - return nil, errors.New(err_txt) + glog.V(3).Infof("Using Blockstorage API V2") + return &VolumesV2{sClient, os.bsOpts}, nil } - default: err_txt := fmt.Sprintf("Config error: unrecognised bs-version \"%v\"", os.bsOpts.BSVersion) glog.Warningf(err_txt) diff --git a/pkg/cloudprovider/providers/openstack/openstack_test.go b/pkg/cloudprovider/providers/openstack/openstack_test.go index 2d9d7f9ac1a..3cf233300d7 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_test.go +++ b/pkg/cloudprovider/providers/openstack/openstack_test.go @@ -26,7 +26,6 @@ import ( "time" "github.com/gophercloud/gophercloud" - "github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions" "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" "k8s.io/api/core/v1" @@ -557,48 +556,6 @@ func TestVolumes(t *testing.T) { } -func TestCinderAutoDetectApiVersion(t *testing.T) { - updated := "" // not relevant to this test, can be set to any value - status_current := "CURRENT" - status_supported := "SUPpORTED" // lowercase to test regression resitance if api returns different case - status_deprecated := "DEPRECATED" - - var result_version, api_version [4]string - - for ver := 0; ver <= 3; ver++ { - api_version[ver] = fmt.Sprintf("v%d.0", ver) - result_version[ver] = fmt.Sprintf("v%d", ver) - } - result_version[0] = "" - api_current_v1 := apiversions.APIVersion{ID: api_version[1], Status: status_current, Updated: updated} - api_current_v2 := apiversions.APIVersion{ID: api_version[2], Status: status_current, Updated: updated} - api_current_v3 := apiversions.APIVersion{ID: api_version[3], Status: status_current, Updated: updated} - - api_supported_v1 := apiversions.APIVersion{ID: api_version[1], Status: status_supported, Updated: updated} - api_supported_v2 := apiversions.APIVersion{ID: api_version[2], Status: status_supported, Updated: updated} - - api_deprecated_v1 := apiversions.APIVersion{ID: api_version[1], Status: status_deprecated, Updated: updated} - api_deprecated_v2 := apiversions.APIVersion{ID: api_version[2], Status: status_deprecated, Updated: updated} - - var testCases = []struct { - test_case []apiversions.APIVersion - wanted_result string - }{ - {[]apiversions.APIVersion{api_current_v1}, result_version[1]}, - {[]apiversions.APIVersion{api_current_v2}, result_version[2]}, - {[]apiversions.APIVersion{api_supported_v1, api_current_v2}, result_version[2]}, // current always selected - {[]apiversions.APIVersion{api_current_v1, api_supported_v2}, result_version[1]}, // current always selected - {[]apiversions.APIVersion{api_current_v3, api_supported_v2, api_deprecated_v1}, result_version[2]}, // with current v3, but should fall back to v2 - {[]apiversions.APIVersion{api_current_v3, api_deprecated_v2, api_deprecated_v1}, result_version[0]}, // v3 is not supported - } - - for _, suite := range testCases { - if autodetectedVersion := doBsApiVersionAutodetect(suite.test_case); autodetectedVersion != suite.wanted_result { - t.Fatalf("Autodetect for suite: %s, failed with result: '%s', wanted '%s'", suite.test_case, autodetectedVersion, suite.wanted_result) - } - } -} - func TestInstanceIDFromProviderID(t *testing.T) { testCases := []struct { providerID string diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/BUILD index e4b4efd05ad..85b8866cceb 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/BUILD @@ -29,7 +29,6 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions:all-srcs", "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes:all-srcs", "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes:all-srcs", "//vendor/github.com/gophercloud/gophercloud/openstack/common/extensions:all-srcs", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/BUILD deleted file mode 100644 index 7350c681bed..00000000000 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "requests.go", - "results.go", - "urls.go", - ], - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gophercloud/gophercloud:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/doc.go b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/doc.go deleted file mode 100644 index e3af39f513a..00000000000 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package apiversions provides information and interaction with the different -// API versions for the OpenStack Block Storage service, code-named Cinder. -package apiversions diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/requests.go b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/requests.go deleted file mode 100644 index 725c13a7615..00000000000 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/requests.go +++ /dev/null @@ -1,20 +0,0 @@ -package apiversions - -import ( - "github.com/gophercloud/gophercloud" - "github.com/gophercloud/gophercloud/pagination" -) - -// List lists all the Cinder API versions available to end-users. -func List(c *gophercloud.ServiceClient) pagination.Pager { - return pagination.NewPager(c, listURL(c), func(r pagination.PageResult) pagination.Page { - return APIVersionPage{pagination.SinglePageBase(r)} - }) -} - -// Get will retrieve the volume type with the provided ID. To extract the volume -// type from the result, call the Extract method on the GetResult. -func Get(client *gophercloud.ServiceClient, v string) (r GetResult) { - _, r.Err = client.Get(getURL(client, v), &r.Body, nil) - return -} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/results.go b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/results.go deleted file mode 100644 index f510c6d103a..00000000000 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/results.go +++ /dev/null @@ -1,49 +0,0 @@ -package apiversions - -import ( - "github.com/gophercloud/gophercloud" - "github.com/gophercloud/gophercloud/pagination" -) - -// APIVersion represents an API version for Cinder. -type APIVersion struct { - ID string `json:"id"` // unique identifier - Status string `json:"status"` // current status - Updated string `json:"updated"` // date last updated -} - -// APIVersionPage is the page returned by a pager when traversing over a -// collection of API versions. -type APIVersionPage struct { - pagination.SinglePageBase -} - -// IsEmpty checks whether an APIVersionPage struct is empty. -func (r APIVersionPage) IsEmpty() (bool, error) { - is, err := ExtractAPIVersions(r) - return len(is) == 0, err -} - -// ExtractAPIVersions takes a collection page, extracts all of the elements, -// and returns them a slice of APIVersion structs. It is effectively a cast. -func ExtractAPIVersions(r pagination.Page) ([]APIVersion, error) { - var s struct { - Versions []APIVersion `json:"versions"` - } - err := (r.(APIVersionPage)).ExtractInto(&s) - return s.Versions, err -} - -// GetResult represents the result of a get operation. -type GetResult struct { - gophercloud.Result -} - -// Extract is a function that accepts a result and extracts an API version resource. -func (r GetResult) Extract() (*APIVersion, error) { - var s struct { - Version *APIVersion `json:"version"` - } - err := r.ExtractInto(&s) - return s.Version, err -} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/urls.go b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/urls.go deleted file mode 100644 index d1861ac196d..00000000000 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/urls.go +++ /dev/null @@ -1,18 +0,0 @@ -package apiversions - -import ( - "net/url" - "strings" - - "github.com/gophercloud/gophercloud" -) - -func getURL(c *gophercloud.ServiceClient, version string) string { - return c.ServiceURL(strings.TrimRight(version, "/") + "/") -} - -func listURL(c *gophercloud.ServiceClient) string { - u, _ := url.Parse(c.ServiceURL("")) - u.Path = "/" - return u.String() -}