Skip to content
This repository was archived by the owner on Jan 1, 2024. It is now read-only.

Commit 4da59dd

Browse files
authored
Add cartridge_app_config_upload_http_timeout variable (#402)
Closes #401 Before the patch, in the `upload_app_config` step, the default timeouts were used for the clusterwide config patch and for uploading the config via HTTP. Now, the `cartridge_app_config_upload_http_timeout` variable is used as a config upload timeout for HTTP mode. Also, the `upload_app_config` step currently uses `twophase_upload_config_timeout`, `twophase_netbox_call_timeout` and `twophase_apply_config_timeout` variables.
1 parent 00b4569 commit 4da59dd

File tree

9 files changed

+71
-30
lines changed

9 files changed

+71
-30
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ README.md to use the newest tag with new release
1515
- Add `cartridge_log_dir_parent` to configure directory of logs
1616
- Add `cartridge_force_leader_control_instance` variable to choose a control
1717
instance among the leaders
18+
- Add `cartridge_app_config_upload_http_timeout` variable to configure timeout to
19+
wait config upload in HTTP mode.
1820

1921
### Fixed
2022

@@ -24,6 +26,7 @@ README.md to use the newest tag with new release
2426
- Fixed backup folder permissions
2527
- Handle empty values in `helpers.py`
2628
- Fixed templates of systemd units for TGZ packages
29+
- The twophase timeouts is used in the `upload_app_config` step
2730

2831
## [1.11.0] - 2021-07-30
2932

defaults/main.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ cartridge_app_config: null
102102
cartridge_app_config_path: null
103103
cartridge_app_config_upload_mode: null
104104
cartridge_app_config_upload_url: null
105+
cartridge_app_config_upload_http_timeout: 30
105106
cartridge_tdg_token: null
106107

107108
cartridge_auth: null

doc/app_config.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ which is on the same machine as the control instance:
121121
cartridge_app_config_upload_url: 'http://10.0.0.102:8083/admin/config'
122122
```
123123

124+
If you have a large configuration or slow connection, you can increase
125+
the upload timeout with `cartridge_app_config_upload_http_timeout` variable (default is `30`).
126+
124127
**Note** that directory uploading by HTTP mode is not yet supported.
125128

126129
### TDG mode

doc/steps.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ Input variables from config:
332332
- `cartridge_app_config_upload_url` - url of instance to upload config
333333
(`http://127.0.0.1:{control_instance.http_port}/admin/config` by default);
334334
- `cartridge_cluster_cookie` - cluster cookie for all cluster instances;
335+
- `cartridge_app_config_upload_http_timeout` - time in seconds to wait config upload in HTTP mode;
335336
- `cartridge_tdg_token` - token to upload config by HTTP in TDG.
336337

337338
## Step `configure_app_config`

doc/variables.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ For more details see [scenario documentation](/doc/scenario.md).
158158
- `cartridge_app_config_upload_mode` (`string`): mode of config uploading (`lua`, `http` or `tdg`);
159159
- `cartridge_app_config_upload_url` (`string`): url of instance to upload
160160
config (`http://127.0.0.1:{control_instance.http_port}/admin/config` by default);
161+
- `cartridge_app_config_upload_http_timeout` (`number`, default: `30`): time in seconds to wait config upload in HTTP mode;
161162
- `cartridge_tdg_token` (`string`): token to upload config by HTTP in TDG;
162163
- `cartridge_auth`: (`dict`): [authorization configuration](/doc/auth.md);
163164
- `cartridge_failover_params` (`dict`): [failover](/doc/failover.md) parameters;

library/cartridge_apply_app_config.py

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
'upload_url': {'required': False, 'type': 'str'},
1717
'cluster_cookie': {'required': False, 'type': 'str'},
1818
'tdg_token': {'required': False, 'type': 'str'},
19+
'http_timeout': {'required': False, 'type': 'int'},
20+
21+
'netbox_call_timeout': {'required': False, 'type': 'int'},
22+
'upload_config_timeout': {'required': False, 'type': 'int'},
23+
'apply_config_timeout': {'required': False, 'type': 'int'},
1924
}
2025

