diff --git a/cmd/root.go b/cmd/root.go index ad6ec97..cd87fb4 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -27,6 +27,8 @@ import ( "github.com/ProxySQL/dbdeployer/defaults" "github.com/ProxySQL/dbdeployer/downloads" "github.com/ProxySQL/dbdeployer/globals" + "github.com/ProxySQL/dbdeployer/providers" + mysqlprovider "github.com/ProxySQL/dbdeployer/providers/mysql" "github.com/ProxySQL/dbdeployer/sandbox" ) @@ -143,6 +145,9 @@ func customizeFlags(cmd *cobra.Command, cmdName string) { } func init() { + if err := mysqlprovider.Register(providers.DefaultRegistry); err != nil { + panic(fmt.Sprintf("failed to register MySQL provider: %v", err)) + } cobra.OnInitialize(checkDefaultsFile) rootCmd.CompletionOptions.DisableDefaultCmd = true rootCmd.PersistentFlags().StringVar(&defaults.CustomConfigurationFile, globals.ConfigLabel, defaults.ConfigurationFile, "configuration file") diff --git a/providers/mysql/mysql.go b/providers/mysql/mysql.go new file mode 100644 index 0000000..f0f6af9 --- /dev/null +++ b/providers/mysql/mysql.go @@ -0,0 +1,37 @@ +package mysql + +import ( + "fmt" + "strings" + + "github.com/ProxySQL/dbdeployer/providers" +) + +const ProviderName = "mysql" + +type MySQLProvider struct{} + +func NewMySQLProvider() *MySQLProvider { + return &MySQLProvider{} +} + +func (p *MySQLProvider) Name() string { return ProviderName } + +func (p *MySQLProvider) ValidateVersion(version string) error { + parts := strings.Split(version, ".") + if len(parts) < 2 { + return fmt.Errorf("invalid MySQL version format: %q (expected X.Y or X.Y.Z)", version) + } + return nil +} + +func (p *MySQLProvider) DefaultPorts() providers.PortRange { + return providers.PortRange{ + BasePort: 3306, + PortsPerInstance: 3, // main + mysqlx + admin + } +} + +func Register(reg *providers.Registry) error { + return reg.Register(NewMySQLProvider()) +} diff --git a/providers/mysql/mysql_test.go b/providers/mysql/mysql_test.go new file mode 100644 index 0000000..1d40677 --- /dev/null +++ b/providers/mysql/mysql_test.go @@ -0,0 +1,47 @@ +package mysql + +import ( + "testing" + + "github.com/ProxySQL/dbdeployer/providers" +) + +func TestMySQLProviderName(t *testing.T) { + p := NewMySQLProvider() + if p.Name() != "mysql" { + t.Errorf("expected 'mysql', got %q", p.Name()) + } +} + +func TestMySQLProviderValidateVersion(t *testing.T) { + p := NewMySQLProvider() + tests := []struct { + version string + wantErr bool + }{ + {"8.4.4", false}, + {"9.1.0", false}, + {"5.7", false}, + {"invalid", true}, + } + for _, tt := range tests { + err := p.ValidateVersion(tt.version) + if (err != nil) != tt.wantErr { + t.Errorf("ValidateVersion(%q) error = %v, wantErr %v", tt.version, err, tt.wantErr) + } + } +} + +func TestMySQLProviderRegister(t *testing.T) { + reg := providers.NewRegistry() + if err := Register(reg); err != nil { + t.Fatalf("Register failed: %v", err) + } + p, err := reg.Get("mysql") + if err != nil { + t.Fatalf("Get failed: %v", err) + } + if p.Name() != "mysql" { + t.Errorf("expected 'mysql', got %q", p.Name()) + } +}