Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1502)

Unified Diff: server/auth/info/info.go

Issue 1468053004: Add /auth/api/v1/server/info endpoints. (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/luci-go@master
Patch Set: add runtime version Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « appengine/gaeauth/server/default.go ('k') | server/auth/info/info_test.go » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: server/auth/info/info.go
diff --git a/server/auth/info/info.go b/server/auth/info/info.go
new file mode 100644
index 0000000000000000000000000000000000000000..bbccabc9be6c109ff3ff07177de55cdf13c808d9
--- /dev/null
+++ b/server/auth/info/info.go
@@ -0,0 +1,77 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Package info exposes /auth/api/v1/server/info URL and allows to query it.
+//
+// This endpoint is used by luci services to advertise service account names
+// they use (among other things).
+package info
+
+import (
+ "encoding/json"
+ "net/http"
+ "time"
+
+ "github.com/julienschmidt/httprouter"
+ "golang.org/x/net/context"
+
+ "github.com/luci/luci-go/server/auth/internal"
+ "github.com/luci/luci-go/server/middleware"
+ "github.com/luci/luci-go/server/proccache"
+)
+
+// ServiceInfo describes JSON format of /auth/api/v1/server/info response.
+type ServiceInfo struct {
+ AppID string `json:"app_id,omitempty"`
+ AppRuntime string `json:"app_runtime,omitempty"`
+ AppRuntimeVersion string `json:"app_runtime_version,omitempty"`
+ AppVersion string `json:"app_version,omitempty"`
+ ServiceAccountName string `json:"service_account_name,omitempty"`
+}
+
+type proccacheKey string
+
+// FetchServiceInfo fetches information about the service at given URL.
+//
+// Uses proccache to cache it locally for 1 hour.
+func FetchServiceInfo(c context.Context, serviceURL string) (*ServiceInfo, error) {
+ info, err := proccache.GetOrMake(c, proccacheKey(serviceURL), func() (interface{}, time.Duration, error) {
+ info := &ServiceInfo{}
+ err := internal.FetchJSON(c, info, func() (*http.Request, error) {
+ return http.NewRequest("GET", serviceURL+"/auth/api/v1/server/info", nil)
+ })
+ if err != nil {
+ return nil, 0, err
+ }
+ return info, time.Hour, nil
+ })
+ if err != nil {
+ return nil, err
+ }
+ return info.(*ServiceInfo), nil
+}
+
+// ServiceInfoCallback is called by /auth/api/v1/server/info handler.
+type ServiceInfoCallback func(context.Context) (ServiceInfo, error)
+
+// InstallHandlers installs handler that serves info provided by the callback.
+func InstallHandlers(r *httprouter.Router, base middleware.Base, cb ServiceInfoCallback) {
+ handler := func(c context.Context, w http.ResponseWriter, r *http.Request, p httprouter.Params) {
+ var response struct {
+ ServiceInfo
+ Error string `json:"error,omitempty"`
+ }
+ info, err := cb(c)
+ w.Header().Set("Content-Type", "application/json; charset=utf-8")
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ response.Error = err.Error()
+ } else {
+ w.WriteHeader(http.StatusOK)
+ response.ServiceInfo = info
+ }
+ json.NewEncoder(w).Encode(response)
+ }
+ r.GET("/auth/api/v1/server/info", base(handler))
+}
« no previous file with comments | « appengine/gaeauth/server/default.go ('k') | server/auth/info/info_test.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698