2126
LUA_MODE = 'lua'
@@ -50,14 +55,14 @@ def patch_file_clusterwide(control_console, file_path):
5055
return changed
5156

5257

53-
def send_on_http(upload_url, headers, config_path):
58+
def send_on_http(upload_url, headers, config_path, http_timeout):
5459
headers.update({
5560
'Content-Length': os.stat(config_path).st_size
5661
})
5762

5863
with open(config_path, 'rb') as data:
5964
try:
60-
resp = open_url(upload_url, method='PUT', headers=headers, data=data)
65+
resp = open_url(upload_url, method='PUT', headers=headers, data=data, timeout=http_timeout)
6166
except Exception as e:
6267
assert hasattr(e, 'code'), str(e)
6368
resp = e
@@ -77,8 +82,7 @@ def send_on_http(upload_url, headers, config_path):
7782
return True
7883

7984

80-
def apply_tdg_config(console_sock, path):
81-
control_console = helpers.get_control_console(console_sock)
85+
def apply_tdg_config(control_console, path):
8286
_, err = control_console.eval_res_err('''
8387
return admin.upload_config_api(...)
8488
''', path)
@@ -147,11 +151,7 @@ def prepare_config(config_path, output_format, upload_mode):
147151
####################
148152

149153

150-
def get_tdg_upload_mode(console_sock):
151-
if console_sock is None:
152-
return 'http'
153-
154-
control_console = helpers.get_control_console(console_sock)
154+
def get_tdg_upload_mode(control_console):
155155
return control_console.eval_res_err('''
156156
if rawget(_G, 'admin') ~= nil and rawget(_G.admin, 'upload_config_api') ~= nil then
157157
return 'lua'
@@ -160,13 +160,10 @@ def get_tdg_upload_mode(console_sock):
160160
''')[0]
161161

162162

163-
def get_tdg_http_headers(console_sock, tdg_token):
163+
def get_tdg_http_headers(control_console, tdg_token):
164164
if tdg_token is None:
165165
return {}
166166

