VOL-1691 Fix openolt adapter getting stuck while registartion with core
Change-Id: Ide8131f325bc15f1b909e14d7af6ee9bcd6b3b5b
diff --git a/vendor/github.com/hashicorp/consul/api/api.go b/vendor/github.com/hashicorp/consul/api/api.go
index 39a0ad3..11c3a2c 100644
--- a/vendor/github.com/hashicorp/consul/api/api.go
+++ b/vendor/github.com/hashicorp/consul/api/api.go
@@ -30,6 +30,10 @@
// the HTTP token.
HTTPTokenEnvName = "CONSUL_HTTP_TOKEN"
+ // HTTPTokenFileEnvName defines an environment variable name which sets
+ // the HTTP token file.
+ HTTPTokenFileEnvName = "CONSUL_HTTP_TOKEN_FILE"
+
// HTTPAuthEnvName defines an environment variable name which sets
// the HTTP authentication header.
HTTPAuthEnvName = "CONSUL_HTTP_AUTH"
@@ -85,7 +89,7 @@
RequireConsistent bool
// UseCache requests that the agent cache results locally. See
- // https://www.consul.io/api/index.html#agent-caching for more details on the
+ // https://www.consul.io/api/features/caching.html for more details on the
// semantics.
UseCache bool
@@ -95,14 +99,14 @@
// returned. Clients that wish to allow for stale results on error can set
// StaleIfError to a longer duration to change this behavior. It is ignored
// if the endpoint supports background refresh caching. See
- // https://www.consul.io/api/index.html#agent-caching for more details.
+ // https://www.consul.io/api/features/caching.html for more details.
MaxAge time.Duration
// StaleIfError specifies how stale the client will accept a cached response
// if the servers are unavailable to fetch a fresh one. Only makes sense when
// UseCache is true and MaxAge is set to a lower, non-zero value. It is
// ignored if the endpoint supports background refresh caching. See
- // https://www.consul.io/api/index.html#agent-caching for more details.
+ // https://www.consul.io/api/features/caching.html for more details.
StaleIfError time.Duration
// WaitIndex is used to enable a blocking query. Waits
@@ -146,6 +150,10 @@
// ctx is an optional context pass through to the underlying HTTP
// request layer. Use Context() and WithContext() to manage this.
ctx context.Context
+
+ // Filter requests filtering data prior to it being returned. The string
+ // is a go-bexpr compatible expression.
+ Filter string
}
func (o *QueryOptions) Context() context.Context {
@@ -276,6 +284,10 @@
// which overrides the agent's default token.
Token string
+ // TokenFile is a file containing the current token to use for this client.
+ // If provided it is read once at startup and never again.
+ TokenFile string
+
TLSConfig TLSConfig
}
@@ -339,6 +351,10 @@
config.Address = addr
}
+ if tokenFile := os.Getenv(HTTPTokenFileEnvName); tokenFile != "" {
+ config.TokenFile = tokenFile
+ }
+
if token := os.Getenv(HTTPTokenEnvName); token != "" {
config.Token = token
}
@@ -445,6 +461,7 @@
env = append(env,
fmt.Sprintf("%s=%s", HTTPAddrEnvName, c.Address),
fmt.Sprintf("%s=%s", HTTPTokenEnvName, c.Token),
+ fmt.Sprintf("%s=%s", HTTPTokenFileEnvName, c.TokenFile),
fmt.Sprintf("%s=%t", HTTPSSLEnvName, c.Scheme == "https"),
fmt.Sprintf("%s=%s", HTTPCAFile, c.TLSConfig.CAFile),
fmt.Sprintf("%s=%s", HTTPCAPath, c.TLSConfig.CAPath),
@@ -537,6 +554,19 @@
config.Address = parts[1]
}
+ // If the TokenFile is set, always use that, even if a Token is configured.
+ // This is because when TokenFile is set it is read into the Token field.
+ // We want any derived clients to have to re-read the token file.
+ if config.TokenFile != "" {
+ data, err := ioutil.ReadFile(config.TokenFile)
+ if err != nil {
+ return nil, fmt.Errorf("Error loading token file: %s", err)
+ }
+
+ if token := strings.TrimSpace(string(data)); token != "" {
+ config.Token = token
+ }
+ }
if config.Token == "" {
config.Token = defConfig.Token
}
@@ -614,6 +644,9 @@
if q.Near != "" {
r.params.Set("near", q.Near)
}
+ if q.Filter != "" {
+ r.params.Set("filter", q.Filter)
+ }
if len(q.NodeMeta) > 0 {
for key, value := range q.NodeMeta {
r.params.Add("node-meta", key+":"+value)
@@ -813,6 +846,8 @@
}
// parseQueryMeta is used to help parse query meta-data
+//
+// TODO(rb): bug? the error from this function is never handled
func parseQueryMeta(resp *http.Response, q *QueryMeta) error {
header := resp.Header
@@ -890,10 +925,42 @@
return d, nil, e
}
if resp.StatusCode != 200 {
- var buf bytes.Buffer
- io.Copy(&buf, resp.Body)
- resp.Body.Close()
- return d, nil, fmt.Errorf("Unexpected response code: %d (%s)", resp.StatusCode, buf.Bytes())
+ return d, nil, generateUnexpectedResponseCodeError(resp)
}
return d, resp, nil
}
+
+func (req *request) filterQuery(filter string) {
+ if filter == "" {
+ return
+ }
+
+ req.params.Set("filter", filter)
+}
+
+// generateUnexpectedResponseCodeError consumes the rest of the body, closes
+// the body stream and generates an error indicating the status code was
+// unexpected.
+func generateUnexpectedResponseCodeError(resp *http.Response) error {
+ var buf bytes.Buffer
+ io.Copy(&buf, resp.Body)
+ resp.Body.Close()
+ return fmt.Errorf("Unexpected response code: %d (%s)", resp.StatusCode, buf.Bytes())
+}
+
+func requireNotFoundOrOK(d time.Duration, resp *http.Response, e error) (bool, time.Duration, *http.Response, error) {
+ if e != nil {
+ if resp != nil {
+ resp.Body.Close()
+ }
+ return false, d, nil, e
+ }
+ switch resp.StatusCode {
+ case 200:
+ return true, d, resp, nil
+ case 404:
+ return false, d, resp, nil
+ default:
+ return false, d, nil, generateUnexpectedResponseCodeError(resp)
+ }
+}