Skip to content

Commit c3abaf1

Browse files
committed
feat: enhance MySQL database configuration and connection utilities
- Add a database configuration struct to manage external database connection details - Implement MySQL connection check functionality - Modify external database port to be an integer type - Update default database name to be more specific - Adjust logging messages for better clarity and context - Update usages of external database settings in initialization routines - Create new database utility files for MySQL functionality Signed-off-by: ysicing <i@ysicing.me>
1 parent 3b2a886 commit c3abaf1

9 files changed

Lines changed: 97 additions & 38 deletions

File tree

cmd/init.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/easysoft/qcadmin/internal/app/config"
2121
"github.com/easysoft/qcadmin/internal/pkg/k8s"
2222
"github.com/easysoft/qcadmin/internal/pkg/types"
23+
"github.com/easysoft/qcadmin/internal/pkg/util/db"
2324
"github.com/easysoft/qcadmin/internal/pkg/util/factory"
2425
"github.com/easysoft/qcadmin/pkg/providers"
2526

@@ -97,6 +98,18 @@ func newCmdInit(f factory.Factory) *cobra.Command {
9798
nCluster.MasterIPs = append(nCluster.MasterIPs, exnet.LocalIPs()[0])
9899
}
99100
}
101+
if len(meta.ExtDBHost) > 0 && len(meta.ExtDBPassword) > 0 {
102+
cfg := &db.Config{
103+
Host: meta.ExtDBHost,
104+
Port: meta.ExtDBPort,
105+
Username: meta.ExtDBUser,
106+
Password: meta.ExtDBPassword,
107+
}
108+
if !db.CheckMySQL(cfg) {
109+
log.Errorf("external db check failed, please check your external db")
110+
os.Exit(-1)
111+
}
112+
}
100113
}
101114
initCmd.Run = func(cmd *cobra.Command, args []string) {
102115
if name == "native" {

cmd/manage/crd/dbsvc.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ func cmdNewDbSvc(f factory.Factory) *cobra.Command {
158158
svc.Spec = corev1.ServiceSpec{
159159
Ports: []corev1.ServicePort{
160160
{
161-
Port: port,
161+
Port: 3306,
162162
Protocol: corev1.ProtocolTCP,
163163
Name: "db",
164164
TargetPort: intstr.FromInt(int(port)),
@@ -208,7 +208,7 @@ func cmdNewDbSvc(f factory.Factory) *cobra.Command {
208208
ExternalName: host,
209209
Ports: []corev1.ServicePort{
210210
{
211-
Port: port,
211+
Port: 3306,
212212
TargetPort: intstr.FromInt32(port),
213213
Protocol: corev1.ProtocolTCP,
214214
Name: "db",
@@ -272,7 +272,7 @@ func cmdNewDbSvc(f factory.Factory) *cobra.Command {
272272
return nil
273273
}
274274
log.Donef("created external database service %s in namespace %s", name, namespace)
275-
log.Infof("you can access the database in cluster using: %s", color.SGreen("%s.%s:%d", name, namespace, port))
275+
log.Infof("you can access the database in cluster using: %s", color.SGreen("%s.%s:3306", name, namespace))
276276
return nil
277277
},
278278
}

common/const.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ const (
9797
CDNVersionURL = "https://pkg.zentao.net/cli/devops/version.json"
9898
DefaultNerdctlConfig = "/etc/nerdctl/nerdctl.toml"
9999
DefaultExternalDBPort = 3306
100-
DefaultExternalDBName = "zentaopaas-mysql"
100+
DefaultExternalDBName = "ex-zentaopaas-mysql"
101101
)
102102

103103
const (

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ require (
1515
github.com/easysoft/quickon-api v0.7.6
1616
github.com/emirpasic/gods v1.18.1
1717
github.com/ergoapi/util v0.7.12
18+
github.com/go-sql-driver/mysql v1.9.1
1819
github.com/gofrs/flock v0.12.1
1920
github.com/google/gops v0.3.28
2021
github.com/gosuri/uitable v0.0.4
@@ -66,6 +67,7 @@ require (
6667

6768
require (
6869
dario.cat/mergo v1.0.1 // indirect
70+
filippo.io/edwards25519 v1.1.0 // indirect
6971
github.com/6tail/lunar-go v1.3.15 // indirect
7072
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
7173
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect

go.sum

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,9 @@ github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF
179179
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
180180
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
181181
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
182-
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
183182
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
183+
github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI=
184+
github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
184185
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
185186
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
186187
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=

internal/pkg/cli/check/mysql.go

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
package check
88

99
import (
10-
"database/sql"
1110
"fmt"
1211

1312
"github.com/spf13/cobra"
1413

14+
"github.com/easysoft/qcadmin/internal/pkg/util/db"
1515
"github.com/easysoft/qcadmin/internal/pkg/util/factory"
1616
)
1717

@@ -33,29 +33,13 @@ func CheckMySQLCommand(f factory.Factory) *cobra.Command {
3333
return nil
3434
},
3535
Run: func(cmd *cobra.Command, args []string) {
36-
// Test MySQL connection
37-
f.GetLog().Infof("test mysql connection %:%d", host, port)
38-
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/", username, password, host, port))
39-
if err != nil {
40-
f.GetLog().Errorf("failed to connect to mysql(%s:%d), err: %v", host, port, err)
41-
return
36+
cfg := &db.Config{
37+
Host: host,
38+
Port: port,
39+
Username: username,
40+
Password: password,
4241
}
43-
defer db.Close()
44-
// Test database creation
45-
f.GetLog().Infof("try create database z_test_db")
46-
_, err = db.Exec("CREATE DATABASE z_test_db")
47-
if err != nil {
48-
f.GetLog().Errorf("failed to create database z_test_db,err: %v", err)
49-
return
50-
}
51-
f.GetLog().Infof("clean test database z_test_db")
52-
_, err = db.Exec("DROP DATABASE z_test_db")
53-
if err != nil {
54-
f.GetLog().Errorf("failed to drop test database: %v", err)
55-
return
56-
}
57-
f.GetLog().Done("mysql is available and can create databases")
58-
return
42+
db.CheckMySQL(cfg)
5943
},
6044
}
6145
cmd.Flags().StringVarP(&host, "host", "", "localhost", "MySQL host")

internal/pkg/util/db/db.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright (c) 2021-2025 北京渠成软件有限公司(Beijing Qucheng Software Co., Ltd. www.qucheng.com) All rights reserved.
2+
// Use of this source code is covered by the following dual licenses:
3+
// (1) Z PUBLIC LICENSE 1.2 (ZPL 1.2)
4+
// (2) Affero General Public License 3.0 (AGPL 3.0)
5+
// license that can be found in the LICENSE file.
6+
7+
package db
8+
9+
type Config struct {
10+
Type string `json:"type" yaml:"type"`
11+
Host string `json:"host" yaml:"host"`
12+
Port int `json:"port" yaml:"port"`
13+
Username string `json:"username" yaml:"username"`
14+
Password string `json:"password" yaml:"password"`
15+
}

internal/pkg/util/db/mysql.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Copyright (c) 2021-2025 北京渠成软件有限公司(Beijing Qucheng Software Co., Ltd. www.qucheng.com) All rights reserved.
2+
// Use of this source code is covered by the following dual licenses:
3+
// (1) Z PUBLIC LICENSE 1.2 (ZPL 1.2)
4+
// (2) Affero General Public License 3.0 (AGPL 3.0)
5+
// license that can be found in the LICENSE file.
6+
7+
package db
8+
9+
import (
10+
"database/sql"
11+
"fmt"
12+
13+
"github.com/easysoft/qcadmin/internal/pkg/util/log"
14+
15+
_ "github.com/go-sql-driver/mysql"
16+
)
17+
18+
func CheckMySQL(cfg *Config) bool {
19+
log := log.GetInstance()
20+
// Test MySQL connection
21+
log.Debugf("test mysql connection %s:%d", cfg.Host, cfg.Port)
22+
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/", cfg.Username, cfg.Password, cfg.Host, cfg.Port))
23+
if err != nil {
24+
log.Errorf("failed to connect to mysql(%s:%d), err: %v", cfg.Host, cfg.Port, err)
25+
return false
26+
}
27+
defer db.Close()
28+
// Test database creation
29+
log.Debugf("try create database z_test_db")
30+
_, err = db.Exec("CREATE DATABASE z_test_db")
31+
if err != nil {
32+
log.Errorf("failed to create database z_test_db,err: %v", err)
33+
return false
34+
}
35+
log.Debugf("clean test database z_test_db")
36+
_, err = db.Exec("DROP DATABASE z_test_db")
37+
if err != nil {
38+
log.Errorf("failed to drop test database: %v", err)
39+
return false
40+
}
41+
log.Done("mysql check success")
42+
return true
43+
}

pkg/quickon/quickon.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"context"
1111
"fmt"
1212
"os"
13+
"strconv"
1314
"strings"
1415
"time"
1516

@@ -46,7 +47,7 @@ type Meta struct {
4647
OffLine bool
4748
DBReplication bool
4849
ExtDBHost string
49-
ExtDBPort string
50+
ExtDBPort int
5051
ExtDBUser string
5152
ExtDBPassword string
5253
Type string
@@ -104,7 +105,7 @@ func (m *Meta) GetCustomFlags() []types.Flag {
104105
Name: "ext-db-port",
105106
Usage: "external db port",
106107
P: &m.ExtDBPort,
107-
V: "3306",
108+
V: 3306,
108109
},
109110
{
110111
Name: "ext-db-user",
@@ -365,11 +366,11 @@ func (m *Meta) Init() error {
365366
}
366367
useExtDB := false
367368
// 如果外部数据库可用,则使用外部数据库
368-
if m.ExtDBHost != "" && m.ExtDBPort != "" && m.ExtDBUser != "" && m.ExtDBPassword != "" {
369+
if m.ExtDBHost != "" && m.ExtDBUser != "" && m.ExtDBPassword != "" {
369370
m.Log.Infof("detected external db, will use external db as cluster global database instance")
370-
args := []string{"platform", "crd", "dbsvc", "new", "--host", m.ExtDBHost, "--port", m.ExtDBPort, "--username", m.ExtDBUser, "--password", m.ExtDBPassword}
371-
if output, err := qcexec.Command(os.Args[0], args...).CombinedOutput(); err != nil {
372-
m.Log.Warnf("create external dbservice failed, reason: %v, std: %s", err, string(output))
371+
args := []string{"platform", "crd", "dbsvc", "new", "--host", m.ExtDBHost, "--port", strconv.Itoa(m.ExtDBPort), "--username", m.ExtDBUser, "--password", m.ExtDBPassword}
372+
if err := qcexec.CommandRun(os.Args[0], args...); err != nil {
373+
m.Log.Warnf("create external dbservice failed, reason: %v", err)
373374
} else {
374375
m.Log.Done("configure external db as cluster global database instance success")
375376
useExtDB = true
@@ -400,8 +401,8 @@ func (m *Meta) Init() error {
400401
if useExtDB {
401402
// create external db
402403
helmargs = append(helmargs, "--set", "mysql.enabled=false")
403-
helmargs = append(helmargs, "--set", "mysql.auth.dbservice.name=zentaopaas-mysql")
404-
helmargs = append(helmargs, "--set", "mysql.auth.host=zentaopaas-mysql.quickon-system.svc")
404+
helmargs = append(helmargs, "--set", fmt.Sprintf("mysql.auth.dbservice.name=%s", common.DefaultExternalDBName))
405+
helmargs = append(helmargs, "--set", fmt.Sprintf("mysql.auth.host=%s.quickon-system.svc", common.DefaultExternalDBName))
405406
}
406407

407408
// TODO: 等下个版本禅道正式发版后续删除
@@ -470,7 +471,7 @@ func (m *Meta) QuickONReady() {
470471

471472
// OperatorReady OperatorReady
472473
func (m *Meta) OperatorReady() error {
473-
m.Log.Debugf("waiting for operator ready")
474+
m.Log.Debug("waiting for operator ready")
474475
for i := 1; i <= 10; i++ {
475476
deploy, err := m.kubeClient.GetDeployment(context.Background(), common.GetDefaultSystemNamespace(true), common.DefaultCneOperatorName, metav1.GetOptions{})
476477
if err != nil {
@@ -502,7 +503,7 @@ func (m *Meta) readyQuickON(ctx context.Context) error {
502503
status = true
503504
break
504505
}
505-
time.Sleep(time.Second * 10)
506+
time.Sleep(time.Second * 5)
506507
}
507508
m.Log.StopWait()
508509
if status {

0 commit comments

Comments
 (0)