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"/>&nbsp; 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