Skip to content

Commit

Permalink
CLOUDP-200133: Add force reconfigure to automation config builder (#1382
Browse files Browse the repository at this point in the history
)

Co-authored-by: Rajdeep Das <[email protected]>
  • Loading branch information
lsierant and irajdeep authored Oct 13, 2023
1 parent 8a7fc2a commit f4d5326
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 19 deletions.
17 changes: 13 additions & 4 deletions pkg/automationconfig/automation_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package automationconfig
import (
"bytes"
"encoding/json"

"github.com/mongodb/mongodb-kubernetes-operator/pkg/authentication/scramcredentials"
"github.com/spf13/cast"
"github.com/stretchr/objx"
Expand Down Expand Up @@ -250,11 +251,19 @@ type EngineConfig struct {
CacheSizeGB float32 `json:"cacheSizeGB"`
}

// ReplSetForceConfig setting enables us to force reconfigure automation agent when the MongoDB deployment
// is in a broken state - for ex: doesn't have a primary.
// More info: https://www.mongodb.com/docs/ops-manager/current/reference/api/automation-config/automation-config-parameters/#replica-sets
type ReplSetForceConfig struct {
CurrentVersion int64 `json:"currentVersion"`
}

type ReplicaSet struct {
Id string `json:"_id"`
Members []ReplicaSetMember `json:"members"`
ProtocolVersion string `json:"protocolVersion"`
NumberArbiters int `json:"numberArbiters"`
Id string `json:"_id"`
Members []ReplicaSetMember `json:"members"`
ProtocolVersion string `json:"protocolVersion"`
NumberArbiters int `json:"numberArbiters"`
Force *ReplSetForceConfig `json:"force,omitempty"`
}

type ReplicaSetMember struct {
Expand Down
38 changes: 25 additions & 13 deletions pkg/automationconfig/automation_config_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,19 +39,20 @@ type Builder struct {
mongodbVersion string
previousAC AutomationConfig
// MongoDB installable versions
versions []MongoDbVersionConfig
backupVersions []BackupVersion
monitoringVersions []MonitoringVersion
options Options
processModifications []func(int, *Process)
modifications []Modification
auth *Auth
cafilePath string
sslConfig *TLS
tlsConfig *TLS
dataDir string
port int
memberOptions []MemberOptions
versions []MongoDbVersionConfig
backupVersions []BackupVersion
monitoringVersions []MonitoringVersion
options Options
processModifications []func(int, *Process)
modifications []Modification
auth *Auth
cafilePath string
sslConfig *TLS
tlsConfig *TLS
dataDir string
port int
memberOptions []MemberOptions
forceReconfigureToVersion *int64
}

func NewBuilder() *Builder {
Expand Down Expand Up @@ -191,6 +192,11 @@ func (b *Builder) SetAuth(auth Auth) *Builder {
return b
}

func (b *Builder) SetForceReconfigureToVersion(version int64) *Builder {
b.forceReconfigureToVersion = &version
return b
}

func (b *Builder) AddProcessModification(f func(int, *Process)) *Builder {
b.processModifications = append(b.processModifications, f)
return b
Expand Down Expand Up @@ -354,6 +360,11 @@ func (b *Builder) Build() (AutomationConfig, error) {
b.versions = append(b.versions, dummyConfig)
}

var replSetForceConfig *ReplSetForceConfig
if b.forceReconfigureToVersion != nil {
replSetForceConfig = &ReplSetForceConfig{CurrentVersion: *b.forceReconfigureToVersion}
}

currentAc := AutomationConfig{
Version: b.previousAC.Version,
Processes: processes,
Expand All @@ -363,6 +374,7 @@ func (b *Builder) Build() (AutomationConfig, error) {
Members: members,
ProtocolVersion: "1",
NumberArbiters: b.arbiters,
Force: replSetForceConfig,
},
},
MonitoringVersions: b.monitoringVersions,
Expand Down
15 changes: 13 additions & 2 deletions pkg/automationconfig/automation_config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,15 @@ func defaultMongoDbVersion(version string) MongoDbVersionConfig {
}

func TestBuildAutomationConfig(t *testing.T) {
ac, err := NewBuilder().
builder := NewBuilder().
SetName("my-rs").
SetDomain("my-ns.svc.cluster.local").
SetMongoDBVersion("4.2.0").
SetMembers(3).
SetFCV("4.0").
Build()
SetForceReconfigureToVersion(-1)

ac, err := builder.Build()

assert.NoError(t, err)
assert.Len(t, ac.Processes, 3)
Expand All @@ -56,13 +58,22 @@ func TestBuildAutomationConfig(t *testing.T) {
rs := ac.ReplicaSets[0]
assert.Equal(t, rs.Id, "my-rs", "The name provided should be configured to be the rs id")
assert.Len(t, rs.Members, 3, "there should be the number of replicas provided")
require.NotNil(t, rs.Force)
assert.Equal(t, ReplSetForceConfig{CurrentVersion: -1}, *rs.Force)

for i, member := range rs.Members {
assert.Equal(t, 1, *member.Votes)
assert.False(t, member.ArbiterOnly)
assert.Equal(t, i, member.Id)
assert.Equal(t, ac.Processes[i].Name, member.Host)
}

builder.SetForceReconfigureToVersion(1)
ac, err = builder.Build()
assert.NoError(t, err)
rs = ac.ReplicaSets[0]
require.NotNil(t, rs.Force)
assert.Equal(t, ReplSetForceConfig{CurrentVersion: 1}, *rs.Force)
}

func TestBuildAutomationConfigArbiters(t *testing.T) {
Expand Down

0 comments on commit f4d5326

Please sign in to comment.