pkg/mysqlclient/connect.go (44 lines of code) (raw):

// Copyright (c) 2022, 2023, Oracle and/or its affiliates. // // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ package mysqlclient import ( "database/sql" "fmt" "time" _ "github.com/go-sql-driver/mysql" appsv1 "k8s.io/api/apps/v1" klog "k8s.io/klog/v2" ) const ( mysqldPort = 3306 ndbOperatorUser = "ndb-operator-user" sqlDriverName = "mysql" ) // System Database names const ( DbNdbInfo = "ndbinfo" DbMySQL = "mysql" DbInformationSchema = "information_schema" ) // Connect to the MySQL Server at given mysqldHost func Connect(mysqldHost string, dbName string, ndbOperatorPassword string) (*sql.DB, error) { // Generate the complete address to connect to dataSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=10s", ndbOperatorUser, ndbOperatorPassword, mysqldHost, mysqldPort, dbName) db, err := sql.Open(sqlDriverName, dataSource) if err != nil { klog.Infof("Error opening connection to MySQL server at %q : %s", mysqldHost, err) return nil, err } // Verify the DB is connected if db != nil { err = db.Ping() } if db == nil || err != nil { klog.Infof("Error connecting to the MySQL server at %q : %s", mysqldHost, err) return nil, err } // Recommended settings db.SetConnMaxLifetime(time.Minute * 3) db.SetMaxOpenConns(10) db.SetMaxIdleConns(10) return db, nil } // ConnectToStatefulSet opens a connection to the first MySQL Server pod managed by the given MySQL Server StatefulSet func ConnectToStatefulSet(mysqldSfset *appsv1.StatefulSet, dbName string, ndbOperatorPassword string) (*sql.DB, error) { // Generate the MySQL Server host using the hostname of StatefulSet's pod-0 mysqldHost := fmt.Sprintf("%s-0.%s.%s", mysqldSfset.Name, mysqldSfset.Spec.ServiceName, mysqldSfset.Namespace) return Connect(mysqldHost, dbName, ndbOperatorPassword) }