Add version support to the ca.Client.

This commit is contained in:
Mariano Cano 2019-11-20 17:15:48 -08:00 committed by max furman
parent 03bb26fb91
commit 50188fc901
2 changed files with 79 additions and 0 deletions

View file

@ -418,6 +418,30 @@ func (c *Client) SetTransport(tr http.RoundTripper) {
c.client.Transport = tr c.client.Transport = tr
} }
// Version performs the version request to the CA and returns the
// api.VersionResponse struct.
func (c *Client) Version() (*api.VersionResponse, error) {
var retried bool
u := c.endpoint.ResolveReference(&url.URL{Path: "/version"})
retry:
resp, err := c.client.Get(u.String())
if err != nil {
return nil, errors.Wrapf(err, "client GET %s failed", u)
}
if resp.StatusCode >= 400 {
if !retried && c.retryOnError(resp) {
retried = true
goto retry
}
return nil, readError(resp.Body)
}
var version api.VersionResponse
if err := readJSON(resp.Body, &version); err != nil {
return nil, errors.Wrapf(err, "error reading %s", u)
}
return &version, nil
}
// Health performs the health request to the CA and returns the // Health performs the health request to the CA and returns the
// api.HealthResponse struct. // api.HealthResponse struct.
func (c *Client) Health() (*api.HealthResponse, error) { func (c *Client) Health() (*api.HealthResponse, error) {

View file

@ -150,6 +150,61 @@ func equalJSON(t *testing.T, a interface{}, b interface{}) bool {
return bytes.Equal(ab, bb) return bytes.Equal(ab, bb)
} }
func TestClient_Version(t *testing.T) {
ok := &api.VersionResponse{Version: "test"}
internal := api.InternalServerError(fmt.Errorf("Internal Server Error"))
notFound := api.NotFound(fmt.Errorf("Not Found"))
tests := []struct {
name string
response interface{}
responseCode int
wantErr bool
}{
{"ok", ok, 200, false},
{"500", internal, 500, true},
{"404", notFound, 404, true},
}
srv := httptest.NewServer(nil)
defer srv.Close()
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
c, err := NewClient(srv.URL, WithTransport(http.DefaultTransport))
if err != nil {
t.Errorf("NewClient() error = %v", err)
return
}
srv.Config.Handler = http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
api.JSONStatus(w, tt.response, tt.responseCode)
})
got, err := c.Version()
if (err != nil) != tt.wantErr {
fmt.Printf("%+v", err)
t.Errorf("Client.Version() error = %v, wantErr %v", err, tt.wantErr)
return
}
switch {
case err != nil:
if got != nil {
t.Errorf("Client.Version() = %v, want nil", got)
}
if !reflect.DeepEqual(err, tt.response) {
t.Errorf("Client.Version() error = %v, want %v", err, tt.response)
}
default:
if !reflect.DeepEqual(got, tt.response) {
t.Errorf("Client.Version() = %v, want %v", got, tt.response)
}
}
})
}
}
func TestClient_Health(t *testing.T) { func TestClient_Health(t *testing.T) {
ok := &api.HealthResponse{Status: "ok"} ok := &api.HealthResponse{Status: "ok"}
nok := api.InternalServerError(fmt.Errorf("Internal Server Error")) nok := api.InternalServerError(fmt.Errorf("Internal Server Error"))