From b6002e1c858f27a1cb4734b00286c16a3825bd7c Mon Sep 17 00:00:00 2001 From: Alex Ellis Date: Tue, 22 Aug 2017 17:29:31 +0100 Subject: [PATCH] Add EnvProcess and logo to UI Signed-off-by: Alex Ellis --- gateway/assets/icon.png | Bin 0 -> 9655 bytes gateway/assets/index.html | 12 +++-- gateway/handlers/functionshandler.go | 41 ---------------- gateway/handlers/reader.go | 67 +++++++++++++++++++++++++++ gateway/requests/requests.go | 1 + 5 files changed, 77 insertions(+), 44 deletions(-) create mode 100644 gateway/assets/icon.png create mode 100644 gateway/handlers/reader.go diff --git a/gateway/assets/icon.png b/gateway/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c68b3d132f4aa2327c0c3337efca4b472b4fe38d GIT binary patch literal 9655 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 R{{Bk!T1Ew0B4z6TKL9~gI6eRX literal 0 HcmV?d00001 diff --git a/gateway/assets/index.html b/gateway/assets/index.html index 335fe944..4f9273b4 100644 --- a/gateway/assets/index.html +++ b/gateway/assets/index.html @@ -17,7 +17,7 @@ -

FaaS Gateway

+

OpenFaaS Icon  OpenFaaS Portal

@@ -55,8 +55,8 @@ - {{function.name}} - + {{function.name}} +
@@ -74,6 +74,12 @@
+
+ + + + +
diff --git a/gateway/handlers/functionshandler.go b/gateway/handlers/functionshandler.go index f41f9a2c..724eba7c 100644 --- a/gateway/handlers/functionshandler.go +++ b/gateway/handlers/functionshandler.go @@ -44,47 +44,6 @@ func getCounterValue(service string, code string, metricsOptions *metrics.Metric return invocations } -// MakeFunctionReader gives a summary of Function structs with Docker service stats overlaid with Prometheus counters. -func MakeFunctionReader(metricsOptions metrics.MetricOptions, c *client.Client) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - - serviceFilter := filters.NewArgs() - - options := types.ServiceListOptions{ - Filters: serviceFilter, - } - - services, err := c.ServiceList(context.Background(), options) - if err != nil { - fmt.Println(err) - } - - // TODO: Filter only "faas" functions (via metadata?) - var functions []requests.Function - - for _, service := range services { - - if len(service.Spec.TaskTemplate.ContainerSpec.Labels["function"]) > 0 { - invocations := getCounterValue(service.Spec.Name, "200", &metricsOptions) + - getCounterValue(service.Spec.Name, "500", &metricsOptions) - - f := requests.Function{ - Name: service.Spec.Name, - Image: service.Spec.TaskTemplate.ContainerSpec.Image, - InvocationCount: invocations, - Replicas: *service.Spec.Mode.Replicated.Replicas, - } - functions = append(functions, f) - } - } - - functionBytes, _ := json.Marshal(functions) - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(200) - w.Write(functionBytes) - } -} - func MakeDeleteFunctionHandler(metricsOptions metrics.MetricOptions, c *client.Client) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { diff --git a/gateway/handlers/reader.go b/gateway/handlers/reader.go new file mode 100644 index 00000000..6af4cb54 --- /dev/null +++ b/gateway/handlers/reader.go @@ -0,0 +1,67 @@ +package handlers + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + + "strings" + + "github.com/alexellis/faas/gateway/metrics" + "github.com/alexellis/faas/gateway/requests" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/client" +) + +// MakeFunctionReader gives a summary of Function structs with Docker service stats overlaid with Prometheus counters. +func MakeFunctionReader(metricsOptions metrics.MetricOptions, c *client.Client) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + serviceFilter := filters.NewArgs() + + options := types.ServiceListOptions{ + Filters: serviceFilter, + } + + services, err := c.ServiceList(context.Background(), options) + if err != nil { + fmt.Println(err) + } + + // TODO: Filter only "faas" functions (via metadata?) + var functions []requests.Function + + for _, service := range services { + + if len(service.Spec.TaskTemplate.ContainerSpec.Labels["function"]) > 0 { + invocations := getCounterValue(service.Spec.Name, "200", &metricsOptions) + + getCounterValue(service.Spec.Name, "500", &metricsOptions) + + var envProcess string + + for _, env := range service.Spec.TaskTemplate.ContainerSpec.Env { + if strings.Index(env, "fprocess=") > -1 { + envProcess = env[len("fprocess="):] + } + } + + f := requests.Function{ + Name: service.Spec.Name, + Image: service.Spec.TaskTemplate.ContainerSpec.Image, + InvocationCount: invocations, + Replicas: *service.Spec.Mode.Replicated.Replicas, + EnvProcess: envProcess, + } + + functions = append(functions, f) + } + } + + functionBytes, _ := json.Marshal(functions) + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(200) + w.Write(functionBytes) + } +} diff --git a/gateway/requests/requests.go b/gateway/requests/requests.go index 8f75342d..e437d6d1 100644 --- a/gateway/requests/requests.go +++ b/gateway/requests/requests.go @@ -75,4 +75,5 @@ type Function struct { Image string `json:"image"` InvocationCount float64 `json:"invocationCount"` // TODO: shouldn't this be int64? Replicas uint64 `json:"replicas"` + EnvProcess string `json:"envProcess"` }