From b6002e1c858f27a1cb4734b00286c16a3825bd7c Mon Sep 17 00:00:00 2001 From: Alex Ellis <alexellis2@gmail.com> Date: Tue, 22 Aug 2017 17:29:31 +0100 Subject: [PATCH] Add EnvProcess and logo to UI Signed-off-by: Alex Ellis <alexellis2@gmail.com> --- 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 @@ <md-sidenav class="md-sidenav-left" md-component-id="left" md-is-locked-open="$mdMedia('gt-sm')" md-whiteframe="4" layout="column"> <md-toolbar class="md-theme-indigo"> - <h1 class="md-toolbar-tools">FaaS Gateway</h1> + <h1 class="md-toolbar-tools"><img src="icon.png" alt="OpenFaaS Icon" width="60px" height="60px" class="md-avatar"/> OpenFaaS Portal</h1> </md-toolbar> <md-content layout-padding> @@ -55,8 +55,8 @@ <md-card-title-text> <span class="md-headline"> - {{function.name}} - </span> + {{function.name}} + </span> <div layout-gt-sm="row"> <md-input-container class="md-icon-float md-block"> <label>Replicas</label> @@ -74,6 +74,12 @@ <input ng-model="function.image" type="text" readonly="readonly"> </md-input-container> </div> + <div layout-gt-sm="row" ng-show="function.envProcess"> + <md-input-container class="md-block" flex-gt-sm> + <label>Watchdog process</label> + <input ng-model="function.envProcess" type="text" readonly="readonly"> + </md-input-container> + </div> <md-card-title-text> </md-card-title> </md-card> 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"` } -- GitLab