Skip to content
This repository was archived by the owner on Oct 29, 2023. It is now read-only.

Commit 9b4205b

Browse files
authored
Updates library versions and tests [(#1884)](GoogleCloudPlatform/python-docs-samples#1884)
* Updates library versions and tests
1 parent d90b81d commit 9b4205b

File tree

5 files changed

+133
-24
lines changed

5 files changed

+133
-24
lines changed

samples/api-client/manager/manager.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,28 @@ def set_iam_permissions(
490490
# [END iot_set_iam_policy]
491491

492492

493+
def send_command(
494+
service_account_json, project_id, cloud_region, registry_id, device_id,
495+
command):
496+
"""Send a command to a device."""
497+
# [START iot_send_command]
498+
print('Sending command to device')
499+
client = get_client(service_account_json)
500+
device_path = 'projects/{}/locations/{}/registries/{}/devices/{}'.format(
501+
project_id, cloud_region, registry_id, device_id)
502+
503+
config_body = {
504+
'binaryData': base64.urlsafe_b64encode(
505+
command.encode('utf-8')).decode('ascii')
506+
}
507+
508+
return client.projects(
509+
).locations().registries(
510+
).devices().sendCommandToDevice(
511+
name=device_path, body=config_body).execute()
512+
# [END iot_send_command]
513+
514+
493515
def parse_command_line_args():
494516
"""Parse command line arguments."""
495517
default_registry = 'cloudiot_device_manager_example_registry_{}'.format(
@@ -546,6 +568,10 @@ def parse_command_line_args():
546568
'--role',
547569
default=None,
548570
help='Role used for IAM commands.')
571+
parser.add_argument(
572+
'--send_command',
573+
default='1',
574+
help='The command sent to the device')
549575

550576
# Command subparser
551577
command = parser.add_subparsers(dest='command')
@@ -566,6 +592,7 @@ def parse_command_line_args():
566592
command.add_parser('list-registries', help=list_registries.__doc__)
567593
command.add_parser('patch-es256', help=patch_es256_auth.__doc__)
568594
command.add_parser('patch-rs256', help=patch_rsa256_auth.__doc__)
595+
command.add_parser('send-command', help=send_command.__doc__)
569596
command.add_parser('set-config', help=patch_rsa256_auth.__doc__)
570597
command.add_parser('set-iam-permissions', help=set_iam_permissions.__doc__)
571598

@@ -679,6 +706,12 @@ def run_command(args):
679706
args.cloud_region, args.registry_id, args.device_id,
680707
args.rsa_certificate_file)
681708

709+
elif args.command == 'send-command':
710+
send_command(
711+
args.service_account_json, args.project_id,
712+
args.cloud_region, args.registry_id, args.device_id,
713+
args.send_command)
714+
682715
elif args.command == 'set-iam-permissions':
683716
if (args.member is None):
684717
sys.exit('Error: specify --member')
@@ -699,10 +732,6 @@ def run_command(args):
699732
args.version, args.config)
700733

701734

702-
def main():
735+
if __name__ == '__main__':
703736
args = parse_command_line_args()
704737
run_command(args)
705-
706-
707-
if __name__ == '__main__':
708-
main()

samples/api-client/manager/manager_test.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,23 @@
1313
# limitations under the License.
1414

1515
import os
16+
import sys
1617
import time
1718

19+
# Add command receiver for bootstrapping device registry / device for testing
20+
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'mqtt_example')) # noqa
1821
from google.cloud import pubsub
1922
import pytest
2023

2124
import manager
25+
import cloudiot_mqtt_example
2226

2327
cloud_region = 'us-central1'
2428
device_id_template = 'test-device-{}'
29+
ca_cert_path = '../mqtt_example/resources/roots.pem'
2530
es_cert_path = 'resources/ec_public.pem'
2631
rsa_cert_path = 'resources/rsa_cert.pem'
32+
rsa_private_path = 'resources/rsa_private.pem' # Must match rsa_cert
2733
topic_id = 'test-device-events-{}'.format(int(time.time()))
2834

2935
project_id = os.environ['GCLOUD_PROJECT']
@@ -270,3 +276,46 @@ def test_add_patch_delete_es256(test_topic, capsys):
270276

