diff --git a/pkg/resources/statefulsets/statefulset.go b/pkg/resources/statefulsets/statefulset.go index ebfea7a10..b3ae46f3c 100644 --- a/pkg/resources/statefulsets/statefulset.go +++ b/pkg/resources/statefulsets/statefulset.go @@ -33,6 +33,8 @@ import ( operatoropts "github.com/oracle/mysql-operator/pkg/options/operator" "github.com/oracle/mysql-operator/pkg/resources/secrets" "github.com/oracle/mysql-operator/pkg/version" + + "github.com/coreos/go-semver/semver" ) const ( @@ -48,6 +50,8 @@ const ( mySQLSSLVolumeName = "mysqlsslvolume" replicationGroupPort = 13306 + + minMysqlVersionWithGroupExitStateArgs = "8.0.12" ) func volumeMounts(cluster *v1alpha1.Cluster) []v1.VolumeMount { @@ -155,6 +159,26 @@ func getReplicationGroupSeeds(name string, members int) string { return strings.Join(seeds, ",") } +func checkSupportGroupExitStateArgs(deployingVersion string) (supportedVer bool) { + defer func() { + if r := recover(); r != nil { + + } + }() + + supportedVer = false + + ver := semver.New(deployingVersion) + minVer := semver.New(minMysqlVersionWithGroupExitStateArgs) + + if ver.LessThan(*minVer) { + return + } + + supportedVer = true + return +} + // Builds the MySQL operator container for a cluster. // The 'mysqlImage' parameter is the image name of the mysql server to use with // no version information.. e.g. 'mysql/mysql-server' @@ -184,6 +208,10 @@ func mysqlServerContainer(cluster *v1alpha1.Cluster, mysqlServerImage string, ro "--ssl-key=/etc/ssl/mysql/tls.key") } + if checkSupportGroupExitStateArgs(cluster.Spec.Version) { + args = append(args, "--loose-group-replication-exit-state-action=READ_ONLY") + } + entryPointArgs := strings.Join(args, " ") cmd := fmt.Sprintf(` diff --git a/pkg/resources/statefulsets/statefulset_test.go b/pkg/resources/statefulsets/statefulset_test.go index 7d8544c05..fc3050e79 100644 --- a/pkg/resources/statefulsets/statefulset_test.go +++ b/pkg/resources/statefulsets/statefulset_test.go @@ -323,3 +323,37 @@ func TestClusterDefaultOverride(t *testing.T) { assert.Equal(t, "OverrideDefaultImage:"+v1alpha1.DefaultVersion, si) } + +func TestClusterSetGroupExitStateArgs(t *testing.T) { + cluster := &v1alpha1.Cluster{} + cluster.EnsureDefaults() + cluster.Spec.Version = "8.0.12" + + statefulSet := NewForCluster(cluster, mockOperatorConfig().Images, "mycluster") + + cmd := statefulSet.Spec.Template.Spec.Containers[0].Command[2] + + assert.Contains(t, cmd, "--loose-group-replication-exit-state-action=READ_ONLY") + + cluster2 := &v1alpha1.Cluster{} + cluster2.EnsureDefaults() + cluster2.Spec.Version = "8.0.13" + + statefulSet2 := NewForCluster(cluster2, mockOperatorConfig().Images, "mycluster") + + cmd2 := statefulSet2.Spec.Template.Spec.Containers[0].Command[2] + + assert.Contains(t, cmd2, "--loose-group-replication-exit-state-action=READ_ONLY") +} + +func TestClusterNotSetGroupExitStateArgs(t *testing.T) { + cluster := &v1alpha1.Cluster{} + cluster.EnsureDefaults() + cluster.Spec.Version = "8.0.11" + + statefulSet := NewForCluster(cluster, mockOperatorConfig().Images, "mycluster") + + cmd := statefulSet.Spec.Template.Spec.Containers[0].Command[2] + + assert.NotContains(t, cmd, "--loose-group-replication-exit-state-action=READ_ONLY") +}