From 8fd10ec4575f5f965c313727d18d45d19e39872b Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Tue, 22 Oct 2019 11:05:46 +0800 Subject: [PATCH] climc: k8s import cluster support --- build/docker/Dockerfile.webconsole | 2 +- cmd/climc/shell/k8s/clusters.go | 263 +++++++++++++--------------- cmd/climc/shell/k8s/k8s.go | 4 +- cmd/climc/shell/k8s/k8s_node.go | 23 --- cmd/climc/shell/k8s/kubeclusters.go | 195 --------------------- cmd/climc/shell/k8s/machines.go | 2 +- cmd/climc/shell/k8s/nodes.go | 73 +------- pkg/cloudcommon/policy/resources.go | 5 +- pkg/mcclient/modules/k8s/cluster.go | 5 - pkg/mcclient/modules/k8s/node.go | 28 --- pkg/mcclient/options/k8s/cluster.go | 183 ++----------------- pkg/mcclient/options/k8s/machine.go | 10 ++ pkg/mcclient/options/k8s/node.go | 100 ----------- pkg/util/k8s/cluster.go | 2 +- 14 files changed, 149 insertions(+), 746 deletions(-) delete mode 100644 cmd/climc/shell/k8s/k8s_node.go delete mode 100644 cmd/climc/shell/k8s/kubeclusters.go delete mode 100644 pkg/mcclient/modules/k8s/node.go delete mode 100644 pkg/mcclient/options/k8s/node.go diff --git a/build/docker/Dockerfile.webconsole b/build/docker/Dockerfile.webconsole index 857ea55ee6..a354e27f3b 100644 --- a/build/docker/Dockerfile.webconsole +++ b/build/docker/Dockerfile.webconsole @@ -1,4 +1,4 @@ -FROM frolvlad/alpine-glibc:glibc-2.28 +FROM yunion/kubectl:1.14.3 MAINTAINER "Zexi Li " diff --git a/cmd/climc/shell/k8s/clusters.go b/cmd/climc/shell/k8s/clusters.go index 9dbcfeab34..6ae9d42437 100644 --- a/cmd/climc/shell/k8s/clusters.go +++ b/cmd/climc/shell/k8s/clusters.go @@ -16,9 +16,6 @@ package k8s import ( "fmt" - "io/ioutil" - "os" - "os/exec" "yunion.io/x/jsonutils" @@ -27,63 +24,21 @@ import ( o "yunion.io/x/onecloud/pkg/mcclient/options/k8s" ) -func initCluster() { - cmdN := func(suffix string) string { - return kubeResourceCmdN("cluster", suffix) +func initKubeCluster() { + cmdN := func(action string) string { + return fmt.Sprintf("kubecluster-%s", action) } - - R(&o.ClusterListOptions{}, cmdN("list"), "List k8s infra clusters", func(s *mcclient.ClientSession, args *o.ClusterListOptions) error { - result, err := k8s.Clusters.List(s, args.Params()) + R(&o.ClusterListOptions{}, cmdN("list"), "List k8s clusters", func(s *mcclient.ClientSession, args *o.ClusterListOptions) error { + result, err := k8s.KubeClusters.List(s, args.Params()) if err != nil { return err } - printList(result, k8s.Clusters.GetColumns(s)) - return nil - }) - - R(&o.ClusterCreateOptions{}, cmdN("create"), "Create k8s cluster", func(s *mcclient.ClientSession, args *o.ClusterCreateOptions) error { - cluster, err := k8s.Clusters.Create(s, args.Params()) - if err != nil { - return err - } - printObject(cluster) - return nil - }) - - R(&o.ClusterImportOptions{}, cmdN("import"), "Import exists YKE deployed kubernetes cluster", func(s *mcclient.ClientSession, args *o.ClusterImportOptions) error { - params, err := args.Params() - if err != nil { - return err - } - - cluster, err := k8s.Clusters.PerformAction(s, args.NAME, "import", params) - if err != nil { - return err - } - printObject(cluster) - return nil - }) - - R(&o.ClusterUpdateOptions{}, cmdN("update"), "Update k8s cluster", func(s *mcclient.ClientSession, args *o.ClusterUpdateOptions) error { - cluster, err := k8s.Clusters.Update(s, args.NAME, args.Params()) - if err != nil { - return err - } - printObject(cluster) - return nil - }) - - R(&o.ClusterDeployOptions{}, cmdN("deploy"), "Start deploy a cluster", func(s *mcclient.ClientSession, args *o.ClusterDeployOptions) error { - ret, err := k8s.Clusters.PerformAction(s, args.ID, "deploy", args.Params()) - if err != nil { - return err - } - printObject(ret) + printList(result, k8s.KubeClusters.GetColumns(s)) return nil }) R(&o.IdentOptions{}, cmdN("show"), "Show details of a cluster", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - result, err := k8s.Clusters.Get(s, args.ID, nil) + result, err := k8s.KubeClusters.Get(s, args.ID, nil) if err != nil { return err } @@ -91,14 +46,75 @@ func initCluster() { return nil }) - R(&o.ClusterDeleteOptions{}, cmdN("delete"), "Delete cluster", func(s *mcclient.ClientSession, args *o.ClusterDeleteOptions) error { - ret := k8s.Clusters.BatchDeleteWithParam(s, args.ID, nil, nil) - printBatchResults(ret, k8s.Clusters.GetColumns(s)) + R(&o.KubeClusterCreateOptions{}, cmdN("create"), "Create k8s cluster", func(s *mcclient.ClientSession, args *o.KubeClusterCreateOptions) error { + params, err := args.Params() + if err != nil { + return err + } + cluster, err := k8s.KubeClusters.Create(s, params) + if err != nil { + return err + } + printObject(cluster) return nil }) - R(&o.ClusterKubeconfigOptions{}, cmdN("kubeconfig"), "Generate kubeconfig of a cluster", func(s *mcclient.ClientSession, args *o.ClusterKubeconfigOptions) error { - ret, err := k8s.Clusters.PerformAction(s, args.ID, "generate-kubeconfig", args.Params()) + R(&o.KubeClusterImportOptions{}, cmdN("import"), "Import k8s cluster", func(s *mcclient.ClientSession, args *o.KubeClusterImportOptions) error { + params, err := args.Params() + if err != nil { + return err + } + cluster, err := k8s.KubeClusters.Create(s, params) + if err != nil { + return err + } + printObject(cluster) + return nil + }) + + R(&o.ClusterDeleteOptions{}, cmdN("delete"), "Delete cluster", func(s *mcclient.ClientSession, args *o.ClusterDeleteOptions) error { + ret := k8s.KubeClusters.BatchDeleteWithParam(s, args.ID, nil, nil) + printBatchResults(ret, k8s.KubeClusters.GetColumns(s)) + return nil + }) + + R(&o.KubeClusterAddMachinesOptions{}, cmdN("add-machines"), "Add machines to cluster", func(s *mcclient.ClientSession, args *o.KubeClusterAddMachinesOptions) error { + params, err := args.Params() + if err != nil { + return err + } + ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "add-machines", params) + if err != nil { + return err + } + printObject(ret) + return nil + }) + + R(&o.KubeClusterDeleteMachinesOptions{}, cmdN("delete-machines"), "Delete machines in cluster", func(s *mcclient.ClientSession, args *o.KubeClusterDeleteMachinesOptions) error { + params, err := args.Params() + if err != nil { + return err + } + ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "delete-machines", params) + if err != nil { + return err + } + printObject(ret) + return nil + }) + + R(&o.IdentOptions{}, cmdN("terminate"), "Terminate cluster", func(s *mcclient.ClientSession, args *o.IdentOptions) error { + ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "terminate", nil) + if err != nil { + return err + } + printObject(ret) + return nil + }) + + R(&o.IdentOptions{}, cmdN("kubeconfig"), "Generate kubeconfig of a cluster", func(s *mcclient.ClientSession, args *o.IdentOptions) error { + ret, err := k8s.KubeClusters.GetSpecific(s, args.ID, "kubeconfig", nil) if err != nil { return err } @@ -110,12 +126,12 @@ func initCluster() { return nil }) - R(&o.IdentOptions{}, cmdN("engineconfig"), "Get kubernetes engine config of a cluster", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.Clusters.GetSpecific(s, args.ID, "engine-config", nil) + R(&o.IdentOptions{}, cmdN("addons"), "Get addon manifest of a cluster", func(s *mcclient.ClientSession, args *o.IdentOptions) error { + ret, err := k8s.KubeClusters.GetSpecific(s, args.ID, "addons", nil) if err != nil { return err } - conf, err := ret.GetString("config") + conf, err := ret.GetString("addons") if err != nil { return err } @@ -123,94 +139,39 @@ func initCluster() { return nil }) - R(&o.IdentOptions{}, cmdN("webhookauthurl"), "Get cluster kubernetes api server webhook auth url", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.Clusters.GetSpecific(s, args.ID, "webhook-auth-url", nil) - if err != nil { - return err - } - url, err := ret.GetString("url") - if err != nil { - return err - } - fmt.Println(url) - return nil - }) - - R(&o.ClusterAddNodesOptions{}, cmdN("addnodes"), "Add nodes to cluster", func(s *mcclient.ClientSession, args *o.ClusterAddNodesOptions) error { - params, err := args.Params() - if err != nil { - return err - } - ret, err := k8s.Clusters.PerformAction(s, args.ID, "add-nodes", params) - if err != nil { - return err - } - printObject(ret) - return nil - }) - - R(&o.ClusterDeleteNodesOptions{}, cmdN("delete-nodes"), "Delete nodes in cluster", func(s *mcclient.ClientSession, args *o.ClusterDeleteNodesOptions) error { - params, err := args.Params() - if err != nil { - return err - } - ret, err := k8s.Clusters.PerformAction(s, args.ID, "delete-nodes", params) - if err != nil { - return err - } - printObject(ret) - return nil - }) - - R(&o.IdentOptions{}, cmdN("engineconfig-edit"), "Edit and update kubernetes engine config of a cluster", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.Clusters.GetSpecific(s, args.ID, "engine-config", nil) - if err != nil { - return err - } - conf, err := ret.GetString("config") - if err != nil { - return err - } - tempfile, err := ioutil.TempFile("", fmt.Sprintf("%s-engineconfig", args.ID)) - if err != nil { - return err - } - defer os.Remove(tempfile.Name()) - - if _, err := tempfile.Write([]byte(conf)); 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 - } - + R(&o.ClusterK8sVersions{}, cmdN("k8s-versions"), "Get kubernetes deployable versions", func(s *mcclient.ClientSession, args *o.ClusterK8sVersions) error { params := jsonutils.NewDict() - configBytes, err := ioutil.ReadFile(tempfile.Name()) + params.Add(jsonutils.NewString(args.PROVIDER), "provider") + ret, err := k8s.KubeClusters.Get(s, "k8s-versions", params) if err != nil { return err } - params.Add(jsonutils.NewString(string(configBytes)), "config") - result, err := k8s.Clusters.PerformAction(s, args.ID, "update-engine-config", params) - if err != nil { - return err - } - conf, err = result.GetString("config") - if err != nil { - return err - } - fmt.Println(conf) + fmt.Println(ret.String()) return nil }) - R(&o.IdentOptions{}, cmdN("sync-config"), "Sync kubernetes cluster by engineconfig", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.Clusters.PerformAction(s, args.ID, "sync-config", nil) + R(&o.ClusterK8sVersions{}, cmdN("usable-instances"), "Get deploy usable instance", func(s *mcclient.ClientSession, args *o.ClusterK8sVersions) error { + params := jsonutils.NewDict() + params.Add(jsonutils.NewString(args.PROVIDER), "provider") + ret, err := k8s.KubeClusters.Get(s, "usable-instances", params) + if err != nil { + return err + } + fmt.Println(ret.String()) + return nil + }) + + R(&o.ClusterCheckOptions{}, cmdN("check-system-ready"), "Check system cluster status", func(s *mcclient.ClientSession, args *o.ClusterCheckOptions) error { + ret, err := k8s.KubeClusters.PerformClassAction(s, "check-system-ready", nil) + if err != nil { + return err + } + fmt.Println(ret.String()) + return nil + }) + + R(&o.IdentOptions{}, cmdN("apply-addons"), "Apply base requirements addons", func(s *mcclient.ClientSession, args *o.IdentOptions) error { + ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "apply-addons", nil) if err != nil { return err } @@ -218,12 +179,26 @@ func initCluster() { return nil }) - R(&o.ClusterRestartAgentsOptions{}, cmdN("restart-agent"), "Restart node agents in cluster", func(s *mcclient.ClientSession, args *o.ClusterRestartAgentsOptions) error { - params, err := args.Params() + R(&o.IdentOptions{}, cmdN("syncstatus"), "Sync cluster status", func(s *mcclient.ClientSession, args *o.IdentOptions) error { + ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "syncstatus", nil) if err != nil { return err } - ret, err := k8s.Clusters.PerformAction(s, args.ID, "restart-agent", params) + printObject(ret) + return nil + }) + + R(&o.IdentOptions{}, cmdN("public"), "Make cluster public", func(s *mcclient.ClientSession, args *o.IdentOptions) error { + ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "public", nil) + if err != nil { + return err + } + printObject(ret) + return nil + }) + + R(&o.IdentOptions{}, cmdN("private"), "Make cluster private", func(s *mcclient.ClientSession, args *o.IdentOptions) error { + ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "private", nil) if err != nil { return err } diff --git a/cmd/climc/shell/k8s/k8s.go b/cmd/climc/shell/k8s/k8s.go index cf30d43921..4c485aa298 100644 --- a/cmd/climc/shell/k8s/k8s.go +++ b/cmd/climc/shell/k8s/k8s.go @@ -29,10 +29,8 @@ import ( func init() { // cluster resources - initCluster() initKubeCluster() initKubeMachine() - initNode() initKubeCerts() // helm resources @@ -79,7 +77,7 @@ func kubeResourceCmdN(prefix, suffix string) string { func clusterContext(clusterId string) modulebase.ManagerContext { return modulebase.ManagerContext{ - InstanceManager: k8s.Clusters, + InstanceManager: k8s.KubeClusters, InstanceId: clusterId, } } diff --git a/cmd/climc/shell/k8s/k8s_node.go b/cmd/climc/shell/k8s/k8s_node.go deleted file mode 100644 index a927f42e8e..0000000000 --- a/cmd/climc/shell/k8s/k8s_node.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package k8s - -import ( - "yunion.io/x/onecloud/pkg/mcclient/modules/k8s" -) - -func initK8sNode() { - initK8sClusterResource("node", k8s.K8sNodes) -} diff --git a/cmd/climc/shell/k8s/kubeclusters.go b/cmd/climc/shell/k8s/kubeclusters.go deleted file mode 100644 index 786939ccbc..0000000000 --- a/cmd/climc/shell/k8s/kubeclusters.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package k8s - -import ( - "fmt" - - "yunion.io/x/jsonutils" - - "yunion.io/x/onecloud/pkg/mcclient" - "yunion.io/x/onecloud/pkg/mcclient/modules/k8s" - o "yunion.io/x/onecloud/pkg/mcclient/options/k8s" -) - -func initKubeCluster() { - cmdN := func(action string) string { - return fmt.Sprintf("kubecluster-%s", action) - } - R(&o.ClusterListOptions{}, cmdN("list"), "List k8s clusters", func(s *mcclient.ClientSession, args *o.ClusterListOptions) error { - result, err := k8s.KubeClusters.List(s, args.Params()) - if err != nil { - return err - } - printList(result, k8s.KubeClusters.GetColumns(s)) - return nil - }) - - R(&o.IdentOptions{}, cmdN("show"), "Show details of a cluster", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - result, err := k8s.KubeClusters.Get(s, args.ID, nil) - if err != nil { - return err - } - printObject(result) - return nil - }) - - R(&o.KubeClusterCreateOptions{}, cmdN("create"), "Create k8s cluster", func(s *mcclient.ClientSession, args *o.KubeClusterCreateOptions) error { - params, err := args.Params() - if err != nil { - return err - } - cluster, err := k8s.KubeClusters.Create(s, params) - if err != nil { - return err - } - printObject(cluster) - return nil - }) - - R(&o.ClusterDeleteOptions{}, cmdN("delete"), "Delete cluster", func(s *mcclient.ClientSession, args *o.ClusterDeleteOptions) error { - ret := k8s.KubeClusters.BatchDeleteWithParam(s, args.ID, nil, nil) - printBatchResults(ret, k8s.Clusters.GetColumns(s)) - return nil - }) - - R(&o.KubeClusterAddMachinesOptions{}, cmdN("add-machines"), "Add machines to cluster", func(s *mcclient.ClientSession, args *o.KubeClusterAddMachinesOptions) error { - params, err := args.Params() - if err != nil { - return err - } - ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "add-machines", params) - if err != nil { - return err - } - printObject(ret) - return nil - }) - - R(&o.KubeClusterDeleteMachinesOptions{}, cmdN("delete-machines"), "Delete machines in cluster", func(s *mcclient.ClientSession, args *o.KubeClusterDeleteMachinesOptions) error { - params, err := args.Params() - if err != nil { - return err - } - ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "delete-machines", params) - if err != nil { - return err - } - printObject(ret) - return nil - }) - - R(&o.IdentOptions{}, cmdN("terminate"), "Terminate cluster", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "terminate", nil) - if err != nil { - return err - } - printObject(ret) - return nil - }) - - R(&o.IdentOptions{}, cmdN("kubeconfig"), "Generate kubeconfig of a cluster", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.KubeClusters.GetSpecific(s, args.ID, "kubeconfig", nil) - if err != nil { - return err - } - conf, err := ret.GetString("kubeconfig") - if err != nil { - return err - } - fmt.Println(conf) - return nil - }) - - R(&o.IdentOptions{}, cmdN("addons"), "Get addon manifest of a cluster", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.KubeClusters.GetSpecific(s, args.ID, "addons", nil) - if err != nil { - return err - } - conf, err := ret.GetString("addons") - if err != nil { - return err - } - fmt.Println(conf) - return nil - }) - - R(&o.ClusterK8sVersions{}, cmdN("k8s-versions"), "Get kubernetes deployable versions", func(s *mcclient.ClientSession, args *o.ClusterK8sVersions) error { - params := jsonutils.NewDict() - params.Add(jsonutils.NewString(args.PROVIDER), "provider") - ret, err := k8s.KubeClusters.Get(s, "k8s-versions", params) - if err != nil { - return err - } - fmt.Println(ret.String()) - return nil - }) - - R(&o.ClusterK8sVersions{}, cmdN("usable-instances"), "Get deploy usable instance", func(s *mcclient.ClientSession, args *o.ClusterK8sVersions) error { - params := jsonutils.NewDict() - params.Add(jsonutils.NewString(args.PROVIDER), "provider") - ret, err := k8s.KubeClusters.Get(s, "usable-instances", params) - if err != nil { - return err - } - fmt.Println(ret.String()) - return nil - }) - - R(&o.ClusterCheckOptions{}, cmdN("check-system-ready"), "Check system cluster status", func(s *mcclient.ClientSession, args *o.ClusterCheckOptions) error { - ret, err := k8s.KubeClusters.PerformClassAction(s, "check-system-ready", nil) - if err != nil { - return err - } - fmt.Println(ret.String()) - return nil - }) - - R(&o.IdentOptions{}, cmdN("apply-addons"), "Apply base requirements addons", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "apply-addons", nil) - if err != nil { - return err - } - printObject(ret) - return nil - }) - - R(&o.IdentOptions{}, cmdN("syncstatus"), "Sync cluster status", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "syncstatus", nil) - if err != nil { - return err - } - printObject(ret) - return nil - }) - - R(&o.IdentOptions{}, cmdN("public"), "Make cluster public", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "public", nil) - if err != nil { - return err - } - printObject(ret) - return nil - }) - - R(&o.IdentOptions{}, cmdN("private"), "Make cluster private", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.KubeClusters.PerformAction(s, args.ID, "private", nil) - if err != nil { - return err - } - printObject(ret) - return nil - }) -} diff --git a/cmd/climc/shell/k8s/machines.go b/cmd/climc/shell/k8s/machines.go index 377f0030aa..bd634b0a00 100644 --- a/cmd/climc/shell/k8s/machines.go +++ b/cmd/climc/shell/k8s/machines.go @@ -26,7 +26,7 @@ func initKubeMachine() { cmdN := func(action string) string { return fmt.Sprintf("kubemachine-%s", action) } - R(&o.NodeListOptions{}, cmdN("list"), "List k8s node machines", func(s *mcclient.ClientSession, args *o.NodeListOptions) error { + R(&o.MachineListOptions{}, cmdN("list"), "List k8s node machines", func(s *mcclient.ClientSession, args *o.MachineListOptions) error { params, err := args.Params() if err != nil { return err diff --git a/cmd/climc/shell/k8s/nodes.go b/cmd/climc/shell/k8s/nodes.go index 627080d749..a927f42e8e 100644 --- a/cmd/climc/shell/k8s/nodes.go +++ b/cmd/climc/shell/k8s/nodes.go @@ -15,78 +15,9 @@ package k8s import ( - "fmt" - - "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/modules/k8s" - o "yunion.io/x/onecloud/pkg/mcclient/options/k8s" ) -func initNode() { - cmdN := func(suffix string) string { - return kubeResourceCmdN("node", suffix) - } - R(&o.NodeListOptions{}, cmdN("list"), "List k8s infra nodes", func(s *mcclient.ClientSession, args *o.NodeListOptions) error { - params, err := args.Params() - if err != nil { - return err - } - result, err := k8s.Nodes.List(s, params) - if err != nil { - return err - } - printList(result, k8s.Nodes.GetColumns(s)) - return nil - }) - - R(&o.NodeCreateOptions{}, cmdN("create"), "Create k8s cluster node", func(s *mcclient.ClientSession, args *o.NodeCreateOptions) error { - params := args.Params() - node, err := k8s.Nodes.Create(s, params) - if err != nil { - return err - } - printObject(node) - return nil - }) - - R(&o.IdentOptions{}, cmdN("delete"), "Delete node", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.Nodes.Delete(s, args.ID, nil) - if err != nil { - return err - } - printObject(ret) - return nil - }) - - R(&o.IdentOptions{}, cmdN("show"), "Show node details", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - obj, err := k8s.Nodes.Get(s, args.ID, nil) - if err != nil { - return err - } - printObject(obj) - return nil - }) - - R(&o.IdentsOptions{}, cmdN("purge"), "Purge a node record in database, not actually do deletion", func(s *mcclient.ClientSession, args *o.IdentsOptions) error { - ret := k8s.Nodes.BatchPerformAction(s, args.ID, "purge", nil) - printBatchResults(ret, k8s.Nodes.GetColumns(s)) - return nil - }) - - R(&o.IdentOptions{}, cmdN("dockerconfig"), "Get docker daemon config", func(s *mcclient.ClientSession, args *o.IdentOptions) error { - ret, err := k8s.Nodes.GetSpecific(s, args.ID, "docker-config", nil) - if err != nil { - return err - } - fmt.Println(ret) - return nil - }) - - R(&o.NodeConfigDockerRegistryOptions{}, cmdN("config-docker-registry"), "Config node docker daemon registry", - func(s *mcclient.ClientSession, args *o.NodeConfigDockerRegistryOptions) error { - params := args.Params() - ret := k8s.Nodes.BatchPerformAction(s, args.ID, "config-docker-registry", params) - printBatchResults(ret, k8s.Nodes.GetColumns(s)) - return nil - }) +func initK8sNode() { + initK8sClusterResource("node", k8s.K8sNodes) } diff --git a/pkg/cloudcommon/policy/resources.go b/pkg/cloudcommon/policy/resources.go index 7c214b4010..cc06c76f6d 100644 --- a/pkg/cloudcommon/policy/resources.go +++ b/pkg/cloudcommon/policy/resources.go @@ -64,10 +64,7 @@ var ( meterDomainResources = []string{} meterUserResources = []string{} - k8sSystemResources = []string{ - "kube_clusters", - "kube_nodes", - } + k8sSystemResources = []string{} k8sDomainResources = []string{} k8sUserResources = []string{} diff --git a/pkg/mcclient/modules/k8s/cluster.go b/pkg/mcclient/modules/k8s/cluster.go index a273099e77..70016a2824 100644 --- a/pkg/mcclient/modules/k8s/cluster.go +++ b/pkg/mcclient/modules/k8s/cluster.go @@ -19,17 +19,12 @@ import ( ) var ( - Clusters *ResourceManager KubeClusters *ResourceManager ) func init() { - Clusters = NewResourceManager("kube_cluster", "kube_clusters", - NewResourceCols("mode", "k8s_version", "status", "api_endpoint"), - NewColumns("is_public")) KubeClusters = NewResourceManager("kubecluster", "kubeclusters", NewResourceCols("cluster_type", "resource_type", "cloud_type", "version", "status", "mode", "provider", "machines"), NewColumns()) - modules.Register(Clusters) modules.Register(KubeClusters) } diff --git a/pkg/mcclient/modules/k8s/node.go b/pkg/mcclient/modules/k8s/node.go deleted file mode 100644 index a662eea31b..0000000000 --- a/pkg/mcclient/modules/k8s/node.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package k8s - -import ( - "yunion.io/x/onecloud/pkg/mcclient/modules" -) - -var ( - Nodes *ResourceManager -) - -func init() { - Nodes = NewResourceManager("kube_node", "kube_nodes", NewResourceCols("cluster", "roles", "address", "status"), NewColumns()) - modules.Register(Nodes) -} diff --git a/pkg/mcclient/options/k8s/cluster.go b/pkg/mcclient/options/k8s/cluster.go index 24c2abbf67..61809fd642 100644 --- a/pkg/mcclient/options/k8s/cluster.go +++ b/pkg/mcclient/options/k8s/cluster.go @@ -20,7 +20,6 @@ import ( "strings" "yunion.io/x/jsonutils" - "yunion.io/x/pkg/util/sets" "yunion.io/x/onecloud/pkg/mcclient/options" ) @@ -38,40 +37,6 @@ func (o ClusterListOptions) Params() *jsonutils.JSONDict { return params } -type K8sSupportVersion struct { - K8sVersion string `help:"Cluster kubernetes components version" choices:"v1.10.5|v1.11.3|v1.12.3"` -} - -type ClusterCreateOptions struct { - K8sSupportVersion - NAME string `help:"Name of cluster"` - Mode string `help:"Cluster mode" choices:"internal"` - InfraImage string `help:"Cluster kubelet infra container image"` - Cidr string `help:"Cluster service CIDR, e.g. 10.43.0.0/16"` - Domain string `help:"Cluster pod domain, e.g. cluster.local"` -} - -func (o ClusterCreateOptions) Params() *jsonutils.JSONDict { - params := jsonutils.NewDict() - params.Add(jsonutils.NewString(o.NAME), "name") - if o.Mode != "" { - params.Add(jsonutils.NewString(o.Mode), "mode") - } - if o.K8sVersion != "" { - params.Add(jsonutils.NewString(o.K8sVersion), "k8s_version") - } - if o.InfraImage != "" { - params.Add(jsonutils.NewString(o.InfraImage), "infra_container_image") - } - if o.Cidr != "" { - params.Add(jsonutils.NewString(o.Cidr), "cluster_cidr") - } - if o.Domain != "" { - params.Add(jsonutils.NewString(o.Domain), "cluster_domain") - } - return params -} - type AddMachineOptions struct { Machine []string `help:"Machine create desc, e.g. host01:baremetal:controlplane"` MachineNet string `help:"Machine net config"` @@ -96,6 +61,12 @@ type KubeClusterCreateOptions struct { AddMachineOptions } +type KubeClusterImportOptions struct { + NAME string `help:"Name of cluster"` + APISERVER string `help:"API server of this cluster"` + KUBECONFIG string `help:"Cluster kubeconfig file path"` +} + func parseMachineDesc(desc string, disk string, netConf string, ncpu int, memorySize string, hypervisor string) (*MachineCreateOptions, error) { matchType := func(p string) bool { switch p { @@ -173,34 +144,21 @@ func (o KubeClusterCreateOptions) Params() (*jsonutils.JSONDict, error) { return params, nil } -type ClusterImportOptions struct { - NAME string `help:"Name of cluster to import"` - KUBECONFIG string `help:"Kubernetes auth config"` -} - -func (o ClusterImportOptions) Params() (*jsonutils.JSONDict, error) { +func (o KubeClusterImportOptions) Params() (*jsonutils.JSONDict, error) { kubeconfig, err := ioutil.ReadFile(o.KUBECONFIG) if err != nil { return nil, fmt.Errorf("Read kube config %q error: %v", o.KUBECONFIG, err) } params := jsonutils.NewDict() - params.Add(jsonutils.NewString(string(kubeconfig)), "kube_config") + params.Add(jsonutils.NewString(o.NAME), "name") + params.Add(jsonutils.NewString("import"), "mode") + params.Add(jsonutils.NewString(o.APISERVER), "api_server") + params.Add(jsonutils.NewString(string(kubeconfig)), "kubeconfig") + params.Add(jsonutils.NewString("external"), "provider") + params.Add(jsonutils.NewString("unknown"), "resource_type") return params, nil } -type ClusterUpdateOptions struct { - NAME string `help:"Name of cluster"` - K8sSupportVersion -} - -func (o ClusterUpdateOptions) Params() *jsonutils.JSONDict { - params := jsonutils.NewDict() - if o.K8sVersion != "" { - params.Add(jsonutils.NewString(o.K8sVersion), "k8s_version") - } - return params -} - type IdentOptions struct { ID string `help:"ID or name of the model"` } @@ -215,36 +173,10 @@ type IdentsOptions struct { ID []string `help:"ID of models to operate"` } -type ClusterDeployOptions struct { - IdentOptions - Force bool `help:"Force deploy"` -} - -func (o ClusterDeployOptions) Params() *jsonutils.JSONDict { - params := jsonutils.NewDict() - if o.Force { - params.Add(jsonutils.JSONTrue, "force") - } - return params -} - type ClusterDeleteOptions struct { IdentsOptions } -type ClusterKubeconfigOptions struct { - IdentOptions - Directly bool `help:"Get directly connect kubeconfig"` -} - -func (o ClusterKubeconfigOptions) Params() *jsonutils.JSONDict { - params := jsonutils.NewDict() - if o.Directly { - params.Add(jsonutils.JSONTrue, "directly") - } - return params -} - type KubeClusterAddMachinesOptions struct { IdentOptions AddMachineOptions @@ -279,77 +211,6 @@ func (o KubeClusterAddMachinesOptions) Params() (*jsonutils.JSONDict, error) { return params, nil } -type ClusterAddNodesOptions struct { - IdentOptions - NodeConfig []string `help:"Node spec, 'host:[roles]' e.g: --node-config host01:controlplane,etcd,worker --node-config host02:worker"` - AutoDeploy bool `help:"Auto deploy"` -} - -func (o ClusterAddNodesOptions) Params() (*jsonutils.JSONDict, error) { - params := jsonutils.NewDict() - if o.AutoDeploy { - params.Add(jsonutils.JSONTrue, "auto_deploy") - } - nodesArray := jsonutils.NewArray() - for _, config := range o.NodeConfig { - opt, err := parseNodeAddConfigStr(config) - if err != nil { - return nil, err - } - nodesArray.Add(jsonutils.Marshal(opt)) - } - params.Add(nodesArray, "nodes") - return params, nil -} - -type dockerConfig struct { - RegistryMirrors []string `json:"registry-mirrors"` - InsecureRegistries []string `json:"insecure-registries"` -} - -type nodeAddConfig struct { - Host string `json:"host"` - Roles []string `json:"roles"` - Name string `json:"name"` - HostnameOverride string `json:"hostname_override"` - DockerdConfig dockerConfig `json:"dockerd_config"` -} - -func parseNodeAddConfigStr(config string) (nodeAddConfig, error) { - ret := nodeAddConfig{} - parts := strings.Split(config, ":") - if len(parts) != 2 { - return ret, fmt.Errorf("Invalid config: %q", config) - } - host := parts[0] - roleStr := parts[1] - ret.Host = host - roles := []string{} - for _, role := range strings.Split(roleStr, ",") { - if !sets.NewString("etcd", "controlplane", "worker").Has(role) { - return ret, fmt.Errorf("Invalid role: %q", role) - } - roles = append(roles, role) - } - ret.Roles = roles - return ret, nil -} - -type ClusterDeleteNodesOptions struct { - IdentOptions - Node []string `help:"Node id or name"` -} - -func (o ClusterDeleteNodesOptions) Params() (*jsonutils.JSONDict, error) { - params := jsonutils.NewDict() - nodesArray := jsonutils.NewArray() - for _, node := range o.Node { - nodesArray.Add(jsonutils.NewString(node)) - } - params.Add(nodesArray, "nodes") - return params, nil -} - type KubeClusterDeleteMachinesOptions struct { IdentOptions Machines []string `help:"Machine id or name"` @@ -364,21 +225,3 @@ func (o KubeClusterDeleteMachinesOptions) Params() (*jsonutils.JSONDict, error) params.Add(machinesArray, "machines") return params, nil } - -type ClusterRestartAgentsOptions struct { - ClusterDeleteNodesOptions - All bool `help:"Restart all nodes agent"` -} - -func (o ClusterRestartAgentsOptions) Params() (*jsonutils.JSONDict, error) { - params, err := o.ClusterDeleteNodesOptions.Params() - if err != nil { - return nil, err - } - all := jsonutils.JSONFalse - if o.All { - all = jsonutils.JSONTrue - } - params.Add(all, "all") - return params, nil -} diff --git a/pkg/mcclient/options/k8s/machine.go b/pkg/mcclient/options/k8s/machine.go index 7a85381677..95bf96553f 100644 --- a/pkg/mcclient/options/k8s/machine.go +++ b/pkg/mcclient/options/k8s/machine.go @@ -21,8 +21,18 @@ import ( "yunion.io/x/pkg/util/fileutils" "yunion.io/x/onecloud/pkg/cloudcommon/cmdline" + "yunion.io/x/onecloud/pkg/mcclient/options" ) +type MachineListOptions struct { + options.BaseListOptions + Cluster string `help:"Filter by cluster"` +} + +func (o MachineListOptions) Params() (*jsonutils.JSONDict, error) { + return options.ListStructToParams(&o) +} + type MachineCreateOptions struct { CLUSTER string `help:"Cluster id"` ROLE string `help:"Machine role" choices:"node|controlplane"` diff --git a/pkg/mcclient/options/k8s/node.go b/pkg/mcclient/options/k8s/node.go deleted file mode 100644 index 74c4a9f4eb..0000000000 --- a/pkg/mcclient/options/k8s/node.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package k8s - -import ( - "yunion.io/x/jsonutils" - - "yunion.io/x/onecloud/pkg/mcclient/options" -) - -type NodeListOptions struct { - options.BaseListOptions - Cluster string `help:"Filter by cluster"` -} - -func (o NodeListOptions) Params() (*jsonutils.JSONDict, error) { - return options.ListStructToParams(&o) -} - -type NodeCreateOptions struct { - CLUSTER string `help:"Cluster id"` - Etcd bool `help:"Etcd role"` - Controlplane bool `help:"Controlplane role"` - Worker bool `help:"Worker role"` - AllRole bool `help:"All roles"` - HostnameOverride string `help:"Worker node overrided hostname"` - Host string `help:"Yunion host server name or id"` - Name string `help:"Name of node"` - RegistryMirror []string `help:"Docker registry mirrors, e.g. 'https://registry.docker-cn.com'"` - InsecureRegistry []string `help:"Docker insecure registry"` -} - -func (o NodeCreateOptions) Params() *jsonutils.JSONDict { - params := jsonutils.NewDict() - if o.Name != "" { - params.Add(jsonutils.NewString(o.Name), "name") - } - params.Add(jsonutils.NewString(o.CLUSTER), "cluster") - dockerConf := dockerConfig{} - for _, rm := range o.RegistryMirror { - dockerConf.RegistryMirrors = append(dockerConf.RegistryMirrors, rm) - } - for _, im := range o.InsecureRegistry { - dockerConf.InsecureRegistries = append(dockerConf.InsecureRegistries, im) - } - confObj := jsonutils.Marshal(dockerConf) - params.Add(confObj, "dockerd_config") - - roles := jsonutils.NewArray() - if o.AllRole { - roles.Add(jsonutils.NewString("etcd"), jsonutils.NewString("controlplane"), jsonutils.NewString("worker")) - } else { - if o.Etcd { - roles.Add(jsonutils.NewString("etcd")) - } - if o.Controlplane { - roles.Add(jsonutils.NewString("controlplane")) - } - if o.Worker { - roles.Add(jsonutils.NewString("worker")) - } - } - params.Add(roles, "roles") - if o.HostnameOverride != "" { - params.Add(jsonutils.NewString(o.HostnameOverride), "hostname_override") - } - if o.Host != "" { - params.Add(jsonutils.NewString(o.Host), "host") - } - return params -} - -type NodeConfigDockerRegistryOptions struct { - IdentsOptions - RegistryMirror []string `help:"Docker registry mirrors, e.g. 'https://registry.docker-cn.com'"` - InsecureRegistry []string `help:"Docker insecure registry"` -} - -func (o NodeConfigDockerRegistryOptions) Params() jsonutils.JSONObject { - dockerConf := dockerConfig{} - for _, rm := range o.RegistryMirror { - dockerConf.RegistryMirrors = append(dockerConf.RegistryMirrors, rm) - } - for _, im := range o.InsecureRegistry { - dockerConf.InsecureRegistries = append(dockerConf.InsecureRegistries, im) - } - return jsonutils.Marshal(dockerConf) -} diff --git a/pkg/util/k8s/cluster.go b/pkg/util/k8s/cluster.go index b833952528..3af087a98c 100644 --- a/pkg/util/k8s/cluster.go +++ b/pkg/util/k8s/cluster.go @@ -110,7 +110,7 @@ func (man *SKubeClusterManager) getKubeClusterConfig() (string, error) { session := auth.GetAdminSession(context.Background(), man.region, "v1") params := jsonutils.NewDict() params.Add(jsonutils.JSONTrue, "directly") - ret, err := kubeserver.Clusters.PerformAction(session, "default", "generate-kubeconfig", params) + ret, err := kubeserver.KubeClusters.PerformAction(session, "default", "generate-kubeconfig", params) if err != nil { return "", err }