1
- from typing import Optional
2
-
3
1
import pymongo
4
2
import yaml
3
+ from pytest import fixture , mark
4
+
5
5
from kubetester import create_or_update_secret , try_load
6
6
from kubetester .certs import create_mongodb_tls_certs , create_tls_certs
7
- from kubetester .kubetester import KubernetesTester , is_multi_cluster
7
+ from kubetester .kubetester import KubernetesTester
8
8
from kubetester .kubetester import fixture as yaml_fixture
9
9
from kubetester .mongodb import MongoDB
10
10
from kubetester .mongodb_search import MongoDBSearch
11
11
from kubetester .mongodb_user import MongoDBUser
12
12
from kubetester .omtester import skip_if_cloud_manager
13
- from kubetester .opsmanager import MongoDBOpsManager
14
13
from kubetester .phase import Phase
15
- from pytest import fixture , mark
16
14
from tests import test_logger
17
- from tests .common .ops_manager .cloud_manager import is_cloud_qa
18
15
from tests .common .search import movies_search_helper
19
- from tests .common .search .movies_search_helper import SampleMoviesSearchHelper
20
16
from tests .common .search .search_tester import SearchTester
21
- from tests .conftest import get_default_operator
22
- from tests .opsmanager .withMonitoredAppDB . conftest import enable_multi_cluster_deployment
17
+ from tests .conftest import get_default_operator , get_issuer_ca_filepath
18
+ from tests .opsmanager .conftest import custom_om_prev_version
23
19
from tests .search .om_deployment import get_ops_manager
24
20
25
21
logger = test_logger .get_test_logger (__name__ )
38
34
# MongoDBSearch TLS configuration
39
35
MDBS_TLS_SECRET_NAME = "mdbs-tls-secret"
40
36
37
+ MDB_VERSION_WITHOUT_BUILT_IN_ROLE = "8.0.10-ent"
38
+ MDB_VERSION_WITH_BUILT_IN_ROLE = "8.2.0-ent"
39
+
41
40
42
41
@fixture (scope = "function" )
43
42
def mdb (namespace : str , issuer_ca_configmap : str ) -> MongoDB :
@@ -47,6 +46,7 @@ def mdb(namespace: str, issuer_ca_configmap: str) -> MongoDB:
47
46
namespace = namespace ,
48
47
)
49
48
resource .configure (om = get_ops_manager (namespace ), project_name = MDB_RESOURCE_NAME )
49
+ resource .set_version (MDB_VERSION_WITHOUT_BUILT_IN_ROLE )
50
50
51
51
if try_load (resource ):
52
52
return resource
@@ -81,6 +81,7 @@ def admin_user(namespace: str) -> MongoDBUser:
81
81
if try_load (resource ):
82
82
return resource
83
83
84
+ resource ["spec" ]["mongodbResourceRef" ]["name" ] = MDB_RESOURCE_NAME
84
85
resource ["spec" ]["username" ] = resource .name
85
86
resource ["spec" ]["passwordSecretKeyRef" ]["name" ] = f"{ resource .name } -password"
86
87
@@ -94,6 +95,7 @@ def user(namespace: str) -> MongoDBUser:
94
95
if try_load (resource ):
95
96
return resource
96
97
98
+ resource ["spec" ]["mongodbResourceRef" ]["name" ] = MDB_RESOURCE_NAME
97
99
resource ["spec" ]["username" ] = resource .name
98
100
resource ["spec" ]["passwordSecretKeyRef" ]["name" ] = f"{ resource .name } -password"
99
101
@@ -111,6 +113,7 @@ def mongot_user(namespace: str, mdbs: MongoDBSearch) -> MongoDBUser:
111
113
if try_load (resource ):
112
114
return resource
113
115
116
+ resource ["spec" ]["mongodbResourceRef" ]["name" ] = MDB_RESOURCE_NAME
114
117
resource ["spec" ]["username" ] = MONGOT_USER_NAME
115
118
resource ["spec" ]["passwordSecretKeyRef" ]["name" ] = f"{ resource .name } -password"
116
119
@@ -162,19 +165,19 @@ def test_create_users(
162
165
create_or_update_secret (
163
166
namespace , name = admin_user ["spec" ]["passwordSecretKeyRef" ]["name" ], data = {"password" : ADMIN_USER_PASSWORD }
164
167
)
165
- admin_user .create ()
168
+ admin_user .update ()
166
169
admin_user .assert_reaches_phase (Phase .Updated , timeout = 300 )
167
170
168
171
create_or_update_secret (
169
172
namespace , name = user ["spec" ]["passwordSecretKeyRef" ]["name" ], data = {"password" : USER_PASSWORD }
170
173
)
171
- user .create ()
174
+ user .update ()
172
175
user .assert_reaches_phase (Phase .Updated , timeout = 300 )
173
176
174
177
create_or_update_secret (
175
178
namespace , name = mongot_user ["spec" ]["passwordSecretKeyRef" ]["name" ], data = {"password" : MONGOT_USER_PASSWORD }
176
179
)
177
- mongot_user .create ()
180
+ mongot_user .update ()
178
181
# we deliberately don't wait for this user to be ready, because to be reconciled successfully it needs the searchCoordinator role
179
182
# which the ReplicaSet reconciler will only define in the automation config after the MongoDBSearch resource is created.
180
183
@@ -187,7 +190,6 @@ def test_create_search_resource(mdbs: MongoDBSearch):
187
190
188
191
@mark .e2e_search_enterprise_tls
189
192
def test_wait_for_database_resource_ready (mdb : MongoDB ):
190
- mdb .assert_abandons_phase (Phase .Running , timeout = 300 )
191
193
mdb .assert_reaches_phase (Phase .Running , timeout = 300 )
192
194
193
195
for idx in range (mdb .get_members ()):
@@ -196,18 +198,85 @@ def test_wait_for_database_resource_ready(mdb: MongoDB):
196
198
f"{ mdb .name } -{ idx } " , mdb .namespace , ["cat" , "/data/automation-mongod.conf" ]
197
199
)
198
200
)
199
- setParameter = mongod_config .get ("setParameter" , {})
201
+ set_parameter = mongod_config .get ("setParameter" , {})
200
202
assert (
201
- "mongotHost" in setParameter and "searchIndexManagementHostAndPort" in setParameter
203
+ "mongotHost" in set_parameter and "searchIndexManagementHostAndPort" in set_parameter
202
204
), "mongot parameters not found in mongod config"
203
205
204
206
205
207
@mark .e2e_search_enterprise_tls
206
- def test_validate_tls_connections (mdb : MongoDB , mdbs : MongoDBSearch , namespace : str , issuer_ca_filepath : str ):
208
+ def test_validate_tls_connections (mdb : MongoDB , mdbs : MongoDBSearch , namespace : str ):
209
+ validate_tls_connections (mdb , mdbs , namespace )
210
+
211
+
212
+ @mark .e2e_search_enterprise_tls
213
+ def test_search_restore_sample_database (mdb : MongoDB ):
214
+ get_admin_sample_movies_helper (mdb ).restore_sample_database ()
215
+
216
+
217
+ @mark .e2e_search_enterprise_tls
218
+ def test_search_create_search_index (mdb : MongoDB ):
219
+ get_user_sample_movies_helper (mdb ).create_search_index ()
220
+
221
+
222
+ @mark .e2e_search_enterprise_tls
223
+ def test_search_assert_search_query (mdb : MongoDB ):
224
+ get_user_sample_movies_helper (mdb ).assert_search_query (retry_timeout = 60 )
225
+
226
+
227
+ @mark .e2e_search_enterprise_tls
228
+ class TestUpgradeMongod :
229
+ def test_check_polyfilled_role_in_ac (self , mdb : MongoDB ):
230
+ custom_roles = mdb .get_automation_config_tester ().automation_config .get ("roles" , [])
231
+ assert (len (custom_roles ) > 0 )
232
+ assert ("searchCoordinator" in [role ["role" ] for role in custom_roles ])
233
+
234
+ def test_mongod_version (self , mdb : MongoDB ):
235
+ mdb .tester (ca_path = get_issuer_ca_filepath (), use_ssl = True ).assert_version (MDB_VERSION_WITHOUT_BUILT_IN_ROLE )
236
+
237
+ def test_upgrade_to_mongo_8_2 (self , mdb : MongoDB ):
238
+ mdb .set_version (MDB_VERSION_WITH_BUILT_IN_ROLE )
239
+ mdb .update ()
240
+ mdb .assert_reaches_phase (Phase .Running , timeout = 600 )
241
+
242
+ def test_check_polyfilled_role_not_in_ac (self , mdb : MongoDB ):
243
+ custom_roles = mdb .get_automation_config_tester ().automation_config .get ("roles" , [])
244
+ assert (len (custom_roles ) >= 0 )
245
+ assert ("searchCoordinator" not in [role ["role" ] for role in custom_roles ])
246
+
247
+ def test_mongod_version_after_upgrade (self , mdb : MongoDB ):
248
+ mdb_tester = mdb .tester (ca_path = get_issuer_ca_filepath (), use_ssl = True )
249
+ mdb_tester .assert_scram_sha_authentication (ADMIN_USER_NAME , ADMIN_USER_PASSWORD , "SCRAM-SHA-256" , 1 , ssl = True , tlsCAFile = get_issuer_ca_filepath ())
250
+ # TODO check why assert version works without auth for 8.0 and not for 8.2
251
+ mdb_tester .assert_version (MDB_VERSION_WITH_BUILT_IN_ROLE )
252
+
253
+
254
+ @mark .e2e_search_enterprise_tlssh
255
+ def test_search_assert_search_query_2 (mdb : MongoDB ):
256
+ get_user_sample_movies_helper (mdb ).assert_search_query (retry_timeout = 60 )
257
+
258
+
259
+ def get_connection_string (mdb : MongoDB , user_name : str , user_password : str ) -> str :
260
+ return f"mongodb://{ user_name } :{ user_password } @{ mdb .name } -0.{ mdb .name } -svc.{ mdb .namespace } .svc.cluster.local:27017/?replicaSet={ mdb .name } "
261
+
262
+
263
+ def get_admin_sample_movies_helper (mdb ):
264
+ return movies_search_helper .SampleMoviesSearchHelper (
265
+ SearchTester (get_connection_string (mdb , ADMIN_USER_NAME , ADMIN_USER_PASSWORD ), use_ssl = True , ca_path = get_issuer_ca_filepath ())
266
+ )
267
+
268
+
269
+ def get_user_sample_movies_helper (mdb ):
270
+ return movies_search_helper .SampleMoviesSearchHelper (
271
+ SearchTester (get_connection_string (mdb , USER_NAME , USER_PASSWORD ), use_ssl = True , ca_path = get_issuer_ca_filepath ())
272
+ )
273
+
274
+
275
+ def validate_tls_connections (mdb : MongoDB , mdbs : MongoDBSearch , namespace : str ):
207
276
with pymongo .MongoClient (
208
277
f"mongodb://{ mdb .name } -0.{ mdb .name } -svc.{ namespace } .svc.cluster.local:27017/?replicaSet={ mdb .name } " ,
209
278
tls = True ,
210
- tlsCAFile = issuer_ca_filepath ,
279
+ tlsCAFile = get_issuer_ca_filepath () ,
211
280
tlsAllowInvalidHostnames = False ,
212
281
serverSelectionTimeoutMS = 30000 ,
213
282
connectTimeoutMS = 20000 ,
@@ -218,40 +287,10 @@ def test_validate_tls_connections(mdb: MongoDB, mdbs: MongoDBSearch, namespace:
218
287
with pymongo .MongoClient (
219
288
f"mongodb://{ mdbs .name } -search-svc.{ namespace } .svc.cluster.local:27027" ,
220
289
tls = True ,
221
- tlsCAFile = issuer_ca_filepath ,
290
+ tlsCAFile = get_issuer_ca_filepath () ,
222
291
tlsAllowInvalidHostnames = False ,
223
292
serverSelectionTimeoutMS = 10000 ,
224
293
connectTimeoutMS = 10000 ,
225
294
) as search_client :
226
295
search_info = search_client .admin .command ("hello" )
227
296
assert search_info .get ("ok" ) == 1 , "MongoDBSearch connection failed"
228
-
229
-
230
- @mark .e2e_search_enterprise_tls
231
- def test_search_restore_sample_database (mdb : MongoDB , issuer_ca_filepath : str ):
232
- sample_movies_helper = movies_search_helper .SampleMoviesSearchHelper (
233
- SearchTester (
234
- get_connection_string (mdb , ADMIN_USER_NAME , ADMIN_USER_PASSWORD ), use_ssl = True , ca_path = issuer_ca_filepath
235
- )
236
- )
237
- sample_movies_helper .restore_sample_database ()
238
-
239
-
240
- @mark .e2e_search_enterprise_tls
241
- def test_search_create_search_index (mdb : MongoDB , issuer_ca_filepath : str ):
242
- sample_movies_helper = movies_search_helper .SampleMoviesSearchHelper (
243
- SearchTester (get_connection_string (mdb , USER_NAME , USER_PASSWORD ), use_ssl = True , ca_path = issuer_ca_filepath )
244
- )
245
- sample_movies_helper .create_search_index ()
246
-
247
-
248
- @mark .e2e_search_enterprise_tls
249
- def test_search_assert_search_query (mdb : MongoDB , issuer_ca_filepath : str ):
250
- sample_movies_helper = movies_search_helper .SampleMoviesSearchHelper (
251
- SearchTester (get_connection_string (mdb , USER_NAME , USER_PASSWORD ), use_ssl = True , ca_path = issuer_ca_filepath )
252
- )
253
- sample_movies_helper .assert_search_query (retry_timeout = 60 )
254
-
255
-
256
- def get_connection_string (mdb : MongoDB , user_name : str , user_password : str ) -> str :
257
- return f"mongodb://{ user_name } :{ user_password } @{ mdb .name } -0.{ mdb .name } -svc.{ mdb .namespace } .svc.cluster.local:27017/?replicaSet={ mdb .name } "
0 commit comments