From 56b325ed80371e32985b3be4ddd9db073cbe41e9 Mon Sep 17 00:00:00 2001 From: Renan DelValle Date: Mon, 17 Dec 2018 18:00:20 -0800 Subject: [PATCH] Aurora endpoint may now be explicitly provided with or without protocol and with or without port. --- realis.go | 7 ++++++- realis_e2e_test.go | 46 +++++++++++++++++++++++++++++++++++++++++++++- util.go | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 2 deletions(-) diff --git a/realis.go b/realis.go index c505ac5..92ac5c1 100644 --- a/realis.go +++ b/realis.go @@ -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 { diff --git a/realis_e2e_test.go b/realis_e2e_test.go index a3752da..2bc684d 100644 --- a/realis_e2e_test.go +++ b/realis_e2e_test.go @@ -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) { diff --git a/util.go b/util.go index e697432..bc93677 100644 --- a/util.go +++ b/util.go @@ -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 +}