Skip to content

Commit 25b76c4

Browse files
authored
Cld 9544 provisioner fix mysql db connection string (#1139)
* fix external database connection string format * add secrets tests * remove skip_tls_verify flag * change back tls verify flag
1 parent 226c183 commit 25b76c4

File tree

5 files changed

+57
-8
lines changed

5 files changed

+57
-8
lines changed

internal/tools/aws/database.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,10 @@ func (d *RDSDatabase) GenerateDatabaseSecret(store model.InstallationDatabaseSto
168168
}
169169
rdsCluster := dbClusters.DBClusters[0]
170170

171-
var databaseConnectionString, databaseReadReplicasString, databaseConnectionCheck string
171+
var databaseConnectionString, databaseReadReplicasString, databaseConnectionCheck, dataSourceURL string
172172
switch d.databaseType {
173173
case model.DatabaseEngineTypeMySQL:
174-
databaseConnectionString, databaseReadReplicasString =
174+
databaseConnectionString, databaseReadReplicasString, dataSourceURL =
175175
MattermostMySQLConnStrings(
176176
"mattermost",
177177
installationSecret.MasterUsername,
@@ -199,6 +199,7 @@ func (d *RDSDatabase) GenerateDatabaseSecret(store model.InstallationDatabaseSto
199199
ConnectionString: databaseConnectionString,
200200
DBCheckURL: databaseConnectionCheck,
201201
ReadReplicasURL: databaseReadReplicasString,
202+
DataSourceURL: dataSourceURL,
202203
}
203204

204205
logger.Debug("AWS multitenant database configuration generated for cluster installation")

internal/tools/aws/database_multitenant.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,9 @@ func (d *RDSMultitenantDatabase) GenerateDatabaseSecret(store model.Installation
246246
return nil, errors.Wrap(err, "failed to get secret value for database")
247247
}
248248

249-
var databaseConnectionString, databaseReadReplicasString, databaseConnectionCheck string
249+
var databaseConnectionString, databaseReadReplicasString, databaseConnectionCheck, dataSourceURL string
250250
if d.databaseType == model.DatabaseEngineTypeMySQL {
251-
databaseConnectionString, databaseReadReplicasString =
251+
databaseConnectionString, databaseReadReplicasString, dataSourceURL =
252252
MattermostMySQLConnStrings(
253253
installationDatabaseName,
254254
installationSecret.MasterUsername,
@@ -272,6 +272,7 @@ func (d *RDSMultitenantDatabase) GenerateDatabaseSecret(store model.Installation
272272
ConnectionString: databaseConnectionString,
273273
DBCheckURL: databaseConnectionCheck,
274274
ReadReplicasURL: databaseReadReplicasString,
275+
DataSourceURL: dataSourceURL,
275276
}
276277

277278
logger.Debug("AWS RDS multitenant database configuration generated for cluster installation")

internal/tools/aws/helpers_sql.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,14 @@ type SQLDatabaseManager interface {
2929

3030
// MattermostMySQLConnStrings formats the connection string used for accessing a
3131
// Mattermost database.
32-
func MattermostMySQLConnStrings(schema, username, password string, dbCluster *rdsTypes.DBCluster) (string, string) {
33-
dbConnection := fmt.Sprintf("mysql://%s:%s@tcp(%s:3306)/%s?charset=utf8mb4%%2Cutf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
32+
func MattermostMySQLConnStrings(schema, username, password string, dbCluster *rdsTypes.DBCluster) (string, string, string) {
33+
datasourceConnection := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
3434
username, password, *dbCluster.Endpoint, schema)
35-
readReplicas := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?charset=utf8mb4%%2Cutf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
35+
dbConnection := fmt.Sprintf("mysql://%s", datasourceConnection)
36+
readReplicas := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
3637
username, password, *dbCluster.ReaderEndpoint, schema)
3738

38-
return dbConnection, readReplicas
39+
return dbConnection, readReplicas, datasourceConnection
3940
}
4041

4142
// RDSMySQLConnString formats the connection string used by the provisioner for

internal/tools/aws/secret.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ type InstallationDBSecret struct {
1616
ConnectionString string
1717
DBCheckURL string
1818
ReadReplicasURL string
19+
DataSourceURL string // MySQL datasource URL without mysql:// prefix
1920
}
2021

2122
// ToK8sSecret creates Kubernetes secret from InstallationDBSecret.
@@ -32,6 +33,10 @@ func (s InstallationDBSecret) ToK8sSecret(disableDBCheck bool) *corev1.Secret {
3233
if !disableDBCheck && s.DBCheckURL != "" {
3334
secret.StringData["DB_CONNECTION_CHECK_URL"] = s.DBCheckURL
3435
}
36+
// Add datasource URL without prefix for MySQL configurations
37+
if s.DataSourceURL != "" {
38+
secret.StringData["MM_SQLSETTINGS_DATASOURCE"] = s.DataSourceURL
39+
}
3540

3641
return &secret
3742
}

internal/tools/aws/secret_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,47 @@ func TestInstallationDBSecret_ToK8sSecret(t *testing.T) {
7676
},
7777
},
7878
},
79+
{
80+
description: "MySQL secret with datasource URL",
81+
installationSecret: InstallationDBSecret{
82+
InstallationSecretName: "mysql-secret",
83+
ConnectionString: "mysql://user:pass@tcp(db.example.com:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
84+
DBCheckURL: "http://db.example.com:3306",
85+
ReadReplicasURL: "user:pass@tcp(db-ro.example.com:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
86+
DataSourceURL: "user:pass@tcp(db.example.com:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
87+
},
88+
disableDBCheck: false,
89+
expectedSecret: &corev1.Secret{
90+
ObjectMeta: metav1.ObjectMeta{
91+
Name: "mysql-secret",
92+
},
93+
StringData: map[string]string{
94+
"DB_CONNECTION_STRING": "mysql://user:pass@tcp(db.example.com:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
95+
"MM_SQLSETTINGS_DATASOURCEREPLICAS": "user:pass@tcp(db-ro.example.com:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
96+
"DB_CONNECTION_CHECK_URL": "http://db.example.com:3306",
97+
"MM_SQLSETTINGS_DATASOURCE": "user:pass@tcp(db.example.com:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
98+
},
99+
},
100+
},
101+
{
102+
description: "MySQL secret without datasource URL",
103+
installationSecret: InstallationDBSecret{
104+
InstallationSecretName: "mysql-secret-no-datasource",
105+
ConnectionString: "mysql://user:pass@tcp(db.example.com:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
106+
ReadReplicasURL: "user:pass@tcp(db-ro.example.com:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
107+
DataSourceURL: "", // Empty datasource URL
108+
},
109+
disableDBCheck: false,
110+
expectedSecret: &corev1.Secret{
111+
ObjectMeta: metav1.ObjectMeta{
112+
Name: "mysql-secret-no-datasource",
113+
},
114+
StringData: map[string]string{
115+
"DB_CONNECTION_STRING": "mysql://user:pass@tcp(db.example.com:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
116+
"MM_SQLSETTINGS_DATASOURCEREPLICAS": "user:pass@tcp(db-ro.example.com:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s&tls=skip-verify",
117+
},
118+
},
119+
},
79120
} {
80121
t.Run(testCase.description, func(t *testing.T) {
81122
k8sSecret := testCase.installationSecret.ToK8sSecret(testCase.disableDBCheck)

0 commit comments

Comments
 (0)