Skip to content

Commit 0948b7e

Browse files
authored
CLOUDP-169740 Enable use of the EA images (#1271)
* CLOUDP-169740 Enable use of the EA images * Comments addressed * Comments addressed * Fix tests
1 parent c9f9b95 commit 0948b7e

File tree

11 files changed

+377
-6
lines changed

11 files changed

+377
-6
lines changed

.action_templates/jobs/tests.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ tests:
77
include:
88
- test-name: replica_set
99
distro: ubi
10+
- test-name: replica_set_enterprise_upgrade_4_5
11+
distro: ubi
12+
- test-name: replica_set_enterprise_upgrade_5_6
13+
distro: ubi
1014
- test-name: replica_set_recovery
1115
distro: ubi
1216
- test-name: replica_set_recovery

.github/workflows/e2e-fork.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ jobs:
8989
include:
9090
- test-name: replica_set
9191
distro: ubi
92+
- test-name: replica_set_enterprise_upgrade_4_5
93+
distro: ubi
94+
- test-name: replica_set_enterprise_upgrade_5_6
95+
distro: ubi
9296
- test-name: replica_set_recovery
9397
distro: ubi
9498
- test-name: replica_set_recovery

.github/workflows/e2e.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ jobs:
9595
include:
9696
- test-name: replica_set
9797
distro: ubi
98+
- test-name: replica_set_enterprise_upgrade_4_5
99+
distro: ubi
100+
- test-name: replica_set_enterprise_upgrade_5_6
101+
distro: ubi
98102
- test-name: replica_set_recovery
99103
distro: ubi
100104
- test-name: replica_set_recovery

controllers/construct/build_statefulset_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,87 @@ func TestManagedSecurityContext(t *testing.T) {
7777
assertStatefulSetIsBuiltCorrectly(t, mdb, sts)
7878
}
7979

80+
func TestGetMongoDBImage(t *testing.T) {
81+
type testConfig struct {
82+
setArgs func(t *testing.T)
83+
version string
84+
expectedImage string
85+
}
86+
tests := map[string]testConfig{
87+
"Default UBI8 Community image": {
88+
setArgs: func(t *testing.T) {
89+
t.Setenv(MongodbRepoUrl, "docker.io/mongodb")
90+
t.Setenv(MongodbImageEnv, "mongodb-community-server")
91+
},
92+
version: "6.0.5",
93+
expectedImage: "docker.io/mongodb/mongodb-community-server:6.0.5-ubi8",
94+
},
95+
"Overridden UBI8 Enterprise image": {
96+
setArgs: func(t *testing.T) {
97+
t.Setenv(MongodbRepoUrl, "docker.io/mongodb")
98+
t.Setenv(MongodbImageEnv, "mongodb-enterprise-server")
99+
},
100+
version: "6.0.5",
101+
expectedImage: "docker.io/mongodb/mongodb-enterprise-server:6.0.5-ubi8",
102+
},
103+
"Overridden UBI8 Enterprise image from Quay": {
104+
setArgs: func(t *testing.T) {
105+
t.Setenv(MongodbRepoUrl, "quay.io/mongodb")
106+
t.Setenv(MongodbImageEnv, "mongodb-enterprise-server")
107+
},
108+
version: "6.0.5",
109+
expectedImage: "quay.io/mongodb/mongodb-enterprise-server:6.0.5-ubi8",
110+
},
111+
"Overridden Ubuntu Community image": {
112+
setArgs: func(t *testing.T) {
113+
t.Setenv(MongodbRepoUrl, "docker.io/mongodb")
114+
t.Setenv(MongodbImageEnv, "mongodb-community-server")
115+
t.Setenv(MongoDBImageType, "ubuntu2204")
116+
},
117+
version: "6.0.5",
118+
expectedImage: "docker.io/mongodb/mongodb-community-server:6.0.5-ubuntu2204",
119+
},
120+
"Overridden UBI Community image": {
121+
setArgs: func(t *testing.T) {
122+
t.Setenv(MongodbRepoUrl, "docker.io/mongodb")
123+
t.Setenv(MongodbImageEnv, "mongodb-community-server")
124+
t.Setenv(MongoDBImageType, "ubi8")
125+
},
126+
version: "6.0.5",
127+
expectedImage: "docker.io/mongodb/mongodb-community-server:6.0.5-ubi8",
128+
},
129+
"Docker Inc images": {
130+
setArgs: func(t *testing.T) {
131+
t.Setenv(MongodbRepoUrl, "docker.io")
132+
t.Setenv(MongodbImageEnv, "mongo")
133+
},
134+
version: "6.0.5",
135+
expectedImage: "docker.io/mongo:6.0.5",
136+
},
137+
"Deprecated AppDB images defined the old way": {
138+
setArgs: func(t *testing.T) {
139+
t.Setenv(MongodbRepoUrl, "quay.io")
140+
t.Setenv(MongodbImageEnv, "mongodb/mongodb-enterprise-appdb-database-ubi")
141+
// In this example, we intentionally don't use the suffix from the env. variable and let users
142+
// define it in the version instead. There are some known customers who do this.
143+
// This is a backwards compatibility case.
144+
t.Setenv(MongoDBImageType, "will-be-ignored")
145+
},
146+
147+
version: "5.0.14-ent",
148+
expectedImage: "quay.io/mongodb/mongodb-enterprise-appdb-database-ubi:5.0.14-ent",
149+
},
150+
}
151+
for testName := range tests {
152+
t.Run(testName, func(t *testing.T) {
153+
testConfig := tests[testName]
154+
testConfig.setArgs(t)
155+
image := getMongoDBImage(testConfig.version)
156+
assert.Equal(t, testConfig.expectedImage, image)
157+
})
158+
}
159+
}
160+
80161
func TestMongod_Container(t *testing.T) {
81162
c := container.New(mongodbContainer("4.2", []corev1.VolumeMount{}, mdbv1.NewMongodConfiguration()))
82163

controllers/construct/mongodbstatefulset.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ import (
2222
corev1 "k8s.io/api/core/v1"
2323
)
2424

25+
var (
26+
OfficialMongodbRepoUrls = []string{"docker.io/mongodb", "quay.io/mongodb"}
27+
)
28+
2529
const (
2630
AgentName = "mongodb-agent"
2731
MongodbName = "mongod"
@@ -36,15 +40,16 @@ const (
3640
mongodbDatabaseServiceAccountName = "mongodb-database"
3741
agentHealthStatusFilePathValue = "/var/log/mongodb-mms-automation/healthstatus/agent-health-status.json"
3842

39-
MongodbRepoUrl = "MONGODB_REPO_URL"
40-
OfficialMongodbRepoUrl = "docker.io/mongodb"
43+
MongodbRepoUrl = "MONGODB_REPO_URL"
44+
OfficialMongodbEnterpriseServerImageName = "mongodb-enterprise-server"
4145

4246
headlessAgentEnv = "HEADLESS_AGENT"
4347
podNamespaceEnv = "POD_NAMESPACE"
4448
automationConfigEnv = "AUTOMATION_CONFIG_MAP"
4549
AgentImageEnv = "AGENT_IMAGE"
4650
MongodbImageEnv = "MONGODB_IMAGE"
4751
MongoDBImageType = "MDB_IMAGE_TYPE"
52+
MongoDBAssumeEnterpriseEnv = "MDB_ASSUME_ENTERPRISE"
4853
VersionUpgradeHookImageEnv = "VERSION_UPGRADE_HOOK_IMAGE"
4954
ReadinessProbeImageEnv = "READINESS_PROBE_IMAGE"
5055
agentLogLevelEnv = "AGENT_LOG_LEVEL"
@@ -318,9 +323,12 @@ func getMongoDBImage(version string) string {
318323
repoUrl = strings.TrimRight(repoUrl, "/")
319324
}
320325
mongoImageName := os.Getenv(MongodbImageEnv)
321-
if repoUrl == OfficialMongodbRepoUrl {
322-
return fmt.Sprintf("%s/%s:%s-%s", repoUrl, mongoImageName, version, imageType)
326+
for _, officialUrl := range OfficialMongodbRepoUrls {
327+
if repoUrl == officialUrl {
328+
return fmt.Sprintf("%s/%s:%s-%s", repoUrl, mongoImageName, version, imageType)
329+
}
323330
}
331+
324332
// This is the old images backwards compatibility code path.
325333
return fmt.Sprintf("%s/%s:%s", repoUrl, mongoImageName, version)
326334
}

controllers/replica_set_controller.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"encoding/json"
66
"fmt"
77
"os"
8+
"strconv"
9+
"strings"
810

911
"github.com/imdario/mergo"
1012
"github.com/stretchr/objx"
@@ -541,6 +543,7 @@ func buildAutomationConfig(mdb mdbv1.MongoDBCommunity, auth automationconfig.Aut
541543
}
542544

543545
return automationconfig.NewBuilder().
546+
IsEnterprise(guessEnterprise(mdb)).
544547
SetTopology(automationconfig.ReplicaSetTopology).
545548
SetName(mdb.Name).
546549
SetDomain(domain).
@@ -559,6 +562,32 @@ func buildAutomationConfig(mdb mdbv1.MongoDBCommunity, auth automationconfig.Aut
559562
Build()
560563
}
561564

565+
func guessEnterprise(mdb mdbv1.MongoDBCommunity) bool {
566+
overrideAssumption, err := strconv.ParseBool(os.Getenv(construct.MongoDBAssumeEnterpriseEnv))
567+
if err == nil {
568+
return overrideAssumption
569+
}
570+
571+
var overriddenImage string
572+
containers := mdb.Spec.StatefulSetConfiguration.SpecWrapper.Spec.Template.Spec.Containers
573+
if len(containers) > 0 {
574+
for _, c := range containers {
575+
if c.Name == construct.MongodbName {
576+
if len(c.Image) > 0 {
577+
overriddenImage = c.Image
578+
}
579+
}
580+
}
581+
}
582+
if len(overriddenImage) > 0 {
583+
if strings.Contains(overriddenImage, construct.OfficialMongodbEnterpriseServerImageName) {
584+
return true
585+
}
586+
return false
587+
}
588+
return os.Getenv(construct.MongodbImageEnv) == construct.OfficialMongodbEnterpriseServerImageName
589+
}
590+
562591
// buildService creates a Service that will be used for the Replica Set StatefulSet
563592
// that allows all the members of the STS to see each other.
564593
func (r *ReplicaSetReconciler) buildService(mdb mdbv1.MongoDBCommunity, portManager *agent.ReplicaSetPortManager) corev1.Service {

controllers/replicaset_controller_test.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,130 @@ func TestStatefulSet_IsCorrectlyConfigured(t *testing.T) {
173173
assert.NoError(t, err)
174174
assert.NotNil(t, acVolume.Secret, "automation config should be stored in a secret!")
175175
assert.Nil(t, acVolume.ConfigMap, "automation config should be stored in a secret, not a config map!")
176+
}
176177

178+
func TestGuessEnterprise(t *testing.T) {
179+
type testConfig struct {
180+
setArgs func(t *testing.T)
181+
mdb mdbv1.MongoDBCommunity
182+
expectedEnterprise bool
183+
}
184+
tests := map[string]testConfig{
185+
"No override and Community image": {
186+
setArgs: func(t *testing.T) {
187+
t.Setenv(construct.MongodbRepoUrl, "docker.io/mongodb")
188+
t.Setenv(construct.MongodbImageEnv, "mongodb-community-server")
189+
},
190+
mdb: mdbv1.MongoDBCommunity{},
191+
expectedEnterprise: false,
192+
},
193+
"No override and Enterprise image": {
194+
setArgs: func(t *testing.T) {
195+
t.Setenv(construct.MongodbRepoUrl, "docker.io/mongodb")
196+
t.Setenv(construct.MongodbImageEnv, "mongodb-enterprise-server")
197+
},
198+
mdb: mdbv1.MongoDBCommunity{},
199+
expectedEnterprise: true,
200+
},
201+
"Assuming enterprise manually": {
202+
setArgs: func(t *testing.T) {
203+
t.Setenv(construct.MongodbRepoUrl, "docker.io/mongodb")
204+
t.Setenv(construct.MongodbImageEnv, "mongodb-community-server")
205+
t.Setenv(construct.MongoDBAssumeEnterpriseEnv, "true")
206+
},
207+
mdb: mdbv1.MongoDBCommunity{},
208+
expectedEnterprise: true,
209+
},
210+
"Assuming community manually": {
211+
setArgs: func(t *testing.T) {
212+
t.Setenv(construct.MongodbRepoUrl, "docker.io/mongodb")
213+
t.Setenv(construct.MongodbImageEnv, "mongodb-enterprise-server")
214+
t.Setenv(construct.MongoDBAssumeEnterpriseEnv, "false")
215+
},
216+
mdb: mdbv1.MongoDBCommunity{},
217+
expectedEnterprise: false,
218+
},
219+
"Enterprise with different repo": {
220+
setArgs: func(t *testing.T) {
221+
t.Setenv(construct.MongodbRepoUrl, "some_other_repo.com/some_other_org")
222+
t.Setenv(construct.MongodbImageEnv, "mongodb-enterprise-server")
223+
},
224+
mdb: mdbv1.MongoDBCommunity{},
225+
expectedEnterprise: true,
226+
},
227+
"Community with different repo": {
228+
setArgs: func(t *testing.T) {
229+
t.Setenv(construct.MongodbRepoUrl, "some_other_repo.com/some_other_org")
230+
t.Setenv(construct.MongodbImageEnv, "mongodb-community-server")
231+
},
232+
mdb: mdbv1.MongoDBCommunity{},
233+
expectedEnterprise: false,
234+
},
235+
// This one is a corner case. We don't expect users to fall here very often as there are
236+
// dedicated variables to control this type of behavior.
237+
"Enterprise with StatefulSet override": {
238+
setArgs: func(t *testing.T) {
239+
t.Setenv(construct.MongodbRepoUrl, "some_other_repo.com/some_other_org")
240+
t.Setenv(construct.MongodbImageEnv, "mongodb-community-server")
241+
},
242+
mdb: mdbv1.MongoDBCommunity{
243+
Spec: mdbv1.MongoDBCommunitySpec{
244+
StatefulSetConfiguration: mdbv1.StatefulSetConfiguration{
245+
SpecWrapper: mdbv1.StatefulSetSpecWrapper{
246+
Spec: appsv1.StatefulSetSpec{
247+
Template: corev1.PodTemplateSpec{
248+
Spec: corev1.PodSpec{
249+
Containers: []corev1.Container{
250+
{
251+
Name: construct.MongodbName,
252+
Image: "another_repo.com/another_org/mongodb-enterprise-server",
253+
},
254+
},
255+
},
256+
},
257+
},
258+
},
259+
},
260+
},
261+
},
262+
expectedEnterprise: true,
263+
},
264+
"Enterprise with StatefulSet override to Community": {
265+
setArgs: func(t *testing.T) {
266+
t.Setenv(construct.MongodbRepoUrl, "some_other_repo.com/some_other_org")
267+
t.Setenv(construct.MongodbImageEnv, "mongodb-enterprise-server")
268+
},
269+
mdb: mdbv1.MongoDBCommunity{
270+
Spec: mdbv1.MongoDBCommunitySpec{
271+
StatefulSetConfiguration: mdbv1.StatefulSetConfiguration{
272+
SpecWrapper: mdbv1.StatefulSetSpecWrapper{
273+
Spec: appsv1.StatefulSetSpec{
274+
Template: corev1.PodTemplateSpec{
275+
Spec: corev1.PodSpec{
276+
Containers: []corev1.Container{
277+
{
278+
Name: construct.MongodbName,
279+
Image: "another_repo.com/another_org/mongodb-community-server",
280+
},
281+
},
282+
},
283+
},
284+
},
285+
},
286+
},
287+
},
288+
},
289+
expectedEnterprise: false,
290+
},
291+
}
292+
for testName := range tests {
293+
t.Run(testName, func(t *testing.T) {
294+
testConfig := tests[testName]
295+
testConfig.setArgs(t)
296+
calculatedEnterprise := guessEnterprise(testConfig.mdb)
297+
assert.Equal(t, testConfig.expectedEnterprise, calculatedEnterprise)
298+
})
299+
}
177300
}
178301

179302
func getVolumeByName(sts appsv1.StatefulSet, volumeName string) (corev1.Volume, error) {

pkg/automationconfig/automation_config_builder.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type Builder struct {
3535
name string
3636
fcv string
3737
topology Topology
38+
isEnterprise bool
3839
mongodbVersion string
3940
previousAC AutomationConfig
4041
// MongoDB installable versions
@@ -77,6 +78,11 @@ func (b *Builder) SetOptions(options Options) *Builder {
7778
return b
7879
}
7980

81+
func (b *Builder) IsEnterprise(isEnterprise bool) *Builder {
82+
b.isEnterprise = isEnterprise
83+
return b
84+
}
85+
8086
func (b *Builder) SetTopology(topology Topology) *Builder {
8187
b.topology = topology
8288
return b
@@ -265,6 +271,11 @@ func (b *Builder) Build() (AutomationConfig, error) {
265271
fcv = b.fcv
266272
}
267273

274+
mongoDBVersion := b.mongodbVersion
275+
if b.isEnterprise {
276+
mongoDBVersion = mongoDBVersion + "-ent"
277+
}
278+
268279
for i, h := range hostnames {
269280
// Arbiters start counting from b.members and up
270281
isArbiter := i >= b.members
@@ -286,7 +297,7 @@ func (b *Builder) Build() (AutomationConfig, error) {
286297
HostName: h,
287298
FeatureCompatibilityVersion: fcv,
288299
ProcessType: Mongod,
289-
Version: b.mongodbVersion,
300+
Version: mongoDBVersion,
290301
AuthSchemaVersion: 5,
291302
}
292303

@@ -336,7 +347,7 @@ func (b *Builder) Build() (AutomationConfig, error) {
336347
b.auth = &disabled
337348
}
338349

339-
dummyConfig := buildDummyMongoDbVersionConfig(b.mongodbVersion)
350+
dummyConfig := buildDummyMongoDbVersionConfig(mongoDBVersion)
340351
if !versionsContain(b.versions, dummyConfig) {
341352
b.versions = append(b.versions, dummyConfig)
342353
}

0 commit comments

Comments
 (0)