allocator: use the instance kubernetes name as the canonical instance key

The goal is to break the implicit relation between the kube name and the
mount name of the instance.  The mount name is generated for the
instance at creation time and then stored with the instance.  Deriving
one from the other after that point is fragile, since the format of
either could change in the future (or we could have zero or more mount
names per instance).

Most of the changes are mechanical and result in simplifications.  In
particular, the handlers are easier for users to work with than full
mount names.  There are two parts that become slighly more complex:

1. The dashboard handler still needs the mount name; instead of
extracting it from the deployment json (which would incur an extra
kubectl command), we pack it in the request url together with the
instance handle.  To prevent undue access, we sign the pair.

2. The allocator cmd-line tool "list" command now has two modes, showing
just the handles or full details about each instance.

While at it, also remove the transitional logic that filled in the mount
name and blessing names for instances that didn't have this persisted in
their deployment annotations.

Change-Id: I4380ad4d3376fa64961048838815fdc2f8e71a3a
diff --git a/services/allocator/allocator.vdl.go b/services/allocator/allocator.vdl.go
index a3f2312..2e37a22 100644
--- a/services/allocator/allocator.vdl.go
+++ b/services/allocator/allocator.vdl.go
@@ -8,26 +8,187 @@
 package allocator
 
 import (
+	"time"
 	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/rpc"
+	"v.io/v23/vdl"
+	vdltime "v.io/v23/vdlroot/time"
 )
 
 var _ = __VDLInit() // Must be first; see __VDLInit comments for details.
 
 //////////////////////////////////////////////////
+// Type definitions
+
+// Instance describes a service instance.
+type Instance struct {
+	Handle        string
+	MountName     string
+	BlessingNames []string
+	CreationTime  time.Time
+}
+
+func (Instance) __VDLReflect(struct {
+	Name string `vdl:"v.io/x/ref/services/allocator.Instance"`
+}) {
+}
+
+func (x Instance) VDLIsZero() bool {
+	if x.Handle != "" {
+		return false
+	}
+	if x.MountName != "" {
+		return false
+	}
+	if len(x.BlessingNames) != 0 {
+		return false
+	}
+	if !x.CreationTime.IsZero() {
+		return false
+	}
+	return true
+}
+
+func (x Instance) VDLWrite(enc vdl.Encoder) error {
+	if err := enc.StartValue(__VDLType_struct_1); err != nil {
+		return err
+	}
+	if x.Handle != "" {
+		if err := enc.NextFieldValueString("Handle", vdl.StringType, x.Handle); err != nil {
+			return err
+		}
+	}
+	if x.MountName != "" {
+		if err := enc.NextFieldValueString("MountName", vdl.StringType, x.MountName); err != nil {
+			return err
+		}
+	}
+	if len(x.BlessingNames) != 0 {
+		if err := enc.NextField("BlessingNames"); err != nil {
+			return err
+		}
+		if err := __VDLWriteAnon_list_1(enc, x.BlessingNames); err != nil {
+			return err
+		}
+	}
+	if !x.CreationTime.IsZero() {
+		if err := enc.NextField("CreationTime"); err != nil {
+			return err
+		}
+		var wire vdltime.Time
+		if err := vdltime.TimeFromNative(&wire, x.CreationTime); err != nil {
+			return err
+		}
+		if err := wire.VDLWrite(enc); err != nil {
+			return err
+		}
+	}
+	if err := enc.NextField(""); err != nil {
+		return err
+	}
+	return enc.FinishValue()
+}
+
+func __VDLWriteAnon_list_1(enc vdl.Encoder, x []string) error {
+	if err := enc.StartValue(__VDLType_list_2); err != nil {
+		return err
+	}
+	if err := enc.SetLenHint(len(x)); err != nil {
+		return err
+	}
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
+			return err
+		}
+	}
+	if err := enc.NextEntry(true); err != nil {
+		return err
+	}
+	return enc.FinishValue()
+}
+
+func (x *Instance) VDLRead(dec vdl.Decoder) error {
+	*x = Instance{}
+	if err := dec.StartValue(__VDLType_struct_1); err != nil {
+		return err
+	}
+	for {
+		f, err := dec.NextField()
+		if err != nil {
+			return err
+		}
+		switch f {
+		case "":
+			return dec.FinishValue()
+		case "Handle":
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				x.Handle = value
+			}
+		case "MountName":
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				x.MountName = value
+			}
+		case "BlessingNames":
+			if err := __VDLReadAnon_list_1(dec, &x.BlessingNames); err != nil {
+				return err
+			}
+		case "CreationTime":
+			var wire vdltime.Time
+			if err := wire.VDLRead(dec); err != nil {
+				return err
+			}
+			if err := vdltime.TimeToNative(wire, &x.CreationTime); err != nil {
+				return err
+			}
+		default:
+			if err := dec.SkipValue(); err != nil {
+				return err
+			}
+		}
+	}
+}
+
+func __VDLReadAnon_list_1(dec vdl.Decoder, x *[]string) error {
+	if err := dec.StartValue(__VDLType_list_2); err != nil {
+		return err
+	}
+	if len := dec.LenHint(); len > 0 {
+		*x = make([]string, 0, len)
+	} else {
+		*x = nil
+	}
+	for {
+		switch done, elem, err := dec.NextEntryValueString(); {
+		case err != nil:
+			return err
+		case done:
+			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
+		}
+	}
+}
+
+//////////////////////////////////////////////////
 // Interface definitions
 
 // AllocatorClientMethods is the client interface
 // containing Allocator methods.
 type AllocatorClientMethods interface {
 	// Create creates a new instance of the service.
-	// It returns the object name of the new instance.
-	Create(*context.T, ...rpc.CallOpt) (name string, _ error)
-	// Destroy destroys the instance with the given name.
-	Destroy(_ *context.T, name string, _ ...rpc.CallOpt) error
+	// It returns a handle for the new instance.
+	Create(*context.T, ...rpc.CallOpt) (handle string, _ error)
+	// Destroy destroys the instance with the given handle.
+	Destroy(_ *context.T, handle string, _ ...rpc.CallOpt) error
 	// List returns a list of all the instances owned by the caller.
-	List(*context.T, ...rpc.CallOpt) (names []string, _ error)
+	List(*context.T, ...rpc.CallOpt) (instances []Instance, _ error)
 }
 
 // AllocatorClientStub adds universal methods to AllocatorClientMethods.
@@ -55,7 +216,7 @@
 	return
 }
 
-func (c implAllocatorClientStub) List(ctx *context.T, opts ...rpc.CallOpt) (o0 []string, err error) {
+func (c implAllocatorClientStub) List(ctx *context.T, opts ...rpc.CallOpt) (o0 []Instance, err error) {
 	err = v23.GetClient(ctx).Call(ctx, c.name, "List", nil, []interface{}{&o0}, opts...)
 	return
 }
@@ -64,12 +225,12 @@
 // implements for Allocator.
 type AllocatorServerMethods interface {
 	// Create creates a new instance of the service.
-	// It returns the object name of the new instance.
-	Create(*context.T, rpc.ServerCall) (name string, _ error)
-	// Destroy destroys the instance with the given name.
-	Destroy(_ *context.T, _ rpc.ServerCall, name string) error
+	// It returns a handle for the new instance.
+	Create(*context.T, rpc.ServerCall) (handle string, _ error)
+	// Destroy destroys the instance with the given handle.
+	Destroy(_ *context.T, _ rpc.ServerCall, handle string) error
 	// List returns a list of all the instances owned by the caller.
-	List(*context.T, rpc.ServerCall) (names []string, _ error)
+	List(*context.T, rpc.ServerCall) (instances []Instance, _ error)
 }
 
 // AllocatorServerStubMethods is the server interface containing
@@ -115,7 +276,7 @@
 	return s.impl.Destroy(ctx, call, i0)
 }
 
-func (s implAllocatorServerStub) List(ctx *context.T, call rpc.ServerCall) ([]string, error) {
+func (s implAllocatorServerStub) List(ctx *context.T, call rpc.ServerCall) ([]Instance, error) {
 	return s.impl.List(ctx, call)
 }
 
@@ -137,28 +298,35 @@
 	Methods: []rpc.MethodDesc{
 		{
 			Name: "Create",
-			Doc:  "// Create creates a new instance of the service.\n// It returns the object name of the new instance.",
+			Doc:  "// Create creates a new instance of the service.\n// It returns a handle for the new instance.",
 			OutArgs: []rpc.ArgDesc{
-				{"name", ``}, // string
+				{"handle", ``}, // string
 			},
 		},
 		{
 			Name: "Destroy",
-			Doc:  "// Destroy destroys the instance with the given name.",
+			Doc:  "// Destroy destroys the instance with the given handle.",
 			InArgs: []rpc.ArgDesc{
-				{"name", ``}, // string
+				{"handle", ``}, // string
 			},
 		},
 		{
 			Name: "List",
 			Doc:  "// List returns a list of all the instances owned by the caller.",
 			OutArgs: []rpc.ArgDesc{
-				{"names", ``}, // []string
+				{"instances", ``}, // []Instance
 			},
 		},
 	},
 }
 
+// Hold type definitions in package-level variables, for better performance.
+var (
+	__VDLType_struct_1 *vdl.Type
+	__VDLType_list_2   *vdl.Type
+	__VDLType_struct_3 *vdl.Type
+)
+
 var __VDLInitCalled bool
 
 // __VDLInit performs vdl initialization.  It is safe to call multiple times.
@@ -180,5 +348,13 @@
 	}
 	__VDLInitCalled = true
 
+	// Register types.
+	vdl.Register((*Instance)(nil))
+
+	// Initialize type definitions.
+	__VDLType_struct_1 = vdl.TypeOf((*Instance)(nil)).Elem()
+	__VDLType_list_2 = vdl.TypeOf((*[]string)(nil))
+	__VDLType_struct_3 = vdl.TypeOf((*vdltime.Time)(nil)).Elem()
+
 	return struct{}{}
 }
diff --git a/services/allocator/allocator/doc.go b/services/allocator/allocator/doc.go
index 951c5f7..0b5e380 100644
--- a/services/allocator/allocator/doc.go
+++ b/services/allocator/allocator/doc.go
@@ -110,6 +110,9 @@
    allocator list [flags]
 
 The allocator list flags are:
+ -l=false
+   Show details about each instance.
+
  -allocator=syncbase-allocator
    The name or address of the allocator server.
 