167-
assert console_sock is not None, "Console socket is required for TDG mode"
168-
control_console = helpers.get_control_console(console_sock)
169-
170167
tdg_version = control_console.eval_res_err('''
171168
local ok, app_version = pcall(require, 'common.app_version')
172169
if not ok then
@@ -208,54 +205,51 @@ def prepare_upload_mode(upload_mode, remote_config_path):
208205
return upload_mode
209206

210207

211-
def get_output_format_and_apply_config_func_for_lua(console_sock):
212-
assert console_sock is not None, "Console socket is required for Lua mode"
213-
214-
control_console = helpers.get_control_console(console_sock)
215-
208+
def get_output_format_and_apply_config_func_for_lua(control_console):
216209
return FILE_OUTPUT_FORMAT, lambda path: patch_file_clusterwide(control_console, path)
217210

218211

219-
def get_output_format_and_apply_config_func_for_http(upload_url, cluster_cookie):
212+
def get_output_format_and_apply_config_func_for_http(upload_url, cluster_cookie, http_timeout):
220213
assert cluster_cookie is not None, 'Cluster cookie is required for HTTP mode'
221214
assert upload_url is not None, 'Upload URL is required for HTTP mode'
222215

223216
headers = {'Authorization': basic_auth_header('admin', cluster_cookie)}
224217

225-
return FILE_OUTPUT_FORMAT, lambda path: send_on_http(upload_url, headers, path)
218+
return FILE_OUTPUT_FORMAT, lambda path: send_on_http(upload_url, headers, path, http_timeout)
226219

227220

228-
def get_output_format_and_apply_config_func_for_tdg(console_sock, upload_url, tdg_token):
229-
tdg_upload_mode = get_tdg_upload_mode(console_sock)
221+
def get_output_format_and_apply_config_func_for_tdg(control_console, upload_url, tdg_token, http_timeout):
222+
tdg_upload_mode = get_tdg_upload_mode(control_console)
230223

231224
if tdg_upload_mode == 'http':
232225
assert upload_url is not None, 'Upload URL is required for TDG mode'
233226

234-
headers = get_tdg_http_headers(console_sock, tdg_token)
227+
headers = get_tdg_http_headers(control_console, tdg_token)
235228

236-
return ZIP_OUTPUT_FORMAT, lambda path: send_on_http(upload_url, headers, path)
229+
return ZIP_OUTPUT_FORMAT, lambda path: send_on_http(upload_url, headers, path, http_timeout)
237230

238231
elif tdg_upload_mode == 'lua':
239-
return DIR_OUTPUT_FORMAT, lambda path: apply_tdg_config(console_sock, path)
232+
return DIR_OUTPUT_FORMAT, lambda path: apply_tdg_config(control_console, path)
240233

241234
raise AssertionError("Unknown TDG upload mode '%s'" % tdg_upload_mode)
242235

243236

244237
def get_output_format_and_apply_config_func(
245238
upload_mode,
246-
console_sock=None,
239+
control_console=None,
247240
upload_url=None,
248241
cluster_cookie=None,
249242
tdg_token=None,
243+
http_timeout=None,
250244
):
251245
if upload_mode == LUA_MODE:
252-
return get_output_format_and_apply_config_func_for_lua(console_sock)
246+
return get_output_format_and_apply_config_func_for_lua(control_console)
253247

254248
elif upload_mode == HTTP_MODE:
255-
return get_output_format_and_apply_config_func_for_http(upload_url, cluster_cookie)
249+
return get_output_format_and_apply_config_func_for_http(upload_url, cluster_cookie, http_timeout)
256250

257251
elif upload_mode == TDG_MODE:
258-
return get_output_format_and_apply_config_func_for_tdg(console_sock, upload_url, tdg_token)
252+
return get_output_format_and_apply_config_func_for_tdg(control_console, upload_url, tdg_token, http_timeout)
259253

260254
raise AssertionError("Unknown upload mode '%s'" % upload_mode)
261255

@@ -266,6 +260,10 @@ def get_output_format_and_apply_config_func(
266260

267261

268262
def apply_app_config(params):
263+
console_sock = params['console_sock']
264+
control_console = helpers.get_control_console(console_sock)
265+
helpers.set_twophase_options_from_params(control_console, params)
266+
269267
# We cannot use the fact 'dest' from the copy task,
270268
# because in the case of transferring a folder with one file,
271269
# 'dest' will contain the path to the file, not the path to the folder.
@@ -279,10 +277,11 @@ def apply_app_config(params):
279277

280278
output_format, apply_config_func = get_output_format_and_apply_config_func(
281279
upload_mode,
282-
console_sock=params['console_sock'],
280+
control_console=control_console,
283281
upload_url=params['upload_url'],
284282
cluster_cookie=params['cluster_cookie'],
285283
tdg_token=params['tdg_token'],
284+
http_timeout=params.get('http_timeout'),
286285
)
287286

288287
temp_paths = [remote_config_path]

molecule/config_upload/converge.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
cartridge_app_config_path: './configs/config.yml'
2828
cartridge_app_config_upload_mode: null
2929
cartridge_app_config_upload_url: 'http://vm1:3301/admin/config'
30+
cartridge_app_config_upload_http_timeout: 30
3031
expected_test_section: {config-file-key: yml}
3132

3233
- name: 'Upload YAML config by Lua'
@@ -36,6 +37,7 @@
3637
cartridge_app_config_path: './configs/config.yaml'
3738
cartridge_app_config_upload_mode: null
3839
cartridge_app_config_upload_url: 'http://vm1:3302/admin/config'
40+
cartridge_app_config_upload_http_timeout: 30
3941
expected_test_section: {config-file-key: yaml}
4042

4143
# File config to Cartridge by HTTP
@@ -47,6 +49,7 @@
4749
cartridge_app_config_path: './configs/config.yml'
4850
cartridge_app_config_upload_mode: 'http'
4951
cartridge_app_config_upload_url: null
52+
cartridge_app_config_upload_http_timeout: 30
5053
expected_test_section: {config-file-key: yml}
5154

5255
- name: 'Upload YAML config by HTTP'
@@ -56,6 +59,7 @@
5659
cartridge_app_config_path: './configs/config.yaml'
5760
cartridge_app_config_upload_mode: 'http'
5861
cartridge_app_config_upload_url: null
62+
cartridge_app_config_upload_http_timeout: 30
5963
expected_test_section: {config-file-key: yaml}
6064

6165
###############
@@ -72,6 +76,7 @@
7276
cartridge_app_config_path: './configs/config-yaml'
7377
cartridge_app_config_upload_mode: 'lua'
7478
cartridge_app_config_upload_url: null
79+
cartridge_app_config_upload_http_timeout: 30
7580
- name: 'Check upload config failed'
7681
assert:
7782
fail_msg: 'Upload folder config by Lua should fail'
@@ -91,6 +96,7 @@
9196
cartridge_app_config_path: './configs/config-yml-json'
9297
cartridge_app_config_upload_mode: null
9398
cartridge_app_config_upload_url: null
99+
cartridge_app_config_upload_http_timeout: 30
94100
- name: 'Check upload config failed'
95101
assert:
96102
fail_msg: 'Upload folder config by HTTP to Cartridge should fail'
@@ -110,6 +116,7 @@
110116
cartridge_app_config_path: './configs/config.yml'
111117
cartridge_app_config_upload_mode: 'tdg'
112118
cartridge_app_config_upload_url: null
119+
cartridge_app_config_upload_http_timeout: 30
113120
- name: 'Check upload config failed'
114121
assert:
115122
fail_msg: 'Upload file config to Cartridge by TDG mode should fail'
@@ -129,9 +136,30 @@
129136
cartridge_app_config_path: './configs/config.zip'
130137
cartridge_app_config_upload_mode: 'tdg'
131138
cartridge_app_config_upload_url: null
139+
cartridge_app_config_upload_http_timeout: 30
132140
- name: 'Check upload config failed'
133141
assert:
134142
fail_msg: 'Upload ZIP config to Cartridge by TDG mode should fail'
135143
success_msg: 'Upload ZIP config to Cartridge by TDG mode failed'
136144
that: apply_app_config_res.failed # Here will be error from Cartridge
137145
run_once: true
146+
147+
# HTTP timeout for upload
148+
149+
- name: 'Upload YML config by HTTP'
150+
ignore_errors: true
151+
import_role:
152+
name: ansible-cartridge
153+
vars:
154+
cartridge_app_config_path: './configs/config.yml'
155+
cartridge_app_config_upload_mode: 'http'
156+
cartridge_app_config_upload_url: 'http://vm1:3301/admin/config'
157+
cartridge_app_config_upload_http_timeout: 0
158+
- name: 'Check upload config failed'
159+
assert:
160+
fail_msg: 'urlopen should raise error'
161+
success_msg: 'urlopen raises error'
162+
that:
163+
- apply_app_config_res.failed
164+
- '"urlopen error" in apply_app_config_res.msg'
165+
run_once: true

tasks/set_instance_facts.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
cartridge_app_config_path: '{{ cartridge_app_config_path }}'
105105
cartridge_app_config_upload_mode: '{{ cartridge_app_config_upload_mode }}'
106106
cartridge_app_config_upload_url: '{{ cartridge_app_config_upload_url }}'
107+
cartridge_app_config_upload_http_timeout: '{{ cartridge_app_config_upload_http_timeout }}'
107108
cartridge_tdg_token: '{{ cartridge_tdg_token }}'
108109

109110
cartridge_auth: '{{ cartridge_auth }}'

tasks/steps/upload_app_config.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828
}}'
2929
cluster_cookie: '{{ cartridge_cluster_cookie }}'
3030
tdg_token: '{{ cartridge_tdg_token }}'
31+
http_timeout: '{{ cartridge_app_config_upload_http_timeout }}'
32+
netbox_call_timeout: '{{ twophase_netbox_call_timeout }}'
33+
upload_config_timeout: '{{ twophase_upload_config_timeout }}'
34+
apply_config_timeout: '{{ twophase_apply_config_timeout }}'
3135
register: apply_app_config_res
3236

3337
- name: 'Add uploaded config to "temporary_files" fact'

0 commit comments

Comments
 (0)