diff --git a/cmd/climc/shell/k8s/ingress.go b/cmd/climc/shell/k8s/ingress.go index 4ef4ce26a4..e56be63e1d 100644 --- a/cmd/climc/shell/k8s/ingress.go +++ b/cmd/climc/shell/k8s/ingress.go @@ -1,9 +1,25 @@ package k8s import ( + "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/modules/k8s" + o "yunion.io/x/onecloud/pkg/mcclient/options/k8s" ) func initIngress() { - initK8sNamespaceResource("ingress", k8s.Ingresses) + cmdN := initK8sNamespaceResource("ingress", k8s.Ingresses) + createCmd := NewCommand( + &o.IngressCreateOptions{}, + cmdN.CommandNameFactory("create"), + "Create ingress rules to service", + func(s *mcclient.ClientSession, args *o.IngressCreateOptions) error { + spec := args.Params() + ret, err := k8s.Ingresses.Create(s, spec) + if err != nil { + return err + } + printObject(ret) + return nil + }) + cmdN.AddR(createCmd) } diff --git a/cmd/climc/shell/k8s/raw.go b/cmd/climc/shell/k8s/raw.go index e2643c9166..4645381add 100644 --- a/cmd/climc/shell/k8s/raw.go +++ b/cmd/climc/shell/k8s/raw.go @@ -3,6 +3,8 @@ package k8s import ( "fmt" "io/ioutil" + "os" + "os/exec" "yunion.io/x/jsonutils" @@ -11,23 +13,23 @@ import ( o "yunion.io/x/onecloud/pkg/mcclient/options/k8s" ) -type rawOpt struct { +type RawOpt struct { o.NamespaceWithClusterOptions KIND string `help:"resource kind"` NAME string `help:"instance name"` } type rawGetOpt struct { - rawOpt + RawOpt Output string `help:"Output format" short-token:"o" default:"yaml" choices:"json|yaml"` } type rawDeleteOpt struct { - rawOpt + RawOpt } type rawPutOpt struct { - rawOpt + RawOpt File string `help:"Resource json description file" short-token:"f"` } @@ -53,7 +55,7 @@ func initRaw() { return nil }) - R(&rawPutOpt{}, "k8s-put", "Update k8s resource instance", func(s *mcclient.ClientSession, args *rawPutOpt) error { + doPut := func(s *mcclient.ClientSession, args *rawPutOpt) error { content, err := ioutil.ReadFile(args.File) if err != nil { return err @@ -67,5 +69,35 @@ func initRaw() { return err } return nil + } + + R(&rawPutOpt{}, "k8s-put", "Update k8s resource instance", func(s *mcclient.ClientSession, args *rawPutOpt) error { + return doPut(s, args) + }) + + R(&RawOpt{}, "k8s-edit", "Edit k8s resource instance", func(s *mcclient.ClientSession, args *RawOpt) error { + obj, err := k8s.RawResource.Get(s, args.KIND, args.Namespace, args.NAME, args.Cluster) + if err != nil { + return err + } + tempfile, err := ioutil.TempFile("", fmt.Sprintf("k8s-%s-%s.json", args.KIND, args.NAME)) + if err != nil { + return err + } + defer os.Remove(tempfile.Name()) + if _, err := tempfile.Write([]byte(obj.PrettyString())); err != nil { + return err + } + if err := tempfile.Close(); err != nil { + return err + } + + cmd := exec.Command("vim", tempfile.Name()) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + if err := cmd.Run(); err != nil { + return err + } + return doPut(s, &rawPutOpt{RawOpt: *args, File: tempfile.Name()}) }) } diff --git a/cmd/climc/shell/k8s/secret.go b/cmd/climc/shell/k8s/secret.go index 5bd63689c6..ff6d6ecd16 100644 --- a/cmd/climc/shell/k8s/secret.go +++ b/cmd/climc/shell/k8s/secret.go @@ -29,7 +29,7 @@ func initSecret() { registryCmd := initK8sNamespaceResource("registrysecret", k8s.RegistrySecrets) createCmd := NewCommand( &o.RegistrySecretCreateOptions{}, - resourceCmdN("registrysecret", "create"), + registryCmd.CommandNameFactory("create"), "Create docker registry secret resource", func(s *mcclient.ClientSession, args *o.RegistrySecretCreateOptions) error { params, err := args.Params() diff --git a/pkg/mcclient/options/k8s/ingress.go b/pkg/mcclient/options/k8s/ingress.go new file mode 100644 index 0000000000..f8f2f67b45 --- /dev/null +++ b/pkg/mcclient/options/k8s/ingress.go @@ -0,0 +1,34 @@ +package k8s + +import ( + "yunion.io/x/jsonutils" +) + +type IngressCreateOptions struct { + NamespaceWithClusterOptions + NAME string `help:"Name of ingress"` + SERVICE string `help:"Service name"` + PORT int `help:"Service port"` + Path string `help:"HTTP path"` + Host string `help:"Fuly qualified domain name of a network host" required:"true"` +} + +func (o IngressCreateOptions) Params() *jsonutils.JSONDict { + params := o.NamespaceWithClusterOptions.Params() + params.Add(jsonutils.NewString(o.NAME), "name") + path := jsonutils.NewDict() + path.Add(jsonutils.NewString(o.SERVICE), "backend", "serviceName") + path.Add(jsonutils.NewInt(int64(o.PORT)), "backend", "servicePort") + if o.Path != "" { + path.Add(jsonutils.NewString(o.Path), "path") + } + paths := jsonutils.NewArray() + paths.Add(path) + rule := jsonutils.NewDict() + rule.Add(paths, "http", "paths") + rule.Add(jsonutils.NewString(o.Host), "host") + rules := jsonutils.NewArray() + rules.Add(rule) + params.Add(rules, "rules") + return params +}