diff --git a/services/allocator/allocator/main.go b/services/allocator/allocator/main.go
index f8e3bde..8686172 100644
--- a/services/allocator/allocator/main.go
+++ b/services/allocator/allocator/main.go
@@ -9,6 +9,7 @@
 
 import (
 	"fmt"
+	"text/template"
 
 	"v.io/v23/context"
 	"v.io/x/lib/cmdline"
@@ -20,7 +21,8 @@
 const defaultExtension = "allocator"
 
 var (
-	flagAllocator string
+	flagAllocator   string
+	flagListDetails bool
 
 	cmdRoot = &cmdline.Command{
 		Name:  "allocator",
@@ -34,8 +36,19 @@
 	}
 )
 
+const listDetailsEntry = `Handle: {{.Handle}}
+Created: {{.CreationTime}}
+MountName: {{.MountName}}
+BlessingPatterns: {{.BlessingNames}}
+`
+
+var listTmpl *template.Template
+
 func main() {
+	listTmpl = template.Must(template.New("list").Parse(listDetailsEntry))
+
 	cmdRoot.Flags.StringVar(&flagAllocator, "allocator", "syncbase-allocator", "The name or address of the allocator server.")
+	cmdList.Flags.BoolVar(&flagListDetails, "l", false, "Show details about each instance.")
 	cmdline.HideGlobalFlagsExcept()
 	cmdline.Main(cmdRoot)
 }
@@ -87,15 +100,25 @@
 }
 
 func runList(ctx *context.T, env *cmdline.Env, args []string) error {
-	names, err := allocator.AllocatorClient(flagAllocator).List(ctx)
+	instances, err := allocator.AllocatorClient(flagAllocator).List(ctx)
 	if err != nil {
 		return err
 	}
-	if len(names) == 0 {
+	if len(instances) == 0 {
 		fmt.Fprintln(env.Stderr, "No results")
 	}
-	for _, n := range names {
-		fmt.Fprintln(env.Stdout, n)
+	firstEntry := true
+	for _, instance := range instances {
+		if flagListDetails {
+			if firstEntry {
+				firstEntry = false
+			} else {
+				fmt.Fprintln(env.Stdout)
+			}
+			listTmpl.Execute(env.Stdout, instance)
+		} else {
+			fmt.Fprintln(env.Stdout, instance.Handle)
+		}
 	}
 	return nil
 }
diff --git a/services/allocator/allocatord/assets/assets.go b/services/allocator/allocatord/assets/assets.go
index cdbde6c..c444a50 100644
--- a/services/allocator/allocatord/assets/assets.go
+++ b/services/allocator/allocatord/assets/assets.go
@@ -104,7 +104,7 @@
 	return a, nil
 }
 
-var _dashJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x94\x57\xdd\x53\xdb\x38\x10\x7f\xe7\xaf\xd8\xb6\xdc\xd8\xb9\x0b\x26\xa1\x0c\xed\x84\xe9\x74\x20\x70\x25\x73\xe5\xa3\x24\xf4\x1e\x18\xa6\x23\x2c\x25\x56\x2b\xcb\xae\x24\x03\xe9\x4d\xfe\xf7\x5b\xf9\x53\x26\x0e\x37\xc7\x83\x89\x77\xf7\xb7\xbb\xda\x2f\xad\x77\x77\x61\x9c\xa4\x4b\xc5\x17\x91\x81\xbd\xc1\xf0\x00\x66\x11\x83\xaf\x44\x12\xca\xb3\x18\x8e\x32\x13\x25\x4a\x07\x70\x24\x04\xe4\x42\x1a\x14\xd3\x4c\x3d\x30\x1a\x6c\x21\xf8\x46\x33\x48\xe6\x60\x22\xae\x41\x27\x99\x0a\x19\x84\x09\x65\x80\xaf\x8b\xe4\x81\x29\xc9\x28\xdc\x2f\x81\xc0\xf1\xf4\x64\x47\x9b\xa5\x60\x16\x25\x78\xc8\x24\x22\x4d\x44\x0c\x84\x44\xc2\x3d\x83\x79\x92\x49\x0a\x5c\x22\x91\xc1\xe7\xc9\xf8\xf4\x62\x7a\x0a\x73\x2e\x58\xb0\xb5\xf5\x40\x14\x50\xa2\x23\xf8\x00\xf3\x4c\x86\x86\x27\xd2\xef\xc1\x3f\x5b\x00\xa8\xec\x84\x18\x02\x99\x46\x43\x26\x81\x05\x93\x4c\x11\x83\x5e\x44\x44\x19\x1d\xa0\x88\x05\x8f\xcf\x8e\xae\x67\x53\x84\xdf\x22\x01\x72\xa4\xfd\x33\xdc\x08\x36\x02\xef\x33\x22\x64\xb8\x04\x3f\xd6\x3d\xaf\x5f\x32\x29\xea\xfd\x8b\x2d\x1b\x76\xcd\xe1\x14\x89\xa2\x24\xe6\xb4\x55\xbf\x53\xef\x97\xab\x29\xf8\x8a\xfd\xdc\xed\x54\xfb\x25\xd5\x6d\x95\x3f\x91\xf0\x92\xba\xf1\xd5\x0d\x06\x9c\x2c\x18\xf8\xbf\x75\x29\x9c\x2e\x35\x8a\xe4\x12\x57\xa1\x69\xeb\x0e\xd3\x6c\x27\xb3\x9c\x9d\x14\x59\x2f\x59\x39\x67\x71\xa2\x96\x95\xa1\x4f\xc7\x1b\x2c\xa1\x58\x2e\x72\xbc\x34\xec\xd9\x39\x62\x16\x97\xb6\xee\x5b\x4c\x1d\x12\x6b\x61\xb8\x3b\x1c\xec\xed\x37\x8f\x97\x9c\x39\xe1\xfa\xc7\x7f\xba\x62\x85\x36\xf9\x42\x91\xf7\xff\x9d\xc1\xe7\xdd\xe1\x56\x59\x3c\x27\x37\xd7\x47\xb3\xc9\xe5\xc5\xf4\xdb\xec\xf2\xdb\xf4\x74\x7c\x79\x71\x62\x4b\xa9\x70\xd5\x1b\x46\xde\x08\xde\x1e\x0c\x06\x85\x62\x6f\xaf\x7a\x87\xdf\x61\xaf\xa4\xed\x3b\xb4\xfd\x92\x76\xe0\xd0\x0e\x4a\xda\xd0\x05\x0f\x2b\xf4\x90\x3a\x1a\x2b\xf8\xbb\x16\x11\x1f\xef\x90\xbe\xaa\x7d\xce\x0b\xfe\xdb\xdf\x93\x93\xd9\x19\xba\xfa\x6e\x30\x38\x6c\x31\xce\x4e\x27\x9f\xce\x66\xc8\xd9\x7b\xfb\x8c\x33\xbe\xfc\x7c\x79\x8d\x0c\xef\xcd\x60\xf0\xfe\xed\xfb\x3f\xbd\x5a\x25\xcd\xb0\xb1\xb0\xf3\x26\x72\xca\xc2\x44\x52\x8d\x52\xd6\x81\x0a\x1f\x63\x03\x1b\x46\x2f\x48\xcc\x2c\xbe\x00\x56\xed\x0a\xec\xc9\x28\x12\x9a\x2b\xa2\x90\x6f\x98\xd2\x65\x03\x17\xd8\xed\x4c\x09\x04\x6d\x07\xf8\xdf\xef\x1d\xe6\xf4\xb6\x3e\x2b\x11\xa4\x16\xed\x7b\xd2\x2b\x45\x14\x33\x99\x92\x2d\xc9\x57\x1f\x3e\x00\x0e\x12\x36\xe7\x38\x7a\xac\xd4\x6a\xab\x18\x13\x53\x86\xb3\x2b\x4b\x21\x22\x92\x0a\xb4\x8f\x03\x47\xd9\x29\x21\x17\x5c\x2e\xea\xc3\x05\xae\xcf\x1a\xd5\xa7\x27\x25\x67\x9c\x48\xa3\x12\x81\xd0\xda\xf3\x6d\xdf\x7b\x53\x01\xb5\xd7\x0b\xc2\x88\x0b\xaa\x18\xce\xa6\x20\xc4\x11\xf7\xc3\x7f\x36\xac\xec\x1f\x7a\x82\x31\xc0\xd9\x57\x01\x41\x90\x7b\x26\x00\xbd\xb2\xf6\xd6\xa3\x1c\x54\x15\xdf\x11\xfe\xae\xca\xbc\xdd\xf6\xed\x34\xee\x05\x06\x43\xee\xf7\xee\x0e\x4b\x7c\x96\x62\xcf\x30\x1b\xdc\xc6\x93\x9b\x9c\x06\x37\x93\xca\x08\x9e\x28\xa8\x0c\xed\x70\xc3\xe2\x40\x33\xc1\x42\x0c\x2e\x1e\xcf\x24\x8b\x85\x60\x63\x41\xb4\xf6\xbd\x86\x7e\x58\x63\x4b\xbb\x2f\x89\xad\x7a\x6e\x4e\x3e\xd9\x9c\xd8\x56\xce\x8f\x5f\x78\xa8\x9d\xd1\x5d\x67\xa2\x72\xde\x09\xbc\x48\xf0\x8a\x92\x8b\x9d\x3c\x7c\xe8\x9d\x8e\x92\xc7\xaa\x74\x6c\x49\xe5\xb5\xa2\xeb\x3e\x05\x90\x23\xb7\x50\xea\x41\x32\x5a\x8f\x6c\xe1\xe9\x61\x6d\x8a\x29\x95\xa8\x9d\x58\x2f\xd0\x4c\xc4\x29\xab\xcc\x6c\x07\xe4\x3b\x79\xc2\x43\x1a\x62\xf4\x47\x0f\xfe\x40\x4a\x51\xa2\x85\xf1\x5e\xaf\x34\x02\x10\xd0\x44\xb2\xa6\x1e\xec\x99\x9b\x9a\x68\xd2\x33\xce\x8f\x5e\xb0\x0f\x6b\xee\xca\xd1\x33\x27\x5c\x38\x75\xe5\xaa\x78\xee\xaa\x1b\x91\xe7\x6a\xc2\x24\x4e\x05\xf6\x61\x57\x89\x6e\x8a\xb0\x7b\xf4\xf5\x5c\xde\x94\xd9\x23\xb8\x29\x6c\xcc\xa0\x7b\xbe\xd2\x5e\x71\x35\x07\xd8\x8d\xa7\x24\x8c\x1a\x7f\x72\x1d\x8d\x53\x36\xa5\x21\x66\x53\xb2\x47\xc7\xcd\x45\x92\x60\xad\x05\x0f\x5c\x67\x44\xf0\x5f\x45\x0b\x1f\x29\x46\x72\x43\x3e\x4d\xc2\x2c\x66\xd2\x04\x0b\x66\x4e\x05\xb3\x3f\x8f\x97\x13\x5a\xe8\x0e\x38\xed\xd5\xa7\xb1\xea\x93\x34\x6f\x64\xa7\x64\xea\x7b\xa8\x00\xe4\x2f\xfd\x36\x6f\x86\x5d\x36\xb5\x7b\xcd\xa8\x15\xbf\x39\x4e\x8b\x29\xff\x65\x2f\x98\xfd\x06\xb1\x6a\x7e\x3e\x72\x6a\xa2\x91\x3b\xa7\x1b\x5e\xc4\xec\xa6\x35\x6a\xcd\xea\x86\x2b\x18\x2e\x39\xb4\x6d\x2e\x4d\x34\xb7\xce\xe3\x85\x27\xb1\xd0\xbc\x2e\x8b\xb8\xb5\x71\xa6\xdb\xb8\x41\xfb\x15\x70\x79\x13\x89\x1a\xb9\x77\x81\xc3\x5e\x75\xa9\x7d\x38\x7a\xe2\x56\x6b\xcc\xe5\x57\x22\x32\x3c\xf1\xc0\xe1\x46\x25\xd7\xd1\xd2\x08\x62\x2e\xed\xf6\xc6\xf2\x7a\x08\xce\xb9\x9c\x71\x9c\xe0\x78\xf3\x0d\x06\x83\x5e\xdf\x85\x90\xa7\x6e\x08\x79\xda\x04\x59\x28\x4e\x05\xde\x01\x7a\xfd\x84\x38\x03\x46\xb0\x33\xec\xb7\xc8\x99\xe4\x66\x4d\xd6\xee\x19\x4b\x4b\xc5\xea\x8c\x09\xa2\x6e\xbd\xf3\xf3\x73\xa0\xd4\xbb\x5b\xf5\x9f\x49\x46\xb8\xfd\xb6\x45\xa3\x51\x1c\x03\xf1\xfa\xe0\x45\xf8\x6f\x1d\x11\x73\x21\xb8\x2e\x46\x4e\x17\xf0\x6e\xd5\x02\xb4\xf0\x4e\x2a\xca\x5f\xab\xaa\x94\xc3\x80\x2a\xf2\xe8\x63\x91\xd8\xcd\x78\x46\xee\x45\x11\xad\xdb\xa2\x88\xcb\xcd\xe9\xae\x5f\x16\x75\xbe\x07\xf5\xfa\x55\xf5\x6f\x98\xd3\xc5\x56\xad\xa1\x56\x09\xc9\xfd\x77\x9c\xec\x30\x57\x49\x9c\xaf\xec\x0b\xfe\xc0\x24\x16\x22\x97\xcf\x3a\xbf\xe5\x48\xc1\xef\x17\xdb\x97\xbb\x01\x50\x03\x45\x77\x77\xf7\x74\xa3\xa1\x74\x90\x9a\x80\x50\x3a\x4e\x44\x16\x4b\xdf\xb3\xb3\xc5\x60\x25\xd8\x60\x7b\x9d\x12\x32\x8b\xef\x99\x72\xf9\x7c\x0e\xa5\x3b\xcd\x94\x29\x30\xd7\xc9\xa3\x2e\x59\x41\x4c\xd2\x66\x26\xa5\xc6\x9d\x92\xe5\xf6\x71\xdb\xca\x52\x5d\xa0\xa9\x09\x6c\x6d\xe2\xdd\x10\xa7\x5d\x05\x5a\x6e\xa0\xf0\x11\x50\x32\xaf\x6e\x94\x2a\x48\xa3\x9a\x54\xcb\xd7\xd7\xf8\xaa\x9a\x59\x2b\x60\x02\xd7\x88\x35\xcf\xfd\xdb\xda\x05\xcc\xea\xe0\xae\x12\x77\x17\x26\x6a\xea\xec\xd6\x69\xe2\xd8\x00\xf5\x25\x60\x63\xf3\xaa\x63\x65\x6b\x8e\x8f\x7e\xe2\x80\xf5\x5e\xcb\xd7\xf6\x5b\x0f\xbf\x71\x32\xae\xf0\x13\xcc\x2e\x55\x5c\xe2\xa1\x25\x7e\x09\x96\xd7\x2d\x48\xc4\x37\x7b\x42\xe1\x83\xe3\xd4\x76\xd7\x25\xb4\x71\xf7\x5a\xdf\x67\x8a\xf7\x66\x9d\x61\xf8\xdd\xb9\xb4\x63\x26\x33\x2c\x68\xd4\x4d\xd0\x17\xf5\x40\x84\x5f\x20\xfb\x80\xbb\x2b\xe6\x64\xad\xde\xcb\x18\x95\x81\xc0\xa8\x8c\xf2\x67\xb1\x5e\xaf\xac\xc1\x7f\x03\x00\x00\xff\xff\x1d\x60\x87\x6b\x35\x0f\x00\x00")
+var _dashJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x94\x57\x5f\x53\xdb\xba\x12\x7f\xe7\x53\x6c\x5b\xee\xd8\xb9\x37\x98\x84\x32\xb4\x13\xa6\xd3\x81\xc0\x2d\x99\x53\x0a\x25\xa1\xe7\x81\x61\x3a\xc2\x52\x62\xb5\xb2\x94\x4a\x32\x90\x9e\xc9\x77\x3f\x2b\xff\x95\x89\xe1\xcc\xe1\x21\xd8\xbb\xfb\xdb\xfd\x69\xb5\x5a\xad\x77\x77\x61\xac\x96\x2b\xcd\x17\x89\x85\xbd\xc1\xf0\x00\x66\x09\x83\x6f\x44\x12\xca\xb3\x14\x8e\x32\x9b\x28\x6d\x22\x38\x12\x02\x72\x23\x03\x9a\x19\xa6\xef\x19\x8d\xb6\x10\x7c\x6d\x18\xa8\x39\xd8\x84\x1b\x30\x2a\xd3\x31\x83\x58\x51\x06\xf8\xba\x50\xf7\x4c\x4b\x46\xe1\x6e\x05\x04\x8e\xa7\x27\x3b\xc6\xae\x04\x73\x28\xc1\x63\x26\x11\x69\x13\x62\x21\x26\x12\xee\x18\xcc\x55\x26\x29\x70\x89\x42\x06\x9f\x27\xe3\xd3\x2f\xd3\x53\x98\x73\xc1\xa2\xad\xad\x7b\xa2\x81\x12\x93\xc0\x07\x98\x67\x32\xb6\x5c\xc9\xb0\x07\x7f\x6d\x01\xa0\xb3\x13\x62\x09\x64\x06\x03\x59\x05\x0b\x26\x99\x26\x16\x59\x24\x44\x5b\x13\xa1\x89\x03\x8f\xcf\x8e\xae\x66\x53\x84\xdf\xa0\x00\x72\xa4\xfb\xb3\xdc\x0a\x36\x82\xe0\x33\x22\x64\xbc\x82\x30\x35\xbd\xa0\x5f\x2a\x29\xfa\xfd\x83\xad\x1a\x75\xad\xe1\x14\x85\xa2\x14\xe6\xb2\x75\xbf\xd3\xef\xd7\xcb\x29\x84\x9a\xfd\xda\xed\x74\xfb\x75\x69\xda\x2e\x7f\xa1\xe0\x25\x77\xe3\xcb\x6b\x4c\x38\x59\x30\x08\xff\xd3\xe5\x70\xba\x32\x68\x92\x5b\x5c\xc6\xb6\xed\x3b\x5e\x66\x3b\x99\xd3\xec\x2c\x51\xf5\x52\x94\x73\x96\x2a\xbd\xaa\x02\x7d\x3a\x7e\x26\x12\x9a\xe5\x26\xc7\x2b\xcb\x9e\xac\x23\x65\x69\x19\xeb\xae\xa5\x34\x31\x71\x11\x86\xbb\xc3\xc1\xde\x7e\xf3\xf3\x12\x99\x13\x6e\x7e\xfe\x23\x15\x67\xf4\x1c\x17\x8a\xba\x7f\x4f\x06\x7f\x6f\x0f\xb7\xca\xe2\x39\xb9\xbe\x3a\x9a\x4d\x2e\xbe\x4c\xbf\xcf\x2e\xbe\x4f\x4f\xc7\x17\x5f\x4e\x5c\x29\x15\x54\x83\x61\x12\x8c\xe0\xed\xc1\x60\x50\x38\x0e\xf6\xaa\x77\xf8\x2f\xec\x95\xb2\x7d\x4f\xb6\x5f\xca\x0e\x3c\xd9\x41\x29\x1b\xfa\xe0\x61\x85\x1e\x52\xcf\x63\x05\x7f\xd7\x12\xe2\xcf\x3b\x94\xaf\x6b\xce\x79\xc1\x7f\xff\x73\x72\x32\x3b\x43\xaa\xef\x06\x83\xc3\x96\xe2\xec\x74\xf2\xe9\x6c\x86\x9a\xbd\xb7\x4f\x34\xe3\x8b\xcf\x17\x57\xa8\x08\xde\x0c\x06\xef\xdf\xbe\xff\x7f\x50\xbb\xa4\x19\x1e\x2c\x3c\x79\x13\x39\x65\xb1\x92\xd4\xa0\x95\x23\x50\xe1\xb9\x34\x96\x48\x6c\x00\x08\x2e\x50\xd5\x59\x05\xf6\x68\x35\x89\xed\x25\xd1\x24\x65\x96\x69\x53\x9e\xde\x02\xb8\x9d\x69\x81\xa0\xed\x08\xff\x87\xbd\xc3\x5c\xee\x39\x73\xea\x68\xe9\xa0\x61\x50\x89\x83\xd2\x4c\x33\x9b\x69\xd9\x58\xbf\xfa\xf0\x01\xb0\x8d\xb0\x39\xc7\xc6\xe3\x4c\xd6\x5b\x45\x93\x98\x32\xec\x5c\xd9\x12\x12\x22\xa9\x40\x02\xd8\x6e\xb4\xeb\x11\x72\xc1\xe5\xa2\x5e\x5a\xe4\x93\x36\xe8\x7b\x79\x52\x6a\xc6\x4a\x5a\xad\x04\x42\x6b\xea\xdb\x61\xf0\xa6\x02\x9a\xa0\x17\xc5\x09\x17\x54\x33\xec\x4c\x51\x8c\x0d\xee\x67\xf8\xa4\x55\xb9\x3f\x64\x82\x49\xc0\xce\x57\x01\x41\x90\x3b\x26\x00\x59\xb9\x78\x9b\x39\x8e\xaa\x7a\xef\x48\x7e\x57\x5d\xde\x6c\x87\xae\x17\xf7\x22\x8b\x39\x0f\x7b\xb7\x87\x25\x3e\x5b\xe2\x89\x61\x2e\xbb\x0d\x93\xeb\x5c\x06\xd7\x93\x2a\x08\xae\x28\xaa\x02\xed\x70\xcb\xd2\xc8\x30\xc1\x62\xcb\x28\x2e\xcf\xaa\xc5\x42\xb0\xb1\x20\xc6\x84\x41\x23\x3f\xac\xb1\x65\xdc\x97\xcc\xd6\x3d\x7f\x4f\x3e\xb9\x3d\x71\x07\x39\x5f\x7e\xc1\xd0\x78\x8d\xbb\xde\x89\x8a\xbc\x97\x78\xa1\xf0\x82\x92\x8b\x9d\x3c\x7d\xc8\xce\x24\xea\xa1\xaa\x1d\x57\x53\x79\xbd\x98\xfa\x94\x36\x05\x35\xaa\x9f\xea\x56\x32\xda\xcc\x6e\xc1\xf6\xb0\x0e\xc7\xb4\x56\x7a\x27\x35\x0b\x0c\x95\x70\xca\xaa\x50\xdb\x11\xf9\x41\x1e\x71\xa1\x96\x58\xf3\x31\x80\xff\xa1\xa4\x28\xd5\x82\x40\xaf\x57\x06\x01\x88\xa8\x92\xac\xa9\x09\xb7\xee\xa6\x2e\x9a\x2d\x1a\xe7\xcb\x2f\xd4\x87\xb5\x76\xed\xf9\x99\x13\x2e\xbc\xda\xf2\x5d\x3c\xa5\xea\x67\xe5\xa9\x9b\x58\xa5\x4b\x81\x87\xb1\xab\x4c\x9f\xcb\xb2\xbf\xf4\xcd\xfd\xbc\x2e\x77\x90\xe0\xac\xf0\xec\x2e\xfa\xeb\x2b\xe3\x15\x97\x73\x84\x27\xf2\x94\xc4\x49\xc3\x27\xf7\xd1\x90\x72\xdb\x1a\xe3\x8e\x4a\xf6\xe0\xd1\x5c\x28\x85\xf5\x16\xdd\x73\x93\x11\xc1\x7f\x17\xc7\xf8\x48\x33\x92\x07\x0a\xa9\x8a\xb3\x94\x49\x1b\x2d\x98\x3d\x15\xcc\x3d\x1e\xaf\x26\xb4\xf0\x1d\x71\xda\xab\x57\xe3\xdc\xab\x65\x7e\x98\xbd\xb2\xa9\x6f\xa2\x02\x90\xbf\xf4\xdb\xba\x19\x9e\xb4\xa9\x9b\x6c\x46\xad\xfc\xcd\xb1\x63\x4c\xf9\x6f\x77\xc5\xec\x37\x88\x75\xf3\xf8\xc0\xa9\x4d\x46\x7e\xa7\x6e\x74\x09\x73\xb3\xd6\xa8\xd5\xad\x1b\xad\x60\x38\xe6\xd0\x76\xb8\xa5\x32\xdc\x91\xc7\x2b\x4f\x62\xa1\x05\x5d\x11\x71\x6e\xe3\xcc\xb4\x71\x83\xf6\x2b\xe0\xf8\x26\x94\x1e\xf9\xb7\x81\xa7\x5e\x77\xb9\xbd\x3f\x7a\xe4\xce\x6b\xca\xe5\x37\x22\x32\x5c\xf1\xc0\xd3\x26\xa5\xd6\xf3\xd2\x18\xe2\x5e\xba\xf9\x8d\xe5\xf5\x10\x9d\x73\x39\xe3\x29\x73\x77\xdf\x60\x30\xe8\xf5\x7d\x08\x79\xec\x86\x90\xc7\xe7\x20\x0b\xcd\xa9\xc0\x7b\xc0\x6c\xae\x30\x93\x98\xdb\x9d\x61\xbf\x25\xce\x24\xb7\x1b\xb6\x6e\xd2\x58\x39\x29\x56\x67\x4a\x10\x75\x13\x9c\x9f\x9f\x03\xa5\xc1\xed\xba\xff\xc4\x32\xc1\xf9\xb7\x6d\x9a\x8c\xd2\x14\x48\xd0\x87\x20\xc1\x7f\x9b\x88\x94\x0b\xc1\x4d\xd1\x72\xba\x80\xb7\xeb\x16\xa0\x85\xf7\xb6\xa2\x7c\x5a\x57\xa5\x1c\x47\x54\x93\x87\x10\x8b\xc4\xcd\xc6\x33\x72\x27\x8a\x6c\xdd\x14\x45\x5c\xce\x4e\xb7\xfd\xb2\xa8\xf3\x49\xa8\xd7\xaf\xaa\xff\x99\x5e\x5d\xcc\xd5\x06\x6a\x97\xa0\xee\x7e\x60\x77\x87\xb9\x56\x69\x3e\xb4\x2f\xf8\x3d\x93\x58\x88\x5c\x3e\x39\xf9\x2d\x22\x85\xbe\x5f\xcc\x5f\xfe\x18\x40\x2d\x14\xa7\xbb\xfb\x4c\x37\x1e\x4a\x82\xd4\x46\x84\xd2\xb1\x12\x59\x2a\xc3\xc0\xf5\x16\x8b\x95\xe0\x92\x1d\x74\x5a\xc8\x2c\xbd\x63\xda\xd7\xf3\x39\x94\x74\x9a\x2e\x53\x60\xae\xd4\x83\x29\x55\x51\x4a\x96\x4d\x4f\x5a\x5a\xbf\x4b\x96\xe3\xc7\x4d\x6b\x97\xea\x02\x5d\xda\xc8\xd5\x26\xde\x0d\xe9\xb2\xab\x40\xcb\x19\x14\x3e\x02\x5a\xe6\xd5\x8d\x56\x85\x68\x54\x8b\x6a\xfb\xfa\x2a\x5f\x57\x3d\x6b\x0d\x4c\xe0\x28\xb1\xc1\x3c\xbc\xa9\x29\xe0\xae\x0e\x6e\x2b\x73\x7f\x62\xa2\xb6\xde\xdd\x7a\x9b\x38\x1e\x80\xfa\x12\x70\xb9\x79\xd5\x31\xb7\x35\xcb\x47\x9e\xd8\x60\x83\xd7\xf2\xb5\xfb\xda\xc3\xaf\x9c\x8c\x6b\xfc\x08\x73\x83\x55\x3d\x8f\xa5\xee\xa8\xa1\x50\x22\xbe\x99\x15\x0a\x0e\x1e\xa9\xed\xae\x4b\xe8\xd9\xf9\x6b\x73\xa6\x29\xde\x9b\x91\x86\xe1\x97\xe7\xca\xb5\x99\xcc\xb2\xa8\x71\x37\x41\x2e\xfa\x9e\x88\xb0\x40\xf6\x01\xa7\x57\xdc\x93\x8d\x7a\x2f\x73\x54\x26\x02\xb3\x32\xca\x7f\x8b\x01\x7b\xed\x02\xfe\x1d\x00\x00\xff\xff\x2e\x60\xcc\x2a\x37\x0f\x00\x00")
 
 func dashJsBytes() ([]byte, error) {
 	return bindataRead(
@@ -124,7 +124,7 @@
 	return a, nil
 }
 
-var _dashboardTmplHtml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xcc\x56\x4d\x4f\x1b\x3d\x10\xbe\xf3\x2b\xfc\xee\x65\x79\x45\xd6\x4e\x80\xb6\x52\xba\x49\x55\x01\xad\x90\x10\xa0\xd2\x4b\x55\xf5\xe0\xd8\x93\xac\x13\xef\x7a\xb1\x67\x03\x2b\xca\x7f\xaf\xf7\x23\x21\x81\x10\x11\xa9\x87\x2a\x87\x8c\xc7\xcf\x3c\xf3\xed\x24\xfe\xef\xf4\xea\xe4\xfb\x8f\xeb\x33\x92\x60\xaa\x87\x7b\x71\xf3\x45\x48\x9c\x00\x97\x95\xe0\x45\x54\xa8\x61\xf8\xf0\x40\x6f\xc0\xce\xc1\x5e\xf2\x14\x1e\x1f\xc9\x29\x77\xc9\xc8\x70\x2b\x63\xd6\x00\xf6\x1a\xb4\x56\xd9\x8c\x24\x16\xc6\x83\x90\xb1\xb1\xc9\xd0\xd1\x89\x31\x13\x0d\x3c\x57\x8e\x0a\x93\x32\xe1\xdc\xa7\x31\x4f\x95\x2e\x07\x37\xa6\xb0\x02\x0e\x4e\x8c\x84\x83\x6b\x6b\xfa\xc7\xdd\x6e\xe7\x5d\xb7\xfb\xfb\x9b\x19\x19\x34\x7d\x2f\x76\xbc\x4a\x21\xd7\x4a\x74\x8e\x9a\xcb\xa7\x53\x2b\x79\x44\x58\xfb\x26\xc4\x82\x1e\x84\x0e\x4b\x0d\x2e\x01\xc0\x85\x1a\xcb\x1c\x06\x21\xc2\x3d\x56\xce\xc3\x36\x2f\x27\xac\xca\x91\x38\x2b\x06\x41\x82\x98\xbb\x3e\x63\x7c\xca\xef\x9f\xc7\x5b\xe9\x98\x56\x23\xc7\xa6\xb7\x05\xd8\x92\x1d\x52\xff\x69\x0f\x34\x55\x19\x9d\xba\x60\x18\xb3\x86\x6f\x0b\xb9\x90\xd9\xd4\x53\x6a\x53\xc8\xb1\xe6\x16\x36\xb2\x47\x85\xd5\x51\xce\xad\x03\xeb\x1d\x1d\xd1\x1e\xcb\xbd\xe6\xef\xbb\x11\xc6\xcc\x14\xb0\x1e\x3d\xf6\x2e\xda\x5c\x1a\xdd\x6b\xbe\x9e\x3a\x1b\x38\xe4\xa8\x04\xab\x2b\x4d\x7d\x49\x83\xba\xf2\xc1\x53\xe5\x83\x0d\xf1\xb5\x46\xd2\x0f\xce\x96\x54\xea\x5e\x05\x75\xaf\xa6\x7c\xce\x1b\x6d\xb0\x9e\xe1\xdd\xdd\x1d\x9d\x34\x74\xcd\x44\x25\xdc\xa2\x63\xda\x70\x09\x76\x67\xee\x61\x3b\x25\x4d\xdb\x69\x43\x46\x2b\xb2\xfd\x50\x14\xd6\x42\x86\x61\x87\x3c\xe4\x5c\xcc\xf8\x04\x5c\x9f\xfc\x0c\x85\xb1\x50\xe3\xc2\x5f\x8f\xff\x7f\xdc\x68\xef\x00\xaf\xb2\x0b\x4f\x72\xc2\xb5\x1e\x79\xdb\xfd\x3a\x71\x95\x29\x6c\x2d\x56\x63\x8c\xd9\x62\xe1\xe2\x91\x91\x65\x1b\xb6\x54\x73\xa2\xe4\x20\x10\x7e\x8d\xb8\xca\xc0\x2e\x63\x5d\x5e\x55\x66\x2b\xfa\x95\x9b\x7a\x2b\x83\x6d\x7b\xeb\x91\xeb\x76\x15\xf8\x3c\xf3\x85\xcd\x84\x87\x6e\x00\xd4\xc4\x90\x72\xa5\x6b\xe2\xb3\x4a\x7a\x06\x5c\x3f\x2c\x33\xa8\x8b\xf2\x3c\x4c\xa1\xb9\x73\xed\x65\x50\xe3\x34\x47\xc8\x44\x59\x35\xf0\xa5\xf3\x97\xf0\xdb\xdc\xbd\x15\x2a\xf2\x22\x2a\x9c\x6f\x60\x94\x0b\x7c\xab\x51\x0a\x69\x6b\x34\x2a\x11\xde\xec\x4b\x2a\x37\xdb\xcd\x8e\x8c\x95\xd6\x55\x1f\xff\x15\xe0\xca\x61\x55\x5c\xf4\x53\x16\xd6\x6f\x9f\xc9\x5c\xb4\x65\x36\xab\x15\x52\xd9\x24\xd2\x7c\x04\x7e\x60\x2e\xae\x3e\x9f\x9e\x5f\x7e\xa5\x94\x6e\x9e\x91\x25\xe7\x2b\x63\xb2\xb8\x8f\x14\x42\x4a\x1c\x68\x10\x08\x32\x18\xf6\x92\x2d\x29\xae\x19\x05\xc3\xc3\x1d\xb0\xc7\x3b\x60\xdf\xef\x80\xed\xed\x12\x44\x6f\xd3\x9e\xbe\x82\xfd\x20\x77\x69\x21\x58\x6b\x6c\x94\xba\xc9\xb2\xdc\x5f\xfc\x36\x83\x24\x68\xfc\x6b\x8e\x56\xc1\x1c\x88\xe4\xc8\x29\xb9\xf6\xbf\x86\x0e\x08\xda\x92\xf0\x89\x6f\x36\xa9\xd6\xd4\xd2\x75\xea\x98\x35\x2f\x97\x7f\xca\xea\x3f\x11\x7f\x02\x00\x00\xff\xff\x2f\xfc\x99\xc7\x5c\x08\x00\x00")
+var _dashboardTmplHtml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xcc\x56\x4f\x4f\x1b\x39\x14\xbf\xf3\x29\xbc\x73\x19\x56\x64\xec\x04\xd8\x5d\x29\x3b\x49\x55\x01\xad\x90\x10\xa0\xd2\x4b\x55\xf5\xe0\xd8\x2f\x19\x27\x9e\xf1\x60\xbf\x09\x8c\x28\xdf\xbd\x9e\x3f\x09\x09\x24\x11\x91\x7a\xa8\x72\xc8\xf3\xf3\xef\xfd\xde\x7f\x27\xf1\x5f\xe7\x37\x67\x5f\xbf\xdd\x5e\x90\x04\x53\x3d\x3c\x88\x9b\x2f\x42\xe2\x04\xb8\xac\x04\x2f\xa2\x42\x0d\xc3\xa7\x27\x7a\x07\x76\x0e\xf6\x9a\xa7\xf0\xfc\x4c\xce\xb9\x4b\x46\x86\x5b\x19\xb3\x06\x70\xd0\xa0\xb5\xca\x66\x24\xb1\x30\x1e\x84\x8c\x8d\x4d\x86\x8e\x4e\x8c\x99\x68\xe0\xb9\x72\x54\x98\x94\x09\xe7\x3e\x8c\x79\xaa\x74\x39\xb8\x33\x85\x15\x70\x74\x66\x24\x1c\xdd\x5a\xd3\x3f\xed\x76\x3b\xff\x74\xbb\x3f\xbf\x98\x91\x41\xd3\xf7\x62\xc7\xab\x14\x72\xad\x44\xe7\xa4\xb9\x7c\x39\xb5\x92\x47\x84\xb5\x6f\x42\x2c\xe8\x41\xe8\xb0\xd4\xe0\x12\x00\x5c\xa8\xb1\xcc\x61\x10\x22\x3c\x62\xe5\x3c\x6c\xf3\x72\xc2\xaa\x1c\x89\xb3\x62\x10\x24\x88\xb9\xeb\x33\xc6\xa7\xfc\xf1\x75\xbc\x95\x8e\x69\x35\x72\x6c\x7a\x5f\x80\x2d\xd9\x31\xf5\x9f\xf6\x40\x53\x95\xd1\xa9\x0b\x86\x31\x6b\xf8\x76\x90\x0b\x99\x4d\x3d\xa5\x36\x85\x1c\x6b\x6e\x61\x23\x7b\x54\x58\x1d\xe5\xdc\x3a\xb0\xde\xd1\x09\xed\xb1\xdc\x6b\x7e\xbf\x1b\x61\xcc\x4c\x01\xeb\xd1\x53\xef\xa2\xcd\xa5\xd1\x6d\xf3\xf5\xd2\xd9\xc0\x21\x47\x25\x58\x5d\x69\xea\x4b\x1a\xd4\x95\x0f\x5e\x2a\x1f\x6c\x88\xaf\x35\x92\x7e\x70\x76\xa4\x52\xf7\x2a\xa8\x7b\x35\xe5\x73\xde\x68\x83\xf5\x0c\x1f\x1e\x1e\xe8\xa4\xa1\x6b\x26\x2a\xe1\x16\x1d\xd3\x86\x4b\xb0\x7b\x73\x0f\xdb\x29\x69\xda\x4e\x1b\x32\x5a\x91\x1d\x86\xa2\xb0\x16\x32\x0c\x3b\xe4\x29\xe7\x62\xc6\x27\xe0\xfa\xe4\x7b\x28\x8c\x85\x1a\x17\xfe\x78\xfe\xfb\xff\x8d\xf6\x0e\xf0\x26\xbb\xf2\x24\x67\x5c\xeb\x91\xb7\x3d\xac\x13\x57\x99\xc2\xd6\x62\x35\xc6\x98\x2d\x16\x2e\x1e\x19\x59\xb6\x61\x4b\x35\x27\x4a\x0e\x02\xe1\xd7\x88\xab\x0c\xec\x32\xd6\xe5\x55\x65\xb6\xa2\x5f\xb9\xa9\xb7\x32\xf0\x7b\x5b\x0b\x64\xeb\xf6\x7a\xfc\xba\x75\xb5\xea\x97\x99\x2f\x6f\x26\x3c\x74\x03\xa0\xa6\x87\x94\x2b\x5d\xd1\xd3\x8b\x4a\x7a\x05\x5c\x3f\x2c\xf3\xa8\x4b\xf3\x3a\x58\xa1\xb9\x73\xed\x65\x50\xe3\x34\x47\xc8\x44\x59\xb5\xf1\xad\xf3\xb7\xf0\xfb\xdc\xbd\x17\x2a\xf2\x22\x2a\x9c\x6f\x63\x94\x0b\x7c\xaf\x51\x0a\x69\x6b\x34\x2a\x11\xde\xed\x4b\x2a\x37\xdb\xcf\x8e\x8c\x95\xd6\x55\x37\xff\x14\xe0\xca\x61\x55\x5c\xf4\x53\x16\xd6\xef\xa0\xc9\x5c\xb4\x63\x42\xab\x45\x52\xd9\x24\xd2\x7c\x04\x7e\x60\xae\x6e\x3e\x9e\x5f\x5e\x7f\xa6\x94\x6e\x9e\x91\x25\xe7\x96\x31\x59\xdc\x47\x0a\x21\x25\x0e\x34\x08\x04\x19\x0c\x7b\xc9\x8e\x14\xd7\x8c\x82\xe1\xf1\x1e\xd8\xd3\x3d\xb0\xff\xee\x81\xed\xed\x13\x44\x6f\xd3\x9e\x6e\xc1\xfe\x27\xf7\x69\x21\x58\x6b\x6c\x94\xba\xc9\xb2\xdc\x9f\xfc\x36\x83\x24\x68\xfc\x9b\x8e\x56\xc1\x1c\x88\xe4\xc8\x29\xb9\xf5\xbf\x89\x0e\x08\xda\x92\xf0\x89\x6f\x36\xa9\xd6\xd4\xd2\x75\xea\x98\x35\xef\x97\x7f\xd0\xea\xbf\x12\xbf\x02\x00\x00\xff\xff\x78\x46\x06\x18\x62\x08\x00\x00")
 
 func dashboardTmplHtmlBytes() ([]byte, error) {
 	return bindataRead(
@@ -204,7 +204,7 @@
 	return a, nil
 }
 
-var _homeTmplHtml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x57\xdd\x6e\xdb\x38\x13\xbd\xf7\x53\x4c\xf5\x05\xb0\xfc\xc5\xa2\x52\xf4\x2e\x91\x0d\x34\xdb\x02\x5b\xa0\xce\x16\x6d\xba\x40\xaf\x16\xb4\x44\x5b\x6c\x24\xd2\x4b\x52\x76\x05\x43\xef\xbe\x33\xfa\xb3\x95\xd8\xd9\x06\xdd\x02\xb5\x4d\xf2\xf0\xf0\xcc\x0f\x87\x93\xe8\x55\xa2\x63\x57\x6e\x04\xa4\x2e\xcf\xe6\xa3\xa8\xfb\x12\x3c\x99\x8f\x00\x22\x27\x5d\x26\xe6\x7f\x72\xc5\x13\x59\xe4\xb0\xdf\xd7\x13\xc0\xbe\x08\xb3\x15\xe6\x8e\xe7\xa2\xaa\xe0\x6d\x96\xe9\x98\x3b\x6d\xa2\xb0\xc1\xe3\x4e\x44\x8a\x7c\x93\x71\x27\xc0\x23\x36\x0f\x58\x55\x8d\xa2\xb0\x61\x8e\x5e\x05\x01\xdc\xfd\x71\xff\xfe\x1a\x76\x02\xc6\x4b\x6d\x8c\xde\x8d\x81\x43\xa6\x1d\xe8\x15\xb8\x54\x80\x75\x65\x26\xd5\x9a\x86\x32\x11\x0a\x99\xcb\x64\x0a\xa9\x50\xb1\xa0\xf5\x91\x15\x71\x61\x70\x32\x30\x82\x8e\x49\xc0\x09\x93\x4b\xa5\x33\xbd\x2e\x41\xaa\x9e\x43\x80\xc8\x44\x8e\x04\x76\x0a\x99\x7c\x10\x3d\x1b\x70\x95\x8c\x96\x99\xb0\x16\x8f\x61\x10\x04\xa8\x6b\xa9\x93\x12\xe2\x8c\x5b\x3b\xf3\x3a\xdc\xc6\xe8\x2d\xfe\x36\x41\xc6\x4b\x5d\x38\xe0\x9d\xb9\x89\x77\xca\x52\x61\x1a\x5b\xd1\x7b\x36\x36\x72\xe3\x08\x04\xb0\x2a\x54\xec\xa4\x56\x10\xa7\x5c\xad\xc5\xad\x53\xbe\x44\x7b\x94\xd8\xfd\x7e\xbf\xf8\x38\x81\x7d\x8d\x02\xc0\x80\x14\xa4\x96\xad\x85\x7b\xdf\x08\xbf\x2d\x3f\x24\x08\x9e\x30\xa9\x94\x30\x04\x87\x19\x78\xd1\x4a\x2b\x07\x31\xda\x6b\x66\xe3\xb5\xe1\xe5\x78\xee\x5d\xb6\x74\x97\x5e\x14\xd2\xf2\xdc\xbb\xa9\x69\x6b\x35\xe1\x41\x4e\x94\xc8\x6d\x67\x66\xce\xa5\xf2\x1a\x8d\x51\xfa\xba\x9b\xdd\xf0\xb5\x08\xea\xc0\xcd\x7f\x33\x82\x8c\x43\x6f\xc1\x02\x13\x61\x2d\xe0\x83\xb2\x8e\x63\x1c\x2c\x05\xe7\x64\x4e\x60\xa0\x5f\xb7\x9c\x47\x47\x75\xce\xb6\x41\x26\xad\x6b\x0f\x3d\x07\x69\x7d\xd9\x81\x6a\x75\xf3\x6f\xba\x30\x18\xdc\xf6\xf8\xc3\x29\x64\x1e\xb2\x34\x83\xfd\xde\x90\x8b\xe1\x42\xaa\x44\xfc\x98\xc2\x45\x9b\x00\x70\x3d\x03\xd6\x6b\xaf\x43\x74\xfe\x78\x89\x51\x3d\x3e\xfc\x04\x28\x48\x84\xe3\x32\xb3\x47\x30\x52\xf9\x66\xbe\xdf\x3f\x14\x4b\x41\x9e\x00\xd6\xfb\xe3\xcd\x00\xb5\x79\x42\x16\xf3\x2d\xfa\x79\x48\x46\x39\xb4\xe1\xaa\x09\x01\x25\xcf\xbd\xcc\x05\x06\x92\xe6\xa2\xa5\x09\x4f\x60\x3b\xde\x42\xc9\x1f\x0e\xd1\x1e\x24\xdc\xf1\xa0\x1b\xce\xf6\x7b\xd6\xb1\x11\x19\xfb\x8a\x0b\x55\x35\x7f\x3c\xfd\xc5\x19\x14\x45\xc2\xeb\xc3\x8e\xa5\x87\x9b\x5f\xb0\x64\xa1\x0b\x0c\x04\x39\xe5\xbc\x19\x92\xd4\x10\xe4\xb3\xd6\xae\xaa\xc2\x28\x94\xf3\x68\x47\x38\x8c\x2c\x5d\x76\xb9\x1d\x38\xf7\x3f\x13\x77\xdb\x82\xe0\x13\x77\x58\x4d\x94\x3d\xab\xb1\x4b\x31\xd6\x6d\xe9\x76\x0c\xd4\x34\x48\x2c\x06\xa7\x08\x84\x4a\xce\x4b\x3f\xca\xe6\x7a\x78\x9c\x7d\x4e\xd9\x00\xaf\xfd\x30\xeb\x86\x80\xc7\xd6\x71\x48\x8d\x58\xcd\x3c\x14\xf3\x8e\xdb\x74\xa9\xb9\x49\xbe\x7e\xfe\x58\x55\x5e\xbf\xa9\x70\x4e\xab\x60\x83\x03\xf4\xae\x07\x8e\x1b\x2c\x40\x33\xef\xaf\x65\xc6\xd5\x83\x37\xef\xb7\x45\x21\x1f\x66\xc3\x40\xe8\x8b\x94\x88\x65\xb1\x7e\xa1\x0a\xda\xf2\x42\x05\x80\xff\xf1\xa6\x5a\x67\x74\xe9\x61\xf1\x9f\x79\xed\x00\x4b\xf0\x7e\xdf\xd4\x08\x94\xf0\x9c\xce\x1a\xfe\xbc\x52\xad\xe2\x4c\xc6\x0f\x33\xef\x50\xde\xc7\xa7\xce\x19\x4f\x61\xdc\x12\x52\xa2\xf9\x8e\x3f\x60\x19\xe5\xb0\x12\x3b\xc0\x17\x4d\xab\xc4\x4e\x80\x31\x36\x9e\x90\xb5\x35\xee\x79\x7b\x07\xc3\x41\x11\x14\x99\x3d\x5c\x8e\x3b\xad\x04\xac\xf0\xf2\x25\x6c\xf4\x38\xff\x6a\x87\x91\x63\xe2\xba\xd2\xdf\x52\xd4\x8e\x1d\xd0\x3c\x00\x2f\xb7\xbf\xa7\x23\xa3\x9b\xea\xf2\x6f\x26\xb7\x6f\xcd\x9d\xd8\x91\xd5\x03\x73\x76\xd2\xa5\xc0\x16\x78\xdd\xe8\x09\x0a\x1e\x6b\xcf\x9b\x85\x3e\x8e\xf5\xbd\x1b\x3d\x75\xca\xc1\xea\xe6\x85\x1c\x1d\x01\xda\x07\x1b\xac\x89\x6b\xc3\xdf\x5a\x2b\x9c\xfd\x84\x7e\xa0\x1a\x19\x76\x0d\x41\x98\xeb\xfa\x85\xfe\x8e\x55\x64\xf0\xaa\xfe\xe4\xf6\xef\x7f\x17\xc2\x94\xe7\xb6\xd3\xcf\xbe\x59\x40\x02\x2a\xc7\xf7\xe2\x87\xf3\xe9\x15\xeb\xfa\x84\x2d\x37\x40\xe5\x1c\xdf\xb2\x7c\x83\xdd\x00\xad\x31\x2a\xf4\xfe\xa1\xf0\x4f\x6e\x7a\x68\x8e\x90\x46\xb4\xdf\xef\xfa\xff\xeb\xab\xab\x2b\x76\x75\x84\x6a\xba\xa5\x01\x59\x3d\xd5\x31\xc9\x15\xf8\x2d\x66\x86\x0d\x08\x5f\x5a\x9d\x15\x0e\x97\xfb\xe6\xa5\xde\x49\x3d\xa4\xef\x75\x09\x34\xfe\xdf\xb8\x4f\x8e\xb1\x11\xae\x30\x0a\x56\x1c\x53\xf3\x06\xfb\x15\xb8\x84\x9c\xad\xb4\xc9\xb9\xf3\xbd\xc5\x62\x01\xef\xde\x4d\xe1\x1b\xfe\x83\xf4\x3a\xcf\xaf\x2d\xa6\x09\xb2\x5f\x62\xb3\x83\xd9\xd0\xc9\x80\xa7\x02\xa7\xe0\xad\x8c\xce\xef\xf4\xae\x03\x55\x40\xe9\xff\x8b\xc2\x1a\x4a\xff\x27\x15\x1c\xfc\x71\x68\xba\xaa\x11\x7e\x5c\xf8\x5d\x53\x37\x61\x98\xdf\x49\xe9\x77\xf1\xf5\x3b\xd7\x5d\xf8\x1e\x3b\x04\x8e\x09\x1e\xa7\x4f\x41\x00\x61\x08\xb5\x60\xba\x47\xd4\xdf\x1e\x52\xc0\xa6\xba\xc8\xb0\x07\xd6\xeb\x75\x56\xf7\xc7\x90\x48\x8b\x5d\x69\x09\x8d\x7b\x59\xcb\x70\xe1\xbb\x54\xda\x09\xab\x69\x06\x47\x0c\x72\xad\x85\x4d\x6e\xa0\xea\x6d\x3e\xb9\xde\x58\x5a\x7f\x37\x9f\x87\x8c\x8e\x42\xea\xa6\xe9\xbb\xf9\xab\xe2\x9f\x00\x00\x00\xff\xff\x57\x95\x4e\xc2\x6d\x0c\x00\x00")
+var _homeTmplHtml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x57\xdf\x6f\xdb\x36\x10\x7e\xf7\x5f\x71\xd5\x02\x58\x5e\x2c\x29\x41\xdf\x12\xd9\x40\xb3\x14\x68\x81\x3a\x2b\xd6\x74\x40\x9f\x06\x5a\xa2\x2d\x36\x12\xe9\x91\x94\x1d\xc1\xd0\xff\xbe\x23\xa9\x1f\x96\xe3\x64\x0d\xda\x02\xb5\x2d\xf1\xe3\xdd\xf7\xdd\x1d\x8f\x97\xf8\x4d\x2a\x12\x5d\x6d\x28\x64\xba\xc8\xe7\xa3\xb8\xfd\xa2\x24\x9d\x8f\x00\x62\xcd\x74\x4e\xe7\x7f\x13\x4e\x52\x56\x16\xb0\xdf\xdb\x17\x10\x7e\xa1\x72\x4b\xe5\x1d\x29\x68\x5d\xc3\xbb\x3c\x17\x09\xd1\x42\xc6\x91\xc3\xe3\x4e\x44\xd2\x62\x93\x13\x4d\xc1\x33\xd6\x3c\x08\xeb\x7a\x14\x47\xce\x72\xfc\x26\x08\xe0\xee\xcf\xfb\xf7\x57\xb0\xa3\x30\x5e\x0a\x29\xc5\x6e\x0c\x04\x72\xa1\x41\xac\x40\x67\x14\x94\xae\x72\xc6\xd7\xe6\x91\xa5\x94\xa3\xe5\x2a\x9d\x42\x46\x79\x42\xcd\xfa\x48\xd1\xa4\x94\xf8\x32\x90\xd4\xb8\x49\x41\x53\x59\x30\x2e\x72\xb1\xae\x80\xf1\xce\x06\x05\x9a\xd3\x02\x0d\xa8\x29\xe4\xec\x81\x76\xd6\x80\xf0\x74\xb4\xcc\xa9\x52\xe8\x26\x84\x20\x40\x5e\x4b\x91\x56\x90\xe4\x44\xa9\x99\xd7\xe2\x36\x52\x6c\xf1\xb7\x0c\x72\x52\x89\x52\x03\x69\xe5\xa6\xde\x29\xa5\x54\x3a\xad\x18\x3d\x95\x48\xb6\xd1\x06\x04\xb0\x2a\x79\xa2\x99\xe0\x90\x64\x84\xaf\xe9\x8d\xe6\x3e\x43\x3d\x9c\xee\x3e\xdc\x2f\x3e\x4d\x60\x6f\x51\x00\x98\x90\xd2\xb0\x0d\xd7\x54\xbf\x77\xc4\x6f\xaa\x8f\x29\x82\x27\x21\xe3\x9c\x4a\x03\x87\x19\x78\xf1\x4a\x70\x0d\x09\xea\x95\xb3\xf1\x5a\x92\x6a\x3c\xf7\xce\x1b\x73\xe7\x5e\x1c\x99\xe5\xb9\x77\x6d\xcd\x5a\x36\x51\x4f\x27\x4e\xd9\xb6\x95\x59\x10\xc6\x3d\xc7\x31\xce\x2e\xdb\xb7\x1b\xb2\xa6\x81\x4d\xdc\xfc\x0f\x49\x8d\x38\x8c\x16\x2c\xb0\x10\xd6\x14\x3e\x72\xa5\x09\xe6\x41\x99\xe4\x9c\xac\x09\x4c\xf4\x65\x63\xf3\xc0\x55\x1b\x6c\x15\xe4\x4c\xe9\xc6\xe9\x73\x90\x26\x96\x2d\xc8\xb2\x9b\x7f\x13\xa5\xc4\xe4\x36\xee\x7b\x2f\x46\x1e\x5a\x71\x0f\xfb\xbd\x34\x21\x86\x33\xc6\x53\xfa\x38\x85\xb3\xa6\x00\xe0\x6a\x06\x61\xc7\xdd\xa6\xe8\x79\xf7\x0c\xb3\x7a\xe8\xfc\x04\x28\x48\xa9\x26\x2c\x57\x07\x30\xe3\x7c\xc7\x74\xd6\xfb\xe9\xdc\x38\x09\x6f\xe7\xfb\x7d\xf8\x01\x63\x99\xbb\x28\xbd\x3d\xdc\x1b\x6f\x9e\xb8\x48\xc8\x16\xa3\x3f\x74\x61\x2a\x6b\x43\xb8\x4b\x8c\x29\xa9\x7b\x56\x50\x4c\xaf\x79\x17\x2f\x65\x74\x02\xdb\xda\x2d\x39\x7b\xd4\x88\xf6\x20\x25\x9a\x04\xed\xe3\x0c\x49\xb5\xd6\x8c\xb1\xf0\x2b\x2e\xd4\xf5\xfc\xf8\xf5\x17\x2d\x91\x94\x21\x6e\x9d\x1d\x52\x8f\x36\x3f\xa1\x64\x21\x4a\x4c\x8f\x29\x9d\x67\x65\x20\x15\x8b\x72\xf5\xf5\xcb\x3c\xdf\x34\x20\xf8\x4c\x34\x36\x10\xae\x5e\x20\xe0\xaa\x2a\x6c\xb7\x18\x26\x6a\x40\xa5\xe1\x89\xf1\x39\xb1\x9b\xf2\xf4\x25\xde\xc7\x80\x83\x7a\xb6\x8f\x87\xf5\xa7\xb9\x0a\xf0\xe0\x0f\x04\x1d\x01\x8e\xc5\x12\xc8\x24\x5d\xcd\x3c\xa4\x77\x4b\x54\xb6\x14\x44\xa6\x5f\xff\xfa\x54\xd7\x5e\xb7\xa9\xd4\x5a\xf0\x60\x83\x0f\x6c\x8b\x05\xa2\x89\xc4\x16\x34\xf3\xfe\x59\xe6\x84\x3f\x78\xf3\x6e\x5b\x1c\x91\x61\xe6\x07\x44\x5f\xc5\x84\x2e\xcb\xf5\x2b\x59\x98\x2d\xaf\x64\x00\xf8\x1f\xcf\xaa\xd2\x52\x54\x1e\xb6\xff\x99\xd7\x3c\x60\x13\xde\xef\x5d\x97\x40\x0a\x2f\xf1\xb4\xf0\x97\x99\x0a\x9e\xe4\x2c\x79\x98\x79\x7d\x83\x1f\x9f\xf2\x33\x9e\xc2\xb8\x31\x68\xea\xce\xd7\xe4\x01\x1b\x29\x81\x15\xdd\x01\xde\x69\x82\xa7\x6a\x02\x61\x18\x8e\x27\x46\xad\xc5\xbd\xac\x77\xf0\x38\x68\x83\x34\x57\xfd\x59\xb9\x13\x9c\xc2\x0a\x8f\x50\x1a\x8e\x8e\x0b\xce\x06\xcc\x04\x26\xb1\xbd\xfe\xc6\x64\xed\x30\x00\xee\x0a\x78\xbd\xfe\xce\x9c\x11\xed\x3a\xc9\xff\x49\x6e\x6e\x9b\x3b\xba\x33\xaa\x07\x72\x5c\x63\x5d\xe0\xe9\x33\x97\x50\x70\xcc\xbd\x70\x0b\x5d\x1e\xed\x49\x1c\x3d\x0d\x4a\xaf\xda\xdd\x91\xa3\x03\x40\x73\x65\x83\x92\x89\x15\xfe\x4e\x29\xaa\xd5\x67\x8c\x83\xe9\x87\x51\x3b\x12\x44\x85\xb0\x77\xf4\x77\x6c\x2a\x83\x7b\xf5\x07\xb7\x7f\xff\xb7\xa4\xb2\x7a\x6e\xbb\xf9\xd9\x8d\x0b\x68\xc0\xb4\xde\x7b\xfa\xa8\x7d\x73\x8f\xb5\x93\xc2\x96\x48\x30\xad\x1b\x6f\x99\x62\x83\xf3\x80\x59\x0b\x4d\x53\xf7\xfb\x26\x3f\xb9\xee\xa0\x05\x42\x1c\x69\xbf\xdb\xf5\xfb\xe5\xc5\xc5\x45\x78\x71\x80\x72\xf3\xd2\xc0\x98\x7d\xd5\x5a\x62\x2b\xf0\x1b\xcc\x0c\x47\x10\xb2\x54\x22\x2f\x35\x2e\x77\xe3\x8b\xdd\x69\xa6\x48\xdf\x6b\x0b\x68\xfc\xdb\xb8\x2b\x8e\xb1\xa4\xba\x94\x1c\x56\x04\x4b\xf3\x1a\x27\x16\x38\x87\x22\x5c\x09\x59\x10\xed\x7b\x8b\xc5\x02\x6e\x6f\xa7\xf0\x0d\xff\x41\x76\x55\x14\x57\x0a\xcb\x04\xad\x9f\xe3\xb8\x83\xd5\xd0\xd2\x80\xa7\x04\xa7\xe0\xad\xa4\x28\xee\xc4\xae\x05\xd5\x60\xca\xff\x27\x89\x39\x93\xfe\x0f\x32\xe8\xe3\xd1\x8f\x5d\xf5\x08\x3f\xce\xfc\x76\xac\x9b\x84\x58\xdf\x69\xe5\xb7\xf9\xf5\xdb\xd0\x9d\xf9\x5e\xd8\x27\x2e\xa4\x24\xc9\x9e\x82\x00\xa2\x08\x2c\x61\x73\x8e\xcc\x84\xdb\x97\x80\xca\x44\x99\xe3\x14\x2c\xd6\xeb\xdc\x4e\xc8\x90\x32\x85\x73\x69\x05\x2e\xbc\x61\x63\xe1\xcc\xd7\x19\x53\x93\xd0\x9a\x19\xb8\x18\xd4\x5a\x03\x9b\x5c\x43\xdd\x69\x3e\xb9\xee\x94\xda\x6f\xf7\xd9\x57\x74\x1c\x99\x79\xda\x7c\xbb\xbf\x2b\xfe\x0b\x00\x00\xff\xff\x98\x33\x7b\xbe\x6f\x0c\x00\x00")
 
 func homeTmplHtmlBytes() ([]byte, error) {
 	return bindataRead(
diff --git a/services/allocator/allocatord/assets/dash.js b/services/allocator/allocatord/assets/dash.js
index 4a9ea40..6651f97 100644
--- a/services/allocator/allocatord/assets/dash.js
+++ b/services/allocator/allocatord/assets/dash.js
@@ -49,12 +49,12 @@
   var CHART_COLOR = '#00838F';
 
   var durationInSeconds = 3600;
-  var mountedName = '';
+  var instance = '';
 
   function extractParameters() {
     var $url = $.url();
-    mountedName = $url.param('n');
-    return mountedName !== undefined;
+    instance = $url.param('instance');
+    return instance !== undefined;
   }
 
   // Sets up handlers for changing duration.
@@ -74,7 +74,7 @@
   function update() {
     $('#loading-label').show();
     var params = {
-      n: mountedName,
+      instance: instance,
       d: durationInSeconds
     };
     $('#error-msg').hide();
diff --git a/services/allocator/allocatord/assets/dashboard.tmpl.html b/services/allocator/allocatord/assets/dashboard.tmpl.html
index 0f1ca93..468bc0b 100644
--- a/services/allocator/allocatord/assets/dashboard.tmpl.html
+++ b/services/allocator/allocatord/assets/dashboard.tmpl.html
@@ -20,7 +20,7 @@
   <body>
     <div id="container">
       <div id="header">
-        <div id="title">{{.ServerName}} Dashboard</div>
+        <div id="title">{{title .ServerName}} Dashboard</div>
         <div>{{.Instance}}</div>
         <div id="email">{{.Email}}</div>
       </div>
diff --git a/services/allocator/allocatord/assets/home.tmpl.html b/services/allocator/allocatord/assets/home.tmpl.html
index 863b358..fd12675 100644
--- a/services/allocator/allocatord/assets/home.tmpl.html
+++ b/services/allocator/allocatord/assets/home.tmpl.html
@@ -23,21 +23,23 @@
     {{range $index, $element := .Instances}}
       <div class="blessings-item">
         <div class="blessing-details">
-          <h3>{{kubeName .Name}}</h3>
+          {{with .Instance}}
+          <h3>{{.Handle}}</h3>
           <p class="blessing-caveats">
             <span>Creation Time</span><br/>
             <span class="unixtime" data-unixtime={{.CreationTime.Unix}}>{{.CreationTime.String}}</span>
           </p>
           <p class="blessing-caveats">
             <span>Mount Name</span><br/>
-            <i>{{.NameRoot}}/</i><wbr/>{{relativeName .Name}}
+            {{.MountName}}
           </p>
           <p class="blessing-caveats">
             <span>Blessing Patterns</span><br/>
-            {{range .BlessingPatterns}}
+            {{range .BlessingNames}}
               {{.}}<br/>
             {{end}}
           </p>
+          {{end}}
         </div>
         <div class="btns-col">
           <div class="btn">
diff --git a/services/allocator/allocatord/assets_helper.go b/services/allocator/allocatord/assets_helper.go
index 12ef337..aedf59f 100644
--- a/services/allocator/allocatord/assets_helper.go
+++ b/services/allocator/allocatord/assets_helper.go
@@ -106,9 +106,7 @@
 		return nil, err
 	}
 	t, err := template.New(name).Funcs(template.FuncMap{
-		"title":        strings.Title,
-		"kubeName":     kubeNameFromMountName,
-		"relativeName": relativeMountName,
+		"title": strings.Title,
 	}).Parse(string(data))
 	if err != nil {
 		return nil, err
diff --git a/services/allocator/allocatord/cookie.go b/services/allocator/allocatord/cookie.go
index 2c160fa..4c56399 100644
--- a/services/allocator/allocatord/cookie.go
+++ b/services/allocator/allocatord/cookie.go
@@ -42,18 +42,18 @@
 	CSRFToken string `'json:"csrfToken"`
 }
 
-func (c *signedCookie) computeHMAC(name, signKey string) []byte {
+func computeHMAC(signKey string, fields ...string) []byte {
 	mac := hmac.New(sha256.New, []byte(signKey))
-	put := func(data string) {
-		fmt.Fprintf(mac, "%08x%s", len(data), data)
+	for _, f := range fields {
+		fmt.Fprintf(mac, "%08x%s", len(f), f)
 	}
-	put(name)
-	put(c.Payload)
-	put(c.Expiry.String())
-	put(c.CSRFToken)
 	return mac.Sum(nil)
 }
 
+func (c *signedCookie) computeHMAC(name, signKey string) []byte {
+	return computeHMAC(signKey, name, c.Payload, c.Expiry.String(), c.CSRFToken)
+}
+
 func (c *signedCookie) verifyHMAC(name, signKey string) bool {
 	return hmac.Equal(c.HMAC, c.computeHMAC(name, signKey))
 }
diff --git a/services/allocator/allocatord/dashboard.go b/services/allocator/allocatord/dashboard.go
index b8dd17c..087f5c5 100644
--- a/services/allocator/allocatord/dashboard.go
+++ b/services/allocator/allocatord/dashboard.go
@@ -13,7 +13,7 @@
 	"strings"
 	"time"
 
-	"google.golang.org/api/monitoring/v3"
+	monitoring "google.golang.org/api/monitoring/v3"
 
 	"v.io/x/lib/gcm"
 )
@@ -57,11 +57,11 @@
 
 func handleDashboard(ss *serverState, rs *requestState) error {
 	ctx := ss.ctx
-	instance := rs.r.FormValue(paramDashboardName)
+	instance := rs.r.FormValue(paramInstance)
 	if instance == "" {
-		return fmt.Errorf("parameter %q required for instance name", paramDashboardName)
+		return fmt.Errorf("parameter %q required for instance name", paramInstance)
 	}
-	if err := checkOwner(ctx, rs.email, kubeNameFromMountName(instance)); err != nil {
+	if err := checkOwner(ctx, rs.email, instance); err != nil {
 		return err
 	}
 
@@ -106,11 +106,11 @@
 		return writeResult()
 	}
 
-	mountedName := rs.r.FormValue(paramDashboardName)
-	if mountedName == "" {
-		return fmt.Errorf("parameter %q required for instance name", paramDashboardName)
+	instance := rs.r.FormValue(paramInstance)
+	if instance == "" {
+		return fmt.Errorf("parameter %q required for instance name", paramInstance)
 	}
-	if err := checkOwner(ctx, rs.email, kubeNameFromMountName(mountedName)); err != nil {
+	if err := checkOwner(ctx, rs.email, instance); err != nil {
 		return err
 	}
 
@@ -141,7 +141,9 @@
 	}
 	filters := []string{
 		fmt.Sprintf("metric.type=%q", md.Type),
-		fmt.Sprintf("metric.label.mounted_name=%q", mountedName),
+		// TODO(jingjin): Can we make the key be just the instance name
+		// (without sb/ prefix)?
+		fmt.Sprintf("metric.label.mounted_name=%q", relativeMountName(instance)),
 	}
 	nextPageToken := ""
 	tsMap := map[string]points{}
diff --git a/services/allocator/allocatord/handlers.go b/services/allocator/allocatord/handlers.go
index 25e5ff6..e844b1b 100644
--- a/services/allocator/allocatord/handlers.go
+++ b/services/allocator/allocatord/handlers.go
@@ -5,28 +5,26 @@
 package main
 
 import (
+	"crypto/hmac"
+	"encoding/base64"
+	"errors"
 	"fmt"
 	"net/http"
-	"strings"
-	"time"
 
-	"v.io/v23/security"
+	"v.io/x/ref/services/allocator"
 )
 
 func handleHome(ss *serverState, rs *requestState) error {
 	ctx := ss.ctx
-	instances, err := list(ctx, rs.email)
+	instances, err := serverInstances(ctx, rs.email)
 	if err != nil {
 		return fmt.Errorf("list error: %v", err)
 	}
 	type instanceArg struct {
-		Name,
-		NameRoot,
+		Instance allocator.Instance
 		DestroyURL,
 		DebugURL,
 		DashboardURL string
-		BlessingPatterns []string
-		CreationTime     time.Time
 	}
 	tmplArgs := struct {
 		AssetsPrefix,
@@ -43,24 +41,17 @@
 		Message:      rs.r.FormValue(paramMessage),
 	}
 	for _, instance := range instances {
-		if len(instance.blessingNames) == 0 {
-			// TODO(rthellend): Remove when all instances have the new
-			// creatorInfo annotations.
-			ctx.Info("blessingNames missing from creatorInfo")
-			for _, b := range ss.args.baseBlessingNames {
-				bName := strings.Join([]string{b, instance.name}, security.ChainSeparator)
-				instance.blessingNames = append(instance.blessingNames, bName)
-			}
-		}
-
 		tmplArgs.Instances = append(tmplArgs.Instances, instanceArg{
-			Name:             instance.mountName,
-			NameRoot:         nameRoot(ctx),
-			CreationTime:     instance.creationTime,
-			BlessingPatterns: instance.blessingNames,
-			DestroyURL:       makeURL(ctx, routeDestroy, params{paramName: instance.mountName, paramCSRF: rs.csrfToken}),
-			DashboardURL:     makeURL(ctx, routeDashboard, params{paramDashboardName: relativeMountName(instance.mountName)}),
-			DebugURL:         makeURL(ctx, routeDebug+"/", params{paramName: instance.mountName}),
+			Instance:     instance,
+			DestroyURL:   makeURL(ctx, routeDestroy, params{paramInstance: instance.Handle, paramCSRF: rs.csrfToken}),
+			DashboardURL: makeURL(ctx, routeDashboard, params{paramInstance: instance.Handle}),
+			DebugURL: makeURL(
+				ctx,
+				routeDebug+"/",
+				params{
+					paramInstance:  instance.Handle,
+					paramMountName: instance.MountName,
+					paramHMAC:      base64.URLEncoding.EncodeToString(computeHMAC(instance.Handle, instance.MountName))}),
 		})
 	}
 	if err := ss.args.assets.executeTemplate(rs.w, homeTmpl, tmplArgs); err != nil {
@@ -71,32 +62,50 @@
 
 func handleCreate(ss *serverState, rs *requestState) error {
 	ctx := ss.ctx
-	name, err := create(ctx, rs.email, ss.args.baseBlessings, ss.args.baseBlessingNames)
+	instance, err := create(ctx, rs.email, ss.args.baseBlessings, ss.args.baseBlessingNames)
 	if err != nil {
 		return fmt.Errorf("create failed: %v", err)
 	}
-	redirectTo := makeURL(ctx, routeHome, params{paramMessage: "created " + name})
+	redirectTo := makeURL(ctx, routeHome, params{paramMessage: "created " + instance})
 	http.Redirect(rs.w, rs.r, redirectTo, http.StatusFound)
 	return nil
 }
 
 func handleDestroy(ss *serverState, rs *requestState) error {
 	ctx := ss.ctx
-	name := rs.r.FormValue(paramName)
-	if err := destroy(ctx, rs.email, name); err != nil {
+	instance := rs.r.FormValue(paramInstance)
+	if instance == "" {
+		return fmt.Errorf("parameter %q required for instance name", paramInstance)
+	}
+	if err := destroy(ctx, rs.email, instance); err != nil {
 		return fmt.Errorf("destroy failed: %v", err)
 	}
-	redirectTo := makeURL(ctx, routeHome, params{paramMessage: "destroyed " + name})
+	redirectTo := makeURL(ctx, routeHome, params{paramMessage: "destroyed " + instance})
 	http.Redirect(rs.w, rs.r, redirectTo, http.StatusFound)
 	return nil
 }
 
 func handleDebug(ss *serverState, rs *requestState, debugBrowserServeMux *http.ServeMux) error {
-	instance := rs.r.FormValue(paramName)
+	instance := rs.r.FormValue(paramInstance)
 	if instance == "" {
-		return fmt.Errorf("parameter %q required for instance name", paramDashboardName)
+		return fmt.Errorf("parameter %q required for instance name", paramInstance)
 	}
-	if err := checkOwner(ss.ctx, rs.email, kubeNameFromMountName(instance)); err != nil {
+	mountName := rs.r.FormValue(paramMountName)
+	if mountName == "" {
+		return fmt.Errorf("parameter %q required for instance mount name", paramMountName)
+	}
+	hmacBase64 := rs.r.FormValue(paramHMAC)
+	if hmacBase64 == "" {
+		return fmt.Errorf("parameter %q required for name signature", paramHMAC)
+	}
+	hmacSignature, err := base64.URLEncoding.DecodeString(hmacBase64)
+	if err != nil {
+		return fmt.Errorf("invalid signature: %v", err)
+	}
+	if !hmac.Equal(hmacSignature, computeHMAC(instance, mountName)) {
+		return errors.New("mismatching signature")
+	}
+	if err := checkOwner(ss.ctx, rs.email, instance); err != nil {
 		return err
 	}
 	http.StripPrefix(routeDebug, debugBrowserServeMux).ServeHTTP(rs.w, rs.r)
diff --git a/services/allocator/allocatord/http.go b/services/allocator/allocatord/http.go
index d56df93..da5e1ec 100644
--- a/services/allocator/allocatord/http.go
+++ b/services/allocator/allocatord/http.go
@@ -30,12 +30,13 @@
 	routeHealth    = "/health"
 
 	paramMessage = "message"
-	// paramName has to match the name parameter in debug browser.
-	paramName = "n"
-	// The following parameter names are hardcorded in static/dash.js,
-	// and should be changed in tandem.
-	paramDashboardName    = "n"
+	paramHMAC    = "hmac"
+	// The following parameter names are hardcorded in static/dash.js, and
+	// should be changed in tandem.
+	paramInstance         = "instance"
 	paramDashbordDuration = "d"
+	// paramMountName has to match the name parameter in debug browser.
+	paramMountName = "n"
 
 	cookieValidity = 10 * time.Minute
 )
diff --git a/services/allocator/allocatord/names.go b/services/allocator/allocatord/names.go
index 4a5567e..2c0e843 100644
--- a/services/allocator/allocatord/names.go
+++ b/services/allocator/allocatord/names.go
@@ -22,9 +22,9 @@
 	serverMountPrefix = "sb"
 )
 
-// newKubeName returns a new kubernetes name.
+// newKubeName returns a new kubernetes name.  This is used as the handle for
+// the instance created by allocatord.
 func newKubeName() (string, error) {
-	// Kubernetes names/labels are at most 63 characters long.
 	b := make([]byte, 4)
 	if _, err := rand.Read(b); err != nil {
 		return "", err
@@ -43,19 +43,11 @@
 }
 
 func mountNameFromKubeName(ctx *context.T, kName string) string {
-	return naming.Join(nameRoot(ctx), serverMountPrefix, kName)
+	return naming.Join(nameRoot(ctx), relativeMountName(kName))
 }
 
-func kubeNameFromMountName(mName string) string {
-	if mName == "" {
-		return ""
-	}
-	p := strings.Split(mName, "/")
-	return p[len(p)-1]
-}
-
-func relativeMountName(mName string) string {
-	return naming.Join(serverMountPrefix, kubeNameFromMountName(mName))
+func relativeMountName(kName string) string {
+	return naming.Join(serverMountPrefix, kName)
 }
 
 func emailFromBlessingNames(blessingNames []string) string {
diff --git a/services/allocator/allocatord/oauth.go b/services/allocator/allocatord/oauth.go
index 6887ff3..e8dcce4 100644
--- a/services/allocator/allocatord/oauth.go
+++ b/services/allocator/allocatord/oauth.go
@@ -73,7 +73,7 @@
 type oauthCredentials struct {
 	ClientID     string `json:"clientId"`
 	ClientSecret string `json:"clientSecret"`
-	// HashKey is not stricly part of the OAuth credentials, but for
+	// HashKey is not strictly part of the OAuth credentials, but for
 	// convenience we put it in the same object.
 	//
 	// TODO(caprita): Consider signing cookies with the server's private key
diff --git a/services/allocator/allocatord/service.go b/services/allocator/allocatord/service.go
index 2c038e6..9b731ec 100644
--- a/services/allocator/allocatord/service.go
+++ b/services/allocator/allocatord/service.go
@@ -24,6 +24,7 @@
 	"v.io/v23/security/access"
 	"v.io/v23/verror"
 	"v.io/v23/vom"
+	"v.io/x/ref/services/allocator"
 )
 
 const pkgPath = "v.io/x/ref/services/allocator/allocatord"
@@ -39,7 +40,7 @@
 }
 
 // Create creates a new instance of the service.
-// It returns the object name of the new instance.
+// It returns a handle for the new instance.
 func (i *allocatorImpl) Create(ctx *context.T, call rpc.ServerCall) (string, error) {
 	b, _ := security.RemoteBlessingNames(ctx, call.Security())
 	ctx.Infof("Create() called by %v", b)
@@ -51,20 +52,20 @@
 	return create(ctx, email, i.baseBlessings, i.baseBlessingNames)
 }
 
-// Destroy destroys the instance with the given name.
-func (i *allocatorImpl) Destroy(ctx *context.T, call rpc.ServerCall, mName string) error {
+// Destroy destroys the instance with the given handle.
+func (i *allocatorImpl) Destroy(ctx *context.T, call rpc.ServerCall, kName string) error {
 	b, _ := security.RemoteBlessingNames(ctx, call.Security())
-	ctx.Infof("Destroy(%q) called by %v", mName, b)
+	ctx.Infof("Destroy(%q) called by %v", kName, b)
 
 	email := emailFromBlessingNames(b)
 	if email == "" {
 		return verror.New(verror.ErrNoAccess, ctx, "unable to determine caller's email address")
 	}
-	return destroy(ctx, email, mName)
+	return destroy(ctx, email, kName)
 }
 
 // List returns a list of all the instances owned by the caller.
-func (i *allocatorImpl) List(ctx *context.T, call rpc.ServerCall) ([]string, error) {
+func (i *allocatorImpl) List(ctx *context.T, call rpc.ServerCall) ([]allocator.Instance, error) {
 	b, _ := security.RemoteBlessingNames(ctx, call.Security())
 	ctx.Infof("List() called by %v", b)
 
@@ -72,15 +73,7 @@
 	if email == "" {
 		return nil, verror.New(verror.ErrNoAccess, ctx, "unable to determine caller's email address")
 	}
-	instances, err := list(ctx, email)
-	if err != nil {
-		return nil, err
-	}
-	mNames := make([]string, len(instances))
-	for i, instance := range instances {
-		mNames[i] = instance.mountName
-	}
-	return mNames, nil
+	return serverInstances(ctx, email)
 }
 
 func create(ctx *context.T, email string, baseBlessings security.Blessings, baseBlessingNames []string) (string, error) {
@@ -131,17 +124,15 @@
 		deletePersistentDisk(ctx, kName)
 		return "", verror.New(verror.ErrInternal, ctx, err)
 	}
-	return mName, nil
+	return kName, nil
 }
 
-func destroy(ctx *context.T, email, mName string) error {
-	kName := kubeNameFromMountName(mName)
-
+func destroy(ctx *context.T, email, kName string) error {
 	if err := isOwnerOfInstance(ctx, email, kName); err != nil {
 		return err
 	}
 
-	cfg, cleanup, err := createDeploymentConfig(ctx, email, kName, mName, nil)
+	cfg, cleanup, err := createDeploymentConfig(ctx, email, kName, "", nil)
 	defer cleanup()
 	if err != nil {
 		return err
@@ -158,21 +149,6 @@
 	return nil
 }
 
-func list(ctx *context.T, email string) ([]serverInstance, error) {
-	instances, err := serverInstances(ctx, email)
-	if err != nil {
-		return nil, err
-	}
-	for i, instance := range instances {
-		// TODO(rthellend): Remove when all instances have the new
-		// creatorInfo annotations.
-		if instances[i].mountName == "" {
-			instances[i].mountName = mountNameFromKubeName(ctx, instance.name)
-		}
-	}
-	return instances, err
-}
-
 func createDeploymentConfig(ctx *context.T, email, deploymentName, mountName string, baseBlessingNames []string) (string, func(), error) {
 	cleanup := func() {}
 	acl, err := accessList(ctx, email)
@@ -286,14 +262,7 @@
 	return hex.EncodeToString(h[:])
 }
 
-type serverInstance struct {
-	name          string
-	mountName     string
-	blessingNames []string
-	creationTime  time.Time
-}
-
-func serverInstances(ctx *context.T, email string) ([]serverInstance, error) {
+func serverInstances(ctx *context.T, email string) ([]allocator.Instance, error) {
 	args := []string{"kubectl", "get", "deployments", "-o", "json"}
 	if email != "" {
 		args = append(args, "-l", "ownerHash="+emailHash(email))
@@ -323,7 +292,7 @@
 	if err := json.Unmarshal(out, &list); err != nil {
 		return nil, err
 	}
-	instances := []serverInstance{}
+	instances := []allocator.Instance{}
 	for _, l := range list.Items {
 		if !strings.HasPrefix(l.Metadata.Name, serverNameFlag+"-") {
 			continue
@@ -333,11 +302,11 @@
 			ctx.Errorf("decodeCreatorInfo failed: %v", err)
 			continue
 		}
-		instances = append(instances, serverInstance{
-			name:          l.Metadata.Name,
-			mountName:     cInfo.MountName,
-			blessingNames: cInfo.BlessingNames,
-			creationTime:  l.Metadata.CreationTime,
+		instances = append(instances, allocator.Instance{
+			Handle:        l.Metadata.Name,
+			MountName:     cInfo.MountName,
+			BlessingNames: cInfo.BlessingNames,
+			CreationTime:  l.Metadata.CreationTime,
 		})
 	}
 	return instances, nil
@@ -349,7 +318,7 @@
 		return err
 	}
 	for _, i := range instances {
-		if i.name == kName {
+		if i.Handle == kName {
 			return nil
 		}
 	}
diff --git a/services/allocator/service.vdl b/services/allocator/service.vdl
index 802a366..c5cfe6e 100644
--- a/services/allocator/service.vdl
+++ b/services/allocator/service.vdl
@@ -4,14 +4,24 @@
 
 package allocator
 
+import "time"
+
+// Instance describes a service instance.
+type Instance struct {
+     Handle string
+     MountName string
+     BlessingNames []string
+     CreationTime time.Time
+}
+
 type Allocator interface {
 	// Create creates a new instance of the service.
-	// It returns the object name of the new instance.
-	Create() (name string | error)
+	// It returns a handle for the new instance.
+	Create() (handle string | error)
 
-	// Destroy destroys the instance with the given name.
-	Destroy(name string) error
+	// Destroy destroys the instance with the given handle.
+	Destroy(handle string) error
 
 	// List returns a list of all the instances owned by the caller.
-	List() (names []string | error)
+	List() (instances []Instance | error)
 }