Skip to content

Commit 252b969

Browse files
Add proxy support to Greengrass Discovery (#377)
Add proxy support to Greengrass Discovery client
1 parent 5f1eb44 commit 252b969

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

awsiot/greengrass_discovery.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0.
33

4-
from awscrt.http import HttpClientConnection, HttpRequest, HttpHeaders
4+
from awscrt.http import HttpClientConnection, HttpRequest, HttpHeaders, HttpProxyOptions
55
from awscrt.io import ClientBootstrap, ClientTlsContext, is_alpn_available, SocketOptions, TlsConnectionOptions
66
import awsiot
77
from concurrent.futures import Future
@@ -19,6 +19,7 @@ class DiscoveryClient:
1919
tls_context: Client TLS context
2020
region: AWS region (not used if gg_server_name is set)
2121
gg_server_name: optional full server name
22+
proxy_options: Proxy options (if None is provided then a proxy is not used)
2223
"""
2324
__slots__ = [
2425
'_bootstrap',
@@ -28,20 +29,22 @@ class DiscoveryClient:
2829
'_tls_connection_options',
2930
'_gg_server_name',
3031
'gg_url',
31-
'port']
32+
'port',
33+
"_proxy_options"]
3234

3335
def __init__(
3436
self,
3537
bootstrap: ClientBootstrap,
3638
socket_options: SocketOptions,
3739
tls_context: ClientTlsContext,
3840
region: str,
39-
gg_server_name: str = None):
41+
gg_server_name: str = None,
42+
proxy_options: HttpProxyOptions = None):
4043
assert isinstance(bootstrap, ClientBootstrap)
4144
assert isinstance(socket_options, SocketOptions)
4245
assert isinstance(tls_context, ClientTlsContext)
4346
assert isinstance(region, str)
44-
if gg_server_name is not None:
47+
if gg_server_name is not None:
4548
assert isinstance(gg_server_name, str)
4649

4750
self._bootstrap = bootstrap
@@ -55,6 +58,7 @@ def __init__(
5558
self._tls_connection_options = tls_context.new_connection_options()
5659
self._tls_connection_options.set_server_name(self._gg_server_name)
5760
self.port = 8443
61+
self._proxy_options = proxy_options
5862

5963
if is_alpn_available():
6064
self._tls_connection_options.set_alpn_list(['x-amzn-http-ca'])
@@ -119,7 +123,8 @@ def on_connection_completed(conn_future):
119123
port=self.port,
120124
socket_options=self._socket_options,
121125
tls_connection_options=self._tls_connection_options,
122-
bootstrap=self._bootstrap)
126+
bootstrap=self._bootstrap,
127+
proxy_options=self._proxy_options)
123128

124129
connect_future.add_done_callback(on_connection_completed)
125130

samples/basic_discovery.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0.
33

4+
import command_line_utils
45
import time
56
import json
67
from concurrent.futures import Future
7-
from awscrt import io
8+
from awscrt import io, http
89
from awscrt.mqtt import QoS
910
from awsiot.greengrass_discovery import DiscoveryClient
1011
from awsiot import mqtt_connection_builder
1112

1213
allowed_actions = ['both', 'publish', 'subscribe']
1314

1415
# Parse arguments
15-
import command_line_utils;
1616
cmdUtils = command_line_utils.CommandLineUtils("Basic Discovery - Greengrass discovery example.")
1717
cmdUtils.add_common_mqtt_commands()
1818
cmdUtils.add_common_topic_message_commands()
@@ -21,22 +21,41 @@
2121
cmdUtils.register_command("cert", "<path>", "Path to your client certificate in PEM format.", True, str)
2222
cmdUtils.remove_command("endpoint")
2323
cmdUtils.register_command("thing_name", "<str>", "The name assigned to your IoT Thing", required=True)
24-
cmdUtils.register_command("mode", "<mode>", "The operation mode (optional, default='both').\nModes:%s"%str(allowed_actions), default='both')
24+
cmdUtils.register_command(
25+
"mode", "<mode>",
26+
f"The operation mode (optional, default='both').\nModes:{allowed_actions}", default='both')
2527
cmdUtils.register_command("region", "<str>", "The region to connect through.", required=True)
26-
cmdUtils.register_command("max_pub_ops", "<int>", "The maximum number of publish operations (optional, default='10').", default=10, type=int)
27-
cmdUtils.register_command("print_discover_resp_only", "", "(optional, default='False').", default=False, type=bool, action="store_true")
28+
cmdUtils.register_command(
29+
"max_pub_ops", "<int>",
30+
"The maximum number of publish operations (optional, default='10').",
31+
default=10, type=int)
32+
cmdUtils.register_command(
33+
"print_discover_resp_only", "", "(optional, default='False').",
34+
default=False, type=bool, action="store_true")
35+
cmdUtils.add_common_proxy_commands()
2836
# Needs to be called so the command utils parse the commands
2937
cmdUtils.get_args()
3038

31-
tls_options = io.TlsContextOptions.create_client_with_mtls_from_path(cmdUtils.get_command_required("cert"), cmdUtils.get_command_required("key"))
39+
tls_options = io.TlsContextOptions.create_client_with_mtls_from_path(
40+
cmdUtils.get_command_required("cert"), cmdUtils.get_command_required("key"))
3241
if cmdUtils.get_command(cmdUtils.m_cmd_ca_file):
3342
tls_options.override_default_trust_store_from_path(None, cmdUtils.get_command(cmdUtils.m_cmd_ca_file))
3443
tls_context = io.ClientTlsContext(tls_options)
3544

3645
socket_options = io.SocketOptions()
3746

47+
proxy_options = None
48+
if cmdUtils.get_command(cmdUtils.m_cmd_proxy_host) != None and cmdUtils.get_command(cmdUtils.m_cmd_proxy_port) != None:
49+
proxy_options = http.HttpProxyOptions(
50+
cmdUtils.get_command_required(cmdUtils.m_cmd_proxy_host),
51+
cmdUtils.get_command_required(cmdUtils.m_cmd_proxy_port))
52+
3853
print('Performing greengrass discovery...')
39-
discovery_client = DiscoveryClient(io.ClientBootstrap.get_or_create_static_default(), socket_options, tls_context, cmdUtils.get_command_required("region"))
54+
discovery_client = DiscoveryClient(
55+
io.ClientBootstrap.get_or_create_static_default(),
56+
socket_options,
57+
tls_context,
58+
cmdUtils.get_command_required("region"), None, proxy_options)
4059
resp_future = discovery_client.discover(cmdUtils.get_command_required("thing_name"))
4160
discover_response = resp_future.result()
4261

@@ -59,7 +78,7 @@ def try_iot_endpoints():
5978
for gg_core in gg_group.cores:
6079
for connectivity_info in gg_core.connectivity:
6180
try:
62-
print('Trying core {} at host {} port {}'.format(gg_core.thing_arn, connectivity_info.host_address, connectivity_info.port))
81+
print (f"Trying core {gg_core.thing_arn} at host {connectivity_info.host_address} port {connectivity_info.port}")
6382
mqtt_connection = mqtt_connection_builder.mtls_from_path(
6483
endpoint=connectivity_info.host_address,
6584
port=connectivity_info.port,

0 commit comments

Comments
 (0)