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