Docs revision for current status
* Update README to add a note about the reorg in progress * Rename misc to uitl * Add openstack directory Change-Id: I3f318116b1406fa862715236cc9001dea0f9231c
This commit is contained in:
parent
03e6c8f314
commit
124ac5cc92
11
README.md
11
README.md
@ -1,5 +1,8 @@
|
||||
Golang Client
|
||||
=============
|
||||
OpenStack Golang Client
|
||||
=======================
|
||||
|
||||
NOTE(dtroyer) Apr 2015: This repo is under heavy revision as it is being revived.
|
||||
|
||||
stackforge/golang-client is yet another implementation of [OpenStack]
|
||||
(http://www.openstack.org/) API client in [Go language](http://golang.org).
|
||||
The code follows OpenStack licensing and borrows its infrastructure for code
|
||||
@ -17,7 +20,7 @@ Installation
|
||||
Use `go get git.openstack.org/stackforge/golang-client.git`. Or alternatively,
|
||||
download or clone the repository.
|
||||
|
||||
The lib was developed and tested on go 1.2. No external dependencies, so far.
|
||||
The lib was developed and tested on go 1.3. No external dependencies, so far.
|
||||
|
||||
Examples
|
||||
--------
|
||||
@ -37,7 +40,7 @@ The tests were written against the [OpenStack API specifications]
|
||||
(http://docs.openstack.org/api/api-specs.html).
|
||||
The integration test were successful against the following:
|
||||
|
||||
- [HP Helion Public Cloud](http://docs.hpcloud.com/api/)
|
||||
- [DevStack](http://devstack.org)
|
||||
|
||||
If you use another provider and successfully completed the tests, please email
|
||||
the maintainer(s) so your service can be mentioned here. Alternatively, if you
|
||||
|
@ -20,10 +20,11 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.openstack.org/stackforge/golang-client.git/misc"
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.openstack.org/stackforge/golang-client.git/util"
|
||||
)
|
||||
|
||||
type Auth struct {
|
||||
@ -127,7 +128,7 @@ func AuthTenantNameTokenId(url, tenantName, tokenId string) (Auth, error) {
|
||||
|
||||
func auth(url, jsonStr *string) (Auth, error) {
|
||||
var s []byte = []byte(*jsonStr)
|
||||
resp, err := misc.CallAPI("POST", *url, &s,
|
||||
resp, err := util.CallAPI("POST", *url, &s,
|
||||
"Accept-Encoding", "gzip,deflate",
|
||||
"Accept", "application/json",
|
||||
"Content-Type", "application/json",
|
||||
@ -135,7 +136,7 @@ func auth(url, jsonStr *string) (Auth, error) {
|
||||
if err != nil {
|
||||
return Auth{}, err
|
||||
}
|
||||
if err = misc.CheckHTTPResponseStatusCode(resp); err != nil {
|
||||
if err = util.CheckHTTPResponseStatusCode(resp); err != nil {
|
||||
return Auth{}, err
|
||||
}
|
||||
var contentType string = strings.ToLower(resp.Header.Get("Content-Type"))
|
||||
|
@ -24,9 +24,10 @@ package image
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.openstack.org/stackforge/golang-client.git/misc"
|
||||
"net/http"
|
||||
"net/url"
|
||||
|
||||
"git.openstack.org/stackforge/golang-client.git/util"
|
||||
)
|
||||
|
||||
// Service is a client service that can make
|
||||
@ -56,9 +57,9 @@ type Response struct {
|
||||
type DetailResponse struct {
|
||||
CheckSum string `json:"checksum"`
|
||||
ContainerFormat string `json:"container_format"`
|
||||
CreatedAt misc.RFC8601DateTime `json:"created_at"`
|
||||
CreatedAt util.RFC8601DateTime `json:"created_at"`
|
||||
Deleted bool `json:"deleted"`
|
||||
DeletedAt *misc.RFC8601DateTime `json:"deleted_at"`
|
||||
DeletedAt *util.RFC8601DateTime `json:"deleted_at"`
|
||||
DiskFormat string `json:"disk_format"`
|
||||
ID string `json:"id"`
|
||||
IsPublic bool `json:"is_public"`
|
||||
@ -66,7 +67,7 @@ type DetailResponse struct {
|
||||
MinRAM int64 `json:"min_ram"`
|
||||
Name string `json:"name"`
|
||||
Owner *string `json:"owner"`
|
||||
UpdatedAt misc.RFC8601DateTime `json:"updated_at"`
|
||||
UpdatedAt util.RFC8601DateTime `json:"updated_at"`
|
||||
Properties map[string]string `json:"properties"`
|
||||
Protected bool `json:"protected"`
|
||||
Status string `json:"status"`
|
||||
@ -146,7 +147,7 @@ func (imageService Service) queryImages(includeDetails bool, imagesResponseConta
|
||||
return err
|
||||
}
|
||||
|
||||
err = misc.GetJSON(reqURL.String(), imageService.TokenID, imageService.Client, &imagesResponseContainer)
|
||||
err = util.GetJSON(reqURL.String(), imageService.TokenID, imageService.Client, &imagesResponseContainer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -17,12 +17,13 @@ package image_test
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"git.openstack.org/stackforge/golang-client.git/image/v1"
|
||||
"git.openstack.org/stackforge/golang-client.git/misc"
|
||||
"git.openstack.org/stackforge/golang-client.git/testUtil"
|
||||
"net/http"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"git.openstack.org/stackforge/golang-client.git/image/v1"
|
||||
"git.openstack.org/stackforge/golang-client.git/testUtil"
|
||||
"git.openstack.org/stackforge/golang-client.git/util"
|
||||
)
|
||||
|
||||
var tokn = "eaaafd18-0fed-4b3a-81b4-663c99ec1cbb"
|
||||
@ -61,8 +62,8 @@ func TestListImageDetails(t *testing.T) {
|
||||
if len(images) != 2 {
|
||||
t.Error(errors.New("Incorrect number of images found"))
|
||||
}
|
||||
createdAt, _ := misc.NewDateTime(`"2014-09-29T14:44:31"`)
|
||||
updatedAt, _ := misc.NewDateTime(`"2014-09-29T15:33:37"`)
|
||||
createdAt, _ := util.NewDateTime(`"2014-09-29T14:44:31"`)
|
||||
updatedAt, _ := util.NewDateTime(`"2014-09-29T15:33:37"`)
|
||||
owner := "10014302369510"
|
||||
virtualSize := int64(2525125)
|
||||
expectedImageDetail := image.DetailResponse{
|
||||
|
@ -15,11 +15,12 @@
|
||||
package objectstorage
|
||||
|
||||
import (
|
||||
"git.openstack.org/stackforge/golang-client.git/misc"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
|
||||
"git.openstack.org/stackforge/golang-client.git/util"
|
||||
)
|
||||
|
||||
var zeroByte = &([]byte{}) //pointer to empty []byte
|
||||
@ -86,12 +87,12 @@ func ListObjects(limit int64,
|
||||
if delim != "" {
|
||||
query += "&delimiter=" + url.QueryEscape(delim)
|
||||
}
|
||||
resp, err := misc.CallAPI("GET", conURL+query, zeroByte,
|
||||
resp, err := util.CallAPI("GET", conURL+query, zeroByte,
|
||||
"X-Auth-Token", token)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = misc.CheckHTTPResponseStatusCode(resp); err != nil {
|
||||
if err = util.CheckHTTPResponseStatusCode(resp); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
@ -108,24 +109,24 @@ func ListObjects(limit int64,
|
||||
func PutObject(fContent *[]byte, url, token string, s ...string) (err error) {
|
||||
s = append(s, "X-Auth-Token")
|
||||
s = append(s, token)
|
||||
resp, err := misc.CallAPI("PUT", url, fContent, s...)
|
||||
resp, err := util.CallAPI("PUT", url, fContent, s...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return misc.CheckHTTPResponseStatusCode(resp)
|
||||
return util.CheckHTTPResponseStatusCode(resp)
|
||||
}
|
||||
|
||||
//CopyObject calls the OpenStack copy object API using previously obtained
|
||||
//token. Note from API doc: "The destination container must exist before
|
||||
//attempting the copy."
|
||||
func CopyObject(srcURL, destURL, token string) (err error) {
|
||||
resp, err := misc.CallAPI("COPY", srcURL, zeroByte,
|
||||
resp, err := util.CallAPI("COPY", srcURL, zeroByte,
|
||||
"X-Auth-Token", token,
|
||||
"Destination", destURL)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return misc.CheckHTTPResponseStatusCode(resp)
|
||||
return util.CheckHTTPResponseStatusCode(resp)
|
||||
}
|
||||
|
||||
//DeleteObject calls the OpenStack delete object API using
|
||||
@ -137,11 +138,11 @@ func CopyObject(srcURL, destURL, token string) (err error) {
|
||||
//remove an object and you have five total versions of it, you must DELETE it
|
||||
//five times."
|
||||
func DeleteObject(url, token string) (err error) {
|
||||
resp, err := misc.CallAPI("DELETE", url, zeroByte, "X-Auth-Token", token)
|
||||
resp, err := util.CallAPI("DELETE", url, zeroByte, "X-Auth-Token", token)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return misc.CheckHTTPResponseStatusCode(resp)
|
||||
return util.CheckHTTPResponseStatusCode(resp)
|
||||
}
|
||||
|
||||
//SetObjectMeta calls the OpenStack API to create/update meta data for
|
||||
@ -149,21 +150,21 @@ func DeleteObject(url, token string) (err error) {
|
||||
func SetObjectMeta(url string, token string, s ...string) (err error) {
|
||||
s = append(s, "X-Auth-Token")
|
||||
s = append(s, token)
|
||||
resp, err := misc.CallAPI("POST", url, zeroByte, s...)
|
||||
resp, err := util.CallAPI("POST", url, zeroByte, s...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return misc.CheckHTTPResponseStatusCode(resp)
|
||||
return util.CheckHTTPResponseStatusCode(resp)
|
||||
}
|
||||
|
||||
//GetObjectMeta calls the OpenStack retrieve object metadata API using
|
||||
//previously obtained token.
|
||||
func GetObjectMeta(url, token string) (http.Header, error) {
|
||||
resp, err := misc.CallAPI("HEAD", url, zeroByte, "X-Auth-Token", token)
|
||||
resp, err := util.CallAPI("HEAD", url, zeroByte, "X-Auth-Token", token)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return resp.Header, misc.CheckHTTPResponseStatusCode(resp)
|
||||
return resp.Header, util.CheckHTTPResponseStatusCode(resp)
|
||||
}
|
||||
|
||||
//GetObject calls the OpenStack retrieve object API using previously
|
||||
@ -174,11 +175,11 @@ func GetObjectMeta(url, token string) (http.Header, error) {
|
||||
//effectively executes GetObjectMeta also in addition to getting the
|
||||
//object content.
|
||||
func GetObject(url, token string) (http.Header, []byte, error) {
|
||||
resp, err := misc.CallAPI("GET", url, zeroByte, "X-Auth-Token", token)
|
||||
resp, err := util.CallAPI("GET", url, zeroByte, "X-Auth-Token", token)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
if err = misc.CheckHTTPResponseStatusCode(resp); err != nil {
|
||||
if err = util.CheckHTTPResponseStatusCode(resp); err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
var body []byte
|
||||
|
4
openstack/README.md
Normal file
4
openstack/README.md
Normal file
@ -0,0 +1,4 @@
|
||||
openstack
|
||||
=========
|
||||
|
||||
`openstack` is the API to an OpenStack cloud.
|
@ -12,7 +12,7 @@
|
||||
// License for the specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
package misc
|
||||
package util
|
||||
|
||||
import (
|
||||
"time"
|
@ -12,19 +12,20 @@
|
||||
// License for the specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
package misc_test
|
||||
package util_test
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.openstack.org/stackforge/golang-client.git/misc"
|
||||
"git.openstack.org/stackforge/golang-client.git/testUtil"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"git.openstack.org/stackforge/golang-client.git/testUtil"
|
||||
"git.openstack.org/stackforge/golang-client.git/util"
|
||||
)
|
||||
|
||||
var testValue = `{"created_at":"2014-09-29T14:44:31"}`
|
||||
var testTime, _ = time.Parse(`"2006-01-02T15:04:05"`, `"2014-09-29T14:44:31"`)
|
||||
var timeTestValue = timeTest{CreatedAt: misc.RFC8601DateTime{testTime}}
|
||||
var timeTestValue = timeTest{CreatedAt: util.RFC8601DateTime{testTime}}
|
||||
|
||||
func TestMarshalTimeTest(t *testing.T) {
|
||||
bytes, _ := json.Marshal(timeTestValue)
|
||||
@ -54,5 +55,5 @@ func TestUnmarshalInvalidDateTimeFormatTimeTest(t *testing.T) {
|
||||
}
|
||||
|
||||
type timeTest struct {
|
||||
CreatedAt misc.RFC8601DateTime `json:"created_at"`
|
||||
CreatedAt util.RFC8601DateTime `json:"created_at"`
|
||||
}
|
@ -12,7 +12,7 @@
|
||||
// License for the specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
package misc
|
||||
package util
|
||||
|
||||
import (
|
||||
"bytes"
|
@ -12,18 +12,19 @@
|
||||
// License for the specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
package misc_test
|
||||
package util_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"git.openstack.org/stackforge/golang-client.git/misc"
|
||||
"git.openstack.org/stackforge/golang-client.git/testUtil"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strconv"
|
||||
"testing"
|
||||
|
||||
"git.openstack.org/stackforge/golang-client.git/testUtil"
|
||||
"git.openstack.org/stackforge/golang-client.git/util"
|
||||
)
|
||||
|
||||
var token = "2350971-5716-8165"
|
||||
@ -32,7 +33,7 @@ func TestDelete(t *testing.T) {
|
||||
var apiServer = testUtil.CreateDeleteTestRequestServer(t, token, "/other")
|
||||
defer apiServer.Close()
|
||||
|
||||
err := misc.Delete(apiServer.URL+"/other", token, *http.DefaultClient)
|
||||
err := util.Delete(apiServer.URL+"/other", token, *http.DefaultClient)
|
||||
testUtil.IsNil(t, err)
|
||||
}
|
||||
|
||||
@ -42,7 +43,7 @@ func TestPostJsonWithValidResponse(t *testing.T) {
|
||||
actual := TestStruct{}
|
||||
ti := TestStruct{ID: "id1", Name: "name"}
|
||||
|
||||
err := misc.PostJSON(apiServer.URL, token, *http.DefaultClient, ti, &actual)
|
||||
err := util.PostJSON(apiServer.URL, token, *http.DefaultClient, ti, &actual)
|
||||
testUtil.IsNil(t, err)
|
||||
expected := TestStruct{ID: "id1", Name: "Chris"}
|
||||
|
||||
@ -59,13 +60,13 @@ func TestCallAPI(t *testing.T) {
|
||||
w.WriteHeader(200) //ok
|
||||
}))
|
||||
zeroByte := &([]byte{})
|
||||
if _, err := misc.CallAPI("HEAD", apiServer.URL, zeroByte, "X-Auth-Token", tokn); err != nil {
|
||||
if _, err := util.CallAPI("HEAD", apiServer.URL, zeroByte, "X-Auth-Token", tokn); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if _, err := misc.CallAPI("DELETE", apiServer.URL, zeroByte, "X-Auth-Token", tokn); err != nil {
|
||||
if _, err := util.CallAPI("DELETE", apiServer.URL, zeroByte, "X-Auth-Token", tokn); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if _, err := misc.CallAPI("POST", apiServer.URL, zeroByte, "X-Auth-Token", tokn); err != nil {
|
||||
if _, err := util.CallAPI("POST", apiServer.URL, zeroByte, "X-Auth-Token", tokn); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
@ -89,7 +90,7 @@ func TestCallAPIGetContent(t *testing.T) {
|
||||
w.Write(body)
|
||||
}))
|
||||
var resp *http.Response
|
||||
if resp, err = misc.CallAPI("GET", apiServer.URL, &fContent, "X-Auth-Token", tokn,
|
||||
if resp, err = util.CallAPI("GET", apiServer.URL, &fContent, "X-Auth-Token", tokn,
|
||||
"Etag", "md5hash-blahblah"); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
@ -128,7 +129,7 @@ func TestCallAPIPutContent(t *testing.T) {
|
||||
}
|
||||
w.WriteHeader(200)
|
||||
}))
|
||||
if _, err = misc.CallAPI("PUT", apiServer.URL, &fContent, "X-Auth-Token", tokn); err != nil {
|
||||
if _, err = util.CallAPI("PUT", apiServer.URL, &fContent, "X-Auth-Token", tokn); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user