installer: create namespaces with kube client
diff --git a/core/installer/namespace.go b/core/installer/namespace.go
new file mode 100644
index 0000000..87cd8c4
--- /dev/null
+++ b/core/installer/namespace.go
@@ -0,0 +1,64 @@
+package installer
+
+import (
+ "crypto/rand"
+ "fmt"
+)
+
+type NamespaceGenerator interface {
+ Generate(name string) (string, error)
+}
+
+type prefixGenerator struct {
+ prefix string
+}
+
+func NewPrefixGenerator(prefix string) NamespaceGenerator {
+ return &prefixGenerator{prefix}
+}
+
+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
+}