4
4
# The OpenSearch Contributors require contributions made to
5
5
# this file be licensed under the Apache-2.0 license or a
6
6
# compatible open source license.
7
-
7
+ import shutil
8
8
import subprocess
9
9
import unittest
10
10
import urllib .request
@@ -43,13 +43,12 @@ def test_download_artifacts(self, mock_is_container_daemon_running: Mock, mock_v
43
43
@patch ('validation_workflow.docker.validation_docker.ApiTestCases' )
44
44
@patch ('validation_workflow.docker.validation_docker.ValidateDocker.run_container' )
45
45
@patch ('validation_workflow.docker.validation_docker.InspectDockerImage.inspect_digest' )
46
- @patch ('time.sleep' , return_value = None )
47
- def test_staging (self , mock_time_sleep : Mock , mock_digest : Mock , mock_container : Mock , mock_test : Mock , mock_docker_image : Mock , mock_validation_args : Mock , mock_check_http : Mock ) -> None :
46
+ def test_staging (self , mock_digest : Mock , mock_container : Mock , mock_test : Mock , mock_docker_image : Mock , mock_validation_args : Mock , mock_check_http : Mock ) -> None :
48
47
# Set up mock objects
49
48
mock_validation_args .return_value .OS_image = 'opensearchstaging/opensearch-os'
50
49
mock_validation_args .return_value .version = '1.0.0.1000'
51
50
mock_validation_args .return_value .validate_digest_only = False
52
- mock_validation_args .return_value .allow_without_security = False
51
+ mock_validation_args .return_value .force_https = False
53
52
mock_validation_args .return_value .projects = ["opensearch" ]
54
53
mock_docker_image .return_value = MagicMock ()
55
54
mock_container .return_value = (True , 'test_file.yml' )
@@ -72,14 +71,33 @@ def test_staging(self, mock_time_sleep: Mock, mock_digest: Mock, mock_container:
72
71
mock_test .assert_called_once ()
73
72
mock_test .assert_has_calls ([call (), call ().test_apis ("1.0.0.1000" , ['opensearch' ], True )])
74
73
74
+ @patch ('validation_workflow.docker.validation_docker.ValidationArgs' )
75
+ @patch ('validation_workflow.docker.validation_docker.ValidateDocker.run_container' )
76
+ def test_container_startup_exception (self , mock_container : Mock , mock_validation_args : Mock ) -> None :
77
+ mock_validation_args .return_value .OS_image = 'opensearchstaging/opensearch-os'
78
+ mock_validation_args .return_value .version = '1.0.0.1000'
79
+ mock_validation_args .return_value .validate_digest_only = False
80
+ mock_validation_args .return_value .force_https = False
81
+ mock_validation_args .return_value .projects = ["opensearch" ]
82
+ mock_container .return_value = (False , 'test_file.yml' )
83
+
84
+ # Create instance of ValidateDocker class
85
+ validate_docker = ValidateDocker (mock_validation_args .return_value )
86
+ validate_docker .image_ids = {'opensearch' : 'images_id_0' }
87
+ validate_docker .replacements = [('opensearchproject/opensearch:1' , 'images_id_0' )]
88
+
89
+ with self .assertRaises (Exception ) as context :
90
+ validate_docker .validation ()
91
+ self .assertEqual (str (context .exception ), 'The container failed to start. Exiting the validation.' )
92
+ mock_container .assert_called_once ()
93
+
75
94
@patch ('validation_workflow.docker.validation_docker.ValidateDocker.check_http_request' )
76
95
@patch ('validation_workflow.docker.validation_docker.ValidationArgs' )
77
96
@patch ('validation_workflow.docker.validation_docker.InspectDockerImage' )
78
97
@patch ('validation_workflow.docker.validation_docker.ApiTestCases' )
79
98
@patch ('validation_workflow.docker.validation_docker.ValidateDocker.run_container' )
80
99
@patch ('validation_workflow.docker.validation_docker.InspectDockerImage.inspect_digest' )
81
- @patch ('time.sleep' , return_value = None )
82
- def test_digests (self , mock_time_sleep : Mock , mock_digest : Mock , mock_container : Mock , mock_test : Mock , mock_docker_image : Mock , mock_validation_args : Mock , mock_check_http : Mock ) -> None :
100
+ def test_digests (self , mock_digest : Mock , mock_container : Mock , mock_test : Mock , mock_docker_image : Mock , mock_validation_args : Mock , mock_check_http : Mock ) -> None :
83
101
# Set up mock objects
84
102
mock_validation_args .return_value .OS_image = 'opensearchstaging/opensearch-os'
85
103
mock_validation_args .return_value .version = '1.0.0.1000'
@@ -168,46 +186,46 @@ def test_docker_compose_files_exist(self) -> None:
168
186
self .assertTrue (urllib .request .urlopen (docker_compose_file_v1_url ).getcode () == 200 )
169
187
self .assertTrue (urllib .request .urlopen (docker_compose_file_v2_url ).getcode () == 200 )
170
188
171
- # @patch('validation_workflow.docker.validation_docker.ValidateDocker.check_http_request ')
189
+ @patch ('validation_workflow.docker.validation_docker.ValidateDocker.check_cluster_readiness ' )
172
190
@patch ('validation_workflow.docker.validation_docker.ValidationArgs' )
173
- @patch ('validation_workflow.docker.validation_docker.ApiTest.api_get ' )
174
- def test_check_http_request_success (self , mock_api_test : MagicMock , mock_validation_args : MagicMock ) -> None :
175
- mock_validation_args .return_value .test_readiness_urls = {
176
- 'https://localhost:9200/' : 'opensearch cluster API' ,
177
- 'http://localhost:5601/api/status' : 'opensearch-dashboards API' ,
178
- }
179
- mock_validation_args .return_value .version = '1.0.0'
180
-
181
- mock_api_test .return_value = (200 , "response" )
191
+ @patch ('validation_workflow.docker.validation_docker.ValidateDocker.run_container ' )
192
+ def test_staging_cluster_not_ready (self , mock_container : Mock , mock_validation_args : Mock , mock_cluster_readiness : Mock ) -> None :
193
+ mock_validation_args .return_value .OS_image = 'opensearchstaging/opensearch-os'
194
+ mock_validation_args . return_value . version = '1.0.0.1000'
195
+ mock_validation_args . return_value . validate_digest_only = False
196
+ mock_validation_args . return_value . force_https = False
197
+ mock_validation_args .return_value .projects = [ "opensearch" ]
198
+ mock_cluster_readiness . return_value = False
199
+ mock_container .return_value = (True , 'test_file.yml' )
182
200
183
201
validate_docker = ValidateDocker (mock_validation_args .return_value )
202
+ validate_docker .image_ids = {'opensearch' : 'images_id_0' }
203
+ validate_docker .replacements = [('opensearchproject/opensearch:1' , 'images_id_0' )]
184
204
185
- validate_docker .args .docker_source = 'dockerhub'
186
-
187
- result = validate_docker .check_http_request ()
188
-
189
- self .assertEqual (result , True )
190
- mock_api_test .assert_called ()
191
-
205
+ with self .assertRaises (Exception ) as context :
206
+ validate_docker .validation ()
207
+ self .assertEqual (str (context .exception ), 'Cluster is not ready for API test.' )
208
+ mock_cluster_readiness .assert_called_once ()
209
+
210
+ @patch .dict ('os.environ' , {'OPENSEARCH_INITIAL_ADMIN_PASSWORD' : 'admin' })
211
+ @patch .object (shutil , "copy2" )
212
+ @patch .object (subprocess , "check_output" )
213
+ @patch .object (subprocess , "run" )
214
+ @patch ('validation_workflow.docker.validation_docker.get_password' )
215
+ @patch ('validation_workflow.docker.validation_docker.ValidateDocker.inplace_change' )
192
216
@patch ('validation_workflow.docker.validation_docker.ValidationArgs' )
193
- @ patch ( 'validation_workflow.docker.validation_docker.ApiTest.api_get' )
194
- def test_check_http_request_failure ( self , mock_api_test : MagicMock , mock_validation_args : MagicMock ) -> None :
195
- mock_validation_args . return_value . test_readiness_urls = {
196
- 'https://localhost:9200/' : ' opensearch cluster API' ,
197
- 'http://localhost:5601/api/status' : 'opensearch-dashboards API' ,
198
- }
217
+ def test_run_container ( self , mock_validation_args : Mock , mock_inplace : Mock , mock_password : Mock , mock_subprocess_run : MagicMock ,
218
+ mock_check_output : MagicMock , mock_copy2 : MagicMock ) -> None :
219
+ image_ids = {"opensearch" : "sha1" , "opensearch-dashboards" : "sha2" }
220
+ mock_validation_args . return_value . projects = [ " opensearch" ]
221
+ mock_subprocess_run . return_value = subprocess . CompletedProcess ( args = 'docker-compose -f docker-compose.yml down' , returncode = 0 , stdout = b'' , stderr = b'' )
222
+ mock_password . return_value = "admin"
199
223
mock_validation_args .return_value .version = '1.0.0'
200
-
201
- mock_api_test .return_value = (400 , "response" )
202
-
203
224
validate_docker = ValidateDocker (mock_validation_args .return_value )
204
-
205
- validate_docker .args .docker_source = 'dockerhub'
206
-
207
- result = validate_docker .check_http_request ()
208
-
209
- self .assertEqual (result , False )
210
- mock_api_test .assert_called ()
225
+ result , self ._target_yml_file = validate_docker .run_container (image_ids , "2.11.0" )
226
+ self .assertEqual (result , True )
227
+ mock_subprocess_run .assert_called_with (f'docker-compose -f { validate_docker .tmp_dir .path } /docker-compose.yml up -d opensearch-node1 opensearch-node2' ,
228
+ shell = True , stdout = - 1 , stderr = - 1 , universal_newlines = True )
211
229
212
230
213
231
if __name__ == '__main__' :
0 commit comments