From de3bb81d78a00e526b0afa1e60762e8786a9edba Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Fri, 12 Apr 2024 15:22:57 -0300 Subject: [PATCH 1/3] Use secure gRPC channels for spot_wrapper.testing mocks Signed-off-by: Michel Hidalgo --- spot_wrapper/testing/credentials/__init__.py | 34 ++++++++++++ .../testing/credentials/api.spot.robot.crt | 28 ++++++++++ .../testing/credentials/auth.spot.robot.crt | 28 ++++++++++ spot_wrapper/testing/credentials/ca.crt | 31 +++++++++++ .../testing/credentials/id.spot.robot.crt | 28 ++++++++++ .../payload-registration.spot.robot.crt | 29 +++++++++++ spot_wrapper/testing/credentials/robot.pem | 52 +++++++++++++++++++ spot_wrapper/testing/fixtures.py | 40 +++++++------- spot_wrapper/tests/test_wrapper.py | 1 + spot_wrapper/wrapper.py | 3 +- 10 files changed, 253 insertions(+), 21 deletions(-) create mode 100644 spot_wrapper/testing/credentials/__init__.py create mode 100644 spot_wrapper/testing/credentials/api.spot.robot.crt create mode 100644 spot_wrapper/testing/credentials/auth.spot.robot.crt create mode 100644 spot_wrapper/testing/credentials/ca.crt create mode 100644 spot_wrapper/testing/credentials/id.spot.robot.crt create mode 100644 spot_wrapper/testing/credentials/payload-registration.spot.robot.crt create mode 100644 spot_wrapper/testing/credentials/robot.pem diff --git a/spot_wrapper/testing/credentials/__init__.py b/spot_wrapper/testing/credentials/__init__.py new file mode 100644 index 0000000..93647e4 --- /dev/null +++ b/spot_wrapper/testing/credentials/__init__.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Boston Dynamics AI Institute LLC. See LICENSE file for more info. + +import dataclasses +import pathlib +import typing + +import pkg_resources + + +@dataclasses.dataclass +class SpotSSLCertificates: + root_certificate_path: pathlib.Path + robot_certificate_key_path: pathlib.Path + robot_certificate_paths: typing.Sequence[pathlib.Path] + + +DEFAULT_TESTING_CERTIFICATES = SpotSSLCertificates( + robot_certificate_key_path=pathlib.Path(pkg_resources.resource_filename( + "spot_wrapper.testing.credentials", "robot.pem" + )), + robot_certificate_paths=[ + pathlib.Path(pkg_resources.resource_filename( + "spot_wrapper.testing.credentials", certificate_filename + )) for certificate_filename in ( + "api.spot.robot.crt", + "auth.spot.robot.crt", + "id.spot.robot.crt", + "payload-registration.spot.robot.crt", + ) + ], + root_certificate_path=pathlib.Path(pkg_resources.resource_filename( + "spot_wrapper.testing.credentials", "ca.crt" + )), +) diff --git a/spot_wrapper/testing/credentials/api.spot.robot.crt b/spot_wrapper/testing/credentials/api.spot.robot.crt new file mode 100644 index 0000000..b752027 --- /dev/null +++ b/spot_wrapper/testing/credentials/api.spot.robot.crt @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIIE0TCCArkCAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCVVMxCzAJBgNV +BAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24xFTATBgNVBAoMDHNwb3Rfd3JhcHBlcjAg +Fw0yNDA0MTIxODEzMDVaGA8zMDIzMDgxNDE4MTMwNVowGTEXMBUGA1UEAwwOYXBp +LnNwb3Qucm9ib3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDafDjd +dyftz5pvGqphNphRSIX6/jTeH+l5sKGyVhC6d+k81GkRKptQ77XNtBovVg6SuE4O +i1poHwkGfvnODM6CEXb3MIBCKBpq8UNl+fP5DRnM1AksKVjRyq0kOELtNlWyfRuC +nhHYVT5XoVL99Wrb6RfUbdMSx4Iu7U+A0GUsatOvMXAK3IItifHNm1PYdggZP/Zw +Mrm6Xky7HGN7k9wf3FEmAEpPJcswvA/+x0GGQnAESNbsaE26n5MgVSm9e45l9z5R +4LtAyVnAYnuK7l2/5+brwBd70doq2cdmoyUxX2eK+91pojR2hVPe3avgoT0yYTvc +d+ykkaJWB5tKIHgTSNactN3DsZD//d0s6pOP0yiRPSbqmC6GsGnDhjqLRsa/D6D7 +fc71Ymk+pv5WyHKB6Tl+q2j8eYkLYE8hCc0Y0F89Ph/yGG22CzW4v8tQrG+QLi/0 +1AJjzGybYeyV5OpuRsMKUlqTOtEssR82gCMYk1Qbo8DGGPbztdL9GaViLrykmyX2 ++j/On5RS0m4hSSIxCGuVjvYZz2oIvZbadRpnrIKCtwYLkkWXmGZi5YTlKDtHqlyt +i73FyOG0v+f6mCud2WxLncZ+4Db7dWGkO4z+pqtBfgv/wmb0/zY6oEpbX4dQchBo +/i8Zt4Lpjwi1fq9yvE32BAC4EuE4GyCjU8UoAwIDAQABMA0GCSqGSIb3DQEBCwUA +A4ICAQA1l7TjPgCgesqmX2iFsSndoIfS9FKrrOUdE0w7/2WxVKEhOe/DiGKZPBuL +t62sDBwtEEZsML3PAVvR8dP5HesKBFdj5U3sNwWk0epsXq2uiF15T3zM+YAvibwG +m5OBwcuB74oAKKJdimNeLvIo1oB99lt5Xx7irigqeqoIMw5ul4dntasOKuOm7hVS +X2rRJk0dWdiOwi7YuFIpB7Z1NtBAOqlZLzWIZoNC6EjXcWLba8E2Pp2T69aozkGB +/7JWTEtMdz2J4Qd3ADcUx8SAu5PbAJyyth+6B6+UWRRIbHkYMuL37udEuL77olQa +7gOSX/A8V0Xt8zUbHwl28Q8BafNcLQq7tOImZXTh0hv8hoOx970qLkaY4S9p8PKr +Gy4RokKHlzg42n4wUD0BQP2Clv8QjGgDTT/XT0oZcbXmbGXtb/psdMw5+dZtNk+u +MweA//HigOJ9CqCEpyaiO4obz6w5Kap6SCCAzZAOOPMWrRtMThGnCxXu9DHQJB1r +QJC/MQ/5hNmCoHZEH/5v22G6goC/2J9hHxbnF3irksC48vcgy/x0zfENi+q2c9cr +lH6oIB3Jfh8q9JgXaCU8B+kehIsyF6BzFBtUPN8csuY5+q/G4IuUUDCElWiOSSXK +u7LGAgftY9YWkTyNGVqflTuzuB2tSc6p3w+aBhtNcMISp6vF6w== +-----END CERTIFICATE----- diff --git a/spot_wrapper/testing/credentials/auth.spot.robot.crt b/spot_wrapper/testing/credentials/auth.spot.robot.crt new file mode 100644 index 0000000..be817a7 --- /dev/null +++ b/spot_wrapper/testing/credentials/auth.spot.robot.crt @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIIE0jCCAroCAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCVVMxCzAJBgNV +BAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24xFTATBgNVBAoMDHNwb3Rfd3JhcHBlcjAg +Fw0yNDA0MTIxODEzMTNaGA8zMDIzMDgxNDE4MTMxM1owGjEYMBYGA1UEAwwPYXV0 +aC5zcG90LnJvYm90MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2nw4 +3Xcn7c+abxqqYTaYUUiF+v403h/pebChslYQunfpPNRpESqbUO+1zbQaL1YOkrhO +DotaaB8JBn75zgzOghF29zCAQigaavFDZfnz+Q0ZzNQJLClY0cqtJDhC7TZVsn0b +gp4R2FU+V6FS/fVq2+kX1G3TEseCLu1PgNBlLGrTrzFwCtyCLYnxzZtT2HYIGT/2 +cDK5ul5Muxxje5PcH9xRJgBKTyXLMLwP/sdBhkJwBEjW7GhNup+TIFUpvXuOZfc+ +UeC7QMlZwGJ7iu5dv+fm68AXe9HaKtnHZqMlMV9nivvdaaI0doVT3t2r4KE9MmE7 +3HfspJGiVgebSiB4E0jWnLTdw7GQ//3dLOqTj9MokT0m6pguhrBpw4Y6i0bGvw+g ++33O9WJpPqb+Vshygek5fqto/HmJC2BPIQnNGNBfPT4f8hhttgs1uL/LUKxvkC4v +9NQCY8xsm2HsleTqbkbDClJakzrRLLEfNoAjGJNUG6PAxhj287XS/RmlYi68pJsl +9vo/zp+UUtJuIUkiMQhrlY72Gc9qCL2W2nUaZ6yCgrcGC5JFl5hmYuWE5Sg7R6pc +rYu9xcjhtL/n+pgrndlsS53GfuA2+3VhpDuM/qarQX4L/8Jm9P82OqBKW1+HUHIQ +aP4vGbeC6Y8ItX6vcrxN9gQAuBLhOBsgo1PFKAMCAwEAATANBgkqhkiG9w0BAQsF +AAOCAgEADFU0YDJ/Uc7eQRzuj0fdH5tbpfk4bQo3hBu5PXX/ZNIe7q3vDs5iLyw+ +zoJmESiBl06lBqvC7/E0DJZSc+zmUVe41e4e8g/ZqlIMPDI3hnc+HPS3NH/Wt/IG +OODUqthKvNZLxCJuiJ1hzAYxkQdQTgG+p2KtqF/FeuTGQva0OYqtUnfnwNf/eRt2 +2TeAagoJFG1MpmP6hQsc9wUxE5Zz7Ro30VvwMQrhQDl2336x0CxncB/OVovikE1p +j7RhHIPvxfNj/KsSs4VZqxE2CnjOVsAcNIc0vkPeqKBOXmSq08s7ulZ/P3pyS7MI +lW9iG5XiPMYjCU/JkmZy7wREhEgLEMvfciQTAAUTDC7HpDOVezPU0c87xaV18Vzk +SucxtvkVqPD3ff8onG7qFVlop2ulHXVteaeTYsI0f41MS4z/GqfWjbUU9jd56HO5 +ZB9+VE8cNe9TC+uZoJMUO2dHtMjj4GIRxSgVaefZP14RPxr+uTgLBJOmnktdzPRL +MLItvnoktMEjfP/dY5kjw2aGrGCP2IRoBXk2Juppiik6J7AMFtUrUOuAaWG961Zr +OyuOW1THytEuaYm7PKKQSwo2PJYDVo9+LM8b//a2LrhdhFYzkZd4+YunSHGSvWAs +5YQhbp/5mwhjm3L+FAFFA/RP5CpIy0VUJqQs5pEXWuSqWrTc0v4= +-----END CERTIFICATE----- diff --git a/spot_wrapper/testing/credentials/ca.crt b/spot_wrapper/testing/credentials/ca.crt new file mode 100644 index 0000000..aa707f3 --- /dev/null +++ b/spot_wrapper/testing/credentials/ca.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFZzCCA0+gAwIBAgIUa6msg8Z7PTIIoDePCBJiePqrHFowDQYJKoZIhvcNAQEL +BQAwQjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24x +FTATBgNVBAoMDHNwb3Rfd3JhcHBlcjAgFw0yNDA0MTIxNzMwNDNaGA8zMDIzMDgx +NDE3MzA0M1owQjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZC +b3N0b24xFTATBgNVBAoMDHNwb3Rfd3JhcHBlcjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBALEaiRb45Y1WCWA/J0oU84aZ4rXanPceyFldgGrA6GGoNVLl +MNKyg2V5nElLgV+DsAigC0czNOoTyRlocZ8ekW1cPgTmsm42g+AReU2qPEzKYHPz +6K0XbZ63vHUC0ox1sPqQIRPVamnAKQkU8TsCLwhuulqQLGKKqDooTGco9RQcY7UA +Wzmwvo5rvxTmkBQxcmdw+qgDrbxXISmocIh4J/zl22LZawS+nHvW/HTl2tg9hYAY +tDtpjW6U9HDjOPdkizDoZVbsJMKY6vIjujb7yaKh2ZuW2T//NH+2Vzxk4RKOcyox +yCnZFxhIBPWHcLHD92ta/ZN7i7AsF7NrE3BVBXXlbe1hYpJTqAi8IMyLYdIeEeaD +MGUwZa/vI5XVRLPl5UU6ECo8/9hj4/JDdJWC/EpU+d5C44DNljXpyFH6QRSf9gRj +XXx4qWaWTbIeqlQNj1eGJGa8MM03WmjcouiHTOh8asK17zwyYYnrtGMX2CnAtiw5 +sxgaC2QcINh7ZgAClWEQhpi/fXR96JsgJF+/jCLosA+0PMPCJeKtkTxo441XTWNT +ilKn1sJ7WIEZ9If0GdhuiW6to4vWoqQNkCSf1Mg/VjMcsJgui2l7ABJTBjoRHS/Z +rMBZIApQkgXnaaMXgiXoMItAUJZ/fOWkOK+y7b1KmwSzClpJa/PMjgm1L2XfAgMB +AAGjUzBRMB0GA1UdDgQWBBTF424r/sU/9OqWx1FyXtiYAqr7jjAfBgNVHSMEGDAW +gBTF424r/sU/9OqWx1FyXtiYAqr7jjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4ICAQA6xRBBSWxWnvxTtaCGgyfR/SVkBAFu+SLw8xTI1TiZb8Tzh0Gc +ciS/vfo20eJ1+C5UEVmlMb/oxEewROkY7+RKCTlI7Vl0KD7Gz9HUpPz8o2POs43B +5AvXLlqDknD+UP6QG+AR9UEdjNs8UAiv62gwghQMwafVwpltNIMk0cDILxBHh3K2 +dGONtuWrnwU0y1i+sAdIUKv+zCV/Mkyxkm31PzKnYQMFEggUxP4Pvu95KZily1O4 +WfUZzwZB6hN6Rp/mrxPgmDuGOqSLbJBSjDF8DN47kwFU1nlS8wOH5nn+3EbWjPzH +4gB3IpETLLrQYqXawjC9x0KknDfIxKDhHMsRldQEUYBMFPmTXnM+mnWmXrvMk+/Q +fxJo1fvDIv/3nuv939yEkWkM4m+OLQxhLnuu3NsVktau+7ivK8XN01Ytxq9fz3C9 +k1fOlQcwC7dBNXurBS2yd/PnR7l/oh/B93sQFuaZcIkJElSYVRbEEaueOlLpL16d +oU3t/Rr5sNksA/EoQ/M6RpdesAulZsZ8CuHM6lPwlA9h+9jiNtyd84R7gWeh3JIU +mhXsBqtSYWhUVB9Csa0+MBjrq8wLNcJcwxhedYS/9FPvmPu02APhTWja89+cPeGD +Pi8O9F6nFbPhkYpczp+hYSV3dsoUw8ld4SOa7asfkpHlKSCSmZ8Eah1K3Q== +-----END CERTIFICATE----- diff --git a/spot_wrapper/testing/credentials/id.spot.robot.crt b/spot_wrapper/testing/credentials/id.spot.robot.crt new file mode 100644 index 0000000..9b74831 --- /dev/null +++ b/spot_wrapper/testing/credentials/id.spot.robot.crt @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIIE0DCCArgCAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCVVMxCzAJBgNV +BAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24xFTATBgNVBAoMDHNwb3Rfd3JhcHBlcjAg +Fw0yNDA0MTIxODEzMjVaGA8zMDIzMDgxNDE4MTMyNVowGDEWMBQGA1UEAwwNaWQu +c3BvdC5yb2JvdDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANp8ON13 +J+3Pmm8aqmE2mFFIhfr+NN4f6XmwobJWELp36TzUaREqm1Dvtc20Gi9WDpK4Tg6L +WmgfCQZ++c4MzoIRdvcwgEIoGmrxQ2X58/kNGczUCSwpWNHKrSQ4Qu02VbJ9G4Ke +EdhVPlehUv31atvpF9Rt0xLHgi7tT4DQZSxq068xcArcgi2J8c2bU9h2CBk/9nAy +ubpeTLscY3uT3B/cUSYASk8lyzC8D/7HQYZCcARI1uxoTbqfkyBVKb17jmX3PlHg +u0DJWcBie4ruXb/n5uvAF3vR2irZx2ajJTFfZ4r73WmiNHaFU97dq+ChPTJhO9x3 +7KSRolYHm0ogeBNI1py03cOxkP/93Szqk4/TKJE9JuqYLoawacOGOotGxr8PoPt9 +zvViaT6m/lbIcoHpOX6raPx5iQtgTyEJzRjQXz0+H/IYbbYLNbi/y1Csb5AuL/TU +AmPMbJth7JXk6m5GwwpSWpM60SyxHzaAIxiTVBujwMYY9vO10v0ZpWIuvKSbJfb6 +P86flFLSbiFJIjEIa5WO9hnPagi9ltp1GmesgoK3BguSRZeYZmLlhOUoO0eqXK2L +vcXI4bS/5/qYK53ZbEudxn7gNvt1YaQ7jP6mq0F+C//CZvT/NjqgSltfh1ByEGj+ +Lxm3gumPCLV+r3K8TfYEALgS4TgbIKNTxSgDAgMBAAEwDQYJKoZIhvcNAQELBQAD +ggIBAA/EZkC3jGHn0KqScCcZ/yFX87eGiGvCPfUyXxOYyxMfxqZGrAr6VgxAguWs +vnIV8sQU6lpTPGaakM2Z/8AnzXeCFoYD7Gh8nsiZiKZnocrG92q7TuFgWigSUv9h +QhCX5DGWC1vpe9Y9CLnrtd/78g2YBCZ6I1uZv/D1uRjML/LZsJ+/KQia6v7w8L9P +3Sv4A7rT6oarnhQGPgB2CtxWL0wQI3LBCy0E5jE2/XJAmOUd6gr8g6Qs49tTQmU1 +T+vZyyDGLhBrok3NTNddC9Z118E9LCZ+UaE6Q5Qx7IvHhjvODfp9hzGkuMfjmiDA +EGab5qzcoFhveu1MpbysbajURrxR0XgHPVZeCf94s8OYRwE1v5Ky2G20N10npdJM +pX16L8eg/DfY9aWdoSDPt/A9/5d0Oxh25h4kZGMPuaKce66hNQanMbKH4fr2h9OR +POlf5KwaMYtY6V2YcDHeBBHsG342tngXa9JEvaotww824d6FcYgfxOks08x6V5UU +mOwG4RJCwO/zaQ2bRrYE4IdvB5z6ZaJ6CZmvc4nFXgPzzhBq0dTPZdZZMyWg/haG +XDV+oBC2iePiWma0PnW0DkyvD1WhcWbeD3CWEMuf+kPkqpZVYCy0UqVxBFtBLUn7 +z7m4oqur/7YXC+kRwxdF0KoMdTzfaWNyP8ol7CR3BcQUfXTj +-----END CERTIFICATE----- diff --git a/spot_wrapper/testing/credentials/payload-registration.spot.robot.crt b/spot_wrapper/testing/credentials/payload-registration.spot.robot.crt new file mode 100644 index 0000000..a54a723 --- /dev/null +++ b/spot_wrapper/testing/credentials/payload-registration.spot.robot.crt @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE4jCCAsoCAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCVVMxCzAJBgNV +BAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24xFTATBgNVBAoMDHNwb3Rfd3JhcHBlcjAg +Fw0yNDA0MTIxODEzNDJaGA8zMDIzMDgxNDE4MTM0MlowKjEoMCYGA1UEAwwfcGF5 +bG9hZC1yZWdpc3RyYXRpb24uc3BvdC5yb2JvdDCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBANp8ON13J+3Pmm8aqmE2mFFIhfr+NN4f6XmwobJWELp36TzU +aREqm1Dvtc20Gi9WDpK4Tg6LWmgfCQZ++c4MzoIRdvcwgEIoGmrxQ2X58/kNGczU +CSwpWNHKrSQ4Qu02VbJ9G4KeEdhVPlehUv31atvpF9Rt0xLHgi7tT4DQZSxq068x +cArcgi2J8c2bU9h2CBk/9nAyubpeTLscY3uT3B/cUSYASk8lyzC8D/7HQYZCcARI +1uxoTbqfkyBVKb17jmX3PlHgu0DJWcBie4ruXb/n5uvAF3vR2irZx2ajJTFfZ4r7 +3WmiNHaFU97dq+ChPTJhO9x37KSRolYHm0ogeBNI1py03cOxkP/93Szqk4/TKJE9 +JuqYLoawacOGOotGxr8PoPt9zvViaT6m/lbIcoHpOX6raPx5iQtgTyEJzRjQXz0+ +H/IYbbYLNbi/y1Csb5AuL/TUAmPMbJth7JXk6m5GwwpSWpM60SyxHzaAIxiTVBuj +wMYY9vO10v0ZpWIuvKSbJfb6P86flFLSbiFJIjEIa5WO9hnPagi9ltp1GmesgoK3 +BguSRZeYZmLlhOUoO0eqXK2LvcXI4bS/5/qYK53ZbEudxn7gNvt1YaQ7jP6mq0F+ +C//CZvT/NjqgSltfh1ByEGj+Lxm3gumPCLV+r3K8TfYEALgS4TgbIKNTxSgDAgMB +AAEwDQYJKoZIhvcNAQELBQADggIBAAQ1Fk6Gh1OoSRi7GUHTviJ9r2FcdjkgyMYp +E1JFiKYkkpwXAqhLeE0CEmTvdTLqo9SAfY5YkA6pJpr3LZ9Ns3Kcd35BUlHA5QF9 +EgNzJkjvKDCnxWlVhoVRwK9Mff0Twe3ANtUI9WHfvqNgLAFhX1RjipcDBsmyJRk6 +TDeCXbU5cFf/c+wqCeRi5Abu8FNkqEtr3YypL5CjZX/UtCXNVkifjZsL5ayAaQ8L +bea05Y7gPPgWQVNNAPAQDrsAQeLGPIg5hSD+SjEGsq3+GaP0cVG/GBiWR4c4rfX4 ++OoO+8krm6YTovITuIzqjVuZ/mUKyqutyexx5MB3Rjy9cgW7TGcWvadyVCveRaZB +QjkfYqLg2HVVAi3dwwOacAAmd5aKDplyx9OraIBj79PBTCeD3uJ9ZiG7aukHRe2l +bm6fyS1Y9rQ5dwCyoRpJSfci7qMq8YUQxeLwO3WAZkBKeDd/qzpqEdtsD9FQB798 +1y+ZqNeIlppAbpMJR83pbAiewihsD+1+nJ/paceCGqrqI6hSDPYlAUWelHvwmb5k +gSss4F2F+N2MNu/L1B0a6v1YI0478IRHF/vvZCbDXUMefPqCmIvW+tsMv58jApop +lgYviX3aJKO+NasNF/Lp5XUQMVOvF6ajLRaJPkWV6plenWr1DyhoP4kOZXY7Gpd9 +yJ3X4n2r +-----END CERTIFICATE----- diff --git a/spot_wrapper/testing/credentials/robot.pem b/spot_wrapper/testing/credentials/robot.pem new file mode 100644 index 0000000..c0806ed --- /dev/null +++ b/spot_wrapper/testing/credentials/robot.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +960g90lE5bLBOFWNQM4UxWWf9RqH9g== +-----END PRIVATE KEY----- diff --git a/spot_wrapper/testing/fixtures.py b/spot_wrapper/testing/fixtures.py index 6eac946..481bd11 100644 --- a/spot_wrapper/testing/fixtures.py +++ b/spot_wrapper/testing/fixtures.py @@ -3,12 +3,16 @@ import concurrent.futures import dataclasses import functools -import inspect +import pathlib import typing import grpc import pytest +from spot_wrapper.testing.credentials import ( + DEFAULT_TESTING_CERTIFICATES, + SpotSSLCertificates, +) from spot_wrapper.testing.mocks import BaseMockSpot @@ -25,6 +29,7 @@ class SpotFixture: address: str port: int + certificate_path: pathlib.Path api: BaseMockSpot @@ -33,6 +38,7 @@ def fixture( *, address: str = "127.0.0.1", max_workers: int = 10, + certificates: SpotSSLCertificates = DEFAULT_TESTING_CERTIFICATES, **kwargs: typing.Any, ) -> typing.Callable: """ @@ -54,35 +60,29 @@ def fixture( """ def decorator(cls: typing.Type[BaseMockSpot]) -> typing.Callable: - def fixturefunc(monkeypatch, **kwargs) -> typing.Iterator[SpotFixture]: + def fixturefunc(**kwargs) -> typing.Iterator[SpotFixture]: with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as thread_pool: server = grpc.server(thread_pool) - port = server.add_insecure_port(f"{address}:0") + robot_certificate_key = certificates.robot_certificate_key_path.read_bytes() + server_credentials = grpc.ssl_server_credentials([ + (robot_certificate_key, certificate_path.read_bytes()) + for certificate_path in certificates.robot_certificate_paths + ]) + port = server.add_secure_port(f"{address}:0", server_credentials) with cls(**kwargs) as mock: mock.add_to(server) server.start() try: - with monkeypatch.context() as m: - - def mock_secure_channel(target, _, *args, **kwargs): - return grpc.insecure_channel(target, *args, **kwargs) - - m.setattr(grpc, "secure_channel", mock_secure_channel) - yield SpotFixture(address=address, port=port, api=mock) + yield SpotFixture( + address=address, + port=port, + api=mock, + certificate_path=certificates.root_certificate_path, + ) finally: server.stop(grace=None) functools.update_wrapper(fixturefunc, cls) - sig = inspect.signature(fixturefunc) - if "monkeypatch" not in sig.parameters: - sig = sig.replace( - parameters=( - inspect.Parameter("monkeypatch", inspect.Parameter.POSITIONAL_OR_KEYWORD), - *sig.parameters.values(), - ) - ) - fixturefunc.__signature__ = sig # noqa - return pytest.fixture(fixturefunc, **kwargs) if cls is None: diff --git a/spot_wrapper/tests/test_wrapper.py b/spot_wrapper/tests/test_wrapper.py index d452d61..a3b4311 100644 --- a/spot_wrapper/tests/test_wrapper.py +++ b/spot_wrapper/tests/test_wrapper.py @@ -60,6 +60,7 @@ def simple_spot_wrapper(simple_spot: SpotFixture) -> Iterator[SpotWrapper]: hostname=simple_spot.address, port=simple_spot.port, robot_name=simple_spot.api.name, + cert_resource_glob=str(simple_spot.certificate_path), logger=logging.getLogger("spot"), ) ok, message = spot_wrapper.claim() diff --git a/spot_wrapper/wrapper.py b/spot_wrapper/wrapper.py index 3303b60..a7a1030 100644 --- a/spot_wrapper/wrapper.py +++ b/spot_wrapper/wrapper.py @@ -340,6 +340,7 @@ def __init__( continually_try_stand: bool = True, rgb_cameras: bool = True, payload_credentials_file: str = None, + cert_resource_glob: typing.Optional[str] = None, ) -> None: """ Args: @@ -391,7 +392,7 @@ def __init__( self._command_data = RobotCommandData() try: - self._sdk = create_standard_sdk(SPOT_CLIENT_NAME) + self._sdk = create_standard_sdk(SPOT_CLIENT_NAME, cert_resource_glob=cert_resource_glob) except Exception as e: self._logger.error("Error creating SDK object: %s", e) self._valid = False From 4ffe546421d6229b2462f985618c887e8ccd747d Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Fri, 12 Apr 2024 15:34:58 -0300 Subject: [PATCH 2/3] Please linters Signed-off-by: Michel Hidalgo --- spot_wrapper/testing/credentials/__init__.py | 15 ++++++--------- spot_wrapper/testing/fixtures.py | 10 ++++++---- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/spot_wrapper/testing/credentials/__init__.py b/spot_wrapper/testing/credentials/__init__.py index 93647e4..da4bb93 100644 --- a/spot_wrapper/testing/credentials/__init__.py +++ b/spot_wrapper/testing/credentials/__init__.py @@ -15,20 +15,17 @@ class SpotSSLCertificates: DEFAULT_TESTING_CERTIFICATES = SpotSSLCertificates( - robot_certificate_key_path=pathlib.Path(pkg_resources.resource_filename( - "spot_wrapper.testing.credentials", "robot.pem" - )), + robot_certificate_key_path=pathlib.Path( + pkg_resources.resource_filename("spot_wrapper.testing.credentials", "robot.pem") + ), robot_certificate_paths=[ - pathlib.Path(pkg_resources.resource_filename( - "spot_wrapper.testing.credentials", certificate_filename - )) for certificate_filename in ( + pathlib.Path(pkg_resources.resource_filename("spot_wrapper.testing.credentials", certificate_filename)) + for certificate_filename in ( "api.spot.robot.crt", "auth.spot.robot.crt", "id.spot.robot.crt", "payload-registration.spot.robot.crt", ) ], - root_certificate_path=pathlib.Path(pkg_resources.resource_filename( - "spot_wrapper.testing.credentials", "ca.crt" - )), + root_certificate_path=pathlib.Path(pkg_resources.resource_filename("spot_wrapper.testing.credentials", "ca.crt")), ) diff --git a/spot_wrapper/testing/fixtures.py b/spot_wrapper/testing/fixtures.py index 481bd11..805eb8b 100644 --- a/spot_wrapper/testing/fixtures.py +++ b/spot_wrapper/testing/fixtures.py @@ -64,10 +64,12 @@ def fixturefunc(**kwargs) -> typing.Iterator[SpotFixture]: with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as thread_pool: server = grpc.server(thread_pool) robot_certificate_key = certificates.robot_certificate_key_path.read_bytes() - server_credentials = grpc.ssl_server_credentials([ - (robot_certificate_key, certificate_path.read_bytes()) - for certificate_path in certificates.robot_certificate_paths - ]) + server_credentials = grpc.ssl_server_credentials( + [ + (robot_certificate_key, certificate_path.read_bytes()) + for certificate_path in certificates.robot_certificate_paths + ] + ) port = server.add_secure_port(f"{address}:0", server_credentials) with cls(**kwargs) as mock: mock.add_to(server) From f6fd872754df7a34da366457d96d36d0bd0264b9 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Fri, 12 Apr 2024 17:47:18 -0300 Subject: [PATCH 3/3] Install certificates and key Signed-off-by: Michel Hidalgo --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index b49e47c..9ebd025 100644 --- a/setup.py +++ b/setup.py @@ -5,5 +5,6 @@ version="1.0.0", description="Wrapper for Boston Dynamics Spot SDK", packages=find_packages(include=["spot_wrapper*"]), + package_data={"spot_wrapper.testing.credentials": ["*.crt", "*.pem"]}, install_requires=["bosdyn-client", "bosdyn-api", "bosdyn-mission", "bosdyn-core", "grpcio", "inflection", "pytest"], )