From 56ea8211a8be4f66183682f5600c016fed99f742 Mon Sep 17 00:00:00 2001 From: Ehco Date: Fri, 26 Nov 2021 18:57:51 +0800 Subject: [PATCH] openapi(dm): support config relay when create source (#3600) --- dm/dm/config/source_converter.go | 98 ++++++++++++++++ dm/dm/config/source_converter_test.go | 41 +++++++ dm/dm/master/openapi.go | 63 +--------- dm/openapi/fixtures/source.go | 57 +++++++++ dm/openapi/gen.server.go | 159 +++++++++++++------------- dm/openapi/gen.types.go | 17 +++ dm/openapi/spec/dm.yaml | 24 ++++ 7 files changed, 319 insertions(+), 140 deletions(-) create mode 100644 dm/dm/config/source_converter.go create mode 100644 dm/dm/config/source_converter_test.go create mode 100644 dm/openapi/fixtures/source.go diff --git a/dm/dm/config/source_converter.go b/dm/dm/config/source_converter.go new file mode 100644 index 00000000000..bb8edf3dc3f --- /dev/null +++ b/dm/dm/config/source_converter.go @@ -0,0 +1,98 @@ +// Copyright 2021 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "github.com/pingcap/ticdc/dm/openapi" +) + +// SourceCfgToOpenAPISource converter SourceConfig to openapi.Source. +func SourceCfgToOpenAPISource(cfg *SourceConfig) openapi.Source { + source := openapi.Source{ + EnableGtid: cfg.EnableGTID, + Host: cfg.From.Host, + Password: "******", // PM's requirement, we always return obfuscated password to user + Port: cfg.From.Port, + SourceName: cfg.SourceID, + User: cfg.From.User, + Purge: &openapi.Purge{ + Expires: &cfg.Purge.Expires, + Interval: &cfg.Purge.Interval, + RemainSpace: &cfg.Purge.RemainSpace, + }, + RelayConfig: &openapi.RelayConfig{ + EnableRelay: &cfg.EnableRelay, + RelayBinlogGtid: &cfg.RelayBinlogGTID, + RelayBinlogName: &cfg.RelayBinLogName, + RelayDir: &cfg.RelayDir, + }, + } + if cfg.From.Security != nil { + // NOTE we don't return security content here, because we don't want to expose it to the user. + var certAllowedCn []string + certAllowedCn = append(certAllowedCn, cfg.From.Security.CertAllowedCN...) + source.Security = &openapi.Security{CertAllowedCn: &certAllowedCn} + } + return source +} + +// OpenAPISourceToSourceCfg converter openapi.Source to SourceConfig. +func OpenAPISourceToSourceCfg(source openapi.Source) *SourceConfig { + cfg := NewSourceConfig() + from := DBConfig{ + Host: source.Host, + Port: source.Port, + User: source.User, + Password: source.Password, + } + if source.Security != nil { + from.Security = &Security{ + SSLCABytes: []byte(source.Security.SslCaContent), + SSLKEYBytes: []byte(source.Security.SslKeyContent), + SSLCertBytes: []byte(source.Security.SslCertContent), + } + if source.Security.CertAllowedCn != nil { + from.Security.CertAllowedCN = *source.Security.CertAllowedCn + } + } + cfg.From = from + cfg.EnableGTID = source.EnableGtid + cfg.SourceID = source.SourceName + if purge := source.Purge; purge != nil { + if purge.Expires != nil { + cfg.Purge.Expires = *purge.Expires + } + if purge.Interval != nil { + cfg.Purge.Interval = *purge.Interval + } + if purge.RemainSpace != nil { + cfg.Purge.RemainSpace = *purge.RemainSpace + } + } + if relayConfig := source.RelayConfig; relayConfig != nil { + if relayConfig.EnableRelay != nil { + cfg.EnableRelay = *relayConfig.EnableRelay + } + if relayConfig.RelayBinlogGtid != nil { + cfg.RelayBinlogGTID = *relayConfig.RelayBinlogGtid + } + if relayConfig.RelayBinlogName != nil { + cfg.RelayBinLogName = *relayConfig.RelayBinlogName + } + if relayConfig.RelayDir != nil { + cfg.RelayDir = *relayConfig.RelayDir + } + } + return cfg +} diff --git a/dm/dm/config/source_converter_test.go b/dm/dm/config/source_converter_test.go new file mode 100644 index 00000000000..c157d61f6c3 --- /dev/null +++ b/dm/dm/config/source_converter_test.go @@ -0,0 +1,41 @@ +// Copyright 2021 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "github.com/pingcap/check" + "github.com/pingcap/ticdc/dm/openapi/fixtures" +) + +func (t *testConfig) TestConverterWithSourceAndOpenAPISource(c *check.C) { + sourceCfg1, err := LoadFromFile(sourceSampleFile) + c.Assert(err, check.IsNil) + + // 1. test user create source from dmctl, after convert to openapi.Source then convert back to source config + sourceCfg2 := OpenAPISourceToSourceCfg(SourceCfgToOpenAPISource(sourceCfg1)) + + // we need set ServerID and MaxAllowedPacket manually, because user don't need to config those field in openapi + sourceCfg2.ServerID = sourceCfg1.ServerID + sourceCfg2.From.MaxAllowedPacket = sourceCfg1.From.MaxAllowedPacket + + // we only need to make sure the source config that user can see is the same as the source config that user create + c.Assert(sourceCfg1.String(), check.Equals, sourceCfg2.String()) + + // 2. test user create source from openapi, after convert to source config then convert back to openapi.Source + openapiSource1, err := fixtures.GenOpenAPISourceForTest() + c.Assert(err, check.IsNil) + openapiSource2 := SourceCfgToOpenAPISource(OpenAPISourceToSourceCfg(openapiSource1)) + openapiSource2.Password = openapiSource1.Password // we set passwd to "******" for privacy + c.Assert(openapiSource1, check.DeepEquals, openapiSource2) +} diff --git a/dm/dm/master/openapi.go b/dm/dm/master/openapi.go index 807fb8d2cd8..d13680a83c5 100644 --- a/dm/dm/master/openapi.go +++ b/dm/dm/master/openapi.go @@ -176,7 +176,7 @@ func (s *Server) DMAPICreateSource(c *gin.Context) { _ = c.Error(err) return } - cfg := modelToSourceCfg(createSourceReq) + cfg := config.OpenAPISourceToSourceCfg(createSourceReq) if err := checkAndAdjustSourceConfigFunc(c.Request.Context(), cfg); err != nil { _ = c.Error(err) return @@ -193,7 +193,7 @@ func (s *Server) DMAPIGetSourceList(c *gin.Context, params openapi.DMAPIGetSourc sourceMap := s.scheduler.GetSourceCfgs() sourceList := []openapi.Source{} for key := range sourceMap { - sourceList = append(sourceList, sourceCfgToModel(sourceMap[key])) + sourceList = append(sourceList, config.SourceCfgToOpenAPISource((sourceMap[key]))) } // fill status if params.WithStatus != nil && *params.WithStatus { @@ -840,62 +840,3 @@ func terrorHTTPErrorHandler() gin.HandlerFunc { c.IndentedJSON(http.StatusBadRequest, openapi.ErrorWithMessage{ErrorMsg: msg, ErrorCode: code}) } } - -func sourceCfgToModel(cfg *config.SourceConfig) openapi.Source { - // PM's requirement, we always return obfuscated password to user - source := openapi.Source{ - EnableGtid: cfg.EnableGTID, - Host: cfg.From.Host, - Password: "******", - Port: cfg.From.Port, - SourceName: cfg.SourceID, - User: cfg.From.User, - Purge: &openapi.Purge{ - Expires: &cfg.Purge.Expires, - Interval: &cfg.Purge.Interval, - RemainSpace: &cfg.Purge.RemainSpace, - }, - } - if cfg.From.Security != nil { - // NOTE we don't return security content here, because we don't want to expose it to the user. - var certAllowedCn []string - certAllowedCn = append(certAllowedCn, cfg.From.Security.CertAllowedCN...) - source.Security = &openapi.Security{CertAllowedCn: &certAllowedCn} - } - return source -} - -func modelToSourceCfg(source openapi.Source) *config.SourceConfig { - cfg := config.NewSourceConfig() - from := config.DBConfig{ - Host: source.Host, - Port: source.Port, - User: source.User, - Password: source.Password, - } - if source.Security != nil { - from.Security = &config.Security{ - SSLCABytes: []byte(source.Security.SslCaContent), - SSLKEYBytes: []byte(source.Security.SslKeyContent), - SSLCertBytes: []byte(source.Security.SslCertContent), - } - if source.Security.CertAllowedCn != nil { - from.Security.CertAllowedCN = *source.Security.CertAllowedCn - } - } - cfg.From = from - cfg.EnableGTID = source.EnableGtid - cfg.SourceID = source.SourceName - if purge := source.Purge; purge != nil { - if purge.Expires != nil { - cfg.Purge.Expires = *purge.Expires - } - if purge.Interval != nil { - cfg.Purge.Interval = *purge.Interval - } - if purge.RemainSpace != nil { - cfg.Purge.RemainSpace = *purge.RemainSpace - } - } - return cfg -} diff --git a/dm/openapi/fixtures/source.go b/dm/openapi/fixtures/source.go new file mode 100644 index 00000000000..dc5f92f0480 --- /dev/null +++ b/dm/openapi/fixtures/source.go @@ -0,0 +1,57 @@ +// Copyright 2021 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package fixtures + +import ( + "encoding/json" + + "github.com/pingcap/ticdc/dm/openapi" +) + +var sourceStr = ` + { + "source_name": "mysql-01", + "host": "127.0.0.1", + "port": 3306, + "user": "root", + "password": "123456", + "enable_gtid": false, + "security": { + "ssl_ca_content": "", + "ssl_cert_content": "", + "ssl_key_content": "", + "cert_allowed_cn": [ + "string" + ] + }, + "purge": { + "interval": 3600, + "expires": 0, + "remain_space": 15 + }, + "relay_config": { + "enable_relay": true, + "relay_binlog_name": "mysql-bin.000002", + "relay_binlog_gtid": "e9a1fc22-ec08-11e9-b2ac-0242ac110003:1-7849", + "relay_dir": "./relay_log" + } + } +` + +// GenOpenAPISourceForTest generates openapi.Source for test. +func GenOpenAPISourceForTest() (openapi.Source, error) { + s := openapi.Source{} + err := json.Unmarshal([]byte(sourceStr), &s) + return s, err +} diff --git a/dm/openapi/gen.server.go b/dm/openapi/gen.server.go index e2ddcc94733..e3bec85ff71 100644 --- a/dm/openapi/gen.server.go +++ b/dm/openapi/gen.server.go @@ -837,85 +837,86 @@ func RegisterHandlersWithOptions(router *gin.Engine, si ServerInterface, options // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "kMwuC+bjsgf3n+//HQAA//8aVdY3n30AAA==", + "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", + "xQCAAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/dm/openapi/gen.types.go b/dm/openapi/gen.types.go index 54ba9f89a36..4d5cea78df4 100644 --- a/dm/openapi/gen.types.go +++ b/dm/openapi/gen.types.go @@ -160,6 +160,20 @@ type Purge struct { RemainSpace *int64 `json:"remain_space"` } +// the config of relay +type RelayConfig struct { + EnableRelay *bool `json:"enable_relay,omitempty"` + + // starting GTID of the upstream binlog + RelayBinlogGtid *string `json:"relay_binlog_gtid"` + + // starting filename of the upstream binlog + RelayBinlogName *string `json:"relay_binlog_name"` + + // the directory where the relay log is stored + RelayDir *string `json:"relay_dir"` +} + // status of relay log type RelayStatus struct { // upstream binlog file information @@ -225,6 +239,9 @@ type Source struct { // relay log cleanup policy configuration Purge *Purge `json:"purge,omitempty"` + // the config of relay + RelayConfig *RelayConfig `json:"relay_config,omitempty"` + // data source ssl configuration, the field will be hidden when getting the data source configuration from the interface Security *Security `json:"security"` diff --git a/dm/openapi/spec/dm.yaml b/dm/openapi/spec/dm.yaml index 490effc569d..1c9839e28ae 100644 --- a/dm/openapi/spec/dm.yaml +++ b/dm/openapi/spec/dm.yaml @@ -970,6 +970,8 @@ components: type: array items: $ref: "#/components/schemas/SourceStatus" + relay_config: + $ref: "#/components/schemas/RelayConfig" required: - "source_name" - "host" @@ -1425,6 +1427,28 @@ components: type: string example: "task-1" + RelayConfig: + description: the config of relay + type: object + properties: + enable_relay: + type: boolean + relay_binlog_name: + type: string + example: "mysql-bin.000002" + description: "starting filename of the upstream binlog" + nullable: true + relay_binlog_gtid: + type: string + example: "e9a1fc22-ec08-11e9-b2ac-0242ac110003:1-7849" + description: "starting GTID of the upstream binlog" + nullable: true + relay_dir: + type: string + default: "./relay_log" + description: "the directory where the relay log is stored" + nullable: true + WorkerNameRequest: description: requests related to workers type: object