From 7c0a7f74f4d47de69c02cd4efd631489d883dd59 Mon Sep 17 00:00:00 2001 From: PennyYoon <525296438@qq.com> Date: Wed, 15 Nov 2023 22:34:08 +0800 Subject: [PATCH] feat: support new OpenGemini client with config Signed-off-by: PennyYoon <525296438@qq.com> --- opengemini/client.go | 51 +++++++++++++++++++++ opengemini/client_impl.go | 60 +++++++++++++++++++++++++ opengemini/client_test.go | 93 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 204 insertions(+) create mode 100644 opengemini/client_impl.go create mode 100644 opengemini/client_test.go diff --git a/opengemini/client.go b/opengemini/client.go index e6fe79d..25a023c 100644 --- a/opengemini/client.go +++ b/opengemini/client.go @@ -1 +1,52 @@ package opengemini + +import ( + "crypto/tls" +) + +var _, _ = NewClient(&Config{}) + +type Client interface { + WriteBatchPoints(points BatchPoints) + WritePoint(point Point) + WriteLineProtocol(data, database, retentionPolicy, precision string) + Query() + Client() +} + +type Config struct { + AddressList []*Address + AuthConfig *AuthConfig + BatchConfig *BatchConfig + GzipEnabled bool + TlsConfig *tls.Config +} + +type Address struct { + Host string + Port int +} + +type AuthType int + +const ( + Password AuthType = iota + Token +) + +type AuthConfig struct { + AuthType AuthType + UserName string + Password string + Token string +} + +type BatchConfig struct { + BatchEnabled bool + BatchInterval int + BatchSize int +} + +func NewClient(config *Config) (Client, error) { + return newClient(config) +} diff --git a/opengemini/client_impl.go b/opengemini/client_impl.go new file mode 100644 index 0000000..e143dc9 --- /dev/null +++ b/opengemini/client_impl.go @@ -0,0 +1,60 @@ +package opengemini + +import "errors" + +type client struct { + config *Config +} + +func newClient(c *Config) (Client, error) { + if len(c.AddressList) == 0 { + return nil, errors.New("must have at least one address") + } + if c.AuthConfig.AuthType == Token && len(c.AuthConfig.Token) == 0 { + return nil, errors.New("invalid auth config cause empty token") + } + if c.AuthConfig.AuthType == Password { + if len(c.AuthConfig.UserName) == 0 { + return nil, errors.New("invalid auth config cause empty username") + } + if len(c.AuthConfig.Password) == 0 { + return nil, errors.New("invalid auth config cause empty password") + } + } + if c.BatchConfig.BatchEnabled { + if c.BatchConfig.BatchInterval <= 0 { + return nil, errors.New("batch interval must be more than 0 , if batch operate enable") + } + if c.BatchConfig.BatchSize <= 0 { + return nil, errors.New("batch size must be more than 0 , if batch operate enable") + } + } + client := &client{ + config: c, + } + return client, nil +} + +func (c *client) WriteBatchPoints(points BatchPoints) { + //TODO implement me + panic("implement me") +} +func (c *client) WritePoint(point Point) { + //TODO implement me + panic("implement me") +} + +func (c *client) WriteLineProtocol(data, database, retentionPolicy, precision string) { + //TODO implement me + panic("implement me") +} + +func (c *client) Query() { + //TODO implement me + panic("implement me") +} + +func (c *client) Client() { + //TODO implement me + panic("implement me") +} diff --git a/opengemini/client_test.go b/opengemini/client_test.go new file mode 100644 index 0000000..205254f --- /dev/null +++ b/opengemini/client_test.go @@ -0,0 +1,93 @@ +package opengemini + +import ( + "errors" + "reflect" + "testing" +) + +func TestNewClient(t *testing.T) { + tests := map[string]struct { + config *Config + client *Client + err error + }{ + "EmptyAddress": { + config: &Config{}, + client: nil, + err: errors.New("must have at least one address"), + }, + "EmptyToken": { + config: &Config{ + Addresses: []*Address{{Host: "127.0.0.1", Port: 8086}}, + AuthConfig: &AuthConfig{ + AuthType: Token, + }, + }, + client: nil, + err: errors.New("invalid auth config cause empty token"), + }, + "EmptyPassword": { + config: &Config{ + Addresses: []*Address{{Host: "127.0.0.1", Port: 8086}}, + AuthConfig: &AuthConfig{ + AuthType: Password, + }, + }, + client: nil, + err: errors.New("invalid auth config cause empty username or password"), + }, + "InvalidBatchConfig": { + config: &Config{ + Addresses: []*Address{{Host: "127.0.0.1", Port: 8086}}, + AuthConfig: &AuthConfig{ + AuthType: Password, + UserName: "TestUser", + Password: "TestPassword", + }, + BatchConfig: &BatchConfig{ + BatchEnable: true, + BatchSize: 10, + BatchInterval: -1, + }, + }, + client: nil, + err: errors.New("batch interval and batch size must be more than 0 ,if batch operate enable"), + }, + "NewClientSuccess": { + config: &Config{ + Addresses: []*Address{{Host: "127.0.0.1", Port: 8086}}, + AuthConfig: &AuthConfig{ + AuthType: Password, + UserName: "TestUser", + Password: "TestPassword", + }, + BatchConfig: &BatchConfig{ + BatchEnable: true, + BatchSize: 10, + BatchInterval: 1, + }, + }, + client: &Client{ + addresses: []*Address{{Host: "127.0.0.1", Port: 8086}}, + authConfig: &AuthConfig{ + AuthType: Password, + UserName: "TestUser", + Password: "TestPassword", + }, + batchConfig: &BatchConfig{ + BatchEnable: true, + BatchSize: 10, + BatchInterval: 1, + }, + }, + }, + } + for caseName, tt := range tests { + c, err := NewClient(tt.config) + if !reflect.DeepEqual(c, tt.client) || !reflect.DeepEqual(tt.err, err) { + t.Logf("case @%s not pass test", caseName) + } + } + +}