271277
manager.delete_registry(
272278
service_account_json, project_id, cloud_region, registry_id)
279+
280+
281+
def test_send_command(test_topic, capsys):
282+
device_id = device_id_template.format('RSA256')
283+
manager.create_registry(
284+
service_account_json, project_id, cloud_region, pubsub_topic,
285+
registry_id)
286+
manager.create_rs256_device(
287+
service_account_json, project_id, cloud_region, registry_id,
288+
device_id, rsa_cert_path)
289+
290+
# Exercize the functionality
291+
client = cloudiot_mqtt_example.get_client(
292+
project_id, cloud_region, registry_id, device_id,
293+
rsa_private_path, 'RS256', ca_cert_path,
294+
'mqtt.googleapis.com', 443)
295+
client.loop_start()
296+
out, _ = capsys.readouterr()
297+
298+
# Pre-process commands
299+
for i in range(1, 5):
300+
client.loop()
301+
time.sleep(1)
302+
303+
manager.send_command(
304+
service_account_json, project_id, cloud_region, registry_id,
305+
device_id, 'me want cookies')
306+
out, _ = capsys.readouterr()
307+
308+
# Process commands
309+
for i in range(1, 5):
310+
client.loop()
311+
time.sleep(1)
312+
313+
# Clean up
314+
manager.delete_device(
315+
service_account_json, project_id, cloud_region, registry_id,
316+
device_id)
317+
manager.delete_registry(
318+
service_account_json, project_id, cloud_region, registry_id)
319+
320+
assert 'Sending command to device' in out
321+
assert '400' not in out
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
google-api-python-client==1.7.4
1+
cryptography==2.4.2
2+
google-api-python-client==1.7.5
23
google-auth-httplib2==0.0.3
34
google-auth==1.6.1
4-
google-cloud-pubsub==0.38.0
5+
google-cloud-pubsub==0.39.0
6+
oauth2client==4.1.3
7+
paho-mqtt==1.4.0
8+
pyjwt==1.6.4
Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
-----BEGIN CERTIFICATE-----
2-
MIIDFzCCAf+gAwIBAgIJALsqlqk6FkVjMA0GCSqGSIb3DQEBBQUAMBExDzANBgNV
3-
BAMTBnVudXNlZDAeFw0xNzEyMDYyMjQwNDRaFw0yNzEyMDQyMjQwNDRaMBExDzAN
4-
BgNVBAMTBnVudXNlZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALZg
5-
rgM97eLsTl3ul4m07pVHE/g9f0VP6/MDQcAjqj9kRmg5XMo/E6eRbNcIVwKEGHwC
6-
SuSvGO/j7reYN4cbjvBqimc8asecg5rtXjaDBm66feB/ktOjASSfGfuN79JOJf+r
7-
/BNcCrs8qWa1FSPEnQO7VTTUstkDKB8uvBFPOiPNVw438KM2lId2G/i63soMes0m
8-
9RjPdXbRqJI39WdMVDYXIqLSVIX11xOXvroetwDPkHIi4Tjzus1T6KMjwKD3f3sm
9-
DeUJeu4f1ZV4LPhhW62O9fkKeGy55LglfqOmWusySdOoNgEocN4V3iDQmJ7QOEXw
10-
yPX+ZhhPHuptDwBTWJcCAwEAAaNyMHAwHQYDVR0OBBYEFD7D1XyWbYOiMWDgDyBs
11-
po+JmlViMEEGA1UdIwQ6MDiAFD7D1XyWbYOiMWDgDyBspo+JmlVioRWkEzARMQ8w
12-
DQYDVQQDEwZ1bnVzZWSCCQC7KpapOhZFYzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3
13-
DQEBBQUAA4IBAQAlq4QHt5yqCBhhLsMNnTDmg6ev7lxXKnb+JRMm3Op0rgBDe4sQ
14-
U3Hxrhma+55f2rx32kwpcMQr4WWp0tUKL0OpWrNqdJc4oGFftLDqzKxXyT1nN5PH
15-
1p9HCkHHwxmGZ60fxKb64yu9PTgsZS64l21CWlNFEiC8IULa5HV/O0ZZdPuAZVv0
16-
hzmkalP/7uPqJ+z2tBEADQOjrU7SiB8uM+q1BLN9vnZrjo7CsXNwIiQ8N8eXpzsX
17-
did5acwQdAt67uNx9e/YXLMvuAn+qVN+crS4IliBiikMZiUkug5yBDsLySFwXsZg
18-
MGkUkV28QlgT4wzSQJ52yGtYCauqO2qU4zZg
2+
MIIC+DCCAeCgAwIBAgIJALt7HnuYGgVcMA0GCSqGSIb3DQEBCwUAMBExDzANBgNV
3+
BAMMBnVudXNlZDAeFw0xODEyMDMwMDE2MjNaFw0yODExMzAwMDE2MjNaMBExDzAN
4+
BgNVBAMMBnVudXNlZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOrA
5+
b+5XMIgwyl6+CkdJkKKp4f+2hHAOoSqQroj2MR/i41YysUbKCk8KdQSZqTBtIvrY
6+
df7s6zDV3zmi3LBBHX6MGnz/1j5YIXlujBhsnQTRbTuUjjDx96ik2C2rR1w7okA7
7+
MmBsdVzRe8g5pfNQGdV0l15UaZK+qFlLg0xzasPPKmYFFUbKXeWPaKJmtw9d/l6a
8+
8jb87fwI3LTWjZr6Bk7L4Zf1TDlTDroMvNlkW9Z9xSkcgC77EjMtC7RYxxbelaxd
9+
qI9IdxIpmExg6pKMJEvJNA11GYhTlAxkJNh7gd0WlYvQlwDI7D6NJPbCmm4ac1P2
10+
AA1MFHVgxoKAFk/8V38CAwEAAaNTMFEwHQYDVR0OBBYEFC5Dlz2bTWzaJO6i1Qn8
11+
lTdDAigCMB8GA1UdIwQYMBaAFC5Dlz2bTWzaJO6i1Qn8lTdDAigCMA8GA1UdEwEB
12+
/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBANmnnBQaWPhJne5kOjMe+SEsdLbG
13+
OD9L8RmokOsRPXJbj2KoM07UUXMgUe57daYm72wDfKZpvG5qwybkkym+NnahJY+C
14+
u9FX1dTBjM/TqPWKI817mDp5W31a+q6DXdggG+Yf6pz0dMXGGzRtSTEpLKsKtXqe
15+
Y9f7266JCx9V5QFK14SmpIdBF38G0bcNPEvRJ6uKaVKBnU4+7o4YlQLuDczT29Tp
16+
CXL0egUViNT9kv03Pj9iSPR6EGcmOjnSZe1SFVg9OeCauF1wuuFCxUuCkWSEkEm7
17+
laNke9PHHTe9BoBxKMsTFEPivhVaAf9fUp+NQxZNmdgbux9AAlJgiyU0sFg=
1918
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDqwG/uVzCIMMpe
3+
vgpHSZCiqeH/toRwDqEqkK6I9jEf4uNWMrFGygpPCnUEmakwbSL62HX+7Osw1d85
4+
otywQR1+jBp8/9Y+WCF5bowYbJ0E0W07lI4w8feopNgtq0dcO6JAOzJgbHVc0XvI
5+
OaXzUBnVdJdeVGmSvqhZS4NMc2rDzypmBRVGyl3lj2iiZrcPXf5emvI2/O38CNy0
6+
1o2a+gZOy+GX9Uw5Uw66DLzZZFvWfcUpHIAu+xIzLQu0WMcW3pWsXaiPSHcSKZhM
7+
YOqSjCRLyTQNdRmIU5QMZCTYe4HdFpWL0JcAyOw+jST2wppuGnNT9gANTBR1YMaC
8+
gBZP/Fd/AgMBAAECggEBAOevf4kColJ3nPM+qlRLJaV09yjyUOlrduLUon1oRXmL
9+
6wUCyPXtp5j04CLnKRUzUUezZVlxKHotSr/OnfKSgXKJAgeGVEN5paf8U+YzJBFC
10+
RIV+C4wA84WNFBKWrbo43Nx50DFcOcSet4UYaFGoJ6cFB/PAaeW7p9lhbreAXcnb
11+
g2z4SBsGGO2ZKZkSOcXg39GKX5S0bsEhHzIOFvPBdDQpaVAx/Bq76iBzVz1bRwGp
12+
A3SjJn0g4V+3TcTrpRzgtCRRNPM48JeLHw6/mdVSk6gIoEbg+WTB92Z7BlTbjqhI
13+
LPoMx3wQkg7J2gRrT0rPJIMkgdK9Q8RyWaulsRAn+gECgYEA/jfisAhn7IAPBXKz
14+
ED56NSr174qX97SO2JrB7PO614BV8lHSoV4QI+nQCBkNVhL/SuWvqB3naImo+UOX
15+
Smo6fmh78X+yIXKKhj9qY01jxRGcrnhA25L9gk7TFSNm7XaV2HxHq+TW6tvkL0uO
16+
jXSH3D+u8/f+5ZCt/egNq3eU4n8CgYEA7GWgBLq8jmiz/VVLYboJ0YcJVZ5XAjfJ
17+
vgzxdzX9hIkq5Cpt1ZpO9zE3IXClVvfECXcLpEzoHbiJkEve4dDqbSe4T4JPmpRx
18+
BKRPWFJvTieLA912UmHRBDTrQSA/nZ5zxHsXYmN52femqCwbPWYu5czoqud+GcNq
19+
ghj4oF9UCwECgYEAzpaHx1ntakne6yR807SSB2b0GUfdm1TFyMxqz655pesK7TMF
20+
IlGYeDbn8cy6A7rIcAsbplk21sMX6Ai/h5+wDU3He0e0cG3umI4sXKpla56WX0om
21+
Gsnm7eA0tTbhzBPUTeshK1V6Ob2cP7r9C4MpbRjriiN8pv3eBzpu8WrqOO0CgYAB
22+
8bgGMe75EN1iGQB8tkX8ZirqfFnk18ad/IdD3rrOCz7CD6NFnXZGzC3S5ZVGiNUg
23+
6sy6tjM2g10GRcl4e/phmXEHnl+/OrdPPXa1mD/4GZUoG/ssJEfOzAyfRX+gcTws
24+
goKnuX+4DjRdr7ctoxiBpVTIiwzbc2L93Oy2jPIpAQKBgGzaYhfOlB3SWo+iSKcb
25+
Vx++0gXru1Sgeo42TIn+6adO6DYfwVtfaScVL+Jcg7MZYY+94gnPCp+/ohVTJTvQ
26+
JZdI9Czem64VUtSvc0DCji5gPqvgsO5YgBQrGJJrbmVwu0A6RlNbDwxCdkqHuYk4
27+
7vsxlbXvNufb0LjnNN0lSUU2
28+
-----END PRIVATE KEY-----

0 commit comments

Comments
 (0)