installer: separate suffix and prefix generation.

Reuse suffix for app dir name.
diff --git a/core/installer/namespace.go b/core/installer/namespace.go
index 87cd8c4..0acc608 100644
--- a/core/installer/namespace.go
+++ b/core/installer/namespace.go
@@ -5,6 +5,43 @@
 	"fmt"
 )
 
+type SuffixGenerator interface {
+	Generate() (string, error)
+}
+
+type emptySuffixGenerator struct {
+}
+
+func NewEmptySuffixGenerator() SuffixGenerator {
+	return &emptySuffixGenerator{}
+}
+
+func (g *emptySuffixGenerator) Generate() (string, error) {
+	return "", nil
+}
+
+type fixedLengthRandomSuffixGenerator struct {
+	len int
+}
+
+func NewFixedLengthRandomSuffixGenerator(len int) SuffixGenerator {
+	return &fixedLengthRandomSuffixGenerator{len}
+}
+
+var letters = []rune("abcdefghijklmnopqrstuvwxyz")
+
+func (g *fixedLengthRandomSuffixGenerator) Generate() (string, error) {
+	r := make([]byte, g.len)
+	if _, err := rand.Read(r); err != nil {
+		return "", err
+	}
+	ret := make([]rune, g.len)
+	for i, v := range r {
+		ret[i] += letters[v%26]
+	}
+	return fmt.Sprintf("-%s", string(ret)), nil
+}
+
 type NamespaceGenerator interface {
 	Generate(name string) (string, error)
 }
@@ -20,45 +57,3 @@
 func (g *prefixGenerator) Generate(name string) (string, error) {
 	return g.prefix + name, nil
 }
-
-type randomSuffixGenerator struct {
-	len int
-}
-
-func NewRandomSuffixGenerator(len int) NamespaceGenerator {
-	return &randomSuffixGenerator{len}
-}
-
-var letters = []rune("abcdefghijklmnopqrstuvwxyz")
-
-func (g randomSuffixGenerator) Generate(name string) (string, error) {
-	r := make([]byte, g.len)
-	if _, err := rand.Read(r); err != nil {
-		return "", err
-	}
-	ret := make([]rune, g.len)
-	for i, v := range r {
-		ret[i] += letters[v%26]
-	}
-	return fmt.Sprintf("%s-%s", name, string(ret)), nil
-}
-
-type combineGenerator struct {
-	ns []NamespaceGenerator
-}
-
-func NewCombine(ns ...NamespaceGenerator) NamespaceGenerator {
-	return &combineGenerator{ns}
-}
-
-func (g *combineGenerator) Generate(name string) (string, error) {
-	cur := name
-	var err error
-	for _, i := range g.ns {
-		cur, err = i.Generate(cur)
-		if err != nil {
-			return "", err
-		}
-	}
-	return cur, nil
-}