Aurora endpoint may now be explicitly provided with or without protocol and with or without port.

This commit is contained in:
Renan DelValle 2018-12-17 18:00:20 -08:00
parent ef421f60c3
commit 56b325ed80
No known key found for this signature in database
GPG key ID: C240AD6D6F443EC9
3 changed files with 89 additions and 2 deletions

View file

@ -267,6 +267,11 @@ func NewClient(options ...ClientOption) (*Client, error) {
return nil, errors.New("Incomplete Options -- url, cluster.json, or Zookeeper address required")
}
url, err = validateAndPopulateAuroraURL(url)
if err != nil {
return nil, errors.Wrap(err, "unable to create realis object, invalid url")
}
if config.jsonTransport {
trans, err := newTJSONTransport(url, config.timeout, config)
if err != nil {
@ -359,7 +364,7 @@ func defaultTTransport(url string, timeout time.Duration, config *clientConfig)
transport.TLSClientConfig = tlsConfig
}
trans, err := thrift.NewTHttpClientWithOptions(url+"/api",
trans, err := thrift.NewTHttpClientWithOptions(url,
thrift.THttpClientOptions{Client: &http.Client{Timeout: timeout, Transport: &transport, Jar: jar}})
if err != nil {

View file

@ -63,7 +63,7 @@ func TestNonExistentEndpoint(t *testing.T) {
Jitter: 0.1}
// Attempt to connect to a bad endpoint
r, err := realis.NewClient(realis.SchedulerUrl("http://192.168.33.7:8081/doesntexist/"),
r, err := realis.NewClient(realis.SchedulerUrl("http://doesntexist.com:8081/api"),
realis.Timeout(200*time.Millisecond),
realis.BackOff(backoff),
)
@ -155,6 +155,50 @@ func TestLeaderFromZK(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, "http://192.168.33.7:8081", url)
}
func TestInvalidAuroraURL(t *testing.T) {
r, err := realis.NewClient(realis.SchedulerUrl("http://doesntexist.com:8081/apitest"))
assert.Error(t, err)
assert.Nil(t, r)
r, err = realis.NewClient(realis.SchedulerUrl("test://doesntexist.com:8081"))
assert.Error(t, err)
assert.Nil(t, r)
r, err = realis.NewClient(realis.SchedulerUrl("https://doesntexist.com:8081/testing/api"))
assert.Error(t, err)
assert.Nil(t, r)
}
func TestValidAuroraURL(t *testing.T) {
r, err := realis.NewClient(realis.SchedulerUrl("http://domain.com:8081/api"))
assert.NoError(t, err)
assert.NotNil(t, r)
r, err = realis.NewClient(realis.SchedulerUrl("https://domain.com:8081/api"))
assert.NoError(t, err)
assert.NotNil(t, r)
r, err = realis.NewClient(realis.SchedulerUrl("domain.com:8081"))
assert.NoError(t, err)
assert.NotNil(t, r)
r, err = realis.NewClient(realis.SchedulerUrl("domain.com"))
assert.NoError(t, err)
assert.NotNil(t, r)
r, err = realis.NewClient(realis.SchedulerUrl("192.168.33.7"))
assert.NoError(t, err)
assert.NotNil(t, r)
r, err = realis.NewClient(realis.SchedulerUrl("192.168.33.7:8081"))
assert.NoError(t, err)
assert.NotNil(t, r)
r, err = realis.NewClient(realis.SchedulerUrl("192.168.33.7:8081/api"))
assert.NoError(t, err)
assert.NotNil(t, r)
}
func TestRealisClient_ReestablishConn(t *testing.T) {

38
util.go
View file

@ -1,7 +1,11 @@
package realis
import (
"net/url"
"strings"
"github.com/paypal/gorealis/gen-go/apache/aurora"
"github.com/pkg/errors"
)
var ActiveStates = make(map[aurora.ScheduleStatus]bool)
@ -35,3 +39,37 @@ func init() {
AwaitingPulseJobUpdateStates[status] = true
}
}
func validateAndPopulateAuroraURL(urlStr string) (string, error) {
// If no protocol defined, assume http
if !(strings.HasPrefix(urlStr, "http") || strings.HasPrefix(urlStr, "https")) {
urlStr = "http://" + urlStr
}
u, err := url.Parse(urlStr)
if err != nil {
return "", errors.Wrap(err, "error parsing url")
}
// If no path provided assume /api
if u.Path == "" {
u.Path = "/api"
}
// If no port provided, assume default 8081
if u.Port() == "" {
u.Host = u.Host + ":8081"
}
if !(u.Scheme == "http" || u.Scheme == "https") {
return "", errors.Errorf("only protocols http and https are supported %v\n", u.Scheme)
}
if u.Path != "/api" {
return "", errors.Errorf("expected /api path %v\n", u.Path)
}
return u.String(), nil
}