diff --git a/enterprise/enterprise.go b/enterprise/enterprise.go index 93f3cd145..ad514bed5 100644 --- a/enterprise/enterprise.go +++ b/enterprise/enterprise.go @@ -2,6 +2,8 @@ package enterprise import ( "container/ring" + "net/url" + "strings" "github.com/influxdata/mrfusion" "github.com/influxdata/mrfusion/influx" @@ -38,7 +40,22 @@ func NewClientWithTimeSeries(series ...mrfusion.TimeSeries) *Client { return c } -// NewClient initializes and returns a Client. +// NewClientWithURL initializes an Enterprise client with a URL to a Meta Node. +// Acceptable URLs include host:port combinations as well as scheme://host:port +// varieties. TLS is used when the URL contains "https" or when the TLS +// parameter is set. The latter option is provided for host:port combinations +func NewClientWithURL(mu string, tls bool) (*Client, error) { + metaURL, err := parseMetaURL(mu, tls) + if err != nil { + return nil, err + } + + return &Client{ + Ctrl: control.NewClient(metaURL.Host), + }, nil +} + +// Open prepares a Client to process queries. It must be called prior to calling Query func (c *Client) Open() error { cluster, err := c.Ctrl.ShowCluster() if err != nil { @@ -69,7 +86,28 @@ func (c *Client) MonitoredServices(ctx context.Context) ([]mrfusion.MonitoredSer return []mrfusion.MonitoredService{}, nil } +// nextDataNode retrieves the next available data node func (c *Client) nextDataNode() mrfusion.TimeSeries { c.dataNodes = c.dataNodes.Next() return c.dataNodes.Value.(mrfusion.TimeSeries) } + +// parseMetaURL constructs a url from either a host:port combination or a +// scheme://host:port combo. The optional TLS parameter takes precedence over +// any TLS preference found in the provided URL +func parseMetaURL(mu string, tls bool) (metaURL *url.URL, err error) { + if strings.Contains(mu, "http") { + metaURL, err = url.Parse(mu) + } else { + metaURL = &url.URL{ + Scheme: "http", + Host: mu, + } + } + + if tls { + metaURL.Scheme = "https" + } + + return +} diff --git a/enterprise/enterprise_test.go b/enterprise/enterprise_test.go index 39572b95d..124b15f30 100644 --- a/enterprise/enterprise_test.go +++ b/enterprise/enterprise_test.go @@ -86,3 +86,33 @@ func Test_Enterprise_AdvancesDataNodes(t *testing.T) { t.Fatalf("Expected m1.Query to be called once but was %d. Expected m2.Query to be called once but was %d\n", m1.QueryCtr, m2.QueryCtr) } } + +func Test_Enterprise_NewClientWithURL(t *testing.T) { + t.Parallel() + + urls := []struct { + url string + tls bool + shouldErr bool + }{ + {"http://localhost:8086", false, false}, + {"https://localhost:8086", false, false}, + + {"http://localhost:8086", true, false}, + {"https://localhost:8086", true, false}, + + {"localhost:8086", false, false}, + {"localhost:8086", true, false}, + + {":http", false, true}, + } + + for _, testURL := range urls { + _, err := enterprise.NewClientWithURL(testURL.url, testURL.tls) + if err != nil && !testURL.shouldErr { + t.Errorf("Unexpected error creating Client with URL %s and TLS preference %t. err: %s", testURL.url, testURL.tls, err.Error()) + } else if err == nil && testURL.shouldErr { + t.Errorf("Expected error creating Client with URL %s and TLS preference %t", testURL.url, testURL.tls) + } + } +}