add token for connecting to tracker
diff --git a/clients.go b/clients.go index c260b98..7fc8c48 100644 --- a/clients.go +++ b/clients.go
@@ -1,15 +1,19 @@ package apiGatewayConfDeploy import ( + "github.com/30x/apid-core" + "github.com/30x/apidApigeeSync" "io/ioutil" "net/http" "net/url" + "strings" ) const ( trackerConfigStatusEndpoint = "/serviceconfigstatus" trackerHeartbeatEndpoint = "/serviceheartbeat/{uuid}" trackerRegisterEndpoint = "/serviceregister/{uuid}" + ApigeeSyncTokenSelector = "ApigeeSyncToken" ) type trackerClientInterface interface { @@ -28,17 +32,18 @@ trackerBaseUrl string clusterId string httpclient *http.Client + handler *tokenEventHandler } func (t *trackerClient) putConfigStatus(configId, status, uuid, created string) trackerResponse { - uri, err := url.Parse(t.trackerBaseUrl + trackerConfigStatusEndpoint) + uri, err := url.Parse(t.trackerBaseUrl + strings.Replace(trackerConfigStatusEndpoint, "{uuid}", uuid, 1)) if err != nil { log.Errorf("putConfigStatus failed to parse tracker uri: %v", err) return (internalError(err)) } - req, err := http.NewRequest("PUT", uri, nil) + req, err := http.NewRequest("PUT", uri.String(), nil) req.Header.Add("configid", configId) - req.Header.Add("Authorization", getAuthToken()) + req.Header.Add("Authorization", t.handler.getBearerToken()) req.Header.Add("status", status) req.Header.Add("uuid", uuid) req.Header.Add("created", created) @@ -55,8 +60,16 @@ case http.StatusOK: res.code = r.StatusCode res.contentType = r.Header.Get("Content-type") + case http.StatusUnauthorized, http.StatusForbidden: + res.code = http.StatusInternalServerError + res.errString = "apid token rejected by tracker" + return res default: - res.code = r.StatusCode + if 400 <= res.code && res.code < 500 { + res.code = http.StatusInternalServerError + } else { + res.code = r.StatusCode + } res.contentType = r.Header.Get("Content-type") body, err := ioutil.ReadAll(r.Body) if err != nil { @@ -68,14 +81,13 @@ } func (t *trackerClient) postRegister(uuid, pod, created, name, podType, serviceType string) trackerResponse { - uri, err := url.Parse(t.trackerBaseUrl + trackerRegisterEndpoint) + uri, err := url.Parse(t.trackerBaseUrl + strings.Replace(trackerRegisterEndpoint, "{uuid}", uuid, 1)) if err != nil { log.Errorf("postRegister failed to parse tracker uri: %v", err) return (internalError(err)) } - req, err := http.NewRequest("PUT", uri, nil) - req.Header.Add("uuid", uuid) - req.Header.Add("Authorization", getAuthToken()) + req, err := http.NewRequest("PUT", uri.String(), nil) + req.Header.Add("Authorization", t.handler.getBearerToken()) req.Header.Add("pod", pod) req.Header.Add("podtype", podType) req.Header.Add("created", created) @@ -94,8 +106,16 @@ case http.StatusOK: res.code = r.StatusCode res.contentType = r.Header.Get("Content-type") + case http.StatusUnauthorized, http.StatusForbidden: + res.code = http.StatusInternalServerError + res.errString = "apid token rejected by tracker" + return res default: - res.code = r.StatusCode + if 400 <= res.code && res.code < 500 { + res.code = http.StatusInternalServerError + } else { + res.code = r.StatusCode + } res.contentType = r.Header.Get("Content-type") body, err := ioutil.ReadAll(r.Body) if err != nil { @@ -107,21 +127,20 @@ } func (t *trackerClient) putHeartbeat(uuid, updated string) trackerResponse { - uri, err := url.Parse(t.trackerBaseUrl + trackerHeartbeatEndpoint) + uri, err := url.Parse(t.trackerBaseUrl + strings.Replace(trackerHeartbeatEndpoint, "{uuid}", uuid, 1)) if err != nil { log.Errorf("putHeartbeat failed to parse tracker uri: %v", err) - return (internalError(err)) + return internalError(err) } - req, err := http.NewRequest("PUT", uri, nil) - req.Header.Add("uuid", uuid) - req.Header.Add("Authorization", getAuthToken()) + req, err := http.NewRequest("PUT", uri.String(), nil) + req.Header.Add("Authorization", t.handler.getBearerToken()) req.Header.Add("updated", updated) req.Header.Add("clusterid", t.clusterId) r, err := t.httpclient.Do(req) if err != nil { log.Errorf("trackerClient communication error: %v", err) - return (internalError(err)) + return internalError(err) } defer r.Body.Close() res := trackerResponse{} @@ -129,12 +148,20 @@ case http.StatusOK: res.code = r.StatusCode res.contentType = r.Header.Get("Content-type") + case http.StatusUnauthorized, http.StatusForbidden: + res.code = http.StatusInternalServerError + res.errString = "apid token rejected by tracker" + return res default: - res.code = r.StatusCode + if 400 <= res.code && res.code < 500 { + res.code = http.StatusInternalServerError + } else { + res.code = r.StatusCode + } res.contentType = r.Header.Get("Content-type") body, err := ioutil.ReadAll(r.Body) if err != nil { - return (internalError(err)) + return internalError(err) } res.errString = string(body) } @@ -147,7 +174,21 @@ return res } -func getAuthToken() string { - //TODO - return "Bearer " +type tokenEventHandler struct { + token string +} + +func (h *tokenEventHandler) Handle(e apid.Event) { + if tokenEvent, ok := e.(*apidApigeeSync.TokenEvent); ok { + h.token = tokenEvent.AccessToken + } +} + +func (h *tokenEventHandler) getBearerToken() string { + return "Bearer " + h.token +} + +func (h *tokenEventHandler) initListener(services apid.Services) { + + services.Events().Listen(ApigeeSyncTokenSelector, h) }
diff --git a/init.go b/init.go index 919e7a6..b1d2b7c 100644 --- a/init.go +++ b/init.go
@@ -129,6 +129,29 @@ } apidClusterId = config.GetString(configApidClusterID) + // initialize token handler + + tokenHandler := &tokenEventHandler{} + tokenHandler.initListener(services) + + // initialize tracker client + + client := &trackerClient{ + trackerBaseUrl: configApiServerBaseURI, + clusterId: apidClusterId, + httpclient: &http.Client{ + Transport: &http.Transport{ + MaxIdleConnsPerHost: maxIdleConnsPerHost, + }, + Timeout: httpTimeout, + CheckRedirect: func(req *http.Request, _ []*http.Request) error { + req.Header.Set("Authorization", tokenHandler.getBearerToken()) + return nil + }, + }, + handler: tokenHandler, + } + // initialize db manager dbMan := &dbManager{ @@ -139,14 +162,18 @@ // initialize api manager apiMan := &apiManager{ - dbMan: dbMan, - deploymentsEndpoint: deploymentsEndpoint, - blobEndpoint: blobEndpoint, - eTag: 0, - deploymentsChanged: make(chan interface{}, 5), - addSubscriber: make(chan chan deploymentsResult), - removeSubscriber: make(chan chan deploymentsResult), - apiInitialized: false, + dbMan: dbMan, + trackerCl: client, + deploymentsEndpoint: deploymentsEndpoint, + blobEndpoint: blobEndpoint, + configStatusEndpoint: configStatusEndpoint, + heartbeatEndpoint: heartbeatEndpoint, + registerEndpoint: registerEndpoint, + eTag: 0, + deploymentsChanged: make(chan interface{}, 5), + addSubscriber: make(chan chan deploymentsResult), + removeSubscriber: make(chan chan deploymentsResult), + apiInitialized: false, } // initialize bundle manager