From d53d89f5d2fa241773918119f93f55a887b20433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E6=9C=88=E9=95=BF=E7=A9=BA?= <1666888816@qq.com> Date: Sun, 20 Aug 2023 17:17:12 +0800 Subject: [PATCH 1/5] feat: support check ssh --- api/cloud-adaptor/v1/cluster.go | 88 ++++++++++++++++++++++----------- go.mod | 14 +++--- go.sum | 15 ++++++ internal/handler/cluster.go | 72 +++++++++++++++++---------- internal/handler/router.go | 6 ++- internal/usecase/cluster.go | 80 +++++++++++++++++++++--------- pkg/bcode/cluster_bcode.go | 5 ++ 7 files changed, 195 insertions(+), 85 deletions(-) diff --git a/api/cloud-adaptor/v1/cluster.go b/api/cloud-adaptor/v1/cluster.go index c12b3ca..e776d09 100644 --- a/api/cloud-adaptor/v1/cluster.go +++ b/api/cloud-adaptor/v1/cluster.go @@ -34,13 +34,15 @@ var rbdComponentPodPhaseScore = map[string]int{ "Failed": 4, } -//ListKubernetesCluster list kubernetes cluster request body +// ListKubernetesCluster list kubernetes cluster request body +// //swagger:model ListKubernetesCluster type ListKubernetesCluster struct { ProviderName string `form:"provider_name" binding:"required"` } -//AddAccessKey - +// AddAccessKey - +// //swagger:model AddAccessKey type AddAccessKey struct { ProviderName string `json:"provider_name,omitempty" binding:"required"` @@ -48,25 +50,37 @@ type AddAccessKey struct { SecretKey string `json:"secret_key,omitempty" binding:"required"` } -//GetAccessKeyReq get enterprise access key +// GetAccessKeyReq get enterprise access key +// //swagger:model GetAccessKeyReq type GetAccessKeyReq struct { ProviderName string `form:"provider_name" binding:"required"` } -//KubernetesClustersResponse list kclusters response +// KubernetesClustersResponse list kclusters response +// //swagger:model KubernetesClustersResponse type KubernetesClustersResponse struct { Clusters []*v1alpha1.Cluster `json:"clusters"` } -//AccessKeyResponse access key +// check ssh request json +// +//swagger:model CheckSSHReq +type CheckSSHReq struct { + Host string `json:"host"` + Port uint `json:"port"` +} + +// AccessKeyResponse access key +// //swagger:model AccessKeyResponse type AccessKeyResponse struct { model.CloudAccessKey } -//CreateKubernetesReq create kubernetes req +// CreateKubernetesReq create kubernetes req +// //swagger:model CreateKubernetesReq type CreateKubernetesReq struct { Name string `json:"name" binding:"required"` @@ -81,7 +95,8 @@ type CreateKubernetesReq struct { KubeConfig string `json:"kubeconfig,omitempty"` } -//UpdateKubernetesReq update kubernetes req +// UpdateKubernetesReq update kubernetes req +// //swagger:model UpdateKubernetesReq type UpdateKubernetesReq struct { Provider string `json:"provider"` @@ -94,13 +109,15 @@ type UpdateKubernetesReq struct { EncodedRKEConfig string `json:"encodedRKEConfig"` } -//CreateKubernetesRes create kubernetes res +// CreateKubernetesRes create kubernetes res +// //swagger:model CreateKubernetesRes type CreateKubernetesRes struct { model.CreateKubernetesTask } -//UpdateKubernetesRes create kubernetes res +// UpdateKubernetesRes create kubernetes res +// //swagger:model UpdateKubernetesRes type UpdateKubernetesRes struct { Task interface{} `json:"task"` @@ -108,37 +125,43 @@ type UpdateKubernetesRes struct { RKEConfig string `json:"rkeConfig"` } -//GetLastCreateKubernetesClusterTaskReq get last create kubernetes task +// GetLastCreateKubernetesClusterTaskReq get last create kubernetes task +// //swagger:model GetLastCreateKubernetesClusterTaskReq type GetLastCreateKubernetesClusterTaskReq struct { ProviderName string `form:"provider_name" binding:"required"` } -//DeleteKubernetesClusterReq delete cluster +// DeleteKubernetesClusterReq delete cluster +// //swagger:model DeleteKubernetesClusterReq type DeleteKubernetesClusterReq struct { ProviderName string `form:"provider_name" binding:"required"` } -//GetCreateKubernetesClusterTaskRes create kubernetes res +// GetCreateKubernetesClusterTaskRes create kubernetes res +// //swagger:model GetCreateKubernetesClusterTaskRes type GetCreateKubernetesClusterTaskRes struct { model.CreateKubernetesTask } -//GetTaskEventListReq get event list of task +// GetTaskEventListReq get event list of task +// //swagger:model GetTaskEventListReq type GetTaskEventListReq struct { TaskID string `form:"taskID" binding:"required"` } -//TaskEventListRes get event list of task +// TaskEventListRes get event list of task +// //swagger:model TaskEventListRes type TaskEventListRes struct { Events []*model.TaskEvent `json:"events"` } -//InitRainbondRegionReq init rainbond region +// InitRainbondRegionReq init rainbond region +// //swagger:model InitRainbondRegionReq type InitRainbondRegionReq struct { Provider string `json:"providerName" binding:"required"` @@ -146,93 +169,102 @@ type InitRainbondRegionReq struct { Retry bool `json:"retry"` } -//InitRainbondTaskRes init rainbond region response +// InitRainbondTaskRes init rainbond region response +// //swagger:model InitRainbondTaskRes type InitRainbondTaskRes struct { model.InitRainbondTask } -//GetInitRainbondTaskReq get init rainbond task +// GetInitRainbondTaskReq get init rainbond task +// //swagger:model GetInitRainbondTaskReq type GetInitRainbondTaskReq struct { ProviderName string `form:"provider_name" binding:"required"` } // InitRainbondTaskListRes running init tasks +// //swagger:model InitRainbondTaskListRes type InitRainbondTaskListRes struct { Tasks []*model.InitRainbondTask `json:"tasks"` } // GetRegionConfigRes region configs +// //swagger:model GetRegionConfigRes type GetRegionConfigRes struct { Configs map[string]string `json:"configs"` ConfigYaml string `json:"configs_yaml"` } -//GetRegionConfigReq get rainbond region config +// GetRegionConfigReq get rainbond region config +// //swagger:model GetRegionConfigReq type GetRegionConfigReq struct { ProviderName string `form:"provider_name" binding:"required"` } -//UpdateInitRainbondTaskStatusReq update init task status +// UpdateInitRainbondTaskStatusReq update init task status +// //swagger:model UpdateInitRainbondTaskStatusReq type UpdateInitRainbondTaskStatusReq struct { Status string `json:"status" binding:"required"` } -//InitNodeCmdRes init node cmd +// InitNodeCmdRes init node cmd +// //swagger:model InitNodeCmdRes type InitNodeCmdRes struct { Cmd string `json:"cmd"` IsOffline bool `json:"isOffline"` } -//GetLogContentRes create kubernetes cluster log +// GetLogContentRes create kubernetes cluster log +// //swagger:model GetLogContentRes type GetLogContentRes struct { Content string `json:"content"` } -//GetKubeConfigRes get kubernetes cluster kubeconfig file +// GetKubeConfigRes get kubernetes cluster kubeconfig file +// //swagger:model GetKubeConfigRes type GetKubeConfigRes struct { Config string `json:"config"` } -//EventMessage event nsq message +// EventMessage event nsq message type EventMessage struct { EnterpriseID string TaskID string Message *Message } -//Body make body +// Body make body func (e *EventMessage) Body() []byte { b, _ := json.Marshal(e) return b } -//Message task exec log message +// Message task exec log message type Message struct { StepType string `json:"type"` Message string `json:"message"` Status string `json:"status"` } -//SetRainbondClusterConfigReq - +// SetRainbondClusterConfigReq - type SetRainbondClusterConfigReq struct { Config string `json:"config" binding:"required"` } -//UninstallRegionReq - +// UninstallRegionReq - type UninstallRegionReq struct { ProviderName string `json:"provider_name" binding:"required"` } -//UpdateKubernetesTask - +// UpdateKubernetesTask - type UpdateKubernetesTask struct { TaskID string `json:"taskID"` ClusterID string `json:"clusterID"` diff --git a/go.mod b/go.mod index 1310239..2f4e186 100644 --- a/go.mod +++ b/go.mod @@ -26,8 +26,8 @@ require ( github.com/swaggo/swag v1.6.7 github.com/tencentcloud/tencentcloud-sdk-go v3.0.233+incompatible github.com/urfave/cli/v2 v2.3.0 - golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e - golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f + golang.org/x/crypto v0.12.0 + golang.org/x/sync v0.1.0 gopkg.in/yaml.v2 v2.4.0 gorm.io/driver/mysql v1.0.5 gorm.io/driver/sqlite v1.1.4 @@ -179,13 +179,13 @@ require ( go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.19.1 // indirect - golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect + golang.org/x/net v0.10.0 // indirect golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect - golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect - golang.org/x/tools v0.1.10 // indirect + golang.org/x/tools v0.6.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20220714211235-042d03aeabc9 // indirect google.golang.org/grpc v1.48.0 // indirect diff --git a/go.sum b/go.sum index 59e7c05..32dfa7b 100644 --- a/go.sum +++ b/go.sum @@ -1858,6 +1858,8 @@ golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrb golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1899,6 +1901,7 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1981,6 +1984,8 @@ golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2013,6 +2018,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180117170059-2c42eef0765b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2157,11 +2164,15 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e h1:NHvCuwuS43lGnYhten69ZWqi2QOj/CiDNcKbVqwVoew= golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2174,6 +2185,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2277,6 +2290,8 @@ golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/handler/cluster.go b/internal/handler/cluster.go index 5916556..aba14fa 100644 --- a/internal/handler/cluster.go +++ b/internal/handler/cluster.go @@ -50,7 +50,7 @@ func NewClusterHandler(clusterUsecase *usecase.ClusterUsecase) *ClusterHandler { // // swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/kclusters cloud kcluster // -// ListKubernetesCluster +// # ListKubernetesCluster // // Produces: // - application/json @@ -82,7 +82,7 @@ func (e *ClusterHandler) ListKubernetesClusters(ctx *gin.Context) { // // swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/kclusters cloud kcluster // -// CreateKubernetesReq +// # CreateKubernetesReq // // Produces: // - application/json @@ -183,7 +183,7 @@ func (e *ClusterHandler) GetUpdateKubernetesTask(ctx *gin.Context) { // // swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/kclusters/{clusterID} cloud kcluster // -// DeleteKubernetesClusterReq +// # DeleteKubernetesClusterReq // // Produces: // - application/json @@ -216,7 +216,7 @@ func (e *ClusterHandler) DeleteKubernetesCluster(ctx *gin.Context) { // // swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/last-ck-task cloud kcluster // -// GetLastCreateKubernetesClusterTaskReq +// # GetLastCreateKubernetesClusterTaskReq // // Produces: // - application/json @@ -248,7 +248,7 @@ func (e *ClusterHandler) GetLastAddKubernetesClusterTask(ctx *gin.Context) { // // swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/ck-task/{taskID} cloud kcluster // -// GetLastCreateKubernetesClusterTaskReq +// # GetLastCreateKubernetesClusterTaskReq // // Produces: // - application/json @@ -275,7 +275,7 @@ func (e *ClusterHandler) GetAddKubernetesClusterTask(ctx *gin.Context) { // // swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/ck-task/{taskID}/events cloud kcluster // -// GetTaskEventListReq +// # GetTaskEventListReq // // Produces: // - application/json @@ -298,7 +298,7 @@ func (e *ClusterHandler) GetTaskEventList(ctx *gin.Context) { ginutil.JSON(ctx, v1.TaskEventListRes{Events: events}, nil) } -//AddAccessKey add access keys +// AddAccessKey add access keys func (e *ClusterHandler) AddAccessKey(ctx *gin.Context) { var req v1.AddAccessKey if err := ctx.ShouldBindJSON(&req); err != nil { @@ -315,7 +315,7 @@ func (e *ClusterHandler) AddAccessKey(ctx *gin.Context) { ginutil.JSON(ctx, clusters, nil) } -//GetAccessKey add access keys +// GetAccessKey add access keys func (e *ClusterHandler) GetAccessKey(ctx *gin.Context) { var req v1.GetAccessKeyReq if err := ctx.ShouldBindQuery(&req); err != nil { @@ -337,7 +337,7 @@ func (e *ClusterHandler) GetAccessKey(ctx *gin.Context) { // // swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/init-task/{clusterID} cloud init // -// GetInitRainbondTaskReq +// # GetInitRainbondTaskReq // // Produces: // - application/json @@ -366,7 +366,7 @@ func (e *ClusterHandler) GetInitRainbondTask(ctx *gin.Context) { // // swagger:route POST /enterprise-server/api/v1/enterprises/{eid}/init-cluster cloud init // -// InitRainbondRegionReq +// # InitRainbondRegionReq // // Produces: // - application/json @@ -398,7 +398,6 @@ func (e *ClusterHandler) CreateInitRainbondTask(ctx *gin.Context) { // // swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/init-task/{clusterID} cloud init // -// // Produces: // - application/json // Schemes: http @@ -419,11 +418,11 @@ func (e *ClusterHandler) GetRunningInitRainbondTask(ctx *gin.Context) { ginutil.JSON(ctx, v1.InitRainbondTaskListRes{Tasks: tasks}, nil) } -//GetRegionConfig get region config file +// GetRegionConfig get region config file // // swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/kclusters/{clusterID}/regionconfig cloud kcluster // -// GetRegionConfigReq +// # GetRegionConfigReq // // Produces: // - application/json @@ -453,11 +452,11 @@ func (e *ClusterHandler) GetRegionConfig(ctx *gin.Context) { ginutil.JSON(ctx, v1.GetRegionConfigRes{Configs: configs, ConfigYaml: string(out)}, nil) } -//UpdateInitRainbondTaskStatus get region config file +// UpdateInitRainbondTaskStatus get region config file // // swagger:route PUT /enterprise-server/api/v1/enterprises/{eid}/init-tasks/{taskID}/status cloud init // -// UpdateInitRainbondTaskStatusReq +// # UpdateInitRainbondTaskStatusReq // // Produces: // - application/json @@ -486,11 +485,10 @@ func (e *ClusterHandler) UpdateInitRainbondTaskStatus(ctx *gin.Context) { ginutil.JSON(ctx, task, nil) } -//GetInitNodeCmd get node init cmd shell +// GetInitNodeCmd get node init cmd shell // // swagger:route GET /enterprise-server/api/v1/init_node_cmd cloud init // -// // Produces: // - application/json // Schemes: http @@ -504,10 +502,35 @@ func (e *ClusterHandler) GetInitNodeCmd(c *gin.Context) { ginutil.JSONv2(c, res, err) } -//GetLogContent get rke create kubernetes log +// check ssh connect // -// swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/kclusters/{clusterID}/create_log cloud init +// swagger:route GET /enterprise-server/api/v1/check_ssh // +// Produces: +// - application/json +// Schemes: http +// Consumes: +// - application/json +// +// Responses: +// 200: body:bool +func (e *ClusterHandler) CheckSSH(ctx *gin.Context) { + var req v1.CheckSSHReq + err := ctx.ShouldBindJSON(&req) + if err != nil { + ginutil.JSON(ctx, nil, bcode.BadRequest) + } + r, err := e.cluster.CheckSSHConnect(req.Host, req.Port) + if err != nil { + ginutil.JSON(ctx, r, err) + return + } + ginutil.JSON(ctx, r) +} + +// GetLogContent get rke create kubernetes log +// +// swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/kclusters/{clusterID}/create_log cloud init // // Produces: // - application/json @@ -534,7 +557,6 @@ func (e *ClusterHandler) GetLogContent(ctx *gin.Context) { // // swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/kclusters/{clusterID}/reinstall cloud kcluster // -// // Produces: // - application/json // Schemes: http @@ -554,11 +576,11 @@ func (e *ClusterHandler) ReInstallKubernetesCluster(ctx *gin.Context) { ginutil.JSON(ctx, task, nil) } -//GetKubeConfig get kubernetes cluster config +// GetKubeConfig get kubernetes cluster config // // swagger:route GET /enterprise-server/api/v1/enterprises/{eid}/kclusters/{clusterID}/kubeconfig cloud init // -// GetRegionConfigReq +// # GetRegionConfigReq // // Produces: // - application/json @@ -586,7 +608,7 @@ func (e *ClusterHandler) GetKubeConfig(ctx *gin.Context) { ginutil.JSON(ctx, v1.GetKubeConfigRes{Config: kubeconfig}, nil) } -//GetRainbondClusterConfig - +// GetRainbondClusterConfig - func (e *ClusterHandler) GetRainbondClusterConfig(ctx *gin.Context) { eid := ctx.Param("eid") clusterID := ctx.Param("clusterID") @@ -652,7 +674,7 @@ func (e *ClusterHandler) GetRainbondClusterConfig(ctx *gin.Context) { ginutil.JSON(ctx, re, nil) } -//SetRainbondClusterConfig - +// SetRainbondClusterConfig - func (e *ClusterHandler) SetRainbondClusterConfig(ctx *gin.Context) { eid := ctx.Param("eid") clusterID := ctx.Param("clusterID") @@ -670,7 +692,7 @@ func (e *ClusterHandler) SetRainbondClusterConfig(ctx *gin.Context) { ginutil.JSON(ctx, nil, nil) } -//UninstallRegion - +// UninstallRegion - func (e *ClusterHandler) UninstallRegion(ctx *gin.Context) { eid := ctx.Param("eid") clusterID := ctx.Param("clusterID") diff --git a/internal/handler/router.go b/internal/handler/router.go index bf5f608..5a16b56 100644 --- a/internal/handler/router.go +++ b/internal/handler/router.go @@ -53,7 +53,7 @@ func NewRouter( } } -//SetCORS Enables cross-site script calls. +// SetCORS Enables cross-site script calls. func SetCORS(ctx *gin.Context) { origin := ctx.GetHeader("Origin") ctx.Writer.Header().Add("Access-Control-Allow-Origin", origin) @@ -62,7 +62,7 @@ func SetCORS(ctx *gin.Context) { ctx.Writer.Header().Add("Access-Control-Allow-Headers", "x-requested-with,content-type,Authorization,X-Token") } -//CORSMidle - +// CORSMidle - var CORSMidle = func(f gin.HandlerFunc) gin.HandlerFunc { return func(ctx *gin.Context) { SetCORS(ctx) @@ -82,6 +82,8 @@ func (r *Router) NewRouter() *gin.Engine { apiv1.GET("/backup", r.system.Backup) apiv1.POST("/recover", r.system.Recover) apiv1.GET("/init_node_cmd", r.cluster.GetInitNodeCmd) + apiv1.POST("/check_ssh", r.cluster.CheckSSH) + apiv1.POST("/helm/chart", CORSMidle(r.helm.GetHelmCommand)) entv1 := apiv1.Group("/enterprises/:eid") // cluster diff --git a/internal/usecase/cluster.go b/internal/usecase/cluster.go index 0358288..2c9041d 100644 --- a/internal/usecase/cluster.go +++ b/internal/usecase/cluster.go @@ -36,6 +36,7 @@ import ( "github.com/pkg/errors" v3 "github.com/rancher/rke/types" "github.com/sirupsen/logrus" + checckssh "golang.org/x/crypto/ssh" v1 "goodrain.com/cloud-adaptor/api/cloud-adaptor/v1" "goodrain.com/cloud-adaptor/cmd/cloud-adaptor/config" "goodrain.com/cloud-adaptor/internal/adaptor" @@ -102,7 +103,7 @@ func NewClusterUsecase(db *gorm.DB, } } -//ListKubernetesCluster list kubernetes cluster +// ListKubernetesCluster list kubernetes cluster func (c *ClusterUsecase) ListKubernetesCluster(eid string, re v1.ListKubernetesCluster) ([]*v1alpha1.Cluster, error) { var ad adaptor.RainbondClusterAdaptor var err error @@ -138,7 +139,7 @@ func (c *ClusterUsecase) ListKubernetesCluster(eid string, re v1.ListKubernetesC return clusters, nil } -//CreateKubernetesCluster create kubernetes cluster task +// CreateKubernetesCluster create kubernetes cluster task func (c *ClusterUsecase) CreateKubernetesCluster(eid string, req v1.CreateKubernetesReq) (*model.CreateKubernetesTask, error) { if c.TaskProducer == nil { return nil, errors.New("TaskProducer is nil") @@ -302,7 +303,7 @@ func (c *ClusterUsecase) rkeConfigToNodeList(rkeConfig *v3.RancherKubernetesEngi return nodeList, nil } -//InitRainbondRegion init rainbond region +// InitRainbondRegion init rainbond region func (c *ClusterUsecase) InitRainbondRegion(ctx context.Context, eid string, req v1.InitRainbondRegionReq) (*model.InitRainbondTask, error) { oldTask, err := c.InitRainbondTaskRepo.GetTaskByClusterID(eid, req.Provider, req.ClusterID) if err != nil && !errors.Is(err, bcode.ErrInitRainbondTaskNotFound) { @@ -357,7 +358,7 @@ func (c *ClusterUsecase) InitRainbondRegion(ctx context.Context, eid string, req return newTask, nil } -//UpdateKubernetesCluster - +// UpdateKubernetesCluster - func (c *ClusterUsecase) UpdateKubernetesCluster(eid string, req v1.UpdateKubernetesReq) (*v1.UpdateKubernetesTask, error) { if c.TaskProducer == nil { logrus.Errorf("TaskProducer is nil") @@ -449,7 +450,7 @@ func (c *ClusterUsecase) isLastTaskComplete(eid, clusterID string) (int, error) return 0, nil } -//GetInitRainbondTaskByClusterID get init rainbond task +// GetInitRainbondTaskByClusterID get init rainbond task func (c *ClusterUsecase) GetInitRainbondTaskByClusterID(eid, clusterID, providerName string) (*model.InitRainbondTask, error) { task, err := c.InitRainbondTaskRepo.GetTaskByClusterID(eid, providerName, clusterID) if err != nil { @@ -474,7 +475,7 @@ func (c *ClusterUsecase) GetInitRainbondTaskByClusterID(eid, clusterID, provider return task, nil } -//GetUpdateKubernetesTask get update kubernetes task +// GetUpdateKubernetesTask get update kubernetes task func (c *ClusterUsecase) GetUpdateKubernetesTask(eid, clusterID, providerName string) (*v1.UpdateKubernetesRes, error) { var clusterName string if providerName == "rke" { @@ -565,7 +566,7 @@ func (c *ClusterUsecase) getRKEConfig(eid string, cluster *model.RKECluster) (*v return &rkeConfig, nil } -//GetRKENodeList get rke kubernetes node list +// GetRKENodeList get rke kubernetes node list func (c *ClusterUsecase) GetRKENodeList(eid, clusterID string) (v1alpha1.NodeList, error) { cluster, err := repo.NewRKEClusterRepo(c.DB).GetCluster(eid, clusterID) if err != nil { @@ -578,7 +579,7 @@ func (c *ClusterUsecase) GetRKENodeList(eid, clusterID string) (v1alpha1.NodeLis return nodes, nil } -//AddAccessKey add accesskey info to enterprise +// AddAccessKey add accesskey info to enterprise func (c *ClusterUsecase) AddAccessKey(eid string, key v1.AddAccessKey) (*model.CloudAccessKey, error) { ack, err := c.GetByProviderAndEnterprise(key.ProviderName, eid) if err != nil && err != bcode.ErrorNotSetAccessKey { @@ -600,7 +601,7 @@ func (c *ClusterUsecase) AddAccessKey(eid string, key v1.AddAccessKey) (*model.C return ck, nil } -//GetByProviderAndEnterprise get by eid +// GetByProviderAndEnterprise get by eid func (c *ClusterUsecase) GetByProviderAndEnterprise(providerName, eid string) (*model.CloudAccessKey, error) { key, err := c.CloudAccessKeyRepo.GetByProviderAndEnterprise(providerName, eid) if err != nil { @@ -612,7 +613,7 @@ func (c *ClusterUsecase) GetByProviderAndEnterprise(providerName, eid string) (* return key, nil } -//CreateTaskEvent create task event +// CreateTaskEvent create task event func (c *ClusterUsecase) CreateTaskEvent(em *v1.EventMessage) (*model.TaskEvent, error) { if em.Message == nil { return nil, fmt.Errorf("message is nil") @@ -682,7 +683,7 @@ func (c *ClusterUsecase) reasonFromMessage(message string) string { return "" } -//ListTaskEvent list task event list +// ListTaskEvent list task event list func (c *ClusterUsecase) ListTaskEvent(eid, taskID string) ([]*model.TaskEvent, error) { task, err := c.getTask(eid, taskID) if err != nil { @@ -786,7 +787,7 @@ func (c *ClusterUsecase) getTask(eid, taskID string) (*domain.ClusterTask, error return task, nil } -//GetLastCreateKubernetesTask get last create kubernetes task +// GetLastCreateKubernetesTask get last create kubernetes task func (c *ClusterUsecase) GetLastCreateKubernetesTask(eid, providerName string) (*model.CreateKubernetesTask, error) { task, err := c.CreateKubernetesTaskRepo.GetLastTask(eid, providerName) if err != nil { @@ -816,7 +817,7 @@ func (c *ClusterUsecase) GetLastCreateKubernetesTask(eid, providerName string) ( }, nil } -//GetCreateKubernetesTask get task +// GetCreateKubernetesTask get task func (c *ClusterUsecase) GetCreateKubernetesTask(eid, taskID string) (*model.CreateKubernetesTask, error) { task, err := c.CreateKubernetesTaskRepo.GetTask(eid, taskID) if err != nil { @@ -843,7 +844,7 @@ func (c *ClusterUsecase) GetCreateKubernetesTask(eid, taskID string) (*model.Cre return task, err } -//GetTaskRunningLists get runinig tasks +// GetTaskRunningLists get runinig tasks func (c *ClusterUsecase) GetTaskRunningLists(eid string) ([]*model.InitRainbondTask, error) { tasks, err := c.InitRainbondTaskRepo.GetTaskRunningLists(eid) if err != nil { @@ -857,7 +858,7 @@ func (c *ClusterUsecase) GetTaskRunningLists(eid string) ([]*model.InitRainbondT return tasks, nil } -//GetKubeConfig get kube config file +// GetKubeConfig get kube config file func (c *ClusterUsecase) GetKubeConfig(eid, clusterID, providerName string) (string, error) { var ad adaptor.RainbondClusterAdaptor var err error @@ -883,7 +884,7 @@ func (c *ClusterUsecase) GetKubeConfig(eid, clusterID, providerName string) (str return kube.Config, nil } -//GetRegionConfig get region config +// GetRegionConfig get region config func (c *ClusterUsecase) GetRegionConfig(eid, clusterID, providerName string) (map[string]string, error) { var ad adaptor.RainbondClusterAdaptor var err error @@ -928,7 +929,7 @@ func (c *ClusterUsecase) GetRegionConfig(eid, clusterID, providerName string) (m return nil, nil } -//UpdateInitRainbondTaskStatus update init rainbond task status +// UpdateInitRainbondTaskStatus update init rainbond task status func (c *ClusterUsecase) UpdateInitRainbondTaskStatus(eid, taskID, status string) (*model.InitRainbondTask, error) { if err := c.InitRainbondTaskRepo.UpdateStatus(eid, taskID, status); err != nil { if err == gorm.ErrRecordNotFound { @@ -946,7 +947,7 @@ func (c *ClusterUsecase) UpdateInitRainbondTaskStatus(eid, taskID, status string return task, nil } -//DeleteKubernetesCluster delete provider +// DeleteKubernetesCluster delete provider func (c *ClusterUsecase) DeleteKubernetesCluster(eid, clusterID, providerName string) error { var ad adaptor.RainbondClusterAdaptor var err error @@ -968,7 +969,7 @@ func (c *ClusterUsecase) DeleteKubernetesCluster(eid, clusterID, providerName st return ad.DeleteCluster(eid, clusterID) } -//GetCluster get cluster +// GetCluster get cluster func (c *ClusterUsecase) GetCluster(providerName, eid, clusterID string) (*v1alpha1.Cluster, error) { var ad adaptor.RainbondClusterAdaptor var err error @@ -990,7 +991,7 @@ func (c *ClusterUsecase) GetCluster(providerName, eid, clusterID string) (*v1alp return ad.DescribeCluster(eid, clusterID) } -//InstallCluster install cluster +// InstallCluster install cluster func (c *ClusterUsecase) InstallCluster(eid, clusterID string) (*model.CreateKubernetesTask, error) { if c.TaskProducer == nil { logrus.Errorf("TaskProducer is nil") @@ -1053,7 +1054,7 @@ func (c *ClusterUsecase) InstallCluster(eid, clusterID string) (*model.CreateKub return newTask, nil } -//SetRainbondClusterConfig set rainbond cluster config +// SetRainbondClusterConfig set rainbond cluster config func (c *ClusterUsecase) SetRainbondClusterConfig(eid, clusterID, config string) error { var rbcc rainbondv1alpha1.RainbondCluster if err := yaml.Unmarshal([]byte(config), &rbcc); err != nil { @@ -1068,7 +1069,7 @@ func (c *ClusterUsecase) SetRainbondClusterConfig(eid, clusterID, config string) }) } -//GetRainbondClusterConfig get rainbond cluster config +// GetRainbondClusterConfig get rainbond cluster config func (c *ClusterUsecase) GetRainbondClusterConfig(eid, clusterID string) (*rainbondv1alpha1.RainbondCluster, string) { rcc, _ := c.RainbondClusterConfigRepo.Get(clusterID) if rcc != nil { @@ -1082,7 +1083,7 @@ func (c *ClusterUsecase) GetRainbondClusterConfig(eid, clusterID string) (*rainb return nil, "" } -//UninstallRainbondRegion uninstall rainbond region +// UninstallRainbondRegion uninstall rainbond region func (c *ClusterUsecase) UninstallRainbondRegion(eid, clusterID, provider string) error { if os.Getenv("DISABLE_UNINSTALL_REGION") == "true" { logrus.Info("uninstall rainbond region is disable") @@ -1207,6 +1208,39 @@ func (c *ClusterUsecase) GetInitNodeCmd(ctx context.Context) (*v1.InitNodeCmdRes }, nil } +func (c *ClusterUsecase) CheckSSHConnect(host string, port uint) (bool, error) { + // 读取私钥文件 + key, err := ioutil.ReadFile("/root/.ssh/id_rsa") + if err != nil { + return false, bcode.ErrSSHFileNotFond + } + + // 使用私钥创建一个Signer + signer, err := checckssh.ParsePrivateKey(key) + if err != nil { + return false, bcode.ErrParseSSH + } + + // 配置SSH客户端参数 + config := &checckssh.ClientConfig{ + User: "root", + Auth: []checckssh.AuthMethod{ + checckssh.PublicKeys(signer), + }, + Timeout: 5 * time.Second, + HostKeyCallback: checckssh.InsecureIgnoreHostKey(), + } + + // 尝试连接目标主机 + conn, err := checckssh.Dial("tcp", fmt.Sprintf("%s:%d", host, port), config) + + if err != nil { + return false, bcode.ErrConnect + } + defer conn.Close() + return true, nil +} + // ListRainbondComponents - func (c *ClusterUsecase) ListRainbondComponents(ctx context.Context, eid, clusterID, providerName string) ([]*v1.RainbondComponent, error) { kubeConfig, err := c.GetKubeConfig(eid, clusterID, providerName) diff --git a/pkg/bcode/cluster_bcode.go b/pkg/bcode/cluster_bcode.go index cb53207..caa4a22 100644 --- a/pkg/bcode/cluster_bcode.go +++ b/pkg/bcode/cluster_bcode.go @@ -73,4 +73,9 @@ var ( ErrRainbondClusterInstalled = newByMessage(409, 7028, "rainbond cluster is already installed") ErrClusterTaskNotFound = newByMessage(404, 7029, "cluster task not found") + + //check ssh error + ErrSSHFileNotFond = newByMessage(200, 9000, "file /root/.ssh/id_rsa not found") + ErrParseSSH = newByMessage(200, 9001, "parse private key error") + ErrConnect = newByMessage(200, 9002, "failed to connect remote host") ) From da4e9a7e2e9ad021bceb4b90e31a9c0b85cea63f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E6=9C=88=E9=95=BF=E7=A9=BA?= <1666888816@qq.com> Date: Sun, 20 Aug 2023 23:43:31 +0800 Subject: [PATCH 2/5] feat: support check ssh --- internal/handler/cluster.go | 1 + internal/usecase/cluster.go | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/handler/cluster.go b/internal/handler/cluster.go index aba14fa..12b9fd4 100644 --- a/internal/handler/cluster.go +++ b/internal/handler/cluster.go @@ -519,6 +519,7 @@ func (e *ClusterHandler) CheckSSH(ctx *gin.Context) { err := ctx.ShouldBindJSON(&req) if err != nil { ginutil.JSON(ctx, nil, bcode.BadRequest) + return } r, err := e.cluster.CheckSSHConnect(req.Host, req.Port) if err != nil { diff --git a/internal/usecase/cluster.go b/internal/usecase/cluster.go index 2c9041d..b2c99c0 100644 --- a/internal/usecase/cluster.go +++ b/internal/usecase/cluster.go @@ -219,7 +219,7 @@ func (c *ClusterUsecase) CreateKubernetesCluster(eid string, req v1.CreateKubern if err := c.CreateKubernetesTaskRepo.Create(newTask); err != nil { return nil, errors.Wrap(err, "create kubernetes task") } - //send task + // send task taskReq := types.KubernetesConfigMessage{ EnterpriseID: eid, TaskID: newTask.TaskID, @@ -397,7 +397,7 @@ func (c *ClusterUsecase) UpdateKubernetesCluster(eid string, req v1.UpdateKubern return nil, errors.Wrap(err, "save update kubernetes task failure") } - //send task + // send task taskReq := types.UpdateKubernetesConfigMessage{ EnterpriseID: eid, TaskID: newTask.TaskID, @@ -1033,7 +1033,7 @@ func (c *ClusterUsecase) InstallCluster(eid, clusterID string) (*model.CreateKub return nil, err } - //send task + // send task taskReq := types.KubernetesConfigMessage{ EnterpriseID: eid, TaskID: newTask.TaskID, @@ -1128,6 +1128,7 @@ func (c *ClusterUsecase) UninstallRainbondRegion(eid, clusterID, provider string func (c *ClusterUsecase) PruneUpdateRKEConfig(req *v1.PruneUpdateRKEConfigReq) (*v1.PruneUpdateRKEConfigResp, error) { var rkeConfig *v3.RancherKubernetesEngineConfig if req.EncodedRKEConfig == "" { + rkeConfig = v1alpha1.GetDefaultRKECreateClusterConfig(v1alpha1.KubernetesClusterConfig{ Nodes: req.Nodes, }).(*v3.RancherKubernetesEngineConfig) @@ -1223,7 +1224,7 @@ func (c *ClusterUsecase) CheckSSHConnect(host string, port uint) (bool, error) { // 配置SSH客户端参数 config := &checckssh.ClientConfig{ - User: "root", + User: "docker", Auth: []checckssh.AuthMethod{ checckssh.PublicKeys(signer), }, From b6c3cb75ab9864fb62600d9aa68b7503fbc9047e Mon Sep 17 00:00:00 2001 From: zhangxiaoyuan <1666888816@qq.com> Date: Mon, 21 Aug 2023 09:34:57 +0800 Subject: [PATCH 3/5] feat: update ssh package --- internal/handler/cluster.go | 3 ++- internal/usecase/cluster.go | 34 -------------------------- pkg/util/ssh/key.go | 48 ++++++++++++++++++++++++++++++++----- 3 files changed, 44 insertions(+), 41 deletions(-) diff --git a/internal/handler/cluster.go b/internal/handler/cluster.go index 12b9fd4..64ddbbf 100644 --- a/internal/handler/cluster.go +++ b/internal/handler/cluster.go @@ -19,6 +19,7 @@ package handler import ( + "goodrain.com/cloud-adaptor/pkg/util/ssh" "io/ioutil" "strings" @@ -521,7 +522,7 @@ func (e *ClusterHandler) CheckSSH(ctx *gin.Context) { ginutil.JSON(ctx, nil, bcode.BadRequest) return } - r, err := e.cluster.CheckSSHConnect(req.Host, req.Port) + r, err := ssh.CheckSSHConnect(req.Host, req.Port) if err != nil { ginutil.JSON(ctx, r, err) return diff --git a/internal/usecase/cluster.go b/internal/usecase/cluster.go index b2c99c0..1df22c4 100644 --- a/internal/usecase/cluster.go +++ b/internal/usecase/cluster.go @@ -36,7 +36,6 @@ import ( "github.com/pkg/errors" v3 "github.com/rancher/rke/types" "github.com/sirupsen/logrus" - checckssh "golang.org/x/crypto/ssh" v1 "goodrain.com/cloud-adaptor/api/cloud-adaptor/v1" "goodrain.com/cloud-adaptor/cmd/cloud-adaptor/config" "goodrain.com/cloud-adaptor/internal/adaptor" @@ -1209,39 +1208,6 @@ func (c *ClusterUsecase) GetInitNodeCmd(ctx context.Context) (*v1.InitNodeCmdRes }, nil } -func (c *ClusterUsecase) CheckSSHConnect(host string, port uint) (bool, error) { - // 读取私钥文件 - key, err := ioutil.ReadFile("/root/.ssh/id_rsa") - if err != nil { - return false, bcode.ErrSSHFileNotFond - } - - // 使用私钥创建一个Signer - signer, err := checckssh.ParsePrivateKey(key) - if err != nil { - return false, bcode.ErrParseSSH - } - - // 配置SSH客户端参数 - config := &checckssh.ClientConfig{ - User: "docker", - Auth: []checckssh.AuthMethod{ - checckssh.PublicKeys(signer), - }, - Timeout: 5 * time.Second, - HostKeyCallback: checckssh.InsecureIgnoreHostKey(), - } - - // 尝试连接目标主机 - conn, err := checckssh.Dial("tcp", fmt.Sprintf("%s:%d", host, port), config) - - if err != nil { - return false, bcode.ErrConnect - } - defer conn.Close() - return true, nil -} - // ListRainbondComponents - func (c *ClusterUsecase) ListRainbondComponents(ctx context.Context, eid, clusterID, providerName string) ([]*v1.RainbondComponent, error) { kubeConfig, err := c.GetKubeConfig(eid, clusterID, providerName) diff --git a/pkg/util/ssh/key.go b/pkg/util/ssh/key.go index ea86cd9..4c6398b 100644 --- a/pkg/util/ssh/key.go +++ b/pkg/util/ssh/key.go @@ -24,16 +24,18 @@ import ( "crypto/x509" "encoding/pem" "fmt" + "goodrain.com/cloud-adaptor/pkg/bcode" "io/ioutil" "os" "path" + "time" "github.com/sirupsen/logrus" "golang.org/x/crypto/ssh" "k8s.io/client-go/util/homedir" ) -//GenerateKey - +// GenerateKey - func GenerateKey(bits int) (*rsa.PrivateKey, *rsa.PublicKey, error) { private, err := rsa.GenerateKey(rand.Reader, bits) if err != nil { @@ -43,7 +45,7 @@ func GenerateKey(bits int) (*rsa.PrivateKey, *rsa.PublicKey, error) { } -//EncodePrivateKey - +// EncodePrivateKey - func EncodePrivateKey(private *rsa.PrivateKey) []byte { return pem.EncodeToMemory(&pem.Block{ Bytes: x509.MarshalPKCS1PrivateKey(private), @@ -51,7 +53,7 @@ func EncodePrivateKey(private *rsa.PrivateKey) []byte { }) } -//EncodePublicKey - +// EncodePublicKey - func EncodePublicKey(public *rsa.PublicKey) ([]byte, error) { publicBytes, err := x509.MarshalPKIXPublicKey(public) if err != nil { @@ -63,7 +65,7 @@ func EncodePublicKey(public *rsa.PublicKey) ([]byte, error) { }), nil } -//EncodeSSHKey - +// EncodeSSHKey - func EncodeSSHKey(public *rsa.PublicKey) ([]byte, error) { publicKey, err := ssh.NewPublicKey(public) if err != nil { @@ -72,7 +74,7 @@ func EncodeSSHKey(public *rsa.PublicKey) ([]byte, error) { return ssh.MarshalAuthorizedKey(publicKey), nil } -//MakeSSHKeyPair - +// MakeSSHKeyPair - func MakeSSHKeyPair() (string, string, error) { pkey, pubkey, err := GenerateKey(2048) @@ -88,7 +90,7 @@ func MakeSSHKeyPair() (string, string, error) { return string(EncodePrivateKey(pkey)), string(pub), nil } -//GetOrMakeSSHRSA get or make ssh rsa +// GetOrMakeSSHRSA get or make ssh rsa func GetOrMakeSSHRSA() (string, error) { home := homedir.HomeDir() if _, err := os.Stat(path.Join(home, ".ssh")); err != nil && os.IsNotExist(err) { @@ -122,3 +124,37 @@ func GetOrMakeSSHRSA() (string, error) { } return string(pub), nil } + +// check ssh connection +func CheckSSHConnect(host string, port uint) (bool, error) { + // 读取私钥文件 + key, err := ioutil.ReadFile("/root/.ssh/id_rsa") + if err != nil { + return false, bcode.ErrSSHFileNotFond + } + + // 使用私钥创建一个Signer + signer, err := ssh.ParsePrivateKey(key) + if err != nil { + return false, bcode.ErrParseSSH + } + + // 配置SSH客户端参数 + config := &ssh.ClientConfig{ + User: "docker", + Auth: []ssh.AuthMethod{ + ssh.PublicKeys(signer), + }, + Timeout: 5 * time.Second, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + } + + // 尝试连接目标主机 + conn, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", host, port), config) + + if err != nil { + return false, bcode.ErrConnect + } + defer conn.Close() + return true, nil +} From fb9c37a70d5ae53abf2353ea47ed36787893f011 Mon Sep 17 00:00:00 2001 From: zhangxiaoyuan <1666888816@qq.com> Date: Mon, 21 Aug 2023 09:51:23 +0800 Subject: [PATCH 4/5] feat: update ssh package --- pkg/util/ssh/key.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pkg/util/ssh/key.go b/pkg/util/ssh/key.go index 4c6398b..9f7b2e5 100644 --- a/pkg/util/ssh/key.go +++ b/pkg/util/ssh/key.go @@ -25,7 +25,6 @@ import ( "encoding/pem" "fmt" "goodrain.com/cloud-adaptor/pkg/bcode" - "io/ioutil" "os" "path" "time" @@ -107,10 +106,10 @@ func GetOrMakeSSHRSA() (string, error) { return "", fmt.Errorf("create ssh rsa failure %s", err.Error()) } logrus.Infof("init ssh rsa file %s %s ", idRsaPath, idRsaPubPath) - if err := ioutil.WriteFile(idRsaPath, []byte(private), 0600); err != nil { + if err := os.WriteFile(idRsaPath, []byte(private), 0600); err != nil { return "", fmt.Errorf("write ssh rsa file failure %s", err.Error()) } - if err := ioutil.WriteFile(idRsaPubPath, []byte(pub), 0644); err != nil { + if err := os.WriteFile(idRsaPubPath, []byte(pub), 0644); err != nil { return "", fmt.Errorf("write ssh rsa pub file failure %s", err.Error()) } return pub, nil @@ -118,7 +117,7 @@ func GetOrMakeSSHRSA() (string, error) { if err != nil { return "", err } - pub, err := ioutil.ReadFile(idRsaPubPath) + pub, err := os.ReadFile(idRsaPubPath) if err != nil { return "", fmt.Errorf("read rsa pub file failure %s", err.Error()) } @@ -128,7 +127,7 @@ func GetOrMakeSSHRSA() (string, error) { // check ssh connection func CheckSSHConnect(host string, port uint) (bool, error) { // 读取私钥文件 - key, err := ioutil.ReadFile("/root/.ssh/id_rsa") + key, err := os.ReadFile("/root/.ssh/id_rsa") if err != nil { return false, bcode.ErrSSHFileNotFond } From 0b5bb705dd8e0b3701967b0094541b2aa0d44180 Mon Sep 17 00:00:00 2001 From: zhangxiaoyuan <1666888816@qq.com> Date: Mon, 21 Aug 2023 18:30:26 +0800 Subject: [PATCH 5/5] feat: support data is not object --- api/cloud-adaptor/v1/cluster.go | 4 ++++ internal/handler/cluster.go | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/api/cloud-adaptor/v1/cluster.go b/api/cloud-adaptor/v1/cluster.go index e776d09..b705ac8 100644 --- a/api/cloud-adaptor/v1/cluster.go +++ b/api/cloud-adaptor/v1/cluster.go @@ -72,6 +72,10 @@ type CheckSSHReq struct { Port uint `json:"port"` } +type CheckSSHRes struct { + Status bool `json:"status"` +} + // AccessKeyResponse access key // //swagger:model AccessKeyResponse diff --git a/internal/handler/cluster.go b/internal/handler/cluster.go index 64ddbbf..924db3e 100644 --- a/internal/handler/cluster.go +++ b/internal/handler/cluster.go @@ -527,7 +527,10 @@ func (e *ClusterHandler) CheckSSH(ctx *gin.Context) { ginutil.JSON(ctx, r, err) return } - ginutil.JSON(ctx, r) + var res = v1.CheckSSHRes{ + Status: r, + } + ginutil.JSON(ctx, res) } // GetLogContent get rke create kubernetes log