Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aws
GitHub Repository: aws/aws-cli
Path: blob/develop/awscli/customizations/globalargs.py
1566 views
1
# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
#
3
# Licensed under the Apache License, Version 2.0 (the "License"). You
4
# may not use this file except in compliance with the License. A copy of
5
# the License is located at
6
#
7
# http://aws.amazon.com/apache2.0/
8
#
9
# or in the "license" file accompanying this file. This file is
10
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
# ANY KIND, either express or implied. See the License for the specific
12
# language governing permissions and limitations under the License.
13
import sys
14
import os
15
from botocore.client import Config
16
from botocore import UNSIGNED
17
from botocore.endpoint import DEFAULT_TIMEOUT
18
import jmespath
19
20
from awscli.compat import urlparse
21
22
def register_parse_global_args(cli):
23
cli.register('top-level-args-parsed', resolve_types,
24
unique_id='resolve-types')
25
cli.register('top-level-args-parsed', no_sign_request,
26
unique_id='no-sign')
27
cli.register('top-level-args-parsed', resolve_verify_ssl,
28
unique_id='resolve-verify-ssl')
29
cli.register('top-level-args-parsed', resolve_cli_read_timeout,
30
unique_id='resolve-cli-read-timeout')
31
cli.register('top-level-args-parsed', resolve_cli_connect_timeout,
32
unique_id='resolve-cli-connect-timeout')
33
34
35
def resolve_types(parsed_args, **kwargs):
36
# This emulates the "type" arg from argparse, but does so in a way
37
# that plugins can also hook into this process.
38
_resolve_arg(parsed_args, 'query')
39
_resolve_arg(parsed_args, 'endpoint_url')
40
41
42
def _resolve_arg(parsed_args, name):
43
value = getattr(parsed_args, name, None)
44
if value is not None:
45
new_value = getattr(sys.modules[__name__], '_resolve_%s' % name)(value)
46
setattr(parsed_args, name, new_value)
47
48
49
def _resolve_query(value):
50
try:
51
return jmespath.compile(value)
52
except Exception as e:
53
raise ValueError("Bad value for --query %s: %s" % (value, str(e)))
54
55
56
def _resolve_endpoint_url(value):
57
parsed = urlparse.urlparse(value)
58
# Our http library requires you specify an endpoint url
59
# that contains a scheme, so we'll verify that up front.
60
if not parsed.scheme:
61
raise ValueError('Bad value for --endpoint-url "%s": scheme is '
62
'missing. Must be of the form '
63
'http://<hostname>/ or https://<hostname>/' % value)
64
return value
65
66
67
def resolve_verify_ssl(parsed_args, session, **kwargs):
68
arg_name = 'verify_ssl'
69
arg_value = getattr(parsed_args, arg_name, None)
70
if arg_value is not None:
71
verify = None
72
# Only consider setting a custom ca_bundle if they
73
# haven't provided --no-verify-ssl.
74
if not arg_value:
75
verify = False
76
else:
77
# in case if `ca_bundle` not in args it'll be retrieved
78
# from config on session.client creation step
79
verify = getattr(parsed_args, 'ca_bundle', None)
80
setattr(parsed_args, arg_name, verify)
81
82
def no_sign_request(parsed_args, session, **kwargs):
83
if not parsed_args.sign_request:
84
# Disable request signing by setting the signature version to UNSIGNED
85
# in the default client configuration. This ensures all new clients
86
# will be created with signing disabled.
87
_update_default_client_config(session, 'signature_version', UNSIGNED)
88
89
def resolve_cli_connect_timeout(parsed_args, session, **kwargs):
90
arg_name = 'connect_timeout'
91
_resolve_timeout(session, parsed_args, arg_name)
92
93
94
def resolve_cli_read_timeout(parsed_args, session, **kwargs):
95
arg_name = 'read_timeout'
96
_resolve_timeout(session, parsed_args, arg_name)
97
98
def _resolve_timeout(session, parsed_args, arg_name):
99
arg_value = getattr(parsed_args, arg_name, None)
100
if arg_value is None:
101
arg_value = DEFAULT_TIMEOUT
102
arg_value = int(arg_value)
103
if arg_value == 0:
104
arg_value = None
105
setattr(parsed_args, arg_name, arg_value)
106
# Update in the default client config so that the timeout will be used
107
# by all clients created from then on.
108
_update_default_client_config(session, arg_name, arg_value)
109
110
111
def _update_default_client_config(session, arg_name, arg_value):
112
current_default_config = session.get_default_client_config()
113
new_default_config = Config(**{arg_name: arg_value})
114
if current_default_config is not None:
115
new_default_config = current_default_config.merge(new_default_config)
116
session.set_default_client_config(new_default_config)
117
118