From 8186c62b195d9b7580c512b4820a41db43417efc Mon Sep 17 00:00:00 2001 From: Blake Harnden <32446120+bharnden@users.noreply.github.com> Date: Tue, 31 Mar 2020 09:41:29 -0700 Subject: [PATCH 1/4] switched core emulator data files from using namedtuples to backported dataclasses --- daemon/Pipfile.lock | 207 +++++++++++------------ daemon/core/api/grpc/events.py | 4 +- daemon/core/api/tlv/corehandlers.py | 8 +- daemon/core/api/tlv/dataconversion.py | 9 +- daemon/core/emulator/data.py | 230 +++++++++++++------------- daemon/core/emulator/session.py | 2 +- daemon/core/nodes/base.py | 10 +- daemon/core/nodes/network.py | 2 +- daemon/core/services/coreservices.py | 6 +- daemon/requirements.txt | 1 + daemon/setup.py.in | 3 +- 11 files changed, 240 insertions(+), 242 deletions(-) diff --git a/daemon/Pipfile.lock b/daemon/Pipfile.lock index fe07d856..e4a4b55b 100644 --- a/daemon/Pipfile.lock +++ b/daemon/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "d702e6eed5a1362bf261543572bbffd2e8a87140b8d8cb07b99fb0d25220a2b5" + "sha256": "199897f713f6f338316b33fcbbe0001e9e55fcd5e5e24b2245a89454ce13321f" }, "pipfile-spec": 6, "requires": {}, @@ -100,6 +100,14 @@ ], "version": "==2.8" }, + "dataclasses": { + "hashes": [ + "sha256:3459118f7ede7c8bea0fe795bff7c6c2ce287d01dd226202f7c9ebc0610a7836", + "sha256:494a6dcae3b8bcf80848eea2ef64c0cc5cd307ffc263e17cdf42f3e5420808e6" + ], + "index": "pypi", + "version": "==0.7" + }, "fabric": { "hashes": [ "sha256:160331934ea60036604928e792fa8e9f813266b098ef5562aa82b88527740389", @@ -197,9 +205,10 @@ }, "mako": { "hashes": [ - "sha256:2984a6733e1d472796ceef37ad48c26f4a984bb18119bb2dbc37a44d8f6e75a4" + "sha256:3139c5d64aa5d175dbafb95027057128b5fbd05a40c53999f3905ceb53366d9d", + "sha256:8e8b53c71c7e59f3de716b6832c4e401d903af574f6962edbbbf6ecc2a5fe6c9" ], - "version": "==1.1.1" + "version": "==1.1.2" }, "markupsafe": { "hashes": [ @@ -280,34 +289,12 @@ ], "version": "==7.0.0" }, - "protobuf": { - "hashes": [ - "sha256:0bae429443cc4748be2aadfdaf9633297cfaeb24a9a02d0ab15849175ce90fab", - "sha256:24e3b6ad259544d717902777b33966a1a069208c885576254c112663e6a5bb0f", - "sha256:310a7aca6e7f257510d0c750364774034272538d51796ca31d42c3925d12a52a", - "sha256:52e586072612c1eec18e1174f8e3bb19d08f075fc2e3f91d3b16c919078469d0", - "sha256:73152776dc75f335c476d11d52ec6f0f6925774802cd48d6189f4d5d7fe753f4", - "sha256:7774bbbaac81d3ba86de646c39f154afc8156717972bf0450c9dbfa1dc8dbea2", - "sha256:82d7ac987715d8d1eb4068bf997f3053468e0ce0287e2729c30601feb6602fee", - "sha256:8eb9c93798b904f141d9de36a0ba9f9b73cc382869e67c9e642c0aba53b0fc07", - "sha256:adf0e4d57b33881d0c63bb11e7f9038f98ee0c3e334c221f0858f826e8fb0151", - "sha256:c40973a0aee65422d8cb4e7d7cbded95dfeee0199caab54d5ab25b63bce8135a", - "sha256:c77c974d1dadf246d789f6dad1c24426137c9091e930dbf50e0a29c1fcf00b1f", - "sha256:dd9aa4401c36785ea1b6fff0552c674bdd1b641319cb07ed1fe2392388e9b0d7", - "sha256:e11df1ac6905e81b815ab6fd518e79be0a58b5dc427a2cf7208980f30694b956", - "sha256:e2f8a75261c26b2f5f3442b0525d50fd79a71aeca04b5ec270fc123536188306", - "sha256:e512b7f3a4dd780f59f1bf22c302740e27b10b5c97e858a6061772668cd6f961", - "sha256:ef2c2e56aaf9ee914d3dccc3408d42661aaf7d9bb78eaa8f17b2e6282f214481", - "sha256:fac513a9dc2a74b99abd2e17109b53945e364649ca03d9f7a0b96aa8d1807d0a", - "sha256:fdfb6ad138dbbf92b5dbea3576d7c8ba7463173f7d2cb0ca1bd336ec88ddbd80" - ], - "version": "==3.11.3" - }, "pycparser": { "hashes": [ - "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3" + "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", + "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" ], - "version": "==2.19" + "version": "==2.20" }, "pynacl": { "hashes": [ @@ -337,49 +324,46 @@ }, "pyproj": { "hashes": [ - "sha256:0a12982df36f55412597431676e51d3e8fcf9b3e41f18103c31edfb1fc5fa4c0", - "sha256:0b57669a568e4235f09fea9c4e498b9beca2673ea7318989569dbb750ed299c5", - "sha256:155064fde6a95f6328962386ebde043679fd744f1415e512ed88ec47760ed47c", - "sha256:189b8278784655ee2a3bfc51bde3091b5615cc982d0017edabcb10099b2ccb3f", - "sha256:1db407591f99877b551a655897da1fd95f4e82e089c8b0d29bcd8beffcffedb8", - "sha256:226e0c126d6db158dd3da8879e5efab9f05b1d67989c33fc6aa73bf70409bb12", - "sha256:2842412ea3f99383850df92dbbca837847f3e574f98f81eaa8caebc6514a26e2", - "sha256:2d2884e85b1e69ff829bfd54872c322d3d5662dc2120a17fbd1094b9c08f9dc5", - "sha256:341dc836a1a57b74494a95cff0f05029988d93e1f96ba6c190384ec757d482b2", - "sha256:3d69b6a197fc8cf3585290e272e1cdd641d6834a3c71894ec4f2b800d2210d2a", - "sha256:447d5b18d941bea180f04179946d1d4f4aa5012697d78c9a4ceac6081dd32465", - "sha256:4e8f18a8be5653e90f24b0aea74e85e10271d1c537742ede8a11b569d3583125", - "sha256:659b1d748cd7480324841da93f91097a726b898a2de0d192bc771d374006ceb4", - "sha256:6972adfe6bb40da0423c12c38617809bf50ca8b7411a20795a1c6c3d96f10942", - "sha256:75d7ed27e2e081d2036647f7b40a9e3d4f9ec4bde795925f3f7b4c6bb85f742e", - "sha256:7b623a18f70e70cbe594fa429283027c1a73d6d31c70cd04eea65845cd060b76", - "sha256:8112da72b47af9ffcc8f0f42224898ba6371680501b3657091bb7420b7dd5c03", - "sha256:9686c611893d1c182befa63157f4a1d629e7caa464adf21309cf4da5d422a264", - "sha256:98bb690ca7ea50148792f656c0366e799d70dd7e43ab8f0c733b64bd96842e1c", - "sha256:a6ede79fd7ddd176d824e0366f8d326ff8bc082d7332c9b40baf8cb8ae7d51fe", - "sha256:c7e7b6a00a701e166e5ce903159282f2969eef689fd7fb9d7bcf92aaf167e150", - "sha256:cb8c57faf91173c219739a37b909edc1c35a48a86d26be17f1a21ffd9f8728c3", - "sha256:ea6c7cbe2f277ca6b32ebad77d713681819e23b07b17a4a892878ffe245826b7", - "sha256:ec4b2146ec8fcc93c38fbd1dcb0df06e5737d588fe28d833dfb2b241d2736f54", - "sha256:f540f4af0223cb2195b0953db6c5cb45256137da430657db42ad1b076caca361" + "sha256:0d8196a5ac75fee2cf71c21066b3344427abfa8ad69b536d3404d5c7c9c0b886", + "sha256:12e378a0a21c73f96177f6cf64520f17e6b7aa02fc9cb27bd5c2d5b06ce170af", + "sha256:17738836128704d8f80b771572d77b8733841f0cb0ca42620549236ea62c4663", + "sha256:1a39175944710b225fd1943cb3b8ea0c8e059d3016360022ca10bbb7a6bfc9ae", + "sha256:2566bffb5395c9fbdb02077a0bc3e3ed0b2e4e3cadf65019e3139a8dfe27dd1d", + "sha256:3f43277f21ddaabed93b9885a4e494b785dca56e31fd37a935519d99b07807f0", + "sha256:424304beca6e0b0bc12aa46fc6d14a481ea47b1a4edec4854bb281656de38948", + "sha256:48128d794c8f52fcff2433a481e3aa2ccb0e0b3ccd51d3ad7cc10cc488c3f547", + "sha256:4a16b650722982cddedd45dfc36435b96e0ba83a2aebd4a4c247e5a68c852442", + "sha256:5161f1b5ece8a5263b64d97a32fbc473a4c6fdca5c95478e58e519ef1e97528e", + "sha256:6839ce14635ebfb01c67e456148f4f1fa04b03ef9645551b89d36593f2a3e57d", + "sha256:80e9f85ab81da75289308f23a62e1426a38411a07b0da738958d65ae8cc6c59c", + "sha256:881b44e94c781d02ecf1d9314fc7f44c09e6d54a8eac281869365999ac4db7a1", + "sha256:977542d2f8cf2981cf3ad72cedfebcd6ac56977c7aa830d9b49fa7888b56e83d", + "sha256:9bba6cbff7e23bb6d9062786d516602681b4414e9e423c138a7360e4d2a193e8", + "sha256:9bf64bba03ddc534ed3c6271ba8f9d31040f40cf8e9e7e458b6b1524a6f59082", + "sha256:9c712ceaa01488ebe6e357e1dfa2434c2304aad8a810e5d4c3d2abe21def6d58", + "sha256:b7da17e5a5c6039f85843e88c2f1ca8606d1a4cc13a87e7b68b9f51a54ef201a", + "sha256:bcdf81b3f13d2cc0354a4c3f7a567b71fcf6fe8098e519aaaee8e61f05c9de10", + "sha256:bebd3f987b7196e9d2ccfe55911b0c76ba9ce309bcabfb629ef205cbaaad37c5", + "sha256:c244e923073cd0bab74ba861ba31724aab90efda35b47a9676603c1a8e80b3ba", + "sha256:dacb94a9d570f4d9fc9369a22d44d7b3071cfe4d57d0ff2f57abd7ef6127fe41" ], - "version": "==2.5.0" + "version": "==2.6.0" }, "pyyaml": { "hashes": [ - "sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6", - "sha256:1cf708e2ac57f3aabc87405f04b86354f66799c8e62c28c5fc5f88b5521b2dbf", - "sha256:24521fa2890642614558b492b473bee0ac1f8057a7263156b02e8b14c88ce6f5", - "sha256:4fee71aa5bc6ed9d5f116327c04273e25ae31a3020386916905767ec4fc5317e", - "sha256:70024e02197337533eef7b85b068212420f950319cc8c580261963aefc75f811", - "sha256:74782fbd4d4f87ff04159e986886931456a1894c61229be9eaf4de6f6e44b99e", - "sha256:940532b111b1952befd7db542c370887a8611660d2b9becff75d39355303d82d", - "sha256:cb1f2f5e426dc9f07a7681419fe39cee823bb74f723f36f70399123f439e9b20", - "sha256:dbbb2379c19ed6042e8f11f2a2c66d39cceb8aeace421bfc29d085d93eda3689", - "sha256:e3a057b7a64f1222b56e47bcff5e4b94c4f61faac04c7c4ecb1985e18caa3994", - "sha256:e9f45bd5b92c7974e59bcd2dcc8631a6b6cc380a904725fce7bc08872e691615" + "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", + "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", + "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", + "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", + "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", + "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", + "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", + "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", + "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", + "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", + "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" ], - "version": "==5.3" + "version": "==5.3.1" }, "six": { "hashes": [ @@ -421,10 +405,10 @@ }, "click": { "hashes": [ - "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", - "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" + "sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc", + "sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a" ], - "version": "==7.0" + "version": "==7.1.1" }, "distlib": { "hashes": [ @@ -553,26 +537,26 @@ }, "identify": { "hashes": [ - "sha256:1222b648251bdcb8deb240b294f450fbf704c7984e08baa92507e4ea10b436d5", - "sha256:d824ebe21f38325c771c41b08a95a761db1982f1fc0eee37c6c97df3f1636b96" + "sha256:a7577a1f55cee1d21953a5cf11a3c839ab87f5ef909a4cba6cf52ed72b4c6059", + "sha256:ab246293e6585a1c6361a505b68d5b501a0409310932b7de2c2ead667b564d89" ], - "version": "==1.4.11" + "version": "==1.4.13" }, "importlib-metadata": { "hashes": [ - "sha256:06f5b3a99029c7134207dd882428a66992a9de2bef7c2b699b5641f9886c3302", - "sha256:b97607a1a18a5100839aec1dc26a1ea17ee0d93b20b0f008d80a5a050afb200b" + "sha256:2a688cbaa90e0cc587f1df48bdc97a6eadccdcd9c35fb3f976a09e3b5016d90f", + "sha256:34513a8a0c4962bc66d35b359558fd8a5e10cd472d37aec5f66858addef32c1e" ], "markers": "python_version < '3.8'", - "version": "==1.5.0" + "version": "==1.6.0" }, "importlib-resources": { "hashes": [ - "sha256:6e2783b2538bd5a14678284a3962b0660c715e5a0f10243fd5e00a4b5974f50b", - "sha256:d3279fd0f6f847cced9f7acc19bd3e5df54d34f93a2e7bb5f238f81545787078" + "sha256:4019b6a9082d8ada9def02bece4a76b131518866790d58fdda0b5f8c603b36c2", + "sha256:dd98ceeef3f5ad2ef4cc287b8586da4ebad15877f351e9688987ad663a0a29b8" ], "markers": "python_version < '3.7'", - "version": "==1.0.2" + "version": "==1.4.0" }, "isort": { "hashes": [ @@ -591,11 +575,11 @@ }, "mock": { "hashes": [ - "sha256:2a572b715f09dd2f0a583d8aeb5bb67d7ed7a8fd31d193cf1227a99c16a67bc3", - "sha256:5e48d216809f6f393987ed56920305d8f3c647e6ed35407c1ff2ecb88a9e1151" + "sha256:3f9b2c0196c60d21838f307f5825a7b86b678cedc58ab9e50a8988187b4d81e0", + "sha256:dd33eb70232b6118298d516bbcecd26704689c386594f0f3c4f13867b2c56f72" ], "index": "pypi", - "version": "==4.0.1" + "version": "==4.0.2" }, "more-itertools": { "hashes": [ @@ -612,10 +596,10 @@ }, "packaging": { "hashes": [ - "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73", - "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334" + "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3", + "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752" ], - "version": "==20.1" + "version": "==20.3" }, "pluggy": { "hashes": [ @@ -626,11 +610,11 @@ }, "pre-commit": { "hashes": [ - "sha256:09ebe467f43ce24377f8c2f200fe3cd2570d328eb2ce0568c8e96ce19da45fa6", - "sha256:f8d555e31e2051892c7f7b3ad9f620bd2c09271d87e9eedb2ad831737d6211eb" + "sha256:487c675916e6f99d355ec5595ad77b325689d423ef4839db1ed2f02f639c9522", + "sha256:c0aa11bce04a7b46c5544723aedf4e81a4d5f64ad1205a30a9ea12d5e81969e1" ], "index": "pypi", - "version": "==2.1.1" + "version": "==2.2.0" }, "protobuf": { "hashes": [ @@ -685,27 +669,27 @@ }, "pytest": { "hashes": [ - "sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d", - "sha256:ff615c761e25eb25df19edddc0b970302d2a9091fbce0e7213298d85fb61fef6" + "sha256:0e5b30f5cb04e887b91b1ee519fa3d89049595f428c1db76e73bd7f17b09b172", + "sha256:84dde37075b8805f3d1f392cc47e38a0e59518fb46a431cfdaf7cf1ce805f970" ], "index": "pypi", - "version": "==5.3.5" + "version": "==5.4.1" }, "pyyaml": { "hashes": [ - "sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6", - "sha256:1cf708e2ac57f3aabc87405f04b86354f66799c8e62c28c5fc5f88b5521b2dbf", - "sha256:24521fa2890642614558b492b473bee0ac1f8057a7263156b02e8b14c88ce6f5", - "sha256:4fee71aa5bc6ed9d5f116327c04273e25ae31a3020386916905767ec4fc5317e", - "sha256:70024e02197337533eef7b85b068212420f950319cc8c580261963aefc75f811", - "sha256:74782fbd4d4f87ff04159e986886931456a1894c61229be9eaf4de6f6e44b99e", - "sha256:940532b111b1952befd7db542c370887a8611660d2b9becff75d39355303d82d", - "sha256:cb1f2f5e426dc9f07a7681419fe39cee823bb74f723f36f70399123f439e9b20", - "sha256:dbbb2379c19ed6042e8f11f2a2c66d39cceb8aeace421bfc29d085d93eda3689", - "sha256:e3a057b7a64f1222b56e47bcff5e4b94c4f61faac04c7c4ecb1985e18caa3994", - "sha256:e9f45bd5b92c7974e59bcd2dcc8631a6b6cc380a904725fce7bc08872e691615" + "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", + "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", + "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", + "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", + "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", + "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", + "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", + "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", + "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", + "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", + "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" ], - "version": "==5.3" + "version": "==5.3.1" }, "six": { "hashes": [ @@ -723,24 +707,25 @@ }, "virtualenv": { "hashes": [ - "sha256:30ea90b21dabd11da5f509710ad3be2ae47d40ccbc717dfdd2efe4367c10f598", - "sha256:4a36a96d785428278edd389d9c36d763c5755844beb7509279194647b1ef47f1" + "sha256:4e399f48c6b71228bf79f5febd27e3bbb753d9d5905776a86667bc61ab628a25", + "sha256:9e81279f4a9d16d1c0654a127c2c86e5bca2073585341691882c1e66e31ef8a5" ], - "version": "==20.0.7" + "version": "==20.0.15" }, "wcwidth": { "hashes": [ - "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603", - "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8" + "sha256:cafe2186b3c009a04067022ce1dcd79cb38d8d65ee4f4791b8888d6599d1bbe1", + "sha256:ee73862862a156bf77ff92b09034fc4825dd3af9cf81bc5b360668d425f3c5f1" ], - "version": "==0.1.8" + "version": "==0.1.9" }, "zipp": { "hashes": [ - "sha256:12248a63bbdf7548f89cb4c7cda4681e537031eda29c02ea29674bc6854460c2", - "sha256:7c0f8e91abc0dc07a5068f315c52cb30c66bfbc581e5b50704c8a2f6ebae794a" + "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b", + "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96" ], - "version": "==3.0.0" + "markers": "python_version < '3.8'", + "version": "==3.1.0" } } } diff --git a/daemon/core/api/grpc/events.py b/daemon/core/api/grpc/events.py index 0bab096b..c4317e2e 100644 --- a/daemon/core/api/grpc/events.py +++ b/daemon/core/api/grpc/events.py @@ -23,14 +23,12 @@ def handle_node_event(event: NodeData) -> core_pb2.NodeEvent: :return: node event that contains node id, name, model, position, and services """ position = core_pb2.Position(x=event.x_position, y=event.y_position) - services = event.services or "" - services = services.split("|") node_proto = core_pb2.Node( id=event.id, name=event.name, model=event.model, position=position, - services=services, + services=event.services, ) return core_pb2.NodeEvent(node=node_proto, source=event.source) diff --git a/daemon/core/api/tlv/corehandlers.py b/daemon/core/api/tlv/corehandlers.py index 117b102e..8b6c23a5 100644 --- a/daemon/core/api/tlv/corehandlers.py +++ b/daemon/core/api/tlv/corehandlers.py @@ -300,7 +300,7 @@ class CoreHandler(socketserver.BaseRequestHandler): coreapi.CoreExceptionTlv, [ (ExceptionTlvs.NODE, exception_data.node), - (ExceptionTlvs.SESSION, exception_data.session), + (ExceptionTlvs.SESSION, str(exception_data.session)), (ExceptionTlvs.LEVEL, exception_data.level.value), (ExceptionTlvs.SOURCE, exception_data.source), (ExceptionTlvs.DATE, exception_data.date), @@ -639,7 +639,7 @@ class CoreHandler(socketserver.BaseRequestHandler): :return: """ exception_data = ExceptionData( - session=str(self.session.id), + session=self.session.id, node=node, date=time.ctime(), level=level.value, @@ -1891,13 +1891,13 @@ class CoreHandler(socketserver.BaseRequestHandler): node = self.session.get_node(node_id) values = ServiceShim.tovaluelist(node, service) config_data = ConfigData( - message_type=0, + message_type=MessageFlags.NONE, node=node_id, object=self.session.services.name, type=ConfigFlags.UPDATE.value, data_types=data_types, data_values=values, - session=str(self.session.id), + session=self.session.id, opaque=opaque, ) self.session.broadcast_config(config_data) diff --git a/daemon/core/api/tlv/dataconversion.py b/daemon/core/api/tlv/dataconversion.py index 21730afb..2689a1e9 100644 --- a/daemon/core/api/tlv/dataconversion.py +++ b/daemon/core/api/tlv/dataconversion.py @@ -18,6 +18,9 @@ def convert_node(node_data): :param core.emulator.data.NodeData node_data: node data to convert :return: packed node message """ + services = None + if node_data.services is not None: + services = "|".join([x for x in node_data.services]) tlv_data = structutils.pack_values( coreapi.CoreNodeTlv, [ @@ -30,12 +33,12 @@ def convert_node(node_data): (NodeTlvs.MODEL, node_data.model), (NodeTlvs.EMULATION_ID, node_data.emulation_id), (NodeTlvs.EMULATION_SERVER, node_data.server), - (NodeTlvs.SESSION, node_data.session), + (NodeTlvs.SESSION, str(node_data.session)), (NodeTlvs.X_POSITION, int(node_data.x_position)), (NodeTlvs.Y_POSITION, int(node_data.y_position)), (NodeTlvs.CANVAS, node_data.canvas), (NodeTlvs.NETWORK_ID, node_data.network_id), - (NodeTlvs.SERVICES, node_data.services), + (NodeTlvs.SERVICES, services), (NodeTlvs.LATITUDE, str(node_data.latitude)), (NodeTlvs.LONGITUDE, str(node_data.longitude)), (NodeTlvs.ALTITUDE, str(node_data.altitude)), @@ -65,7 +68,7 @@ def convert_config(config_data): (ConfigTlvs.BITMAP, config_data.bitmap), (ConfigTlvs.POSSIBLE_VALUES, config_data.possible_values), (ConfigTlvs.GROUPS, config_data.groups), - (ConfigTlvs.SESSION, config_data.session), + (ConfigTlvs.SESSION, str(config_data.session)), (ConfigTlvs.INTERFACE_NUMBER, config_data.interface_number), (ConfigTlvs.NETWORK_ID, config_data.network_id), (ConfigTlvs.OPAQUE, config_data.opaque), diff --git a/daemon/core/emulator/data.py b/daemon/core/emulator/data.py index 0ed1fa67..26082f94 100644 --- a/daemon/core/emulator/data.py +++ b/daemon/core/emulator/data.py @@ -2,121 +2,129 @@ CORE data objects. """ -import collections +from dataclasses import dataclass +from typing import List, Tuple -ConfigData = collections.namedtuple( - "ConfigData", - [ - "message_type", - "node", - "object", - "type", - "data_types", - "data_values", - "captions", - "bitmap", - "possible_values", - "groups", - "session", - "interface_number", - "network_id", - "opaque", - ], +from core.emulator.enumerations import ( + EventTypes, + ExceptionLevels, + LinkTypes, + MessageFlags, + NodeTypes, ) -ConfigData.__new__.__defaults__ = (None,) * len(ConfigData._fields) -EventData = collections.namedtuple( - "EventData", ["node", "event_type", "name", "data", "time", "session"] -) -EventData.__new__.__defaults__ = (None,) * len(EventData._fields) -ExceptionData = collections.namedtuple( - "ExceptionData", ["node", "session", "level", "source", "date", "text", "opaque"] -) -ExceptionData.__new__.__defaults__ = (None,) * len(ExceptionData._fields) +@dataclass +class ConfigData: + message_type: MessageFlags = None + node: int = None + object: str = None + type: int = None + data_types: Tuple[int] = None + data_values: str = None + captions: str = None + bitmap: str = None + possible_values: str = None + groups: str = None + session: int = None + interface_number: int = None + network_id: int = None + opaque: str = None -FileData = collections.namedtuple( - "FileData", - [ - "message_type", - "node", - "name", - "mode", - "number", - "type", - "source", - "session", - "data", - "compressed_data", - ], -) -FileData.__new__.__defaults__ = (None,) * len(FileData._fields) -NodeData = collections.namedtuple( - "NodeData", - [ - "message_type", - "id", - "node_type", - "name", - "ip_address", - "mac_address", - "ip6_address", - "model", - "emulation_id", - "server", - "session", - "x_position", - "y_position", - "canvas", - "network_id", - "services", - "latitude", - "longitude", - "altitude", - "icon", - "opaque", - "source", - ], -) -NodeData.__new__.__defaults__ = (None,) * len(NodeData._fields) +@dataclass +class EventData: + node: int = None + event_type: EventTypes = None + name: str = None + data: str = None + time: float = None + session: int = None -LinkData = collections.namedtuple( - "LinkData", - [ - "message_type", - "node1_id", - "node2_id", - "delay", - "bandwidth", - "per", - "dup", - "jitter", - "mer", - "burst", - "session", - "mburst", - "link_type", - "gui_attributes", - "unidirectional", - "emulation_id", - "network_id", - "key", - "interface1_id", - "interface1_name", - "interface1_ip4", - "interface1_ip4_mask", - "interface1_mac", - "interface1_ip6", - "interface1_ip6_mask", - "interface2_id", - "interface2_name", - "interface2_ip4", - "interface2_ip4_mask", - "interface2_mac", - "interface2_ip6", - "interface2_ip6_mask", - "opaque", - ], -) -LinkData.__new__.__defaults__ = (None,) * len(LinkData._fields) + +@dataclass +class ExceptionData: + node: int = None + session: int = None + level: ExceptionLevels = None + source: str = None + date: str = None + text: str = None + opaque: str = None + + +@dataclass +class FileData: + message_type: MessageFlags = None + node: int = None + name: str = None + mode: str = None + number: int = None + type: str = None + source: str = None + session: int = None + data: str = None + compressed_data: str = None + + +@dataclass +class NodeData: + message_type: MessageFlags = None + id: int = None + node_type: NodeTypes = None + name: str = None + ip_address: str = None + mac_address: str = None + ip6_address: str = None + model: str = None + emulation_id: int = None + server: str = None + session: int = None + x_position: float = None + y_position: float = None + canvas: int = None + network_id: int = None + services: List[str] = None + latitude: float = None + longitude: float = None + altitude: float = None + icon: str = None + opaque: str = None + source: str = None + + +@dataclass +class LinkData: + message_type: MessageFlags = None + node1_id: int = None + node2_id: int = None + delay: float = None + bandwidth: float = None + per: float = None + dup: float = None + jitter: float = None + mer: float = None + burst: float = None + session: int = None + mburst: float = None + link_type: LinkTypes = None + gui_attributes: str = None + unidirectional: int = None + emulation_id: int = None + network_id: int = None + key: int = None + interface1_id: int = None + interface1_name: str = None + interface1_ip4: str = None + interface1_ip4_mask: int = None + interface1_mac: str = None + interface1_ip6: str = None + interface1_ip6_mask: int = None + interface2_id: int = None + interface2_name: str = None + interface2_ip4: str = None + interface2_ip4_mask: int = None + interface2_mac: str = None + interface2_ip6: str = None + interface2_ip6_mask: int = None + opaque: str = None diff --git a/daemon/core/emulator/session.py b/daemon/core/emulator/session.py index ac907911..bd59574f 100644 --- a/daemon/core/emulator/session.py +++ b/daemon/core/emulator/session.py @@ -1464,7 +1464,7 @@ class Session: """ exception_data = ExceptionData( node=node_id, - session=str(self.id), + session=self.id, level=level, source=source, date=time.ctime(), diff --git a/daemon/core/nodes/base.py b/daemon/core/nodes/base.py index 2df3fd74..098924db 100644 --- a/daemon/core/nodes/base.py +++ b/daemon/core/nodes/base.py @@ -193,7 +193,7 @@ class NodeBase: def data( self, message_type: MessageFlags = MessageFlags.NONE, source: str = None - ) -> NodeData: + ) -> Optional[NodeData]: """ Build a data object for this node. @@ -209,9 +209,9 @@ class NodeBase: server = None if self.server is not None: server = self.server.name - services = self.services - if services is not None: - services = "|".join([service.name for service in services]) + services = None + if self.services is not None: + services = [service.name for service in self.services] return NodeData( message_type=message_type, id=self.id, @@ -1131,7 +1131,7 @@ class CoreNetworkBase(NodeBase): netif.swapparams("_params_up") link_data = LinkData( - message_type=0, + message_type=MessageFlags.NONE, node1_id=linked_node.id, node2_id=self.id, link_type=self.linktype, diff --git a/daemon/core/nodes/network.py b/daemon/core/nodes/network.py index ff6e6ceb..eb179e84 100644 --- a/daemon/core/nodes/network.py +++ b/daemon/core/nodes/network.py @@ -880,7 +880,7 @@ class PtpNet(CoreNetwork): def data( self, message_type: MessageFlags = MessageFlags.NONE, source: str = None - ) -> NodeData: + ) -> Optional[NodeData]: """ Do not generate a Node Message for point-to-point links. They are built using a link message instead. diff --git a/daemon/core/services/coreservices.py b/daemon/core/services/coreservices.py index 6323ceab..d300ba66 100644 --- a/daemon/core/services/coreservices.py +++ b/daemon/core/services/coreservices.py @@ -637,7 +637,9 @@ class CoreServices: status = -1 return status - def get_service_file(self, node: CoreNode, service_name: str, filename: str) -> str: + def get_service_file( + self, node: CoreNode, service_name: str, filename: str + ) -> FileData: """ Send a File Message when the GUI has requested a service file. The file data is either auto-generated or comes from an existing config. @@ -645,7 +647,7 @@ class CoreServices: :param node: node to get service file from :param service_name: service to get file from :param filename: file name to retrieve - :return: file message for node + :return: file data """ # get service to get file from service = self.get_service(node.id, service_name, default_service=True) diff --git a/daemon/requirements.txt b/daemon/requirements.txt index 2118b15e..b1936855 100644 --- a/daemon/requirements.txt +++ b/daemon/requirements.txt @@ -1,6 +1,7 @@ bcrypt==3.1.7 cffi==1.14.0 cryptography==2.8 +dataclasses==0.7 fabric==2.5.0 grpcio==1.27.2 invoke==1.4.1 diff --git a/daemon/setup.py.in b/daemon/setup.py.in index c4d2ae56..5e4e39c7 100644 --- a/daemon/setup.py.in +++ b/daemon/setup.py.in @@ -34,12 +34,13 @@ setup( version="@PACKAGE_VERSION@", packages=find_packages(), install_requires=[ + "dataclasses", "fabric", "grpcio", - "netaddr", "invoke", "lxml", "mako", + "netaddr", "pillow", "protobuf", "pyproj", From 6e8f980cc9b658f12b64bd0c249ae0b5f36cc4bc Mon Sep 17 00:00:00 2001 From: Blake Harnden <32446120+bharnden@users.noreply.github.com> Date: Tue, 31 Mar 2020 14:06:13 -0700 Subject: [PATCH 2/4] moved github action to 3.6, since that is the current min requirement --- .github/workflows/daemon-checks.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/daemon-checks.yml b/.github/workflows/daemon-checks.yml index ca2de7d8..85409568 100644 --- a/.github/workflows/daemon-checks.yml +++ b/.github/workflows/daemon-checks.yml @@ -7,10 +7,10 @@ jobs: runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v1 - - name: Set up Python 3.7 + - name: Set up Python 3.6 uses: actions/setup-python@v1 with: - python-version: 3.7 + python-version: 3.6 - name: Install pipenv run: | python -m pip install --upgrade pip From 2532f6605d6ef140cf431a4a61274aae76a07c31 Mon Sep 17 00:00:00 2001 From: Blake Harnden <32446120+bharnden@users.noreply.github.com> Date: Tue, 31 Mar 2020 14:19:02 -0700 Subject: [PATCH 3/4] modify setup.py to denote dataclasses only being needed in 3.6 --- daemon/setup.py.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon/setup.py.in b/daemon/setup.py.in index 5e4e39c7..e8c99e67 100644 --- a/daemon/setup.py.in +++ b/daemon/setup.py.in @@ -34,7 +34,7 @@ setup( version="@PACKAGE_VERSION@", packages=find_packages(), install_requires=[ - "dataclasses", + 'dataclasses;python_version=="3.6"', "fabric", "grpcio", "invoke", From 2ce1ef04ae866179db18603bcd612576eeb49726 Mon Sep 17 00:00:00 2001 From: Blake Harnden <32446120+bharnden@users.noreply.github.com> Date: Tue, 31 Mar 2020 14:28:17 -0700 Subject: [PATCH 4/4] updated Pipfile.lock to denote marker for only installing dataclasses in python 3.6 --- daemon/Pipfile.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/daemon/Pipfile.lock b/daemon/Pipfile.lock index e4a4b55b..2fb5c3b8 100644 --- a/daemon/Pipfile.lock +++ b/daemon/Pipfile.lock @@ -106,6 +106,7 @@ "sha256:494a6dcae3b8bcf80848eea2ef64c0cc5cd307ffc263e17cdf42f3e5420808e6" ], "index": "pypi", + "markers": "python_version == '3.6'", "version": "==0.7" }, "fabric": {