From 43487b7bfda901e0ed537ad0d7e0c82b092ce0a4 Mon Sep 17 00:00:00 2001 From: "Arkadiusz Kaliwoda (akaliwod)" Date: Fri, 14 Jun 2024 12:28:31 +0200 Subject: [PATCH] v0.25 --- .gitignore | 23 + README.md | 49 + iserver.py | 43 + lib/__init__.py | 0 lib/aci/__init__.py | 0 lib/aci/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 140 bytes lib/aci/__pycache__/aepg.cpython-310.pyc | Bin 0 -> 2204 bytes lib/aci/__pycache__/ap.cpython-310.pyc | Bin 0 -> 2073 bytes lib/aci/__pycache__/api.cpython-310.pyc | Bin 0 -> 15856 bytes lib/aci/__pycache__/apic.cpython-310.pyc | Bin 0 -> 2678 bytes lib/aci/__pycache__/bd.cpython-310.pyc | Bin 0 -> 4098 bytes lib/aci/__pycache__/cache.cpython-310.pyc | Bin 0 -> 5556 bytes .../__pycache__/cdp_adj_ep.cpython-310.pyc | Bin 0 -> 1561 bytes lib/aci/__pycache__/common.cpython-310.pyc | Bin 0 -> 1389 bytes lib/aci/__pycache__/contract.cpython-310.pyc | Bin 0 -> 1686 bytes lib/aci/__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 3655 bytes lib/aci/__pycache__/if_mgmt.cpython-310.pyc | Bin 0 -> 3331 bytes .../interface_fault_counts.cpython-310.pyc | Bin 0 -> 1664 bytes .../interface_management.cpython-310.pyc | Bin 0 -> 4320 bytes ...interface_management_state.cpython-310.pyc | Bin 0 -> 1756 bytes ...interface_management_stats.cpython-310.pyc | Bin 0 -> 1719 bytes lib/aci/__pycache__/l1physif.cpython-310.pyc | Bin 0 -> 2113 bytes lib/aci/__pycache__/l2out.cpython-310.pyc | Bin 0 -> 1616 bytes lib/aci/__pycache__/l3out.cpython-310.pyc | Bin 0 -> 1703 bytes .../__pycache__/lldp_adj_ep.cpython-310.pyc | Bin 0 -> 1603 bytes lib/aci/__pycache__/node.cpython-310.pyc | Bin 0 -> 3683 bytes lib/aci/__pycache__/output.cpython-310.pyc | Bin 0 -> 3499 bytes lib/aci/__pycache__/port.cpython-310.pyc | Bin 0 -> 8638 bytes .../port_epg_stats.cpython-310.pyc | Bin 0 -> 1773 bytes .../__pycache__/port_fc_stat.cpython-310.pyc | Bin 0 -> 1824 bytes .../__pycache__/port_fc_stats.cpython-310.pyc | Bin 0 -> 1825 bytes .../__pycache__/port_qos_stat.cpython-310.pyc | Bin 0 -> 2680 bytes .../port_qos_stats.cpython-310.pyc | Bin 0 -> 2665 bytes lib/aci/__pycache__/port_stat.cpython-310.pyc | Bin 0 -> 2173 bytes .../__pycache__/port_stats.cpython-310.pyc | Bin 0 -> 2559 bytes .../port_vlan_stats.cpython-310.pyc | Bin 0 -> 2647 bytes lib/aci/__pycache__/settings.cpython-310.pyc | Bin 0 -> 9870 bytes lib/aci/__pycache__/tenant.cpython-310.pyc | Bin 0 -> 2000 bytes lib/aci/__pycache__/vrf.cpython-310.pyc | Bin 0 -> 1838 bytes lib/aci/ap/__init__.py | 0 .../ap/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 143 bytes lib/aci/ap/__pycache__/api.cpython-310.pyc | Bin 0 -> 1186 bytes lib/aci/ap/__pycache__/info.cpython-310.pyc | Bin 0 -> 4011 bytes lib/aci/ap/__pycache__/main.cpython-310.pyc | Bin 0 -> 958 bytes lib/aci/ap/__pycache__/output.cpython-310.pyc | Bin 0 -> 3947 bytes lib/aci/ap/api.py | 55 + lib/aci/ap/audit/__init__.py | 0 lib/aci/ap/audit/api.py | 48 + lib/aci/ap/audit/info.py | 114 + lib/aci/ap/audit/main.py | 8 + lib/aci/ap/event/__init__.py | 0 lib/aci/ap/event/api.py | 51 + lib/aci/ap/event/info.py | 130 + lib/aci/ap/event/main.py | 8 + lib/aci/ap/fault/__init__.py | 0 lib/aci/ap/fault/api.py | 118 + lib/aci/ap/fault/info.py | 161 + lib/aci/ap/fault/main.py | 8 + lib/aci/ap/info.py | 221 + lib/aci/ap/main.py | 23 + lib/aci/ap/node/__init__.py | 0 lib/aci/ap/node/api.py | 61 + lib/aci/ap/node/info.py | 82 + lib/aci/ap/node/main.py | 8 + lib/aci/ap/output.py | 334 + lib/aci/api.py | 1174 + lib/aci/apic.py | 116 + lib/aci/bd/TODO.md | 5 + lib/aci/bd/__init__.py | 0 .../bd/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 143 bytes lib/aci/bd/__pycache__/api.cpython-310.pyc | Bin 0 -> 1550 bytes lib/aci/bd/__pycache__/health.cpython-310.pyc | Bin 0 -> 858 bytes lib/aci/bd/__pycache__/igmp.cpython-310.pyc | Bin 0 -> 1106 bytes lib/aci/bd/__pycache__/info.cpython-310.pyc | Bin 0 -> 7830 bytes lib/aci/bd/__pycache__/l3out.cpython-310.pyc | Bin 0 -> 795 bytes lib/aci/bd/__pycache__/main.cpython-310.pyc | Bin 0 -> 1414 bytes lib/aci/bd/__pycache__/mld.cpython-310.pyc | Bin 0 -> 891 bytes lib/aci/bd/__pycache__/nd.cpython-310.pyc | Bin 0 -> 1152 bytes lib/aci/bd/__pycache__/output.cpython-310.pyc | Bin 0 -> 9670 bytes .../bd/__pycache__/retention.cpython-310.pyc | Bin 0 -> 821 bytes lib/aci/bd/__pycache__/subnet.cpython-310.pyc | Bin 0 -> 1696 bytes lib/aci/bd/__pycache__/vrf.cpython-310.pyc | Bin 0 -> 940 bytes lib/aci/bd/api.py | 108 + lib/aci/bd/audit/__init__.py | 0 lib/aci/bd/audit/api.py | 48 + lib/aci/bd/audit/info.py | 110 + lib/aci/bd/audit/main.py | 8 + lib/aci/bd/event/__init__.py | 0 lib/aci/bd/event/api.py | 51 + lib/aci/bd/event/info.py | 124 + lib/aci/bd/event/main.py | 8 + lib/aci/bd/fault/__init__.py | 0 lib/aci/bd/fault/api.py | 118 + lib/aci/bd/fault/info.py | 155 + lib/aci/bd/fault/main.py | 8 + lib/aci/bd/igmp/__init__.py | 0 .../igmp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../bd/igmp/__pycache__/info.cpython-310.pyc | Bin 0 -> 1123 bytes .../bd/igmp/__pycache__/main.cpython-310.pyc | Bin 0 -> 519 bytes lib/aci/bd/igmp/info.py | 55 + lib/aci/bd/igmp/main.py | 6 + lib/aci/bd/info.py | 507 + lib/aci/bd/l3out/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../bd/l3out/__pycache__/info.cpython-310.pyc | Bin 0 -> 812 bytes .../bd/l3out/__pycache__/main.cpython-310.pyc | Bin 0 -> 524 bytes lib/aci/bd/l3out/info.py | 16 + lib/aci/bd/l3out/main.py | 6 + lib/aci/bd/main.py | 41 + lib/aci/bd/mld/__init__.py | 0 .../mld/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../bd/mld/__pycache__/info.cpython-310.pyc | Bin 0 -> 908 bytes .../bd/mld/__pycache__/main.cpython-310.pyc | Bin 0 -> 514 bytes lib/aci/bd/mld/info.py | 41 + lib/aci/bd/mld/main.py | 6 + lib/aci/bd/node/__init__.py | 0 lib/aci/bd/node/api.py | 61 + lib/aci/bd/node/info.py | 82 + lib/aci/bd/node/main.py | 8 + lib/aci/bd/output.py | 777 + lib/aci/bd/retention/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 838 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 544 bytes lib/aci/bd/retention/info.py | 19 + lib/aci/bd/retention/main.py | 6 + lib/aci/bd/subnet/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../subnet/__pycache__/info.cpython-310.pyc | Bin 0 -> 1717 bytes .../subnet/__pycache__/main.cpython-310.pyc | Bin 0 -> 529 bytes lib/aci/bd/subnet/info.py | 96 + lib/aci/bd/subnet/main.py | 6 + lib/aci/bd/vrf/__init__.py | 0 .../vrf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../bd/vrf/__pycache__/info.cpython-310.pyc | Bin 0 -> 957 bytes .../bd/vrf/__pycache__/main.cpython-310.pyc | Bin 0 -> 514 bytes lib/aci/bd/vrf/info.py | 27 + lib/aci/bd/vrf/main.py | 6 + lib/aci/bot_output.py | 111 + lib/aci/cache.py | 272 + lib/aci/common.py | 85 + lib/aci/context.py | 45 + lib/aci/contract/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../contract/__pycache__/api.cpython-310.pyc | Bin 0 -> 1316 bytes .../contract/__pycache__/info.cpython-310.pyc | Bin 0 -> 5208 bytes .../contract/__pycache__/main.cpython-310.pyc | Bin 0 -> 688 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 718 bytes lib/aci/contract/filter/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../filter/__pycache__/api.cpython-310.pyc | Bin 0 -> 1271 bytes .../filter/__pycache__/info.cpython-310.pyc | Bin 0 -> 4814 bytes .../filter/__pycache__/main.cpython-310.pyc | Bin 0 -> 920 bytes .../filter/__pycache__/output.cpython-310.pyc | Bin 0 -> 3637 bytes lib/aci/contract/filter/api.py | 60 + lib/aci/contract/filter/audit/__init__.py | 0 lib/aci/contract/filter/audit/api.py | 48 + lib/aci/contract/filter/audit/info.py | 110 + lib/aci/contract/filter/audit/main.py | 8 + lib/aci/contract/filter/event/__init__.py | 0 lib/aci/contract/filter/event/api.py | 51 + lib/aci/contract/filter/event/info.py | 124 + lib/aci/contract/filter/event/main.py | 8 + lib/aci/contract/filter/fault/__init__.py | 0 lib/aci/contract/filter/fault/api.py | 118 + lib/aci/contract/filter/fault/info.py | 155 + lib/aci/contract/filter/fault/main.py | 8 + lib/aci/contract/filter/info.py | 270 + lib/aci/contract/filter/main.py | 20 + lib/aci/contract/filter/output.py | 304 + lib/aci/contract/main.py | 14 + lib/aci/contract/output.py | 10 + lib/aci/contract/standard/__init__.py | 0 lib/aci/contract/standard/api.py | 70 + lib/aci/contract/standard/audit/__init__.py | 0 lib/aci/contract/standard/audit/api.py | 48 + lib/aci/contract/standard/audit/info.py | 110 + lib/aci/contract/standard/audit/main.py | 8 + lib/aci/contract/standard/event/__init__.py | 0 lib/aci/contract/standard/event/api.py | 51 + lib/aci/contract/standard/event/info.py | 124 + lib/aci/contract/standard/event/main.py | 8 + lib/aci/contract/standard/fault/__init__.py | 0 lib/aci/contract/standard/fault/api.py | 118 + lib/aci/contract/standard/fault/info.py | 155 + lib/aci/contract/standard/fault/main.py | 8 + lib/aci/contract/standard/info.py | 361 + lib/aci/contract/standard/main.py | 23 + lib/aci/contract/standard/output.py | 316 + lib/aci/contract/standard/subject/__init__.py | 0 lib/aci/contract/standard/subject/api.py | 60 + lib/aci/contract/standard/subject/info.py | 99 + lib/aci/contract/standard/subject/main.py | 8 + lib/aci/contract/taboo/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../taboo/__pycache__/api.cpython-310.pyc | Bin 0 -> 1312 bytes .../taboo/__pycache__/info.cpython-310.pyc | Bin 0 -> 4703 bytes .../taboo/__pycache__/main.cpython-310.pyc | Bin 0 -> 1008 bytes .../taboo/__pycache__/output.cpython-310.pyc | Bin 0 -> 3782 bytes lib/aci/contract/taboo/api.py | 65 + lib/aci/contract/taboo/audit/__init__.py | 0 lib/aci/contract/taboo/audit/api.py | 48 + lib/aci/contract/taboo/audit/info.py | 110 + lib/aci/contract/taboo/audit/main.py | 8 + lib/aci/contract/taboo/event/__init__.py | 0 lib/aci/contract/taboo/event/api.py | 51 + lib/aci/contract/taboo/event/info.py | 124 + lib/aci/contract/taboo/event/main.py | 8 + lib/aci/contract/taboo/fault/__init__.py | 0 lib/aci/contract/taboo/fault/api.py | 118 + lib/aci/contract/taboo/fault/info.py | 155 + lib/aci/contract/taboo/fault/main.py | 8 + lib/aci/contract/taboo/info.py | 261 + lib/aci/contract/taboo/main.py | 23 + lib/aci/contract/taboo/output.py | 307 + lib/aci/contract/taboo/subject/__init__.py | 0 lib/aci/contract/taboo/subject/api.py | 60 + lib/aci/contract/taboo/subject/info.py | 85 + lib/aci/contract/taboo/subject/main.py | 8 + lib/aci/domain/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../domain/__pycache__/main.cpython-310.pyc | Bin 0 -> 1103 bytes .../domain/__pycache__/output.cpython-310.pyc | Bin 0 -> 844 bytes lib/aci/domain/aaa/__init__.py | 0 .../aaa/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../aaa/__pycache__/api.cpython-310.pyc | Bin 0 -> 1115 bytes .../aaa/__pycache__/info.cpython-310.pyc | Bin 0 -> 2203 bytes .../aaa/__pycache__/main.cpython-310.pyc | Bin 0 -> 582 bytes .../aaa/__pycache__/output.cpython-310.pyc | Bin 0 -> 874 bytes lib/aci/domain/aaa/api.py | 52 + lib/aci/domain/aaa/info.py | 111 + lib/aci/domain/aaa/main.py | 8 + lib/aci/domain/aaa/output.py | 28 + lib/aci/domain/l2/__init__.py | 0 .../l2/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../domain/l2/__pycache__/api.cpython-310.pyc | Bin 0 -> 1426 bytes .../l2/__pycache__/info.cpython-310.pyc | Bin 0 -> 5290 bytes .../l2/__pycache__/main.cpython-310.pyc | Bin 0 -> 927 bytes .../l2/__pycache__/output.cpython-310.pyc | Bin 0 -> 5095 bytes lib/aci/domain/l2/api.py | 78 + lib/aci/domain/l2/audit/__init__.py | 0 lib/aci/domain/l2/audit/api.py | 48 + lib/aci/domain/l2/audit/info.py | 97 + lib/aci/domain/l2/audit/main.py | 8 + lib/aci/domain/l2/event/__init__.py | 0 lib/aci/domain/l2/event/api.py | 51 + lib/aci/domain/l2/event/info.py | 107 + lib/aci/domain/l2/event/main.py | 8 + lib/aci/domain/l2/fault/__init__.py | 0 lib/aci/domain/l2/fault/api.py | 112 + lib/aci/domain/l2/fault/info.py | 139 + lib/aci/domain/l2/fault/main.py | 8 + lib/aci/domain/l2/info.py | 316 + lib/aci/domain/l2/main.py | 23 + lib/aci/domain/l2/node/__init__.py | 0 lib/aci/domain/l2/node/api.py | 61 + lib/aci/domain/l2/node/info.py | 81 + lib/aci/domain/l2/node/main.py | 8 + lib/aci/domain/l2/output.py | 455 + lib/aci/domain/l3/__init__.py | 0 .../l3/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../domain/l3/__pycache__/api.cpython-310.pyc | Bin 0 -> 1426 bytes .../l3/__pycache__/info.cpython-310.pyc | Bin 0 -> 5198 bytes .../l3/__pycache__/main.cpython-310.pyc | Bin 0 -> 927 bytes .../l3/__pycache__/output.cpython-310.pyc | Bin 0 -> 5095 bytes lib/aci/domain/l3/api.py | 78 + lib/aci/domain/l3/audit/__init__.py | 0 lib/aci/domain/l3/audit/api.py | 48 + lib/aci/domain/l3/audit/info.py | 97 + lib/aci/domain/l3/audit/main.py | 8 + lib/aci/domain/l3/event/__init__.py | 0 lib/aci/domain/l3/event/api.py | 51 + lib/aci/domain/l3/event/info.py | 107 + lib/aci/domain/l3/event/main.py | 8 + lib/aci/domain/l3/fault/__init__.py | 0 lib/aci/domain/l3/fault/api.py | 112 + lib/aci/domain/l3/fault/info.py | 139 + lib/aci/domain/l3/fault/main.py | 8 + lib/aci/domain/l3/info.py | 311 + lib/aci/domain/l3/main.py | 23 + lib/aci/domain/l3/node/__init__.py | 0 lib/aci/domain/l3/node/api.py | 61 + lib/aci/domain/l3/node/info.py | 81 + lib/aci/domain/l3/node/main.py | 8 + lib/aci/domain/l3/output.py | 455 + lib/aci/domain/main.py | 32 + lib/aci/domain/output.py | 14 + lib/aci/domain/phy/TODO.md | 8 + lib/aci/domain/phy/__init__.py | 0 .../phy/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../phy/__pycache__/api.cpython-310.pyc | Bin 0 -> 1428 bytes .../phy/__pycache__/info.cpython-310.pyc | Bin 0 -> 5405 bytes .../phy/__pycache__/main.cpython-310.pyc | Bin 0 -> 942 bytes .../phy/__pycache__/output.cpython-310.pyc | Bin 0 -> 5196 bytes lib/aci/domain/phy/api.py | 78 + lib/aci/domain/phy/audit/__init__.py | 0 lib/aci/domain/phy/audit/api.py | 48 + lib/aci/domain/phy/audit/info.py | 97 + lib/aci/domain/phy/audit/main.py | 8 + lib/aci/domain/phy/event/__init__.py | 0 lib/aci/domain/phy/event/api.py | 51 + lib/aci/domain/phy/event/info.py | 107 + lib/aci/domain/phy/event/main.py | 8 + lib/aci/domain/phy/fault/__init__.py | 0 lib/aci/domain/phy/fault/api.py | 112 + lib/aci/domain/phy/fault/info.py | 139 + lib/aci/domain/phy/fault/main.py | 8 + lib/aci/domain/phy/info.py | 319 + lib/aci/domain/phy/main.py | 23 + lib/aci/domain/phy/node/__init__.py | 0 lib/aci/domain/phy/node/api.py | 61 + lib/aci/domain/phy/node/info.py | 81 + lib/aci/domain/phy/node/main.py | 8 + lib/aci/domain/phy/output.py | 455 + lib/aci/domain/vmm/__init__.py | 0 .../vmm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../vmm/__pycache__/api.cpython-310.pyc | Bin 0 -> 1645 bytes .../vmm/__pycache__/info.cpython-310.pyc | Bin 0 -> 6471 bytes .../vmm/__pycache__/main.cpython-310.pyc | Bin 0 -> 1126 bytes .../vmm/__pycache__/output.cpython-310.pyc | Bin 0 -> 7229 bytes lib/aci/domain/vmm/api.py | 97 + lib/aci/domain/vmm/audit/__init__.py | 0 lib/aci/domain/vmm/audit/api.py | 48 + lib/aci/domain/vmm/audit/info.py | 97 + lib/aci/domain/vmm/audit/main.py | 8 + lib/aci/domain/vmm/controller/__init__.py | 0 lib/aci/domain/vmm/controller/api.py | 66 + lib/aci/domain/vmm/controller/info.py | 218 + lib/aci/domain/vmm/controller/main.py | 8 + lib/aci/domain/vmm/epg/__init__.py | 0 .../epg/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../vmm/epg/__pycache__/api.cpython-310.pyc | Bin 0 -> 1042 bytes .../vmm/epg/__pycache__/info.cpython-310.pyc | Bin 0 -> 2813 bytes .../vmm/epg/__pycache__/main.cpython-310.pyc | Bin 0 -> 606 bytes lib/aci/domain/vmm/epg/api.py | 49 + lib/aci/domain/vmm/epg/info.py | 117 + lib/aci/domain/vmm/epg/main.py | 8 + lib/aci/domain/vmm/event/__init__.py | 0 lib/aci/domain/vmm/event/api.py | 51 + lib/aci/domain/vmm/event/info.py | 107 + lib/aci/domain/vmm/event/main.py | 8 + lib/aci/domain/vmm/fault/__init__.py | 0 lib/aci/domain/vmm/fault/api.py | 112 + lib/aci/domain/vmm/fault/info.py | 144 + lib/aci/domain/vmm/fault/main.py | 8 + lib/aci/domain/vmm/info.py | 380 + lib/aci/domain/vmm/main.py | 29 + lib/aci/domain/vmm/node/__init__.py | 0 lib/aci/domain/vmm/node/api.py | 61 + lib/aci/domain/vmm/node/info.py | 81 + lib/aci/domain/vmm/node/main.py | 8 + lib/aci/domain/vmm/output.py | 624 + lib/aci/endpoint/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../endpoint/__pycache__/api.cpython-310.pyc | Bin 0 -> 1438 bytes .../endpoint/__pycache__/hv.cpython-310.pyc | Bin 0 -> 1103 bytes .../endpoint/__pycache__/info.cpython-310.pyc | Bin 0 -> 5501 bytes .../endpoint/__pycache__/ip.cpython-310.pyc | Bin 0 -> 1103 bytes .../endpoint/__pycache__/main.cpython-310.pyc | Bin 0 -> 886 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 2073 bytes .../endpoint/__pycache__/vm.cpython-310.pyc | Bin 0 -> 1277 bytes .../endpoint/__pycache__/vmm.cpython-310.pyc | Bin 0 -> 2352 bytes lib/aci/endpoint/api.py | 91 + lib/aci/endpoint/bot_output.py | 72 + lib/aci/endpoint/hv/__init__.py | 0 .../hv/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../hv/__pycache__/info.cpython-310.pyc | Bin 0 -> 726 bytes .../hv/__pycache__/main.cpython-310.pyc | Bin 0 -> 509 bytes lib/aci/endpoint/hv/info.py | 34 + lib/aci/endpoint/hv/main.py | 6 + lib/aci/endpoint/info.py | 348 + lib/aci/endpoint/ip/__init__.py | 0 .../ip/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../ip/__pycache__/info.cpython-310.pyc | Bin 0 -> 722 bytes .../ip/__pycache__/main.cpython-310.pyc | Bin 0 -> 509 bytes lib/aci/endpoint/ip/info.py | 38 + lib/aci/endpoint/ip/main.py | 6 + lib/aci/endpoint/main.py | 16 + lib/aci/endpoint/output.py | 128 + lib/aci/endpoint/vm/__init__.py | 0 .../vm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../vm/__pycache__/info.cpython-310.pyc | Bin 0 -> 726 bytes .../vm/__pycache__/main.cpython-310.pyc | Bin 0 -> 509 bytes lib/aci/endpoint/vm/info.py | 34 + lib/aci/endpoint/vm/main.py | 6 + lib/aci/endpoint/vmm/__init__.py | 0 .../vmm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../vmm/__pycache__/hv.cpython-310.pyc | Bin 0 -> 2023 bytes .../vmm/__pycache__/main.cpython-310.pyc | Bin 0 -> 704 bytes .../vmm/__pycache__/vm.cpython-310.pyc | Bin 0 -> 2042 bytes .../vmm/__pycache__/vnic.cpython-310.pyc | Bin 0 -> 2034 bytes lib/aci/endpoint/vmm/hv/__init__.py | 0 .../hv/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../vmm/hv/__pycache__/api.cpython-310.pyc | Bin 0 -> 1027 bytes .../vmm/hv/__pycache__/info.cpython-310.pyc | Bin 0 -> 2078 bytes .../vmm/hv/__pycache__/main.cpython-310.pyc | Bin 0 -> 613 bytes lib/aci/endpoint/vmm/hv/api.py | 48 + lib/aci/endpoint/vmm/hv/info.py | 92 + lib/aci/endpoint/vmm/hv/main.py | 8 + lib/aci/endpoint/vmm/main.py | 10 + lib/aci/endpoint/vmm/vm/__init__.py | 0 .../vm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../vmm/vm/__pycache__/api.cpython-310.pyc | Bin 0 -> 1027 bytes .../vmm/vm/__pycache__/info.cpython-310.pyc | Bin 0 -> 2097 bytes .../vmm/vm/__pycache__/main.cpython-310.pyc | Bin 0 -> 613 bytes lib/aci/endpoint/vmm/vm/api.py | 48 + lib/aci/endpoint/vmm/vm/info.py | 115 + lib/aci/endpoint/vmm/vm/main.py | 8 + lib/aci/endpoint/vmm/vnic/__init__.py | 0 .../vnic/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../vmm/vnic/__pycache__/api.cpython-310.pyc | Bin 0 -> 1043 bytes .../vmm/vnic/__pycache__/info.cpython-310.pyc | Bin 0 -> 2127 bytes .../vmm/vnic/__pycache__/main.cpython-310.pyc | Bin 0 -> 627 bytes lib/aci/endpoint/vmm/vnic/api.py | 48 + lib/aci/endpoint/vmm/vnic/info.py | 116 + lib/aci/endpoint/vmm/vnic/main.py | 8 + lib/aci/epg/__init__.py | 0 .../epg/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes lib/aci/epg/__pycache__/api.cpython-310.pyc | Bin 0 -> 1561 bytes lib/aci/epg/__pycache__/info.cpython-310.pyc | Bin 0 -> 14195 bytes lib/aci/epg/__pycache__/main.cpython-310.pyc | Bin 0 -> 1001 bytes .../epg/__pycache__/output.cpython-310.pyc | Bin 0 -> 12714 bytes lib/aci/epg/api.py | 95 + lib/aci/epg/audit/__init__.py | 0 lib/aci/epg/audit/api.py | 48 + lib/aci/epg/audit/info.py | 115 + lib/aci/epg/audit/main.py | 8 + lib/aci/epg/event/__init__.py | 0 lib/aci/epg/event/api.py | 51 + lib/aci/epg/event/info.py | 132 + lib/aci/epg/event/main.py | 8 + lib/aci/epg/fault/__init__.py | 0 lib/aci/epg/fault/api.py | 118 + lib/aci/epg/fault/info.py | 163 + lib/aci/epg/fault/main.py | 8 + lib/aci/epg/ifconn/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 151 bytes .../ifconn/__pycache__/api.cpython-310.pyc | Bin 0 -> 997 bytes .../ifconn/__pycache__/info.cpython-310.pyc | Bin 0 -> 8146 bytes .../ifconn/__pycache__/main.cpython-310.pyc | Bin 0 -> 582 bytes lib/aci/epg/ifconn/api.py | 48 + lib/aci/epg/ifconn/dn.md | 122 + lib/aci/epg/ifconn/info.py | 514 + lib/aci/epg/ifconn/main.py | 8 + lib/aci/epg/info.py | 973 + lib/aci/epg/locale/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 151 bytes .../locale/__pycache__/api.cpython-310.pyc | Bin 0 -> 997 bytes .../locale/__pycache__/info.cpython-310.pyc | Bin 0 -> 4500 bytes .../locale/__pycache__/main.cpython-310.pyc | Bin 0 -> 582 bytes lib/aci/epg/locale/api.py | 48 + lib/aci/epg/locale/info.py | 275 + lib/aci/epg/locale/main.py | 8 + lib/aci/epg/main.py | 29 + lib/aci/epg/node/__init__.py | 0 lib/aci/epg/node/api.py | 61 + lib/aci/epg/node/info.py | 82 + lib/aci/epg/node/main.py | 8 + lib/aci/epg/output.py | 1077 + lib/aci/intf/__init__.py | 0 .../intf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../__pycache__/cdp_adj_ep.cpython-310.pyc | Bin 0 -> 1657 bytes .../__pycache__/fault_counts.cpython-310.pyc | Bin 0 -> 1664 bytes .../__pycache__/interface.cpython-310.pyc | Bin 0 -> 3060 bytes lib/aci/intf/__pycache__/ipv4.cpython-310.pyc | Bin 0 -> 1291 bytes .../__pycache__/ipv4_address.cpython-310.pyc | Bin 0 -> 1314 bytes .../intf/__pycache__/ipv4_if.cpython-310.pyc | Bin 0 -> 1336 bytes .../__pycache__/ipv6_address.cpython-310.pyc | Bin 0 -> 1336 bytes .../intf/__pycache__/ipv6_if.cpython-310.pyc | Bin 0 -> 1336 bytes .../__pycache__/lacp_adj_ep.cpython-310.pyc | Bin 0 -> 2003 bytes .../__pycache__/lacp_if_stats.cpython-310.pyc | Bin 0 -> 1431 bytes .../__pycache__/lacp_instance.cpython-310.pyc | Bin 0 -> 1329 bytes .../__pycache__/lldp_adj_ep.cpython-310.pyc | Bin 0 -> 2999 bytes lib/aci/intf/__pycache__/main.cpython-310.pyc | Bin 0 -> 2074 bytes .../__pycache__/management.cpython-310.pyc | Bin 0 -> 4150 bytes .../management_state.cpython-310.pyc | Bin 0 -> 1756 bytes .../management_stats.cpython-310.pyc | Bin 0 -> 1719 bytes .../intf/__pycache__/output.cpython-310.pyc | Bin 0 -> 2062 bytes lib/aci/intf/__pycache__/pc.cpython-310.pyc | Bin 0 -> 7577 bytes lib/aci/intf/__pycache__/port.cpython-310.pyc | Bin 0 -> 8714 bytes .../__pycache__/port_channel.cpython-310.pyc | Bin 0 -> 7006 bytes .../port_channel_members.cpython-310.pyc | Bin 0 -> 2846 bytes .../port_channel_relations.cpython-310.pyc | Bin 0 -> 1164 bytes .../port_epg_stats.cpython-310.pyc | Bin 0 -> 1783 bytes .../__pycache__/port_fc_stats.cpython-310.pyc | Bin 0 -> 1835 bytes .../port_qos_stats.cpython-310.pyc | Bin 0 -> 2675 bytes .../__pycache__/port_stats.cpython-310.pyc | Bin 0 -> 2586 bytes .../port_vlan_stats.cpython-310.pyc | Bin 0 -> 2657 bytes .../intf/__pycache__/summary.cpython-310.pyc | Bin 0 -> 4275 bytes .../virtual_port_channel.cpython-310.pyc | Bin 0 -> 2770 bytes ...irtual_port_channel_member.cpython-310.pyc | Bin 0 -> 1757 bytes .../__pycache__/vlan_stats.cpython-310.pyc | Bin 0 -> 2883 bytes lib/aci/intf/adjacency/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 738 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 566 bytes lib/aci/intf/adjacency/cdp/__init__.py | 0 .../cdp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../cdp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1450 bytes .../cdp/__pycache__/info.cpython-310.pyc | Bin 0 -> 1554 bytes .../cdp/__pycache__/main.cpython-310.pyc | Bin 0 -> 654 bytes lib/aci/intf/adjacency/cdp/api.py | 66 + lib/aci/intf/adjacency/cdp/info.py | 68 + lib/aci/intf/adjacency/cdp/main.py | 8 + lib/aci/intf/adjacency/lacp/__init__.py | 0 .../lacp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../lacp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1461 bytes .../lacp/__pycache__/info.cpython-310.pyc | Bin 0 -> 1875 bytes .../lacp/__pycache__/main.cpython-310.pyc | Bin 0 -> 661 bytes lib/aci/intf/adjacency/lacp/api.py | 66 + lib/aci/intf/adjacency/lacp/info.py | 80 + lib/aci/intf/adjacency/lacp/main.py | 8 + lib/aci/intf/adjacency/lldp/__init__.py | 0 .../lldp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../lldp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1508 bytes .../lldp/__pycache__/info.cpython-310.pyc | Bin 0 -> 2719 bytes .../lldp/__pycache__/main.cpython-310.pyc | Bin 0 -> 661 bytes .../lldp/__pycache__/output.cpython-310.pyc | Bin 0 -> 2124 bytes lib/aci/intf/adjacency/lldp/api.py | 72 + lib/aci/intf/adjacency/lldp/info.py | 134 + lib/aci/intf/adjacency/lldp/main.py | 8 + lib/aci/intf/adjacency/lldp/output.py | 117 + lib/aci/intf/adjacency/main.py | 10 + lib/aci/intf/adjacency/output.py | 6 + lib/aci/intf/cloudsec/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 154 bytes .../cloudsec/__pycache__/api.cpython-310.pyc | Bin 0 -> 1492 bytes .../cloudsec/__pycache__/info.cpython-310.pyc | Bin 0 -> 4223 bytes .../cloudsec/__pycache__/main.cpython-310.pyc | Bin 0 -> 929 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3237 bytes .../__pycache__/summary.cpython-310.pyc | Bin 0 -> 1106 bytes lib/aci/intf/cloudsec/api.py | 67 + lib/aci/intf/cloudsec/audit/__init__.py | 0 lib/aci/intf/cloudsec/audit/api.py | 54 + lib/aci/intf/cloudsec/audit/info.py | 104 + lib/aci/intf/cloudsec/audit/main.py | 8 + lib/aci/intf/cloudsec/event/__init__.py | 0 lib/aci/intf/cloudsec/event/api.py | 54 + lib/aci/intf/cloudsec/event/info.py | 114 + lib/aci/intf/cloudsec/event/main.py | 8 + lib/aci/intf/cloudsec/fault/__init__.py | 0 lib/aci/intf/cloudsec/fault/api.py | 124 + lib/aci/intf/cloudsec/fault/info.py | 149 + lib/aci/intf/cloudsec/fault/main.py | 8 + lib/aci/intf/cloudsec/info.py | 202 + lib/aci/intf/cloudsec/main.py | 20 + lib/aci/intf/cloudsec/output.py | 263 + lib/aci/intf/encapsulated_routed/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 165 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1642 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 5493 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 1065 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3631 bytes .../__pycache__/summary.cpython-310.pyc | Bin 0 -> 1159 bytes lib/aci/intf/encapsulated_routed/api.py | 80 + .../encapsulated_routed/audit/__init__.py | 0 lib/aci/intf/encapsulated_routed/audit/api.py | 54 + .../intf/encapsulated_routed/audit/info.py | 104 + .../intf/encapsulated_routed/audit/main.py | 8 + .../encapsulated_routed/event/__init__.py | 0 lib/aci/intf/encapsulated_routed/event/api.py | 54 + .../intf/encapsulated_routed/event/info.py | 114 + .../intf/encapsulated_routed/event/main.py | 8 + .../encapsulated_routed/fault/__init__.py | 0 lib/aci/intf/encapsulated_routed/fault/api.py | 124 + .../intf/encapsulated_routed/fault/info.py | 149 + .../intf/encapsulated_routed/fault/main.py | 8 + lib/aci/intf/encapsulated_routed/info.py | 291 + lib/aci/intf/encapsulated_routed/main.py | 20 + lib/aci/intf/encapsulated_routed/output.py | 281 + lib/aci/intf/fault_counts/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1382 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 1221 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 647 bytes lib/aci/intf/fault_counts/api.py | 63 + lib/aci/intf/fault_counts/info.py | 35 + lib/aci/intf/fault_counts/main.py | 8 + lib/aci/intf/fc/__init__.py | 0 .../fc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../intf/fc/__pycache__/api.cpython-310.pyc | Bin 0 -> 1502 bytes .../intf/fc/__pycache__/info.cpython-310.pyc | Bin 0 -> 4120 bytes .../intf/fc/__pycache__/main.cpython-310.pyc | Bin 0 -> 851 bytes .../fc/__pycache__/output.cpython-310.pyc | Bin 0 -> 3083 bytes .../fc/__pycache__/summary.cpython-310.pyc | Bin 0 -> 1064 bytes lib/aci/intf/fc/api.py | 72 + lib/aci/intf/fc/audit/__init__.py | 0 lib/aci/intf/fc/audit/api.py | 54 + lib/aci/intf/fc/audit/info.py | 104 + lib/aci/intf/fc/audit/main.py | 8 + lib/aci/intf/fc/event/__init__.py | 0 lib/aci/intf/fc/event/api.py | 54 + lib/aci/intf/fc/event/info.py | 114 + lib/aci/intf/fc/event/main.py | 8 + lib/aci/intf/fc/fault/__init__.py | 0 lib/aci/intf/fc/fault/api.py | 124 + lib/aci/intf/fc/fault/info.py | 149 + lib/aci/intf/fc/fault/main.py | 8 + lib/aci/intf/fc/info.py | 208 + lib/aci/intf/fc/main.py | 20 + lib/aci/intf/fc/output.py | 263 + lib/aci/intf/fcpc/__init__.py | 0 .../fcpc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../intf/fcpc/__pycache__/api.cpython-310.pyc | Bin 0 -> 1435 bytes .../fcpc/__pycache__/info.cpython-310.pyc | Bin 0 -> 4099 bytes .../fcpc/__pycache__/main.cpython-310.pyc | Bin 0 -> 877 bytes .../fcpc/__pycache__/output.cpython-310.pyc | Bin 0 -> 3135 bytes .../fcpc/__pycache__/summary.cpython-310.pyc | Bin 0 -> 1078 bytes lib/aci/intf/fcpc/api.py | 67 + lib/aci/intf/fcpc/audit/__init__.py | 0 lib/aci/intf/fcpc/audit/api.py | 54 + lib/aci/intf/fcpc/audit/info.py | 104 + lib/aci/intf/fcpc/audit/main.py | 8 + lib/aci/intf/fcpc/event/__init__.py | 0 lib/aci/intf/fcpc/event/api.py | 54 + lib/aci/intf/fcpc/event/info.py | 114 + lib/aci/intf/fcpc/event/main.py | 8 + lib/aci/intf/fcpc/fault/__init__.py | 0 lib/aci/intf/fcpc/fault/api.py | 124 + lib/aci/intf/fcpc/fault/info.py | 149 + lib/aci/intf/fcpc/fault/main.py | 8 + lib/aci/intf/fcpc/info.py | 202 + lib/aci/intf/fcpc/main.py | 20 + lib/aci/intf/fcpc/output.py | 263 + lib/aci/intf/ip/__init__.py | 0 .../ip/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../intf/ip/__pycache__/main.cpython-310.pyc | Bin 0 -> 767 bytes lib/aci/intf/ip/main.py | 12 + lib/aci/intf/ip/v4/__init__.py | 0 .../v4/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 151 bytes lib/aci/intf/ip/v4/address/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../address/__pycache__/api.cpython-310.pyc | Bin 0 -> 1218 bytes .../address/__pycache__/info.cpython-310.pyc | Bin 0 -> 2124 bytes .../address/__pycache__/main.cpython-310.pyc | Bin 0 -> 614 bytes lib/aci/intf/ip/v4/address/api.py | 54 + lib/aci/intf/ip/v4/address/info.py | 95 + lib/aci/intf/ip/v4/address/main.py | 8 + lib/aci/intf/ip/v4/intf/__init__.py | 0 .../intf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../v4/intf/__pycache__/api.cpython-310.pyc | Bin 0 -> 1221 bytes .../v4/intf/__pycache__/info.cpython-310.pyc | Bin 0 -> 1053 bytes .../v4/intf/__pycache__/main.cpython-310.pyc | Bin 0 -> 613 bytes lib/aci/intf/ip/v4/intf/api.py | 54 + lib/aci/intf/ip/v4/intf/info.py | 38 + lib/aci/intf/ip/v4/intf/main.py | 8 + lib/aci/intf/ip/v6/__init__.py | 0 .../v6/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 151 bytes lib/aci/intf/ip/v6/address/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../address/__pycache__/api.cpython-310.pyc | Bin 0 -> 1198 bytes .../address/__pycache__/info.cpython-310.pyc | Bin 0 -> 1051 bytes .../address/__pycache__/main.cpython-310.pyc | Bin 0 -> 614 bytes lib/aci/intf/ip/v6/address/api.py | 54 + lib/aci/intf/ip/v6/address/info.py | 38 + lib/aci/intf/ip/v6/address/main.py | 8 + lib/aci/intf/ip/v6/intf/__init__.py | 0 .../intf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../v6/intf/__pycache__/api.cpython-310.pyc | Bin 0 -> 1201 bytes .../v6/intf/__pycache__/info.cpython-310.pyc | Bin 0 -> 1053 bytes .../v6/intf/__pycache__/main.cpython-310.pyc | Bin 0 -> 613 bytes lib/aci/intf/ip/v6/intf/api.py | 54 + lib/aci/intf/ip/v6/intf/info.py | 38 + lib/aci/intf/ip/v6/intf/main.py | 8 + lib/aci/intf/lacp/__init__.py | 0 .../lacp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../lacp/__pycache__/adj_ep.cpython-310.pyc | Bin 0 -> 1961 bytes .../intf/lacp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1360 bytes .../lacp/__pycache__/info.cpython-310.pyc | Bin 0 -> 2718 bytes .../lacp/__pycache__/instance.cpython-310.pyc | Bin 0 -> 1755 bytes .../__pycache__/interface.cpython-310.pyc | Bin 0 -> 2581 bytes .../__pycache__/lacp_adj_ep.cpython-310.pyc | Bin 0 -> 1618 bytes .../__pycache__/lacp_instance.cpython-310.pyc | Bin 0 -> 1738 bytes .../__pycache__/lacp_stats.cpython-310.pyc | Bin 0 -> 1513 bytes .../lacp/__pycache__/main.cpython-310.pyc | Bin 0 -> 685 bytes .../lacp/__pycache__/output.cpython-310.pyc | Bin 0 -> 870 bytes .../lacp/__pycache__/stats.cpython-310.pyc | Bin 0 -> 1530 bytes lib/aci/intf/lacp/api.py | 60 + lib/aci/intf/lacp/info.py | 119 + lib/aci/intf/lacp/instance/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../instance/__pycache__/api.cpython-310.pyc | Bin 0 -> 1269 bytes .../instance/__pycache__/info.cpython-310.pyc | Bin 0 -> 1096 bytes .../instance/__pycache__/main.cpython-310.pyc | Bin 0 -> 654 bytes lib/aci/intf/lacp/instance/api.py | 58 + lib/aci/intf/lacp/instance/info.py | 33 + lib/aci/intf/lacp/instance/main.py | 8 + lib/aci/intf/lacp/main.py | 10 + lib/aci/intf/lacp/output.py | 28 + lib/aci/intf/lacp/stats/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../stats/__pycache__/api.cpython-310.pyc | Bin 0 -> 1354 bytes .../stats/__pycache__/info.cpython-310.pyc | Bin 0 -> 1797 bytes .../stats/__pycache__/main.cpython-310.pyc | Bin 0 -> 633 bytes lib/aci/intf/lacp/stats/api.py | 57 + lib/aci/intf/lacp/stats/info.py | 72 + lib/aci/intf/lacp/stats/main.py | 8 + lib/aci/intf/loopback/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 154 bytes .../loopback/__pycache__/api.cpython-310.pyc | Bin 0 -> 1517 bytes .../loopback/__pycache__/info.cpython-310.pyc | Bin 0 -> 5293 bytes .../loopback/__pycache__/main.cpython-310.pyc | Bin 0 -> 929 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3410 bytes .../__pycache__/summary.cpython-310.pyc | Bin 0 -> 1104 bytes lib/aci/intf/loopback/api.py | 73 + lib/aci/intf/loopback/audit/__init__.py | 0 lib/aci/intf/loopback/audit/api.py | 54 + lib/aci/intf/loopback/audit/info.py | 104 + lib/aci/intf/loopback/audit/main.py | 8 + lib/aci/intf/loopback/event/__init__.py | 0 lib/aci/intf/loopback/event/api.py | 54 + lib/aci/intf/loopback/event/info.py | 114 + lib/aci/intf/loopback/event/main.py | 8 + lib/aci/intf/loopback/fault/__init__.py | 0 lib/aci/intf/loopback/fault/api.py | 124 + lib/aci/intf/loopback/fault/info.py | 149 + lib/aci/intf/loopback/fault/main.py | 8 + lib/aci/intf/loopback/info.py | 288 + lib/aci/intf/loopback/main.py | 20 + lib/aci/intf/loopback/output.py | 275 + lib/aci/intf/macsec/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../macsec/__pycache__/api.cpython-310.pyc | Bin 0 -> 1433 bytes .../__pycache__/ca_stats.cpython-310.pyc | Bin 0 -> 1618 bytes .../macsec/__pycache__/info.cpython-310.pyc | Bin 0 -> 5313 bytes .../macsec/__pycache__/main.cpython-310.pyc | Bin 0 -> 1279 bytes .../macsec/__pycache__/output.cpython-310.pyc | Bin 0 -> 5539 bytes .../macsec/__pycache__/rx.cpython-310.pyc | Bin 0 -> 1554 bytes .../macsec/__pycache__/stats.cpython-310.pyc | Bin 0 -> 1850 bytes .../__pycache__/summary.cpython-310.pyc | Bin 0 -> 1092 bytes .../macsec/__pycache__/tx.cpython-310.pyc | Bin 0 -> 1447 bytes lib/aci/intf/macsec/api.py | 67 + lib/aci/intf/macsec/audit/__init__.py | 0 lib/aci/intf/macsec/audit/api.py | 54 + lib/aci/intf/macsec/audit/info.py | 104 + lib/aci/intf/macsec/audit/main.py | 8 + lib/aci/intf/macsec/castats/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../castats/__pycache__/api.cpython-310.pyc | Bin 0 -> 1434 bytes .../castats/__pycache__/info.cpython-310.pyc | Bin 0 -> 1203 bytes .../castats/__pycache__/main.cpython-310.pyc | Bin 0 -> 661 bytes lib/aci/intf/macsec/castats/api.py | 62 + lib/aci/intf/macsec/castats/info.py | 36 + lib/aci/intf/macsec/castats/main.py | 8 + lib/aci/intf/macsec/event/__init__.py | 0 lib/aci/intf/macsec/event/api.py | 54 + lib/aci/intf/macsec/event/info.py | 114 + lib/aci/intf/macsec/event/main.py | 8 + lib/aci/intf/macsec/fault/__init__.py | 0 lib/aci/intf/macsec/fault/api.py | 124 + lib/aci/intf/macsec/fault/info.py | 149 + lib/aci/intf/macsec/fault/main.py | 8 + lib/aci/intf/macsec/info.py | 307 + lib/aci/intf/macsec/main.py | 32 + lib/aci/intf/macsec/output.py | 422 + lib/aci/intf/macsec/rx/__init__.py | 0 .../rx/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../macsec/rx/__pycache__/api.cpython-310.pyc | Bin 0 -> 1364 bytes .../rx/__pycache__/info.cpython-310.pyc | Bin 0 -> 1181 bytes .../rx/__pycache__/main.cpython-310.pyc | Bin 0 -> 626 bytes lib/aci/intf/macsec/rx/api.py | 63 + lib/aci/intf/macsec/rx/info.py | 36 + lib/aci/intf/macsec/rx/main.py | 8 + lib/aci/intf/macsec/stats/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../stats/__pycache__/api.cpython-310.pyc | Bin 0 -> 1446 bytes .../stats/__pycache__/info.cpython-310.pyc | Bin 0 -> 1426 bytes .../stats/__pycache__/main.cpython-310.pyc | Bin 0 -> 647 bytes lib/aci/intf/macsec/stats/api.py | 67 + lib/aci/intf/macsec/stats/info.py | 47 + lib/aci/intf/macsec/stats/main.py | 8 + lib/aci/intf/macsec/tx/__init__.py | 0 .../tx/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../macsec/tx/__pycache__/api.cpython-310.pyc | Bin 0 -> 1364 bytes .../tx/__pycache__/info.cpython-310.pyc | Bin 0 -> 1074 bytes .../tx/__pycache__/main.cpython-310.pyc | Bin 0 -> 626 bytes lib/aci/intf/macsec/tx/api.py | 63 + lib/aci/intf/macsec/tx/info.py | 28 + lib/aci/intf/macsec/tx/main.py | 8 + lib/aci/intf/main.py | 62 + lib/aci/intf/management/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1443 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 4613 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 1229 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 4603 bytes .../__pycache__/state.cpython-310.pyc | Bin 0 -> 1773 bytes .../__pycache__/stats.cpython-310.pyc | Bin 0 -> 1736 bytes .../__pycache__/summary.cpython-310.pyc | Bin 0 -> 1119 bytes lib/aci/intf/management/api.py | 67 + lib/aci/intf/management/audit/__init__.py | 0 lib/aci/intf/management/audit/api.py | 54 + lib/aci/intf/management/audit/info.py | 104 + lib/aci/intf/management/audit/main.py | 8 + lib/aci/intf/management/event/__init__.py | 0 lib/aci/intf/management/event/api.py | 54 + lib/aci/intf/management/event/info.py | 114 + lib/aci/intf/management/event/main.py | 8 + lib/aci/intf/management/fault/__init__.py | 0 lib/aci/intf/management/fault/api.py | 124 + lib/aci/intf/management/fault/info.py | 149 + lib/aci/intf/management/fault/main.py | 8 + lib/aci/intf/management/info.py | 265 + lib/aci/intf/management/main.py | 29 + lib/aci/intf/management/output.py | 387 + lib/aci/intf/management/state/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 162 bytes .../state/__pycache__/api.cpython-310.pyc | Bin 0 -> 1377 bytes .../state/__pycache__/info.cpython-310.pyc | Bin 0 -> 1886 bytes .../state/__pycache__/main.cpython-310.pyc | Bin 0 -> 675 bytes lib/aci/intf/management/state/api.py | 60 + lib/aci/intf/management/state/info.py | 72 + lib/aci/intf/management/state/main.py | 8 + lib/aci/intf/management/stats/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 162 bytes .../stats/__pycache__/api.cpython-310.pyc | Bin 0 -> 1418 bytes .../stats/__pycache__/info.cpython-310.pyc | Bin 0 -> 1912 bytes .../stats/__pycache__/main.cpython-310.pyc | Bin 0 -> 675 bytes lib/aci/intf/management/stats/api.py | 60 + lib/aci/intf/management/stats/info.py | 73 + lib/aci/intf/management/stats/main.py | 8 + lib/aci/intf/output.py | 56 + lib/aci/intf/phy/__init__.py | 0 .../phy/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../intf/phy/__pycache__/api.cpython-310.pyc | Bin 0 -> 1412 bytes .../__pycache__/capability.cpython-310.pyc | Bin 0 -> 1270 bytes .../intf/phy/__pycache__/eee.cpython-310.pyc | Bin 0 -> 1222 bytes .../phy/__pycache__/epg_stats.cpython-310.pyc | Bin 0 -> 1929 bytes .../__pycache__/ether_stats.cpython-310.pyc | Bin 0 -> 2193 bytes .../phy/__pycache__/fc_stats.cpython-310.pyc | Bin 0 -> 2084 bytes .../intf/phy/__pycache__/info.cpython-310.pyc | Bin 0 -> 11053 bytes .../__pycache__/load_interval.cpython-310.pyc | Bin 0 -> 1292 bytes .../intf/phy/__pycache__/main.cpython-310.pyc | Bin 0 -> 1298 bytes .../phy/__pycache__/output.cpython-310.pyc | Bin 0 -> 18638 bytes .../intf/phy/__pycache__/pc.cpython-310.pyc | Bin 0 -> 1217 bytes .../phy/__pycache__/qos_stats.cpython-310.pyc | Bin 0 -> 5982 bytes .../phy/__pycache__/stats.cpython-310.pyc | Bin 0 -> 2773 bytes .../phy/__pycache__/summary.cpython-310.pyc | Bin 0 -> 1938 bytes lib/aci/intf/phy/api.py | 67 + lib/aci/intf/phy/audit/__init__.py | 0 lib/aci/intf/phy/audit/api.py | 54 + lib/aci/intf/phy/audit/info.py | 104 + lib/aci/intf/phy/audit/main.py | 8 + lib/aci/intf/phy/cap/__init__.py | 0 .../cap/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../phy/cap/__pycache__/api.cpython-310.pyc | Bin 0 -> 1332 bytes .../phy/cap/__pycache__/info.cpython-310.pyc | Bin 0 -> 1743 bytes .../phy/cap/__pycache__/main.cpython-310.pyc | Bin 0 -> 612 bytes lib/aci/intf/phy/cap/api.py | 60 + lib/aci/intf/phy/cap/info.py | 70 + lib/aci/intf/phy/cap/main.py | 8 + lib/aci/intf/phy/eee/__init__.py | 0 .../eee/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../phy/eee/__pycache__/api.cpython-310.pyc | Bin 0 -> 1314 bytes .../phy/eee/__pycache__/info.cpython-310.pyc | Bin 0 -> 1756 bytes .../phy/eee/__pycache__/main.cpython-310.pyc | Bin 0 -> 612 bytes lib/aci/intf/phy/eee/api.py | 60 + lib/aci/intf/phy/eee/info.py | 71 + lib/aci/intf/phy/eee/main.py | 8 + lib/aci/intf/phy/event/__init__.py | 0 lib/aci/intf/phy/event/api.py | 54 + lib/aci/intf/phy/event/info.py | 114 + lib/aci/intf/phy/event/main.py | 8 + lib/aci/intf/phy/fault/__init__.py | 0 lib/aci/intf/phy/fault/api.py | 124 + lib/aci/intf/phy/fault/info.py | 149 + lib/aci/intf/phy/fault/main.py | 8 + lib/aci/intf/phy/info.py | 732 + lib/aci/intf/phy/load/__init__.py | 0 .../load/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 154 bytes .../phy/load/__pycache__/api.cpython-310.pyc | Bin 0 -> 1324 bytes .../phy/load/__pycache__/info.cpython-310.pyc | Bin 0 -> 1780 bytes .../phy/load/__pycache__/main.cpython-310.pyc | Bin 0 -> 619 bytes lib/aci/intf/phy/load/api.py | 60 + lib/aci/intf/phy/load/info.py | 71 + lib/aci/intf/phy/load/main.py | 8 + lib/aci/intf/phy/main.py | 35 + lib/aci/intf/phy/output.py | 1633 + lib/aci/intf/phy/pc/__init__.py | 0 .../pc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../phy/pc/__pycache__/api.cpython-310.pyc | Bin 0 -> 1322 bytes .../phy/pc/__pycache__/info.cpython-310.pyc | Bin 0 -> 1738 bytes .../phy/pc/__pycache__/main.cpython-310.pyc | Bin 0 -> 605 bytes lib/aci/intf/phy/pc/api.py | 60 + lib/aci/intf/phy/pc/info.py | 88 + lib/aci/intf/phy/pc/main.py | 8 + lib/aci/intf/phy/stats/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../stats/__pycache__/main.cpython-310.pyc | Bin 0 -> 935 bytes lib/aci/intf/phy/stats/epg/__init__.py | 0 .../epg/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../stats/epg/__pycache__/api.cpython-310.pyc | Bin 0 -> 1890 bytes .../epg/__pycache__/info.cpython-310.pyc | Bin 0 -> 1442 bytes .../epg/__pycache__/main.cpython-310.pyc | Bin 0 -> 650 bytes lib/aci/intf/phy/stats/epg/api.py | 74 + lib/aci/intf/phy/stats/epg/info.py | 52 + lib/aci/intf/phy/stats/epg/main.py | 8 + lib/aci/intf/phy/stats/ether/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../ether/__pycache__/api.cpython-310.pyc | Bin 0 -> 1286 bytes .../ether/__pycache__/info.cpython-310.pyc | Bin 0 -> 2644 bytes .../ether/__pycache__/main.cpython-310.pyc | Bin 0 -> 664 bytes lib/aci/intf/phy/stats/ether/api.py | 54 + lib/aci/intf/phy/stats/ether/info.py | 113 + lib/aci/intf/phy/stats/ether/main.py | 8 + lib/aci/intf/phy/stats/fc/__init__.py | 0 .../fc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../stats/fc/__pycache__/api.cpython-310.pyc | Bin 0 -> 1259 bytes .../stats/fc/__pycache__/info.cpython-310.pyc | Bin 0 -> 2179 bytes .../stats/fc/__pycache__/main.cpython-310.pyc | Bin 0 -> 643 bytes lib/aci/intf/phy/stats/fc/api.py | 54 + lib/aci/intf/phy/stats/fc/info.py | 85 + lib/aci/intf/phy/stats/fc/main.py | 8 + lib/aci/intf/phy/stats/main.py | 20 + lib/aci/intf/phy/stats/qos/__init__.py | 0 .../qos/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../stats/qos/__pycache__/api.cpython-310.pyc | Bin 0 -> 1299 bytes .../qos/__pycache__/info.cpython-310.pyc | Bin 0 -> 3832 bytes .../qos/__pycache__/live.cpython-310.pyc | Bin 0 -> 1130 bytes .../qos/__pycache__/main.cpython-310.pyc | Bin 0 -> 749 bytes lib/aci/intf/phy/stats/qos/api.py | 55 + lib/aci/intf/phy/stats/qos/info.py | 215 + lib/aci/intf/phy/stats/qos/live.py | 41 + lib/aci/intf/phy/stats/qos/main.py | 10 + lib/aci/intf/phy/stats/rmon/__init__.py | 0 .../rmon/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../rmon/__pycache__/api.cpython-310.pyc | Bin 0 -> 1384 bytes .../rmon/__pycache__/info.cpython-310.pyc | Bin 0 -> 2264 bytes .../rmon/__pycache__/main.cpython-310.pyc | Bin 0 -> 657 bytes lib/aci/intf/phy/stats/rmon/api.py | 60 + lib/aci/intf/phy/stats/rmon/info.py | 81 + lib/aci/intf/phy/stats/rmon/main.py | 8 + lib/aci/intf/policy/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../policy/__pycache__/api.cpython-310.pyc | Bin 0 -> 1210 bytes .../policy/__pycache__/info.cpython-310.pyc | Bin 0 -> 952 bytes .../policy/__pycache__/main.cpython-310.pyc | Bin 0 -> 629 bytes lib/aci/intf/policy/group/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../group/__pycache__/api.cpython-310.pyc | Bin 0 -> 1263 bytes .../group/__pycache__/info.cpython-310.pyc | Bin 0 -> 1561 bytes .../group/__pycache__/main.cpython-310.pyc | Bin 0 -> 551 bytes lib/aci/intf/policy/group/info.py | 47 + lib/aci/intf/policy/group/main.py | 6 + lib/aci/intf/policy/main.py | 8 + lib/aci/intf/policy/profile/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../profile/__pycache__/api.cpython-310.pyc | Bin 0 -> 1711 bytes .../profile/__pycache__/info.cpython-310.pyc | Bin 0 -> 3777 bytes .../profile/__pycache__/main.cpython-310.pyc | Bin 0 -> 661 bytes lib/aci/intf/policy/profile/api.py | 87 + lib/aci/intf/policy/profile/info.py | 164 + lib/aci/intf/policy/profile/main.py | 8 + lib/aci/intf/port_channel/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1727 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 8394 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 1200 bytes .../__pycache__/members.cpython-310.pyc | Bin 0 -> 2846 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 9275 bytes .../__pycache__/relations.cpython-310.pyc | Bin 0 -> 1164 bytes .../__pycache__/summary.cpython-310.pyc | Bin 0 -> 1130 bytes lib/aci/intf/port_channel/api.py | 92 + lib/aci/intf/port_channel/audit/__init__.py | 0 lib/aci/intf/port_channel/audit/api.py | 54 + lib/aci/intf/port_channel/audit/info.py | 104 + lib/aci/intf/port_channel/audit/main.py | 8 + lib/aci/intf/port_channel/event/__init__.py | 0 lib/aci/intf/port_channel/event/api.py | 54 + lib/aci/intf/port_channel/event/info.py | 115 + lib/aci/intf/port_channel/event/main.py | 8 + lib/aci/intf/port_channel/fault/__init__.py | 0 lib/aci/intf/port_channel/fault/api.py | 124 + lib/aci/intf/port_channel/fault/info.py | 149 + lib/aci/intf/port_channel/fault/main.py | 8 + lib/aci/intf/port_channel/info.py | 502 + lib/aci/intf/port_channel/main.py | 26 + lib/aci/intf/port_channel/members/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 166 bytes .../members/__pycache__/main.cpython-310.pyc | Bin 0 -> 1828 bytes lib/aci/intf/port_channel/members/main.py | 63 + lib/aci/intf/port_channel/output.py | 761 + .../intf/port_channel/relations/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 168 bytes .../relations/__pycache__/api.cpython-310.pyc | Bin 0 -> 1534 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 1103 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 713 bytes lib/aci/intf/port_channel/relations/api.py | 59 + lib/aci/intf/port_channel/relations/info.py | 22 + lib/aci/intf/port_channel/relations/main.py | 8 + lib/aci/intf/summary/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../summary/__pycache__/main.cpython-310.pyc | Bin 0 -> 4280 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 1484 bytes lib/aci/intf/summary/main.py | 254 + lib/aci/intf/summary/output.py | 86 + lib/aci/intf/svi/__init__.py | 0 .../svi/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../intf/svi/__pycache__/api.cpython-310.pyc | Bin 0 -> 1589 bytes .../intf/svi/__pycache__/info.cpython-310.pyc | Bin 0 -> 7853 bytes .../intf/svi/__pycache__/main.cpython-310.pyc | Bin 0 -> 864 bytes .../svi/__pycache__/output.cpython-310.pyc | Bin 0 -> 4319 bytes .../svi/__pycache__/summary.cpython-310.pyc | Bin 0 -> 1071 bytes lib/aci/intf/svi/api.py | 70 + lib/aci/intf/svi/audit/__init__.py | 0 lib/aci/intf/svi/audit/api.py | 54 + lib/aci/intf/svi/audit/info.py | 104 + lib/aci/intf/svi/audit/main.py | 8 + lib/aci/intf/svi/event/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../svi/event/__pycache__/api.cpython-310.pyc | Bin 0 -> 1377 bytes .../event/__pycache__/info.cpython-310.pyc | Bin 0 -> 2476 bytes .../event/__pycache__/main.cpython-310.pyc | Bin 0 -> 626 bytes lib/aci/intf/svi/event/api.py | 54 + lib/aci/intf/svi/event/info.py | 114 + lib/aci/intf/svi/event/main.py | 8 + lib/aci/intf/svi/fault/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../svi/fault/__pycache__/api.cpython-310.pyc | Bin 0 -> 2381 bytes .../fault/__pycache__/info.cpython-310.pyc | Bin 0 -> 3159 bytes .../fault/__pycache__/main.cpython-310.pyc | Bin 0 -> 626 bytes lib/aci/intf/svi/fault/api.py | 124 + lib/aci/intf/svi/fault/info.py | 148 + lib/aci/intf/svi/fault/main.py | 8 + lib/aci/intf/svi/info.py | 484 + lib/aci/intf/svi/main.py | 20 + lib/aci/intf/svi/output.py | 364 + lib/aci/intf/tunnel/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../tunnel/__pycache__/api.cpython-310.pyc | Bin 0 -> 1433 bytes .../tunnel/__pycache__/info.cpython-310.pyc | Bin 0 -> 6554 bytes .../tunnel/__pycache__/main.cpython-310.pyc | Bin 0 -> 903 bytes .../tunnel/__pycache__/output.cpython-310.pyc | Bin 0 -> 3525 bytes .../__pycache__/summary.cpython-310.pyc | Bin 0 -> 1092 bytes lib/aci/intf/tunnel/api.py | 67 + lib/aci/intf/tunnel/audit/__init__.py | 0 lib/aci/intf/tunnel/audit/api.py | 54 + lib/aci/intf/tunnel/audit/info.py | 104 + lib/aci/intf/tunnel/audit/main.py | 8 + lib/aci/intf/tunnel/event/__init__.py | 0 lib/aci/intf/tunnel/event/api.py | 54 + lib/aci/intf/tunnel/event/info.py | 114 + lib/aci/intf/tunnel/event/main.py | 8 + lib/aci/intf/tunnel/fault/__init__.py | 0 lib/aci/intf/tunnel/fault/api.py | 124 + lib/aci/intf/tunnel/fault/info.py | 149 + lib/aci/intf/tunnel/fault/main.py | 8 + lib/aci/intf/tunnel/info.py | 359 + lib/aci/intf/tunnel/main.py | 20 + lib/aci/intf/tunnel/output.py | 296 + lib/aci/intf/vfc/__init__.py | 0 .../vfc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../intf/vfc/__pycache__/api.cpython-310.pyc | Bin 0 -> 1409 bytes .../intf/vfc/__pycache__/info.cpython-310.pyc | Bin 0 -> 4063 bytes .../intf/vfc/__pycache__/main.cpython-310.pyc | Bin 0 -> 774 bytes .../vfc/__pycache__/output.cpython-310.pyc | Bin 0 -> 3109 bytes .../vfc/__pycache__/summary.cpython-310.pyc | Bin 0 -> 1071 bytes lib/aci/intf/vfc/api.py | 67 + lib/aci/intf/vfc/audit/__init__.py | 0 lib/aci/intf/vfc/audit/api.py | 54 + lib/aci/intf/vfc/audit/info.py | 104 + lib/aci/intf/vfc/audit/main.py | 8 + lib/aci/intf/vfc/event/__init__.py | 0 lib/aci/intf/vfc/event/api.py | 54 + lib/aci/intf/vfc/event/info.py | 114 + lib/aci/intf/vfc/event/main.py | 8 + lib/aci/intf/vfc/fault/__init__.py | 0 lib/aci/intf/vfc/fault/api.py | 124 + lib/aci/intf/vfc/fault/info.py | 149 + lib/aci/intf/vfc/fault/main.py | 8 + lib/aci/intf/vfc/info.py | 202 + lib/aci/intf/vfc/main.py | 17 + lib/aci/intf/vfc/output.py | 263 + lib/aci/intf/virtual_port_channel/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 166 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1594 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 5056 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 1195 bytes .../__pycache__/member.cpython-310.pyc | Bin 0 -> 2624 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 6517 bytes .../__pycache__/summary.cpython-310.pyc | Bin 0 -> 1192 bytes lib/aci/intf/virtual_port_channel/api.py | 70 + .../virtual_port_channel/audit/__init__.py | 0 .../intf/virtual_port_channel/audit/api.py | 54 + .../intf/virtual_port_channel/audit/info.py | 111 + .../intf/virtual_port_channel/audit/main.py | 8 + .../virtual_port_channel/event/__init__.py | 0 .../intf/virtual_port_channel/event/api.py | 54 + .../intf/virtual_port_channel/event/info.py | 121 + .../intf/virtual_port_channel/event/main.py | 8 + .../virtual_port_channel/fault/__init__.py | 0 .../intf/virtual_port_channel/fault/api.py | 124 + .../intf/virtual_port_channel/fault/info.py | 158 + .../intf/virtual_port_channel/fault/main.py | 8 + lib/aci/intf/virtual_port_channel/info.py | 261 + lib/aci/intf/virtual_port_channel/main.py | 23 + .../virtual_port_channel/member/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../member/__pycache__/api.cpython-310.pyc | Bin 0 -> 1458 bytes .../member/__pycache__/info.cpython-310.pyc | Bin 0 -> 2418 bytes .../member/__pycache__/main.cpython-310.pyc | Bin 0 -> 620 bytes .../intf/virtual_port_channel/member/info.py | 107 + .../intf/virtual_port_channel/member/main.py | 6 + lib/aci/intf/virtual_port_channel/output.py | 520 + lib/aci/intf/vlan/__init__.py | 0 .../vlan/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../intf/vlan/__pycache__/api.cpython-310.pyc | Bin 0 -> 1206 bytes .../vlan/__pycache__/info.cpython-310.pyc | Bin 0 -> 3066 bytes .../vlan/__pycache__/main.cpython-310.pyc | Bin 0 -> 615 bytes .../vlan/__pycache__/output.cpython-310.pyc | Bin 0 -> 858 bytes lib/aci/intf/vlan/api.py | 51 + lib/aci/intf/vlan/info.py | 150 + lib/aci/intf/vlan/main.py | 8 + lib/aci/intf/vlan/output.py | 29 + lib/aci/l2out/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 146 bytes lib/aci/l2out/__pycache__/api.cpython-310.pyc | Bin 0 -> 1944 bytes .../l2out/__pycache__/info.cpython-310.pyc | Bin 0 -> 5086 bytes .../l2out/__pycache__/main.cpython-310.pyc | Bin 0 -> 875 bytes .../l2out/__pycache__/output.cpython-310.pyc | Bin 0 -> 3498 bytes lib/aci/l2out/api.py | 126 + lib/aci/l2out/audit/__init__.py | 0 lib/aci/l2out/audit/api.py | 48 + lib/aci/l2out/audit/info.py | 110 + lib/aci/l2out/audit/main.py | 8 + lib/aci/l2out/event/__init__.py | 0 lib/aci/l2out/event/api.py | 51 + lib/aci/l2out/event/info.py | 124 + lib/aci/l2out/event/main.py | 8 + lib/aci/l2out/fault/__init__.py | 0 lib/aci/l2out/fault/api.py | 118 + lib/aci/l2out/fault/info.py | 155 + lib/aci/l2out/fault/main.py | 8 + lib/aci/l2out/info.py | 300 + lib/aci/l2out/main.py | 23 + lib/aci/l2out/node/__init__.py | 0 lib/aci/l2out/node/api.py | 61 + lib/aci/l2out/node/info.py | 82 + lib/aci/l2out/node/main.py | 8 + lib/aci/l2out/output.py | 338 + lib/aci/l3out/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 146 bytes lib/aci/l3out/__pycache__/api.cpython-310.pyc | Bin 0 -> 1380 bytes lib/aci/l3out/__pycache__/bgp.cpython-310.pyc | Bin 0 -> 734 bytes .../l3out/__pycache__/domain.cpython-310.pyc | Bin 0 -> 694 bytes .../l3out/__pycache__/eigrp.cpython-310.pyc | Bin 0 -> 746 bytes lib/aci/l3out/__pycache__/epg.cpython-310.pyc | Bin 0 -> 906 bytes .../l3out/__pycache__/info.cpython-310.pyc | Bin 0 -> 5403 bytes .../l3out/__pycache__/main.cpython-310.pyc | Bin 0 -> 1472 bytes .../l3out/__pycache__/node.cpython-310.pyc | Bin 0 -> 2921 bytes .../l3out/__pycache__/ospf.cpython-310.pyc | Bin 0 -> 1209 bytes .../l3out/__pycache__/output.cpython-310.pyc | Bin 0 -> 6119 bytes lib/aci/l3out/__pycache__/pim.cpython-310.pyc | Bin 0 -> 734 bytes lib/aci/l3out/__pycache__/vrf.cpython-310.pyc | Bin 0 -> 913 bytes lib/aci/l3out/api.py | 76 + lib/aci/l3out/audit/__init__.py | 0 lib/aci/l3out/audit/api.py | 48 + lib/aci/l3out/audit/info.py | 113 + lib/aci/l3out/audit/main.py | 8 + lib/aci/l3out/bgp.py | 19 + lib/aci/l3out/domain.py | 12 + lib/aci/l3out/eigrp.py | 19 + lib/aci/l3out/epg.py | 38 + lib/aci/l3out/event/__init__.py | 0 lib/aci/l3out/event/api.py | 51 + lib/aci/l3out/event/info.py | 130 + lib/aci/l3out/event/main.py | 8 + lib/aci/l3out/fault/__init__.py | 0 lib/aci/l3out/fault/api.py | 118 + lib/aci/l3out/fault/info.py | 161 + lib/aci/l3out/fault/main.py | 8 + lib/aci/l3out/info.py | 370 + lib/aci/l3out/logical_node_profile/api.py | 88 + lib/aci/l3out/logical_node_profile/info.py | 226 + lib/aci/l3out/logical_node_profile/main.py | 8 + lib/aci/l3out/main.py | 47 + lib/aci/l3out/node/__init__.py | 0 lib/aci/l3out/node/api.py | 61 + lib/aci/l3out/node/info.py | 82 + lib/aci/l3out/node/main.py | 8 + lib/aci/l3out/ospf.py | 56 + lib/aci/l3out/output.py | 617 + lib/aci/l3out/pim.py | 19 + lib/aci/l3out/vrf.py | 27 + lib/aci/node/__init__.py | 0 .../node/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes lib/aci/node/__pycache__/api.cpython-310.pyc | Bin 0 -> 960 bytes lib/aci/node/__pycache__/info.cpython-310.pyc | Bin 0 -> 4910 bytes lib/aci/node/__pycache__/main.cpython-310.pyc | Bin 0 -> 1042 bytes .../node/__pycache__/output.cpython-310.pyc | Bin 0 -> 4402 bytes lib/aci/node/api.py | 47 + lib/aci/node/bot_output.py | 68 + lib/aci/node/info.py | 306 + lib/aci/node/main.py | 29 + lib/aci/node/output.py | 396 + lib/aci/node/policy/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes lib/aci/node/policy/profile/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../profile/__pycache__/api.cpython-310.pyc | Bin 0 -> 1472 bytes .../profile/__pycache__/info.cpython-310.pyc | Bin 0 -> 1326 bytes .../profile/__pycache__/main.cpython-310.pyc | Bin 0 -> 677 bytes lib/aci/node/policy/profile/api.py | 62 + lib/aci/node/policy/profile/info.py | 56 + lib/aci/node/policy/profile/main.py | 8 + lib/aci/node/power/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../power/__pycache__/api.cpython-310.pyc | Bin 0 -> 1111 bytes .../power/__pycache__/info.cpython-310.pyc | Bin 0 -> 2835 bytes .../power/__pycache__/main.cpython-310.pyc | Bin 0 -> 582 bytes lib/aci/node/power/api.py | 54 + lib/aci/node/power/info.py | 150 + lib/aci/node/power/main.py | 8 + lib/aci/node/psu/__init__.py | 0 .../psu/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../node/psu/__pycache__/api.cpython-310.pyc | Bin 0 -> 971 bytes .../node/psu/__pycache__/info.cpython-310.pyc | Bin 0 -> 2927 bytes .../node/psu/__pycache__/main.cpython-310.pyc | Bin 0 -> 568 bytes lib/aci/node/psu/api.py | 46 + lib/aci/node/psu/info.py | 167 + lib/aci/node/psu/main.py | 8 + lib/aci/node/sensor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../sensor/__pycache__/api.cpython-310.pyc | Bin 0 -> 995 bytes .../sensor/__pycache__/info.cpython-310.pyc | Bin 0 -> 2621 bytes .../sensor/__pycache__/main.cpython-310.pyc | Bin 0 -> 589 bytes lib/aci/node/sensor/api.py | 46 + lib/aci/node/sensor/info.py | 140 + lib/aci/node/sensor/main.py | 8 + lib/aci/node/system/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../system/__pycache__/api.cpython-310.pyc | Bin 0 -> 994 bytes .../system/__pycache__/info.cpython-310.pyc | Bin 0 -> 2631 bytes .../system/__pycache__/main.cpython-310.pyc | Bin 0 -> 589 bytes lib/aci/node/system/api.py | 46 + lib/aci/node/system/info.py | 114 + lib/aci/node/system/main.py | 8 + lib/aci/node/temp/__init__.py | 0 .../temp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../node/temp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1098 bytes .../temp/__pycache__/info.cpython-310.pyc | Bin 0 -> 2468 bytes .../temp/__pycache__/main.cpython-310.pyc | Bin 0 -> 575 bytes lib/aci/node/temp/api.py | 54 + lib/aci/node/temp/info.py | 134 + lib/aci/node/temp/main.py | 8 + lib/aci/output.py | 165 + lib/aci/path/__init__.py | 0 .../path/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes lib/aci/path/__pycache__/api.cpython-310.pyc | Bin 0 -> 955 bytes lib/aci/path/__pycache__/info.cpython-310.pyc | Bin 0 -> 3213 bytes lib/aci/path/__pycache__/main.cpython-310.pyc | Bin 0 -> 568 bytes lib/aci/path/api.py | 44 + lib/aci/path/info.py | 191 + lib/aci/path/main.py | 8 + lib/aci/pg/__init__.py | 0 .../pg/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 143 bytes lib/aci/pg/__pycache__/main.cpython-310.pyc | Bin 0 -> 592 bytes lib/aci/pg/__pycache__/output.cpython-310.pyc | Bin 0 -> 525 bytes lib/aci/pg/access/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../__pycache__/breakout.cpython-310.pyc | Bin 0 -> 543 bytes .../access/__pycache__/leaf.cpython-310.pyc | Bin 0 -> 2750 bytes .../access/__pycache__/main.cpython-310.pyc | Bin 0 -> 632 bytes .../access/__pycache__/output.cpython-310.pyc | Bin 0 -> 558 bytes .../access/__pycache__/spine.cpython-310.pyc | Bin 0 -> 534 bytes lib/aci/pg/access/intf/__init__.py | 0 .../intf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../intf/__pycache__/main.cpython-310.pyc | Bin 0 -> 1336 bytes .../intf/__pycache__/output.cpython-310.pyc | Bin 0 -> 832 bytes lib/aci/pg/access/intf/breakout/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 164 bytes .../breakout/__pycache__/api.cpython-310.pyc | Bin 0 -> 1239 bytes .../breakout/__pycache__/info.cpython-310.pyc | Bin 0 -> 3131 bytes .../breakout/__pycache__/main.cpython-310.pyc | Bin 0 -> 721 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 934 bytes lib/aci/pg/access/intf/breakout/api.py | 51 + lib/aci/pg/access/intf/breakout/info.py | 110 + lib/aci/pg/access/intf/breakout/main.py | 8 + lib/aci/pg/access/intf/breakout/output.py | 23 + lib/aci/pg/access/intf/fc/__init__.py | 0 .../fc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../intf/fc/__pycache__/main.cpython-310.pyc | Bin 0 -> 464 bytes lib/aci/pg/access/intf/fc/main.py | 3 + lib/aci/pg/access/intf/fcpc/__init__.py | 0 .../fcpc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../fcpc/__pycache__/main.cpython-310.pyc | Bin 0 -> 470 bytes lib/aci/pg/access/intf/fcpc/main.py | 3 + lib/aci/pg/access/intf/main.py | 29 + lib/aci/pg/access/intf/output.py | 14 + lib/aci/pg/access/intf/override/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 164 bytes .../override/__pycache__/main.cpython-310.pyc | Bin 0 -> 482 bytes lib/aci/pg/access/intf/override/main.py | 3 + lib/aci/pg/access/intf/pc/__init__.py | 0 .../pc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../intf/pc/__pycache__/main.cpython-310.pyc | Bin 0 -> 464 bytes lib/aci/pg/access/intf/pc/main.py | 3 + lib/aci/pg/access/intf/port/__init__.py | 0 .../port/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 162 bytes .../intf/port/__pycache__/api.cpython-310.pyc | Bin 0 -> 1779 bytes .../port/__pycache__/info.cpython-310.pyc | Bin 0 -> 5120 bytes .../port/__pycache__/main.cpython-310.pyc | Bin 0 -> 1173 bytes .../port/__pycache__/output.cpython-310.pyc | Bin 0 -> 6187 bytes lib/aci/pg/access/intf/port/api.py | 86 + lib/aci/pg/access/intf/port/audit/__init__.py | 0 lib/aci/pg/access/intf/port/audit/api.py | 48 + lib/aci/pg/access/intf/port/audit/info.py | 98 + lib/aci/pg/access/intf/port/audit/main.py | 8 + lib/aci/pg/access/intf/port/event/__init__.py | 0 lib/aci/pg/access/intf/port/event/api.py | 51 + lib/aci/pg/access/intf/port/event/info.py | 107 + lib/aci/pg/access/intf/port/event/main.py | 8 + lib/aci/pg/access/intf/port/fault/__init__.py | 0 lib/aci/pg/access/intf/port/fault/api.py | 112 + lib/aci/pg/access/intf/port/fault/info.py | 138 + lib/aci/pg/access/intf/port/fault/main.py | 8 + lib/aci/pg/access/intf/port/info.py | 248 + lib/aci/pg/access/intf/port/main.py | 23 + lib/aci/pg/access/intf/port/node/__init__.py | 0 lib/aci/pg/access/intf/port/node/api.py | 61 + lib/aci/pg/access/intf/port/node/info.py | 80 + lib/aci/pg/access/intf/port/node/main.py | 8 + lib/aci/pg/access/intf/port/output.py | 460 + lib/aci/pg/access/intf/spine/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../spine/__pycache__/main.cpython-310.pyc | Bin 0 -> 473 bytes lib/aci/pg/access/intf/spine/main.py | 3 + lib/aci/pg/access/intf/vpc/__init__.py | 0 .../vpc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../intf/vpc/__pycache__/api.cpython-310.pyc | Bin 0 -> 1974 bytes .../intf/vpc/__pycache__/info.cpython-310.pyc | Bin 0 -> 5097 bytes .../intf/vpc/__pycache__/main.cpython-310.pyc | Bin 0 -> 1391 bytes .../intf/vpc/__pycache__/node.cpython-310.pyc | Bin 0 -> 2766 bytes .../vpc/__pycache__/output.cpython-310.pyc | Bin 0 -> 6271 bytes .../vpc/__pycache__/policy.cpython-310.pyc | Bin 0 -> 4218 bytes .../intf/vpc/__pycache__/port.cpython-310.pyc | Bin 0 -> 3251 bytes lib/aci/pg/access/intf/vpc/api.py | 91 + lib/aci/pg/access/intf/vpc/audit/__init__.py | 0 lib/aci/pg/access/intf/vpc/audit/api.py | 48 + lib/aci/pg/access/intf/vpc/audit/info.py | 98 + lib/aci/pg/access/intf/vpc/audit/main.py | 8 + lib/aci/pg/access/intf/vpc/event/__init__.py | 0 lib/aci/pg/access/intf/vpc/event/api.py | 51 + lib/aci/pg/access/intf/vpc/event/info.py | 107 + lib/aci/pg/access/intf/vpc/event/main.py | 8 + lib/aci/pg/access/intf/vpc/fault/__init__.py | 0 lib/aci/pg/access/intf/vpc/fault/api.py | 112 + lib/aci/pg/access/intf/vpc/fault/info.py | 139 + lib/aci/pg/access/intf/vpc/fault/main.py | 8 + lib/aci/pg/access/intf/vpc/info.py | 309 + lib/aci/pg/access/intf/vpc/main.py | 29 + lib/aci/pg/access/intf/vpc/node/__init__.py | 0 .../node/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../vpc/node/__pycache__/api.cpython-310.pyc | Bin 0 -> 1584 bytes .../vpc/node/__pycache__/info.cpython-310.pyc | Bin 0 -> 2244 bytes .../vpc/node/__pycache__/main.cpython-310.pyc | Bin 0 -> 717 bytes lib/aci/pg/access/intf/vpc/node/api.py | 61 + lib/aci/pg/access/intf/vpc/node/info.py | 80 + lib/aci/pg/access/intf/vpc/node/main.py | 8 + lib/aci/pg/access/intf/vpc/nodes/__init__.py | 0 lib/aci/pg/access/intf/vpc/nodes/api.py | 62 + lib/aci/pg/access/intf/vpc/nodes/info.py | 143 + lib/aci/pg/access/intf/vpc/nodes/main.py | 8 + lib/aci/pg/access/intf/vpc/output.py | 522 + lib/aci/pg/access/intf/vpc/ports/__init__.py | 0 lib/aci/pg/access/intf/vpc/ports/api.py | 66 + lib/aci/pg/access/intf/vpc/ports/info.py | 65 + lib/aci/pg/access/intf/vpc/ports/main.py | 8 + lib/aci/pg/access/main.py | 8 + lib/aci/pg/access/output.py | 6 + lib/aci/pg/access/switch/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../switch/__pycache__/main.cpython-310.pyc | Bin 0 -> 670 bytes lib/aci/pg/access/switch/leaf/__init__.py | 0 .../leaf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 162 bytes .../leaf/__pycache__/main.cpython-310.pyc | Bin 0 -> 466 bytes lib/aci/pg/access/switch/leaf/main.py | 3 + lib/aci/pg/access/switch/main.py | 8 + lib/aci/pg/access/switch/spine/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 163 bytes .../spine/__pycache__/main.cpython-310.pyc | Bin 0 -> 469 bytes lib/aci/pg/access/switch/spine/main.py | 3 + lib/aci/pg/fabric/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../fabric/__pycache__/leaf.cpython-310.pyc | Bin 0 -> 531 bytes .../fabric/__pycache__/main.cpython-310.pyc | Bin 0 -> 728 bytes .../fabric/__pycache__/spine.cpython-310.pyc | Bin 0 -> 534 bytes lib/aci/pg/fabric/intf/__init__.py | 0 .../intf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../intf/__pycache__/main.cpython-310.pyc | Bin 0 -> 676 bytes lib/aci/pg/fabric/intf/leaf/__init__.py | 0 .../leaf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../leaf/__pycache__/main.cpython-310.pyc | Bin 0 -> 470 bytes lib/aci/pg/fabric/intf/leaf/main.py | 3 + lib/aci/pg/fabric/intf/main.py | 8 + lib/aci/pg/fabric/intf/spine/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../spine/__pycache__/main.cpython-310.pyc | Bin 0 -> 473 bytes lib/aci/pg/fabric/intf/spine/main.py | 3 + lib/aci/pg/fabric/main.py | 10 + lib/aci/pg/fabric/module/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../module/__pycache__/main.cpython-310.pyc | Bin 0 -> 670 bytes lib/aci/pg/fabric/module/leaf/__init__.py | 0 .../leaf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 162 bytes .../leaf/__pycache__/main.cpython-310.pyc | Bin 0 -> 466 bytes lib/aci/pg/fabric/module/leaf/main.py | 3 + lib/aci/pg/fabric/module/main.py | 8 + lib/aci/pg/fabric/module/spine/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 163 bytes .../spine/__pycache__/main.cpython-310.pyc | Bin 0 -> 469 bytes lib/aci/pg/fabric/module/spine/main.py | 3 + lib/aci/pg/fabric/switch/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../switch/__pycache__/main.cpython-310.pyc | Bin 0 -> 670 bytes lib/aci/pg/fabric/switch/leaf/__init__.py | 0 .../leaf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 162 bytes .../leaf/__pycache__/main.cpython-310.pyc | Bin 0 -> 466 bytes lib/aci/pg/fabric/switch/leaf/main.py | 3 + lib/aci/pg/fabric/switch/main.py | 8 + lib/aci/pg/fabric/switch/spine/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 163 bytes .../spine/__pycache__/main.cpython-310.pyc | Bin 0 -> 469 bytes lib/aci/pg/fabric/switch/spine/main.py | 3 + lib/aci/pg/main.py | 11 + lib/aci/pg/output.py | 6 + lib/aci/policy/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../policy/__pycache__/cdp.cpython-310.pyc | Bin 0 -> 828 bytes .../host_interface.cpython-310.pyc | Bin 0 -> 897 bytes .../__pycache__/igmp_snoop.cpython-310.pyc | Bin 0 -> 2090 bytes .../__pycache__/link_flap.cpython-310.pyc | Bin 0 -> 875 bytes .../policy/__pycache__/lldp.cpython-310.pyc | Bin 0 -> 836 bytes .../policy/__pycache__/main.cpython-310.pyc | Bin 0 -> 1969 bytes .../policy/__pycache__/mcp.cpython-310.pyc | Bin 0 -> 828 bytes .../__pycache__/mld_snoop.cpython-310.pyc | Bin 0 -> 2098 bytes .../__pycache__/monitoring.cpython-310.pyc | Bin 0 -> 875 bytes .../policy/__pycache__/output.cpython-310.pyc | Bin 0 -> 704 bytes lib/aci/policy/__pycache__/sn.cpython-310.pyc | Bin 0 -> 2082 bytes .../__pycache__/storm_control.cpython-310.pyc | Bin 0 -> 897 bytes .../policy/__pycache__/stp.cpython-310.pyc | Bin 0 -> 827 bytes lib/aci/policy/general/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../general/__pycache__/main.cpython-310.pyc | Bin 0 -> 527 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 549 bytes lib/aci/policy/general/aae/__init__.py | 0 .../aae/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../aae/__pycache__/api.cpython-310.pyc | Bin 0 -> 1758 bytes .../aae/__pycache__/info.cpython-310.pyc | Bin 0 -> 6081 bytes .../aae/__pycache__/main.cpython-310.pyc | Bin 0 -> 1054 bytes .../aae/__pycache__/output.cpython-310.pyc | Bin 0 -> 5796 bytes lib/aci/policy/general/aae/api.py | 89 + lib/aci/policy/general/aae/audit/__init__.py | 0 lib/aci/policy/general/aae/audit/api.py | 48 + lib/aci/policy/general/aae/audit/info.py | 98 + lib/aci/policy/general/aae/audit/main.py | 8 + lib/aci/policy/general/aae/event/__init__.py | 0 lib/aci/policy/general/aae/event/api.py | 51 + lib/aci/policy/general/aae/event/info.py | 109 + lib/aci/policy/general/aae/event/main.py | 8 + lib/aci/policy/general/aae/fault/__init__.py | 0 lib/aci/policy/general/aae/fault/api.py | 112 + lib/aci/policy/general/aae/fault/info.py | 139 + lib/aci/policy/general/aae/fault/main.py | 8 + lib/aci/policy/general/aae/info.py | 345 + lib/aci/policy/general/aae/main.py | 23 + lib/aci/policy/general/aae/node/__init__.py | 0 lib/aci/policy/general/aae/node/api.py | 54 + lib/aci/policy/general/aae/node/info.py | 79 + lib/aci/policy/general/aae/node/main.py | 8 + lib/aci/policy/general/aae/output.py | 445 + lib/aci/policy/general/main.py | 6 + lib/aci/policy/general/output.py | 6 + lib/aci/policy/interface/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../interface/__pycache__/cdp.cpython-310.pyc | Bin 0 -> 4060 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 1386 bytes .../interface/__pycache__/fc.cpython-310.pyc | Bin 0 -> 879 bytes .../interface/__pycache__/l2.cpython-310.pyc | Bin 0 -> 877 bytes .../__pycache__/link_flap.cpython-310.pyc | Bin 0 -> 932 bytes .../__pycache__/link_level.cpython-310.pyc | Bin 0 -> 930 bytes .../__pycache__/lldp.cpython-310.pyc | Bin 0 -> 893 bytes .../__pycache__/macsec.cpython-310.pyc | Bin 0 -> 909 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 3814 bytes .../interface/__pycache__/mcp.cpython-310.pyc | Bin 0 -> 885 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 5572 bytes .../__pycache__/port_channel.cpython-310.pyc | Bin 0 -> 940 bytes .../__pycache__/port_security.cpython-310.pyc | Bin 0 -> 958 bytes .../__pycache__/storm_control.cpython-310.pyc | Bin 0 -> 954 bytes .../interface/__pycache__/stp.cpython-310.pyc | Bin 0 -> 884 bytes lib/aci/policy/interface/auth/__init__.py | 0 .../auth/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../auth/__pycache__/api.cpython-310.pyc | Bin 0 -> 1166 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1757 bytes .../auth/__pycache__/context.cpython-310.pyc | Bin 0 -> 1392 bytes .../auth/__pycache__/info.cpython-310.pyc | Bin 0 -> 4117 bytes .../auth/__pycache__/main.cpython-310.pyc | Bin 0 -> 880 bytes .../auth/__pycache__/output.cpython-310.pyc | Bin 0 -> 3242 bytes .../auth/__pycache__/vmm.cpython-310.pyc | Bin 0 -> 807 bytes lib/aci/policy/interface/auth/api.py | 51 + .../interface/auth/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1098 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3463 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 728 bytes .../policy/interface/auth/attachment/api.py | 43 + .../policy/interface/auth/attachment/info.py | 132 + .../policy/interface/auth/attachment/main.py | 8 + lib/aci/policy/interface/auth/context.py | 63 + lib/aci/policy/interface/auth/info.py | 207 + lib/aci/policy/interface/auth/main.py | 12 + lib/aci/policy/interface/auth/output.py | 185 + lib/aci/policy/interface/cdp/__init__.py | 0 .../cdp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../cdp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1154 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1100 bytes .../cdp/__pycache__/context.cpython-310.pyc | Bin 0 -> 1383 bytes .../cdp/__pycache__/info.cpython-310.pyc | Bin 0 -> 4262 bytes .../cdp/__pycache__/main.cpython-310.pyc | Bin 0 -> 869 bytes .../cdp/__pycache__/output.cpython-310.pyc | Bin 0 -> 3118 bytes .../cdp/__pycache__/vmm.cpython-310.pyc | Bin 0 -> 807 bytes lib/aci/policy/interface/cdp/api.py | 51 + .../interface/cdp/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1089 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3439 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 721 bytes .../policy/interface/cdp/attachment/api.py | 43 + .../policy/interface/cdp/attachment/info.py | 132 + .../policy/interface/cdp/attachment/main.py | 8 + lib/aci/policy/interface/cdp/context.py | 93 + lib/aci/policy/interface/cdp/info.py | 224 + lib/aci/policy/interface/cdp/main.py | 12 + lib/aci/policy/interface/cdp/output.py | 169 + lib/aci/policy/interface/copp/__init__.py | 0 .../copp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../copp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1162 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1108 bytes .../copp/__pycache__/context.cpython-310.pyc | Bin 0 -> 1391 bytes .../copp/__pycache__/info.cpython-310.pyc | Bin 0 -> 4375 bytes .../copp/__pycache__/main.cpython-310.pyc | Bin 0 -> 994 bytes .../copp/__pycache__/output.cpython-310.pyc | Bin 0 -> 3201 bytes .../copp/__pycache__/protocol.cpython-310.pyc | Bin 0 -> 1017 bytes .../copp/__pycache__/vmm.cpython-310.pyc | Bin 0 -> 807 bytes lib/aci/policy/interface/copp/api.py | 51 + .../interface/copp/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1097 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3463 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 728 bytes .../policy/interface/copp/attachment/api.py | 43 + .../policy/interface/copp/attachment/info.py | 132 + .../policy/interface/copp/attachment/main.py | 8 + lib/aci/policy/interface/copp/context.py | 63 + lib/aci/policy/interface/copp/info.py | 227 + lib/aci/policy/interface/copp/main.py | 14 + lib/aci/policy/interface/copp/output.py | 177 + .../interface/copp/protocol/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../protocol/__pycache__/api.cpython-310.pyc | Bin 0 -> 1081 bytes .../protocol/__pycache__/info.cpython-310.pyc | Bin 0 -> 1398 bytes .../protocol/__pycache__/main.cpython-310.pyc | Bin 0 -> 714 bytes lib/aci/policy/interface/copp/protocol/api.py | 43 + .../policy/interface/copp/protocol/info.py | 32 + .../policy/interface/copp/protocol/main.py | 8 + lib/aci/policy/interface/dpp/__init__.py | 0 .../dpp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../dpp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1155 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1106 bytes .../dpp/__pycache__/context.cpython-310.pyc | Bin 0 -> 1392 bytes .../dpp/__pycache__/info.cpython-310.pyc | Bin 0 -> 4590 bytes .../dpp/__pycache__/main.cpython-310.pyc | Bin 0 -> 869 bytes .../dpp/__pycache__/output.cpython-310.pyc | Bin 0 -> 3367 bytes .../dpp/__pycache__/vmm.cpython-310.pyc | Bin 0 -> 807 bytes lib/aci/policy/interface/dpp/api.py | 51 + .../interface/dpp/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1098 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3439 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 721 bytes .../policy/interface/dpp/attachment/api.py | 43 + .../policy/interface/dpp/attachment/info.py | 117 + .../policy/interface/dpp/attachment/main.py | 8 + lib/aci/policy/interface/dpp/context.py | 63 + lib/aci/policy/interface/dpp/info.py | 289 + lib/aci/policy/interface/dpp/main.py | 12 + lib/aci/policy/interface/dpp/output.py | 205 + lib/aci/policy/interface/fc/__init__.py | 0 .../fc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 162 bytes .../fc/__pycache__/api.cpython-310.pyc | Bin 0 -> 1146 bytes .../fc/__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1086 bytes .../fc/__pycache__/context.cpython-310.pyc | Bin 0 -> 1375 bytes .../fc/__pycache__/info.cpython-310.pyc | Bin 0 -> 4213 bytes .../fc/__pycache__/main.cpython-310.pyc | Bin 0 -> 858 bytes .../fc/__pycache__/output.cpython-310.pyc | Bin 0 -> 3161 bytes lib/aci/policy/interface/fc/api.py | 51 + .../interface/fc/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1081 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3415 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 714 bytes lib/aci/policy/interface/fc/attachment/api.py | 43 + .../policy/interface/fc/attachment/info.py | 117 + .../policy/interface/fc/attachment/main.py | 8 + lib/aci/policy/interface/fc/context.py | 93 + lib/aci/policy/interface/fc/info.py | 228 + lib/aci/policy/interface/fc/main.py | 12 + lib/aci/policy/interface/fc/output.py | 189 + lib/aci/policy/interface/l2/__init__.py | 0 .../l2/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../l2/__pycache__/api.cpython-310.pyc | Bin 0 -> 1146 bytes .../l2/__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1086 bytes .../l2/__pycache__/context.cpython-310.pyc | Bin 0 -> 1375 bytes .../l2/__pycache__/info.cpython-310.pyc | Bin 0 -> 4414 bytes .../l2/__pycache__/main.cpython-310.pyc | Bin 0 -> 858 bytes .../l2/__pycache__/output.cpython-310.pyc | Bin 0 -> 3129 bytes lib/aci/policy/interface/l2/api.py | 51 + .../interface/l2/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1081 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3415 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 714 bytes lib/aci/policy/interface/l2/attachment/api.py | 43 + .../policy/interface/l2/attachment/info.py | 132 + .../policy/interface/l2/attachment/main.py | 8 + lib/aci/policy/interface/l2/context.py | 93 + lib/aci/policy/interface/l2/info.py | 238 + lib/aci/policy/interface/l2/main.py | 12 + lib/aci/policy/interface/l2/output.py | 181 + .../policy/interface/link_flap/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 167 bytes .../link_flap/__pycache__/api.cpython-310.pyc | Bin 0 -> 1202 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1156 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 1425 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 4403 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 929 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3326 bytes lib/aci/policy/interface/link_flap/api.py | 51 + .../link_flap/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1131 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3574 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 759 bytes .../interface/link_flap/attachment/api.py | 43 + .../interface/link_flap/attachment/info.py | 117 + .../interface/link_flap/attachment/main.py | 8 + lib/aci/policy/interface/link_flap/context.py | 63 + lib/aci/policy/interface/link_flap/info.py | 221 + lib/aci/policy/interface/link_flap/main.py | 12 + lib/aci/policy/interface/link_flap/output.py | 177 + .../policy/interface/link_level/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 167 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1204 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1161 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 1427 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 4474 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 940 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3451 bytes lib/aci/policy/interface/link_level/api.py | 51 + .../link_level/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1133 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3598 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 766 bytes .../interface/link_level/attachment/api.py | 43 + .../interface/link_level/attachment/info.py | 117 + .../interface/link_level/attachment/main.py | 8 + .../policy/interface/link_level/context.py | 63 + lib/aci/policy/interface/link_level/info.py | 234 + lib/aci/policy/interface/link_level/main.py | 12 + lib/aci/policy/interface/link_level/output.py | 197 + .../interface/link_level_fc/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 167 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1222 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1193 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 1451 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 4493 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 967 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3427 bytes lib/aci/policy/interface/link_level_fc/api.py | 51 + .../link_level_fc/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1157 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3661 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 783 bytes .../interface/link_level_fc/attachment/api.py | 43 + .../link_level_fc/attachment/info.py | 117 + .../link_level_fc/attachment/main.py | 8 + .../policy/interface/link_level_fc/context.py | 63 + .../policy/interface/link_level_fc/info.py | 220 + .../policy/interface/link_level_fc/main.py | 12 + .../policy/interface/link_level_fc/output.py | 177 + lib/aci/policy/interface/lldp/__init__.py | 0 .../lldp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 162 bytes .../lldp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1162 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1108 bytes .../lldp/__pycache__/context.cpython-310.pyc | Bin 0 -> 1391 bytes .../lldp/__pycache__/info.cpython-310.pyc | Bin 0 -> 4351 bytes .../lldp/__pycache__/main.cpython-310.pyc | Bin 0 -> 880 bytes .../lldp/__pycache__/output.cpython-310.pyc | Bin 0 -> 3180 bytes lib/aci/policy/interface/lldp/api.py | 51 + .../interface/lldp/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1097 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3463 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 728 bytes .../policy/interface/lldp/attachment/api.py | 43 + .../policy/interface/lldp/attachment/info.py | 132 + .../policy/interface/lldp/attachment/main.py | 8 + lib/aci/policy/interface/lldp/context.py | 93 + lib/aci/policy/interface/lldp/info.py | 232 + lib/aci/policy/interface/lldp/main.py | 12 + lib/aci/policy/interface/lldp/output.py | 177 + lib/aci/policy/interface/main.py | 139 + lib/aci/policy/interface/mcp/__init__.py | 0 .../mcp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../mcp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1154 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1097 bytes .../mcp/__pycache__/context.cpython-310.pyc | Bin 0 -> 1383 bytes .../mcp/__pycache__/info.cpython-310.pyc | Bin 0 -> 4500 bytes .../mcp/__pycache__/main.cpython-310.pyc | Bin 0 -> 869 bytes .../mcp/__pycache__/output.cpython-310.pyc | Bin 0 -> 3158 bytes .../mcp/__pycache__/vmm.cpython-310.pyc | Bin 0 -> 807 bytes lib/aci/policy/interface/mcp/api.py | 51 + .../interface/mcp/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1089 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3439 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 721 bytes .../policy/interface/mcp/attachment/api.py | 43 + .../policy/interface/mcp/attachment/info.py | 132 + .../policy/interface/mcp/attachment/main.py | 8 + lib/aci/policy/interface/mcp/context.py | 93 + lib/aci/policy/interface/mcp/info.py | 245 + lib/aci/policy/interface/mcp/main.py | 12 + lib/aci/policy/interface/mcp/output.py | 177 + lib/aci/policy/interface/output.py | 274 + lib/aci/policy/interface/pfc/__init__.py | 0 .../pfc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../pfc/__pycache__/api.cpython-310.pyc | Bin 0 -> 1157 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1100 bytes .../pfc/__pycache__/context.cpython-310.pyc | Bin 0 -> 1386 bytes .../pfc/__pycache__/info.cpython-310.pyc | Bin 0 -> 4269 bytes .../pfc/__pycache__/main.cpython-310.pyc | Bin 0 -> 869 bytes .../pfc/__pycache__/output.cpython-310.pyc | Bin 0 -> 3185 bytes .../pfc/__pycache__/vmm.cpython-310.pyc | Bin 0 -> 807 bytes lib/aci/policy/interface/pfc/api.py | 51 + .../interface/pfc/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1092 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3439 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 721 bytes .../policy/interface/pfc/attachment/api.py | 43 + .../policy/interface/pfc/attachment/info.py | 132 + .../policy/interface/pfc/attachment/main.py | 8 + lib/aci/policy/interface/pfc/context.py | 93 + lib/aci/policy/interface/pfc/info.py | 223 + lib/aci/policy/interface/pfc/main.py | 12 + lib/aci/policy/interface/pfc/output.py | 177 + .../policy/interface/port_channel/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 167 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1254 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 2184 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 1444 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 4735 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 962 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3360 bytes lib/aci/policy/interface/port_channel/api.py | 56 + .../port_channel/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 2300 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3670 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 780 bytes .../interface/port_channel/attachment/api.py | 92 + .../interface/port_channel/attachment/info.py | 128 + .../interface/port_channel/attachment/main.py | 8 + .../policy/interface/port_channel/context.py | 93 + lib/aci/policy/interface/port_channel/info.py | 234 + lib/aci/policy/interface/port_channel/main.py | 12 + .../policy/interface/port_channel/output.py | 189 + .../interface/port_channel_member/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 167 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1261 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1250 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 1490 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 4644 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 1033 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3523 bytes .../interface/port_channel_member/api.py | 51 + .../attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1196 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3805 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 825 bytes .../port_channel_member/attachment/api.py | 43 + .../port_channel_member/attachment/info.py | 132 + .../port_channel_member/attachment/main.py | 8 + .../interface/port_channel_member/context.py | 93 + .../interface/port_channel_member/info.py | 222 + .../interface/port_channel_member/main.py | 12 + .../interface/port_channel_member/output.py | 177 + .../interface/port_security/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 167 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1230 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1199 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 1456 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 4511 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 973 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3428 bytes lib/aci/policy/interface/port_security/api.py | 51 + .../port_security/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1162 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3670 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 787 bytes .../interface/port_security/attachment/api.py | 43 + .../port_security/attachment/info.py | 132 + .../port_security/attachment/main.py | 8 + .../policy/interface/port_security/context.py | 93 + .../policy/interface/port_security/info.py | 222 + .../policy/interface/port_security/main.py | 12 + .../policy/interface/port_security/output.py | 181 + .../policy/interface/slow_drain/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 167 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1202 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1165 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 1431 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 4506 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 940 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3436 bytes lib/aci/policy/interface/slow_drain/api.py | 51 + .../slow_drain/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1137 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3598 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 766 bytes .../interface/slow_drain/attachment/api.py | 43 + .../interface/slow_drain/attachment/info.py | 132 + .../interface/slow_drain/attachment/main.py | 8 + .../policy/interface/slow_drain/context.py | 93 + lib/aci/policy/interface/slow_drain/info.py | 229 + lib/aci/policy/interface/slow_drain/main.py | 12 + lib/aci/policy/interface/slow_drain/output.py | 185 + .../interface/storm_control/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 171 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1227 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1199 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 1456 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 5309 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 973 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3470 bytes lib/aci/policy/interface/storm_control/api.py | 51 + .../storm_control/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1162 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3670 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 787 bytes .../interface/storm_control/attachment/api.py | 43 + .../storm_control/attachment/info.py | 132 + .../storm_control/attachment/main.py | 8 + .../policy/interface/storm_control/context.py | 93 + .../policy/interface/storm_control/info.py | 281 + .../policy/interface/storm_control/main.py | 12 + .../policy/interface/storm_control/output.py | 204 + lib/aci/policy/interface/stp/__init__.py | 0 .../stp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../stp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1154 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1097 bytes .../stp/__pycache__/context.cpython-310.pyc | Bin 0 -> 1383 bytes .../stp/__pycache__/info.cpython-310.pyc | Bin 0 -> 4418 bytes .../stp/__pycache__/main.cpython-310.pyc | Bin 0 -> 869 bytes .../stp/__pycache__/output.cpython-310.pyc | Bin 0 -> 3147 bytes lib/aci/policy/interface/stp/api.py | 51 + .../interface/stp/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1089 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3439 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 721 bytes .../policy/interface/stp/attachment/api.py | 43 + .../policy/interface/stp/attachment/info.py | 132 + .../policy/interface/stp/attachment/main.py | 8 + lib/aci/policy/interface/stp/context.py | 93 + lib/aci/policy/interface/stp/info.py | 233 + lib/aci/policy/interface/stp/main.py | 12 + lib/aci/policy/interface/stp/output.py | 177 + lib/aci/policy/interface/synce/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 167 bytes .../synce/__pycache__/api.cpython-310.pyc | Bin 0 -> 1173 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1122 bytes .../synce/__pycache__/context.cpython-310.pyc | Bin 0 -> 1402 bytes .../synce/__pycache__/info.cpython-310.pyc | Bin 0 -> 4680 bytes .../synce/__pycache__/main.cpython-310.pyc | Bin 0 -> 891 bytes .../synce/__pycache__/output.cpython-310.pyc | Bin 0 -> 3471 bytes lib/aci/policy/interface/synce/api.py | 51 + .../interface/synce/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1108 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3487 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 735 bytes .../policy/interface/synce/attachment/api.py | 43 + .../policy/interface/synce/attachment/info.py | 132 + .../policy/interface/synce/attachment/main.py | 8 + lib/aci/policy/interface/synce/context.py | 93 + lib/aci/policy/interface/synce/info.py | 256 + lib/aci/policy/interface/synce/main.py | 12 + lib/aci/policy/interface/synce/output.py | 197 + .../policy/interface/transceiver/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 167 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1225 bytes .../__pycache__/attachment.cpython-310.pyc | Bin 0 -> 1182 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 1444 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 4145 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 957 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 3143 bytes lib/aci/policy/interface/transceiver/api.py | 58 + .../transceiver/attachment/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 1150 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3631 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 777 bytes .../interface/transceiver/attachment/api.py | 43 + .../interface/transceiver/attachment/info.py | 132 + .../interface/transceiver/attachment/main.py | 8 + .../policy/interface/transceiver/context.py | 93 + lib/aci/policy/interface/transceiver/info.py | 206 + lib/aci/policy/interface/transceiver/main.py | 12 + .../policy/interface/transceiver/output.py | 166 + lib/aci/policy/main.py | 56 + lib/aci/policy/monitoring/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 813 bytes lib/aci/policy/monitoring/main.py | 42 + lib/aci/policy/output.py | 10 + lib/aci/policy/snoop/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../snoop/__pycache__/igmp.cpython-310.pyc | Bin 0 -> 1934 bytes .../snoop/__pycache__/main.cpython-310.pyc | Bin 0 -> 596 bytes .../snoop/__pycache__/mld.cpython-310.pyc | Bin 0 -> 1930 bytes .../snoop/__pycache__/output.cpython-310.pyc | Bin 0 -> 1309 bytes lib/aci/policy/snoop/igmp.py | 115 + lib/aci/policy/snoop/main.py | 8 + lib/aci/policy/snoop/mld.py | 114 + lib/aci/policy/snoop/output.py | 71 + lib/aci/policy/switch/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 154 bytes .../switch/__pycache__/main.cpython-310.pyc | Bin 0 -> 428 bytes lib/aci/policy/switch/main.py | 3 + lib/aci/policy/troubleshooting/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 163 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 569 bytes lib/aci/policy/troubleshooting/main.py | 6 + .../policy/troubleshooting/span/__init__.py | 0 .../span/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 168 bytes .../__pycache__/destination.cpython-310.pyc | Bin 0 -> 860 bytes .../span/__pycache__/main.cpython-310.pyc | Bin 0 -> 717 bytes .../span/__pycache__/source.cpython-310.pyc | Bin 0 -> 830 bytes .../troubleshooting/span/destination.py | 19 + lib/aci/policy/troubleshooting/span/main.py | 8 + lib/aci/policy/troubleshooting/span/source.py | 19 + lib/aci/pool/__init__.py | 0 .../pool/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes lib/aci/pool/__pycache__/main.cpython-310.pyc | Bin 0 -> 486 bytes .../pool/__pycache__/output.cpython-310.pyc | Bin 0 -> 504 bytes lib/aci/pool/main.py | 8 + lib/aci/pool/output.py | 6 + lib/aci/pool/vlan/__init__.py | 0 .../vlan/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../pool/vlan/__pycache__/api.cpython-310.pyc | Bin 0 -> 1688 bytes .../vlan/__pycache__/info.cpython-310.pyc | Bin 0 -> 4931 bytes .../vlan/__pycache__/main.cpython-310.pyc | Bin 0 -> 842 bytes .../vlan/__pycache__/output.cpython-310.pyc | Bin 0 -> 3952 bytes lib/aci/pool/vlan/api.py | 77 + lib/aci/pool/vlan/audit/__init__.py | 0 lib/aci/pool/vlan/audit/api.py | 48 + lib/aci/pool/vlan/audit/info.py | 98 + lib/aci/pool/vlan/audit/main.py | 8 + lib/aci/pool/vlan/event/__init__.py | 0 lib/aci/pool/vlan/event/api.py | 51 + lib/aci/pool/vlan/event/info.py | 108 + lib/aci/pool/vlan/event/main.py | 8 + lib/aci/pool/vlan/fault/__init__.py | 0 lib/aci/pool/vlan/fault/api.py | 118 + lib/aci/pool/vlan/fault/info.py | 139 + lib/aci/pool/vlan/fault/main.py | 8 + lib/aci/pool/vlan/info.py | 284 + lib/aci/pool/vlan/main.py | 20 + lib/aci/pool/vlan/output.py | 318 + lib/aci/proto/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 146 bytes .../proto/__pycache__/main.cpython-310.pyc | Bin 0 -> 1383 bytes .../proto/__pycache__/output.cpython-310.pyc | Bin 0 -> 1400 bytes lib/aci/proto/arp/__init__.py | 0 .../arp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 151 bytes .../arp/__pycache__/adjacency.cpython-310.pyc | Bin 0 -> 2100 bytes .../arp/__pycache__/domain.cpython-310.pyc | Bin 0 -> 2708 bytes .../arp/__pycache__/main.cpython-310.pyc | Bin 0 -> 1976 bytes .../arp/__pycache__/output.cpython-310.pyc | Bin 0 -> 3894 bytes .../arp/__pycache__/route.cpython-310.pyc | Bin 0 -> 4784 bytes lib/aci/proto/arp/adjacency/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../adjacency/__pycache__/api.cpython-310.pyc | Bin 0 -> 1328 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 2752 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 653 bytes lib/aci/proto/arp/adjacency/api.py | 53 + lib/aci/proto/arp/adjacency/info.py | 101 + lib/aci/proto/arp/adjacency/main.py | 8 + lib/aci/proto/arp/domain/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../domain/__pycache__/api.cpython-310.pyc | Bin 0 -> 1425 bytes .../domain/__pycache__/info.cpython-310.pyc | Bin 0 -> 3649 bytes .../domain/__pycache__/main.cpython-310.pyc | Bin 0 -> 632 bytes lib/aci/proto/arp/domain/api.py | 64 + lib/aci/proto/arp/domain/info.py | 143 + lib/aci/proto/arp/domain/main.py | 8 + lib/aci/proto/arp/event/__init__.py | 0 lib/aci/proto/arp/event/api.py | 55 + lib/aci/proto/arp/event/info.py | 83 + lib/aci/proto/arp/event/main.py | 8 + lib/aci/proto/arp/fault/__init__.py | 0 lib/aci/proto/arp/fault/api.py | 126 + lib/aci/proto/arp/fault/info.py | 69 + lib/aci/proto/arp/fault/main.py | 8 + lib/aci/proto/arp/instance/__init__.py | 0 lib/aci/proto/arp/instance/api.py | 71 + lib/aci/proto/arp/instance/info.py | 44 + lib/aci/proto/arp/instance/main.py | 8 + lib/aci/proto/arp/main.py | 97 + lib/aci/proto/arp/output.py | 315 + lib/aci/proto/bfd/TODO.md | 11 + lib/aci/proto/bfd/__init__.py | 0 .../bfd/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../bfd/__pycache__/instance.cpython-310.pyc | Bin 0 -> 1725 bytes .../bfd/__pycache__/interface.cpython-310.pyc | Bin 0 -> 3059 bytes .../bfd/__pycache__/main.cpython-310.pyc | Bin 0 -> 2321 bytes .../bfd/__pycache__/output.cpython-310.pyc | Bin 0 -> 6649 bytes .../bfd/__pycache__/session.cpython-310.pyc | Bin 0 -> 4331 bytes .../__pycache__/session_peer.cpython-310.pyc | Bin 0 -> 2087 bytes .../__pycache__/session_stats.cpython-310.pyc | Bin 0 -> 2227 bytes lib/aci/proto/bfd/event/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../bfd/event/__pycache__/api.cpython-310.pyc | Bin 0 -> 1446 bytes .../event/__pycache__/info.cpython-310.pyc | Bin 0 -> 2395 bytes .../event/__pycache__/main.cpython-310.pyc | Bin 0 -> 625 bytes lib/aci/proto/bfd/event/api.py | 55 + lib/aci/proto/bfd/event/info.py | 108 + lib/aci/proto/bfd/event/main.py | 8 + lib/aci/proto/bfd/fault/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../bfd/fault/__pycache__/api.cpython-310.pyc | Bin 0 -> 2371 bytes .../fault/__pycache__/info.cpython-310.pyc | Bin 0 -> 2503 bytes .../fault/__pycache__/main.cpython-310.pyc | Bin 0 -> 625 bytes lib/aci/proto/bfd/fault/api.py | 126 + lib/aci/proto/bfd/fault/info.py | 111 + lib/aci/proto/bfd/fault/main.py | 8 + lib/aci/proto/bfd/instance/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../instance/__pycache__/api.cpython-310.pyc | Bin 0 -> 1541 bytes .../instance/__pycache__/info.cpython-310.pyc | Bin 0 -> 1538 bytes .../instance/__pycache__/main.cpython-310.pyc | Bin 0 -> 646 bytes lib/aci/proto/bfd/instance/api.py | 70 + lib/aci/proto/bfd/instance/info.py | 54 + lib/aci/proto/bfd/instance/main.py | 8 + lib/aci/proto/bfd/interface/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../interface/__pycache__/api.cpython-310.pyc | Bin 0 -> 2037 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 2866 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 653 bytes lib/aci/proto/bfd/interface/api.py | 86 + lib/aci/proto/bfd/interface/info.py | 123 + lib/aci/proto/bfd/interface/main.py | 8 + lib/aci/proto/bfd/main.py | 116 + lib/aci/proto/bfd/output.py | 510 + lib/aci/proto/bfd/session/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../session/__pycache__/api.cpython-310.pyc | Bin 0 -> 1784 bytes .../session/__pycache__/info.cpython-310.pyc | Bin 0 -> 3703 bytes .../session/__pycache__/main.cpython-310.pyc | Bin 0 -> 843 bytes lib/aci/proto/bfd/session/api.py | 84 + lib/aci/proto/bfd/session/info.py | 157 + lib/aci/proto/bfd/session/main.py | 12 + lib/aci/proto/bfd/session/peer/__init__.py | 0 .../peer/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 163 bytes .../peer/__pycache__/api.cpython-310.pyc | Bin 0 -> 1932 bytes .../peer/__pycache__/info.cpython-310.pyc | Bin 0 -> 1094 bytes .../peer/__pycache__/main.cpython-310.pyc | Bin 0 -> 670 bytes lib/aci/proto/bfd/session/peer/api.py | 79 + lib/aci/proto/bfd/session/peer/info.py | 23 + lib/aci/proto/bfd/session/peer/main.py | 8 + lib/aci/proto/bfd/session/stats/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 164 bytes .../stats/__pycache__/api.cpython-310.pyc | Bin 0 -> 1981 bytes .../stats/__pycache__/info.cpython-310.pyc | Bin 0 -> 1032 bytes .../stats/__pycache__/main.cpython-310.pyc | Bin 0 -> 677 bytes lib/aci/proto/bfd/session/stats/api.py | 79 + lib/aci/proto/bfd/session/stats/info.py | 18 + lib/aci/proto/bfd/session/stats/main.py | 8 + lib/aci/proto/bgp/__init__.py | 0 .../bgp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../bgp/__pycache__/domain.cpython-310.pyc | Bin 0 -> 2929 bytes .../bgp/__pycache__/instance.cpython-310.pyc | Bin 0 -> 1995 bytes .../bgp/__pycache__/main.cpython-310.pyc | Bin 0 -> 2078 bytes .../bgp/__pycache__/neighbor.cpython-310.pyc | Bin 0 -> 5808 bytes .../neighbor_stats.cpython-310.pyc | Bin 0 -> 2695 bytes .../bgp/__pycache__/output.cpython-310.pyc | Bin 0 -> 4143 bytes .../bgp/__pycache__/route.cpython-310.pyc | Bin 0 -> 2557 bytes lib/aci/proto/bgp/domain/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../domain/__pycache__/api.cpython-310.pyc | Bin 0 -> 1426 bytes .../domain/__pycache__/info.cpython-310.pyc | Bin 0 -> 2633 bytes .../domain/__pycache__/main.cpython-310.pyc | Bin 0 -> 632 bytes lib/aci/proto/bgp/domain/api.py | 64 + lib/aci/proto/bgp/domain/info.py | 112 + lib/aci/proto/bgp/domain/main.py | 8 + lib/aci/proto/bgp/event/__init__.py | 0 lib/aci/proto/bgp/event/api.py | 55 + lib/aci/proto/bgp/event/info.py | 100 + lib/aci/proto/bgp/event/main.py | 8 + lib/aci/proto/bgp/fault/__init__.py | 0 lib/aci/proto/bgp/fault/api.py | 126 + lib/aci/proto/bgp/fault/info.py | 96 + lib/aci/proto/bgp/fault/main.py | 8 + lib/aci/proto/bgp/instance/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../instance/__pycache__/api.cpython-310.pyc | Bin 0 -> 1558 bytes .../instance/__pycache__/info.cpython-310.pyc | Bin 0 -> 2137 bytes .../instance/__pycache__/main.cpython-310.pyc | Bin 0 -> 646 bytes lib/aci/proto/bgp/instance/api.py | 70 + lib/aci/proto/bgp/instance/info.py | 78 + lib/aci/proto/bgp/instance/main.py | 8 + lib/aci/proto/bgp/main.py | 104 + lib/aci/proto/bgp/neighbor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../neighbor/__pycache__/api.cpython-310.pyc | Bin 0 -> 2095 bytes .../neighbor/__pycache__/info.cpython-310.pyc | Bin 0 -> 4290 bytes .../neighbor/__pycache__/main.cpython-310.pyc | Bin 0 -> 751 bytes lib/aci/proto/bgp/neighbor/api.py | 140 + lib/aci/proto/bgp/neighbor/info.py | 220 + lib/aci/proto/bgp/neighbor/main.py | 10 + lib/aci/proto/bgp/neighbor/stats/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 165 bytes .../stats/__pycache__/api.cpython-310.pyc | Bin 0 -> 1525 bytes .../stats/__pycache__/info.cpython-310.pyc | Bin 0 -> 1114 bytes .../stats/__pycache__/main.cpython-310.pyc | Bin 0 -> 684 bytes lib/aci/proto/bgp/neighbor/stats/api.py | 70 + lib/aci/proto/bgp/neighbor/stats/info.py | 51 + lib/aci/proto/bgp/neighbor/stats/main.py | 8 + lib/aci/proto/bgp/output.py | 507 + lib/aci/proto/bot_output.py | 11 + lib/aci/proto/cdp/__init__.py | 0 .../cdp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../cdp/__pycache__/instance.cpython-310.pyc | Bin 0 -> 1965 bytes .../cdp/__pycache__/interface.cpython-310.pyc | Bin 0 -> 4066 bytes .../interface_stats.cpython-310.pyc | Bin 0 -> 1514 bytes .../cdp/__pycache__/main.cpython-310.pyc | Bin 0 -> 1870 bytes .../cdp/__pycache__/neighbor.cpython-310.pyc | Bin 0 -> 2588 bytes .../cdp/__pycache__/output.cpython-310.pyc | Bin 0 -> 3165 bytes lib/aci/proto/cdp/event/__init__.py | 0 lib/aci/proto/cdp/event/api.py | 55 + lib/aci/proto/cdp/event/info.py | 92 + lib/aci/proto/cdp/event/main.py | 8 + lib/aci/proto/cdp/instance/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../instance/__pycache__/api.cpython-310.pyc | Bin 0 -> 1342 bytes .../instance/__pycache__/info.cpython-310.pyc | Bin 0 -> 1233 bytes .../instance/__pycache__/main.cpython-310.pyc | Bin 0 -> 646 bytes lib/aci/proto/cdp/instance/api.py | 57 + lib/aci/proto/cdp/instance/info.py | 32 + lib/aci/proto/cdp/instance/main.py | 8 + lib/aci/proto/cdp/interface/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../interface/__pycache__/api.cpython-310.pyc | Bin 0 -> 1435 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 3619 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 760 bytes lib/aci/proto/cdp/interface/api.py | 61 + lib/aci/proto/cdp/interface/info.py | 135 + lib/aci/proto/cdp/interface/main.py | 10 + lib/aci/proto/cdp/interface/stats/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 166 bytes .../stats/__pycache__/info.cpython-310.pyc | Bin 0 -> 872 bytes .../stats/__pycache__/main.cpython-310.pyc | Bin 0 -> 582 bytes lib/aci/proto/cdp/interface/stats/info.py | 21 + lib/aci/proto/cdp/interface/stats/main.py | 6 + lib/aci/proto/cdp/main.py | 89 + lib/aci/proto/cdp/neighbor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../neighbor/__pycache__/api.cpython-310.pyc | Bin 0 -> 1341 bytes .../neighbor/__pycache__/info.cpython-310.pyc | Bin 0 -> 2608 bytes .../neighbor/__pycache__/main.cpython-310.pyc | Bin 0 -> 646 bytes lib/aci/proto/cdp/neighbor/api.py | 53 + lib/aci/proto/cdp/neighbor/info.py | 98 + lib/aci/proto/cdp/neighbor/main.py | 8 + lib/aci/proto/cdp/output.py | 209 + lib/aci/proto/hsrp/__init__.py | 0 .../hsrp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 151 bytes .../hsrp/__pycache__/domain.cpython-310.pyc | Bin 0 -> 2765 bytes .../hsrp/__pycache__/instance.cpython-310.pyc | Bin 0 -> 1881 bytes .../__pycache__/interface.cpython-310.pyc | Bin 0 -> 2637 bytes .../hsrp/__pycache__/main.cpython-310.pyc | Bin 0 -> 2038 bytes .../hsrp/__pycache__/output.cpython-310.pyc | Bin 0 -> 3688 bytes lib/aci/proto/hsrp/domain/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../domain/__pycache__/api.cpython-310.pyc | Bin 0 -> 1436 bytes .../domain/__pycache__/info.cpython-310.pyc | Bin 0 -> 2820 bytes .../domain/__pycache__/main.cpython-310.pyc | Bin 0 -> 639 bytes lib/aci/proto/hsrp/domain/api.py | 64 + lib/aci/proto/hsrp/domain/info.py | 98 + lib/aci/proto/hsrp/domain/main.py | 8 + lib/aci/proto/hsrp/event/__init__.py | 0 lib/aci/proto/hsrp/event/api.py | 55 + lib/aci/proto/hsrp/event/info.py | 83 + lib/aci/proto/hsrp/event/main.py | 8 + lib/aci/proto/hsrp/fault/__init__.py | 0 lib/aci/proto/hsrp/fault/api.py | 126 + lib/aci/proto/hsrp/fault/info.py | 69 + lib/aci/proto/hsrp/fault/main.py | 8 + lib/aci/proto/hsrp/instance/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../instance/__pycache__/api.cpython-310.pyc | Bin 0 -> 1582 bytes .../instance/__pycache__/info.cpython-310.pyc | Bin 0 -> 1425 bytes .../instance/__pycache__/main.cpython-310.pyc | Bin 0 -> 653 bytes lib/aci/proto/hsrp/instance/api.py | 71 + lib/aci/proto/hsrp/instance/info.py | 44 + lib/aci/proto/hsrp/instance/main.py | 8 + lib/aci/proto/hsrp/interface/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../interface/__pycache__/api.cpython-310.pyc | Bin 0 -> 1460 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 2653 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 769 bytes lib/aci/proto/hsrp/interface/api.py | 61 + lib/aci/proto/hsrp/interface/info.py | 93 + lib/aci/proto/hsrp/interface/main.py | 10 + .../proto/hsrp/interface/stats/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 166 bytes .../stats/__pycache__/info.cpython-310.pyc | Bin 0 -> 757 bytes .../stats/__pycache__/main.cpython-310.pyc | Bin 0 -> 587 bytes lib/aci/proto/hsrp/interface/stats/info.py | 11 + lib/aci/proto/hsrp/interface/stats/main.py | 6 + lib/aci/proto/hsrp/main.py | 98 + lib/aci/proto/hsrp/output.py | 261 + lib/aci/proto/ipv4/__init__.py | 0 .../ipv4/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 151 bytes .../ipv4/__pycache__/domain.cpython-310.pyc | Bin 0 -> 3131 bytes .../ipv4/__pycache__/main.cpython-310.pyc | Bin 0 -> 2136 bytes .../ipv4/__pycache__/output.cpython-310.pyc | Bin 0 -> 4580 bytes .../ipv4/__pycache__/route.cpython-310.pyc | Bin 0 -> 4777 bytes lib/aci/proto/ipv4/domain/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../domain/__pycache__/api.cpython-310.pyc | Bin 0 -> 1492 bytes .../domain/__pycache__/info.cpython-310.pyc | Bin 0 -> 2557 bytes .../domain/__pycache__/main.cpython-310.pyc | Bin 0 -> 639 bytes lib/aci/proto/ipv4/domain/api.py | 63 + lib/aci/proto/ipv4/domain/info.py | 93 + lib/aci/proto/ipv4/domain/main.py | 8 + lib/aci/proto/ipv4/event/__init__.py | 0 lib/aci/proto/ipv4/event/api.py | 55 + lib/aci/proto/ipv4/event/info.py | 104 + lib/aci/proto/ipv4/event/main.py | 8 + lib/aci/proto/ipv4/fault/__init__.py | 0 lib/aci/proto/ipv4/fault/api.py | 126 + lib/aci/proto/ipv4/fault/info.py | 94 + lib/aci/proto/ipv4/fault/main.py | 8 + lib/aci/proto/ipv4/instance/__init__.py | 0 lib/aci/proto/ipv4/instance/api.py | 71 + lib/aci/proto/ipv4/instance/info.py | 44 + lib/aci/proto/ipv4/instance/main.py | 8 + lib/aci/proto/ipv4/main.py | 126 + lib/aci/proto/ipv4/output.py | 372 + lib/aci/proto/ipv4/route/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../route/__pycache__/api.cpython-310.pyc | Bin 0 -> 1847 bytes .../route/__pycache__/info.cpython-310.pyc | Bin 0 -> 4135 bytes .../route/__pycache__/main.cpython-310.pyc | Bin 0 -> 632 bytes lib/aci/proto/ipv4/route/api.py | 87 + lib/aci/proto/ipv4/route/info.py | 183 + lib/aci/proto/ipv4/route/main.py | 8 + lib/aci/proto/ipv6/__init__.py | 0 .../ipv6/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 151 bytes .../ipv6/__pycache__/domain.cpython-310.pyc | Bin 0 -> 3131 bytes .../ipv6/__pycache__/main.cpython-310.pyc | Bin 0 -> 2136 bytes .../ipv6/__pycache__/output.cpython-310.pyc | Bin 0 -> 4570 bytes .../ipv6/__pycache__/route.cpython-310.pyc | Bin 0 -> 4777 bytes lib/aci/proto/ipv6/domain/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../domain/__pycache__/api.cpython-310.pyc | Bin 0 -> 1445 bytes .../domain/__pycache__/info.cpython-310.pyc | Bin 0 -> 2475 bytes .../domain/__pycache__/main.cpython-310.pyc | Bin 0 -> 639 bytes lib/aci/proto/ipv6/domain/api.py | 58 + lib/aci/proto/ipv6/domain/info.py | 89 + lib/aci/proto/ipv6/domain/main.py | 8 + lib/aci/proto/ipv6/event/__init__.py | 0 lib/aci/proto/ipv6/event/api.py | 55 + lib/aci/proto/ipv6/event/info.py | 104 + lib/aci/proto/ipv6/event/main.py | 8 + lib/aci/proto/ipv6/fault/__init__.py | 0 lib/aci/proto/ipv6/fault/api.py | 126 + lib/aci/proto/ipv6/fault/info.py | 94 + lib/aci/proto/ipv6/fault/main.py | 8 + lib/aci/proto/ipv6/instance/__init__.py | 0 lib/aci/proto/ipv6/instance/api.py | 71 + lib/aci/proto/ipv6/instance/info.py | 44 + lib/aci/proto/ipv6/instance/main.py | 8 + lib/aci/proto/ipv6/main.py | 126 + lib/aci/proto/ipv6/output.py | 370 + lib/aci/proto/ipv6/route/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../route/__pycache__/api.cpython-310.pyc | Bin 0 -> 1847 bytes .../route/__pycache__/info.cpython-310.pyc | Bin 0 -> 4135 bytes .../route/__pycache__/main.cpython-310.pyc | Bin 0 -> 632 bytes lib/aci/proto/ipv6/route/api.py | 87 + lib/aci/proto/ipv6/route/info.py | 183 + lib/aci/proto/ipv6/route/main.py | 8 + lib/aci/proto/isis/__init__.py | 0 .../isis/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 151 bytes .../isis/__pycache__/domain.cpython-310.pyc | Bin 0 -> 2761 bytes .../isis/__pycache__/instance.cpython-310.pyc | Bin 0 -> 1828 bytes .../isis/__pycache__/main.cpython-310.pyc | Bin 0 -> 2475 bytes .../isis/__pycache__/output.cpython-310.pyc | Bin 0 -> 5840 bytes lib/aci/proto/isis/domain/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../domain/__pycache__/api.cpython-310.pyc | Bin 0 -> 1327 bytes .../domain/__pycache__/info.cpython-310.pyc | Bin 0 -> 2995 bytes .../domain/__pycache__/main.cpython-310.pyc | Bin 0 -> 639 bytes lib/aci/proto/isis/domain/api.py | 53 + lib/aci/proto/isis/domain/info.py | 132 + lib/aci/proto/isis/domain/main.py | 8 + lib/aci/proto/isis/event/__init__.py | 0 lib/aci/proto/isis/event/api.py | 55 + lib/aci/proto/isis/event/info.py | 83 + lib/aci/proto/isis/event/main.py | 8 + lib/aci/proto/isis/fault/__init__.py | 0 lib/aci/proto/isis/fault/api.py | 126 + lib/aci/proto/isis/fault/info.py | 69 + lib/aci/proto/isis/fault/main.py | 8 + lib/aci/proto/isis/instance/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../instance/__pycache__/api.cpython-310.pyc | Bin 0 -> 1568 bytes .../instance/__pycache__/info.cpython-310.pyc | Bin 0 -> 1517 bytes .../instance/__pycache__/main.cpython-310.pyc | Bin 0 -> 653 bytes lib/aci/proto/isis/instance/api.py | 70 + lib/aci/proto/isis/instance/info.py | 51 + lib/aci/proto/isis/instance/main.py | 8 + lib/aci/proto/isis/interface/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../interface/__pycache__/api.cpython-310.pyc | Bin 0 -> 1457 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 2133 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 660 bytes lib/aci/proto/isis/interface/api.py | 64 + lib/aci/proto/isis/interface/info.py | 69 + lib/aci/proto/isis/interface/main.py | 8 + .../proto/isis/interface/stats/__init__.py | 0 lib/aci/proto/isis/lsp/__init__.py | 0 .../lsp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../isis/lsp/__pycache__/api.cpython-310.pyc | Bin 0 -> 1427 bytes .../isis/lsp/__pycache__/info.cpython-310.pyc | Bin 0 -> 1883 bytes .../isis/lsp/__pycache__/main.cpython-310.pyc | Bin 0 -> 618 bytes lib/aci/proto/isis/lsp/api.py | 64 + lib/aci/proto/isis/lsp/info.py | 59 + lib/aci/proto/isis/lsp/main.py | 8 + lib/aci/proto/isis/main.py | 114 + lib/aci/proto/isis/neighbor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../neighbor/__pycache__/api.cpython-310.pyc | Bin 0 -> 1593 bytes .../neighbor/__pycache__/info.cpython-310.pyc | Bin 0 -> 2177 bytes .../neighbor/__pycache__/main.cpython-310.pyc | Bin 0 -> 653 bytes lib/aci/proto/isis/neighbor/api.py | 70 + lib/aci/proto/isis/neighbor/info.py | 72 + lib/aci/proto/isis/neighbor/main.py | 8 + lib/aci/proto/isis/output.py | 536 + lib/aci/proto/isis/route/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../route/__pycache__/api.cpython-310.pyc | Bin 0 -> 1728 bytes .../route/__pycache__/info.cpython-310.pyc | Bin 0 -> 2121 bytes .../route/__pycache__/main.cpython-310.pyc | Bin 0 -> 632 bytes lib/aci/proto/isis/route/api.py | 78 + lib/aci/proto/isis/route/info.py | 70 + lib/aci/proto/isis/route/main.py | 8 + lib/aci/proto/isis/tree/__init__.py | 0 .../tree/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../isis/tree/__pycache__/api.cpython-310.pyc | Bin 0 -> 1446 bytes .../tree/__pycache__/info.cpython-310.pyc | Bin 0 -> 2003 bytes .../tree/__pycache__/main.cpython-310.pyc | Bin 0 -> 625 bytes lib/aci/proto/isis/tree/api.py | 64 + lib/aci/proto/isis/tree/info.py | 67 + lib/aci/proto/isis/tree/main.py | 8 + lib/aci/proto/isis/tunnel/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../tunnel/__pycache__/api.cpython-310.pyc | Bin 0 -> 1442 bytes .../tunnel/__pycache__/info.cpython-310.pyc | Bin 0 -> 2197 bytes .../tunnel/__pycache__/main.cpython-310.pyc | Bin 0 -> 639 bytes lib/aci/proto/isis/tunnel/api.py | 64 + lib/aci/proto/isis/tunnel/info.py | 75 + lib/aci/proto/isis/tunnel/main.py | 8 + lib/aci/proto/lacp/__init__.py | 0 .../lacp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 151 bytes .../lacp/__pycache__/instance.cpython-310.pyc | Bin 0 -> 1838 bytes .../__pycache__/interface.cpython-310.pyc | Bin 0 -> 1748 bytes .../lacp/__pycache__/main.cpython-310.pyc | Bin 0 -> 1687 bytes .../lacp/__pycache__/output.cpython-310.pyc | Bin 0 -> 3305 bytes lib/aci/proto/lacp/bot_output.py | 217 + lib/aci/proto/lacp/event/__init__.py | 0 lib/aci/proto/lacp/event/api.py | 55 + lib/aci/proto/lacp/event/info.py | 91 + lib/aci/proto/lacp/event/main.py | 8 + lib/aci/proto/lacp/instance/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../instance/__pycache__/api.cpython-310.pyc | Bin 0 -> 1352 bytes .../instance/__pycache__/info.cpython-310.pyc | Bin 0 -> 1243 bytes .../instance/__pycache__/main.cpython-310.pyc | Bin 0 -> 653 bytes lib/aci/proto/lacp/instance/api.py | 57 + lib/aci/proto/lacp/instance/info.py | 32 + lib/aci/proto/lacp/instance/main.py | 8 + lib/aci/proto/lacp/interface/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 453 bytes lib/aci/proto/lacp/interface/main.py | 3 + lib/aci/proto/lacp/main.py | 118 + lib/aci/proto/lacp/output.py | 224 + lib/aci/proto/lldp/__init__.py | 0 .../lldp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 151 bytes .../lldp/__pycache__/context.cpython-310.pyc | Bin 0 -> 956 bytes .../lldp/__pycache__/info.cpython-310.pyc | Bin 0 -> 1592 bytes .../lldp/__pycache__/instance.cpython-310.pyc | Bin 0 -> 1652 bytes .../instance_stats.cpython-310.pyc | Bin 0 -> 1446 bytes .../lldp/__pycache__/main.cpython-310.pyc | Bin 0 -> 968 bytes .../lldp/__pycache__/output.cpython-310.pyc | Bin 0 -> 3349 bytes lib/aci/proto/lldp/bot_output.py | 212 + lib/aci/proto/lldp/context.py | 23 + lib/aci/proto/lldp/event/__init__.py | 0 lib/aci/proto/lldp/event/api.py | 55 + lib/aci/proto/lldp/event/info.py | 115 + lib/aci/proto/lldp/event/main.py | 8 + lib/aci/proto/lldp/fault/__init__.py | 0 lib/aci/proto/lldp/fault/api.py | 126 + lib/aci/proto/lldp/fault/info.py | 117 + lib/aci/proto/lldp/fault/main.py | 8 + lib/aci/proto/lldp/info.py | 90 + lib/aci/proto/lldp/instance/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../instance/__pycache__/api.cpython-310.pyc | Bin 0 -> 1560 bytes .../instance/__pycache__/info.cpython-310.pyc | Bin 0 -> 1395 bytes .../instance/__pycache__/main.cpython-310.pyc | Bin 0 -> 653 bytes lib/aci/proto/lldp/instance/api.py | 70 + lib/aci/proto/lldp/instance/info.py | 40 + lib/aci/proto/lldp/instance/main.py | 8 + lib/aci/proto/lldp/main.py | 16 + lib/aci/proto/lldp/output.py | 256 + lib/aci/proto/lldp/stats/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../stats/__pycache__/api.cpython-310.pyc | Bin 0 -> 1333 bytes .../stats/__pycache__/info.cpython-310.pyc | Bin 0 -> 1323 bytes .../stats/__pycache__/main.cpython-310.pyc | Bin 0 -> 632 bytes lib/aci/proto/lldp/stats/api.py | 57 + lib/aci/proto/lldp/stats/info.py | 56 + lib/aci/proto/lldp/stats/main.py | 8 + lib/aci/proto/main.py | 52 + lib/aci/proto/nd/__init__.py | 0 .../nd/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../nd/__pycache__/domain.cpython-310.pyc | Bin 0 -> 2208 bytes .../nd/__pycache__/instance.cpython-310.pyc | Bin 0 -> 1380 bytes .../nd/__pycache__/interface.cpython-310.pyc | Bin 0 -> 3162 bytes .../interface_stats.cpython-310.pyc | Bin 0 -> 728 bytes .../proto/nd/__pycache__/main.cpython-310.pyc | Bin 0 -> 2412 bytes .../nd/__pycache__/neighbor.cpython-310.pyc | Bin 0 -> 1925 bytes .../nd/__pycache__/output.cpython-310.pyc | Bin 0 -> 4599 bytes lib/aci/proto/nd/domain/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../nd/domain/__pycache__/api.cpython-310.pyc | Bin 0 -> 1419 bytes .../domain/__pycache__/info.cpython-310.pyc | Bin 0 -> 2101 bytes .../domain/__pycache__/main.cpython-310.pyc | Bin 0 -> 625 bytes lib/aci/proto/nd/domain/api.py | 67 + lib/aci/proto/nd/domain/info.py | 64 + lib/aci/proto/nd/domain/main.py | 8 + lib/aci/proto/nd/event/__init__.py | 0 lib/aci/proto/nd/event/api.py | 55 + lib/aci/proto/nd/event/info.py | 83 + lib/aci/proto/nd/event/main.py | 8 + lib/aci/proto/nd/fault/__init__.py | 0 lib/aci/proto/nd/fault/api.py | 126 + lib/aci/proto/nd/fault/info.py | 69 + lib/aci/proto/nd/fault/main.py | 8 + lib/aci/proto/nd/instance/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../instance/__pycache__/api.cpython-310.pyc | Bin 0 -> 1554 bytes .../instance/__pycache__/info.cpython-310.pyc | Bin 0 -> 1225 bytes .../instance/__pycache__/main.cpython-310.pyc | Bin 0 -> 639 bytes lib/aci/proto/nd/instance/api.py | 73 + lib/aci/proto/nd/instance/info.py | 42 + lib/aci/proto/nd/instance/main.py | 8 + lib/aci/proto/nd/interface/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../interface/__pycache__/api.cpython-310.pyc | Bin 0 -> 1453 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 2701 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 750 bytes lib/aci/proto/nd/interface/api.py | 63 + lib/aci/proto/nd/interface/info.py | 101 + lib/aci/proto/nd/interface/main.py | 10 + lib/aci/proto/nd/interface/stats/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 165 bytes .../stats/__pycache__/info.cpython-310.pyc | Bin 0 -> 745 bytes .../stats/__pycache__/main.cpython-310.pyc | Bin 0 -> 575 bytes lib/aci/proto/nd/interface/stats/info.py | 11 + lib/aci/proto/nd/interface/stats/main.py | 6 + lib/aci/proto/nd/main.py | 125 + lib/aci/proto/nd/neighbor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../neighbor/__pycache__/api.cpython-310.pyc | Bin 0 -> 1333 bytes .../neighbor/__pycache__/info.cpython-310.pyc | Bin 0 -> 1494 bytes .../neighbor/__pycache__/main.cpython-310.pyc | Bin 0 -> 639 bytes lib/aci/proto/nd/neighbor/api.py | 56 + lib/aci/proto/nd/neighbor/info.py | 46 + lib/aci/proto/nd/neighbor/main.py | 8 + lib/aci/proto/nd/output.py | 372 + lib/aci/proto/output.py | 38 + lib/aci/server/__init__.py | 0 lib/aci/server/main.py | 162 + lib/aci/settings.py | 416 + lib/aci/system/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../system/__pycache__/main.cpython-310.pyc | Bin 0 -> 494 bytes .../system/__pycache__/output.cpython-310.pyc | Bin 0 -> 516 bytes lib/aci/system/fault/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../fault/__pycache__/api.cpython-310.pyc | Bin 0 -> 976 bytes .../fault/__pycache__/info.cpython-310.pyc | Bin 0 -> 9416 bytes .../fault/__pycache__/main.cpython-310.pyc | Bin 0 -> 685 bytes .../fault/__pycache__/output.cpython-310.pyc | Bin 0 -> 2195 bytes lib/aci/system/fault/api.py | 43 + lib/aci/system/fault/code/.gitignore | 1 + lib/aci/system/fault/code/__init__.py | 0 .../code/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../code/__pycache__/main.cpython-310.pyc | Bin 0 -> 1677727 bytes lib/aci/system/fault/code/generate.py | 40 + lib/aci/system/fault/code/main.py | 45836 ++++++++++++++++ lib/aci/system/fault/info.py | 517 + lib/aci/system/fault/main.py | 10 + lib/aci/system/fault/output.py | 163 + lib/aci/system/main.py | 6 + lib/aci/system/output.py | 6 + lib/aci/tenant/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../tenant/__pycache__/api.cpython-310.pyc | Bin 0 -> 1119 bytes .../tenant/__pycache__/info.cpython-310.pyc | Bin 0 -> 3029 bytes .../tenant/__pycache__/main.cpython-310.pyc | Bin 0 -> 810 bytes .../tenant/__pycache__/output.cpython-310.pyc | Bin 0 -> 3427 bytes lib/aci/tenant/api.py | 72 + lib/aci/tenant/audit/__init__.py | 0 lib/aci/tenant/audit/api.py | 48 + lib/aci/tenant/audit/info.py | 98 + lib/aci/tenant/audit/main.py | 8 + lib/aci/tenant/event/__init__.py | 0 lib/aci/tenant/event/api.py | 51 + lib/aci/tenant/event/info.py | 109 + lib/aci/tenant/event/main.py | 8 + lib/aci/tenant/fault/__init__.py | 0 lib/aci/tenant/fault/api.py | 112 + lib/aci/tenant/fault/info.py | 139 + lib/aci/tenant/fault/main.py | 8 + lib/aci/tenant/info.py | 151 + lib/aci/tenant/main.py | 20 + lib/aci/tenant/output.py | 294 + lib/aci/vrf/TODO.md | 7 + lib/aci/vrf/__init__.py | 0 .../vrf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes lib/aci/vrf/__pycache__/api.cpython-310.pyc | Bin 0 -> 2270 bytes lib/aci/vrf/__pycache__/info.cpython-310.pyc | Bin 0 -> 6705 bytes lib/aci/vrf/__pycache__/main.cpython-310.pyc | Bin 0 -> 845 bytes .../vrf/__pycache__/output.cpython-310.pyc | Bin 0 -> 6008 bytes lib/aci/vrf/api.py | 170 + lib/aci/vrf/audit/__init__.py | 0 lib/aci/vrf/audit/api.py | 48 + lib/aci/vrf/audit/info.py | 110 + lib/aci/vrf/audit/main.py | 8 + lib/aci/vrf/event/__init__.py | 0 lib/aci/vrf/event/api.py | 51 + lib/aci/vrf/event/info.py | 124 + lib/aci/vrf/event/main.py | 8 + lib/aci/vrf/fault/__init__.py | 0 lib/aci/vrf/fault/api.py | 118 + lib/aci/vrf/fault/info.py | 155 + lib/aci/vrf/fault/main.py | 8 + lib/aci/vrf/info.py | 428 + lib/aci/vrf/main.py | 23 + lib/aci/vrf/node/__init__.py | 0 lib/aci/vrf/node/api.py | 61 + lib/aci/vrf/node/info.py | 82 + lib/aci/vrf/node/main.py | 8 + lib/aci/vrf/output.py | 531 + lib/aci/ws.py | 146 + lib/context.py | 74 + lib/cvim/__init__.py | 0 lib/cvim/main.py | 25 + lib/cvim/output.py | 11 + lib/cvim/settings.py | 324 + lib/endpoint_helper.py | 129 + lib/file_helper.py | 188 + lib/filter_helper.py | 583 + lib/helm/__init__.py | 0 lib/helm/chart/__init__.py | 0 lib/helm/chart/main.py | 340 + lib/helm/chart/output.py | 126 + lib/helm/main.py | 26 + lib/helm/output.py | 19 + lib/helm/release/__init__.py | 0 lib/helm/release/main.py | 468 + lib/helm/release/output.py | 132 + lib/iaccount_helper.py | 211 + lib/imc/__init__.py | 0 lib/imc/cli/__init__.py | 0 lib/imc/cli/adapter/__init__.py | 0 lib/imc/cli/adapter/main.py | 113 + lib/imc/cli/adapter/output.py | 15 + lib/imc/cli/admin/__init__.py | 0 lib/imc/cli/admin/main.py | 79 + lib/imc/cli/admin/output.py | 56 + lib/imc/cli/bbu/__init__.py | 0 lib/imc/cli/bbu/main.py | 139 + lib/imc/cli/bbu/output.py | 15 + lib/imc/cli/bios/__init__.py | 0 lib/imc/cli/bios/main.py | 181 + lib/imc/cli/bios/output.py | 63 + lib/imc/cli/boot/__init__.py | 0 lib/imc/cli/boot/main.py | 342 + lib/imc/cli/boot/output.py | 18 + lib/imc/cli/cache.py | 77 + lib/imc/cli/chassis/__init__.py | 0 lib/imc/cli/chassis/main.py | 92 + lib/imc/cli/chassis/output.py | 15 + lib/imc/cli/command.py | 330 + lib/imc/cli/cpu/__init__.py | 0 lib/imc/cli/cpu/main.py | 169 + lib/imc/cli/cpu/output.py | 16 + lib/imc/cli/dimm/__init__.py | 0 lib/imc/cli/dimm/main.py | 168 + lib/imc/cli/dimm/output.py | 10 + lib/imc/cli/endpoint.py | 135 + lib/imc/cli/fault/__init__.py | 0 lib/imc/cli/fault/main.py | 207 + lib/imc/cli/fault/output.py | 9 + lib/imc/cli/flex/__init__.py | 0 lib/imc/cli/flex/main.py | 70 + lib/imc/cli/flex/output.py | 15 + lib/imc/cli/fw/__init__.py | 0 lib/imc/cli/fw/main.py | 74 + lib/imc/cli/fw/output.py | 15 + lib/imc/cli/hardware/__init__.py | 0 lib/imc/cli/hardware/main.py | 61 + lib/imc/cli/hardware/output.py | 47 + lib/imc/cli/hdd/__init__.py | 0 lib/imc/cli/hdd/main.py | 159 + lib/imc/cli/hdd/output.py | 10 + lib/imc/cli/http/__init__.py | 0 lib/imc/cli/http/main.py | 72 + lib/imc/cli/http/output.py | 12 + lib/imc/cli/ip/__init__.py | 0 lib/imc/cli/ip/main.py | 290 + lib/imc/cli/ip/output.py | 38 + lib/imc/cli/ipmi/__init__.py | 0 lib/imc/cli/ipmi/main.py | 67 + lib/imc/cli/ipmi/output.py | 12 + lib/imc/cli/kvm/__init__.py | 0 lib/imc/cli/kvm/main.py | 69 + lib/imc/cli/kvm/output.py | 12 + lib/imc/cli/led/__init__.py | 0 lib/imc/cli/led/main.py | 82 + lib/imc/cli/led/output.py | 12 + lib/imc/cli/memory/__init__.py | 0 lib/imc/cli/memory/main.py | 74 + lib/imc/cli/memory/output.py | 15 + lib/imc/cli/net/__init__.py | 0 lib/imc/cli/net/main.py | 149 + lib/imc/cli/net/output.py | 10 + lib/imc/cli/ntp/__init__.py | 0 lib/imc/cli/ntp/main.py | 72 + lib/imc/cli/ntp/output.py | 12 + lib/imc/cli/output.py | 456 + lib/imc/cli/pci/__init__.py | 0 lib/imc/cli/pci/main.py | 150 + lib/imc/cli/pci/output.py | 10 + lib/imc/cli/psu/__init__.py | 0 lib/imc/cli/psu/main.py | 91 + lib/imc/cli/psu/output.py | 16 + lib/imc/cli/redfish/__init__.py | 0 lib/imc/cli/redfish/main.py | 93 + lib/imc/cli/redfish/output.py | 12 + lib/imc/cli/sel/__init__.py | 0 lib/imc/cli/sel/main.py | 68 + lib/imc/cli/sel/output.py | 12 + lib/imc/cli/sensor/__init__.py | 0 lib/imc/cli/sensor/main.py | 410 + lib/imc/cli/sensor/output.py | 65 + lib/imc/cli/smtp/__init__.py | 0 lib/imc/cli/smtp/main.py | 105 + lib/imc/cli/smtp/output.py | 15 + lib/imc/cli/snmp/__init__.py | 0 lib/imc/cli/snmp/main.py | 225 + lib/imc/cli/snmp/output.py | 9 + lib/imc/cli/sol/__init__.py | 0 lib/imc/cli/sol/main.py | 68 + lib/imc/cli/sol/output.py | 12 + lib/imc/cli/ssh/__init__.py | 0 lib/imc/cli/ssh/main.py | 69 + lib/imc/cli/ssh/output.py | 12 + lib/imc/cli/storageadapter/__init__.py | 0 lib/imc/cli/storageadapter/main.py | 120 + lib/imc/cli/storageadapter/output.py | 16 + lib/imc/cli/syslog/__init__.py | 0 lib/imc/cli/syslog/main.py | 148 + lib/imc/cli/syslog/output.py | 9 + lib/imc/cli/tpm/__init__.py | 0 lib/imc/cli/tpm/main.py | 73 + lib/imc/cli/tpm/output.py | 15 + lib/imc/cli/user.py | 50 + lib/imc/cli/utilization/__init__.py | 0 lib/imc/cli/utilization/main.py | 66 + lib/imc/cli/utilization/output.py | 15 + lib/imc/cli/version/__init__.py | 0 lib/imc/cli/version/main.py | 68 + lib/imc/cli/version/output.py | 15 + lib/imc/cli/vmedia/__init__.py | 0 lib/imc/cli/vmedia/main.py | 68 + lib/imc/cli/vmedia/output.py | 12 + lib/imc/cli/xml/__init__.py | 0 lib/imc/cli/xml/main.py | 67 + lib/imc/cli/xml/output.py | 12 + lib/imc/settings.py | 216 + lib/info_helper.py | 106 + lib/input_validator.py | 833 + lib/intersight/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../adapter_ext_eth_interface.cpython-310.pyc | Bin 0 -> 5242 bytes ...adapter_host_eth_interface.cpython-310.pyc | Bin 0 -> 4745 bytes .../adapter_host_fc_interface.cpython-310.pyc | Bin 0 -> 4657 bytes .../__pycache__/adapter_unit.cpython-310.pyc | Bin 0 -> 6843 bytes ...evice_contract_information.cpython-310.pyc | Bin 0 -> 7915 bytes .../asset_device_registration.cpython-310.pyc | Bin 0 -> 5718 bytes .../bios_boot_mode.cpython-310.pyc | Bin 0 -> 3554 bytes .../boot_cdd_device.cpython-310.pyc | Bin 0 -> 924 bytes .../boot_device_boot_mode.cpython-310.pyc | Bin 0 -> 3599 bytes .../boot_device_boot_security.cpython-310.pyc | Bin 0 -> 3605 bytes .../boot_hdd_device.cpython-310.pyc | Bin 0 -> 3802 bytes .../boot_iscsi_device.cpython-310.pyc | Bin 0 -> 936 bytes .../boot_nvme_device.cpython-310.pyc | Bin 0 -> 930 bytes .../boot_pxe_device.cpython-310.pyc | Bin 0 -> 924 bytes .../boot_san_device.cpython-310.pyc | Bin 0 -> 924 bytes .../boot_sd_device.cpython-310.pyc | Bin 0 -> 918 bytes .../boot_uefi_device.cpython-310.pyc | Bin 0 -> 935 bytes .../boot_usb_device.cpython-310.pyc | Bin 0 -> 924 bytes .../boot_vmedia_device.cpython-310.pyc | Bin 0 -> 942 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 3234 bytes .../chassis_extra_attributes.cpython-310.pyc | Bin 0 -> 16729 bytes .../__pycache__/chassis_info.cpython-310.pyc | Bin 0 -> 1533 bytes .../chassis_profile.cpython-310.pyc | Bin 0 -> 3700 bytes .../__pycache__/chassiz_info.cpython-310.pyc | Bin 0 -> 659 bytes .../__pycache__/compute_blade.cpython-310.pyc | Bin 0 -> 8546 bytes .../__pycache__/compute_board.cpython-310.pyc | Bin 0 -> 6488 bytes .../compute_extra_attributes.cpython-310.pyc | Bin 0 -> 37868 bytes .../compute_filter.cpython-310.pyc | Bin 0 -> 9564 bytes .../__pycache__/compute_info.cpython-310.pyc | Bin 0 -> 3574 bytes .../__pycache__/compute_rack.cpython-310.pyc | Bin 0 -> 10615 bytes .../compute_redfish.cpython-310.pyc | Bin 0 -> 634 bytes .../compute_server_setting.cpython-310.pyc | Bin 0 -> 6025 bytes .../__pycache__/computes_info.cpython-310.pyc | Bin 0 -> 16634 bytes .../computes_summary.cpython-310.pyc | Bin 0 -> 10135 bytes .../computes_worfklow.cpython-310.pyc | Bin 0 -> 3926 bytes .../__pycache__/cond_alarm.cpython-310.pyc | Bin 0 -> 3814 bytes .../cond_hclstatus.cpython-310.pyc | Bin 0 -> 5447 bytes .../cond_hclstatus_detail.cpython-310.pyc | Bin 0 -> 4318 bytes .../equipment_chassis.cpython-310.pyc | Bin 0 -> 9743 bytes .../__pycache__/equipment_fan.cpython-310.pyc | Bin 0 -> 4936 bytes .../equipment_fan_control.cpython-310.pyc | Bin 0 -> 3439 bytes .../equipment_fan_module.cpython-310.pyc | Bin 0 -> 5045 bytes .../equipment_iocard.cpython-310.pyc | Bin 0 -> 17426 bytes .../__pycache__/equipment_led.cpython-310.pyc | Bin 0 -> 3788 bytes .../__pycache__/equipment_psu.cpython-310.pyc | Bin 0 -> 3213 bytes .../equipment_psu_control.cpython-310.pyc | Bin 0 -> 4048 bytes .../__pycache__/equipment_tpm.cpython-310.pyc | Bin 0 -> 4562 bytes .../ethernet_host_port.cpython-310.pyc | Bin 0 -> 4651 bytes .../ethernet_network_port.cpython-310.pyc | Bin 0 -> 4665 bytes .../ethernet_physical_port.cpython-310.pyc | Bin 0 -> 5004 bytes .../hcl_operating_system.cpython-310.pyc | Bin 0 -> 2521 bytes ...cl_operating_system_vendor.cpython-310.pyc | Bin 0 -> 1210 bytes .../intersight_common.cpython-310.pyc | Bin 0 -> 6579 bytes .../__pycache__/memory_unit.cpython-310.pyc | Bin 0 -> 5808 bytes .../network_element_summary.cpython-310.pyc | Bin 0 -> 5236 bytes .../__pycache__/organization.cpython-310.pyc | Bin 0 -> 2729 bytes .../os_configuration_file.cpython-310.pyc | Bin 0 -> 1101 bytes .../__pycache__/os_image.cpython-310.pyc | Bin 0 -> 11489 bytes .../__pycache__/os_install.cpython-310.pyc | Bin 0 -> 4343 bytes .../__pycache__/pci_device.cpython-310.pyc | Bin 0 -> 4129 bytes .../power_control_state.cpython-310.pyc | Bin 0 -> 3795 bytes .../processor_unit.cpython-310.pyc | Bin 0 -> 5201 bytes .../running_firmware.cpython-310.pyc | Bin 0 -> 5048 bytes .../__pycache__/scu.cpython-310.pyc | Bin 0 -> 11252 bytes .../__pycache__/search_item.cpython-310.pyc | Bin 0 -> 651 bytes .../server_profile.cpython-310.pyc | Bin 0 -> 5010 bytes .../__pycache__/settings.cpython-310.pyc | Bin 0 -> 3336 bytes ...oftware_repository_catalog.cpython-310.pyc | Bin 0 -> 1830 bytes .../storage_controller.cpython-310.pyc | Bin 0 -> 9390 bytes .../storage_physical_disk.cpython-310.pyc | Bin 0 -> 9868 bytes ...torage_physical_disk_usage.cpython-310.pyc | Bin 0 -> 4264 bytes .../storage_virtual_drive.cpython-310.pyc | Bin 0 -> 9479 bytes .../tam_advisory_instance.cpython-310.pyc | Bin 0 -> 3527 bytes .../tam_security_advisory.cpython-310.pyc | Bin 0 -> 16805 bytes .../__pycache__/workflow.cpython-310.pyc | Bin 0 -> 11204 bytes .../__pycache__/workflow_info.cpython-310.pyc | Bin 0 -> 3314 bytes .../workflow_task_info.cpython-310.pyc | Bin 0 -> 6726 bytes .../adapter_ext_eth_interface/__init__.py | 0 .../adapter_ext_eth_interface/class.md | 97 + .../adapter_ext_eth_interface/info.py | 24 + .../adapter_ext_eth_interface/main.py | 8 + .../adapter_host_eth_interface/__init__.py | 0 .../adapter_host_eth_interface/class.md | 91 + .../adapter_host_eth_interface/info.py | 22 + .../adapter_host_eth_interface/main.py | 8 + .../adapter_host_fc_interface/__init__.py | 0 .../adapter_host_fc_interface/class.md | 93 + .../adapter_host_fc_interface/info.py | 19 + .../adapter_host_fc_interface/main.py | 8 + lib/intersight/adapter_unit/__init__.py | 0 lib/intersight/adapter_unit/class.md | 130 + lib/intersight/adapter_unit/info.py | 49 + lib/intersight/adapter_unit/main.py | 8 + .../__init__.py | 0 .../class.md | 171 + .../asset_device_contract_information/info.py | 27 + .../asset_device_contract_information/main.py | 8 + .../asset_device_registration/__init__.py | 0 .../asset_device_registration/class.md | 122 + .../asset_device_registration/info.py | 23 + .../asset_device_registration/main.py | 26 + lib/intersight/bios_boot_mode/__init__.py | 0 lib/intersight/bios_boot_mode/class.md | 69 + lib/intersight/bios_boot_mode/info.py | 11 + lib/intersight/bios_boot_mode/main.py | 9 + lib/intersight/bios_unit/__init__.py | 0 lib/intersight/bios_unit/bios_unit.py | 7 + lib/intersight/bios_unit/class.md | 85 + lib/intersight/boot_cdd_device/__init__.py | 0 lib/intersight/boot_cdd_device/info.py | 14 + lib/intersight/boot_cdd_device/main.py | 9 + .../boot_device_boot_mode/__init__.py | 0 lib/intersight/boot_device_boot_mode/class.md | 69 + lib/intersight/boot_device_boot_mode/info.py | 11 + lib/intersight/boot_device_boot_mode/main.py | 9 + .../boot_device_boot_security/__init__.py | 0 .../boot_device_boot_security/class.md | 68 + .../boot_device_boot_security/info.py | 11 + .../boot_device_boot_security/main.py | 9 + lib/intersight/boot_hdd_device/__init__.py | 0 lib/intersight/boot_hdd_device/class.md | 77 + lib/intersight/boot_hdd_device/info.py | 14 + lib/intersight/boot_hdd_device/main.py | 9 + lib/intersight/boot_iscsi_device/__init__.py | 0 lib/intersight/boot_iscsi_device/info.py | 14 + lib/intersight/boot_iscsi_device/main.py | 9 + lib/intersight/boot_nvme_device/__init__.py | 0 lib/intersight/boot_nvme_device/info.py | 14 + lib/intersight/boot_nvme_device/main.py | 9 + lib/intersight/boot_pxe_device/__init__.py | 0 lib/intersight/boot_pxe_device/info.py | 14 + lib/intersight/boot_pxe_device/main.py | 9 + lib/intersight/boot_san_device/__init__.py | 0 lib/intersight/boot_san_device/info.py | 14 + lib/intersight/boot_san_device/main.py | 9 + lib/intersight/boot_sd_device/__init__.py | 0 lib/intersight/boot_sd_device/info.py | 14 + lib/intersight/boot_sd_device/main.py | 9 + lib/intersight/boot_uefi_device/__init__.py | 0 lib/intersight/boot_uefi_device/info.py | 14 + lib/intersight/boot_uefi_device/main.py | 9 + lib/intersight/boot_usb_device/__init__.py | 0 lib/intersight/boot_usb_device/info.py | 14 + lib/intersight/boot_usb_device/main.py | 9 + lib/intersight/boot_vmedia_device/__init__.py | 0 lib/intersight/boot_vmedia_device/info.py | 14 + lib/intersight/boot_vmedia_device/main.py | 9 + lib/intersight/bot_output.py | 3308 ++ lib/intersight/cache.py | 112 + lib/intersight/chassis.py | 70 + lib/intersight/chassis_cache.py | 2391 + lib/intersight/chassis_extra_attributes.py | 1011 + lib/intersight/chassis_filter.py | 84 + lib/intersight/chassis_info.py | 45 + lib/intersight/chassis_mo.py | 26 + lib/intersight/chassis_output.py | 956 + lib/intersight/chassis_profile/__init__.py | 0 lib/intersight/chassis_profile/class.md | 78 + lib/intersight/chassis_profile/info.py | 10 + lib/intersight/chassis_profile/main.py | 9 + lib/intersight/compute.py | 291 + lib/intersight/compute_aci_output.py | 328 + lib/intersight/compute_blade/__init__.py | 0 lib/intersight/compute_blade/class.md | 184 + lib/intersight/compute_blade/info.py | 77 + lib/intersight/compute_blade/main.py | 9 + lib/intersight/compute_board/__init__.py | 0 lib/intersight/compute_board/class.md | 137 + lib/intersight/compute_board/info.py | 40 + lib/intersight/compute_board/main.py | 9 + lib/intersight/compute_cache.py | 4486 ++ lib/intersight/compute_context.py | 38 + lib/intersight/compute_extra_attributes.py | 2751 + lib/intersight/compute_filter.py | 1576 + lib/intersight/compute_info.py | 177 + lib/intersight/compute_mo.py | 71 + lib/intersight/compute_nx_output.py | 329 + lib/intersight/compute_output.py | 2790 + lib/intersight/compute_rack/__init__.py | 0 lib/intersight/compute_rack/class.md | 260 + lib/intersight/compute_rack/main.py | 7 + .../compute_server_setting/__init__.py | 0 .../compute_server_setting/class.md | 124 + lib/intersight/compute_server_setting/info.py | 24 + lib/intersight/compute_server_setting/main.py | 15 + lib/intersight/computes_summary.py | 552 + lib/intersight/computes_worfklow.py | 170 + lib/intersight/cond_alarm/__init__.py | 0 lib/intersight/cond_alarm/class.md | 66 + lib/intersight/cond_alarm/info.py | 155 + lib/intersight/cond_alarm/main.py | 9 + lib/intersight/cond_alarm/output.py | 169 + lib/intersight/cond_hclstatus/__init__.py | 0 lib/intersight/cond_hclstatus/class.md | 98 + lib/intersight/cond_hclstatus/info.py | 35 + lib/intersight/cond_hclstatus/main.py | 9 + .../cond_hclstatus_detail/__init__.py | 0 lib/intersight/cond_hclstatus_detail/class.md | 77 + lib/intersight/cond_hclstatus_detail/info.py | 40 + lib/intersight/cond_hclstatus_detail/main.py | 9 + lib/intersight/equipment_chassis/__init__.py | 0 lib/intersight/equipment_chassis/class.md | 210 + lib/intersight/equipment_chassis/main.py | 36 + .../equipment_expander_module/__init__.py | 0 .../equipment_expander_module/class.md | 97 + .../equipment_expander_module/info.py | 47 + .../equipment_expander_module/main.py | 9 + lib/intersight/equipment_fan/__init__.py | 0 lib/intersight/equipment_fan/class.md | 93 + lib/intersight/equipment_fan/info.py | 84 + lib/intersight/equipment_fan/main.py | 9 + .../equipment_fan_control/__init__.py | 0 lib/intersight/equipment_fan_control/class.md | 68 + lib/intersight/equipment_fan_control/info.py | 16 + lib/intersight/equipment_fan_control/main.py | 9 + .../equipment_fan_module/__init__.py | 0 lib/intersight/equipment_fan_module/class.md | 95 + lib/intersight/equipment_fan_module/info.py | 51 + lib/intersight/equipment_fan_module/main.py | 9 + lib/intersight/equipment_iocard/__init__.py | 0 lib/intersight/equipment_iocard/class.md | 357 + lib/intersight/equipment_iocard/info.py | 103 + lib/intersight/equipment_iocard/main.py | 9 + lib/intersight/equipment_led/__init__.py | 0 lib/intersight/equipment_led/class.md | 74 + lib/intersight/equipment_led/info.py | 10 + lib/intersight/equipment_led/main.py | 9 + lib/intersight/equipment_psu/__init__.py | 0 lib/intersight/equipment_psu/class.md | 51 + lib/intersight/equipment_psu/info.py | 78 + lib/intersight/equipment_psu/main.py | 10 + lib/intersight/equipment_psu/output.py | 59 + .../equipment_psu_control/__init__.py | 0 lib/intersight/equipment_psu_control/class.md | 81 + lib/intersight/equipment_psu_control/info.py | 40 + lib/intersight/equipment_psu_control/main.py | 9 + lib/intersight/equipment_tpm/__init__.py | 0 lib/intersight/equipment_tpm/class.md | 85 + lib/intersight/equipment_tpm/info.py | 45 + lib/intersight/equipment_tpm/main.py | 9 + lib/intersight/ethernet_host_port/__init__.py | 0 lib/intersight/ethernet_host_port/class.md | 83 + lib/intersight/ethernet_host_port/info.py | 39 + lib/intersight/ethernet_host_port/main.py | 9 + .../ethernet_network_port/__init__.py | 0 lib/intersight/ethernet_network_port/class.md | 85 + lib/intersight/ethernet_network_port/info.py | 31 + lib/intersight/ethernet_network_port/main.py | 9 + .../ethernet_physical_port/__init__.py | 0 .../ethernet_physical_port/class.md | 103 + lib/intersight/ethernet_physical_port/info.py | 26 + lib/intersight/ethernet_physical_port/main.py | 9 + lib/intersight/graphics_card/__init__.py | 0 lib/intersight/graphics_card/class.md | 250 + lib/intersight/graphics_card/info.py | 50 + lib/intersight/graphics_card/main.py | 9 + .../graphics_controller/__init__.py | 0 lib/intersight/graphics_controller/class.md | 79 + lib/intersight/graphics_controller/info.py | 45 + lib/intersight/graphics_controller/main.py | 9 + .../hcl_operating_system/__init__.py | 0 lib/intersight/hcl_operating_system/class.md | 24 + lib/intersight/hcl_operating_system/main.py | 44 + .../hcl_operating_system_vendor/__init__.py | 0 .../hcl_operating_system_vendor/class.md | 18 + .../hcl_operating_system_vendor/main.py | 7 + lib/intersight/intersight_common.py | 269 + lib/intersight/lcm/__init__.py | 0 lib/intersight/lcm/common.py | 300 + lib/intersight/lcm/locator.py | 79 + lib/intersight/lcm/power.py | 99 + lib/intersight/lcm/tag.py | 214 + .../management_interface/__init__.py | 0 lib/intersight/management_interface/class.md | 89 + lib/intersight/management_interface/info.py | 29 + lib/intersight/management_interface/main.py | 9 + lib/intersight/memory_unit/__init__.py | 0 lib/intersight/memory_unit/class.md | 112 + lib/intersight/memory_unit/info.py | 102 + lib/intersight/memory_unit/main.py | 9 + .../network_element_summary/__init__.py | 0 .../network_element_summary/class.md | 103 + .../network_element_summary/info.py | 50 + .../network_element_summary/main.py | 9 + lib/intersight/organization/__init__.py | 0 lib/intersight/organization/class.md | 41 + lib/intersight/organization/main.py | 42 + .../os_configuration_file/__init__.py | 0 lib/intersight/os_configuration_file/main.py | 24 + lib/intersight/os_image/__init__.py | 0 lib/intersight/os_image/os_image.py | 426 + lib/intersight/os_install/__init__.py | 0 lib/intersight/os_install/main.py | 169 + lib/intersight/pci_device/__init__.py | 0 lib/intersight/pci_device/class.md | 79 + lib/intersight/pci_device/info.py | 40 + lib/intersight/pci_device/main.py | 9 + lib/intersight/pci_node/__init__.py | 0 lib/intersight/pci_node/class.md | 80 + lib/intersight/pci_node/info.py | 46 + lib/intersight/pci_node/main.py | 9 + .../power_control_state/__init__.py | 0 lib/intersight/power_control_state/class.md | 67 + lib/intersight/power_control_state/info.py | 58 + lib/intersight/power_control_state/main.py | 9 + lib/intersight/processor_unit/__init__.py | 0 lib/intersight/processor_unit/class.md | 95 + lib/intersight/processor_unit/info.py | 72 + lib/intersight/processor_unit/main.py | 9 + lib/intersight/running_firmware/__init__.py | 0 lib/intersight/running_firmware/class.md | 84 + lib/intersight/running_firmware/info.py | 46 + lib/intersight/running_firmware/main.py | 9 + lib/intersight/scu/__init__.py | 0 lib/intersight/scu/class.md | 81 + lib/intersight/scu/main.py | 327 + lib/intersight/search_item/__init__.py | 0 lib/intersight/search_item/main.py | 7 + lib/intersight/server_profile/__init__.py | 0 lib/intersight/server_profile/class.md | 99 + lib/intersight/server_profile/info.py | 45 + lib/intersight/server_profile/main.py | 9 + lib/intersight/settings.py | 159 + .../software_repository_catalog/__init__.py | 0 .../software_repository_catalog/class.md | 26 + .../software_repository_catalog/main.py | 44 + lib/intersight/storage_controller/__init__.py | 0 lib/intersight/storage_controller/class.md | 163 + lib/intersight/storage_controller/info.py | 113 + lib/intersight/storage_controller/main.py | 51 + lib/intersight/storage_disk_group/__init__.py | 0 lib/intersight/storage_disk_group/class.md | 194 + lib/intersight/storage_disk_group/main.py | 7 + .../storage_physical_disk/__init__.py | 0 lib/intersight/storage_physical_disk/class.md | 160 + lib/intersight/storage_physical_disk/info.py | 164 + lib/intersight/storage_physical_disk/main.py | 39 + .../storage_physical_disk_usage/__init__.py | 0 .../storage_physical_disk_usage/class.md | 91 + .../storage_physical_disk_usage/main.py | 7 + .../storage_virtual_drive/__init__.py | 0 lib/intersight/storage_virtual_drive/class.md | 148 + lib/intersight/storage_virtual_drive/info.py | 136 + lib/intersight/storage_virtual_drive/main.py | 36 + .../tam_advisory_definition/__init__.py | 0 .../tam_advisory_definition/class.md | 171 + .../tam_advisory_definition/info.py | 34 + .../tam_advisory_definition/main.py | 9 + .../tam_advisory_instance/__init__.py | 0 lib/intersight/tam_advisory_instance/class.md | 61 + lib/intersight/tam_advisory_instance/info.py | 13 + lib/intersight/tam_advisory_instance/main.py | 9 + .../tam_advisory_instance/output.py | 160 + .../tam_security_advisory/__init__.py | 0 lib/intersight/tam_security_advisory/class.md | 334 + lib/intersight/tam_security_advisory/info.py | 40 + lib/intersight/tam_security_advisory/main.py | 9 + lib/intersight/validations.py | 687 + .../virtualization_vmwarehost/__init__.py | 0 .../virtualization_vmwarehost/class.md | 172 + .../virtualization_vmwarehost/main.py | 7 + lib/intersight/workflow/__init__.py | 0 lib/intersight/workflow/class.md | 216 + lib/intersight/workflow/info.py | 82 + lib/intersight/workflow/main.py | 10 + lib/intersight/workflow_info.py | 175 + lib/intersight/workflow_task_info/__init__.py | 0 lib/intersight/workflow_task_info/class.md | 109 + lib/intersight/workflow_task_info/main.py | 57 + lib/ip_helper.py | 445 + lib/isctl_helper.py | 218 + lib/iso/__init__.py | 0 lib/iso/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 140 bytes lib/iso/__pycache__/kickstart.cpython-310.pyc | Bin 0 -> 3830 bytes lib/iso/autoinstall.py | 226 + lib/iso/kickstart.py | 156 + lib/iwo/__init__.py | 0 lib/iwo/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 140 bytes lib/iwo/__pycache__/action.cpython-310.pyc | Bin 0 -> 5671 bytes .../__pycache__/application.cpython-310.pyc | Bin 0 -> 7206 bytes lib/iwo/__pycache__/chassis.cpython-310.pyc | Bin 0 -> 1558 bytes lib/iwo/__pycache__/client.cpython-310.pyc | Bin 0 -> 3988 bytes lib/iwo/__pycache__/cluster.cpython-310.pyc | Bin 0 -> 1609 bytes lib/iwo/__pycache__/container.cpython-310.pyc | Bin 0 -> 7085 bytes lib/iwo/__pycache__/dc.cpython-310.pyc | Bin 0 -> 1931 bytes lib/iwo/__pycache__/disk.cpython-310.pyc | Bin 0 -> 1510 bytes lib/iwo/__pycache__/main.cpython-310.pyc | Bin 0 -> 5741 bytes lib/iwo/__pycache__/namespace.cpython-310.pyc | Bin 0 -> 1600 bytes lib/iwo/__pycache__/network.cpython-310.pyc | Bin 0 -> 1558 bytes lib/iwo/__pycache__/phy.cpython-310.pyc | Bin 0 -> 8249 bytes lib/iwo/__pycache__/pod.cpython-310.pyc | Bin 0 -> 5676 bytes lib/iwo/__pycache__/region.cpython-310.pyc | Bin 0 -> 1537 bytes lib/iwo/__pycache__/service.cpython-310.pyc | Bin 0 -> 6024 bytes lib/iwo/__pycache__/spec.cpython-310.pyc | Bin 0 -> 1522 bytes lib/iwo/__pycache__/storage.cpython-310.pyc | Bin 0 -> 7343 bytes lib/iwo/__pycache__/switch.cpython-310.pyc | Bin 0 -> 1537 bytes lib/iwo/__pycache__/target.cpython-310.pyc | Bin 0 -> 811 bytes lib/iwo/__pycache__/vdc.cpython-310.pyc | Bin 0 -> 7761 bytes lib/iwo/__pycache__/vm.cpython-310.pyc | Bin 0 -> 3558 bytes lib/iwo/__pycache__/volume.cpython-310.pyc | Bin 0 -> 1558 bytes lib/iwo/__pycache__/workload.cpython-310.pyc | Bin 0 -> 1609 bytes lib/iwo/__pycache__/zone.cpython-310.pyc | Bin 0 -> 1531 bytes lib/iwo/action.py | 297 + lib/iwo/application.py | 453 + lib/iwo/chassis.py | 65 + lib/iwo/client.py | 199 + lib/iwo/cluster.py | 65 + lib/iwo/container.py | 453 + lib/iwo/dc.py | 113 + lib/iwo/disk.py | 65 + lib/iwo/lcm/__init__.py | 0 .../lcm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 144 bytes lib/iwo/lcm/__pycache__/main.cpython-310.pyc | Bin 0 -> 742 bytes lib/iwo/lcm/main.py | 19 + lib/iwo/lcm/ocp/__init__.py | 0 .../ocp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../ocp/__pycache__/common.cpython-310.pyc | Bin 0 -> 1875 bytes .../ocp/__pycache__/create.cpython-310.pyc | Bin 0 -> 5534 bytes .../ocp/__pycache__/delete.cpython-310.pyc | Bin 0 -> 3793 bytes .../lcm/ocp/__pycache__/get.cpython-310.pyc | Bin 0 -> 5469 bytes .../lcm/ocp/__pycache__/main.cpython-310.pyc | Bin 0 -> 870 bytes .../ocp/__pycache__/template.cpython-310.pyc | Bin 0 -> 1575 bytes lib/iwo/lcm/ocp/create.py | 240 + lib/iwo/lcm/ocp/delete.py | 141 + lib/iwo/lcm/ocp/get.py | 212 + lib/iwo/lcm/ocp/main.py | 16 + lib/iwo/lcm/ocp/template.py | 53 + lib/iwo/main.py | 303 + lib/iwo/namespace.py | 65 + lib/iwo/network.py | 65 + lib/iwo/phy.py | 570 + lib/iwo/pod.py | 333 + lib/iwo/region.py | 65 + lib/iwo/service.py | 363 + lib/iwo/spec.py | 65 + lib/iwo/storage.py | 506 + lib/iwo/switch.py | 65 + lib/iwo/target.py | 18 + lib/iwo/vdc.py | 525 + lib/iwo/vm.py | 192 + lib/iwo/volume.py | 65 + lib/iwo/workload.py | 65 + lib/iwo/zone.py | 65 + lib/k8s/README.md | 49 + lib/k8s/__init__.py | 0 lib/k8s/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 140 bytes lib/k8s/__pycache__/common.cpython-310.pyc | Bin 0 -> 4611 bytes lib/k8s/__pycache__/main.cpython-310.pyc | Bin 0 -> 7560 bytes lib/k8s/__pycache__/nodes.cpython-310.pyc | Bin 0 -> 15538 bytes lib/k8s/alert_manager/__init__.py | 0 lib/k8s/alert_manager/api.py | 48 + lib/k8s/alert_manager/info.py | 93 + lib/k8s/alert_manager/main.py | 11 + lib/k8s/alert_manager/output.py | 41 + lib/k8s/alert_manager_config/__init__.py | 0 lib/k8s/alert_manager_config/api.py | 48 + lib/k8s/alert_manager_config/info.py | 83 + lib/k8s/alert_manager_config/main.py | 11 + lib/k8s/alert_manager_config/output.py | 33 + lib/k8s/api.py | 196 + lib/k8s/cluster_operator/__init__.py | 0 lib/k8s/cluster_operator/api.py | 48 + lib/k8s/cluster_operator/info.py | 253 + lib/k8s/cluster_operator/main.py | 11 + lib/k8s/cluster_operator/output.py | 123 + lib/k8s/cluster_quota/__init__.py | 0 lib/k8s/cluster_quota/api.py | 48 + lib/k8s/cluster_quota/info.py | 83 + lib/k8s/cluster_quota/main.py | 11 + lib/k8s/cluster_quota/output.py | 33 + lib/k8s/cluster_role_binding/__init__.py | 0 lib/k8s/cluster_role_binding/api.py | 48 + lib/k8s/cluster_role_binding/info.py | 119 + lib/k8s/cluster_role_binding/main.py | 11 + lib/k8s/cluster_role_binding/output.py | 43 + lib/k8s/cluster_service_version/__init__.py | 0 lib/k8s/cluster_service_version/api.py | 48 + lib/k8s/cluster_service_version/info.py | 133 + lib/k8s/cluster_service_version/main.py | 11 + lib/k8s/cluster_service_version/output.py | 47 + lib/k8s/cni/__init__.py | 0 lib/k8s/cni/api.py | 48 + lib/k8s/cni/info.py | 88 + lib/k8s/cni/main.py | 11 + lib/k8s/cni/output.py | 43 + lib/k8s/common.py | 303 + lib/k8s/config_map/__init__.py | 0 lib/k8s/config_map/api.py | 53 + lib/k8s/config_map/info.py | 161 + lib/k8s/config_map/main.py | 11 + lib/k8s/config_map/output.py | 199 + lib/k8s/configmap.py | 34 + .../custom_resource_definition/__init__.py | 0 lib/k8s/custom_resource_definition/api.py | 48 + lib/k8s/custom_resource_definition/info.py | 78 + lib/k8s/custom_resource_definition/main.py | 11 + lib/k8s/custom_resource_definition/output.py | 33 + lib/k8s/daemon_set/__init__.py | 0 lib/k8s/daemon_set/api.py | 48 + lib/k8s/daemon_set/info.py | 140 + lib/k8s/daemon_set/main.py | 11 + lib/k8s/daemon_set/output.py | 118 + lib/k8s/data_volume/__init__.py | 0 lib/k8s/data_volume/api.py | 108 + lib/k8s/data_volume/info.py | 190 + lib/k8s/data_volume/main.py | 11 + lib/k8s/data_volume/output.py | 62 + lib/k8s/deployment/__init__.py | 0 lib/k8s/deployment/api.py | 48 + lib/k8s/deployment/info.py | 118 + lib/k8s/deployment/main.py | 11 + lib/k8s/deployment/output.py | 96 + lib/k8s/deployment_config/__init__.py | 0 lib/k8s/deployment_config/api.py | 48 + lib/k8s/deployment_config/info.py | 83 + lib/k8s/deployment_config/main.py | 11 + lib/k8s/deployment_config/output.py | 33 + lib/k8s/egress_ip/__init__.py | 0 lib/k8s/egress_ip/api.py | 48 + lib/k8s/egress_ip/info.py | 83 + lib/k8s/egress_ip/main.py | 11 + lib/k8s/egress_ip/output.py | 33 + lib/k8s/egress_router/__init__.py | 0 lib/k8s/egress_router/api.py | 48 + lib/k8s/egress_router/info.py | 83 + lib/k8s/egress_router/main.py | 11 + lib/k8s/egress_router/output.py | 33 + lib/k8s/endpoint/__init__.py | 0 lib/k8s/endpoint/api.py | 53 + lib/k8s/endpoint/info.py | 115 + lib/k8s/endpoint/main.py | 11 + lib/k8s/endpoint/output.py | 37 + lib/k8s/event/__init__.py | 0 lib/k8s/event/api.py | 53 + lib/k8s/event/info.py | 141 + lib/k8s/event/main.py | 11 + lib/k8s/event/output.py | 68 + lib/k8s/ingress/__init__.py | 0 lib/k8s/ingress/api.py | 48 + lib/k8s/ingress/info.py | 83 + lib/k8s/ingress/main.py | 11 + lib/k8s/ingress/output.py | 33 + lib/k8s/kubevirt/__init__.py | 0 lib/k8s/kubevirt/api.py | 48 + lib/k8s/kubevirt/info.py | 78 + lib/k8s/kubevirt/main.py | 11 + lib/k8s/kubevirt/output.py | 33 + lib/k8s/limit/__init__.py | 0 lib/k8s/limit/api.py | 48 + lib/k8s/limit/info.py | 78 + lib/k8s/limit/main.py | 11 + lib/k8s/limit/output.py | 33 + lib/k8s/machine_config/__init__.py | 0 lib/k8s/machine_config/api.py | 79 + lib/k8s/machine_config/info.py | 384 + lib/k8s/machine_config/main.py | 11 + lib/k8s/machine_config/output.py | 329 + lib/k8s/machine_config_pool/__init__.py | 0 lib/k8s/machine_config_pool/api.py | 48 + lib/k8s/machine_config_pool/info.py | 299 + lib/k8s/machine_config_pool/main.py | 11 + lib/k8s/machine_config_pool/output.py | 112 + lib/k8s/main.py | 245 + lib/k8s/namespace/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../namespace/__pycache__/api.cpython-310.pyc | Bin 0 -> 1233 bytes .../__pycache__/info.cpython-310.pyc | Bin 0 -> 2527 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 597 bytes .../__pycache__/object.cpython-310.pyc | Bin 0 -> 2372 bytes .../__pycache__/task.cpython-310.pyc | Bin 0 -> 432 bytes lib/k8s/namespace/api.py | 52 + lib/k8s/namespace/info.py | 116 + lib/k8s/namespace/main.py | 11 + lib/k8s/namespace/output.py | 83 + .../network_attachment_definition/__init__.py | 0 lib/k8s/network_attachment_definition/api.py | 100 + lib/k8s/network_attachment_definition/info.py | 148 + lib/k8s/network_attachment_definition/main.py | 11 + .../network_attachment_definition/output.py | 59 + lib/k8s/node/__init__.py | 0 .../node/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes lib/k8s/node/__pycache__/api.cpython-310.pyc | Bin 0 -> 1188 bytes lib/k8s/node/__pycache__/info.cpython-310.pyc | Bin 0 -> 8442 bytes lib/k8s/node/__pycache__/main.cpython-310.pyc | Bin 0 -> 636 bytes .../node/__pycache__/object.cpython-310.pyc | Bin 0 -> 7993 bytes lib/k8s/node/__pycache__/task.cpython-310.pyc | Bin 0 -> 1127 bytes lib/k8s/node/api.py | 53 + lib/k8s/node/info.py | 811 + lib/k8s/node/main.py | 14 + lib/k8s/node/output.py | 380 + lib/k8s/node/task.py | 48 + .../__init__.py | 0 .../api.py | 48 + .../info.py | 130 + .../main.py | 11 + .../output.py | 11 + .../__init__.py | 0 .../node_network_configuration_policy/api.py | 48 + .../node_network_configuration_policy/info.py | 110 + .../node_network_configuration_policy/main.py | 11 + .../output.py | 11 + lib/k8s/node_network_state/__init__.py | 0 lib/k8s/node_network_state/api.py | 48 + lib/k8s/node_network_state/info.py | 591 + lib/k8s/node_network_state/main.py | 11 + lib/k8s/node_network_state/output.py | 954 + lib/k8s/operator_group/__init__.py | 0 lib/k8s/operator_group/api.py | 48 + lib/k8s/operator_group/info.py | 137 + lib/k8s/operator_group/main.py | 11 + lib/k8s/operator_group/output.py | 83 + lib/k8s/output.py | 338 + lib/k8s/performance_profile/__init__.py | 0 lib/k8s/performance_profile/api.py | 48 + lib/k8s/performance_profile/info.py | 222 + lib/k8s/performance_profile/main.py | 11 + lib/k8s/performance_profile/output.py | 96 + lib/k8s/pod/__init__.py | 0 .../pod/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes lib/k8s/pod/__pycache__/api.cpython-310.pyc | Bin 0 -> 1781 bytes lib/k8s/pod/__pycache__/info.cpython-310.pyc | Bin 0 -> 13077 bytes lib/k8s/pod/__pycache__/main.cpython-310.pyc | Bin 0 -> 555 bytes .../pod/__pycache__/object.cpython-310.pyc | Bin 0 -> 12889 bytes lib/k8s/pod/__pycache__/task.cpython-310.pyc | Bin 0 -> 414 bytes lib/k8s/pod/api.py | 91 + lib/k8s/pod/info.py | 1428 + lib/k8s/pod/main.py | 11 + lib/k8s/pod/output.py | 844 + lib/k8s/pod_monitor/__init__.py | 0 lib/k8s/pod_monitor/api.py | 48 + lib/k8s/pod_monitor/info.py | 78 + lib/k8s/pod_monitor/main.py | 11 + lib/k8s/pod_monitor/output.py | 33 + lib/k8s/priority_class/__init__.py | 0 lib/k8s/priority_class/api.py | 48 + lib/k8s/priority_class/info.py | 78 + lib/k8s/priority_class/main.py | 11 + lib/k8s/priority_class/output.py | 33 + lib/k8s/probe/__init__.py | 0 lib/k8s/probe/api.py | 48 + lib/k8s/probe/info.py | 78 + lib/k8s/probe/main.py | 11 + lib/k8s/probe/output.py | 33 + lib/k8s/profile/__init__.py | 0 lib/k8s/profile/api.py | 48 + lib/k8s/profile/info.py | 156 + lib/k8s/profile/main.py | 11 + lib/k8s/profile/output.py | 161 + lib/k8s/prometheus/__init__.py | 0 lib/k8s/prometheus/api.py | 48 + lib/k8s/prometheus/info.py | 78 + lib/k8s/prometheus/main.py | 11 + lib/k8s/prometheus/output.py | 33 + lib/k8s/prometheus_rule/__init__.py | 0 lib/k8s/prometheus_rule/api.py | 48 + lib/k8s/prometheus_rule/info.py | 78 + lib/k8s/prometheus_rule/main.py | 11 + lib/k8s/prometheus_rule/output.py | 33 + lib/k8s/pv/__init__.py | 0 .../pv/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 144 bytes lib/k8s/pv/__pycache__/api.cpython-310.pyc | Bin 0 -> 1175 bytes lib/k8s/pv/__pycache__/info.cpython-310.pyc | Bin 0 -> 3357 bytes lib/k8s/pv/__pycache__/main.cpython-310.pyc | Bin 0 -> 548 bytes lib/k8s/pv/api.py | 52 + lib/k8s/pv/info.py | 147 + lib/k8s/pv/main.py | 11 + lib/k8s/pv/output.py | 58 + lib/k8s/pvc/__init__.py | 0 .../pvc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 144 bytes lib/k8s/pvc/__pycache__/api.cpython-310.pyc | Bin 0 -> 2441 bytes lib/k8s/pvc/__pycache__/info.cpython-310.pyc | Bin 0 -> 5027 bytes lib/k8s/pvc/__pycache__/main.cpython-310.pyc | Bin 0 -> 632 bytes lib/k8s/pvc/api.py | 131 + lib/k8s/pvc/info.py | 230 + lib/k8s/pvc/main.py | 14 + lib/k8s/pvc/output.py | 264 + lib/k8s/pvc/task/__init__.py | 0 lib/k8s/pvc/task/main.py | 155 + lib/k8s/replica_set/__init__.py | 0 lib/k8s/replica_set/api.py | 48 + lib/k8s/replica_set/info.py | 114 + lib/k8s/replica_set/main.py | 11 + lib/k8s/replica_set/output.py | 97 + lib/k8s/replication_controller/__init__.py | 0 lib/k8s/replication_controller/api.py | 48 + lib/k8s/replication_controller/info.py | 83 + lib/k8s/replication_controller/main.py | 11 + lib/k8s/replication_controller/output.py | 33 + lib/k8s/resource_quota/__init__.py | 0 lib/k8s/resource_quota/api.py | 52 + lib/k8s/resource_quota/info.py | 101 + lib/k8s/resource_quota/main.py | 11 + lib/k8s/resource_quota/output.py | 35 + lib/k8s/role_binding/__init__.py | 0 lib/k8s/role_binding/api.py | 48 + lib/k8s/role_binding/info.py | 119 + lib/k8s/role_binding/main.py | 11 + lib/k8s/role_binding/output.py | 55 + lib/k8s/route/__init__.py | 0 lib/k8s/route/api.py | 48 + lib/k8s/route/info.py | 83 + lib/k8s/route/main.py | 11 + lib/k8s/route/output.py | 33 + lib/k8s/secret/__init__.py | 0 lib/k8s/secret/api.py | 48 + lib/k8s/secret/info.py | 83 + lib/k8s/secret/main.py | 11 + lib/k8s/secret/output.py | 33 + lib/k8s/secrets.py | 202 + .../security_context_constraint/__init__.py | 0 lib/k8s/security_context_constraint/api.py | 48 + lib/k8s/security_context_constraint/info.py | 122 + lib/k8s/security_context_constraint/main.py | 11 + lib/k8s/security_context_constraint/output.py | 64 + lib/k8s/service/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../service/__pycache__/api.cpython-310.pyc | Bin 0 -> 2322 bytes .../service/__pycache__/info.cpython-310.pyc | Bin 0 -> 6448 bytes .../service/__pycache__/main.cpython-310.pyc | Bin 0 -> 577 bytes lib/k8s/service/api.py | 126 + lib/k8s/service/info.py | 384 + lib/k8s/service/main.py | 8 + lib/k8s/service/output.py | 164 + lib/k8s/service_account/__init__.py | 0 lib/k8s/service_account/api.py | 48 + lib/k8s/service_account/info.py | 96 + lib/k8s/service_account/main.py | 11 + lib/k8s/service_account/output.py | 48 + lib/k8s/service_monitor/__init__.py | 0 lib/k8s/service_monitor/api.py | 48 + lib/k8s/service_monitor/info.py | 83 + lib/k8s/service_monitor/main.py | 11 + lib/k8s/service_monitor/output.py | 33 + lib/k8s/services.py | 340 + lib/k8s/settings.py | 427 + lib/k8s/sriov_network/__init__.py | 0 lib/k8s/sriov_network/api.py | 100 + lib/k8s/sriov_network/info.py | 165 + lib/k8s/sriov_network/main.py | 11 + lib/k8s/sriov_network/output.py | 62 + lib/k8s/sriov_network_node_policy/__init__.py | 0 lib/k8s/sriov_network_node_policy/api.py | 100 + lib/k8s/sriov_network_node_policy/info.py | 239 + lib/k8s/sriov_network_node_policy/main.py | 11 + lib/k8s/sriov_network_node_policy/output.py | 99 + lib/k8s/sriov_network_node_state/__init__.py | 0 lib/k8s/sriov_network_node_state/api.py | 48 + lib/k8s/sriov_network_node_state/info.py | 285 + lib/k8s/sriov_network_node_state/main.py | 20 + lib/k8s/sriov_network_node_state/output.py | 209 + lib/k8s/stateful_set/__init__.py | 0 lib/k8s/stateful_set/api.py | 48 + lib/k8s/stateful_set/info.py | 98 + lib/k8s/stateful_set/main.py | 11 + lib/k8s/stateful_set/output.py | 87 + lib/k8s/storage_class/__init__.py | 0 lib/k8s/storage_class/api.py | 48 + lib/k8s/storage_class/info.py | 83 + lib/k8s/storage_class/main.py | 11 + lib/k8s/storage_class/output.py | 33 + lib/k8s/subscription/__init__.py | 0 lib/k8s/subscription/api.py | 48 + lib/k8s/subscription/info.py | 138 + lib/k8s/subscription/main.py | 11 + lib/k8s/subscription/output.py | 49 + lib/k8s/thanos_ruler/__init__.py | 0 lib/k8s/thanos_ruler/api.py | 48 + lib/k8s/thanos_ruler/info.py | 78 + lib/k8s/thanos_ruler/main.py | 11 + lib/k8s/thanos_ruler/output.py | 33 + lib/k8s/tuned/__init__.py | 0 lib/k8s/tuned/api.py | 48 + lib/k8s/tuned/info.py | 114 + lib/k8s/tuned/main.py | 11 + lib/k8s/tuned/output.py | 51 + lib/k8s/version/__init__.py | 0 lib/k8s/version/api.py | 59 + lib/k8s/version/info.py | 90 + lib/k8s/version/main.py | 11 + lib/k8s/version/output.py | 39 + lib/k8s/virtual_machine/__init__.py | 0 lib/k8s/virtual_machine/api.py | 48 + lib/k8s/virtual_machine/info.py | 168 + lib/k8s/virtual_machine/main.py | 11 + lib/k8s/virtual_machine/output.py | 148 + lib/k8s/virtual_machine_clone/__init__.py | 0 lib/k8s/virtual_machine_clone/api.py | 48 + lib/k8s/virtual_machine_clone/info.py | 83 + lib/k8s/virtual_machine_clone/main.py | 11 + lib/k8s/virtual_machine_clone/output.py | 33 + .../__init__.py | 0 .../api.py | 48 + .../info.py | 83 + .../main.py | 11 + .../output.py | 33 + .../__init__.py | 0 .../virtual_machine_cluster_preference/api.py | 48 + .../info.py | 83 + .../main.py | 11 + .../output.py | 33 + lib/k8s/virtual_machine_export/__init__.py | 0 lib/k8s/virtual_machine_export/api.py | 48 + lib/k8s/virtual_machine_export/info.py | 83 + lib/k8s/virtual_machine_export/main.py | 11 + lib/k8s/virtual_machine_export/output.py | 33 + lib/k8s/virtual_machine_instance/__init__.py | 0 lib/k8s/virtual_machine_instance/api.py | 81 + lib/k8s/virtual_machine_instance/info.py | 297 + lib/k8s/virtual_machine_instance/main.py | 11 + lib/k8s/virtual_machine_instance/output.py | 256 + .../__init__.py | 0 .../virtual_machine_instance_migration/api.py | 48 + .../info.py | 83 + .../main.py | 11 + .../output.py | 33 + .../__init__.py | 0 .../virtual_machine_instance_preset/api.py | 48 + .../virtual_machine_instance_preset/info.py | 83 + .../virtual_machine_instance_preset/main.py | 11 + .../virtual_machine_instance_preset/output.py | 33 + .../__init__.py | 0 .../api.py | 48 + .../info.py | 83 + .../main.py | 11 + .../output.py | 33 + .../virtual_machine_instance_type/__init__.py | 0 lib/k8s/virtual_machine_instance_type/api.py | 48 + lib/k8s/virtual_machine_instance_type/info.py | 83 + lib/k8s/virtual_machine_instance_type/main.py | 11 + .../virtual_machine_instance_type/output.py | 33 + .../virtual_machine_preference/__init__.py | 0 lib/k8s/virtual_machine_preference/api.py | 48 + lib/k8s/virtual_machine_preference/info.py | 83 + lib/k8s/virtual_machine_preference/main.py | 11 + lib/k8s/virtual_machine_preference/output.py | 33 + lib/k8s/virtual_machine_restore/__init__.py | 0 lib/k8s/virtual_machine_restore/api.py | 48 + lib/k8s/virtual_machine_restore/info.py | 83 + lib/k8s/virtual_machine_restore/main.py | 11 + lib/k8s/virtual_machine_restore/output.py | 33 + lib/k8s/virtual_machine_snapshot/__init__.py | 0 lib/k8s/virtual_machine_snapshot/api.py | 48 + lib/k8s/virtual_machine_snapshot/info.py | 83 + lib/k8s/virtual_machine_snapshot/main.py | 11 + lib/k8s/virtual_machine_snapshot/output.py | 33 + .../__init__.py | 0 .../virtual_machine_snapshot_content/api.py | 48 + .../virtual_machine_snapshot_content/info.py | 83 + .../virtual_machine_snapshot_content/main.py | 11 + .../output.py | 33 + lib/k8s/volume_attachment/__init__.py | 0 lib/k8s/volume_attachment/api.py | 48 + lib/k8s/volume_attachment/info.py | 83 + lib/k8s/volume_attachment/main.py | 11 + lib/k8s/volume_attachment/output.py | 33 + lib/k8s/volume_snapshot copy/info.py | 75 + lib/k8s/volume_snapshot/__init__.py | 0 lib/k8s/volume_snapshot/api.py | 48 + lib/k8s/volume_snapshot/info.py | 83 + lib/k8s/volume_snapshot/main.py | 11 + lib/k8s/volume_snapshot/output.py | 33 + lib/k8s/volume_snapshot_class/__init__.py | 0 lib/k8s/volume_snapshot_class/api.py | 48 + lib/k8s/volume_snapshot_class/info.py | 83 + lib/k8s/volume_snapshot_class/main.py | 11 + lib/k8s/volume_snapshot_class/output.py | 33 + lib/k8s/volume_snapshot_content/__init__.py | 0 lib/k8s/volume_snapshot_content/api.py | 48 + lib/k8s/volume_snapshot_content/info.py | 83 + lib/k8s/volume_snapshot_content/main.py | 11 + lib/k8s/volume_snapshot_content/output.py | 33 + lib/kubevirt/README.md | 34 + lib/kubevirt/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes lib/kubevirt/__pycache__/main.cpython-310.pyc | Bin 0 -> 959 bytes lib/kubevirt/__pycache__/vm.cpython-310.pyc | Bin 0 -> 2938 bytes lib/kubevirt/__pycache__/vmi.cpython-310.pyc | Bin 0 -> 2070 bytes lib/kubevirt/api.py | 57 + lib/kubevirt/common.py | 136 + lib/kubevirt/main.py | 24 + lib/kubevirt/output.py | 19 + lib/kubevirt/virtual_machine/__init__.py | 0 lib/kubevirt/virtual_machine/api.py | 184 + lib/kubevirt/virtual_machine/info.py | 481 + lib/kubevirt/virtual_machine/main.py | 11 + lib/kubevirt/virtual_machine/output.py | 70 + .../virtual_machine_instance/__init__.py | 0 lib/kubevirt/virtual_machine_instance/api.py | 139 + lib/kubevirt/virtual_machine_instance/info.py | 193 + lib/kubevirt/virtual_machine_instance/main.py | 11 + .../virtual_machine_instance/output.py | 71 + lib/linux/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 142 bytes .../__pycache__/commands.cpython-310.pyc | Bin 0 -> 978 bytes .../__pycache__/interface.cpython-310.pyc | Bin 0 -> 3900 bytes .../__pycache__/linux_helper.cpython-310.pyc | Bin 0 -> 848 bytes .../linux_iptables.cpython-310.pyc | Bin 0 -> 428 bytes .../__pycache__/linux_state.cpython-310.pyc | Bin 0 -> 8500 bytes lib/linux/__pycache__/lvm.cpython-310.pyc | Bin 0 -> 1726 bytes lib/linux/__pycache__/main.cpython-310.pyc | Bin 0 -> 1762 bytes lib/linux/__pycache__/state.cpython-310.pyc | Bin 0 -> 8043 bytes lib/linux/bond/__init__.py | 0 lib/linux/bond/cmd.py | 50 + lib/linux/bond/info.py | 72 + lib/linux/bond/main.py | 11 + lib/linux/bond/output.py | 193 + lib/linux/boot/__init__.py | 0 lib/linux/boot/cmd.py | 25 + lib/linux/boot/info.py | 14 + lib/linux/boot/main.py | 11 + lib/linux/boot/output.py | 14 + lib/linux/cache.py | 95 + lib/linux/chrony/__init__.py | 0 lib/linux/chrony/cmd.py | 52 + lib/linux/chrony/info.py | 82 + lib/linux/chrony/main.py | 11 + lib/linux/chrony/output.py | 18 + lib/linux/commands.py | 30 + lib/linux/common.py | 83 + lib/linux/container_policy/__init__.py | 0 lib/linux/container_policy/cmd.py | 28 + lib/linux/container_policy/info.py | 60 + lib/linux/container_policy/main.py | 11 + lib/linux/container_policy/output.py | 25 + lib/linux/genisoimage/__init__.py | 0 lib/linux/genisoimage/main.py | 83 + lib/linux/huge_pages/__init__.py | 0 lib/linux/huge_pages/cmd.py | 54 + lib/linux/huge_pages/info.py | 12 + lib/linux/huge_pages/main.py | 11 + lib/linux/huge_pages/output.py | 60 + lib/linux/interface.py | 167 + lib/linux/lvm.py | 100 + lib/linux/main.py | 80 + lib/linux/output.py | 90 + lib/linux/settings.py | 207 + lib/linux/state.py | 393 + lib/linux/sysctl/__init__.py | 0 lib/linux/sysctl/cmd.py | 35 + lib/linux/sysctl/info.py | 69 + lib/linux/sysctl/main.py | 11 + lib/linux/sysctl/output.py | 52 + lib/linux/virtctl/__init__.py | 0 lib/linux/virtctl/main.py | 54 + lib/log_helper.py | 1806 + lib/my_server_helper.py | 137 + lib/my_servers_helper.py | 325 + lib/netconf/__init__.py | 0 lib/netconf/notification.py | 104 + lib/netconf/ssh.py | 201 + lib/netconf/transport.py | 183 + lib/nexus/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 142 bytes lib/nexus/__pycache__/cache.cpython-310.pyc | Bin 0 -> 2512 bytes lib/nexus/__pycache__/lldp.cpython-310.pyc | Bin 0 -> 1135 bytes lib/nexus/__pycache__/nxapi.cpython-310.pyc | Bin 0 -> 3585 bytes .../__pycache__/settings.cpython-310.pyc | Bin 0 -> 5382 bytes lib/nexus/bot_output.py | 145 + lib/nexus/cache.py | 152 + lib/nexus/config/__init__.py | 0 lib/nexus/config/api.py | 37 + lib/nexus/config/bot_output.py | 25 + lib/nexus/config/info.py | 58 + lib/nexus/config/main.py | 11 + lib/nexus/config/output.py | 15 + lib/nexus/lacp/__init__.py | 0 lib/nexus/lacp/api.py | 67 + lib/nexus/lacp/bot_output.py | 64 + lib/nexus/lacp/info.py | 149 + lib/nexus/lacp/main.py | 11 + lib/nexus/lacp/output.py | 46 + lib/nexus/lldp/__init__.py | 0 lib/nexus/lldp/api.py | 71 + lib/nexus/lldp/bot_output.py | 63 + lib/nexus/lldp/info.py | 112 + lib/nexus/lldp/main.py | 11 + lib/nexus/lldp/output.py | 45 + lib/nexus/mac/__init__.py | 0 lib/nexus/mac/api.py | 67 + lib/nexus/mac/bot_output.py | 63 + lib/nexus/mac/info.py | 115 + lib/nexus/mac/main.py | 11 + lib/nexus/mac/output.py | 45 + lib/nexus/nxapi.py | 203 + lib/nexus/output.py | 24 + lib/nexus/server/__init__.py | 0 lib/nexus/server/main.py | 127 + lib/nexus/settings.py | 239 + lib/nexus/version/__init__.py | 0 lib/nexus/version/api.py | 38 + lib/nexus/version/bot_output.py | 59 + lib/nexus/version/info.py | 150 + lib/nexus/version/main.py | 11 + lib/nexus/version/output.py | 41 + lib/nexus/ws.py | 147 + lib/nso/__init__.py | 0 lib/nso/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 140 bytes lib/nso/__pycache__/main.cpython-310.pyc | Bin 0 -> 1411 bytes lib/nso/__pycache__/settings.cpython-310.pyc | Bin 0 -> 4535 bytes lib/nso/api/__init__.py | 0 .../api/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 144 bytes lib/nso/api/__pycache__/rest.cpython-310.pyc | Bin 0 -> 7618 bytes lib/nso/api/rest.py | 546 + lib/nso/cnfm/__init__.py | 0 lib/nso/cnfm/cluster/__init__.py | 0 lib/nso/cnfm/cluster/api.py | 22 + lib/nso/cnfm/cluster/info.py | 80 + lib/nso/cnfm/cluster/main.py | 11 + lib/nso/cnfm/cnfd/__init__.py | 0 lib/nso/cnfm/cnfd/api.py | 52 + lib/nso/cnfm/cnfd/info.py | 192 + lib/nso/cnfm/cnfd/main.py | 11 + lib/nso/cnfm/cnfd/output.py | 45 + lib/nso/cnfm/cnfi/__init__.py | 0 lib/nso/cnfm/cnfi/api.py | 52 + lib/nso/cnfm/cnfi/info.py | 281 + lib/nso/cnfm/cnfi/main.py | 11 + lib/nso/cnfm/cnfi/output.py | 493 + lib/nso/cnfm/device/__init__.py | 0 lib/nso/cnfm/device/api.py | 22 + lib/nso/cnfm/device/info.py | 192 + lib/nso/cnfm/device/main.py | 11 + lib/nso/cnfm/device/output.py | 113 + lib/nso/cnfm/main.py | 26 + lib/nso/cnfm/output.py | 14 + lib/nso/cnfm/plan/__init__.py | 0 lib/nso/cnfm/plan/api.py | 52 + lib/nso/cnfm/plan/info.py | 193 + lib/nso/cnfm/plan/main.py | 11 + lib/nso/cnfm/release/__init__.py | 0 lib/nso/cnfm/release/api.py | 22 + lib/nso/cnfm/release/info.py | 105 + lib/nso/cnfm/release/main.py | 11 + lib/nso/cnfm/result/__init__.py | 0 lib/nso/cnfm/result/api.py | 52 + lib/nso/cnfm/result/info.py | 580 + lib/nso/cnfm/result/main.py | 11 + lib/nso/cnfm/todo.md | 70 + lib/nso/common.py | 107 + lib/nso/device/__init__.py | 0 lib/nso/device/api.py | 154 + lib/nso/device/info.py | 218 + lib/nso/device/main.py | 11 + lib/nso/device/output.py | 55 + lib/nso/main.py | 64 + lib/nso/nfvo/__init__.py | 0 .../nfvo/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes lib/nso/nfvo/__pycache__/main.cpython-310.pyc | Bin 0 -> 819 bytes lib/nso/nfvo/__pycache__/vnfd.cpython-310.pyc | Bin 0 -> 4757 bytes lib/nso/nfvo/__pycache__/vnfi.cpython-310.pyc | Bin 0 -> 9911 bytes lib/nso/nfvo/api/__init__.py | 0 lib/nso/nfvo/api/main.py | 356 + lib/nso/nfvo/main.py | 26 + lib/nso/nfvo/output.py | 19 + lib/nso/nfvo/vnfd/__init__.py | 0 .../vnfd/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../vnfd/__pycache__/create.cpython-310.pyc | Bin 0 -> 1201 bytes .../vnfd/__pycache__/delete.cpython-310.pyc | Bin 0 -> 1147 bytes .../nfvo/vnfd/__pycache__/get.cpython-310.pyc | Bin 0 -> 2325 bytes .../vnfd/__pycache__/main.cpython-310.pyc | Bin 0 -> 743 bytes .../vnfd/__pycache__/output.cpython-310.pyc | Bin 0 -> 861 bytes .../vnfd/__pycache__/print.cpython-310.pyc | Bin 0 -> 871 bytes lib/nso/nfvo/vnfd/create.py | 51 + lib/nso/nfvo/vnfd/delete.py | 43 + lib/nso/nfvo/vnfd/get.py | 113 + lib/nso/nfvo/vnfd/main.py | 12 + lib/nso/nfvo/vnfd/output.py | 30 + lib/nso/nfvo/vnfi/__init__.py | 0 .../vnfi/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../vnfi/__pycache__/create.cpython-310.pyc | Bin 0 -> 2101 bytes .../vnfi/__pycache__/delete.cpython-310.pyc | Bin 0 -> 1042 bytes .../nfvo/vnfi/__pycache__/get.cpython-310.pyc | Bin 0 -> 4518 bytes .../vnfi/__pycache__/main.cpython-310.pyc | Bin 0 -> 743 bytes .../vnfi/__pycache__/output.cpython-310.pyc | Bin 0 -> 1450 bytes .../vnfi/__pycache__/print.cpython-310.pyc | Bin 0 -> 1429 bytes lib/nso/nfvo/vnfi/create.py | 71 + lib/nso/nfvo/vnfi/delete.py | 33 + lib/nso/nfvo/vnfi/get.py | 224 + lib/nso/nfvo/vnfi/main.py | 12 + lib/nso/nfvo/vnfi/output.py | 85 + lib/nso/output.py | 22 + lib/nso/settings.py | 186 + lib/ocp/__init__.py | 0 lib/ocp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 140 bytes lib/ocp/__pycache__/common.cpython-310.pyc | Bin 0 -> 2704 bytes lib/ocp/__pycache__/create.cpython-310.pyc | Bin 0 -> 962 bytes lib/ocp/__pycache__/delete.cpython-310.pyc | Bin 0 -> 933 bytes .../__pycache__/kubeconfig.cpython-310.pyc | Bin 0 -> 5027 bytes lib/ocp/__pycache__/main.cpython-310.pyc | Bin 0 -> 1463 bytes lib/ocp/__pycache__/output.cpython-310.pyc | Bin 0 -> 879 bytes lib/ocp/__pycache__/settings.cpython-310.pyc | Bin 0 -> 8242 bytes lib/ocp/__pycache__/state.cpython-310.pyc | Bin 0 -> 3562 bytes lib/ocp/__pycache__/validate.cpython-310.pyc | Bin 0 -> 11605 bytes lib/ocp/cluster/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../__pycache__/kubeconfig.cpython-310.pyc | Bin 0 -> 3648 bytes .../cluster/__pycache__/main.cpython-310.pyc | Bin 0 -> 878 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 2379 bytes lib/ocp/cluster/cnv/__init__.py | 0 .../cnv/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../cnv/__pycache__/main.cpython-310.pyc | Bin 0 -> 2031 bytes .../cnv/__pycache__/output.cpython-310.pyc | Bin 0 -> 994 bytes lib/ocp/cluster/cnv/main.py | 76 + lib/ocp/cluster/cnv/output.py | 32 + lib/ocp/cluster/console/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../console/__pycache__/main.cpython-310.pyc | Bin 0 -> 2838 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 1299 bytes lib/ocp/cluster/console/main.py | 111 + lib/ocp/cluster/console/output.py | 71 + lib/ocp/cluster/kubeconfig/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 159 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 3577 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 1535 bytes lib/ocp/cluster/kubeconfig/main.py | 165 + lib/ocp/cluster/kubeconfig/output.py | 69 + lib/ocp/cluster/main.py | 20 + lib/ocp/cluster/manager/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../manager/__pycache__/info.cpython-310.pyc | Bin 0 -> 2972 bytes .../manager/__pycache__/main.cpython-310.pyc | Bin 0 -> 1595 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 1294 bytes lib/ocp/cluster/manager/main.py | 44 + lib/ocp/cluster/manager/output.py | 68 + lib/ocp/cluster/output.py | 130 + lib/ocp/cluster/vcenter/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 154 bytes .../vcenter/__pycache__/info.cpython-310.pyc | Bin 0 -> 4454 bytes .../vcenter/__pycache__/main.cpython-310.pyc | Bin 0 -> 2465 bytes .../__pycache__/output.cpython-310.pyc | Bin 0 -> 1535 bytes lib/ocp/cluster/vcenter/main.py | 114 + lib/ocp/cluster/vcenter/output.py | 81 + lib/ocp/lcm/__init__.py | 0 .../lcm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 144 bytes .../lcm/__pycache__/common.cpython-310.pyc | Bin 0 -> 2396 bytes .../lcm/__pycache__/create.cpython-310.pyc | Bin 0 -> 2459 bytes .../lcm/__pycache__/delete.cpython-310.pyc | Bin 0 -> 1119 bytes lib/ocp/lcm/__pycache__/main.cpython-310.pyc | Bin 0 -> 1139 bytes .../lcm/__pycache__/validate.cpython-310.pyc | Bin 0 -> 11331 bytes lib/ocp/lcm/common.py | 77 + lib/ocp/lcm/create.py | 195 + lib/ocp/lcm/delete.py | 35 + lib/ocp/lcm/main.py | 30 + lib/ocp/lcm/validate.py | 582 + lib/ocp/lcm/vsphere/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../vsphere/__pycache__/main.cpython-310.pyc | Bin 0 -> 1188 bytes .../__pycache__/validate.cpython-310.pyc | Bin 0 -> 3973 bytes lib/ocp/lcm/vsphere/ipi/__init__.py | 0 .../ipi/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../ipi/__pycache__/create.cpython-310.pyc | Bin 0 -> 9463 bytes .../ipi/__pycache__/delete.cpython-310.pyc | Bin 0 -> 1651 bytes .../ipi/__pycache__/installer.cpython-310.pyc | Bin 0 -> 11700 bytes .../ipi/__pycache__/main.cpython-310.pyc | Bin 0 -> 819 bytes .../ipi/__pycache__/validate.cpython-310.pyc | Bin 0 -> 3883 bytes lib/ocp/lcm/vsphere/ipi/create.py | 497 + lib/ocp/lcm/vsphere/ipi/delete.py | 54 + lib/ocp/lcm/vsphere/ipi/installer.py | 429 + lib/ocp/lcm/vsphere/ipi/main.py | 12 + lib/ocp/lcm/vsphere/ipi/validate.py | 174 + lib/ocp/lcm/vsphere/main.py | 30 + lib/ocp/lcm/vsphere/validate.py | 110 + lib/ocp/main.py | 52 + lib/ocp/node/__init__.py | 0 .../node/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes lib/ocp/node/__pycache__/info.cpython-310.pyc | Bin 0 -> 3828 bytes .../node/__pycache__/linux.cpython-310.pyc | Bin 0 -> 1287 bytes lib/ocp/node/__pycache__/main.cpython-310.pyc | Bin 0 -> 642 bytes .../node/__pycache__/output.cpython-310.pyc | Bin 0 -> 3937 bytes .../node/__pycache__/sriov.cpython-310.pyc | Bin 0 -> 7045 bytes lib/ocp/node/info.py | 179 + lib/ocp/node/linux.py | 117 + lib/ocp/node/main.py | 14 + lib/ocp/node/sriov.py | 361 + lib/ocp/output.py | 22 + lib/ocp/settings.py | 448 + lib/ocp/task/__init__.py | 0 .../task/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes lib/ocp/task/__pycache__/main.cpython-310.pyc | Bin 0 -> 567 bytes lib/ocp/task/chrony/__init__.py | 0 lib/ocp/task/chrony/main.py | 76 + lib/ocp/task/chrony/output.py | 91 + lib/ocp/task/container_policy/__init__.py | 0 lib/ocp/task/container_policy/main.py | 57 + lib/ocp/task/container_policy/output.py | 71 + lib/ocp/task/main.py | 17 + lib/ocp/task/node/__init__.py | 0 .../node/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../node/__pycache__/down.cpython-310.pyc | Bin 0 -> 1852 bytes .../node/__pycache__/main.cpython-310.pyc | Bin 0 -> 985 bytes .../node/__pycache__/nestedhv.cpython-310.pyc | Bin 0 -> 2261 bytes .../task/node/__pycache__/up.cpython-310.pyc | Bin 0 -> 1788 bytes lib/ocp/task/node/down.py | 53 + lib/ocp/task/node/main.py | 20 + lib/ocp/task/node/nestedhv.py | 74 + lib/ocp/task/node/up.py | 52 + lib/ocp/task/output.py | 48 + lib/ocp/task/ssh.py | 215 + lib/ocp/vm/__init__.py | 0 .../vm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 143 bytes lib/ocp/vm/__pycache__/create.cpython-310.pyc | Bin 0 -> 4464 bytes lib/ocp/vm/__pycache__/day0.cpython-310.pyc | Bin 0 -> 3935 bytes lib/ocp/vm/__pycache__/delete.cpython-310.pyc | Bin 0 -> 5165 bytes lib/ocp/vm/__pycache__/disk.cpython-310.pyc | Bin 0 -> 2958 bytes lib/ocp/vm/__pycache__/disks.cpython-310.pyc | Bin 0 -> 3740 bytes lib/ocp/vm/__pycache__/image.cpython-310.pyc | Bin 0 -> 3997 bytes lib/ocp/vm/__pycache__/info.cpython-310.pyc | Bin 0 -> 3685 bytes .../vm/__pycache__/instance.cpython-310.pyc | Bin 0 -> 2765 bytes lib/ocp/vm/__pycache__/main.cpython-310.pyc | Bin 0 -> 804 bytes lib/ocp/vm/__pycache__/mo.cpython-310.pyc | Bin 0 -> 2184 bytes lib/ocp/vm/__pycache__/net.cpython-310.pyc | Bin 0 -> 2405 bytes lib/ocp/vm/__pycache__/output.cpython-310.pyc | Bin 0 -> 7875 bytes lib/ocp/vm/__pycache__/pod.cpython-310.pyc | Bin 0 -> 637 bytes lib/ocp/vm/__pycache__/report.cpython-310.pyc | Bin 0 -> 13093 bytes lib/ocp/vm/__pycache__/ssh.cpython-310.pyc | Bin 0 -> 1958 bytes lib/ocp/vm/__pycache__/svc.cpython-310.pyc | Bin 0 -> 3998 bytes lib/ocp/vm/__pycache__/task.cpython-310.pyc | Bin 0 -> 2941 bytes .../vm/__pycache__/validate.cpython-310.pyc | Bin 0 -> 3386 bytes lib/ocp/vm/__pycache__/vm.cpython-310.pyc | Bin 0 -> 2193 bytes lib/ocp/vm/__pycache__/vm_mo.cpython-310.pyc | Bin 0 -> 3203 bytes lib/ocp/vm/__pycache__/vmi.cpython-310.pyc | Bin 0 -> 2712 bytes lib/ocp/vm/__pycache__/vmi_mo.cpython-310.pyc | Bin 0 -> 2703 bytes lib/ocp/vm/create/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../create/__pycache__/day0.cpython-310.pyc | Bin 0 -> 4886 bytes .../__pycache__/deployment.cpython-310.pyc | Bin 0 -> 1739 bytes .../create/__pycache__/image.cpython-310.pyc | Bin 0 -> 3449 bytes .../create/__pycache__/main.cpython-310.pyc | Bin 0 -> 1036 bytes .../__pycache__/network.cpython-310.pyc | Bin 0 -> 1721 bytes .../create/__pycache__/policy.cpython-310.pyc | Bin 0 -> 1222 bytes .../__pycache__/service.cpython-310.pyc | Bin 0 -> 1223 bytes .../vm/create/__pycache__/vm.cpython-310.pyc | Bin 0 -> 1363 bytes .../vm/create/__pycache__/vmi.cpython-310.pyc | Bin 0 -> 1605 bytes lib/ocp/vm/create/day0.py | 325 + lib/ocp/vm/create/deployment.py | 80 + lib/ocp/vm/create/image.py | 230 + lib/ocp/vm/create/main.py | 26 + lib/ocp/vm/create/network.py | 72 + lib/ocp/vm/create/policy.py | 39 + lib/ocp/vm/create/service.py | 41 + lib/ocp/vm/create/vm.py | 44 + lib/ocp/vm/delete/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../delete/__pycache__/day0.cpython-310.pyc | Bin 0 -> 1251 bytes .../__pycache__/deployment.cpython-310.pyc | Bin 0 -> 1643 bytes .../delete/__pycache__/image.cpython-310.pyc | Bin 0 -> 2223 bytes .../delete/__pycache__/main.cpython-310.pyc | Bin 0 -> 1036 bytes .../__pycache__/network.cpython-310.pyc | Bin 0 -> 1720 bytes .../delete/__pycache__/policy.cpython-310.pyc | Bin 0 -> 1243 bytes .../__pycache__/service.cpython-310.pyc | Bin 0 -> 1832 bytes .../vm/delete/__pycache__/vm.cpython-310.pyc | Bin 0 -> 1651 bytes .../vm/delete/__pycache__/vmi.cpython-310.pyc | Bin 0 -> 1350 bytes lib/ocp/vm/delete/day0.py | 51 + lib/ocp/vm/delete/deployment.py | 67 + lib/ocp/vm/delete/image.py | 97 + lib/ocp/vm/delete/main.py | 26 + lib/ocp/vm/delete/network.py | 74 + lib/ocp/vm/delete/policy.py | 40 + lib/ocp/vm/delete/service.py | 59 + lib/ocp/vm/delete/vm.py | 77 + lib/ocp/vm/doc/disks.md | 53 + lib/ocp/vm/get/__init__.py | 0 .../get/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../vm/get/__pycache__/bgp.cpython-310.pyc | Bin 0 -> 2003 bytes .../vm/get/__pycache__/day0.cpython-310.pyc | Bin 0 -> 884 bytes .../vm/get/__pycache__/disk.cpython-310.pyc | Bin 0 -> 2379 bytes .../vm/get/__pycache__/fabric.cpython-310.pyc | Bin 0 -> 2268 bytes .../vm/get/__pycache__/image.cpython-310.pyc | Bin 0 -> 1163 bytes .../vm/get/__pycache__/info.cpython-310.pyc | Bin 0 -> 3826 bytes .../vm/get/__pycache__/main.cpython-310.pyc | Bin 0 -> 1046 bytes .../get/__pycache__/network.cpython-310.pyc | Bin 0 -> 2283 bytes .../vm/get/__pycache__/node.cpython-310.pyc | Bin 0 -> 471 bytes .../vm/get/__pycache__/pod.cpython-310.pyc | Bin 0 -> 650 bytes .../get/__pycache__/service.cpython-310.pyc | Bin 0 -> 3504 bytes .../vm/get/__pycache__/sriov.cpython-310.pyc | Bin 0 -> 1277 bytes .../vm/get/__pycache__/ssh.cpython-310.pyc | Bin 0 -> 2029 bytes lib/ocp/vm/get/__pycache__/vm.cpython-310.pyc | Bin 0 -> 1796 bytes .../vm/get/__pycache__/vmi.cpython-310.pyc | Bin 0 -> 1791 bytes lib/ocp/vm/get/bgp.py | 81 + lib/ocp/vm/get/disk.py | 116 + lib/ocp/vm/get/fabric.py | 87 + lib/ocp/vm/get/image.py | 40 + lib/ocp/vm/get/info.py | 210 + lib/ocp/vm/get/main.py | 29 + lib/ocp/vm/get/network.py | 84 + lib/ocp/vm/get/report.py | 753 + lib/ocp/vm/get/sriov.py | 40 + lib/ocp/vm/get/ssh.py | 86 + lib/ocp/vm/main.py | 19 + lib/ocp/vm/output.py | 579 + lib/ocp/vm/validate.py | 278 + lib/openshift/__init__.py | 0 lib/openshift/accountsmgmt/__init__.py | 0 lib/openshift/accountsmgmt/api.py | 36 + lib/openshift/accountsmgmt/main.py | 11 + lib/openshift/accountsmgmt/output.py | 36 + .../accountsmgmt/subscription/__init__.py | 0 .../accountsmgmt/subscription/api.py | 25 + .../accountsmgmt/subscription/info.py | 3 + .../accountsmgmt/subscription/main.py | 11 + lib/openshift/api.py | 433 + lib/openshift/assistedinstall/__init__.py | 0 lib/openshift/assistedinstall/api.py | 47 + .../assistedinstall/cluster/__init__.py | 0 lib/openshift/assistedinstall/cluster/api.py | 169 + lib/openshift/assistedinstall/cluster/info.py | 468 + lib/openshift/assistedinstall/cluster/main.py | 11 + .../assistedinstall/event/__init__.py | 0 lib/openshift/assistedinstall/event/api.py | 12 + lib/openshift/assistedinstall/event/info.py | 3 + lib/openshift/assistedinstall/event/main.py | 11 + .../assistedinstall/infra/__init__.py | 0 lib/openshift/assistedinstall/infra/api.py | 54 + lib/openshift/assistedinstall/infra/info.py | 83 + lib/openshift/assistedinstall/infra/main.py | 11 + lib/openshift/assistedinstall/main.py | 23 + .../assistedinstall/manifest/__init__.py | 0 lib/openshift/assistedinstall/manifest/api.py | 41 + .../assistedinstall/manifest/info.py | 3 + .../assistedinstall/manifest/main.py | 11 + lib/openshift/assistedinstall/output.py | 536 + .../assistedinstall/version/__init__.py | 0 lib/openshift/assistedinstall/version/api.py | 30 + lib/openshift/assistedinstall/version/info.py | 112 + lib/openshift/assistedinstall/version/main.py | 11 + lib/openshift/console.py | 27 + lib/openshift/output.py | 14 + lib/openshift/settings.py | 66 + lib/osp/__init__.py | 0 lib/osp/api.py | 909 + lib/osp/availability_zone/README.md | 1 + lib/osp/availability_zone/__init__.py | 0 lib/osp/availability_zone/api.py | 42 + lib/osp/availability_zone/info.py | 185 + lib/osp/availability_zone/main.py | 11 + lib/osp/availability_zone/output.py | 89 + lib/osp/common.py | 81 + lib/osp/flavor/README.md | 2 + lib/osp/flavor/__init__.py | 0 lib/osp/flavor/api.py | 144 + lib/osp/flavor/info.py | 288 + lib/osp/flavor/main.py | 11 + lib/osp/flavor/output.py | 201 + lib/osp/floating_ip/README.md | 2 + lib/osp/floating_ip/__init__.py | 0 lib/osp/floating_ip/api.py | 112 + lib/osp/floating_ip/info.py | 259 + lib/osp/floating_ip/main.py | 11 + lib/osp/floating_ip/output.py | 93 + lib/osp/hypervisor/README.md | 3 + lib/osp/hypervisor/__init__.py | 0 lib/osp/hypervisor/api.py | 42 + lib/osp/hypervisor/info.py | 208 + lib/osp/hypervisor/main.py | 11 + lib/osp/hypervisor/output.py | 97 + lib/osp/image/README.md | 1 + lib/osp/image/__init__.py | 0 lib/osp/image/api.py | 196 + lib/osp/image/info.py | 183 + lib/osp/image/main.py | 14 + lib/osp/image/output.py | 169 + lib/osp/image/task.py | 165 + lib/osp/main.py | 68 + lib/osp/network/__init__.py | 0 lib/osp/network/api.py | 170 + lib/osp/network/info.py | 341 + lib/osp/network/main.py | 11 + lib/osp/network/output.py | 297 + lib/osp/output.py | 63 + lib/osp/port/README.md | 1 + lib/osp/port/__init__.py | 0 lib/osp/port/api.py | 42 + lib/osp/port/info.py | 383 + lib/osp/port/main.py | 11 + lib/osp/port/output.py | 331 + lib/osp/quota/README.md | 2 + lib/osp/quota/__init__.py | 0 lib/osp/quota/api.py | 55 + lib/osp/quota/info.py | 118 + lib/osp/quota/main.py | 11 + lib/osp/quota/output.py | 61 + lib/osp/role/__init__.py | 0 lib/osp/role/api.py | 42 + lib/osp/role/info.py | 75 + lib/osp/role/main.py | 11 + lib/osp/role/output.py | 35 + lib/osp/router/README.md | 1 + lib/osp/router/__init__.py | 0 lib/osp/router/api.py | 42 + lib/osp/router/info.py | 268 + lib/osp/router/main.py | 11 + lib/osp/router/output.py | 212 + lib/osp/security_group/README.md | 1 + lib/osp/security_group/__init__.py | 0 lib/osp/security_group/api.py | 123 + lib/osp/security_group/info.py | 373 + lib/osp/security_group/main.py | 11 + lib/osp/security_group/output.py | 321 + lib/osp/settings.py | 359 + lib/osp/snapshot/__init__.py | 0 lib/osp/snapshot/api.py | 42 + lib/osp/snapshot/info.py | 179 + lib/osp/snapshot/main.py | 11 + lib/osp/snapshot/output.py | 77 + lib/osp/subnet/README.md | 1 + lib/osp/subnet/__init__.py | 0 lib/osp/subnet/api.py | 130 + lib/osp/subnet/info.py | 272 + lib/osp/subnet/main.py | 11 + lib/osp/subnet/output.py | 236 + lib/osp/tenant/__init__.py | 0 lib/osp/tenant/api.py | 46 + lib/osp/tenant/info.py | 127 + lib/osp/tenant/main.py | 11 + lib/osp/tenant/output.py | 81 + lib/osp/user/__init__.py | 0 lib/osp/user/api.py | 42 + lib/osp/user/info.py | 137 + lib/osp/user/main.py | 11 + lib/osp/user/output.py | 51 + lib/osp/virtual_machine/README.md | 5 + lib/osp/virtual_machine/__init__.py | 0 lib/osp/virtual_machine/api.py | 279 + lib/osp/virtual_machine/info.py | 495 + lib/osp/virtual_machine/main.py | 14 + lib/osp/virtual_machine/output.py | 327 + lib/osp/virtual_machine/task.py | 153 + lib/osp/volume/__init__.py | 0 lib/osp/volume/api.py | 42 + lib/osp/volume/info.py | 269 + lib/osp/volume/main.py | 11 + lib/osp/volume/output.py | 131 + lib/output_helper.py | 1405 + lib/psirt/__init__.py | 0 lib/psirt/advisory/__init__.py | 0 lib/psirt/advisory/api.py | 76 + lib/psirt/advisory/info.py | 306 + lib/psirt/advisory/main.py | 11 + lib/psirt/advisory/output.py | 345 + lib/psirt/api.py | 64 + lib/psirt/cache.py | 66 + lib/psirt/common.py | 94 + lib/psirt/main.py | 25 + lib/psirt/output.py | 45 + lib/psirt/settings.py | 101 + lib/redfish/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 144 bytes lib/redfish/__pycache__/cache.cpython-310.pyc | Bin 0 -> 4770 bytes .../__pycache__/common.cpython-310.pyc | Bin 0 -> 9974 bytes lib/redfish/__pycache__/dell.cpython-310.pyc | Bin 0 -> 6219 bytes .../__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 5959 bytes .../endpoint_settings.cpython-310.pyc | Bin 0 -> 7796 bytes lib/redfish/__pycache__/fi.cpython-310.pyc | Bin 0 -> 10421 bytes .../__pycache__/fi_inventory.cpython-310.pyc | Bin 0 -> 2875 bytes .../__pycache__/generic.cpython-310.pyc | Bin 0 -> 3243 bytes lib/redfish/__pycache__/hp.cpython-310.pyc | Bin 0 -> 5295 bytes .../__pycache__/settings.cpython-310.pyc | Bin 0 -> 2125 bytes lib/redfish/__pycache__/tree.cpython-310.pyc | Bin 0 -> 2758 bytes .../__pycache__/ucs_rack.cpython-310.pyc | Bin 0 -> 6915 bytes lib/redfish/cache.py | 171 + lib/redfish/common.py | 601 + lib/redfish/dell/__init__.py | 0 .../dell/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../dell/__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 1707 bytes .../dell/__pycache__/identity.cpython-310.pyc | Bin 0 -> 1873 bytes .../dell/__pycache__/power.cpython-310.pyc | Bin 0 -> 2099 bytes .../dell/__pycache__/template.cpython-310.pyc | Bin 0 -> 1603 bytes .../dell/__pycache__/thermal.cpython-310.pyc | Bin 0 -> 2419 bytes lib/redfish/dell/endpoint.py | 59 + lib/redfish/dell/identity.py | 54 + lib/redfish/dell/output.py | 229 + lib/redfish/dell/power.py | 119 + lib/redfish/dell/template.py | 58 + lib/redfish/dell/thermal.py | 129 + lib/redfish/endpoint.py | 350 + lib/redfish/endpoint_settings.py | 357 + lib/redfish/fi/__init__.py | 0 .../fi/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../fi/__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 6117 bytes .../identity_chassis.cpython-310.pyc | Bin 0 -> 2352 bytes .../identity_server.cpython-310.pyc | Bin 0 -> 2012 bytes .../fi/__pycache__/inventory.cpython-310.pyc | Bin 0 -> 5689 bytes .../fi/__pycache__/main.cpython-310.pyc | Bin 0 -> 5584 bytes .../fi/__pycache__/power.cpython-310.pyc | Bin 0 -> 2859 bytes .../__pycache__/power_chassis.cpython-310.pyc | Bin 0 -> 2314 bytes .../__pycache__/power_server.cpython-310.pyc | Bin 0 -> 2627 bytes .../fi/__pycache__/templates.cpython-310.pyc | Bin 0 -> 2999 bytes .../fi/__pycache__/thermal.cpython-310.pyc | Bin 0 -> 3178 bytes .../thermal_chassis.cpython-310.pyc | Bin 0 -> 1696 bytes .../thermal_server.cpython-310.pyc | Bin 0 -> 1484 bytes lib/redfish/fi/endpoint.py | 390 + lib/redfish/fi/identity_chassis.py | 89 + lib/redfish/fi/identity_server.py | 69 + lib/redfish/fi/inventory.py | 212 + lib/redfish/fi/output.py | 387 + lib/redfish/fi/power_chassis.py | 136 + lib/redfish/fi/power_server.py | 163 + lib/redfish/fi/templates.py | 95 + lib/redfish/fi/thermal_chassis.py | 78 + lib/redfish/fi/thermal_server.py | 83 + lib/redfish/hpe/__init__.py | 0 .../hpe/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../hpe/__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 1375 bytes .../hpe/__pycache__/identity.cpython-310.pyc | Bin 0 -> 1817 bytes .../hpe/__pycache__/power.cpython-310.pyc | Bin 0 -> 1630 bytes .../hpe/__pycache__/template.cpython-310.pyc | Bin 0 -> 1220 bytes .../hpe/__pycache__/thermal.cpython-310.pyc | Bin 0 -> 2398 bytes lib/redfish/hpe/endpoint.py | 53 + lib/redfish/hpe/identity.py | 52 + lib/redfish/hpe/output.py | 193 + lib/redfish/hpe/power.py | 91 + lib/redfish/hpe/template.py | 32 + lib/redfish/hpe/thermal.py | 129 + lib/redfish/output.py | 213 + lib/redfish/settings.py | 60 + lib/redfish/standard/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 4068 bytes lib/redfish/standard/endpoint.py | 416 + lib/redfish/tree.py | 157 + lib/redfish/ucs_rack/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 2340 bytes .../__pycache__/identity.cpython-310.pyc | Bin 0 -> 1866 bytes .../__pycache__/power.cpython-310.pyc | Bin 0 -> 2834 bytes .../__pycache__/template.cpython-310.pyc | Bin 0 -> 2234 bytes .../__pycache__/thermal.cpython-310.pyc | Bin 0 -> 3039 bytes lib/redfish/ucs_rack/account/__init__.py | 0 lib/redfish/ucs_rack/account/main.py | 87 + lib/redfish/ucs_rack/endpoint.py | 179 + lib/redfish/ucs_rack/output.py | 54 + lib/redfish/ucs_rack/template/__init__.py | 0 .../ucs_rack/template/account/__init__.py | 0 lib/redfish/ucs_rack/template/account/main.py | 131 + .../ucs_rack/template/account/output.py | 59 + .../ucs_rack/template/bios/__init__.py | 0 lib/redfish/ucs_rack/template/bios/main.py | 42 + lib/redfish/ucs_rack/template/bios/output.py | 98 + lib/redfish/ucs_rack/template/cpu/__init__.py | 0 lib/redfish/ucs_rack/template/cpu/main.py | 124 + lib/redfish/ucs_rack/template/cpu/output.py | 55 + lib/redfish/ucs_rack/template/fan/__init__.py | 0 lib/redfish/ucs_rack/template/fan/main.py | 91 + lib/redfish/ucs_rack/template/fan/output.py | 45 + lib/redfish/ucs_rack/template/gpu/__init__.py | 0 lib/redfish/ucs_rack/template/gpu/main.py | 83 + lib/redfish/ucs_rack/template/gpu/output.py | 41 + .../ucs_rack/template/identity/__init__.py | 0 .../ucs_rack/template/identity/main.py | 72 + .../ucs_rack/template/identity/output.py | 43 + lib/redfish/ucs_rack/template/main.py | 123 + lib/redfish/ucs_rack/template/mem/__init__.py | 0 lib/redfish/ucs_rack/template/mem/main.py | 122 + lib/redfish/ucs_rack/template/mem/output.py | 65 + lib/redfish/ucs_rack/template/net/__init__.py | 0 lib/redfish/ucs_rack/template/net/main.py | 77 + lib/redfish/ucs_rack/template/net/output.py | 40 + lib/redfish/ucs_rack/template/output.py | 47 + lib/redfish/ucs_rack/template/pci/__init__.py | 0 lib/redfish/ucs_rack/template/pci/main.py | 134 + lib/redfish/ucs_rack/template/pci/output.py | 59 + .../ucs_rack/template/power/__init__.py | 0 lib/redfish/ucs_rack/template/power/main.py | 186 + lib/redfish/ucs_rack/template/power/output.py | 98 + lib/redfish/ucs_rack/template/psu/__init__.py | 0 lib/redfish/ucs_rack/template/psu/main.py | 87 + lib/redfish/ucs_rack/template/psu/output.py | 50 + .../ucs_rack/template/role/__init__.py | 0 lib/redfish/ucs_rack/template/role/main.py | 88 + lib/redfish/ucs_rack/template/role/output.py | 57 + .../ucs_rack/template/storage/__init__.py | 0 lib/redfish/ucs_rack/template/storage/main.py | 421 + .../ucs_rack/template/storage/output.py | 179 + .../ucs_rack/template/thermal/__init__.py | 0 lib/redfish/ucs_rack/template/thermal/main.py | 167 + .../ucs_rack/template/thermal/output.py | 86 + lib/self_doc.py | 1154 + lib/self_testing.py | 901 + lib/settings_helper.py | 154 + lib/ssh.py | 787 + lib/template.py | 578 + lib/template_helper.py | 75 + lib/ucsm/__init__.py | 0 lib/ucsm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 141 bytes lib/ucsm/__pycache__/blade.cpython-310.pyc | Bin 0 -> 3138 bytes lib/ucsm/__pycache__/chassis.cpython-310.pyc | Bin 0 -> 3974 bytes .../endpoint_settings.cpython-310.pyc | Bin 0 -> 4515 bytes lib/ucsm/__pycache__/manager.cpython-310.pyc | Bin 0 -> 3342 bytes lib/ucsm/__pycache__/power.cpython-310.pyc | Bin 0 -> 685 bytes lib/ucsm/__pycache__/settings.cpython-310.pyc | Bin 0 -> 4011 bytes lib/ucsm/__pycache__/thermal.cpython-310.pyc | Bin 0 -> 703 bytes lib/ucsm/blade.py | 190 + lib/ucsm/chassis.py | 251 + lib/ucsm/endpoint_settings.py | 208 + lib/ucsm/manager.py | 129 + lib/ucsm/mo/ComputeBlade.md | 3876 ++ lib/ucsm/mo/ComputeMbPowerStats.md | 423 + lib/ucsm/mo/EquipmentChassis.md | 9226 ++++ lib/ucsm/mo/EquipmentChassisStats.md | 833 + lib/ucsm/mo/EquipmentPsuInputStats.md | 436 + lib/ucsm/mo/sys.md | 14200 +++++ lib/ucsm/power.py | 10 + lib/ucsm/power_modules/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../__pycache__/chassis.cpython-310.pyc | Bin 0 -> 5271 bytes .../__pycache__/fi.cpython-310.pyc | Bin 0 -> 1340 bytes .../__pycache__/server.cpython-310.pyc | Bin 0 -> 3591 bytes lib/ucsm/power_modules/chassis.py | 295 + lib/ucsm/power_modules/fi.py | 45 + lib/ucsm/power_modules/server.py | 183 + lib/ucsm/settings.py | 153 + lib/ucsm/thermal.py | 10 + lib/ucsm/thermal_modules/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../__pycache__/chassis.cpython-310.pyc | Bin 0 -> 6522 bytes .../__pycache__/fi.cpython-310.pyc | Bin 0 -> 860 bytes .../__pycache__/server.cpython-310.pyc | Bin 0 -> 6328 bytes lib/ucsm/thermal_modules/chassis.py | 463 + lib/ucsm/thermal_modules/fi.py | 24 + lib/ucsm/thermal_modules/server.py | 351 + lib/vc/__init__.py | 0 lib/vc/common.py | 82 + lib/vc/connect.py | 62 + lib/vc/datacenter.py | 59 + lib/vc/datastore.py | 476 + lib/vc/helper.py | 160 + lib/vc/host/__init__.py | 0 .../host/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 144 bytes lib/vc/host/__pycache__/api.cpython-310.pyc | Bin 0 -> 2736 bytes .../__pycache__/filtering.cpython-310.pyc | Bin 0 -> 804 bytes lib/vc/host/__pycache__/main.cpython-310.pyc | Bin 0 -> 717 bytes .../__pycache__/networking.cpython-310.pyc | Bin 0 -> 9808 bytes .../host/__pycache__/summary.cpython-310.pyc | Bin 0 -> 3518 bytes lib/vc/host/api.py | 129 + lib/vc/host/filtering.py | 28 + lib/vc/host/main.py | 12 + lib/vc/host/networking.py | 736 + lib/vc/host/summary.py | 194 + lib/vc/network.py | 183 + lib/vc/settings.py | 177 + lib/vc/vcenter.py | 60 + lib/vc/virtual_machine.py | 843 + lib/vc/virtual_machine_deployment_lcm.py | 596 + .../virtual_machine_deployment_validator.py | 890 + lib/vc/virtual_machine_lcm.py | 428 + lib/vc/vm_cluster.py | 80 + lib/vc/vm_folder.py | 59 + lib/webex_bot/__init__.py | 4 + lib/webex_bot/api.py | 48 + lib/webex_bot/cards/__init__.py | 0 lib/webex_bot/commands/__init__.py | 0 lib/webex_bot/commands/aci.py | 467 + lib/webex_bot/commands/echo.py | 86 + lib/webex_bot/commands/help.py | 91 + lib/webex_bot/commands/info.py | 44 + lib/webex_bot/commands/nx.py | 358 + lib/webex_bot/commands/server.py | 1079 + lib/webex_bot/commands/settings.py | 135 + lib/webex_bot/commands/template.py | 56 + lib/webex_bot/commands/validations.py | 44 + lib/webex_bot/commands/whoami.py | 47 + lib/webex_bot/exceptions.py | 16 + lib/webex_bot/formatting.py | 18 + lib/webex_bot/mode/__init__.py | 4 + lib/webex_bot/mode/backend.py | 58 + lib/webex_bot/mode/members.py | 13 + lib/webex_bot/models/__init__.py | 0 lib/webex_bot/models/command.py | 97 + lib/webex_bot/models/response.py | 103 + lib/webex_bot/webex_bot.py | 406 + lib/webex_bot/websockets/__init__.py | 0 .../websockets/webex_websocket_client.py | 218 + lib/workflow/__init__.py | 0 lib/workflow/ocp_bm_install.py | 1065 + lib/workflow/osp_ocp_migration.py | 412 + lib/xd/__init__.py | 0 lib/xd/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 139 bytes lib/xd/__pycache__/aci.cpython-310.pyc | Bin 0 -> 2657 bytes lib/xd/__pycache__/nexus.cpython-310.pyc | Bin 0 -> 750 bytes lib/xd/__pycache__/ocp2fabric.cpython-310.pyc | Bin 0 -> 747 bytes .../__pycache__/server2fabric.cpython-310.pyc | Bin 0 -> 2717 bytes lib/xd/__pycache__/vc2fabric.cpython-310.pyc | Bin 0 -> 1152 bytes lib/xd/aci.py | 148 + lib/xd/nexus.py | 28 + lib/xd/ocp2fabric.py | 29 + lib/xd/server2fabric.py | 119 + lib/xd/vc2fabric.py | 53 + lib/xmltodict.py | 362 + menu/__init__.py | 0 menu/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 137 bytes menu/__pycache__/common.cpython-310.pyc | Bin 0 -> 2537 bytes menu/__pycache__/defaults.cpython-310.pyc | Bin 0 -> 926 bytes menu/__pycache__/main.cpython-310.pyc | Bin 0 -> 5017 bytes menu/__pycache__/progress.cpython-310.pyc | Bin 0 -> 656 bytes menu/__pycache__/user_inputs.cpython-310.pyc | Bin 0 -> 3750 bytes menu/__pycache__/validations.cpython-310.pyc | Bin 0 -> 34599 bytes menu/common.py | 221 + menu/create/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 144 bytes menu/create/__pycache__/main.cpython-310.pyc | Bin 0 -> 1183 bytes .../__pycache__/os_image.cpython-310.pyc | Bin 0 -> 3414 bytes .../__pycache__/os_install.cpython-310.pyc | Bin 0 -> 1852 bytes menu/create/__pycache__/scu.cpython-310.pyc | Bin 0 -> 3405 bytes .../__pycache__/user_inputs.cpython-310.pyc | Bin 0 -> 2970 bytes menu/create/helm/__init__.py | 0 menu/create/helm/chart.py | 137 + menu/create/helm/main.py | 18 + menu/create/helm/release.py | 228 + menu/create/k8s/__init__.py | 0 menu/create/k8s/main.py | 20 + menu/create/k8s/pvc.py | 234 + menu/create/k8s/srnnp.py | 193 + menu/create/k8s/vm.py | 80 + menu/create/main.py | 34 + menu/create/nso/__init__.py | 0 .../nso/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../nso/__pycache__/main.cpython-310.pyc | Bin 0 -> 600 bytes menu/create/nso/main.py | 16 + menu/create/nso/nfvo/__init__.py | 0 .../nfvo/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../nso/nfvo/__pycache__/main.cpython-310.pyc | Bin 0 -> 714 bytes .../nso/nfvo/__pycache__/vnfd.cpython-310.pyc | Bin 0 -> 2451 bytes .../nso/nfvo/__pycache__/vnfi.cpython-310.pyc | Bin 0 -> 2912 bytes menu/create/nso/nfvo/main.py | 18 + menu/create/nso/nfvo/vnfd.py | 105 + menu/create/nso/nfvo/vnfi.py | 133 + menu/create/ocp/__init__.py | 0 .../ocp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../ocp/__pycache__/cluster.cpython-310.pyc | Bin 0 -> 1768 bytes .../ocp/__pycache__/main.cpython-310.pyc | Bin 0 -> 848 bytes .../create/ocp/__pycache__/vm.cpython-310.pyc | Bin 0 -> 1749 bytes menu/create/ocp/addon/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 154 bytes .../ocp/addon/__pycache__/iwo.cpython-310.pyc | Bin 0 -> 1712 bytes .../addon/__pycache__/main.cpython-310.pyc | Bin 0 -> 634 bytes menu/create/ocp/addon/iwo.py | 55 + menu/create/ocp/addon/main.py | 16 + menu/create/ocp/cluster/bm.py | 44 + menu/create/ocp/cluster/main.py | 18 + menu/create/ocp/cluster/vsphere.py | 45 + menu/create/ocp/main.py | 20 + menu/create/ocp/migrate.py | 285 + menu/create/os_image.py | 131 + menu/create/os_install/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../__pycache__/batch.cpython-310.pyc | Bin 0 -> 2658 bytes .../__pycache__/common.cpython-310.pyc | Bin 0 -> 2333 bytes .../__pycache__/dhcp.cpython-310.pyc | Bin 0 -> 3094 bytes .../__pycache__/embedded.cpython-310.pyc | Bin 0 -> 2792 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 941 bytes .../__pycache__/static.cpython-310.pyc | Bin 0 -> 3441 bytes .../__pycache__/user_inputs.cpython-310.pyc | Bin 0 -> 1589 bytes .../__pycache__/validations.cpython-310.pyc | Bin 0 -> 11959 bytes menu/create/os_install/batch.py | 92 + menu/create/os_install/common.py | 107 + menu/create/os_install/dhcp.py | 120 + menu/create/os_install/embedded.py | 104 + menu/create/os_install/main.py | 22 + menu/create/os_install/static.py | 132 + menu/create/os_install/validations.py | 658 + menu/create/osp/__init__.py | 0 menu/create/osp/fip.py | 252 + menu/create/osp/flv.py | 103 + menu/create/osp/img.py | 161 + menu/create/osp/main.py | 28 + menu/create/osp/net.py | 169 + menu/create/osp/rule.py | 174 + menu/create/osp/sub.py | 202 + menu/create/osp/vm.py | 319 + menu/create/scu.py | 135 + menu/create/server/__init__.py | 0 menu/create/server/main.py | 16 + menu/create/server/user.py | 133 + menu/create/vc/__init__.py | 0 menu/create/vc/main.py | 16 + menu/create/vc/vm.py | 83 + menu/defaults.py | 17 + menu/delete/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 144 bytes menu/delete/__pycache__/main.cpython-310.pyc | Bin 0 -> 1475 bytes .../__pycache__/os_image.cpython-310.pyc | Bin 0 -> 1999 bytes menu/delete/__pycache__/scu.cpython-310.pyc | Bin 0 -> 2030 bytes menu/delete/aci/__init__.py | 0 .../aci/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../__pycache__/controller.cpython-310.pyc | Bin 0 -> 1310 bytes .../aci/__pycache__/main.cpython-310.pyc | Bin 0 -> 610 bytes .../aci/__pycache__/manager.cpython-310.pyc | Bin 0 -> 1392 bytes menu/delete/aci/controller.py | 50 + menu/delete/aci/main.py | 16 + menu/delete/cvim/__init__.py | 0 menu/delete/cvim/cluster.py | 52 + menu/delete/cvim/main.py | 16 + menu/delete/helm/__init__.py | 0 menu/delete/helm/chart.py | 131 + menu/delete/helm/main.py | 18 + menu/delete/helm/release.py | 168 + menu/delete/k8s/__init__.py | 0 menu/delete/k8s/cluster.py | 59 + menu/delete/k8s/dv.py | 120 + menu/delete/k8s/main.py | 24 + menu/delete/k8s/pvc.py | 147 + menu/delete/k8s/srnnp.py | 105 + menu/delete/k8s/vm.py | 73 + menu/delete/linux/__init__.py | 0 menu/delete/linux/main.py | 16 + menu/delete/linux/server.py | 59 + menu/delete/main.py | 44 + menu/delete/nso/__init__.py | 0 .../nso/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../nso/__pycache__/main.cpython-310.pyc | Bin 0 -> 600 bytes menu/delete/nso/main.py | 16 + menu/delete/nso/nfvo/__init__.py | 0 .../nfvo/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../nso/nfvo/__pycache__/main.cpython-310.pyc | Bin 0 -> 714 bytes .../nso/nfvo/__pycache__/vnfd.cpython-310.pyc | Bin 0 -> 2454 bytes .../nso/nfvo/__pycache__/vnfi.cpython-310.pyc | Bin 0 -> 2472 bytes menu/delete/nso/nfvo/main.py | 18 + menu/delete/nso/nfvo/vnfd.py | 108 + menu/delete/nso/nfvo/vnfi.py | 108 + menu/delete/nx/__init__.py | 0 menu/delete/nx/device.py | 50 + menu/delete/nx/main.py | 16 + menu/delete/ocp/__init__.py | 0 .../ocp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../ocp/__pycache__/cluster.cpython-310.pyc | Bin 0 -> 1272 bytes .../ocp/__pycache__/main.cpython-310.pyc | Bin 0 -> 848 bytes .../delete/ocp/__pycache__/vm.cpython-310.pyc | Bin 0 -> 2290 bytes menu/delete/ocp/addon/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 154 bytes .../ocp/addon/__pycache__/iwo.cpython-310.pyc | Bin 0 -> 1547 bytes .../addon/__pycache__/main.cpython-310.pyc | Bin 0 -> 634 bytes menu/delete/ocp/addon/iwo.py | 53 + menu/delete/ocp/addon/main.py | 16 + menu/delete/ocp/cluster/__init__.py | 0 menu/delete/ocp/cluster/main.py | 16 + menu/delete/ocp/cluster/vsphere.py | 47 + menu/delete/ocp/main.py | 18 + menu/delete/os_image.py | 68 + menu/delete/osp/__init__.py | 0 menu/delete/osp/cluster.py | 56 + menu/delete/osp/fip.py | 104 + menu/delete/osp/flv.py | 94 + menu/delete/osp/img.py | 94 + menu/delete/osp/main.py | 30 + menu/delete/osp/net.py | 106 + menu/delete/osp/rule.py | 139 + menu/delete/osp/sub.py | 109 + menu/delete/osp/vm.py | 148 + menu/delete/redfish/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../__pycache__/access.cpython-310.pyc | Bin 0 -> 2622 bytes .../redfish/__pycache__/adhoc.cpython-310.pyc | Bin 0 -> 4191 bytes .../redfish/__pycache__/cache.cpython-310.pyc | Bin 0 -> 1628 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 2279 bytes .../__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 5684 bytes .../redfish/__pycache__/fi.cpython-310.pyc | Bin 0 -> 1227 bytes .../redfish/__pycache__/main.cpython-310.pyc | Bin 0 -> 716 bytes .../__pycache__/settings.cpython-310.pyc | Bin 0 -> 1752 bytes .../redfish/__pycache__/ucsc.cpython-310.pyc | Bin 0 -> 2616 bytes menu/delete/redfish/access.py | 108 + menu/delete/redfish/cache.py | 64 + menu/delete/redfish/main.py | 18 + menu/delete/scu.py | 71 + menu/delete/server/main.py | 16 + menu/delete/server/user.py | 136 + menu/delete/ucsm/__init__.py | 0 .../ucsm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../ucsm/__pycache__/main.cpython-310.pyc | Bin 0 -> 610 bytes .../ucsm/__pycache__/manager.cpython-310.pyc | Bin 0 -> 1392 bytes menu/delete/ucsm/main.py | 16 + menu/delete/ucsm/manager.py | 52 + menu/delete/vc/__init__.py | 0 menu/delete/vc/main.py | 16 + menu/delete/vc/vm.py | 112 + menu/get/__init__.py | 0 menu/get/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 141 bytes menu/get/__pycache__/chassis.cpython-310.pyc | Bin 0 -> 3438 bytes menu/get/__pycache__/chassiz.cpython-310.pyc | Bin 0 -> 2203 bytes menu/get/__pycache__/main.cpython-310.pyc | Bin 0 -> 1583 bytes .../get/__pycache__/os_config.cpython-310.pyc | Bin 0 -> 2438 bytes menu/get/__pycache__/os_image.cpython-310.pyc | Bin 0 -> 1884 bytes .../get/__pycache__/os_vendor.cpython-310.pyc | Bin 0 -> 1774 bytes .../__pycache__/os_version.cpython-310.pyc | Bin 0 -> 2154 bytes menu/get/__pycache__/power.cpython-310.pyc | Bin 0 -> 2895 bytes menu/get/__pycache__/scu.cpython-310.pyc | Bin 0 -> 1891 bytes menu/get/__pycache__/server.cpython-310.pyc | Bin 0 -> 8030 bytes menu/get/__pycache__/servers.cpython-310.pyc | Bin 0 -> 5932 bytes menu/get/__pycache__/summary.cpython-310.pyc | Bin 0 -> 4038 bytes menu/get/__pycache__/thermal.cpython-310.pyc | Bin 0 -> 2907 bytes menu/get/__pycache__/workflow.cpython-310.pyc | Bin 0 -> 1955 bytes .../get/__pycache__/workflows.cpython-310.pyc | Bin 0 -> 3659 bytes menu/get/aci/__init__.py | 0 .../aci/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes menu/get/aci/__pycache__/aaep.cpython-310.pyc | Bin 0 -> 4772 bytes menu/get/aci/__pycache__/ap.cpython-310.pyc | Bin 0 -> 5056 bytes menu/get/aci/__pycache__/bd.cpython-310.pyc | Bin 0 -> 6108 bytes .../get/aci/__pycache__/cache.cpython-310.pyc | Bin 0 -> 1906 bytes .../aci/__pycache__/contract.cpython-310.pyc | Bin 0 -> 4252 bytes .../__pycache__/controller.cpython-310.pyc | Bin 0 -> 1414 bytes .../aci/__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 3936 bytes .../aci/__pycache__/endpoints.cpython-310.pyc | Bin 0 -> 3888 bytes menu/get/aci/__pycache__/ep.cpython-310.pyc | Bin 0 -> 5217 bytes menu/get/aci/__pycache__/epg.cpython-310.pyc | Bin 0 -> 7513 bytes .../get/aci/__pycache__/l2out.cpython-310.pyc | Bin 0 -> 4793 bytes .../get/aci/__pycache__/l3out.cpython-310.pyc | Bin 0 -> 5974 bytes menu/get/aci/__pycache__/main.cpython-310.pyc | Bin 0 -> 2181 bytes menu/get/aci/__pycache__/node.cpython-310.pyc | Bin 0 -> 4312 bytes .../aci/__pycache__/tenant.cpython-310.pyc | Bin 0 -> 4368 bytes menu/get/aci/__pycache__/vrf.cpython-310.pyc | Bin 0 -> 5908 bytes menu/get/aci/aaep.py | 274 + menu/get/aci/ap.py | 282 + menu/get/aci/bd.py | 367 + menu/get/aci/cache.py | 80 + menu/get/aci/contract/__init__.py | 0 menu/get/aci/contract/filter.py | 265 + menu/get/aci/contract/main.py | 20 + menu/get/aci/contract/standard.py | 261 + menu/get/aci/contract/taboo.py | 261 + menu/get/aci/controller.py | 53 + menu/get/aci/domain/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../domain/__pycache__/aaa.cpython-310.pyc | Bin 0 -> 3802 bytes .../aci/domain/__pycache__/l2.cpython-310.pyc | Bin 0 -> 5251 bytes .../aci/domain/__pycache__/l3.cpython-310.pyc | Bin 0 -> 5251 bytes .../domain/__pycache__/main.cpython-310.pyc | Bin 0 -> 959 bytes .../domain/__pycache__/phy.cpython-310.pyc | Bin 0 -> 5265 bytes .../domain/__pycache__/vmm.cpython-310.pyc | Bin 0 -> 5546 bytes menu/get/aci/domain/aaa.py | 197 + menu/get/aci/domain/l2.py | 311 + menu/get/aci/domain/l3.py | 311 + menu/get/aci/domain/main.py | 24 + menu/get/aci/domain/phy.py | 311 + menu/get/aci/domain/vmm.py | 337 + menu/get/aci/ep.py | 296 + menu/get/aci/epg.py | 495 + menu/get/aci/intf/__init__.py | 0 .../intf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../intf/__pycache__/cloudsec.cpython-310.pyc | Bin 0 -> 5477 bytes .../aci/intf/__pycache__/fc.cpython-310.pyc | Bin 0 -> 5411 bytes .../aci/intf/__pycache__/fcpc.cpython-310.pyc | Bin 0 -> 5433 bytes .../aci/intf/__pycache__/l3.cpython-310.pyc | Bin 0 -> 2863 bytes .../aci/intf/__pycache__/l3e.cpython-310.pyc | Bin 0 -> 5486 bytes .../aci/intf/__pycache__/lb.cpython-310.pyc | Bin 0 -> 5489 bytes .../intf/__pycache__/macsec.cpython-310.pyc | Bin 0 -> 5708 bytes .../aci/intf/__pycache__/main.cpython-310.pyc | Bin 0 -> 1780 bytes .../aci/intf/__pycache__/mgmt.cpython-310.pyc | Bin 0 -> 5522 bytes .../aci/intf/__pycache__/pc.cpython-310.pyc | Bin 0 -> 6376 bytes .../aci/intf/__pycache__/phy.cpython-310.pyc | Bin 0 -> 11461 bytes .../intf/__pycache__/summary.cpython-310.pyc | Bin 0 -> 2610 bytes .../aci/intf/__pycache__/svi.cpython-310.pyc | Bin 0 -> 6283 bytes .../aci/intf/__pycache__/tun.cpython-310.pyc | Bin 0 -> 5961 bytes .../aci/intf/__pycache__/vfc.cpython-310.pyc | Bin 0 -> 5422 bytes .../aci/intf/__pycache__/vpc.cpython-310.pyc | Bin 0 -> 5925 bytes menu/get/aci/intf/cloudsec.py | 287 + menu/get/aci/intf/fc.py | 287 + menu/get/aci/intf/fcpc.py | 287 + menu/get/aci/intf/l3e.py | 286 + menu/get/aci/intf/lb.py | 288 + menu/get/aci/intf/macsec.py | 304 + menu/get/aci/intf/main.py | 42 + menu/get/aci/intf/mgmt.py | 299 + menu/get/aci/intf/pc.py | 354 + menu/get/aci/intf/phy.py | 746 + menu/get/aci/intf/summary.py | 116 + menu/get/aci/intf/svi.py | 341 + menu/get/aci/intf/tun.py | 318 + menu/get/aci/intf/vfc.py | 287 + menu/get/aci/intf/vpc.py | 311 + menu/get/aci/l2out.py | 275 + menu/get/aci/l3out.py | 339 + menu/get/aci/mac.py | 191 + menu/get/aci/main.py | 62 + menu/get/aci/mo.py | 169 + menu/get/aci/node.py | 254 + menu/get/aci/pg/__init__.py | 0 .../pg/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../aci/pg/__pycache__/main.cpython-310.pyc | Bin 0 -> 613 bytes menu/get/aci/pg/access/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../access/__pycache__/main.cpython-310.pyc | Bin 0 -> 653 bytes menu/get/aci/pg/access/intf/__init__.py | 0 .../intf/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../intf/__pycache__/main.cpython-310.pyc | Bin 0 -> 791 bytes .../intf/__pycache__/port.cpython-310.pyc | Bin 0 -> 5352 bytes .../intf/__pycache__/vpc.cpython-310.pyc | Bin 0 -> 5338 bytes menu/get/aci/pg/access/intf/main.py | 18 + menu/get/aci/pg/access/intf/port.py | 298 + menu/get/aci/pg/access/intf/vpc.py | 318 + menu/get/aci/pg/access/main.py | 16 + menu/get/aci/pg/main.py | 16 + menu/get/aci/policy/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../policy/__pycache__/auth.cpython-310.pyc | Bin 0 -> 3652 bytes .../policy/__pycache__/cdp.cpython-310.pyc | Bin 0 -> 3640 bytes .../policy/__pycache__/copp.cpython-310.pyc | Bin 0 -> 3650 bytes .../policy/__pycache__/dpp.cpython-310.pyc | Bin 0 -> 3640 bytes .../policy/__pycache__/drain.cpython-310.pyc | Bin 0 -> 3695 bytes .../aci/policy/__pycache__/fc.cpython-310.pyc | Bin 0 -> 3630 bytes .../policy/__pycache__/flap.cpython-310.pyc | Bin 0 -> 3680 bytes .../aci/policy/__pycache__/l2.cpython-310.pyc | Bin 0 -> 3630 bytes .../policy/__pycache__/lacp.cpython-310.pyc | Bin 0 -> 3714 bytes .../__pycache__/lacp_member.cpython-310.pyc | Bin 0 -> 3779 bytes .../policy/__pycache__/link.cpython-310.pyc | Bin 0 -> 3716 bytes .../__pycache__/link_fc.cpython-310.pyc | Bin 0 -> 3719 bytes .../policy/__pycache__/lldp.cpython-310.pyc | Bin 0 -> 3650 bytes .../policy/__pycache__/main.cpython-310.pyc | Bin 0 -> 2363 bytes .../policy/__pycache__/mcp.cpython-310.pyc | Bin 0 -> 3640 bytes .../policy/__pycache__/pfc.cpython-310.pyc | Bin 0 -> 3640 bytes .../__pycache__/portsec.cpython-310.pyc | Bin 0 -> 3728 bytes .../policy/__pycache__/storm.cpython-310.pyc | Bin 0 -> 3724 bytes .../policy/__pycache__/stp.cpython-310.pyc | Bin 0 -> 3640 bytes .../policy/__pycache__/synce.cpython-310.pyc | Bin 0 -> 3660 bytes .../__pycache__/transceiver.cpython-310.pyc | Bin 0 -> 3588 bytes menu/get/aci/policy/auth.py | 179 + menu/get/aci/policy/cdp.py | 179 + menu/get/aci/policy/copp.py | 179 + menu/get/aci/policy/dpp.py | 179 + menu/get/aci/policy/drain.py | 179 + menu/get/aci/policy/fc.py | 179 + menu/get/aci/policy/flap.py | 179 + menu/get/aci/policy/l2.py | 179 + menu/get/aci/policy/lacp.py | 179 + menu/get/aci/policy/lacp_member.py | 179 + menu/get/aci/policy/link.py | 181 + menu/get/aci/policy/link_fc.py | 179 + menu/get/aci/policy/lldp.py | 179 + menu/get/aci/policy/main.py | 54 + menu/get/aci/policy/mcp.py | 179 + menu/get/aci/policy/pfc.py | 179 + menu/get/aci/policy/portsec.py | 179 + menu/get/aci/policy/storm.py | 179 + menu/get/aci/policy/stp.py | 179 + menu/get/aci/policy/synce.py | 179 + menu/get/aci/policy/transceiver.py | 172 + menu/get/aci/pool/__init__.py | 0 .../pool/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../aci/pool/__pycache__/main.cpython-310.pyc | Bin 0 -> 609 bytes .../aci/pool/__pycache__/vlan.cpython-310.pyc | Bin 0 -> 4645 bytes menu/get/aci/pool/main.py | 16 + menu/get/aci/pool/vlan.py | 262 + menu/get/aci/proto/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../aci/proto/__pycache__/arp.cpython-310.pyc | Bin 0 -> 5845 bytes .../aci/proto/__pycache__/bfd.cpython-310.pyc | Bin 0 -> 5895 bytes .../aci/proto/__pycache__/bgp.cpython-310.pyc | Bin 0 -> 6688 bytes .../aci/proto/__pycache__/cdp.cpython-310.pyc | Bin 0 -> 4616 bytes .../proto/__pycache__/hsrp.cpython-310.pyc | Bin 0 -> 4978 bytes .../proto/__pycache__/ipv4.cpython-310.pyc | Bin 0 -> 5576 bytes .../proto/__pycache__/ipv6.cpython-310.pyc | Bin 0 -> 5576 bytes .../proto/__pycache__/isis.cpython-310.pyc | Bin 0 -> 5787 bytes .../proto/__pycache__/lacp.cpython-310.pyc | Bin 0 -> 3849 bytes .../proto/__pycache__/lldp.cpython-310.pyc | Bin 0 -> 5428 bytes .../proto/__pycache__/main.cpython-310.pyc | Bin 0 -> 1531 bytes .../aci/proto/__pycache__/nd.cpython-310.pyc | Bin 0 -> 5328 bytes menu/get/aci/proto/arp.py | 334 + menu/get/aci/proto/bfd.py | 328 + menu/get/aci/proto/bgp.py | 396 + menu/get/aci/proto/cdp.py | 249 + menu/get/aci/proto/hsrp.py | 282 + menu/get/aci/proto/ipv4.py | 316 + menu/get/aci/proto/ipv6.py | 316 + menu/get/aci/proto/isis.py | 356 + menu/get/aci/proto/lacp.py | 213 + menu/get/aci/proto/lldp.py | 307 + menu/get/aci/proto/main.py | 36 + menu/get/aci/proto/nd.py | 307 + menu/get/aci/psirt.py | 164 + menu/get/aci/server.py | 176 + menu/get/aci/system/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../system/__pycache__/fault.cpython-310.pyc | Bin 0 -> 3890 bytes .../system/__pycache__/main.cpython-310.pyc | Bin 0 -> 623 bytes menu/get/aci/system/fault.py | 188 + menu/get/aci/system/main.py | 16 + menu/get/aci/tenant.py | 245 + menu/get/aci/vrf.py | 357 + menu/get/chassis.py | 308 + menu/get/cvim/__init__.py | 0 menu/get/cvim/cluster.py | 77 + menu/get/cvim/main.py | 16 + menu/get/helm/__init__.py | 0 menu/get/helm/chart.py | 148 + menu/get/helm/main.py | 18 + menu/get/helm/release.py | 157 + menu/get/intersight/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../__pycache__/chassis.cpython-310.pyc | Bin 0 -> 4283 bytes .../__pycache__/chassiz.cpython-310.pyc | Bin 0 -> 2535 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 1487 bytes .../__pycache__/os_config.cpython-310.pyc | Bin 0 -> 2460 bytes .../__pycache__/os_image.cpython-310.pyc | Bin 0 -> 1906 bytes .../__pycache__/os_vendor.cpython-310.pyc | Bin 0 -> 1796 bytes .../__pycache__/os_version.cpython-310.pyc | Bin 0 -> 2176 bytes .../__pycache__/scu.cpython-310.pyc | Bin 0 -> 1913 bytes .../__pycache__/server.cpython-310.pyc | Bin 0 -> 8052 bytes .../__pycache__/servers.cpython-310.pyc | Bin 0 -> 6946 bytes .../__pycache__/summary.cpython-310.pyc | Bin 0 -> 6236 bytes .../__pycache__/workflow.cpython-310.pyc | Bin 0 -> 1977 bytes .../__pycache__/workflows.cpython-310.pyc | Bin 0 -> 3690 bytes menu/get/intersight/alarm.py | 156 + menu/get/intersight/iaccount.py | 33 + menu/get/intersight/main.py | 34 + menu/get/intersight/os_config.py | 75 + menu/get/intersight/os_image.py | 68 + menu/get/intersight/os_vendor.py | 58 + menu/get/intersight/os_version.py | 69 + menu/get/intersight/scu.py | 67 + menu/get/intersight/settings.py | 15 + menu/get/intersight/workflow.py | 71 + menu/get/intersight/workflows.py | 170 + menu/get/iwo/__init__.py | 0 .../iwo/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes .../iwo/__pycache__/action.cpython-310.pyc | Bin 0 -> 2044 bytes .../__pycache__/application.cpython-310.pyc | Bin 0 -> 3447 bytes .../iwo/__pycache__/chassis.cpython-310.pyc | Bin 0 -> 2024 bytes .../iwo/__pycache__/cluster.cpython-310.pyc | Bin 0 -> 2024 bytes .../iwo/__pycache__/container.cpython-310.pyc | Bin 0 -> 3381 bytes menu/get/iwo/__pycache__/dc.cpython-310.pyc | Bin 0 -> 2014 bytes menu/get/iwo/__pycache__/dcs.cpython-310.pyc | Bin 0 -> 2009 bytes menu/get/iwo/__pycache__/disk.cpython-310.pyc | Bin 0 -> 2003 bytes menu/get/iwo/__pycache__/main.cpython-310.pyc | Bin 0 -> 2215 bytes .../iwo/__pycache__/namespace.cpython-310.pyc | Bin 0 -> 2038 bytes .../iwo/__pycache__/network.cpython-310.pyc | Bin 0 -> 2024 bytes menu/get/iwo/__pycache__/phy.cpython-310.pyc | Bin 0 -> 3565 bytes menu/get/iwo/__pycache__/pod.cpython-310.pyc | Bin 0 -> 1996 bytes .../iwo/__pycache__/region.cpython-310.pyc | Bin 0 -> 2017 bytes .../iwo/__pycache__/service.cpython-310.pyc | Bin 0 -> 3198 bytes menu/get/iwo/__pycache__/spec.cpython-310.pyc | Bin 0 -> 2003 bytes .../iwo/__pycache__/storage.cpython-310.pyc | Bin 0 -> 3331 bytes .../iwo/__pycache__/switch.cpython-310.pyc | Bin 0 -> 2017 bytes .../iwo/__pycache__/target.cpython-310.pyc | Bin 0 -> 2007 bytes .../iwo/__pycache__/targets.cpython-310.pyc | Bin 0 -> 1369 bytes menu/get/iwo/__pycache__/vdc.cpython-310.pyc | Bin 0 -> 3353 bytes menu/get/iwo/__pycache__/vdcs.cpython-310.pyc | Bin 0 -> 2037 bytes menu/get/iwo/__pycache__/vm.cpython-310.pyc | Bin 0 -> 2017 bytes menu/get/iwo/__pycache__/vms.cpython-310.pyc | Bin 0 -> 1345 bytes .../iwo/__pycache__/volume.cpython-310.pyc | Bin 0 -> 2017 bytes .../iwo/__pycache__/workload.cpython-310.pyc | Bin 0 -> 2031 bytes menu/get/iwo/__pycache__/zone.cpython-310.pyc | Bin 0 -> 2003 bytes menu/get/iwo/action.py | 85 + menu/get/iwo/application.py | 169 + menu/get/iwo/chassis.py | 85 + menu/get/iwo/cluster.py | 85 + menu/get/iwo/container.py | 169 + menu/get/iwo/dc.py | 85 + menu/get/iwo/disk.py | 85 + menu/get/iwo/main.py | 59 + menu/get/iwo/namespace.py | 85 + menu/get/iwo/network.py | 85 + menu/get/iwo/phy.py | 178 + menu/get/iwo/pod.py | 85 + menu/get/iwo/region.py | 85 + menu/get/iwo/service.py | 158 + menu/get/iwo/spec.py | 85 + menu/get/iwo/storage.py | 166 + menu/get/iwo/switch.py | 85 + menu/get/iwo/target.py | 85 + menu/get/iwo/vdc.py | 166 + menu/get/iwo/vm.py | 85 + menu/get/iwo/volume.py | 85 + menu/get/iwo/workload.py | 85 + menu/get/iwo/zone.py | 85 + menu/get/k8s/__init__.py | 0 menu/get/k8s/am.py | 135 + menu/get/k8s/amcfg.py | 135 + menu/get/k8s/cluster.py | 114 + menu/get/k8s/cm.py | 172 + menu/get/k8s/cni.py | 123 + menu/get/k8s/cquota.py | 135 + menu/get/k8s/crb.py | 142 + menu/get/k8s/crd.py | 135 + menu/get/k8s/csv.py | 127 + menu/get/k8s/dc.py | 135 + menu/get/k8s/dep.py | 141 + menu/get/k8s/ds.py | 135 + menu/get/k8s/dv.py | 134 + menu/get/k8s/eip.py | 135 + menu/get/k8s/ep.py | 135 + menu/get/k8s/erouter.py | 135 + menu/get/k8s/ev.py | 149 + menu/get/k8s/ing.py | 135 + menu/get/k8s/kc.py | 90 + menu/get/k8s/kv.py | 135 + menu/get/k8s/limit.py | 135 + menu/get/k8s/main.py | 168 + menu/get/k8s/mc.py | 184 + menu/get/k8s/mcp.py | 139 + menu/get/k8s/nad.py | 134 + menu/get/k8s/nnce.py | 128 + menu/get/k8s/nncp.py | 128 + menu/get/k8s/nns.py | 191 + menu/get/k8s/node.py | 153 + menu/get/k8s/ns.py | 126 + menu/get/k8s/og.py | 133 + menu/get/k8s/pc.py | 135 + menu/get/k8s/pmon.py | 135 + menu/get/k8s/pod.py | 209 + menu/get/k8s/pp.py | 133 + menu/get/k8s/prb.py | 135 + menu/get/k8s/profile.py | 146 + menu/get/k8s/prom.py | 135 + menu/get/k8s/promrule.py | 135 + menu/get/k8s/pv.py | 126 + menu/get/k8s/pvc.py | 158 + menu/get/k8s/quota.py | 135 + menu/get/k8s/rb.py | 142 + menu/get/k8s/rc.py | 135 + menu/get/k8s/route.py | 135 + menu/get/k8s/rs.py | 141 + menu/get/k8s/ruler.py | 135 + menu/get/k8s/sa.py | 135 + menu/get/k8s/sc.py | 135 + menu/get/k8s/scc.py | 128 + menu/get/k8s/sec.py | 135 + menu/get/k8s/smon.py | 135 + menu/get/k8s/srn.py | 126 + menu/get/k8s/srnnp.py | 151 + menu/get/k8s/srnns.py | 146 + menu/get/k8s/sts.py | 135 + menu/get/k8s/sub.py | 127 + menu/get/k8s/svc.py | 207 + menu/get/k8s/tuned.py | 134 + menu/get/k8s/va.py | 135 + menu/get/k8s/ver.py | 123 + menu/get/k8s/vm.py | 147 + menu/get/k8s/vmc.py | 135 + menu/get/k8s/vmcf.py | 135 + menu/get/k8s/vmcp.py | 135 + menu/get/k8s/vme.py | 135 + menu/get/k8s/vmf.py | 135 + menu/get/k8s/vmi.py | 171 + menu/get/k8s/vmim.py | 135 + menu/get/k8s/vmipr.py | 135 + menu/get/k8s/vmirs.py | 135 + menu/get/k8s/vmp.py | 135 + menu/get/k8s/vmr.py | 135 + menu/get/k8s/vms.py | 135 + menu/get/k8s/vmsc.py | 135 + menu/get/k8s/vs.py | 135 + menu/get/k8s/vsc.py | 135 + menu/get/k8s/vsclass.py | 135 + menu/get/kv/__init__.py | 0 menu/get/kv/main.py | 18 + menu/get/kv/vm.py | 125 + menu/get/kv/vmi.py | 125 + menu/get/linux/__init__.py | 0 menu/get/linux/bond.py | 226 + menu/get/linux/boot.py | 90 + menu/get/linux/hp.py | 106 + menu/get/linux/main.py | 24 + menu/get/linux/server.py | 56 + menu/get/linux/sysctl.py | 123 + menu/get/main.py | 54 + menu/get/nc/__init__.py | 0 menu/get/nc/main.py | 16 + menu/get/nc/notif.py | 76 + menu/get/nso/__init__.py | 0 .../nso/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes menu/get/nso/__pycache__/main.cpython-310.pyc | Bin 0 -> 957 bytes menu/get/nso/__pycache__/ncs.cpython-310.pyc | Bin 0 -> 1264 bytes menu/get/nso/__pycache__/vnfd.cpython-310.pyc | Bin 0 -> 2519 bytes menu/get/nso/cnfd.py | 147 + menu/get/nso/cnfi.py | 222 + menu/get/nso/cnfm.py | 149 + menu/get/nso/device.py | 134 + menu/get/nso/main.py | 26 + menu/get/nso/ncs.py | 51 + menu/get/nso/nfvo/__init__.py | 0 .../nfvo/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../nso/nfvo/__pycache__/main.cpython-310.pyc | Bin 0 -> 693 bytes .../nso/nfvo/__pycache__/vnfd.cpython-310.pyc | Bin 0 -> 2696 bytes .../nso/nfvo/__pycache__/vnfi.cpython-310.pyc | Bin 0 -> 2866 bytes menu/get/nso/nfvo/main.py | 18 + menu/get/nso/nfvo/vnfd.py | 136 + menu/get/nso/nfvo/vnfi.py | 148 + menu/get/nx/__init__.py | 0 menu/get/nx/config.py | 123 + menu/get/nx/device.py | 51 + menu/get/nx/lacp.py | 130 + menu/get/nx/lldp.py | 137 + menu/get/nx/mac.py | 137 + menu/get/nx/main.py | 30 + menu/get/nx/psirt.py | 155 + menu/get/nx/server.py | 157 + menu/get/nx/ver.py | 122 + menu/get/ocp/__init__.py | 0 .../ocp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes .../ocp/__pycache__/cluster.cpython-310.pyc | Bin 0 -> 4756 bytes .../ocp/__pycache__/installer.cpython-310.pyc | Bin 0 -> 1564 bytes menu/get/ocp/__pycache__/kc.cpython-310.pyc | Bin 0 -> 2045 bytes menu/get/ocp/__pycache__/main.cpython-310.pyc | Bin 0 -> 805 bytes menu/get/ocp/__pycache__/node.cpython-310.pyc | Bin 0 -> 3581 bytes .../ocp/__pycache__/vcenter.cpython-310.pyc | Bin 0 -> 2084 bytes menu/get/ocp/__pycache__/vm.cpython-310.pyc | Bin 0 -> 3962 bytes menu/get/ocp/chrony.py | 70 + menu/get/ocp/cpolicy.py | 67 + menu/get/ocp/main.py | 24 + menu/get/ocp/node.py | 183 + menu/get/ocp/ssh.py | 66 + menu/get/ocp/vm.py | 199 + menu/get/openshift/__init__.py | 0 menu/get/openshift/ai/__init__.py | 0 menu/get/openshift/ai/cluster.py | 145 + menu/get/openshift/ai/main.py | 18 + menu/get/openshift/ai/version.py | 72 + menu/get/openshift/main.py | 16 + menu/get/osp/__init__.py | 0 menu/get/osp/az.py | 135 + menu/get/osp/cluster.py | 102 + menu/get/osp/fip.py | 191 + menu/get/osp/flv.py | 163 + menu/get/osp/hv.py | 137 + menu/get/osp/img.py | 143 + menu/get/osp/main.py | 50 + menu/get/osp/net.py | 210 + menu/get/osp/port.py | 235 + menu/get/osp/quota.py | 123 + menu/get/osp/role.py | 109 + menu/get/osp/rtr.py | 146 + menu/get/osp/sg.py | 186 + menu/get/osp/snap.py | 147 + menu/get/osp/sub.py | 183 + menu/get/osp/tenant.py | 109 + menu/get/osp/user.py | 125 + menu/get/osp/vm.py | 264 + menu/get/osp/vol.py | 155 + menu/get/psirt.py | 249 + menu/get/redfish/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../__pycache__/access.cpython-310.pyc | Bin 0 -> 2671 bytes .../redfish/__pycache__/adhoc.cpython-310.pyc | Bin 0 -> 4191 bytes .../redfish/__pycache__/cache.cpython-310.pyc | Bin 0 -> 1350 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 2521 bytes .../__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 2751 bytes .../redfish/__pycache__/fi.cpython-310.pyc | Bin 0 -> 1227 bytes .../redfish/__pycache__/main.cpython-310.pyc | Bin 0 -> 869 bytes .../__pycache__/server.cpython-310.pyc | Bin 0 -> 7019 bytes .../__pycache__/servers.cpython-310.pyc | Bin 0 -> 2837 bytes .../__pycache__/settings.cpython-310.pyc | Bin 0 -> 2677 bytes .../__pycache__/summary.cpython-310.pyc | Bin 0 -> 2276 bytes .../redfish/__pycache__/ucsc.cpython-310.pyc | Bin 0 -> 2616 bytes menu/get/redfish/cache.py | 49 + menu/get/redfish/endpoint.py | 116 + menu/get/redfish/main.py | 22 + menu/get/redfish/template.py | 430 + menu/get/redfish/uri.py | 437 + menu/get/server.py | 676 + menu/get/ucsm/__init__.py | 0 .../ucsm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 146 bytes .../ucsm/__pycache__/blade.cpython-310.pyc | Bin 0 -> 2817 bytes .../ucsm/__pycache__/blades.cpython-310.pyc | Bin 0 -> 2608 bytes .../ucsm/__pycache__/chassis.cpython-310.pyc | Bin 0 -> 2526 bytes .../ucsm/__pycache__/chassiz.cpython-310.pyc | Bin 0 -> 2037 bytes .../ucsm/__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 1163 bytes .../__pycache__/inventory.cpython-310.pyc | Bin 0 -> 1720 bytes .../get/ucsm/__pycache__/main.cpython-310.pyc | Bin 0 -> 1081 bytes .../ucsm/__pycache__/manager.cpython-310.pyc | Bin 0 -> 1301 bytes .../ucsm/__pycache__/query.cpython-310.pyc | Bin 0 -> 1695 bytes .../ucsm/__pycache__/server.cpython-310.pyc | Bin 0 -> 1040 bytes menu/get/ucsm/blade.py | 135 + menu/get/ucsm/blades.py | 120 + menu/get/ucsm/chassis.py | 119 + menu/get/ucsm/chassiz.py | 94 + menu/get/ucsm/inventory.py | 75 + menu/get/ucsm/main.py | 28 + menu/get/ucsm/manager.py | 51 + menu/get/ucsm/query.py | 72 + menu/get/vc/__init__.py | 0 .../vc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 144 bytes menu/get/vc/__pycache__/hosts.cpython-310.pyc | Bin 0 -> 2134 bytes .../vc/__pycache__/instance.cpython-310.pyc | Bin 0 -> 1303 bytes menu/get/vc/__pycache__/main.cpython-310.pyc | Bin 0 -> 808 bytes menu/get/vc/__pycache__/vms.cpython-310.pyc | Bin 0 -> 2525 bytes menu/get/vc/host/__init__.py | 0 .../host/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../vc/host/__pycache__/main.cpython-310.pyc | Bin 0 -> 609 bytes .../vc/host/__pycache__/net.cpython-310.pyc | Bin 0 -> 2353 bytes .../vc/host/__pycache__/pnet.cpython-310.pyc | Bin 0 -> 2360 bytes menu/get/vc/host/main.py | 16 + menu/get/vc/host/pnet.py | 115 + menu/get/vc/hosts.py | 98 + menu/get/vc/instance.py | 51 + menu/get/vc/main.py | 22 + menu/get/vc/vms.py | 128 + menu/main.py | 196 + menu/progress.py | 22 + menu/set/__init__.py | 0 menu/set/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 141 bytes menu/set/__pycache__/main.cpython-310.pyc | Bin 0 -> 1315 bytes menu/set/__pycache__/os_image.cpython-310.pyc | Bin 0 -> 3185 bytes menu/set/__pycache__/scu.cpython-310.pyc | Bin 0 -> 2876 bytes menu/set/aci/__init__.py | 0 .../aci/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes .../set/aci/__pycache__/cache.cpython-310.pyc | Bin 0 -> 3086 bytes .../__pycache__/controller.cpython-310.pyc | Bin 0 -> 2376 bytes menu/set/aci/__pycache__/main.cpython-310.pyc | Bin 0 -> 815 bytes menu/set/aci/__pycache__/mode.cpython-310.pyc | Bin 0 -> 1981 bytes menu/set/aci/cache.py | 129 + menu/set/aci/controller.py | 105 + menu/set/aci/main.py | 22 + menu/set/aci/mode.py | 82 + menu/set/aci/ws.py | 81 + menu/set/cvim/__init__.py | 0 menu/set/cvim/main.py | 16 + menu/set/cvim/openrc.py | 78 + menu/set/k8s/__init__.py | 0 menu/set/k8s/kc.py | 78 + menu/set/k8s/main.py | 16 + menu/set/linux/__init__.py | 0 menu/set/linux/main.py | 16 + menu/set/linux/server.py | 84 + menu/set/main.py | 40 + menu/set/nso/__init__.py | 0 .../nso/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes .../__pycache__/controller.cpython-310.pyc | Bin 0 -> 2120 bytes menu/set/nso/__pycache__/main.cpython-310.pyc | Bin 0 -> 581 bytes menu/set/nso/__pycache__/ncs.cpython-310.pyc | Bin 0 -> 2438 bytes menu/set/nso/main.py | 16 + menu/set/nso/ncs.py | 110 + menu/set/nx/__init__.py | 0 menu/set/nx/device.py | 97 + menu/set/nx/main.py | 18 + menu/set/nx/ws.py | 78 + menu/set/ocp/__init__.py | 0 .../ocp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes .../__pycache__/kubeconfig.cpython-310.pyc | Bin 0 -> 1631 bytes menu/set/ocp/__pycache__/main.cpython-310.pyc | Bin 0 -> 1023 bytes menu/set/ocp/cluster/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../cluster/__pycache__/main.cpython-310.pyc | Bin 0 -> 635 bytes .../__pycache__/nestedhv.cpython-310.pyc | Bin 0 -> 1654 bytes menu/set/ocp/cluster/main.py | 16 + menu/set/ocp/cluster/nestedhv.py | 64 + menu/set/ocp/helm.py | 94 + menu/set/ocp/kc.py | 83 + menu/set/ocp/main.py | 30 + menu/set/ocp/node/__init__.py | 0 .../node/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../ocp/node/__pycache__/down.cpython-310.pyc | Bin 0 -> 1560 bytes .../ocp/node/__pycache__/main.cpython-310.pyc | Bin 0 -> 847 bytes .../node/__pycache__/nestedhv.cpython-310.pyc | Bin 0 -> 1523 bytes .../node/__pycache__/restart.cpython-310.pyc | Bin 0 -> 1573 bytes .../ocp/node/__pycache__/up.cpython-310.pyc | Bin 0 -> 1552 bytes menu/set/ocp/node/down.py | 65 + menu/set/ocp/node/main.py | 22 + menu/set/ocp/node/nestedhv.py | 62 + menu/set/ocp/node/restart.py | 66 + menu/set/ocp/node/up.py | 65 + menu/set/ocp/ssh.py | 114 + menu/set/ocp/tools.py | 94 + menu/set/ocp/virtctl.py | 94 + menu/set/ocp/vm/__init__.py | 0 .../vm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 150 bytes .../ocp/vm/__pycache__/down.cpython-310.pyc | Bin 0 -> 2153 bytes .../ocp/vm/__pycache__/main.cpython-310.pyc | Bin 0 -> 756 bytes .../vm/__pycache__/nestedhv.cpython-310.pyc | Bin 0 -> 1523 bytes .../vm/__pycache__/restart.cpython-310.pyc | Bin 0 -> 2302 bytes .../set/ocp/vm/__pycache__/up.cpython-310.pyc | Bin 0 -> 2165 bytes menu/set/ocp/vm/down.py | 93 + menu/set/ocp/vm/main.py | 20 + menu/set/ocp/vm/restart.py | 100 + menu/set/ocp/vm/up.py | 94 + menu/set/osp/__init__.py | 0 menu/set/osp/main.py | 16 + menu/set/osp/openrc.py | 88 + menu/set/psirt.py | 93 + menu/set/redfish/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../redfish/__pycache__/adhoc.cpython-310.pyc | Bin 0 -> 4191 bytes .../redfish/__pycache__/cache.cpython-310.pyc | Bin 0 -> 3688 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 3697 bytes .../__pycache__/endpoint.cpython-310.pyc | Bin 0 -> 3696 bytes .../redfish/__pycache__/fi.cpython-310.pyc | Bin 0 -> 3565 bytes .../redfish/__pycache__/main.cpython-310.pyc | Bin 0 -> 953 bytes .../__pycache__/server.cpython-310.pyc | Bin 0 -> 3494 bytes .../__pycache__/servers.cpython-310.pyc | Bin 0 -> 3760 bytes .../__pycache__/settings.cpython-310.pyc | Bin 0 -> 1879 bytes .../redfish/__pycache__/ucsc.cpython-310.pyc | Bin 0 -> 2616 bytes menu/set/redfish/access/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../access/__pycache__/fi.cpython-310.pyc | Bin 0 -> 3668 bytes .../access/__pycache__/main.cpython-310.pyc | Bin 0 -> 737 bytes .../access/__pycache__/server.cpython-310.pyc | Bin 0 -> 4824 bytes .../__pycache__/servers.cpython-310.pyc | Bin 0 -> 4643 bytes menu/set/redfish/access/fi.py | 197 + menu/set/redfish/access/main.py | 18 + menu/set/redfish/access/server.py | 226 + menu/set/redfish/cache.py | 160 + menu/set/redfish/main.py | 24 + menu/set/redfish/settings.py | 65 + menu/set/redfish/user.py | 120 + menu/set/redfish/users.py | 823 + menu/set/server/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../server/__pycache__/main.cpython-310.pyc | Bin 0 -> 937 bytes .../__pycache__/os_image.cpython-310.pyc | Bin 0 -> 3202 bytes .../server/__pycache__/scu.cpython-310.pyc | Bin 0 -> 2893 bytes menu/set/server/locator/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 149 bytes .../locator/__pycache__/main.cpython-310.pyc | Bin 0 -> 732 bytes .../locator/__pycache__/off.cpython-310.pyc | Bin 0 -> 2241 bytes .../locator/__pycache__/on.cpython-310.pyc | Bin 0 -> 2236 bytes menu/set/server/locator/main.py | 18 + menu/set/server/locator/off.py | 144 + menu/set/server/locator/on.py | 144 + menu/set/server/main.py | 24 + menu/set/server/os_image.py | 126 + menu/set/server/power/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../power/__pycache__/cycle.cpython-310.pyc | Bin 0 -> 2646 bytes .../power/__pycache__/hard.cpython-310.pyc | Bin 0 -> 2640 bytes .../power/__pycache__/main.cpython-310.pyc | Bin 0 -> 1090 bytes .../power/__pycache__/off.cpython-310.pyc | Bin 0 -> 2225 bytes .../power/__pycache__/on.cpython-310.pyc | Bin 0 -> 2220 bytes .../power/__pycache__/reboot.cpython-310.pyc | Bin 0 -> 2239 bytes .../power/__pycache__/restart.cpython-310.pyc | Bin 0 -> 2370 bytes .../power/__pycache__/shut.cpython-310.pyc | Bin 0 -> 2261 bytes menu/set/server/power/cycle.py | 142 + menu/set/server/power/hard.py | 142 + menu/set/server/power/main.py | 26 + menu/set/server/power/off.py | 142 + menu/set/server/power/on.py | 142 + menu/set/server/power/reboot.py | 142 + menu/set/server/power/shut.py | 142 + menu/set/server/scu.py | 112 + menu/set/server/tag.py | 153 + menu/set/ucsm/__init__.py | 0 .../ucsm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 146 bytes .../__pycache__/inventory.cpython-310.pyc | Bin 0 -> 2336 bytes .../set/ucsm/__pycache__/main.cpython-310.pyc | Bin 0 -> 681 bytes .../ucsm/__pycache__/manager.cpython-310.pyc | Bin 0 -> 2019 bytes menu/set/ucsm/inventory.py | 117 + menu/set/ucsm/main.py | 18 + menu/set/ucsm/manager.py | 91 + menu/set/vc/__init__.py | 0 .../vc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 145 bytes .../vc/__pycache__/controller.cpython-310.pyc | Bin 0 -> 2120 bytes .../vc/__pycache__/instance.cpython-310.pyc | Bin 0 -> 2092 bytes menu/set/vc/__pycache__/main.cpython-310.pyc | Bin 0 -> 590 bytes menu/set/vc/instance.py | 94 + menu/set/vc/main.py | 16 + menu/settings/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 146 bytes .../settings/__pycache__/main.cpython-310.pyc | Bin 0 -> 764 bytes menu/settings/defaults/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes .../defaults/__pycache__/get.cpython-310.pyc | Bin 0 -> 928 bytes .../defaults/__pycache__/main.cpython-310.pyc | Bin 0 -> 710 bytes .../defaults/__pycache__/rfd.cpython-310.pyc | Bin 0 -> 612 bytes menu/settings/defaults/get.py | 33 + menu/settings/defaults/main.py | 18 + menu/settings/defaults/rfd.py | 19 + menu/settings/groups/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 153 bytes .../groups/__pycache__/clear.cpython-310.pyc | Bin 0 -> 599 bytes .../groups/__pycache__/delete.cpython-310.pyc | Bin 0 -> 656 bytes .../groups/__pycache__/get.cpython-310.pyc | Bin 0 -> 1261 bytes .../groups/__pycache__/main.cpython-310.pyc | Bin 0 -> 631 bytes menu/settings/groups/clear.py | 19 + menu/settings/groups/delete.py | 21 + menu/settings/groups/get.py | 58 + menu/settings/groups/main.py | 16 + menu/settings/iaccounts/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../iaccounts/__pycache__/add.cpython-310.pyc | Bin 0 -> 1095 bytes .../__pycache__/default.cpython-310.pyc | Bin 0 -> 699 bytes .../__pycache__/delete.cpython-310.pyc | Bin 0 -> 699 bytes .../iaccounts/__pycache__/get.cpython-310.pyc | Bin 0 -> 1047 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 757 bytes menu/settings/iaccounts/add.py | 51 + menu/settings/iaccounts/cache.py | 44 + menu/settings/iaccounts/default.py | 20 + menu/settings/iaccounts/delete.py | 21 + menu/settings/iaccounts/get.py | 35 + menu/settings/iaccounts/main.py | 20 + menu/settings/main.py | 20 + menu/user_inputs.py | 152 + menu/utils/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 143 bytes menu/utils/__pycache__/doc.cpython-310.pyc | Bin 0 -> 898 bytes menu/utils/__pycache__/main.cpython-310.pyc | Bin 0 -> 720 bytes menu/utils/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../utils/cli/__pycache__/bug.cpython-310.pyc | Bin 0 -> 498 bytes .../cli/__pycache__/list.cpython-310.pyc | Bin 0 -> 444 bytes .../cli/__pycache__/main.cpython-310.pyc | Bin 0 -> 663 bytes menu/utils/cli/bug.py | 15 + menu/utils/cli/list.py | 14 + menu/utils/cli/main.py | 18 + menu/utils/doc.py | 36 + menu/utils/main.py | 20 + menu/utils/test/__init__.py | 0 .../test/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../test/__pycache__/main.cpython-310.pyc | Bin 0 -> 670 bytes .../test/__pycache__/run.cpython-310.pyc | Bin 0 -> 2734 bytes menu/utils/test/get/__init__.py | 0 .../get/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../__pycache__/collection.cpython-310.pyc | Bin 0 -> 664 bytes .../__pycache__/collections.cpython-310.pyc | Bin 0 -> 659 bytes .../test/get/__pycache__/main.cpython-310.pyc | Bin 0 -> 985 bytes .../test/get/__pycache__/name.cpython-310.pyc | Bin 0 -> 730 bytes .../get/__pycache__/names.cpython-310.pyc | Bin 0 -> 658 bytes .../get/__pycache__/summary.cpython-310.pyc | Bin 0 -> 588 bytes menu/utils/test/get/collection.py | 15 + menu/utils/test/get/collections.py | 16 + menu/utils/test/get/main.py | 24 + menu/utils/test/get/name.py | 21 + menu/utils/test/get/names.py | 20 + menu/utils/test/get/summary.py | 14 + menu/utils/test/main.py | 18 + menu/utils/test/run.py | 104 + menu/validations.py | 2140 + requirements.txt | 26 + version | 1 + 5343 files changed, 375466 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 iserver.py create mode 100644 lib/__init__.py create mode 100644 lib/aci/__init__.py create mode 100644 lib/aci/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/__pycache__/aepg.cpython-310.pyc create mode 100644 lib/aci/__pycache__/ap.cpython-310.pyc create mode 100644 lib/aci/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/__pycache__/apic.cpython-310.pyc create mode 100644 lib/aci/__pycache__/bd.cpython-310.pyc create mode 100644 lib/aci/__pycache__/cache.cpython-310.pyc create mode 100644 lib/aci/__pycache__/cdp_adj_ep.cpython-310.pyc create mode 100644 lib/aci/__pycache__/common.cpython-310.pyc create mode 100644 lib/aci/__pycache__/contract.cpython-310.pyc create mode 100644 lib/aci/__pycache__/endpoint.cpython-310.pyc create mode 100644 lib/aci/__pycache__/if_mgmt.cpython-310.pyc create mode 100644 lib/aci/__pycache__/interface_fault_counts.cpython-310.pyc create mode 100644 lib/aci/__pycache__/interface_management.cpython-310.pyc create mode 100644 lib/aci/__pycache__/interface_management_state.cpython-310.pyc create mode 100644 lib/aci/__pycache__/interface_management_stats.cpython-310.pyc create mode 100644 lib/aci/__pycache__/l1physif.cpython-310.pyc create mode 100644 lib/aci/__pycache__/l2out.cpython-310.pyc create mode 100644 lib/aci/__pycache__/l3out.cpython-310.pyc create mode 100644 lib/aci/__pycache__/lldp_adj_ep.cpython-310.pyc create mode 100644 lib/aci/__pycache__/node.cpython-310.pyc create mode 100644 lib/aci/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/__pycache__/port.cpython-310.pyc create mode 100644 lib/aci/__pycache__/port_epg_stats.cpython-310.pyc create mode 100644 lib/aci/__pycache__/port_fc_stat.cpython-310.pyc create mode 100644 lib/aci/__pycache__/port_fc_stats.cpython-310.pyc create mode 100644 lib/aci/__pycache__/port_qos_stat.cpython-310.pyc create mode 100644 lib/aci/__pycache__/port_qos_stats.cpython-310.pyc create mode 100644 lib/aci/__pycache__/port_stat.cpython-310.pyc create mode 100644 lib/aci/__pycache__/port_stats.cpython-310.pyc create mode 100644 lib/aci/__pycache__/port_vlan_stats.cpython-310.pyc create mode 100644 lib/aci/__pycache__/settings.cpython-310.pyc create mode 100644 lib/aci/__pycache__/tenant.cpython-310.pyc create mode 100644 lib/aci/__pycache__/vrf.cpython-310.pyc create mode 100644 lib/aci/ap/__init__.py create mode 100644 lib/aci/ap/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/ap/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/ap/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/ap/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/ap/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/ap/api.py create mode 100644 lib/aci/ap/audit/__init__.py create mode 100644 lib/aci/ap/audit/api.py create mode 100644 lib/aci/ap/audit/info.py create mode 100644 lib/aci/ap/audit/main.py create mode 100644 lib/aci/ap/event/__init__.py create mode 100644 lib/aci/ap/event/api.py create mode 100644 lib/aci/ap/event/info.py create mode 100644 lib/aci/ap/event/main.py create mode 100644 lib/aci/ap/fault/__init__.py create mode 100644 lib/aci/ap/fault/api.py create mode 100644 lib/aci/ap/fault/info.py create mode 100644 lib/aci/ap/fault/main.py create mode 100644 lib/aci/ap/info.py create mode 100644 lib/aci/ap/main.py create mode 100644 lib/aci/ap/node/__init__.py create mode 100644 lib/aci/ap/node/api.py create mode 100644 lib/aci/ap/node/info.py create mode 100644 lib/aci/ap/node/main.py create mode 100644 lib/aci/ap/output.py create mode 100644 lib/aci/api.py create mode 100644 lib/aci/apic.py create mode 100644 lib/aci/bd/TODO.md create mode 100644 lib/aci/bd/__init__.py create mode 100644 lib/aci/bd/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/health.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/igmp.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/l3out.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/mld.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/nd.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/retention.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/subnet.cpython-310.pyc create mode 100644 lib/aci/bd/__pycache__/vrf.cpython-310.pyc create mode 100644 lib/aci/bd/api.py create mode 100644 lib/aci/bd/audit/__init__.py create mode 100644 lib/aci/bd/audit/api.py create mode 100644 lib/aci/bd/audit/info.py create mode 100644 lib/aci/bd/audit/main.py create mode 100644 lib/aci/bd/event/__init__.py create mode 100644 lib/aci/bd/event/api.py create mode 100644 lib/aci/bd/event/info.py create mode 100644 lib/aci/bd/event/main.py create mode 100644 lib/aci/bd/fault/__init__.py create mode 100644 lib/aci/bd/fault/api.py create mode 100644 lib/aci/bd/fault/info.py create mode 100644 lib/aci/bd/fault/main.py create mode 100644 lib/aci/bd/igmp/__init__.py create mode 100644 lib/aci/bd/igmp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/bd/igmp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/bd/igmp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/bd/igmp/info.py create mode 100644 lib/aci/bd/igmp/main.py create mode 100644 lib/aci/bd/info.py create mode 100644 lib/aci/bd/l3out/__init__.py create mode 100644 lib/aci/bd/l3out/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/bd/l3out/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/bd/l3out/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/bd/l3out/info.py create mode 100644 lib/aci/bd/l3out/main.py create mode 100644 lib/aci/bd/main.py create mode 100644 lib/aci/bd/mld/__init__.py create mode 100644 lib/aci/bd/mld/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/bd/mld/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/bd/mld/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/bd/mld/info.py create mode 100644 lib/aci/bd/mld/main.py create mode 100644 lib/aci/bd/node/__init__.py create mode 100644 lib/aci/bd/node/api.py create mode 100644 lib/aci/bd/node/info.py create mode 100644 lib/aci/bd/node/main.py create mode 100644 lib/aci/bd/output.py create mode 100644 lib/aci/bd/retention/__init__.py create mode 100644 lib/aci/bd/retention/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/bd/retention/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/bd/retention/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/bd/retention/info.py create mode 100644 lib/aci/bd/retention/main.py create mode 100644 lib/aci/bd/subnet/__init__.py create mode 100644 lib/aci/bd/subnet/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/bd/subnet/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/bd/subnet/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/bd/subnet/info.py create mode 100644 lib/aci/bd/subnet/main.py create mode 100644 lib/aci/bd/vrf/__init__.py create mode 100644 lib/aci/bd/vrf/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/bd/vrf/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/bd/vrf/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/bd/vrf/info.py create mode 100644 lib/aci/bd/vrf/main.py create mode 100644 lib/aci/bot_output.py create mode 100644 lib/aci/cache.py create mode 100644 lib/aci/common.py create mode 100644 lib/aci/context.py create mode 100644 lib/aci/contract/__init__.py create mode 100644 lib/aci/contract/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/contract/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/contract/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/contract/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/contract/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/contract/filter/__init__.py create mode 100644 lib/aci/contract/filter/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/contract/filter/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/contract/filter/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/contract/filter/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/contract/filter/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/contract/filter/api.py create mode 100644 lib/aci/contract/filter/audit/__init__.py create mode 100644 lib/aci/contract/filter/audit/api.py create mode 100644 lib/aci/contract/filter/audit/info.py create mode 100644 lib/aci/contract/filter/audit/main.py create mode 100644 lib/aci/contract/filter/event/__init__.py create mode 100644 lib/aci/contract/filter/event/api.py create mode 100644 lib/aci/contract/filter/event/info.py create mode 100644 lib/aci/contract/filter/event/main.py create mode 100644 lib/aci/contract/filter/fault/__init__.py create mode 100644 lib/aci/contract/filter/fault/api.py create mode 100644 lib/aci/contract/filter/fault/info.py create mode 100644 lib/aci/contract/filter/fault/main.py create mode 100644 lib/aci/contract/filter/info.py create mode 100644 lib/aci/contract/filter/main.py create mode 100644 lib/aci/contract/filter/output.py create mode 100644 lib/aci/contract/main.py create mode 100644 lib/aci/contract/output.py create mode 100644 lib/aci/contract/standard/__init__.py create mode 100644 lib/aci/contract/standard/api.py create mode 100644 lib/aci/contract/standard/audit/__init__.py create mode 100644 lib/aci/contract/standard/audit/api.py create mode 100644 lib/aci/contract/standard/audit/info.py create mode 100644 lib/aci/contract/standard/audit/main.py create mode 100644 lib/aci/contract/standard/event/__init__.py create mode 100644 lib/aci/contract/standard/event/api.py create mode 100644 lib/aci/contract/standard/event/info.py create mode 100644 lib/aci/contract/standard/event/main.py create mode 100644 lib/aci/contract/standard/fault/__init__.py create mode 100644 lib/aci/contract/standard/fault/api.py create mode 100644 lib/aci/contract/standard/fault/info.py create mode 100644 lib/aci/contract/standard/fault/main.py create mode 100644 lib/aci/contract/standard/info.py create mode 100644 lib/aci/contract/standard/main.py create mode 100644 lib/aci/contract/standard/output.py create mode 100644 lib/aci/contract/standard/subject/__init__.py create mode 100644 lib/aci/contract/standard/subject/api.py create mode 100644 lib/aci/contract/standard/subject/info.py create mode 100644 lib/aci/contract/standard/subject/main.py create mode 100644 lib/aci/contract/taboo/__init__.py create mode 100644 lib/aci/contract/taboo/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/contract/taboo/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/contract/taboo/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/contract/taboo/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/contract/taboo/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/contract/taboo/api.py create mode 100644 lib/aci/contract/taboo/audit/__init__.py create mode 100644 lib/aci/contract/taboo/audit/api.py create mode 100644 lib/aci/contract/taboo/audit/info.py create mode 100644 lib/aci/contract/taboo/audit/main.py create mode 100644 lib/aci/contract/taboo/event/__init__.py create mode 100644 lib/aci/contract/taboo/event/api.py create mode 100644 lib/aci/contract/taboo/event/info.py create mode 100644 lib/aci/contract/taboo/event/main.py create mode 100644 lib/aci/contract/taboo/fault/__init__.py create mode 100644 lib/aci/contract/taboo/fault/api.py create mode 100644 lib/aci/contract/taboo/fault/info.py create mode 100644 lib/aci/contract/taboo/fault/main.py create mode 100644 lib/aci/contract/taboo/info.py create mode 100644 lib/aci/contract/taboo/main.py create mode 100644 lib/aci/contract/taboo/output.py create mode 100644 lib/aci/contract/taboo/subject/__init__.py create mode 100644 lib/aci/contract/taboo/subject/api.py create mode 100644 lib/aci/contract/taboo/subject/info.py create mode 100644 lib/aci/contract/taboo/subject/main.py create mode 100644 lib/aci/domain/__init__.py create mode 100644 lib/aci/domain/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/domain/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/domain/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/domain/aaa/__init__.py create mode 100644 lib/aci/domain/aaa/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/domain/aaa/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/domain/aaa/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/domain/aaa/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/domain/aaa/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/domain/aaa/api.py create mode 100644 lib/aci/domain/aaa/info.py create mode 100644 lib/aci/domain/aaa/main.py create mode 100644 lib/aci/domain/aaa/output.py create mode 100644 lib/aci/domain/l2/__init__.py create mode 100644 lib/aci/domain/l2/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/domain/l2/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/domain/l2/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/domain/l2/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/domain/l2/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/domain/l2/api.py create mode 100644 lib/aci/domain/l2/audit/__init__.py create mode 100644 lib/aci/domain/l2/audit/api.py create mode 100644 lib/aci/domain/l2/audit/info.py create mode 100644 lib/aci/domain/l2/audit/main.py create mode 100644 lib/aci/domain/l2/event/__init__.py create mode 100644 lib/aci/domain/l2/event/api.py create mode 100644 lib/aci/domain/l2/event/info.py create mode 100644 lib/aci/domain/l2/event/main.py create mode 100644 lib/aci/domain/l2/fault/__init__.py create mode 100644 lib/aci/domain/l2/fault/api.py create mode 100644 lib/aci/domain/l2/fault/info.py create mode 100644 lib/aci/domain/l2/fault/main.py create mode 100644 lib/aci/domain/l2/info.py create mode 100644 lib/aci/domain/l2/main.py create mode 100644 lib/aci/domain/l2/node/__init__.py create mode 100644 lib/aci/domain/l2/node/api.py create mode 100644 lib/aci/domain/l2/node/info.py create mode 100644 lib/aci/domain/l2/node/main.py create mode 100644 lib/aci/domain/l2/output.py create mode 100644 lib/aci/domain/l3/__init__.py create mode 100644 lib/aci/domain/l3/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/domain/l3/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/domain/l3/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/domain/l3/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/domain/l3/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/domain/l3/api.py create mode 100644 lib/aci/domain/l3/audit/__init__.py create mode 100644 lib/aci/domain/l3/audit/api.py create mode 100644 lib/aci/domain/l3/audit/info.py create mode 100644 lib/aci/domain/l3/audit/main.py create mode 100644 lib/aci/domain/l3/event/__init__.py create mode 100644 lib/aci/domain/l3/event/api.py create mode 100644 lib/aci/domain/l3/event/info.py create mode 100644 lib/aci/domain/l3/event/main.py create mode 100644 lib/aci/domain/l3/fault/__init__.py create mode 100644 lib/aci/domain/l3/fault/api.py create mode 100644 lib/aci/domain/l3/fault/info.py create mode 100644 lib/aci/domain/l3/fault/main.py create mode 100644 lib/aci/domain/l3/info.py create mode 100644 lib/aci/domain/l3/main.py create mode 100644 lib/aci/domain/l3/node/__init__.py create mode 100644 lib/aci/domain/l3/node/api.py create mode 100644 lib/aci/domain/l3/node/info.py create mode 100644 lib/aci/domain/l3/node/main.py create mode 100644 lib/aci/domain/l3/output.py create mode 100644 lib/aci/domain/main.py create mode 100644 lib/aci/domain/output.py create mode 100644 lib/aci/domain/phy/TODO.md create mode 100644 lib/aci/domain/phy/__init__.py create mode 100644 lib/aci/domain/phy/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/domain/phy/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/domain/phy/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/domain/phy/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/domain/phy/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/domain/phy/api.py create mode 100644 lib/aci/domain/phy/audit/__init__.py create mode 100644 lib/aci/domain/phy/audit/api.py create mode 100644 lib/aci/domain/phy/audit/info.py create mode 100644 lib/aci/domain/phy/audit/main.py create mode 100644 lib/aci/domain/phy/event/__init__.py create mode 100644 lib/aci/domain/phy/event/api.py create mode 100644 lib/aci/domain/phy/event/info.py create mode 100644 lib/aci/domain/phy/event/main.py create mode 100644 lib/aci/domain/phy/fault/__init__.py create mode 100644 lib/aci/domain/phy/fault/api.py create mode 100644 lib/aci/domain/phy/fault/info.py create mode 100644 lib/aci/domain/phy/fault/main.py create mode 100644 lib/aci/domain/phy/info.py create mode 100644 lib/aci/domain/phy/main.py create mode 100644 lib/aci/domain/phy/node/__init__.py create mode 100644 lib/aci/domain/phy/node/api.py create mode 100644 lib/aci/domain/phy/node/info.py create mode 100644 lib/aci/domain/phy/node/main.py create mode 100644 lib/aci/domain/phy/output.py create mode 100644 lib/aci/domain/vmm/__init__.py create mode 100644 lib/aci/domain/vmm/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/domain/vmm/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/domain/vmm/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/domain/vmm/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/domain/vmm/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/domain/vmm/api.py create mode 100644 lib/aci/domain/vmm/audit/__init__.py create mode 100644 lib/aci/domain/vmm/audit/api.py create mode 100644 lib/aci/domain/vmm/audit/info.py create mode 100644 lib/aci/domain/vmm/audit/main.py create mode 100644 lib/aci/domain/vmm/controller/__init__.py create mode 100644 lib/aci/domain/vmm/controller/api.py create mode 100644 lib/aci/domain/vmm/controller/info.py create mode 100644 lib/aci/domain/vmm/controller/main.py create mode 100644 lib/aci/domain/vmm/epg/__init__.py create mode 100644 lib/aci/domain/vmm/epg/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/domain/vmm/epg/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/domain/vmm/epg/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/domain/vmm/epg/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/domain/vmm/epg/api.py create mode 100644 lib/aci/domain/vmm/epg/info.py create mode 100644 lib/aci/domain/vmm/epg/main.py create mode 100644 lib/aci/domain/vmm/event/__init__.py create mode 100644 lib/aci/domain/vmm/event/api.py create mode 100644 lib/aci/domain/vmm/event/info.py create mode 100644 lib/aci/domain/vmm/event/main.py create mode 100644 lib/aci/domain/vmm/fault/__init__.py create mode 100644 lib/aci/domain/vmm/fault/api.py create mode 100644 lib/aci/domain/vmm/fault/info.py create mode 100644 lib/aci/domain/vmm/fault/main.py create mode 100644 lib/aci/domain/vmm/info.py create mode 100644 lib/aci/domain/vmm/main.py create mode 100644 lib/aci/domain/vmm/node/__init__.py create mode 100644 lib/aci/domain/vmm/node/api.py create mode 100644 lib/aci/domain/vmm/node/info.py create mode 100644 lib/aci/domain/vmm/node/main.py create mode 100644 lib/aci/domain/vmm/output.py create mode 100644 lib/aci/endpoint/__init__.py create mode 100644 lib/aci/endpoint/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/endpoint/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/endpoint/__pycache__/hv.cpython-310.pyc create mode 100644 lib/aci/endpoint/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/endpoint/__pycache__/ip.cpython-310.pyc create mode 100644 lib/aci/endpoint/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/endpoint/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/endpoint/__pycache__/vm.cpython-310.pyc create mode 100644 lib/aci/endpoint/__pycache__/vmm.cpython-310.pyc create mode 100644 lib/aci/endpoint/api.py create mode 100644 lib/aci/endpoint/bot_output.py create mode 100644 lib/aci/endpoint/hv/__init__.py create mode 100644 lib/aci/endpoint/hv/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/endpoint/hv/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/endpoint/hv/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/endpoint/hv/info.py create mode 100644 lib/aci/endpoint/hv/main.py create mode 100644 lib/aci/endpoint/info.py create mode 100644 lib/aci/endpoint/ip/__init__.py create mode 100644 lib/aci/endpoint/ip/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/endpoint/ip/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/endpoint/ip/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/endpoint/ip/info.py create mode 100644 lib/aci/endpoint/ip/main.py create mode 100644 lib/aci/endpoint/main.py create mode 100644 lib/aci/endpoint/output.py create mode 100644 lib/aci/endpoint/vm/__init__.py create mode 100644 lib/aci/endpoint/vm/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/endpoint/vm/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/endpoint/vm/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/endpoint/vm/info.py create mode 100644 lib/aci/endpoint/vm/main.py create mode 100644 lib/aci/endpoint/vmm/__init__.py create mode 100644 lib/aci/endpoint/vmm/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/__pycache__/hv.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/__pycache__/vm.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/__pycache__/vnic.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/hv/__init__.py create mode 100644 lib/aci/endpoint/vmm/hv/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/hv/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/hv/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/hv/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/hv/api.py create mode 100644 lib/aci/endpoint/vmm/hv/info.py create mode 100644 lib/aci/endpoint/vmm/hv/main.py create mode 100644 lib/aci/endpoint/vmm/main.py create mode 100644 lib/aci/endpoint/vmm/vm/__init__.py create mode 100644 lib/aci/endpoint/vmm/vm/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/vm/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/vm/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/vm/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/vm/api.py create mode 100644 lib/aci/endpoint/vmm/vm/info.py create mode 100644 lib/aci/endpoint/vmm/vm/main.py create mode 100644 lib/aci/endpoint/vmm/vnic/__init__.py create mode 100644 lib/aci/endpoint/vmm/vnic/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/vnic/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/vnic/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/vnic/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/endpoint/vmm/vnic/api.py create mode 100644 lib/aci/endpoint/vmm/vnic/info.py create mode 100644 lib/aci/endpoint/vmm/vnic/main.py create mode 100644 lib/aci/epg/__init__.py create mode 100644 lib/aci/epg/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/epg/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/epg/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/epg/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/epg/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/epg/api.py create mode 100644 lib/aci/epg/audit/__init__.py create mode 100644 lib/aci/epg/audit/api.py create mode 100644 lib/aci/epg/audit/info.py create mode 100644 lib/aci/epg/audit/main.py create mode 100644 lib/aci/epg/event/__init__.py create mode 100644 lib/aci/epg/event/api.py create mode 100644 lib/aci/epg/event/info.py create mode 100644 lib/aci/epg/event/main.py create mode 100644 lib/aci/epg/fault/__init__.py create mode 100644 lib/aci/epg/fault/api.py create mode 100644 lib/aci/epg/fault/info.py create mode 100644 lib/aci/epg/fault/main.py create mode 100644 lib/aci/epg/ifconn/__init__.py create mode 100644 lib/aci/epg/ifconn/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/epg/ifconn/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/epg/ifconn/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/epg/ifconn/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/epg/ifconn/api.py create mode 100644 lib/aci/epg/ifconn/dn.md create mode 100644 lib/aci/epg/ifconn/info.py create mode 100644 lib/aci/epg/ifconn/main.py create mode 100644 lib/aci/epg/info.py create mode 100644 lib/aci/epg/locale/__init__.py create mode 100644 lib/aci/epg/locale/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/epg/locale/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/epg/locale/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/epg/locale/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/epg/locale/api.py create mode 100644 lib/aci/epg/locale/info.py create mode 100644 lib/aci/epg/locale/main.py create mode 100644 lib/aci/epg/main.py create mode 100644 lib/aci/epg/node/__init__.py create mode 100644 lib/aci/epg/node/api.py create mode 100644 lib/aci/epg/node/info.py create mode 100644 lib/aci/epg/node/main.py create mode 100644 lib/aci/epg/output.py create mode 100644 lib/aci/intf/__init__.py create mode 100644 lib/aci/intf/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/cdp_adj_ep.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/fault_counts.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/interface.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/ipv4.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/ipv4_address.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/ipv4_if.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/ipv6_address.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/ipv6_if.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/lacp_adj_ep.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/lacp_if_stats.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/lacp_instance.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/lldp_adj_ep.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/management.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/management_state.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/management_stats.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/pc.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/port.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/port_channel.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/port_channel_members.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/port_channel_relations.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/port_epg_stats.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/port_fc_stats.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/port_qos_stats.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/port_stats.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/port_vlan_stats.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/virtual_port_channel.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/virtual_port_channel_member.cpython-310.pyc create mode 100644 lib/aci/intf/__pycache__/vlan_stats.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/__init__.py create mode 100644 lib/aci/intf/adjacency/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/cdp/__init__.py create mode 100644 lib/aci/intf/adjacency/cdp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/cdp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/cdp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/cdp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/cdp/api.py create mode 100644 lib/aci/intf/adjacency/cdp/info.py create mode 100644 lib/aci/intf/adjacency/cdp/main.py create mode 100644 lib/aci/intf/adjacency/lacp/__init__.py create mode 100644 lib/aci/intf/adjacency/lacp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/lacp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/lacp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/lacp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/lacp/api.py create mode 100644 lib/aci/intf/adjacency/lacp/info.py create mode 100644 lib/aci/intf/adjacency/lacp/main.py create mode 100644 lib/aci/intf/adjacency/lldp/__init__.py create mode 100644 lib/aci/intf/adjacency/lldp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/lldp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/lldp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/lldp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/lldp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/adjacency/lldp/api.py create mode 100644 lib/aci/intf/adjacency/lldp/info.py create mode 100644 lib/aci/intf/adjacency/lldp/main.py create mode 100644 lib/aci/intf/adjacency/lldp/output.py create mode 100644 lib/aci/intf/adjacency/main.py create mode 100644 lib/aci/intf/adjacency/output.py create mode 100644 lib/aci/intf/cloudsec/__init__.py create mode 100644 lib/aci/intf/cloudsec/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/cloudsec/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/cloudsec/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/cloudsec/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/cloudsec/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/cloudsec/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/cloudsec/api.py create mode 100644 lib/aci/intf/cloudsec/audit/__init__.py create mode 100644 lib/aci/intf/cloudsec/audit/api.py create mode 100644 lib/aci/intf/cloudsec/audit/info.py create mode 100644 lib/aci/intf/cloudsec/audit/main.py create mode 100644 lib/aci/intf/cloudsec/event/__init__.py create mode 100644 lib/aci/intf/cloudsec/event/api.py create mode 100644 lib/aci/intf/cloudsec/event/info.py create mode 100644 lib/aci/intf/cloudsec/event/main.py create mode 100644 lib/aci/intf/cloudsec/fault/__init__.py create mode 100644 lib/aci/intf/cloudsec/fault/api.py create mode 100644 lib/aci/intf/cloudsec/fault/info.py create mode 100644 lib/aci/intf/cloudsec/fault/main.py create mode 100644 lib/aci/intf/cloudsec/info.py create mode 100644 lib/aci/intf/cloudsec/main.py create mode 100644 lib/aci/intf/cloudsec/output.py create mode 100644 lib/aci/intf/encapsulated_routed/__init__.py create mode 100644 lib/aci/intf/encapsulated_routed/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/encapsulated_routed/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/encapsulated_routed/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/encapsulated_routed/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/encapsulated_routed/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/encapsulated_routed/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/encapsulated_routed/api.py create mode 100644 lib/aci/intf/encapsulated_routed/audit/__init__.py create mode 100644 lib/aci/intf/encapsulated_routed/audit/api.py create mode 100644 lib/aci/intf/encapsulated_routed/audit/info.py create mode 100644 lib/aci/intf/encapsulated_routed/audit/main.py create mode 100644 lib/aci/intf/encapsulated_routed/event/__init__.py create mode 100644 lib/aci/intf/encapsulated_routed/event/api.py create mode 100644 lib/aci/intf/encapsulated_routed/event/info.py create mode 100644 lib/aci/intf/encapsulated_routed/event/main.py create mode 100644 lib/aci/intf/encapsulated_routed/fault/__init__.py create mode 100644 lib/aci/intf/encapsulated_routed/fault/api.py create mode 100644 lib/aci/intf/encapsulated_routed/fault/info.py create mode 100644 lib/aci/intf/encapsulated_routed/fault/main.py create mode 100644 lib/aci/intf/encapsulated_routed/info.py create mode 100644 lib/aci/intf/encapsulated_routed/main.py create mode 100644 lib/aci/intf/encapsulated_routed/output.py create mode 100644 lib/aci/intf/fault_counts/__init__.py create mode 100644 lib/aci/intf/fault_counts/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/fault_counts/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/fault_counts/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/fault_counts/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/fault_counts/api.py create mode 100644 lib/aci/intf/fault_counts/info.py create mode 100644 lib/aci/intf/fault_counts/main.py create mode 100644 lib/aci/intf/fc/__init__.py create mode 100644 lib/aci/intf/fc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/fc/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/fc/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/fc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/fc/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/fc/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/fc/api.py create mode 100644 lib/aci/intf/fc/audit/__init__.py create mode 100644 lib/aci/intf/fc/audit/api.py create mode 100644 lib/aci/intf/fc/audit/info.py create mode 100644 lib/aci/intf/fc/audit/main.py create mode 100644 lib/aci/intf/fc/event/__init__.py create mode 100644 lib/aci/intf/fc/event/api.py create mode 100644 lib/aci/intf/fc/event/info.py create mode 100644 lib/aci/intf/fc/event/main.py create mode 100644 lib/aci/intf/fc/fault/__init__.py create mode 100644 lib/aci/intf/fc/fault/api.py create mode 100644 lib/aci/intf/fc/fault/info.py create mode 100644 lib/aci/intf/fc/fault/main.py create mode 100644 lib/aci/intf/fc/info.py create mode 100644 lib/aci/intf/fc/main.py create mode 100644 lib/aci/intf/fc/output.py create mode 100644 lib/aci/intf/fcpc/__init__.py create mode 100644 lib/aci/intf/fcpc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/fcpc/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/fcpc/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/fcpc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/fcpc/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/fcpc/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/fcpc/api.py create mode 100644 lib/aci/intf/fcpc/audit/__init__.py create mode 100644 lib/aci/intf/fcpc/audit/api.py create mode 100644 lib/aci/intf/fcpc/audit/info.py create mode 100644 lib/aci/intf/fcpc/audit/main.py create mode 100644 lib/aci/intf/fcpc/event/__init__.py create mode 100644 lib/aci/intf/fcpc/event/api.py create mode 100644 lib/aci/intf/fcpc/event/info.py create mode 100644 lib/aci/intf/fcpc/event/main.py create mode 100644 lib/aci/intf/fcpc/fault/__init__.py create mode 100644 lib/aci/intf/fcpc/fault/api.py create mode 100644 lib/aci/intf/fcpc/fault/info.py create mode 100644 lib/aci/intf/fcpc/fault/main.py create mode 100644 lib/aci/intf/fcpc/info.py create mode 100644 lib/aci/intf/fcpc/main.py create mode 100644 lib/aci/intf/fcpc/output.py create mode 100644 lib/aci/intf/ip/__init__.py create mode 100644 lib/aci/intf/ip/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/ip/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/ip/main.py create mode 100644 lib/aci/intf/ip/v4/__init__.py create mode 100644 lib/aci/intf/ip/v4/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v4/address/__init__.py create mode 100644 lib/aci/intf/ip/v4/address/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v4/address/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v4/address/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v4/address/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v4/address/api.py create mode 100644 lib/aci/intf/ip/v4/address/info.py create mode 100644 lib/aci/intf/ip/v4/address/main.py create mode 100644 lib/aci/intf/ip/v4/intf/__init__.py create mode 100644 lib/aci/intf/ip/v4/intf/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v4/intf/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v4/intf/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v4/intf/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v4/intf/api.py create mode 100644 lib/aci/intf/ip/v4/intf/info.py create mode 100644 lib/aci/intf/ip/v4/intf/main.py create mode 100644 lib/aci/intf/ip/v6/__init__.py create mode 100644 lib/aci/intf/ip/v6/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v6/address/__init__.py create mode 100644 lib/aci/intf/ip/v6/address/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v6/address/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v6/address/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v6/address/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v6/address/api.py create mode 100644 lib/aci/intf/ip/v6/address/info.py create mode 100644 lib/aci/intf/ip/v6/address/main.py create mode 100644 lib/aci/intf/ip/v6/intf/__init__.py create mode 100644 lib/aci/intf/ip/v6/intf/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v6/intf/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v6/intf/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v6/intf/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/ip/v6/intf/api.py create mode 100644 lib/aci/intf/ip/v6/intf/info.py create mode 100644 lib/aci/intf/ip/v6/intf/main.py create mode 100644 lib/aci/intf/lacp/__init__.py create mode 100644 lib/aci/intf/lacp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/__pycache__/adj_ep.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/__pycache__/instance.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/__pycache__/interface.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/__pycache__/lacp_adj_ep.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/__pycache__/lacp_instance.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/__pycache__/lacp_stats.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/__pycache__/stats.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/api.py create mode 100644 lib/aci/intf/lacp/info.py create mode 100644 lib/aci/intf/lacp/instance/__init__.py create mode 100644 lib/aci/intf/lacp/instance/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/instance/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/instance/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/instance/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/instance/api.py create mode 100644 lib/aci/intf/lacp/instance/info.py create mode 100644 lib/aci/intf/lacp/instance/main.py create mode 100644 lib/aci/intf/lacp/main.py create mode 100644 lib/aci/intf/lacp/output.py create mode 100644 lib/aci/intf/lacp/stats/__init__.py create mode 100644 lib/aci/intf/lacp/stats/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/stats/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/stats/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/stats/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/lacp/stats/api.py create mode 100644 lib/aci/intf/lacp/stats/info.py create mode 100644 lib/aci/intf/lacp/stats/main.py create mode 100644 lib/aci/intf/loopback/__init__.py create mode 100644 lib/aci/intf/loopback/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/loopback/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/loopback/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/loopback/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/loopback/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/loopback/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/loopback/api.py create mode 100644 lib/aci/intf/loopback/audit/__init__.py create mode 100644 lib/aci/intf/loopback/audit/api.py create mode 100644 lib/aci/intf/loopback/audit/info.py create mode 100644 lib/aci/intf/loopback/audit/main.py create mode 100644 lib/aci/intf/loopback/event/__init__.py create mode 100644 lib/aci/intf/loopback/event/api.py create mode 100644 lib/aci/intf/loopback/event/info.py create mode 100644 lib/aci/intf/loopback/event/main.py create mode 100644 lib/aci/intf/loopback/fault/__init__.py create mode 100644 lib/aci/intf/loopback/fault/api.py create mode 100644 lib/aci/intf/loopback/fault/info.py create mode 100644 lib/aci/intf/loopback/fault/main.py create mode 100644 lib/aci/intf/loopback/info.py create mode 100644 lib/aci/intf/loopback/main.py create mode 100644 lib/aci/intf/loopback/output.py create mode 100644 lib/aci/intf/macsec/__init__.py create mode 100644 lib/aci/intf/macsec/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/__pycache__/ca_stats.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/__pycache__/rx.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/__pycache__/stats.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/__pycache__/tx.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/api.py create mode 100644 lib/aci/intf/macsec/audit/__init__.py create mode 100644 lib/aci/intf/macsec/audit/api.py create mode 100644 lib/aci/intf/macsec/audit/info.py create mode 100644 lib/aci/intf/macsec/audit/main.py create mode 100644 lib/aci/intf/macsec/castats/__init__.py create mode 100644 lib/aci/intf/macsec/castats/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/castats/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/castats/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/castats/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/castats/api.py create mode 100644 lib/aci/intf/macsec/castats/info.py create mode 100644 lib/aci/intf/macsec/castats/main.py create mode 100644 lib/aci/intf/macsec/event/__init__.py create mode 100644 lib/aci/intf/macsec/event/api.py create mode 100644 lib/aci/intf/macsec/event/info.py create mode 100644 lib/aci/intf/macsec/event/main.py create mode 100644 lib/aci/intf/macsec/fault/__init__.py create mode 100644 lib/aci/intf/macsec/fault/api.py create mode 100644 lib/aci/intf/macsec/fault/info.py create mode 100644 lib/aci/intf/macsec/fault/main.py create mode 100644 lib/aci/intf/macsec/info.py create mode 100644 lib/aci/intf/macsec/main.py create mode 100644 lib/aci/intf/macsec/output.py create mode 100644 lib/aci/intf/macsec/rx/__init__.py create mode 100644 lib/aci/intf/macsec/rx/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/rx/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/rx/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/rx/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/rx/api.py create mode 100644 lib/aci/intf/macsec/rx/info.py create mode 100644 lib/aci/intf/macsec/rx/main.py create mode 100644 lib/aci/intf/macsec/stats/__init__.py create mode 100644 lib/aci/intf/macsec/stats/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/stats/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/stats/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/stats/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/stats/api.py create mode 100644 lib/aci/intf/macsec/stats/info.py create mode 100644 lib/aci/intf/macsec/stats/main.py create mode 100644 lib/aci/intf/macsec/tx/__init__.py create mode 100644 lib/aci/intf/macsec/tx/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/tx/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/tx/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/tx/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/macsec/tx/api.py create mode 100644 lib/aci/intf/macsec/tx/info.py create mode 100644 lib/aci/intf/macsec/tx/main.py create mode 100644 lib/aci/intf/main.py create mode 100644 lib/aci/intf/management/__init__.py create mode 100644 lib/aci/intf/management/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/management/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/management/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/management/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/management/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/management/__pycache__/state.cpython-310.pyc create mode 100644 lib/aci/intf/management/__pycache__/stats.cpython-310.pyc create mode 100644 lib/aci/intf/management/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/management/api.py create mode 100644 lib/aci/intf/management/audit/__init__.py create mode 100644 lib/aci/intf/management/audit/api.py create mode 100644 lib/aci/intf/management/audit/info.py create mode 100644 lib/aci/intf/management/audit/main.py create mode 100644 lib/aci/intf/management/event/__init__.py create mode 100644 lib/aci/intf/management/event/api.py create mode 100644 lib/aci/intf/management/event/info.py create mode 100644 lib/aci/intf/management/event/main.py create mode 100644 lib/aci/intf/management/fault/__init__.py create mode 100644 lib/aci/intf/management/fault/api.py create mode 100644 lib/aci/intf/management/fault/info.py create mode 100644 lib/aci/intf/management/fault/main.py create mode 100644 lib/aci/intf/management/info.py create mode 100644 lib/aci/intf/management/main.py create mode 100644 lib/aci/intf/management/output.py create mode 100644 lib/aci/intf/management/state/__init__.py create mode 100644 lib/aci/intf/management/state/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/management/state/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/management/state/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/management/state/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/management/state/api.py create mode 100644 lib/aci/intf/management/state/info.py create mode 100644 lib/aci/intf/management/state/main.py create mode 100644 lib/aci/intf/management/stats/__init__.py create mode 100644 lib/aci/intf/management/stats/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/management/stats/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/management/stats/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/management/stats/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/management/stats/api.py create mode 100644 lib/aci/intf/management/stats/info.py create mode 100644 lib/aci/intf/management/stats/main.py create mode 100644 lib/aci/intf/output.py create mode 100644 lib/aci/intf/phy/__init__.py create mode 100644 lib/aci/intf/phy/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/capability.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/eee.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/epg_stats.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/ether_stats.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/fc_stats.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/load_interval.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/pc.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/qos_stats.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/stats.cpython-310.pyc create mode 100644 lib/aci/intf/phy/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/phy/api.py create mode 100644 lib/aci/intf/phy/audit/__init__.py create mode 100644 lib/aci/intf/phy/audit/api.py create mode 100644 lib/aci/intf/phy/audit/info.py create mode 100644 lib/aci/intf/phy/audit/main.py create mode 100644 lib/aci/intf/phy/cap/__init__.py create mode 100644 lib/aci/intf/phy/cap/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/phy/cap/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/phy/cap/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/phy/cap/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/phy/cap/api.py create mode 100644 lib/aci/intf/phy/cap/info.py create mode 100644 lib/aci/intf/phy/cap/main.py create mode 100644 lib/aci/intf/phy/eee/__init__.py create mode 100644 lib/aci/intf/phy/eee/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/phy/eee/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/phy/eee/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/phy/eee/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/phy/eee/api.py create mode 100644 lib/aci/intf/phy/eee/info.py create mode 100644 lib/aci/intf/phy/eee/main.py create mode 100644 lib/aci/intf/phy/event/__init__.py create mode 100644 lib/aci/intf/phy/event/api.py create mode 100644 lib/aci/intf/phy/event/info.py create mode 100644 lib/aci/intf/phy/event/main.py create mode 100644 lib/aci/intf/phy/fault/__init__.py create mode 100644 lib/aci/intf/phy/fault/api.py create mode 100644 lib/aci/intf/phy/fault/info.py create mode 100644 lib/aci/intf/phy/fault/main.py create mode 100644 lib/aci/intf/phy/info.py create mode 100644 lib/aci/intf/phy/load/__init__.py create mode 100644 lib/aci/intf/phy/load/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/phy/load/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/phy/load/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/phy/load/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/phy/load/api.py create mode 100644 lib/aci/intf/phy/load/info.py create mode 100644 lib/aci/intf/phy/load/main.py create mode 100644 lib/aci/intf/phy/main.py create mode 100644 lib/aci/intf/phy/output.py create mode 100644 lib/aci/intf/phy/pc/__init__.py create mode 100644 lib/aci/intf/phy/pc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/phy/pc/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/phy/pc/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/phy/pc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/phy/pc/api.py create mode 100644 lib/aci/intf/phy/pc/info.py create mode 100644 lib/aci/intf/phy/pc/main.py create mode 100644 lib/aci/intf/phy/stats/__init__.py create mode 100644 lib/aci/intf/phy/stats/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/epg/__init__.py create mode 100644 lib/aci/intf/phy/stats/epg/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/epg/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/epg/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/epg/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/epg/api.py create mode 100644 lib/aci/intf/phy/stats/epg/info.py create mode 100644 lib/aci/intf/phy/stats/epg/main.py create mode 100644 lib/aci/intf/phy/stats/ether/__init__.py create mode 100644 lib/aci/intf/phy/stats/ether/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/ether/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/ether/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/ether/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/ether/api.py create mode 100644 lib/aci/intf/phy/stats/ether/info.py create mode 100644 lib/aci/intf/phy/stats/ether/main.py create mode 100644 lib/aci/intf/phy/stats/fc/__init__.py create mode 100644 lib/aci/intf/phy/stats/fc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/fc/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/fc/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/fc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/fc/api.py create mode 100644 lib/aci/intf/phy/stats/fc/info.py create mode 100644 lib/aci/intf/phy/stats/fc/main.py create mode 100644 lib/aci/intf/phy/stats/main.py create mode 100644 lib/aci/intf/phy/stats/qos/__init__.py create mode 100644 lib/aci/intf/phy/stats/qos/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/qos/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/qos/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/qos/__pycache__/live.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/qos/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/qos/api.py create mode 100644 lib/aci/intf/phy/stats/qos/info.py create mode 100644 lib/aci/intf/phy/stats/qos/live.py create mode 100644 lib/aci/intf/phy/stats/qos/main.py create mode 100644 lib/aci/intf/phy/stats/rmon/__init__.py create mode 100644 lib/aci/intf/phy/stats/rmon/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/rmon/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/rmon/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/rmon/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/phy/stats/rmon/api.py create mode 100644 lib/aci/intf/phy/stats/rmon/info.py create mode 100644 lib/aci/intf/phy/stats/rmon/main.py create mode 100644 lib/aci/intf/policy/__init__.py create mode 100644 lib/aci/intf/policy/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/policy/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/policy/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/policy/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/policy/group/__init__.py create mode 100644 lib/aci/intf/policy/group/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/policy/group/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/policy/group/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/policy/group/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/policy/group/info.py create mode 100644 lib/aci/intf/policy/group/main.py create mode 100644 lib/aci/intf/policy/main.py create mode 100644 lib/aci/intf/policy/profile/__init__.py create mode 100644 lib/aci/intf/policy/profile/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/policy/profile/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/policy/profile/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/policy/profile/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/policy/profile/api.py create mode 100644 lib/aci/intf/policy/profile/info.py create mode 100644 lib/aci/intf/policy/profile/main.py create mode 100644 lib/aci/intf/port_channel/__init__.py create mode 100644 lib/aci/intf/port_channel/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/__pycache__/members.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/__pycache__/relations.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/api.py create mode 100644 lib/aci/intf/port_channel/audit/__init__.py create mode 100644 lib/aci/intf/port_channel/audit/api.py create mode 100644 lib/aci/intf/port_channel/audit/info.py create mode 100644 lib/aci/intf/port_channel/audit/main.py create mode 100644 lib/aci/intf/port_channel/event/__init__.py create mode 100644 lib/aci/intf/port_channel/event/api.py create mode 100644 lib/aci/intf/port_channel/event/info.py create mode 100644 lib/aci/intf/port_channel/event/main.py create mode 100644 lib/aci/intf/port_channel/fault/__init__.py create mode 100644 lib/aci/intf/port_channel/fault/api.py create mode 100644 lib/aci/intf/port_channel/fault/info.py create mode 100644 lib/aci/intf/port_channel/fault/main.py create mode 100644 lib/aci/intf/port_channel/info.py create mode 100644 lib/aci/intf/port_channel/main.py create mode 100644 lib/aci/intf/port_channel/members/__init__.py create mode 100644 lib/aci/intf/port_channel/members/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/members/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/members/main.py create mode 100644 lib/aci/intf/port_channel/output.py create mode 100644 lib/aci/intf/port_channel/relations/__init__.py create mode 100644 lib/aci/intf/port_channel/relations/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/relations/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/relations/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/relations/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/port_channel/relations/api.py create mode 100644 lib/aci/intf/port_channel/relations/info.py create mode 100644 lib/aci/intf/port_channel/relations/main.py create mode 100644 lib/aci/intf/summary/__init__.py create mode 100644 lib/aci/intf/summary/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/summary/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/summary/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/summary/main.py create mode 100644 lib/aci/intf/summary/output.py create mode 100644 lib/aci/intf/svi/__init__.py create mode 100644 lib/aci/intf/svi/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/svi/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/svi/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/svi/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/svi/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/svi/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/svi/api.py create mode 100644 lib/aci/intf/svi/audit/__init__.py create mode 100644 lib/aci/intf/svi/audit/api.py create mode 100644 lib/aci/intf/svi/audit/info.py create mode 100644 lib/aci/intf/svi/audit/main.py create mode 100644 lib/aci/intf/svi/event/__init__.py create mode 100644 lib/aci/intf/svi/event/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/svi/event/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/svi/event/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/svi/event/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/svi/event/api.py create mode 100644 lib/aci/intf/svi/event/info.py create mode 100644 lib/aci/intf/svi/event/main.py create mode 100644 lib/aci/intf/svi/fault/__init__.py create mode 100644 lib/aci/intf/svi/fault/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/svi/fault/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/svi/fault/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/svi/fault/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/svi/fault/api.py create mode 100644 lib/aci/intf/svi/fault/info.py create mode 100644 lib/aci/intf/svi/fault/main.py create mode 100644 lib/aci/intf/svi/info.py create mode 100644 lib/aci/intf/svi/main.py create mode 100644 lib/aci/intf/svi/output.py create mode 100644 lib/aci/intf/tunnel/__init__.py create mode 100644 lib/aci/intf/tunnel/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/tunnel/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/tunnel/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/tunnel/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/tunnel/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/tunnel/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/tunnel/api.py create mode 100644 lib/aci/intf/tunnel/audit/__init__.py create mode 100644 lib/aci/intf/tunnel/audit/api.py create mode 100644 lib/aci/intf/tunnel/audit/info.py create mode 100644 lib/aci/intf/tunnel/audit/main.py create mode 100644 lib/aci/intf/tunnel/event/__init__.py create mode 100644 lib/aci/intf/tunnel/event/api.py create mode 100644 lib/aci/intf/tunnel/event/info.py create mode 100644 lib/aci/intf/tunnel/event/main.py create mode 100644 lib/aci/intf/tunnel/fault/__init__.py create mode 100644 lib/aci/intf/tunnel/fault/api.py create mode 100644 lib/aci/intf/tunnel/fault/info.py create mode 100644 lib/aci/intf/tunnel/fault/main.py create mode 100644 lib/aci/intf/tunnel/info.py create mode 100644 lib/aci/intf/tunnel/main.py create mode 100644 lib/aci/intf/tunnel/output.py create mode 100644 lib/aci/intf/vfc/__init__.py create mode 100644 lib/aci/intf/vfc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/vfc/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/vfc/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/vfc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/vfc/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/vfc/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/vfc/api.py create mode 100644 lib/aci/intf/vfc/audit/__init__.py create mode 100644 lib/aci/intf/vfc/audit/api.py create mode 100644 lib/aci/intf/vfc/audit/info.py create mode 100644 lib/aci/intf/vfc/audit/main.py create mode 100644 lib/aci/intf/vfc/event/__init__.py create mode 100644 lib/aci/intf/vfc/event/api.py create mode 100644 lib/aci/intf/vfc/event/info.py create mode 100644 lib/aci/intf/vfc/event/main.py create mode 100644 lib/aci/intf/vfc/fault/__init__.py create mode 100644 lib/aci/intf/vfc/fault/api.py create mode 100644 lib/aci/intf/vfc/fault/info.py create mode 100644 lib/aci/intf/vfc/fault/main.py create mode 100644 lib/aci/intf/vfc/info.py create mode 100644 lib/aci/intf/vfc/main.py create mode 100644 lib/aci/intf/vfc/output.py create mode 100644 lib/aci/intf/virtual_port_channel/__init__.py create mode 100644 lib/aci/intf/virtual_port_channel/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/virtual_port_channel/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/virtual_port_channel/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/virtual_port_channel/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/virtual_port_channel/__pycache__/member.cpython-310.pyc create mode 100644 lib/aci/intf/virtual_port_channel/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/virtual_port_channel/__pycache__/summary.cpython-310.pyc create mode 100644 lib/aci/intf/virtual_port_channel/api.py create mode 100644 lib/aci/intf/virtual_port_channel/audit/__init__.py create mode 100644 lib/aci/intf/virtual_port_channel/audit/api.py create mode 100644 lib/aci/intf/virtual_port_channel/audit/info.py create mode 100644 lib/aci/intf/virtual_port_channel/audit/main.py create mode 100644 lib/aci/intf/virtual_port_channel/event/__init__.py create mode 100644 lib/aci/intf/virtual_port_channel/event/api.py create mode 100644 lib/aci/intf/virtual_port_channel/event/info.py create mode 100644 lib/aci/intf/virtual_port_channel/event/main.py create mode 100644 lib/aci/intf/virtual_port_channel/fault/__init__.py create mode 100644 lib/aci/intf/virtual_port_channel/fault/api.py create mode 100644 lib/aci/intf/virtual_port_channel/fault/info.py create mode 100644 lib/aci/intf/virtual_port_channel/fault/main.py create mode 100644 lib/aci/intf/virtual_port_channel/info.py create mode 100644 lib/aci/intf/virtual_port_channel/main.py create mode 100644 lib/aci/intf/virtual_port_channel/member/__init__.py create mode 100644 lib/aci/intf/virtual_port_channel/member/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/virtual_port_channel/member/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/virtual_port_channel/member/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/virtual_port_channel/member/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/virtual_port_channel/member/info.py create mode 100644 lib/aci/intf/virtual_port_channel/member/main.py create mode 100644 lib/aci/intf/virtual_port_channel/output.py create mode 100644 lib/aci/intf/vlan/__init__.py create mode 100644 lib/aci/intf/vlan/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/intf/vlan/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/intf/vlan/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/intf/vlan/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/intf/vlan/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/intf/vlan/api.py create mode 100644 lib/aci/intf/vlan/info.py create mode 100644 lib/aci/intf/vlan/main.py create mode 100644 lib/aci/intf/vlan/output.py create mode 100644 lib/aci/l2out/__init__.py create mode 100644 lib/aci/l2out/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/l2out/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/l2out/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/l2out/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/l2out/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/l2out/api.py create mode 100644 lib/aci/l2out/audit/__init__.py create mode 100644 lib/aci/l2out/audit/api.py create mode 100644 lib/aci/l2out/audit/info.py create mode 100644 lib/aci/l2out/audit/main.py create mode 100644 lib/aci/l2out/event/__init__.py create mode 100644 lib/aci/l2out/event/api.py create mode 100644 lib/aci/l2out/event/info.py create mode 100644 lib/aci/l2out/event/main.py create mode 100644 lib/aci/l2out/fault/__init__.py create mode 100644 lib/aci/l2out/fault/api.py create mode 100644 lib/aci/l2out/fault/info.py create mode 100644 lib/aci/l2out/fault/main.py create mode 100644 lib/aci/l2out/info.py create mode 100644 lib/aci/l2out/main.py create mode 100644 lib/aci/l2out/node/__init__.py create mode 100644 lib/aci/l2out/node/api.py create mode 100644 lib/aci/l2out/node/info.py create mode 100644 lib/aci/l2out/node/main.py create mode 100644 lib/aci/l2out/output.py create mode 100644 lib/aci/l3out/__init__.py create mode 100644 lib/aci/l3out/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/bgp.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/domain.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/eigrp.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/epg.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/node.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/ospf.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/pim.cpython-310.pyc create mode 100644 lib/aci/l3out/__pycache__/vrf.cpython-310.pyc create mode 100644 lib/aci/l3out/api.py create mode 100644 lib/aci/l3out/audit/__init__.py create mode 100644 lib/aci/l3out/audit/api.py create mode 100644 lib/aci/l3out/audit/info.py create mode 100644 lib/aci/l3out/audit/main.py create mode 100644 lib/aci/l3out/bgp.py create mode 100644 lib/aci/l3out/domain.py create mode 100644 lib/aci/l3out/eigrp.py create mode 100644 lib/aci/l3out/epg.py create mode 100644 lib/aci/l3out/event/__init__.py create mode 100644 lib/aci/l3out/event/api.py create mode 100644 lib/aci/l3out/event/info.py create mode 100644 lib/aci/l3out/event/main.py create mode 100644 lib/aci/l3out/fault/__init__.py create mode 100644 lib/aci/l3out/fault/api.py create mode 100644 lib/aci/l3out/fault/info.py create mode 100644 lib/aci/l3out/fault/main.py create mode 100644 lib/aci/l3out/info.py create mode 100644 lib/aci/l3out/logical_node_profile/api.py create mode 100644 lib/aci/l3out/logical_node_profile/info.py create mode 100644 lib/aci/l3out/logical_node_profile/main.py create mode 100644 lib/aci/l3out/main.py create mode 100644 lib/aci/l3out/node/__init__.py create mode 100644 lib/aci/l3out/node/api.py create mode 100644 lib/aci/l3out/node/info.py create mode 100644 lib/aci/l3out/node/main.py create mode 100644 lib/aci/l3out/ospf.py create mode 100644 lib/aci/l3out/output.py create mode 100644 lib/aci/l3out/pim.py create mode 100644 lib/aci/l3out/vrf.py create mode 100644 lib/aci/node/__init__.py create mode 100644 lib/aci/node/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/node/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/node/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/node/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/node/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/node/api.py create mode 100644 lib/aci/node/bot_output.py create mode 100644 lib/aci/node/info.py create mode 100644 lib/aci/node/main.py create mode 100644 lib/aci/node/output.py create mode 100644 lib/aci/node/policy/__init__.py create mode 100644 lib/aci/node/policy/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/node/policy/profile/__init__.py create mode 100644 lib/aci/node/policy/profile/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/node/policy/profile/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/node/policy/profile/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/node/policy/profile/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/node/policy/profile/api.py create mode 100644 lib/aci/node/policy/profile/info.py create mode 100644 lib/aci/node/policy/profile/main.py create mode 100644 lib/aci/node/power/__init__.py create mode 100644 lib/aci/node/power/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/node/power/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/node/power/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/node/power/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/node/power/api.py create mode 100644 lib/aci/node/power/info.py create mode 100644 lib/aci/node/power/main.py create mode 100644 lib/aci/node/psu/__init__.py create mode 100644 lib/aci/node/psu/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/node/psu/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/node/psu/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/node/psu/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/node/psu/api.py create mode 100644 lib/aci/node/psu/info.py create mode 100644 lib/aci/node/psu/main.py create mode 100644 lib/aci/node/sensor/__init__.py create mode 100644 lib/aci/node/sensor/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/node/sensor/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/node/sensor/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/node/sensor/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/node/sensor/api.py create mode 100644 lib/aci/node/sensor/info.py create mode 100644 lib/aci/node/sensor/main.py create mode 100644 lib/aci/node/system/__init__.py create mode 100644 lib/aci/node/system/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/node/system/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/node/system/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/node/system/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/node/system/api.py create mode 100644 lib/aci/node/system/info.py create mode 100644 lib/aci/node/system/main.py create mode 100644 lib/aci/node/temp/__init__.py create mode 100644 lib/aci/node/temp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/node/temp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/node/temp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/node/temp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/node/temp/api.py create mode 100644 lib/aci/node/temp/info.py create mode 100644 lib/aci/node/temp/main.py create mode 100644 lib/aci/output.py create mode 100644 lib/aci/path/__init__.py create mode 100644 lib/aci/path/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/path/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/path/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/path/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/path/api.py create mode 100644 lib/aci/path/info.py create mode 100644 lib/aci/path/main.py create mode 100644 lib/aci/pg/__init__.py create mode 100644 lib/aci/pg/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/pg/access/__init__.py create mode 100644 lib/aci/pg/access/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/__pycache__/breakout.cpython-310.pyc create mode 100644 lib/aci/pg/access/__pycache__/leaf.cpython-310.pyc create mode 100644 lib/aci/pg/access/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/pg/access/__pycache__/spine.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/__init__.py create mode 100644 lib/aci/pg/access/intf/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/breakout/__init__.py create mode 100644 lib/aci/pg/access/intf/breakout/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/breakout/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/breakout/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/breakout/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/breakout/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/breakout/api.py create mode 100644 lib/aci/pg/access/intf/breakout/info.py create mode 100644 lib/aci/pg/access/intf/breakout/main.py create mode 100644 lib/aci/pg/access/intf/breakout/output.py create mode 100644 lib/aci/pg/access/intf/fc/__init__.py create mode 100644 lib/aci/pg/access/intf/fc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/fc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/fc/main.py create mode 100644 lib/aci/pg/access/intf/fcpc/__init__.py create mode 100644 lib/aci/pg/access/intf/fcpc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/fcpc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/fcpc/main.py create mode 100644 lib/aci/pg/access/intf/main.py create mode 100644 lib/aci/pg/access/intf/output.py create mode 100644 lib/aci/pg/access/intf/override/__init__.py create mode 100644 lib/aci/pg/access/intf/override/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/override/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/override/main.py create mode 100644 lib/aci/pg/access/intf/pc/__init__.py create mode 100644 lib/aci/pg/access/intf/pc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/pc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/pc/main.py create mode 100644 lib/aci/pg/access/intf/port/__init__.py create mode 100644 lib/aci/pg/access/intf/port/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/port/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/port/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/port/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/port/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/port/api.py create mode 100644 lib/aci/pg/access/intf/port/audit/__init__.py create mode 100644 lib/aci/pg/access/intf/port/audit/api.py create mode 100644 lib/aci/pg/access/intf/port/audit/info.py create mode 100644 lib/aci/pg/access/intf/port/audit/main.py create mode 100644 lib/aci/pg/access/intf/port/event/__init__.py create mode 100644 lib/aci/pg/access/intf/port/event/api.py create mode 100644 lib/aci/pg/access/intf/port/event/info.py create mode 100644 lib/aci/pg/access/intf/port/event/main.py create mode 100644 lib/aci/pg/access/intf/port/fault/__init__.py create mode 100644 lib/aci/pg/access/intf/port/fault/api.py create mode 100644 lib/aci/pg/access/intf/port/fault/info.py create mode 100644 lib/aci/pg/access/intf/port/fault/main.py create mode 100644 lib/aci/pg/access/intf/port/info.py create mode 100644 lib/aci/pg/access/intf/port/main.py create mode 100644 lib/aci/pg/access/intf/port/node/__init__.py create mode 100644 lib/aci/pg/access/intf/port/node/api.py create mode 100644 lib/aci/pg/access/intf/port/node/info.py create mode 100644 lib/aci/pg/access/intf/port/node/main.py create mode 100644 lib/aci/pg/access/intf/port/output.py create mode 100644 lib/aci/pg/access/intf/spine/__init__.py create mode 100644 lib/aci/pg/access/intf/spine/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/spine/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/spine/main.py create mode 100644 lib/aci/pg/access/intf/vpc/__init__.py create mode 100644 lib/aci/pg/access/intf/vpc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/__pycache__/node.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/__pycache__/policy.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/__pycache__/port.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/api.py create mode 100644 lib/aci/pg/access/intf/vpc/audit/__init__.py create mode 100644 lib/aci/pg/access/intf/vpc/audit/api.py create mode 100644 lib/aci/pg/access/intf/vpc/audit/info.py create mode 100644 lib/aci/pg/access/intf/vpc/audit/main.py create mode 100644 lib/aci/pg/access/intf/vpc/event/__init__.py create mode 100644 lib/aci/pg/access/intf/vpc/event/api.py create mode 100644 lib/aci/pg/access/intf/vpc/event/info.py create mode 100644 lib/aci/pg/access/intf/vpc/event/main.py create mode 100644 lib/aci/pg/access/intf/vpc/fault/__init__.py create mode 100644 lib/aci/pg/access/intf/vpc/fault/api.py create mode 100644 lib/aci/pg/access/intf/vpc/fault/info.py create mode 100644 lib/aci/pg/access/intf/vpc/fault/main.py create mode 100644 lib/aci/pg/access/intf/vpc/info.py create mode 100644 lib/aci/pg/access/intf/vpc/main.py create mode 100644 lib/aci/pg/access/intf/vpc/node/__init__.py create mode 100644 lib/aci/pg/access/intf/vpc/node/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/node/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/node/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/node/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/intf/vpc/node/api.py create mode 100644 lib/aci/pg/access/intf/vpc/node/info.py create mode 100644 lib/aci/pg/access/intf/vpc/node/main.py create mode 100644 lib/aci/pg/access/intf/vpc/nodes/__init__.py create mode 100644 lib/aci/pg/access/intf/vpc/nodes/api.py create mode 100644 lib/aci/pg/access/intf/vpc/nodes/info.py create mode 100644 lib/aci/pg/access/intf/vpc/nodes/main.py create mode 100644 lib/aci/pg/access/intf/vpc/output.py create mode 100644 lib/aci/pg/access/intf/vpc/ports/__init__.py create mode 100644 lib/aci/pg/access/intf/vpc/ports/api.py create mode 100644 lib/aci/pg/access/intf/vpc/ports/info.py create mode 100644 lib/aci/pg/access/intf/vpc/ports/main.py create mode 100644 lib/aci/pg/access/main.py create mode 100644 lib/aci/pg/access/output.py create mode 100644 lib/aci/pg/access/switch/__init__.py create mode 100644 lib/aci/pg/access/switch/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/switch/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/switch/leaf/__init__.py create mode 100644 lib/aci/pg/access/switch/leaf/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/switch/leaf/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/switch/leaf/main.py create mode 100644 lib/aci/pg/access/switch/main.py create mode 100644 lib/aci/pg/access/switch/spine/__init__.py create mode 100644 lib/aci/pg/access/switch/spine/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/access/switch/spine/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/access/switch/spine/main.py create mode 100644 lib/aci/pg/fabric/__init__.py create mode 100644 lib/aci/pg/fabric/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/__pycache__/leaf.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/__pycache__/spine.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/intf/__init__.py create mode 100644 lib/aci/pg/fabric/intf/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/intf/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/intf/leaf/__init__.py create mode 100644 lib/aci/pg/fabric/intf/leaf/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/intf/leaf/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/intf/leaf/main.py create mode 100644 lib/aci/pg/fabric/intf/main.py create mode 100644 lib/aci/pg/fabric/intf/spine/__init__.py create mode 100644 lib/aci/pg/fabric/intf/spine/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/intf/spine/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/intf/spine/main.py create mode 100644 lib/aci/pg/fabric/main.py create mode 100644 lib/aci/pg/fabric/module/__init__.py create mode 100644 lib/aci/pg/fabric/module/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/module/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/module/leaf/__init__.py create mode 100644 lib/aci/pg/fabric/module/leaf/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/module/leaf/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/module/leaf/main.py create mode 100644 lib/aci/pg/fabric/module/main.py create mode 100644 lib/aci/pg/fabric/module/spine/__init__.py create mode 100644 lib/aci/pg/fabric/module/spine/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/module/spine/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/module/spine/main.py create mode 100644 lib/aci/pg/fabric/switch/__init__.py create mode 100644 lib/aci/pg/fabric/switch/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/switch/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/switch/leaf/__init__.py create mode 100644 lib/aci/pg/fabric/switch/leaf/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/switch/leaf/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/switch/leaf/main.py create mode 100644 lib/aci/pg/fabric/switch/main.py create mode 100644 lib/aci/pg/fabric/switch/spine/__init__.py create mode 100644 lib/aci/pg/fabric/switch/spine/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/switch/spine/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pg/fabric/switch/spine/main.py create mode 100644 lib/aci/pg/main.py create mode 100644 lib/aci/pg/output.py create mode 100644 lib/aci/policy/__init__.py create mode 100644 lib/aci/policy/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/cdp.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/host_interface.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/igmp_snoop.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/link_flap.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/lldp.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/mcp.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/mld_snoop.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/monitoring.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/sn.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/storm_control.cpython-310.pyc create mode 100644 lib/aci/policy/__pycache__/stp.cpython-310.pyc create mode 100644 lib/aci/policy/general/__init__.py create mode 100644 lib/aci/policy/general/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/general/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/general/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/general/aae/__init__.py create mode 100644 lib/aci/policy/general/aae/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/general/aae/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/general/aae/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/general/aae/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/general/aae/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/general/aae/api.py create mode 100644 lib/aci/policy/general/aae/audit/__init__.py create mode 100644 lib/aci/policy/general/aae/audit/api.py create mode 100644 lib/aci/policy/general/aae/audit/info.py create mode 100644 lib/aci/policy/general/aae/audit/main.py create mode 100644 lib/aci/policy/general/aae/event/__init__.py create mode 100644 lib/aci/policy/general/aae/event/api.py create mode 100644 lib/aci/policy/general/aae/event/info.py create mode 100644 lib/aci/policy/general/aae/event/main.py create mode 100644 lib/aci/policy/general/aae/fault/__init__.py create mode 100644 lib/aci/policy/general/aae/fault/api.py create mode 100644 lib/aci/policy/general/aae/fault/info.py create mode 100644 lib/aci/policy/general/aae/fault/main.py create mode 100644 lib/aci/policy/general/aae/info.py create mode 100644 lib/aci/policy/general/aae/main.py create mode 100644 lib/aci/policy/general/aae/node/__init__.py create mode 100644 lib/aci/policy/general/aae/node/api.py create mode 100644 lib/aci/policy/general/aae/node/info.py create mode 100644 lib/aci/policy/general/aae/node/main.py create mode 100644 lib/aci/policy/general/aae/output.py create mode 100644 lib/aci/policy/general/main.py create mode 100644 lib/aci/policy/general/output.py create mode 100644 lib/aci/policy/interface/__init__.py create mode 100644 lib/aci/policy/interface/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/cdp.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/fc.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/l2.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/link_flap.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/link_level.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/lldp.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/macsec.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/mcp.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/port_channel.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/port_security.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/storm_control.cpython-310.pyc create mode 100644 lib/aci/policy/interface/__pycache__/stp.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/__init__.py create mode 100644 lib/aci/policy/interface/auth/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/__pycache__/vmm.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/api.py create mode 100644 lib/aci/policy/interface/auth/attachment/__init__.py create mode 100644 lib/aci/policy/interface/auth/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/auth/attachment/api.py create mode 100644 lib/aci/policy/interface/auth/attachment/info.py create mode 100644 lib/aci/policy/interface/auth/attachment/main.py create mode 100644 lib/aci/policy/interface/auth/context.py create mode 100644 lib/aci/policy/interface/auth/info.py create mode 100644 lib/aci/policy/interface/auth/main.py create mode 100644 lib/aci/policy/interface/auth/output.py create mode 100644 lib/aci/policy/interface/cdp/__init__.py create mode 100644 lib/aci/policy/interface/cdp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/__pycache__/vmm.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/api.py create mode 100644 lib/aci/policy/interface/cdp/attachment/__init__.py create mode 100644 lib/aci/policy/interface/cdp/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/cdp/attachment/api.py create mode 100644 lib/aci/policy/interface/cdp/attachment/info.py create mode 100644 lib/aci/policy/interface/cdp/attachment/main.py create mode 100644 lib/aci/policy/interface/cdp/context.py create mode 100644 lib/aci/policy/interface/cdp/info.py create mode 100644 lib/aci/policy/interface/cdp/main.py create mode 100644 lib/aci/policy/interface/cdp/output.py create mode 100644 lib/aci/policy/interface/copp/__init__.py create mode 100644 lib/aci/policy/interface/copp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/__pycache__/protocol.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/__pycache__/vmm.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/api.py create mode 100644 lib/aci/policy/interface/copp/attachment/__init__.py create mode 100644 lib/aci/policy/interface/copp/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/attachment/api.py create mode 100644 lib/aci/policy/interface/copp/attachment/info.py create mode 100644 lib/aci/policy/interface/copp/attachment/main.py create mode 100644 lib/aci/policy/interface/copp/context.py create mode 100644 lib/aci/policy/interface/copp/info.py create mode 100644 lib/aci/policy/interface/copp/main.py create mode 100644 lib/aci/policy/interface/copp/output.py create mode 100644 lib/aci/policy/interface/copp/protocol/__init__.py create mode 100644 lib/aci/policy/interface/copp/protocol/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/protocol/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/protocol/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/protocol/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/copp/protocol/api.py create mode 100644 lib/aci/policy/interface/copp/protocol/info.py create mode 100644 lib/aci/policy/interface/copp/protocol/main.py create mode 100644 lib/aci/policy/interface/dpp/__init__.py create mode 100644 lib/aci/policy/interface/dpp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/__pycache__/vmm.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/api.py create mode 100644 lib/aci/policy/interface/dpp/attachment/__init__.py create mode 100644 lib/aci/policy/interface/dpp/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/dpp/attachment/api.py create mode 100644 lib/aci/policy/interface/dpp/attachment/info.py create mode 100644 lib/aci/policy/interface/dpp/attachment/main.py create mode 100644 lib/aci/policy/interface/dpp/context.py create mode 100644 lib/aci/policy/interface/dpp/info.py create mode 100644 lib/aci/policy/interface/dpp/main.py create mode 100644 lib/aci/policy/interface/dpp/output.py create mode 100644 lib/aci/policy/interface/fc/__init__.py create mode 100644 lib/aci/policy/interface/fc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/fc/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/fc/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/fc/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/fc/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/fc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/fc/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/fc/api.py create mode 100644 lib/aci/policy/interface/fc/attachment/__init__.py create mode 100644 lib/aci/policy/interface/fc/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/fc/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/fc/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/fc/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/fc/attachment/api.py create mode 100644 lib/aci/policy/interface/fc/attachment/info.py create mode 100644 lib/aci/policy/interface/fc/attachment/main.py create mode 100644 lib/aci/policy/interface/fc/context.py create mode 100644 lib/aci/policy/interface/fc/info.py create mode 100644 lib/aci/policy/interface/fc/main.py create mode 100644 lib/aci/policy/interface/fc/output.py create mode 100644 lib/aci/policy/interface/l2/__init__.py create mode 100644 lib/aci/policy/interface/l2/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/l2/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/l2/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/l2/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/l2/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/l2/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/l2/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/l2/api.py create mode 100644 lib/aci/policy/interface/l2/attachment/__init__.py create mode 100644 lib/aci/policy/interface/l2/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/l2/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/l2/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/l2/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/l2/attachment/api.py create mode 100644 lib/aci/policy/interface/l2/attachment/info.py create mode 100644 lib/aci/policy/interface/l2/attachment/main.py create mode 100644 lib/aci/policy/interface/l2/context.py create mode 100644 lib/aci/policy/interface/l2/info.py create mode 100644 lib/aci/policy/interface/l2/main.py create mode 100644 lib/aci/policy/interface/l2/output.py create mode 100644 lib/aci/policy/interface/link_flap/__init__.py create mode 100644 lib/aci/policy/interface/link_flap/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_flap/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_flap/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_flap/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_flap/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_flap/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_flap/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_flap/api.py create mode 100644 lib/aci/policy/interface/link_flap/attachment/__init__.py create mode 100644 lib/aci/policy/interface/link_flap/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_flap/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_flap/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_flap/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_flap/attachment/api.py create mode 100644 lib/aci/policy/interface/link_flap/attachment/info.py create mode 100644 lib/aci/policy/interface/link_flap/attachment/main.py create mode 100644 lib/aci/policy/interface/link_flap/context.py create mode 100644 lib/aci/policy/interface/link_flap/info.py create mode 100644 lib/aci/policy/interface/link_flap/main.py create mode 100644 lib/aci/policy/interface/link_flap/output.py create mode 100644 lib/aci/policy/interface/link_level/__init__.py create mode 100644 lib/aci/policy/interface/link_level/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level/api.py create mode 100644 lib/aci/policy/interface/link_level/attachment/__init__.py create mode 100644 lib/aci/policy/interface/link_level/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level/attachment/api.py create mode 100644 lib/aci/policy/interface/link_level/attachment/info.py create mode 100644 lib/aci/policy/interface/link_level/attachment/main.py create mode 100644 lib/aci/policy/interface/link_level/context.py create mode 100644 lib/aci/policy/interface/link_level/info.py create mode 100644 lib/aci/policy/interface/link_level/main.py create mode 100644 lib/aci/policy/interface/link_level/output.py create mode 100644 lib/aci/policy/interface/link_level_fc/__init__.py create mode 100644 lib/aci/policy/interface/link_level_fc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level_fc/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level_fc/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level_fc/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level_fc/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level_fc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level_fc/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level_fc/api.py create mode 100644 lib/aci/policy/interface/link_level_fc/attachment/__init__.py create mode 100644 lib/aci/policy/interface/link_level_fc/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level_fc/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level_fc/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level_fc/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/link_level_fc/attachment/api.py create mode 100644 lib/aci/policy/interface/link_level_fc/attachment/info.py create mode 100644 lib/aci/policy/interface/link_level_fc/attachment/main.py create mode 100644 lib/aci/policy/interface/link_level_fc/context.py create mode 100644 lib/aci/policy/interface/link_level_fc/info.py create mode 100644 lib/aci/policy/interface/link_level_fc/main.py create mode 100644 lib/aci/policy/interface/link_level_fc/output.py create mode 100644 lib/aci/policy/interface/lldp/__init__.py create mode 100644 lib/aci/policy/interface/lldp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/lldp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/lldp/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/lldp/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/lldp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/lldp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/lldp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/lldp/api.py create mode 100644 lib/aci/policy/interface/lldp/attachment/__init__.py create mode 100644 lib/aci/policy/interface/lldp/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/lldp/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/lldp/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/lldp/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/lldp/attachment/api.py create mode 100644 lib/aci/policy/interface/lldp/attachment/info.py create mode 100644 lib/aci/policy/interface/lldp/attachment/main.py create mode 100644 lib/aci/policy/interface/lldp/context.py create mode 100644 lib/aci/policy/interface/lldp/info.py create mode 100644 lib/aci/policy/interface/lldp/main.py create mode 100644 lib/aci/policy/interface/lldp/output.py create mode 100644 lib/aci/policy/interface/main.py create mode 100644 lib/aci/policy/interface/mcp/__init__.py create mode 100644 lib/aci/policy/interface/mcp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/__pycache__/vmm.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/api.py create mode 100644 lib/aci/policy/interface/mcp/attachment/__init__.py create mode 100644 lib/aci/policy/interface/mcp/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/mcp/attachment/api.py create mode 100644 lib/aci/policy/interface/mcp/attachment/info.py create mode 100644 lib/aci/policy/interface/mcp/attachment/main.py create mode 100644 lib/aci/policy/interface/mcp/context.py create mode 100644 lib/aci/policy/interface/mcp/info.py create mode 100644 lib/aci/policy/interface/mcp/main.py create mode 100644 lib/aci/policy/interface/mcp/output.py create mode 100644 lib/aci/policy/interface/output.py create mode 100644 lib/aci/policy/interface/pfc/__init__.py create mode 100644 lib/aci/policy/interface/pfc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/__pycache__/vmm.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/api.py create mode 100644 lib/aci/policy/interface/pfc/attachment/__init__.py create mode 100644 lib/aci/policy/interface/pfc/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/pfc/attachment/api.py create mode 100644 lib/aci/policy/interface/pfc/attachment/info.py create mode 100644 lib/aci/policy/interface/pfc/attachment/main.py create mode 100644 lib/aci/policy/interface/pfc/context.py create mode 100644 lib/aci/policy/interface/pfc/info.py create mode 100644 lib/aci/policy/interface/pfc/main.py create mode 100644 lib/aci/policy/interface/pfc/output.py create mode 100644 lib/aci/policy/interface/port_channel/__init__.py create mode 100644 lib/aci/policy/interface/port_channel/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel/api.py create mode 100644 lib/aci/policy/interface/port_channel/attachment/__init__.py create mode 100644 lib/aci/policy/interface/port_channel/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel/attachment/api.py create mode 100644 lib/aci/policy/interface/port_channel/attachment/info.py create mode 100644 lib/aci/policy/interface/port_channel/attachment/main.py create mode 100644 lib/aci/policy/interface/port_channel/context.py create mode 100644 lib/aci/policy/interface/port_channel/info.py create mode 100644 lib/aci/policy/interface/port_channel/main.py create mode 100644 lib/aci/policy/interface/port_channel/output.py create mode 100644 lib/aci/policy/interface/port_channel_member/__init__.py create mode 100644 lib/aci/policy/interface/port_channel_member/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel_member/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel_member/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel_member/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel_member/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel_member/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel_member/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel_member/api.py create mode 100644 lib/aci/policy/interface/port_channel_member/attachment/__init__.py create mode 100644 lib/aci/policy/interface/port_channel_member/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel_member/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel_member/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel_member/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_channel_member/attachment/api.py create mode 100644 lib/aci/policy/interface/port_channel_member/attachment/info.py create mode 100644 lib/aci/policy/interface/port_channel_member/attachment/main.py create mode 100644 lib/aci/policy/interface/port_channel_member/context.py create mode 100644 lib/aci/policy/interface/port_channel_member/info.py create mode 100644 lib/aci/policy/interface/port_channel_member/main.py create mode 100644 lib/aci/policy/interface/port_channel_member/output.py create mode 100644 lib/aci/policy/interface/port_security/__init__.py create mode 100644 lib/aci/policy/interface/port_security/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_security/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_security/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_security/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_security/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_security/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_security/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_security/api.py create mode 100644 lib/aci/policy/interface/port_security/attachment/__init__.py create mode 100644 lib/aci/policy/interface/port_security/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_security/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_security/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_security/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/port_security/attachment/api.py create mode 100644 lib/aci/policy/interface/port_security/attachment/info.py create mode 100644 lib/aci/policy/interface/port_security/attachment/main.py create mode 100644 lib/aci/policy/interface/port_security/context.py create mode 100644 lib/aci/policy/interface/port_security/info.py create mode 100644 lib/aci/policy/interface/port_security/main.py create mode 100644 lib/aci/policy/interface/port_security/output.py create mode 100644 lib/aci/policy/interface/slow_drain/__init__.py create mode 100644 lib/aci/policy/interface/slow_drain/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/slow_drain/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/slow_drain/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/slow_drain/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/slow_drain/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/slow_drain/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/slow_drain/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/slow_drain/api.py create mode 100644 lib/aci/policy/interface/slow_drain/attachment/__init__.py create mode 100644 lib/aci/policy/interface/slow_drain/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/slow_drain/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/slow_drain/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/slow_drain/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/slow_drain/attachment/api.py create mode 100644 lib/aci/policy/interface/slow_drain/attachment/info.py create mode 100644 lib/aci/policy/interface/slow_drain/attachment/main.py create mode 100644 lib/aci/policy/interface/slow_drain/context.py create mode 100644 lib/aci/policy/interface/slow_drain/info.py create mode 100644 lib/aci/policy/interface/slow_drain/main.py create mode 100644 lib/aci/policy/interface/slow_drain/output.py create mode 100644 lib/aci/policy/interface/storm_control/__init__.py create mode 100644 lib/aci/policy/interface/storm_control/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/storm_control/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/storm_control/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/storm_control/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/storm_control/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/storm_control/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/storm_control/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/storm_control/api.py create mode 100644 lib/aci/policy/interface/storm_control/attachment/__init__.py create mode 100644 lib/aci/policy/interface/storm_control/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/storm_control/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/storm_control/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/storm_control/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/storm_control/attachment/api.py create mode 100644 lib/aci/policy/interface/storm_control/attachment/info.py create mode 100644 lib/aci/policy/interface/storm_control/attachment/main.py create mode 100644 lib/aci/policy/interface/storm_control/context.py create mode 100644 lib/aci/policy/interface/storm_control/info.py create mode 100644 lib/aci/policy/interface/storm_control/main.py create mode 100644 lib/aci/policy/interface/storm_control/output.py create mode 100644 lib/aci/policy/interface/stp/__init__.py create mode 100644 lib/aci/policy/interface/stp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/stp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/stp/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/stp/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/stp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/stp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/stp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/stp/api.py create mode 100644 lib/aci/policy/interface/stp/attachment/__init__.py create mode 100644 lib/aci/policy/interface/stp/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/stp/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/stp/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/stp/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/stp/attachment/api.py create mode 100644 lib/aci/policy/interface/stp/attachment/info.py create mode 100644 lib/aci/policy/interface/stp/attachment/main.py create mode 100644 lib/aci/policy/interface/stp/context.py create mode 100644 lib/aci/policy/interface/stp/info.py create mode 100644 lib/aci/policy/interface/stp/main.py create mode 100644 lib/aci/policy/interface/stp/output.py create mode 100644 lib/aci/policy/interface/synce/__init__.py create mode 100644 lib/aci/policy/interface/synce/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/synce/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/synce/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/synce/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/synce/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/synce/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/synce/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/synce/api.py create mode 100644 lib/aci/policy/interface/synce/attachment/__init__.py create mode 100644 lib/aci/policy/interface/synce/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/synce/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/synce/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/synce/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/synce/attachment/api.py create mode 100644 lib/aci/policy/interface/synce/attachment/info.py create mode 100644 lib/aci/policy/interface/synce/attachment/main.py create mode 100644 lib/aci/policy/interface/synce/context.py create mode 100644 lib/aci/policy/interface/synce/info.py create mode 100644 lib/aci/policy/interface/synce/main.py create mode 100644 lib/aci/policy/interface/synce/output.py create mode 100644 lib/aci/policy/interface/transceiver/__init__.py create mode 100644 lib/aci/policy/interface/transceiver/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/transceiver/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/transceiver/__pycache__/attachment.cpython-310.pyc create mode 100644 lib/aci/policy/interface/transceiver/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/policy/interface/transceiver/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/transceiver/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/transceiver/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/interface/transceiver/api.py create mode 100644 lib/aci/policy/interface/transceiver/attachment/__init__.py create mode 100644 lib/aci/policy/interface/transceiver/attachment/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/interface/transceiver/attachment/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/policy/interface/transceiver/attachment/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/policy/interface/transceiver/attachment/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/interface/transceiver/attachment/api.py create mode 100644 lib/aci/policy/interface/transceiver/attachment/info.py create mode 100644 lib/aci/policy/interface/transceiver/attachment/main.py create mode 100644 lib/aci/policy/interface/transceiver/context.py create mode 100644 lib/aci/policy/interface/transceiver/info.py create mode 100644 lib/aci/policy/interface/transceiver/main.py create mode 100644 lib/aci/policy/interface/transceiver/output.py create mode 100644 lib/aci/policy/main.py create mode 100644 lib/aci/policy/monitoring/__init__.py create mode 100644 lib/aci/policy/monitoring/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/monitoring/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/monitoring/main.py create mode 100644 lib/aci/policy/output.py create mode 100644 lib/aci/policy/snoop/__init__.py create mode 100644 lib/aci/policy/snoop/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/snoop/__pycache__/igmp.cpython-310.pyc create mode 100644 lib/aci/policy/snoop/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/snoop/__pycache__/mld.cpython-310.pyc create mode 100644 lib/aci/policy/snoop/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/policy/snoop/igmp.py create mode 100644 lib/aci/policy/snoop/main.py create mode 100644 lib/aci/policy/snoop/mld.py create mode 100644 lib/aci/policy/snoop/output.py create mode 100644 lib/aci/policy/switch/__init__.py create mode 100644 lib/aci/policy/switch/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/switch/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/switch/main.py create mode 100644 lib/aci/policy/troubleshooting/__init__.py create mode 100644 lib/aci/policy/troubleshooting/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/troubleshooting/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/troubleshooting/main.py create mode 100644 lib/aci/policy/troubleshooting/span/__init__.py create mode 100644 lib/aci/policy/troubleshooting/span/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/policy/troubleshooting/span/__pycache__/destination.cpython-310.pyc create mode 100644 lib/aci/policy/troubleshooting/span/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/policy/troubleshooting/span/__pycache__/source.cpython-310.pyc create mode 100644 lib/aci/policy/troubleshooting/span/destination.py create mode 100644 lib/aci/policy/troubleshooting/span/main.py create mode 100644 lib/aci/policy/troubleshooting/span/source.py create mode 100644 lib/aci/pool/__init__.py create mode 100644 lib/aci/pool/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pool/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pool/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/pool/main.py create mode 100644 lib/aci/pool/output.py create mode 100644 lib/aci/pool/vlan/__init__.py create mode 100644 lib/aci/pool/vlan/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/pool/vlan/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/pool/vlan/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/pool/vlan/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/pool/vlan/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/pool/vlan/api.py create mode 100644 lib/aci/pool/vlan/audit/__init__.py create mode 100644 lib/aci/pool/vlan/audit/api.py create mode 100644 lib/aci/pool/vlan/audit/info.py create mode 100644 lib/aci/pool/vlan/audit/main.py create mode 100644 lib/aci/pool/vlan/event/__init__.py create mode 100644 lib/aci/pool/vlan/event/api.py create mode 100644 lib/aci/pool/vlan/event/info.py create mode 100644 lib/aci/pool/vlan/event/main.py create mode 100644 lib/aci/pool/vlan/fault/__init__.py create mode 100644 lib/aci/pool/vlan/fault/api.py create mode 100644 lib/aci/pool/vlan/fault/info.py create mode 100644 lib/aci/pool/vlan/fault/main.py create mode 100644 lib/aci/pool/vlan/info.py create mode 100644 lib/aci/pool/vlan/main.py create mode 100644 lib/aci/pool/vlan/output.py create mode 100644 lib/aci/proto/__init__.py create mode 100644 lib/aci/proto/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/arp/__init__.py create mode 100644 lib/aci/proto/arp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/arp/__pycache__/adjacency.cpython-310.pyc create mode 100644 lib/aci/proto/arp/__pycache__/domain.cpython-310.pyc create mode 100644 lib/aci/proto/arp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/arp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/arp/__pycache__/route.cpython-310.pyc create mode 100644 lib/aci/proto/arp/adjacency/__init__.py create mode 100644 lib/aci/proto/arp/adjacency/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/arp/adjacency/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/arp/adjacency/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/arp/adjacency/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/arp/adjacency/api.py create mode 100644 lib/aci/proto/arp/adjacency/info.py create mode 100644 lib/aci/proto/arp/adjacency/main.py create mode 100644 lib/aci/proto/arp/domain/__init__.py create mode 100644 lib/aci/proto/arp/domain/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/arp/domain/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/arp/domain/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/arp/domain/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/arp/domain/api.py create mode 100644 lib/aci/proto/arp/domain/info.py create mode 100644 lib/aci/proto/arp/domain/main.py create mode 100644 lib/aci/proto/arp/event/__init__.py create mode 100644 lib/aci/proto/arp/event/api.py create mode 100644 lib/aci/proto/arp/event/info.py create mode 100644 lib/aci/proto/arp/event/main.py create mode 100644 lib/aci/proto/arp/fault/__init__.py create mode 100644 lib/aci/proto/arp/fault/api.py create mode 100644 lib/aci/proto/arp/fault/info.py create mode 100644 lib/aci/proto/arp/fault/main.py create mode 100644 lib/aci/proto/arp/instance/__init__.py create mode 100644 lib/aci/proto/arp/instance/api.py create mode 100644 lib/aci/proto/arp/instance/info.py create mode 100644 lib/aci/proto/arp/instance/main.py create mode 100644 lib/aci/proto/arp/main.py create mode 100644 lib/aci/proto/arp/output.py create mode 100644 lib/aci/proto/bfd/TODO.md create mode 100644 lib/aci/proto/bfd/__init__.py create mode 100644 lib/aci/proto/bfd/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/__pycache__/instance.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/__pycache__/interface.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/__pycache__/session.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/__pycache__/session_peer.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/__pycache__/session_stats.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/event/__init__.py create mode 100644 lib/aci/proto/bfd/event/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/event/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/event/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/event/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/event/api.py create mode 100644 lib/aci/proto/bfd/event/info.py create mode 100644 lib/aci/proto/bfd/event/main.py create mode 100644 lib/aci/proto/bfd/fault/__init__.py create mode 100644 lib/aci/proto/bfd/fault/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/fault/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/fault/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/fault/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/fault/api.py create mode 100644 lib/aci/proto/bfd/fault/info.py create mode 100644 lib/aci/proto/bfd/fault/main.py create mode 100644 lib/aci/proto/bfd/instance/__init__.py create mode 100644 lib/aci/proto/bfd/instance/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/instance/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/instance/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/instance/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/instance/api.py create mode 100644 lib/aci/proto/bfd/instance/info.py create mode 100644 lib/aci/proto/bfd/instance/main.py create mode 100644 lib/aci/proto/bfd/interface/__init__.py create mode 100644 lib/aci/proto/bfd/interface/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/interface/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/interface/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/interface/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/interface/api.py create mode 100644 lib/aci/proto/bfd/interface/info.py create mode 100644 lib/aci/proto/bfd/interface/main.py create mode 100644 lib/aci/proto/bfd/main.py create mode 100644 lib/aci/proto/bfd/output.py create mode 100644 lib/aci/proto/bfd/session/__init__.py create mode 100644 lib/aci/proto/bfd/session/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/api.py create mode 100644 lib/aci/proto/bfd/session/info.py create mode 100644 lib/aci/proto/bfd/session/main.py create mode 100644 lib/aci/proto/bfd/session/peer/__init__.py create mode 100644 lib/aci/proto/bfd/session/peer/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/peer/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/peer/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/peer/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/peer/api.py create mode 100644 lib/aci/proto/bfd/session/peer/info.py create mode 100644 lib/aci/proto/bfd/session/peer/main.py create mode 100644 lib/aci/proto/bfd/session/stats/__init__.py create mode 100644 lib/aci/proto/bfd/session/stats/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/stats/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/stats/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/stats/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bfd/session/stats/api.py create mode 100644 lib/aci/proto/bfd/session/stats/info.py create mode 100644 lib/aci/proto/bfd/session/stats/main.py create mode 100644 lib/aci/proto/bgp/__init__.py create mode 100644 lib/aci/proto/bgp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/__pycache__/domain.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/__pycache__/instance.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/__pycache__/neighbor.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/__pycache__/neighbor_stats.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/__pycache__/route.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/domain/__init__.py create mode 100644 lib/aci/proto/bgp/domain/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/domain/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/domain/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/domain/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/domain/api.py create mode 100644 lib/aci/proto/bgp/domain/info.py create mode 100644 lib/aci/proto/bgp/domain/main.py create mode 100644 lib/aci/proto/bgp/event/__init__.py create mode 100644 lib/aci/proto/bgp/event/api.py create mode 100644 lib/aci/proto/bgp/event/info.py create mode 100644 lib/aci/proto/bgp/event/main.py create mode 100644 lib/aci/proto/bgp/fault/__init__.py create mode 100644 lib/aci/proto/bgp/fault/api.py create mode 100644 lib/aci/proto/bgp/fault/info.py create mode 100644 lib/aci/proto/bgp/fault/main.py create mode 100644 lib/aci/proto/bgp/instance/__init__.py create mode 100644 lib/aci/proto/bgp/instance/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/instance/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/instance/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/instance/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/instance/api.py create mode 100644 lib/aci/proto/bgp/instance/info.py create mode 100644 lib/aci/proto/bgp/instance/main.py create mode 100644 lib/aci/proto/bgp/main.py create mode 100644 lib/aci/proto/bgp/neighbor/__init__.py create mode 100644 lib/aci/proto/bgp/neighbor/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/neighbor/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/neighbor/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/neighbor/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/neighbor/api.py create mode 100644 lib/aci/proto/bgp/neighbor/info.py create mode 100644 lib/aci/proto/bgp/neighbor/main.py create mode 100644 lib/aci/proto/bgp/neighbor/stats/__init__.py create mode 100644 lib/aci/proto/bgp/neighbor/stats/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/neighbor/stats/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/neighbor/stats/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/neighbor/stats/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/bgp/neighbor/stats/api.py create mode 100644 lib/aci/proto/bgp/neighbor/stats/info.py create mode 100644 lib/aci/proto/bgp/neighbor/stats/main.py create mode 100644 lib/aci/proto/bgp/output.py create mode 100644 lib/aci/proto/bot_output.py create mode 100644 lib/aci/proto/cdp/__init__.py create mode 100644 lib/aci/proto/cdp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/__pycache__/instance.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/__pycache__/interface.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/__pycache__/interface_stats.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/__pycache__/neighbor.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/event/__init__.py create mode 100644 lib/aci/proto/cdp/event/api.py create mode 100644 lib/aci/proto/cdp/event/info.py create mode 100644 lib/aci/proto/cdp/event/main.py create mode 100644 lib/aci/proto/cdp/instance/__init__.py create mode 100644 lib/aci/proto/cdp/instance/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/instance/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/instance/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/instance/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/instance/api.py create mode 100644 lib/aci/proto/cdp/instance/info.py create mode 100644 lib/aci/proto/cdp/instance/main.py create mode 100644 lib/aci/proto/cdp/interface/__init__.py create mode 100644 lib/aci/proto/cdp/interface/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/interface/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/interface/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/interface/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/interface/api.py create mode 100644 lib/aci/proto/cdp/interface/info.py create mode 100644 lib/aci/proto/cdp/interface/main.py create mode 100644 lib/aci/proto/cdp/interface/stats/__init__.py create mode 100644 lib/aci/proto/cdp/interface/stats/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/interface/stats/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/interface/stats/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/interface/stats/info.py create mode 100644 lib/aci/proto/cdp/interface/stats/main.py create mode 100644 lib/aci/proto/cdp/main.py create mode 100644 lib/aci/proto/cdp/neighbor/__init__.py create mode 100644 lib/aci/proto/cdp/neighbor/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/neighbor/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/neighbor/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/neighbor/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/cdp/neighbor/api.py create mode 100644 lib/aci/proto/cdp/neighbor/info.py create mode 100644 lib/aci/proto/cdp/neighbor/main.py create mode 100644 lib/aci/proto/cdp/output.py create mode 100644 lib/aci/proto/hsrp/__init__.py create mode 100644 lib/aci/proto/hsrp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/__pycache__/domain.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/__pycache__/instance.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/__pycache__/interface.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/domain/__init__.py create mode 100644 lib/aci/proto/hsrp/domain/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/domain/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/domain/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/domain/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/domain/api.py create mode 100644 lib/aci/proto/hsrp/domain/info.py create mode 100644 lib/aci/proto/hsrp/domain/main.py create mode 100644 lib/aci/proto/hsrp/event/__init__.py create mode 100644 lib/aci/proto/hsrp/event/api.py create mode 100644 lib/aci/proto/hsrp/event/info.py create mode 100644 lib/aci/proto/hsrp/event/main.py create mode 100644 lib/aci/proto/hsrp/fault/__init__.py create mode 100644 lib/aci/proto/hsrp/fault/api.py create mode 100644 lib/aci/proto/hsrp/fault/info.py create mode 100644 lib/aci/proto/hsrp/fault/main.py create mode 100644 lib/aci/proto/hsrp/instance/__init__.py create mode 100644 lib/aci/proto/hsrp/instance/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/instance/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/instance/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/instance/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/instance/api.py create mode 100644 lib/aci/proto/hsrp/instance/info.py create mode 100644 lib/aci/proto/hsrp/instance/main.py create mode 100644 lib/aci/proto/hsrp/interface/__init__.py create mode 100644 lib/aci/proto/hsrp/interface/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/interface/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/interface/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/interface/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/interface/api.py create mode 100644 lib/aci/proto/hsrp/interface/info.py create mode 100644 lib/aci/proto/hsrp/interface/main.py create mode 100644 lib/aci/proto/hsrp/interface/stats/__init__.py create mode 100644 lib/aci/proto/hsrp/interface/stats/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/interface/stats/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/interface/stats/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/hsrp/interface/stats/info.py create mode 100644 lib/aci/proto/hsrp/interface/stats/main.py create mode 100644 lib/aci/proto/hsrp/main.py create mode 100644 lib/aci/proto/hsrp/output.py create mode 100644 lib/aci/proto/ipv4/__init__.py create mode 100644 lib/aci/proto/ipv4/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/__pycache__/domain.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/__pycache__/route.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/domain/__init__.py create mode 100644 lib/aci/proto/ipv4/domain/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/domain/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/domain/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/domain/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/domain/api.py create mode 100644 lib/aci/proto/ipv4/domain/info.py create mode 100644 lib/aci/proto/ipv4/domain/main.py create mode 100644 lib/aci/proto/ipv4/event/__init__.py create mode 100644 lib/aci/proto/ipv4/event/api.py create mode 100644 lib/aci/proto/ipv4/event/info.py create mode 100644 lib/aci/proto/ipv4/event/main.py create mode 100644 lib/aci/proto/ipv4/fault/__init__.py create mode 100644 lib/aci/proto/ipv4/fault/api.py create mode 100644 lib/aci/proto/ipv4/fault/info.py create mode 100644 lib/aci/proto/ipv4/fault/main.py create mode 100644 lib/aci/proto/ipv4/instance/__init__.py create mode 100644 lib/aci/proto/ipv4/instance/api.py create mode 100644 lib/aci/proto/ipv4/instance/info.py create mode 100644 lib/aci/proto/ipv4/instance/main.py create mode 100644 lib/aci/proto/ipv4/main.py create mode 100644 lib/aci/proto/ipv4/output.py create mode 100644 lib/aci/proto/ipv4/route/__init__.py create mode 100644 lib/aci/proto/ipv4/route/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/route/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/route/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/route/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/ipv4/route/api.py create mode 100644 lib/aci/proto/ipv4/route/info.py create mode 100644 lib/aci/proto/ipv4/route/main.py create mode 100644 lib/aci/proto/ipv6/__init__.py create mode 100644 lib/aci/proto/ipv6/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/__pycache__/domain.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/__pycache__/route.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/domain/__init__.py create mode 100644 lib/aci/proto/ipv6/domain/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/domain/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/domain/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/domain/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/domain/api.py create mode 100644 lib/aci/proto/ipv6/domain/info.py create mode 100644 lib/aci/proto/ipv6/domain/main.py create mode 100644 lib/aci/proto/ipv6/event/__init__.py create mode 100644 lib/aci/proto/ipv6/event/api.py create mode 100644 lib/aci/proto/ipv6/event/info.py create mode 100644 lib/aci/proto/ipv6/event/main.py create mode 100644 lib/aci/proto/ipv6/fault/__init__.py create mode 100644 lib/aci/proto/ipv6/fault/api.py create mode 100644 lib/aci/proto/ipv6/fault/info.py create mode 100644 lib/aci/proto/ipv6/fault/main.py create mode 100644 lib/aci/proto/ipv6/instance/__init__.py create mode 100644 lib/aci/proto/ipv6/instance/api.py create mode 100644 lib/aci/proto/ipv6/instance/info.py create mode 100644 lib/aci/proto/ipv6/instance/main.py create mode 100644 lib/aci/proto/ipv6/main.py create mode 100644 lib/aci/proto/ipv6/output.py create mode 100644 lib/aci/proto/ipv6/route/__init__.py create mode 100644 lib/aci/proto/ipv6/route/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/route/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/route/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/route/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/ipv6/route/api.py create mode 100644 lib/aci/proto/ipv6/route/info.py create mode 100644 lib/aci/proto/ipv6/route/main.py create mode 100644 lib/aci/proto/isis/__init__.py create mode 100644 lib/aci/proto/isis/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/isis/__pycache__/domain.cpython-310.pyc create mode 100644 lib/aci/proto/isis/__pycache__/instance.cpython-310.pyc create mode 100644 lib/aci/proto/isis/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/isis/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/isis/domain/__init__.py create mode 100644 lib/aci/proto/isis/domain/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/isis/domain/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/isis/domain/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/isis/domain/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/isis/domain/api.py create mode 100644 lib/aci/proto/isis/domain/info.py create mode 100644 lib/aci/proto/isis/domain/main.py create mode 100644 lib/aci/proto/isis/event/__init__.py create mode 100644 lib/aci/proto/isis/event/api.py create mode 100644 lib/aci/proto/isis/event/info.py create mode 100644 lib/aci/proto/isis/event/main.py create mode 100644 lib/aci/proto/isis/fault/__init__.py create mode 100644 lib/aci/proto/isis/fault/api.py create mode 100644 lib/aci/proto/isis/fault/info.py create mode 100644 lib/aci/proto/isis/fault/main.py create mode 100644 lib/aci/proto/isis/instance/__init__.py create mode 100644 lib/aci/proto/isis/instance/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/isis/instance/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/isis/instance/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/isis/instance/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/isis/instance/api.py create mode 100644 lib/aci/proto/isis/instance/info.py create mode 100644 lib/aci/proto/isis/instance/main.py create mode 100644 lib/aci/proto/isis/interface/__init__.py create mode 100644 lib/aci/proto/isis/interface/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/isis/interface/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/isis/interface/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/isis/interface/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/isis/interface/api.py create mode 100644 lib/aci/proto/isis/interface/info.py create mode 100644 lib/aci/proto/isis/interface/main.py create mode 100644 lib/aci/proto/isis/interface/stats/__init__.py create mode 100644 lib/aci/proto/isis/lsp/__init__.py create mode 100644 lib/aci/proto/isis/lsp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/isis/lsp/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/isis/lsp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/isis/lsp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/isis/lsp/api.py create mode 100644 lib/aci/proto/isis/lsp/info.py create mode 100644 lib/aci/proto/isis/lsp/main.py create mode 100644 lib/aci/proto/isis/main.py create mode 100644 lib/aci/proto/isis/neighbor/__init__.py create mode 100644 lib/aci/proto/isis/neighbor/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/isis/neighbor/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/isis/neighbor/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/isis/neighbor/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/isis/neighbor/api.py create mode 100644 lib/aci/proto/isis/neighbor/info.py create mode 100644 lib/aci/proto/isis/neighbor/main.py create mode 100644 lib/aci/proto/isis/output.py create mode 100644 lib/aci/proto/isis/route/__init__.py create mode 100644 lib/aci/proto/isis/route/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/isis/route/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/isis/route/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/isis/route/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/isis/route/api.py create mode 100644 lib/aci/proto/isis/route/info.py create mode 100644 lib/aci/proto/isis/route/main.py create mode 100644 lib/aci/proto/isis/tree/__init__.py create mode 100644 lib/aci/proto/isis/tree/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/isis/tree/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/isis/tree/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/isis/tree/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/isis/tree/api.py create mode 100644 lib/aci/proto/isis/tree/info.py create mode 100644 lib/aci/proto/isis/tree/main.py create mode 100644 lib/aci/proto/isis/tunnel/__init__.py create mode 100644 lib/aci/proto/isis/tunnel/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/isis/tunnel/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/isis/tunnel/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/isis/tunnel/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/isis/tunnel/api.py create mode 100644 lib/aci/proto/isis/tunnel/info.py create mode 100644 lib/aci/proto/isis/tunnel/main.py create mode 100644 lib/aci/proto/lacp/__init__.py create mode 100644 lib/aci/proto/lacp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/lacp/__pycache__/instance.cpython-310.pyc create mode 100644 lib/aci/proto/lacp/__pycache__/interface.cpython-310.pyc create mode 100644 lib/aci/proto/lacp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/lacp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/lacp/bot_output.py create mode 100644 lib/aci/proto/lacp/event/__init__.py create mode 100644 lib/aci/proto/lacp/event/api.py create mode 100644 lib/aci/proto/lacp/event/info.py create mode 100644 lib/aci/proto/lacp/event/main.py create mode 100644 lib/aci/proto/lacp/instance/__init__.py create mode 100644 lib/aci/proto/lacp/instance/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/lacp/instance/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/lacp/instance/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/lacp/instance/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/lacp/instance/api.py create mode 100644 lib/aci/proto/lacp/instance/info.py create mode 100644 lib/aci/proto/lacp/instance/main.py create mode 100644 lib/aci/proto/lacp/interface/__init__.py create mode 100644 lib/aci/proto/lacp/interface/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/lacp/interface/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/lacp/interface/main.py create mode 100644 lib/aci/proto/lacp/main.py create mode 100644 lib/aci/proto/lacp/output.py create mode 100644 lib/aci/proto/lldp/__init__.py create mode 100644 lib/aci/proto/lldp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/__pycache__/context.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/__pycache__/instance.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/__pycache__/instance_stats.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/bot_output.py create mode 100644 lib/aci/proto/lldp/context.py create mode 100644 lib/aci/proto/lldp/event/__init__.py create mode 100644 lib/aci/proto/lldp/event/api.py create mode 100644 lib/aci/proto/lldp/event/info.py create mode 100644 lib/aci/proto/lldp/event/main.py create mode 100644 lib/aci/proto/lldp/fault/__init__.py create mode 100644 lib/aci/proto/lldp/fault/api.py create mode 100644 lib/aci/proto/lldp/fault/info.py create mode 100644 lib/aci/proto/lldp/fault/main.py create mode 100644 lib/aci/proto/lldp/info.py create mode 100644 lib/aci/proto/lldp/instance/__init__.py create mode 100644 lib/aci/proto/lldp/instance/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/instance/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/instance/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/instance/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/instance/api.py create mode 100644 lib/aci/proto/lldp/instance/info.py create mode 100644 lib/aci/proto/lldp/instance/main.py create mode 100644 lib/aci/proto/lldp/main.py create mode 100644 lib/aci/proto/lldp/output.py create mode 100644 lib/aci/proto/lldp/stats/__init__.py create mode 100644 lib/aci/proto/lldp/stats/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/stats/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/stats/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/stats/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/lldp/stats/api.py create mode 100644 lib/aci/proto/lldp/stats/info.py create mode 100644 lib/aci/proto/lldp/stats/main.py create mode 100644 lib/aci/proto/main.py create mode 100644 lib/aci/proto/nd/__init__.py create mode 100644 lib/aci/proto/nd/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/nd/__pycache__/domain.cpython-310.pyc create mode 100644 lib/aci/proto/nd/__pycache__/instance.cpython-310.pyc create mode 100644 lib/aci/proto/nd/__pycache__/interface.cpython-310.pyc create mode 100644 lib/aci/proto/nd/__pycache__/interface_stats.cpython-310.pyc create mode 100644 lib/aci/proto/nd/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/nd/__pycache__/neighbor.cpython-310.pyc create mode 100644 lib/aci/proto/nd/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/proto/nd/domain/__init__.py create mode 100644 lib/aci/proto/nd/domain/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/nd/domain/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/nd/domain/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/nd/domain/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/nd/domain/api.py create mode 100644 lib/aci/proto/nd/domain/info.py create mode 100644 lib/aci/proto/nd/domain/main.py create mode 100644 lib/aci/proto/nd/event/__init__.py create mode 100644 lib/aci/proto/nd/event/api.py create mode 100644 lib/aci/proto/nd/event/info.py create mode 100644 lib/aci/proto/nd/event/main.py create mode 100644 lib/aci/proto/nd/fault/__init__.py create mode 100644 lib/aci/proto/nd/fault/api.py create mode 100644 lib/aci/proto/nd/fault/info.py create mode 100644 lib/aci/proto/nd/fault/main.py create mode 100644 lib/aci/proto/nd/instance/__init__.py create mode 100644 lib/aci/proto/nd/instance/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/nd/instance/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/nd/instance/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/nd/instance/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/nd/instance/api.py create mode 100644 lib/aci/proto/nd/instance/info.py create mode 100644 lib/aci/proto/nd/instance/main.py create mode 100644 lib/aci/proto/nd/interface/__init__.py create mode 100644 lib/aci/proto/nd/interface/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/nd/interface/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/nd/interface/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/nd/interface/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/nd/interface/api.py create mode 100644 lib/aci/proto/nd/interface/info.py create mode 100644 lib/aci/proto/nd/interface/main.py create mode 100644 lib/aci/proto/nd/interface/stats/__init__.py create mode 100644 lib/aci/proto/nd/interface/stats/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/nd/interface/stats/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/nd/interface/stats/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/nd/interface/stats/info.py create mode 100644 lib/aci/proto/nd/interface/stats/main.py create mode 100644 lib/aci/proto/nd/main.py create mode 100644 lib/aci/proto/nd/neighbor/__init__.py create mode 100644 lib/aci/proto/nd/neighbor/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/proto/nd/neighbor/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/proto/nd/neighbor/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/proto/nd/neighbor/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/proto/nd/neighbor/api.py create mode 100644 lib/aci/proto/nd/neighbor/info.py create mode 100644 lib/aci/proto/nd/neighbor/main.py create mode 100644 lib/aci/proto/nd/output.py create mode 100644 lib/aci/proto/output.py create mode 100644 lib/aci/server/__init__.py create mode 100644 lib/aci/server/main.py create mode 100644 lib/aci/settings.py create mode 100644 lib/aci/system/__init__.py create mode 100644 lib/aci/system/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/system/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/system/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/system/fault/__init__.py create mode 100644 lib/aci/system/fault/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/system/fault/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/system/fault/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/system/fault/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/system/fault/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/system/fault/api.py create mode 100644 lib/aci/system/fault/code/.gitignore create mode 100644 lib/aci/system/fault/code/__init__.py create mode 100644 lib/aci/system/fault/code/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/system/fault/code/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/system/fault/code/generate.py create mode 100644 lib/aci/system/fault/code/main.py create mode 100644 lib/aci/system/fault/info.py create mode 100644 lib/aci/system/fault/main.py create mode 100644 lib/aci/system/fault/output.py create mode 100644 lib/aci/system/main.py create mode 100644 lib/aci/system/output.py create mode 100644 lib/aci/tenant/__init__.py create mode 100644 lib/aci/tenant/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/tenant/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/tenant/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/tenant/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/tenant/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/tenant/api.py create mode 100644 lib/aci/tenant/audit/__init__.py create mode 100644 lib/aci/tenant/audit/api.py create mode 100644 lib/aci/tenant/audit/info.py create mode 100644 lib/aci/tenant/audit/main.py create mode 100644 lib/aci/tenant/event/__init__.py create mode 100644 lib/aci/tenant/event/api.py create mode 100644 lib/aci/tenant/event/info.py create mode 100644 lib/aci/tenant/event/main.py create mode 100644 lib/aci/tenant/fault/__init__.py create mode 100644 lib/aci/tenant/fault/api.py create mode 100644 lib/aci/tenant/fault/info.py create mode 100644 lib/aci/tenant/fault/main.py create mode 100644 lib/aci/tenant/info.py create mode 100644 lib/aci/tenant/main.py create mode 100644 lib/aci/tenant/output.py create mode 100644 lib/aci/vrf/TODO.md create mode 100644 lib/aci/vrf/__init__.py create mode 100644 lib/aci/vrf/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/aci/vrf/__pycache__/api.cpython-310.pyc create mode 100644 lib/aci/vrf/__pycache__/info.cpython-310.pyc create mode 100644 lib/aci/vrf/__pycache__/main.cpython-310.pyc create mode 100644 lib/aci/vrf/__pycache__/output.cpython-310.pyc create mode 100644 lib/aci/vrf/api.py create mode 100644 lib/aci/vrf/audit/__init__.py create mode 100644 lib/aci/vrf/audit/api.py create mode 100644 lib/aci/vrf/audit/info.py create mode 100644 lib/aci/vrf/audit/main.py create mode 100644 lib/aci/vrf/event/__init__.py create mode 100644 lib/aci/vrf/event/api.py create mode 100644 lib/aci/vrf/event/info.py create mode 100644 lib/aci/vrf/event/main.py create mode 100644 lib/aci/vrf/fault/__init__.py create mode 100644 lib/aci/vrf/fault/api.py create mode 100644 lib/aci/vrf/fault/info.py create mode 100644 lib/aci/vrf/fault/main.py create mode 100644 lib/aci/vrf/info.py create mode 100644 lib/aci/vrf/main.py create mode 100644 lib/aci/vrf/node/__init__.py create mode 100644 lib/aci/vrf/node/api.py create mode 100644 lib/aci/vrf/node/info.py create mode 100644 lib/aci/vrf/node/main.py create mode 100644 lib/aci/vrf/output.py create mode 100644 lib/aci/ws.py create mode 100644 lib/context.py create mode 100644 lib/cvim/__init__.py create mode 100644 lib/cvim/main.py create mode 100644 lib/cvim/output.py create mode 100644 lib/cvim/settings.py create mode 100644 lib/endpoint_helper.py create mode 100644 lib/file_helper.py create mode 100644 lib/filter_helper.py create mode 100644 lib/helm/__init__.py create mode 100644 lib/helm/chart/__init__.py create mode 100644 lib/helm/chart/main.py create mode 100644 lib/helm/chart/output.py create mode 100644 lib/helm/main.py create mode 100644 lib/helm/output.py create mode 100644 lib/helm/release/__init__.py create mode 100644 lib/helm/release/main.py create mode 100644 lib/helm/release/output.py create mode 100644 lib/iaccount_helper.py create mode 100644 lib/imc/__init__.py create mode 100644 lib/imc/cli/__init__.py create mode 100644 lib/imc/cli/adapter/__init__.py create mode 100644 lib/imc/cli/adapter/main.py create mode 100644 lib/imc/cli/adapter/output.py create mode 100644 lib/imc/cli/admin/__init__.py create mode 100644 lib/imc/cli/admin/main.py create mode 100644 lib/imc/cli/admin/output.py create mode 100644 lib/imc/cli/bbu/__init__.py create mode 100644 lib/imc/cli/bbu/main.py create mode 100644 lib/imc/cli/bbu/output.py create mode 100644 lib/imc/cli/bios/__init__.py create mode 100644 lib/imc/cli/bios/main.py create mode 100644 lib/imc/cli/bios/output.py create mode 100644 lib/imc/cli/boot/__init__.py create mode 100644 lib/imc/cli/boot/main.py create mode 100644 lib/imc/cli/boot/output.py create mode 100644 lib/imc/cli/cache.py create mode 100644 lib/imc/cli/chassis/__init__.py create mode 100644 lib/imc/cli/chassis/main.py create mode 100644 lib/imc/cli/chassis/output.py create mode 100644 lib/imc/cli/command.py create mode 100644 lib/imc/cli/cpu/__init__.py create mode 100644 lib/imc/cli/cpu/main.py create mode 100644 lib/imc/cli/cpu/output.py create mode 100644 lib/imc/cli/dimm/__init__.py create mode 100644 lib/imc/cli/dimm/main.py create mode 100644 lib/imc/cli/dimm/output.py create mode 100644 lib/imc/cli/endpoint.py create mode 100644 lib/imc/cli/fault/__init__.py create mode 100644 lib/imc/cli/fault/main.py create mode 100644 lib/imc/cli/fault/output.py create mode 100644 lib/imc/cli/flex/__init__.py create mode 100644 lib/imc/cli/flex/main.py create mode 100644 lib/imc/cli/flex/output.py create mode 100644 lib/imc/cli/fw/__init__.py create mode 100644 lib/imc/cli/fw/main.py create mode 100644 lib/imc/cli/fw/output.py create mode 100644 lib/imc/cli/hardware/__init__.py create mode 100644 lib/imc/cli/hardware/main.py create mode 100644 lib/imc/cli/hardware/output.py create mode 100644 lib/imc/cli/hdd/__init__.py create mode 100644 lib/imc/cli/hdd/main.py create mode 100644 lib/imc/cli/hdd/output.py create mode 100644 lib/imc/cli/http/__init__.py create mode 100644 lib/imc/cli/http/main.py create mode 100644 lib/imc/cli/http/output.py create mode 100644 lib/imc/cli/ip/__init__.py create mode 100644 lib/imc/cli/ip/main.py create mode 100644 lib/imc/cli/ip/output.py create mode 100644 lib/imc/cli/ipmi/__init__.py create mode 100644 lib/imc/cli/ipmi/main.py create mode 100644 lib/imc/cli/ipmi/output.py create mode 100644 lib/imc/cli/kvm/__init__.py create mode 100644 lib/imc/cli/kvm/main.py create mode 100644 lib/imc/cli/kvm/output.py create mode 100644 lib/imc/cli/led/__init__.py create mode 100644 lib/imc/cli/led/main.py create mode 100644 lib/imc/cli/led/output.py create mode 100644 lib/imc/cli/memory/__init__.py create mode 100644 lib/imc/cli/memory/main.py create mode 100644 lib/imc/cli/memory/output.py create mode 100644 lib/imc/cli/net/__init__.py create mode 100644 lib/imc/cli/net/main.py create mode 100644 lib/imc/cli/net/output.py create mode 100644 lib/imc/cli/ntp/__init__.py create mode 100644 lib/imc/cli/ntp/main.py create mode 100644 lib/imc/cli/ntp/output.py create mode 100644 lib/imc/cli/output.py create mode 100644 lib/imc/cli/pci/__init__.py create mode 100644 lib/imc/cli/pci/main.py create mode 100644 lib/imc/cli/pci/output.py create mode 100644 lib/imc/cli/psu/__init__.py create mode 100644 lib/imc/cli/psu/main.py create mode 100644 lib/imc/cli/psu/output.py create mode 100644 lib/imc/cli/redfish/__init__.py create mode 100644 lib/imc/cli/redfish/main.py create mode 100644 lib/imc/cli/redfish/output.py create mode 100644 lib/imc/cli/sel/__init__.py create mode 100644 lib/imc/cli/sel/main.py create mode 100644 lib/imc/cli/sel/output.py create mode 100644 lib/imc/cli/sensor/__init__.py create mode 100644 lib/imc/cli/sensor/main.py create mode 100644 lib/imc/cli/sensor/output.py create mode 100644 lib/imc/cli/smtp/__init__.py create mode 100644 lib/imc/cli/smtp/main.py create mode 100644 lib/imc/cli/smtp/output.py create mode 100644 lib/imc/cli/snmp/__init__.py create mode 100644 lib/imc/cli/snmp/main.py create mode 100644 lib/imc/cli/snmp/output.py create mode 100644 lib/imc/cli/sol/__init__.py create mode 100644 lib/imc/cli/sol/main.py create mode 100644 lib/imc/cli/sol/output.py create mode 100644 lib/imc/cli/ssh/__init__.py create mode 100644 lib/imc/cli/ssh/main.py create mode 100644 lib/imc/cli/ssh/output.py create mode 100644 lib/imc/cli/storageadapter/__init__.py create mode 100644 lib/imc/cli/storageadapter/main.py create mode 100644 lib/imc/cli/storageadapter/output.py create mode 100644 lib/imc/cli/syslog/__init__.py create mode 100644 lib/imc/cli/syslog/main.py create mode 100644 lib/imc/cli/syslog/output.py create mode 100644 lib/imc/cli/tpm/__init__.py create mode 100644 lib/imc/cli/tpm/main.py create mode 100644 lib/imc/cli/tpm/output.py create mode 100644 lib/imc/cli/user.py create mode 100644 lib/imc/cli/utilization/__init__.py create mode 100644 lib/imc/cli/utilization/main.py create mode 100644 lib/imc/cli/utilization/output.py create mode 100644 lib/imc/cli/version/__init__.py create mode 100644 lib/imc/cli/version/main.py create mode 100644 lib/imc/cli/version/output.py create mode 100644 lib/imc/cli/vmedia/__init__.py create mode 100644 lib/imc/cli/vmedia/main.py create mode 100644 lib/imc/cli/vmedia/output.py create mode 100644 lib/imc/cli/xml/__init__.py create mode 100644 lib/imc/cli/xml/main.py create mode 100644 lib/imc/cli/xml/output.py create mode 100644 lib/imc/settings.py create mode 100644 lib/info_helper.py create mode 100644 lib/input_validator.py create mode 100644 lib/intersight/__init__.py create mode 100644 lib/intersight/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/adapter_ext_eth_interface.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/adapter_host_eth_interface.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/adapter_host_fc_interface.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/adapter_unit.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/asset_device_contract_information.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/asset_device_registration.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/bios_boot_mode.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_cdd_device.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_device_boot_mode.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_device_boot_security.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_hdd_device.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_iscsi_device.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_nvme_device.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_pxe_device.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_san_device.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_sd_device.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_uefi_device.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_usb_device.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/boot_vmedia_device.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/cache.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/chassis_extra_attributes.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/chassis_info.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/chassis_profile.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/chassiz_info.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/compute_blade.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/compute_board.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/compute_extra_attributes.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/compute_filter.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/compute_info.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/compute_rack.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/compute_redfish.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/compute_server_setting.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/computes_info.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/computes_summary.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/computes_worfklow.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/cond_alarm.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/cond_hclstatus.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/cond_hclstatus_detail.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/equipment_chassis.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/equipment_fan.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/equipment_fan_control.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/equipment_fan_module.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/equipment_iocard.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/equipment_led.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/equipment_psu.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/equipment_psu_control.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/equipment_tpm.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/ethernet_host_port.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/ethernet_network_port.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/ethernet_physical_port.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/hcl_operating_system.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/hcl_operating_system_vendor.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/intersight_common.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/memory_unit.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/network_element_summary.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/organization.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/os_configuration_file.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/os_image.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/os_install.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/pci_device.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/power_control_state.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/processor_unit.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/running_firmware.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/scu.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/search_item.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/server_profile.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/settings.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/software_repository_catalog.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/storage_controller.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/storage_physical_disk.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/storage_physical_disk_usage.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/storage_virtual_drive.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/tam_advisory_instance.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/tam_security_advisory.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/workflow.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/workflow_info.cpython-310.pyc create mode 100644 lib/intersight/__pycache__/workflow_task_info.cpython-310.pyc create mode 100644 lib/intersight/adapter_ext_eth_interface/__init__.py create mode 100644 lib/intersight/adapter_ext_eth_interface/class.md create mode 100644 lib/intersight/adapter_ext_eth_interface/info.py create mode 100644 lib/intersight/adapter_ext_eth_interface/main.py create mode 100644 lib/intersight/adapter_host_eth_interface/__init__.py create mode 100644 lib/intersight/adapter_host_eth_interface/class.md create mode 100644 lib/intersight/adapter_host_eth_interface/info.py create mode 100644 lib/intersight/adapter_host_eth_interface/main.py create mode 100644 lib/intersight/adapter_host_fc_interface/__init__.py create mode 100644 lib/intersight/adapter_host_fc_interface/class.md create mode 100644 lib/intersight/adapter_host_fc_interface/info.py create mode 100644 lib/intersight/adapter_host_fc_interface/main.py create mode 100644 lib/intersight/adapter_unit/__init__.py create mode 100644 lib/intersight/adapter_unit/class.md create mode 100644 lib/intersight/adapter_unit/info.py create mode 100644 lib/intersight/adapter_unit/main.py create mode 100644 lib/intersight/asset_device_contract_information/__init__.py create mode 100644 lib/intersight/asset_device_contract_information/class.md create mode 100644 lib/intersight/asset_device_contract_information/info.py create mode 100644 lib/intersight/asset_device_contract_information/main.py create mode 100644 lib/intersight/asset_device_registration/__init__.py create mode 100644 lib/intersight/asset_device_registration/class.md create mode 100644 lib/intersight/asset_device_registration/info.py create mode 100644 lib/intersight/asset_device_registration/main.py create mode 100644 lib/intersight/bios_boot_mode/__init__.py create mode 100644 lib/intersight/bios_boot_mode/class.md create mode 100644 lib/intersight/bios_boot_mode/info.py create mode 100644 lib/intersight/bios_boot_mode/main.py create mode 100644 lib/intersight/bios_unit/__init__.py create mode 100644 lib/intersight/bios_unit/bios_unit.py create mode 100644 lib/intersight/bios_unit/class.md create mode 100644 lib/intersight/boot_cdd_device/__init__.py create mode 100644 lib/intersight/boot_cdd_device/info.py create mode 100644 lib/intersight/boot_cdd_device/main.py create mode 100644 lib/intersight/boot_device_boot_mode/__init__.py create mode 100644 lib/intersight/boot_device_boot_mode/class.md create mode 100644 lib/intersight/boot_device_boot_mode/info.py create mode 100644 lib/intersight/boot_device_boot_mode/main.py create mode 100644 lib/intersight/boot_device_boot_security/__init__.py create mode 100644 lib/intersight/boot_device_boot_security/class.md create mode 100644 lib/intersight/boot_device_boot_security/info.py create mode 100644 lib/intersight/boot_device_boot_security/main.py create mode 100644 lib/intersight/boot_hdd_device/__init__.py create mode 100644 lib/intersight/boot_hdd_device/class.md create mode 100644 lib/intersight/boot_hdd_device/info.py create mode 100644 lib/intersight/boot_hdd_device/main.py create mode 100644 lib/intersight/boot_iscsi_device/__init__.py create mode 100644 lib/intersight/boot_iscsi_device/info.py create mode 100644 lib/intersight/boot_iscsi_device/main.py create mode 100644 lib/intersight/boot_nvme_device/__init__.py create mode 100644 lib/intersight/boot_nvme_device/info.py create mode 100644 lib/intersight/boot_nvme_device/main.py create mode 100644 lib/intersight/boot_pxe_device/__init__.py create mode 100644 lib/intersight/boot_pxe_device/info.py create mode 100644 lib/intersight/boot_pxe_device/main.py create mode 100644 lib/intersight/boot_san_device/__init__.py create mode 100644 lib/intersight/boot_san_device/info.py create mode 100644 lib/intersight/boot_san_device/main.py create mode 100644 lib/intersight/boot_sd_device/__init__.py create mode 100644 lib/intersight/boot_sd_device/info.py create mode 100644 lib/intersight/boot_sd_device/main.py create mode 100644 lib/intersight/boot_uefi_device/__init__.py create mode 100644 lib/intersight/boot_uefi_device/info.py create mode 100644 lib/intersight/boot_uefi_device/main.py create mode 100644 lib/intersight/boot_usb_device/__init__.py create mode 100644 lib/intersight/boot_usb_device/info.py create mode 100644 lib/intersight/boot_usb_device/main.py create mode 100644 lib/intersight/boot_vmedia_device/__init__.py create mode 100644 lib/intersight/boot_vmedia_device/info.py create mode 100644 lib/intersight/boot_vmedia_device/main.py create mode 100644 lib/intersight/bot_output.py create mode 100644 lib/intersight/cache.py create mode 100644 lib/intersight/chassis.py create mode 100644 lib/intersight/chassis_cache.py create mode 100644 lib/intersight/chassis_extra_attributes.py create mode 100644 lib/intersight/chassis_filter.py create mode 100644 lib/intersight/chassis_info.py create mode 100644 lib/intersight/chassis_mo.py create mode 100644 lib/intersight/chassis_output.py create mode 100644 lib/intersight/chassis_profile/__init__.py create mode 100644 lib/intersight/chassis_profile/class.md create mode 100644 lib/intersight/chassis_profile/info.py create mode 100644 lib/intersight/chassis_profile/main.py create mode 100644 lib/intersight/compute.py create mode 100644 lib/intersight/compute_aci_output.py create mode 100644 lib/intersight/compute_blade/__init__.py create mode 100644 lib/intersight/compute_blade/class.md create mode 100644 lib/intersight/compute_blade/info.py create mode 100644 lib/intersight/compute_blade/main.py create mode 100644 lib/intersight/compute_board/__init__.py create mode 100644 lib/intersight/compute_board/class.md create mode 100644 lib/intersight/compute_board/info.py create mode 100644 lib/intersight/compute_board/main.py create mode 100644 lib/intersight/compute_cache.py create mode 100644 lib/intersight/compute_context.py create mode 100644 lib/intersight/compute_extra_attributes.py create mode 100644 lib/intersight/compute_filter.py create mode 100644 lib/intersight/compute_info.py create mode 100644 lib/intersight/compute_mo.py create mode 100644 lib/intersight/compute_nx_output.py create mode 100644 lib/intersight/compute_output.py create mode 100644 lib/intersight/compute_rack/__init__.py create mode 100644 lib/intersight/compute_rack/class.md create mode 100644 lib/intersight/compute_rack/main.py create mode 100644 lib/intersight/compute_server_setting/__init__.py create mode 100644 lib/intersight/compute_server_setting/class.md create mode 100644 lib/intersight/compute_server_setting/info.py create mode 100644 lib/intersight/compute_server_setting/main.py create mode 100644 lib/intersight/computes_summary.py create mode 100644 lib/intersight/computes_worfklow.py create mode 100644 lib/intersight/cond_alarm/__init__.py create mode 100644 lib/intersight/cond_alarm/class.md create mode 100644 lib/intersight/cond_alarm/info.py create mode 100644 lib/intersight/cond_alarm/main.py create mode 100644 lib/intersight/cond_alarm/output.py create mode 100644 lib/intersight/cond_hclstatus/__init__.py create mode 100644 lib/intersight/cond_hclstatus/class.md create mode 100644 lib/intersight/cond_hclstatus/info.py create mode 100644 lib/intersight/cond_hclstatus/main.py create mode 100644 lib/intersight/cond_hclstatus_detail/__init__.py create mode 100644 lib/intersight/cond_hclstatus_detail/class.md create mode 100644 lib/intersight/cond_hclstatus_detail/info.py create mode 100644 lib/intersight/cond_hclstatus_detail/main.py create mode 100644 lib/intersight/equipment_chassis/__init__.py create mode 100644 lib/intersight/equipment_chassis/class.md create mode 100644 lib/intersight/equipment_chassis/main.py create mode 100644 lib/intersight/equipment_expander_module/__init__.py create mode 100644 lib/intersight/equipment_expander_module/class.md create mode 100644 lib/intersight/equipment_expander_module/info.py create mode 100644 lib/intersight/equipment_expander_module/main.py create mode 100644 lib/intersight/equipment_fan/__init__.py create mode 100644 lib/intersight/equipment_fan/class.md create mode 100644 lib/intersight/equipment_fan/info.py create mode 100644 lib/intersight/equipment_fan/main.py create mode 100644 lib/intersight/equipment_fan_control/__init__.py create mode 100644 lib/intersight/equipment_fan_control/class.md create mode 100644 lib/intersight/equipment_fan_control/info.py create mode 100644 lib/intersight/equipment_fan_control/main.py create mode 100644 lib/intersight/equipment_fan_module/__init__.py create mode 100644 lib/intersight/equipment_fan_module/class.md create mode 100644 lib/intersight/equipment_fan_module/info.py create mode 100644 lib/intersight/equipment_fan_module/main.py create mode 100644 lib/intersight/equipment_iocard/__init__.py create mode 100644 lib/intersight/equipment_iocard/class.md create mode 100644 lib/intersight/equipment_iocard/info.py create mode 100644 lib/intersight/equipment_iocard/main.py create mode 100644 lib/intersight/equipment_led/__init__.py create mode 100644 lib/intersight/equipment_led/class.md create mode 100644 lib/intersight/equipment_led/info.py create mode 100644 lib/intersight/equipment_led/main.py create mode 100644 lib/intersight/equipment_psu/__init__.py create mode 100644 lib/intersight/equipment_psu/class.md create mode 100644 lib/intersight/equipment_psu/info.py create mode 100644 lib/intersight/equipment_psu/main.py create mode 100644 lib/intersight/equipment_psu/output.py create mode 100644 lib/intersight/equipment_psu_control/__init__.py create mode 100644 lib/intersight/equipment_psu_control/class.md create mode 100644 lib/intersight/equipment_psu_control/info.py create mode 100644 lib/intersight/equipment_psu_control/main.py create mode 100644 lib/intersight/equipment_tpm/__init__.py create mode 100644 lib/intersight/equipment_tpm/class.md create mode 100644 lib/intersight/equipment_tpm/info.py create mode 100644 lib/intersight/equipment_tpm/main.py create mode 100644 lib/intersight/ethernet_host_port/__init__.py create mode 100644 lib/intersight/ethernet_host_port/class.md create mode 100644 lib/intersight/ethernet_host_port/info.py create mode 100644 lib/intersight/ethernet_host_port/main.py create mode 100644 lib/intersight/ethernet_network_port/__init__.py create mode 100644 lib/intersight/ethernet_network_port/class.md create mode 100644 lib/intersight/ethernet_network_port/info.py create mode 100644 lib/intersight/ethernet_network_port/main.py create mode 100644 lib/intersight/ethernet_physical_port/__init__.py create mode 100644 lib/intersight/ethernet_physical_port/class.md create mode 100644 lib/intersight/ethernet_physical_port/info.py create mode 100644 lib/intersight/ethernet_physical_port/main.py create mode 100644 lib/intersight/graphics_card/__init__.py create mode 100644 lib/intersight/graphics_card/class.md create mode 100644 lib/intersight/graphics_card/info.py create mode 100644 lib/intersight/graphics_card/main.py create mode 100644 lib/intersight/graphics_controller/__init__.py create mode 100644 lib/intersight/graphics_controller/class.md create mode 100644 lib/intersight/graphics_controller/info.py create mode 100644 lib/intersight/graphics_controller/main.py create mode 100644 lib/intersight/hcl_operating_system/__init__.py create mode 100644 lib/intersight/hcl_operating_system/class.md create mode 100644 lib/intersight/hcl_operating_system/main.py create mode 100644 lib/intersight/hcl_operating_system_vendor/__init__.py create mode 100644 lib/intersight/hcl_operating_system_vendor/class.md create mode 100644 lib/intersight/hcl_operating_system_vendor/main.py create mode 100644 lib/intersight/intersight_common.py create mode 100644 lib/intersight/lcm/__init__.py create mode 100644 lib/intersight/lcm/common.py create mode 100644 lib/intersight/lcm/locator.py create mode 100644 lib/intersight/lcm/power.py create mode 100644 lib/intersight/lcm/tag.py create mode 100644 lib/intersight/management_interface/__init__.py create mode 100644 lib/intersight/management_interface/class.md create mode 100644 lib/intersight/management_interface/info.py create mode 100644 lib/intersight/management_interface/main.py create mode 100644 lib/intersight/memory_unit/__init__.py create mode 100644 lib/intersight/memory_unit/class.md create mode 100644 lib/intersight/memory_unit/info.py create mode 100644 lib/intersight/memory_unit/main.py create mode 100644 lib/intersight/network_element_summary/__init__.py create mode 100644 lib/intersight/network_element_summary/class.md create mode 100644 lib/intersight/network_element_summary/info.py create mode 100644 lib/intersight/network_element_summary/main.py create mode 100644 lib/intersight/organization/__init__.py create mode 100644 lib/intersight/organization/class.md create mode 100644 lib/intersight/organization/main.py create mode 100644 lib/intersight/os_configuration_file/__init__.py create mode 100644 lib/intersight/os_configuration_file/main.py create mode 100644 lib/intersight/os_image/__init__.py create mode 100644 lib/intersight/os_image/os_image.py create mode 100644 lib/intersight/os_install/__init__.py create mode 100644 lib/intersight/os_install/main.py create mode 100644 lib/intersight/pci_device/__init__.py create mode 100644 lib/intersight/pci_device/class.md create mode 100644 lib/intersight/pci_device/info.py create mode 100644 lib/intersight/pci_device/main.py create mode 100644 lib/intersight/pci_node/__init__.py create mode 100644 lib/intersight/pci_node/class.md create mode 100644 lib/intersight/pci_node/info.py create mode 100644 lib/intersight/pci_node/main.py create mode 100644 lib/intersight/power_control_state/__init__.py create mode 100644 lib/intersight/power_control_state/class.md create mode 100644 lib/intersight/power_control_state/info.py create mode 100644 lib/intersight/power_control_state/main.py create mode 100644 lib/intersight/processor_unit/__init__.py create mode 100644 lib/intersight/processor_unit/class.md create mode 100644 lib/intersight/processor_unit/info.py create mode 100644 lib/intersight/processor_unit/main.py create mode 100644 lib/intersight/running_firmware/__init__.py create mode 100644 lib/intersight/running_firmware/class.md create mode 100644 lib/intersight/running_firmware/info.py create mode 100644 lib/intersight/running_firmware/main.py create mode 100644 lib/intersight/scu/__init__.py create mode 100644 lib/intersight/scu/class.md create mode 100644 lib/intersight/scu/main.py create mode 100644 lib/intersight/search_item/__init__.py create mode 100644 lib/intersight/search_item/main.py create mode 100644 lib/intersight/server_profile/__init__.py create mode 100644 lib/intersight/server_profile/class.md create mode 100644 lib/intersight/server_profile/info.py create mode 100644 lib/intersight/server_profile/main.py create mode 100644 lib/intersight/settings.py create mode 100644 lib/intersight/software_repository_catalog/__init__.py create mode 100644 lib/intersight/software_repository_catalog/class.md create mode 100644 lib/intersight/software_repository_catalog/main.py create mode 100644 lib/intersight/storage_controller/__init__.py create mode 100644 lib/intersight/storage_controller/class.md create mode 100644 lib/intersight/storage_controller/info.py create mode 100644 lib/intersight/storage_controller/main.py create mode 100644 lib/intersight/storage_disk_group/__init__.py create mode 100644 lib/intersight/storage_disk_group/class.md create mode 100644 lib/intersight/storage_disk_group/main.py create mode 100644 lib/intersight/storage_physical_disk/__init__.py create mode 100644 lib/intersight/storage_physical_disk/class.md create mode 100644 lib/intersight/storage_physical_disk/info.py create mode 100644 lib/intersight/storage_physical_disk/main.py create mode 100644 lib/intersight/storage_physical_disk_usage/__init__.py create mode 100644 lib/intersight/storage_physical_disk_usage/class.md create mode 100644 lib/intersight/storage_physical_disk_usage/main.py create mode 100644 lib/intersight/storage_virtual_drive/__init__.py create mode 100644 lib/intersight/storage_virtual_drive/class.md create mode 100644 lib/intersight/storage_virtual_drive/info.py create mode 100644 lib/intersight/storage_virtual_drive/main.py create mode 100644 lib/intersight/tam_advisory_definition/__init__.py create mode 100644 lib/intersight/tam_advisory_definition/class.md create mode 100644 lib/intersight/tam_advisory_definition/info.py create mode 100644 lib/intersight/tam_advisory_definition/main.py create mode 100644 lib/intersight/tam_advisory_instance/__init__.py create mode 100644 lib/intersight/tam_advisory_instance/class.md create mode 100644 lib/intersight/tam_advisory_instance/info.py create mode 100644 lib/intersight/tam_advisory_instance/main.py create mode 100644 lib/intersight/tam_advisory_instance/output.py create mode 100644 lib/intersight/tam_security_advisory/__init__.py create mode 100644 lib/intersight/tam_security_advisory/class.md create mode 100644 lib/intersight/tam_security_advisory/info.py create mode 100644 lib/intersight/tam_security_advisory/main.py create mode 100644 lib/intersight/validations.py create mode 100644 lib/intersight/virtualization_vmwarehost/__init__.py create mode 100644 lib/intersight/virtualization_vmwarehost/class.md create mode 100644 lib/intersight/virtualization_vmwarehost/main.py create mode 100644 lib/intersight/workflow/__init__.py create mode 100644 lib/intersight/workflow/class.md create mode 100644 lib/intersight/workflow/info.py create mode 100644 lib/intersight/workflow/main.py create mode 100644 lib/intersight/workflow_info.py create mode 100644 lib/intersight/workflow_task_info/__init__.py create mode 100644 lib/intersight/workflow_task_info/class.md create mode 100644 lib/intersight/workflow_task_info/main.py create mode 100644 lib/ip_helper.py create mode 100644 lib/isctl_helper.py create mode 100644 lib/iso/__init__.py create mode 100644 lib/iso/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/iso/__pycache__/kickstart.cpython-310.pyc create mode 100644 lib/iso/autoinstall.py create mode 100644 lib/iso/kickstart.py create mode 100644 lib/iwo/__init__.py create mode 100644 lib/iwo/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/action.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/application.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/chassis.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/client.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/cluster.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/container.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/dc.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/disk.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/main.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/namespace.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/network.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/phy.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/pod.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/region.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/service.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/spec.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/storage.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/switch.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/target.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/vdc.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/vm.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/volume.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/workload.cpython-310.pyc create mode 100644 lib/iwo/__pycache__/zone.cpython-310.pyc create mode 100644 lib/iwo/action.py create mode 100644 lib/iwo/application.py create mode 100644 lib/iwo/chassis.py create mode 100644 lib/iwo/client.py create mode 100644 lib/iwo/cluster.py create mode 100644 lib/iwo/container.py create mode 100644 lib/iwo/dc.py create mode 100644 lib/iwo/disk.py create mode 100644 lib/iwo/lcm/__init__.py create mode 100644 lib/iwo/lcm/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/iwo/lcm/__pycache__/main.cpython-310.pyc create mode 100644 lib/iwo/lcm/main.py create mode 100644 lib/iwo/lcm/ocp/__init__.py create mode 100644 lib/iwo/lcm/ocp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/iwo/lcm/ocp/__pycache__/common.cpython-310.pyc create mode 100644 lib/iwo/lcm/ocp/__pycache__/create.cpython-310.pyc create mode 100644 lib/iwo/lcm/ocp/__pycache__/delete.cpython-310.pyc create mode 100644 lib/iwo/lcm/ocp/__pycache__/get.cpython-310.pyc create mode 100644 lib/iwo/lcm/ocp/__pycache__/main.cpython-310.pyc create mode 100644 lib/iwo/lcm/ocp/__pycache__/template.cpython-310.pyc create mode 100644 lib/iwo/lcm/ocp/create.py create mode 100644 lib/iwo/lcm/ocp/delete.py create mode 100644 lib/iwo/lcm/ocp/get.py create mode 100644 lib/iwo/lcm/ocp/main.py create mode 100644 lib/iwo/lcm/ocp/template.py create mode 100644 lib/iwo/main.py create mode 100644 lib/iwo/namespace.py create mode 100644 lib/iwo/network.py create mode 100644 lib/iwo/phy.py create mode 100644 lib/iwo/pod.py create mode 100644 lib/iwo/region.py create mode 100644 lib/iwo/service.py create mode 100644 lib/iwo/spec.py create mode 100644 lib/iwo/storage.py create mode 100644 lib/iwo/switch.py create mode 100644 lib/iwo/target.py create mode 100644 lib/iwo/vdc.py create mode 100644 lib/iwo/vm.py create mode 100644 lib/iwo/volume.py create mode 100644 lib/iwo/workload.py create mode 100644 lib/iwo/zone.py create mode 100644 lib/k8s/README.md create mode 100644 lib/k8s/__init__.py create mode 100644 lib/k8s/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/k8s/__pycache__/common.cpython-310.pyc create mode 100644 lib/k8s/__pycache__/main.cpython-310.pyc create mode 100644 lib/k8s/__pycache__/nodes.cpython-310.pyc create mode 100644 lib/k8s/alert_manager/__init__.py create mode 100644 lib/k8s/alert_manager/api.py create mode 100644 lib/k8s/alert_manager/info.py create mode 100644 lib/k8s/alert_manager/main.py create mode 100644 lib/k8s/alert_manager/output.py create mode 100644 lib/k8s/alert_manager_config/__init__.py create mode 100644 lib/k8s/alert_manager_config/api.py create mode 100644 lib/k8s/alert_manager_config/info.py create mode 100644 lib/k8s/alert_manager_config/main.py create mode 100644 lib/k8s/alert_manager_config/output.py create mode 100644 lib/k8s/api.py create mode 100644 lib/k8s/cluster_operator/__init__.py create mode 100644 lib/k8s/cluster_operator/api.py create mode 100644 lib/k8s/cluster_operator/info.py create mode 100644 lib/k8s/cluster_operator/main.py create mode 100644 lib/k8s/cluster_operator/output.py create mode 100644 lib/k8s/cluster_quota/__init__.py create mode 100644 lib/k8s/cluster_quota/api.py create mode 100644 lib/k8s/cluster_quota/info.py create mode 100644 lib/k8s/cluster_quota/main.py create mode 100644 lib/k8s/cluster_quota/output.py create mode 100644 lib/k8s/cluster_role_binding/__init__.py create mode 100644 lib/k8s/cluster_role_binding/api.py create mode 100644 lib/k8s/cluster_role_binding/info.py create mode 100644 lib/k8s/cluster_role_binding/main.py create mode 100644 lib/k8s/cluster_role_binding/output.py create mode 100644 lib/k8s/cluster_service_version/__init__.py create mode 100644 lib/k8s/cluster_service_version/api.py create mode 100644 lib/k8s/cluster_service_version/info.py create mode 100644 lib/k8s/cluster_service_version/main.py create mode 100644 lib/k8s/cluster_service_version/output.py create mode 100644 lib/k8s/cni/__init__.py create mode 100644 lib/k8s/cni/api.py create mode 100644 lib/k8s/cni/info.py create mode 100644 lib/k8s/cni/main.py create mode 100644 lib/k8s/cni/output.py create mode 100644 lib/k8s/common.py create mode 100644 lib/k8s/config_map/__init__.py create mode 100644 lib/k8s/config_map/api.py create mode 100644 lib/k8s/config_map/info.py create mode 100644 lib/k8s/config_map/main.py create mode 100644 lib/k8s/config_map/output.py create mode 100644 lib/k8s/configmap.py create mode 100644 lib/k8s/custom_resource_definition/__init__.py create mode 100644 lib/k8s/custom_resource_definition/api.py create mode 100644 lib/k8s/custom_resource_definition/info.py create mode 100644 lib/k8s/custom_resource_definition/main.py create mode 100644 lib/k8s/custom_resource_definition/output.py create mode 100644 lib/k8s/daemon_set/__init__.py create mode 100644 lib/k8s/daemon_set/api.py create mode 100644 lib/k8s/daemon_set/info.py create mode 100644 lib/k8s/daemon_set/main.py create mode 100644 lib/k8s/daemon_set/output.py create mode 100644 lib/k8s/data_volume/__init__.py create mode 100644 lib/k8s/data_volume/api.py create mode 100644 lib/k8s/data_volume/info.py create mode 100644 lib/k8s/data_volume/main.py create mode 100644 lib/k8s/data_volume/output.py create mode 100644 lib/k8s/deployment/__init__.py create mode 100644 lib/k8s/deployment/api.py create mode 100644 lib/k8s/deployment/info.py create mode 100644 lib/k8s/deployment/main.py create mode 100644 lib/k8s/deployment/output.py create mode 100644 lib/k8s/deployment_config/__init__.py create mode 100644 lib/k8s/deployment_config/api.py create mode 100644 lib/k8s/deployment_config/info.py create mode 100644 lib/k8s/deployment_config/main.py create mode 100644 lib/k8s/deployment_config/output.py create mode 100644 lib/k8s/egress_ip/__init__.py create mode 100644 lib/k8s/egress_ip/api.py create mode 100644 lib/k8s/egress_ip/info.py create mode 100644 lib/k8s/egress_ip/main.py create mode 100644 lib/k8s/egress_ip/output.py create mode 100644 lib/k8s/egress_router/__init__.py create mode 100644 lib/k8s/egress_router/api.py create mode 100644 lib/k8s/egress_router/info.py create mode 100644 lib/k8s/egress_router/main.py create mode 100644 lib/k8s/egress_router/output.py create mode 100644 lib/k8s/endpoint/__init__.py create mode 100644 lib/k8s/endpoint/api.py create mode 100644 lib/k8s/endpoint/info.py create mode 100644 lib/k8s/endpoint/main.py create mode 100644 lib/k8s/endpoint/output.py create mode 100644 lib/k8s/event/__init__.py create mode 100644 lib/k8s/event/api.py create mode 100644 lib/k8s/event/info.py create mode 100644 lib/k8s/event/main.py create mode 100644 lib/k8s/event/output.py create mode 100644 lib/k8s/ingress/__init__.py create mode 100644 lib/k8s/ingress/api.py create mode 100644 lib/k8s/ingress/info.py create mode 100644 lib/k8s/ingress/main.py create mode 100644 lib/k8s/ingress/output.py create mode 100644 lib/k8s/kubevirt/__init__.py create mode 100644 lib/k8s/kubevirt/api.py create mode 100644 lib/k8s/kubevirt/info.py create mode 100644 lib/k8s/kubevirt/main.py create mode 100644 lib/k8s/kubevirt/output.py create mode 100644 lib/k8s/limit/__init__.py create mode 100644 lib/k8s/limit/api.py create mode 100644 lib/k8s/limit/info.py create mode 100644 lib/k8s/limit/main.py create mode 100644 lib/k8s/limit/output.py create mode 100644 lib/k8s/machine_config/__init__.py create mode 100644 lib/k8s/machine_config/api.py create mode 100644 lib/k8s/machine_config/info.py create mode 100644 lib/k8s/machine_config/main.py create mode 100644 lib/k8s/machine_config/output.py create mode 100644 lib/k8s/machine_config_pool/__init__.py create mode 100644 lib/k8s/machine_config_pool/api.py create mode 100644 lib/k8s/machine_config_pool/info.py create mode 100644 lib/k8s/machine_config_pool/main.py create mode 100644 lib/k8s/machine_config_pool/output.py create mode 100644 lib/k8s/main.py create mode 100644 lib/k8s/namespace/__init__.py create mode 100644 lib/k8s/namespace/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/k8s/namespace/__pycache__/api.cpython-310.pyc create mode 100644 lib/k8s/namespace/__pycache__/info.cpython-310.pyc create mode 100644 lib/k8s/namespace/__pycache__/main.cpython-310.pyc create mode 100644 lib/k8s/namespace/__pycache__/object.cpython-310.pyc create mode 100644 lib/k8s/namespace/__pycache__/task.cpython-310.pyc create mode 100644 lib/k8s/namespace/api.py create mode 100644 lib/k8s/namespace/info.py create mode 100644 lib/k8s/namespace/main.py create mode 100644 lib/k8s/namespace/output.py create mode 100644 lib/k8s/network_attachment_definition/__init__.py create mode 100644 lib/k8s/network_attachment_definition/api.py create mode 100644 lib/k8s/network_attachment_definition/info.py create mode 100644 lib/k8s/network_attachment_definition/main.py create mode 100644 lib/k8s/network_attachment_definition/output.py create mode 100644 lib/k8s/node/__init__.py create mode 100644 lib/k8s/node/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/k8s/node/__pycache__/api.cpython-310.pyc create mode 100644 lib/k8s/node/__pycache__/info.cpython-310.pyc create mode 100644 lib/k8s/node/__pycache__/main.cpython-310.pyc create mode 100644 lib/k8s/node/__pycache__/object.cpython-310.pyc create mode 100644 lib/k8s/node/__pycache__/task.cpython-310.pyc create mode 100644 lib/k8s/node/api.py create mode 100644 lib/k8s/node/info.py create mode 100644 lib/k8s/node/main.py create mode 100644 lib/k8s/node/output.py create mode 100644 lib/k8s/node/task.py create mode 100644 lib/k8s/node_network_configuration_enactment/__init__.py create mode 100644 lib/k8s/node_network_configuration_enactment/api.py create mode 100644 lib/k8s/node_network_configuration_enactment/info.py create mode 100644 lib/k8s/node_network_configuration_enactment/main.py create mode 100644 lib/k8s/node_network_configuration_enactment/output.py create mode 100644 lib/k8s/node_network_configuration_policy/__init__.py create mode 100644 lib/k8s/node_network_configuration_policy/api.py create mode 100644 lib/k8s/node_network_configuration_policy/info.py create mode 100644 lib/k8s/node_network_configuration_policy/main.py create mode 100644 lib/k8s/node_network_configuration_policy/output.py create mode 100644 lib/k8s/node_network_state/__init__.py create mode 100644 lib/k8s/node_network_state/api.py create mode 100644 lib/k8s/node_network_state/info.py create mode 100644 lib/k8s/node_network_state/main.py create mode 100644 lib/k8s/node_network_state/output.py create mode 100644 lib/k8s/operator_group/__init__.py create mode 100644 lib/k8s/operator_group/api.py create mode 100644 lib/k8s/operator_group/info.py create mode 100644 lib/k8s/operator_group/main.py create mode 100644 lib/k8s/operator_group/output.py create mode 100644 lib/k8s/output.py create mode 100644 lib/k8s/performance_profile/__init__.py create mode 100644 lib/k8s/performance_profile/api.py create mode 100644 lib/k8s/performance_profile/info.py create mode 100644 lib/k8s/performance_profile/main.py create mode 100644 lib/k8s/performance_profile/output.py create mode 100644 lib/k8s/pod/__init__.py create mode 100644 lib/k8s/pod/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/k8s/pod/__pycache__/api.cpython-310.pyc create mode 100644 lib/k8s/pod/__pycache__/info.cpython-310.pyc create mode 100644 lib/k8s/pod/__pycache__/main.cpython-310.pyc create mode 100644 lib/k8s/pod/__pycache__/object.cpython-310.pyc create mode 100644 lib/k8s/pod/__pycache__/task.cpython-310.pyc create mode 100644 lib/k8s/pod/api.py create mode 100644 lib/k8s/pod/info.py create mode 100644 lib/k8s/pod/main.py create mode 100644 lib/k8s/pod/output.py create mode 100644 lib/k8s/pod_monitor/__init__.py create mode 100644 lib/k8s/pod_monitor/api.py create mode 100644 lib/k8s/pod_monitor/info.py create mode 100644 lib/k8s/pod_monitor/main.py create mode 100644 lib/k8s/pod_monitor/output.py create mode 100644 lib/k8s/priority_class/__init__.py create mode 100644 lib/k8s/priority_class/api.py create mode 100644 lib/k8s/priority_class/info.py create mode 100644 lib/k8s/priority_class/main.py create mode 100644 lib/k8s/priority_class/output.py create mode 100644 lib/k8s/probe/__init__.py create mode 100644 lib/k8s/probe/api.py create mode 100644 lib/k8s/probe/info.py create mode 100644 lib/k8s/probe/main.py create mode 100644 lib/k8s/probe/output.py create mode 100644 lib/k8s/profile/__init__.py create mode 100644 lib/k8s/profile/api.py create mode 100644 lib/k8s/profile/info.py create mode 100644 lib/k8s/profile/main.py create mode 100644 lib/k8s/profile/output.py create mode 100644 lib/k8s/prometheus/__init__.py create mode 100644 lib/k8s/prometheus/api.py create mode 100644 lib/k8s/prometheus/info.py create mode 100644 lib/k8s/prometheus/main.py create mode 100644 lib/k8s/prometheus/output.py create mode 100644 lib/k8s/prometheus_rule/__init__.py create mode 100644 lib/k8s/prometheus_rule/api.py create mode 100644 lib/k8s/prometheus_rule/info.py create mode 100644 lib/k8s/prometheus_rule/main.py create mode 100644 lib/k8s/prometheus_rule/output.py create mode 100644 lib/k8s/pv/__init__.py create mode 100644 lib/k8s/pv/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/k8s/pv/__pycache__/api.cpython-310.pyc create mode 100644 lib/k8s/pv/__pycache__/info.cpython-310.pyc create mode 100644 lib/k8s/pv/__pycache__/main.cpython-310.pyc create mode 100644 lib/k8s/pv/api.py create mode 100644 lib/k8s/pv/info.py create mode 100644 lib/k8s/pv/main.py create mode 100644 lib/k8s/pv/output.py create mode 100644 lib/k8s/pvc/__init__.py create mode 100644 lib/k8s/pvc/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/k8s/pvc/__pycache__/api.cpython-310.pyc create mode 100644 lib/k8s/pvc/__pycache__/info.cpython-310.pyc create mode 100644 lib/k8s/pvc/__pycache__/main.cpython-310.pyc create mode 100644 lib/k8s/pvc/api.py create mode 100644 lib/k8s/pvc/info.py create mode 100644 lib/k8s/pvc/main.py create mode 100644 lib/k8s/pvc/output.py create mode 100644 lib/k8s/pvc/task/__init__.py create mode 100644 lib/k8s/pvc/task/main.py create mode 100644 lib/k8s/replica_set/__init__.py create mode 100644 lib/k8s/replica_set/api.py create mode 100644 lib/k8s/replica_set/info.py create mode 100644 lib/k8s/replica_set/main.py create mode 100644 lib/k8s/replica_set/output.py create mode 100644 lib/k8s/replication_controller/__init__.py create mode 100644 lib/k8s/replication_controller/api.py create mode 100644 lib/k8s/replication_controller/info.py create mode 100644 lib/k8s/replication_controller/main.py create mode 100644 lib/k8s/replication_controller/output.py create mode 100644 lib/k8s/resource_quota/__init__.py create mode 100644 lib/k8s/resource_quota/api.py create mode 100644 lib/k8s/resource_quota/info.py create mode 100644 lib/k8s/resource_quota/main.py create mode 100644 lib/k8s/resource_quota/output.py create mode 100644 lib/k8s/role_binding/__init__.py create mode 100644 lib/k8s/role_binding/api.py create mode 100644 lib/k8s/role_binding/info.py create mode 100644 lib/k8s/role_binding/main.py create mode 100644 lib/k8s/role_binding/output.py create mode 100644 lib/k8s/route/__init__.py create mode 100644 lib/k8s/route/api.py create mode 100644 lib/k8s/route/info.py create mode 100644 lib/k8s/route/main.py create mode 100644 lib/k8s/route/output.py create mode 100644 lib/k8s/secret/__init__.py create mode 100644 lib/k8s/secret/api.py create mode 100644 lib/k8s/secret/info.py create mode 100644 lib/k8s/secret/main.py create mode 100644 lib/k8s/secret/output.py create mode 100644 lib/k8s/secrets.py create mode 100644 lib/k8s/security_context_constraint/__init__.py create mode 100644 lib/k8s/security_context_constraint/api.py create mode 100644 lib/k8s/security_context_constraint/info.py create mode 100644 lib/k8s/security_context_constraint/main.py create mode 100644 lib/k8s/security_context_constraint/output.py create mode 100644 lib/k8s/service/__init__.py create mode 100644 lib/k8s/service/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/k8s/service/__pycache__/api.cpython-310.pyc create mode 100644 lib/k8s/service/__pycache__/info.cpython-310.pyc create mode 100644 lib/k8s/service/__pycache__/main.cpython-310.pyc create mode 100644 lib/k8s/service/api.py create mode 100644 lib/k8s/service/info.py create mode 100644 lib/k8s/service/main.py create mode 100644 lib/k8s/service/output.py create mode 100644 lib/k8s/service_account/__init__.py create mode 100644 lib/k8s/service_account/api.py create mode 100644 lib/k8s/service_account/info.py create mode 100644 lib/k8s/service_account/main.py create mode 100644 lib/k8s/service_account/output.py create mode 100644 lib/k8s/service_monitor/__init__.py create mode 100644 lib/k8s/service_monitor/api.py create mode 100644 lib/k8s/service_monitor/info.py create mode 100644 lib/k8s/service_monitor/main.py create mode 100644 lib/k8s/service_monitor/output.py create mode 100644 lib/k8s/services.py create mode 100644 lib/k8s/settings.py create mode 100644 lib/k8s/sriov_network/__init__.py create mode 100644 lib/k8s/sriov_network/api.py create mode 100644 lib/k8s/sriov_network/info.py create mode 100644 lib/k8s/sriov_network/main.py create mode 100644 lib/k8s/sriov_network/output.py create mode 100644 lib/k8s/sriov_network_node_policy/__init__.py create mode 100644 lib/k8s/sriov_network_node_policy/api.py create mode 100644 lib/k8s/sriov_network_node_policy/info.py create mode 100644 lib/k8s/sriov_network_node_policy/main.py create mode 100644 lib/k8s/sriov_network_node_policy/output.py create mode 100644 lib/k8s/sriov_network_node_state/__init__.py create mode 100644 lib/k8s/sriov_network_node_state/api.py create mode 100644 lib/k8s/sriov_network_node_state/info.py create mode 100644 lib/k8s/sriov_network_node_state/main.py create mode 100644 lib/k8s/sriov_network_node_state/output.py create mode 100644 lib/k8s/stateful_set/__init__.py create mode 100644 lib/k8s/stateful_set/api.py create mode 100644 lib/k8s/stateful_set/info.py create mode 100644 lib/k8s/stateful_set/main.py create mode 100644 lib/k8s/stateful_set/output.py create mode 100644 lib/k8s/storage_class/__init__.py create mode 100644 lib/k8s/storage_class/api.py create mode 100644 lib/k8s/storage_class/info.py create mode 100644 lib/k8s/storage_class/main.py create mode 100644 lib/k8s/storage_class/output.py create mode 100644 lib/k8s/subscription/__init__.py create mode 100644 lib/k8s/subscription/api.py create mode 100644 lib/k8s/subscription/info.py create mode 100644 lib/k8s/subscription/main.py create mode 100644 lib/k8s/subscription/output.py create mode 100644 lib/k8s/thanos_ruler/__init__.py create mode 100644 lib/k8s/thanos_ruler/api.py create mode 100644 lib/k8s/thanos_ruler/info.py create mode 100644 lib/k8s/thanos_ruler/main.py create mode 100644 lib/k8s/thanos_ruler/output.py create mode 100644 lib/k8s/tuned/__init__.py create mode 100644 lib/k8s/tuned/api.py create mode 100644 lib/k8s/tuned/info.py create mode 100644 lib/k8s/tuned/main.py create mode 100644 lib/k8s/tuned/output.py create mode 100644 lib/k8s/version/__init__.py create mode 100644 lib/k8s/version/api.py create mode 100644 lib/k8s/version/info.py create mode 100644 lib/k8s/version/main.py create mode 100644 lib/k8s/version/output.py create mode 100644 lib/k8s/virtual_machine/__init__.py create mode 100644 lib/k8s/virtual_machine/api.py create mode 100644 lib/k8s/virtual_machine/info.py create mode 100644 lib/k8s/virtual_machine/main.py create mode 100644 lib/k8s/virtual_machine/output.py create mode 100644 lib/k8s/virtual_machine_clone/__init__.py create mode 100644 lib/k8s/virtual_machine_clone/api.py create mode 100644 lib/k8s/virtual_machine_clone/info.py create mode 100644 lib/k8s/virtual_machine_clone/main.py create mode 100644 lib/k8s/virtual_machine_clone/output.py create mode 100644 lib/k8s/virtual_machine_cluster_instance_type/__init__.py create mode 100644 lib/k8s/virtual_machine_cluster_instance_type/api.py create mode 100644 lib/k8s/virtual_machine_cluster_instance_type/info.py create mode 100644 lib/k8s/virtual_machine_cluster_instance_type/main.py create mode 100644 lib/k8s/virtual_machine_cluster_instance_type/output.py create mode 100644 lib/k8s/virtual_machine_cluster_preference/__init__.py create mode 100644 lib/k8s/virtual_machine_cluster_preference/api.py create mode 100644 lib/k8s/virtual_machine_cluster_preference/info.py create mode 100644 lib/k8s/virtual_machine_cluster_preference/main.py create mode 100644 lib/k8s/virtual_machine_cluster_preference/output.py create mode 100644 lib/k8s/virtual_machine_export/__init__.py create mode 100644 lib/k8s/virtual_machine_export/api.py create mode 100644 lib/k8s/virtual_machine_export/info.py create mode 100644 lib/k8s/virtual_machine_export/main.py create mode 100644 lib/k8s/virtual_machine_export/output.py create mode 100644 lib/k8s/virtual_machine_instance/__init__.py create mode 100644 lib/k8s/virtual_machine_instance/api.py create mode 100644 lib/k8s/virtual_machine_instance/info.py create mode 100644 lib/k8s/virtual_machine_instance/main.py create mode 100644 lib/k8s/virtual_machine_instance/output.py create mode 100644 lib/k8s/virtual_machine_instance_migration/__init__.py create mode 100644 lib/k8s/virtual_machine_instance_migration/api.py create mode 100644 lib/k8s/virtual_machine_instance_migration/info.py create mode 100644 lib/k8s/virtual_machine_instance_migration/main.py create mode 100644 lib/k8s/virtual_machine_instance_migration/output.py create mode 100644 lib/k8s/virtual_machine_instance_preset/__init__.py create mode 100644 lib/k8s/virtual_machine_instance_preset/api.py create mode 100644 lib/k8s/virtual_machine_instance_preset/info.py create mode 100644 lib/k8s/virtual_machine_instance_preset/main.py create mode 100644 lib/k8s/virtual_machine_instance_preset/output.py create mode 100644 lib/k8s/virtual_machine_instance_replica_set/__init__.py create mode 100644 lib/k8s/virtual_machine_instance_replica_set/api.py create mode 100644 lib/k8s/virtual_machine_instance_replica_set/info.py create mode 100644 lib/k8s/virtual_machine_instance_replica_set/main.py create mode 100644 lib/k8s/virtual_machine_instance_replica_set/output.py create mode 100644 lib/k8s/virtual_machine_instance_type/__init__.py create mode 100644 lib/k8s/virtual_machine_instance_type/api.py create mode 100644 lib/k8s/virtual_machine_instance_type/info.py create mode 100644 lib/k8s/virtual_machine_instance_type/main.py create mode 100644 lib/k8s/virtual_machine_instance_type/output.py create mode 100644 lib/k8s/virtual_machine_preference/__init__.py create mode 100644 lib/k8s/virtual_machine_preference/api.py create mode 100644 lib/k8s/virtual_machine_preference/info.py create mode 100644 lib/k8s/virtual_machine_preference/main.py create mode 100644 lib/k8s/virtual_machine_preference/output.py create mode 100644 lib/k8s/virtual_machine_restore/__init__.py create mode 100644 lib/k8s/virtual_machine_restore/api.py create mode 100644 lib/k8s/virtual_machine_restore/info.py create mode 100644 lib/k8s/virtual_machine_restore/main.py create mode 100644 lib/k8s/virtual_machine_restore/output.py create mode 100644 lib/k8s/virtual_machine_snapshot/__init__.py create mode 100644 lib/k8s/virtual_machine_snapshot/api.py create mode 100644 lib/k8s/virtual_machine_snapshot/info.py create mode 100644 lib/k8s/virtual_machine_snapshot/main.py create mode 100644 lib/k8s/virtual_machine_snapshot/output.py create mode 100644 lib/k8s/virtual_machine_snapshot_content/__init__.py create mode 100644 lib/k8s/virtual_machine_snapshot_content/api.py create mode 100644 lib/k8s/virtual_machine_snapshot_content/info.py create mode 100644 lib/k8s/virtual_machine_snapshot_content/main.py create mode 100644 lib/k8s/virtual_machine_snapshot_content/output.py create mode 100644 lib/k8s/volume_attachment/__init__.py create mode 100644 lib/k8s/volume_attachment/api.py create mode 100644 lib/k8s/volume_attachment/info.py create mode 100644 lib/k8s/volume_attachment/main.py create mode 100644 lib/k8s/volume_attachment/output.py create mode 100644 lib/k8s/volume_snapshot copy/info.py create mode 100644 lib/k8s/volume_snapshot/__init__.py create mode 100644 lib/k8s/volume_snapshot/api.py create mode 100644 lib/k8s/volume_snapshot/info.py create mode 100644 lib/k8s/volume_snapshot/main.py create mode 100644 lib/k8s/volume_snapshot/output.py create mode 100644 lib/k8s/volume_snapshot_class/__init__.py create mode 100644 lib/k8s/volume_snapshot_class/api.py create mode 100644 lib/k8s/volume_snapshot_class/info.py create mode 100644 lib/k8s/volume_snapshot_class/main.py create mode 100644 lib/k8s/volume_snapshot_class/output.py create mode 100644 lib/k8s/volume_snapshot_content/__init__.py create mode 100644 lib/k8s/volume_snapshot_content/api.py create mode 100644 lib/k8s/volume_snapshot_content/info.py create mode 100644 lib/k8s/volume_snapshot_content/main.py create mode 100644 lib/k8s/volume_snapshot_content/output.py create mode 100644 lib/kubevirt/README.md create mode 100644 lib/kubevirt/__init__.py create mode 100644 lib/kubevirt/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/kubevirt/__pycache__/main.cpython-310.pyc create mode 100644 lib/kubevirt/__pycache__/vm.cpython-310.pyc create mode 100644 lib/kubevirt/__pycache__/vmi.cpython-310.pyc create mode 100644 lib/kubevirt/api.py create mode 100644 lib/kubevirt/common.py create mode 100644 lib/kubevirt/main.py create mode 100644 lib/kubevirt/output.py create mode 100644 lib/kubevirt/virtual_machine/__init__.py create mode 100644 lib/kubevirt/virtual_machine/api.py create mode 100644 lib/kubevirt/virtual_machine/info.py create mode 100644 lib/kubevirt/virtual_machine/main.py create mode 100644 lib/kubevirt/virtual_machine/output.py create mode 100644 lib/kubevirt/virtual_machine_instance/__init__.py create mode 100644 lib/kubevirt/virtual_machine_instance/api.py create mode 100644 lib/kubevirt/virtual_machine_instance/info.py create mode 100644 lib/kubevirt/virtual_machine_instance/main.py create mode 100644 lib/kubevirt/virtual_machine_instance/output.py create mode 100644 lib/linux/__init__.py create mode 100644 lib/linux/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/linux/__pycache__/commands.cpython-310.pyc create mode 100644 lib/linux/__pycache__/interface.cpython-310.pyc create mode 100644 lib/linux/__pycache__/linux_helper.cpython-310.pyc create mode 100644 lib/linux/__pycache__/linux_iptables.cpython-310.pyc create mode 100644 lib/linux/__pycache__/linux_state.cpython-310.pyc create mode 100644 lib/linux/__pycache__/lvm.cpython-310.pyc create mode 100644 lib/linux/__pycache__/main.cpython-310.pyc create mode 100644 lib/linux/__pycache__/state.cpython-310.pyc create mode 100644 lib/linux/bond/__init__.py create mode 100644 lib/linux/bond/cmd.py create mode 100644 lib/linux/bond/info.py create mode 100644 lib/linux/bond/main.py create mode 100644 lib/linux/bond/output.py create mode 100644 lib/linux/boot/__init__.py create mode 100644 lib/linux/boot/cmd.py create mode 100644 lib/linux/boot/info.py create mode 100644 lib/linux/boot/main.py create mode 100644 lib/linux/boot/output.py create mode 100644 lib/linux/cache.py create mode 100644 lib/linux/chrony/__init__.py create mode 100644 lib/linux/chrony/cmd.py create mode 100644 lib/linux/chrony/info.py create mode 100644 lib/linux/chrony/main.py create mode 100644 lib/linux/chrony/output.py create mode 100644 lib/linux/commands.py create mode 100644 lib/linux/common.py create mode 100644 lib/linux/container_policy/__init__.py create mode 100644 lib/linux/container_policy/cmd.py create mode 100644 lib/linux/container_policy/info.py create mode 100644 lib/linux/container_policy/main.py create mode 100644 lib/linux/container_policy/output.py create mode 100644 lib/linux/genisoimage/__init__.py create mode 100644 lib/linux/genisoimage/main.py create mode 100644 lib/linux/huge_pages/__init__.py create mode 100644 lib/linux/huge_pages/cmd.py create mode 100644 lib/linux/huge_pages/info.py create mode 100644 lib/linux/huge_pages/main.py create mode 100644 lib/linux/huge_pages/output.py create mode 100644 lib/linux/interface.py create mode 100644 lib/linux/lvm.py create mode 100644 lib/linux/main.py create mode 100644 lib/linux/output.py create mode 100644 lib/linux/settings.py create mode 100644 lib/linux/state.py create mode 100644 lib/linux/sysctl/__init__.py create mode 100644 lib/linux/sysctl/cmd.py create mode 100644 lib/linux/sysctl/info.py create mode 100644 lib/linux/sysctl/main.py create mode 100644 lib/linux/sysctl/output.py create mode 100644 lib/linux/virtctl/__init__.py create mode 100644 lib/linux/virtctl/main.py create mode 100644 lib/log_helper.py create mode 100644 lib/my_server_helper.py create mode 100644 lib/my_servers_helper.py create mode 100644 lib/netconf/__init__.py create mode 100644 lib/netconf/notification.py create mode 100644 lib/netconf/ssh.py create mode 100644 lib/netconf/transport.py create mode 100644 lib/nexus/__init__.py create mode 100644 lib/nexus/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/nexus/__pycache__/cache.cpython-310.pyc create mode 100644 lib/nexus/__pycache__/lldp.cpython-310.pyc create mode 100644 lib/nexus/__pycache__/nxapi.cpython-310.pyc create mode 100644 lib/nexus/__pycache__/settings.cpython-310.pyc create mode 100644 lib/nexus/bot_output.py create mode 100644 lib/nexus/cache.py create mode 100644 lib/nexus/config/__init__.py create mode 100644 lib/nexus/config/api.py create mode 100644 lib/nexus/config/bot_output.py create mode 100644 lib/nexus/config/info.py create mode 100644 lib/nexus/config/main.py create mode 100644 lib/nexus/config/output.py create mode 100644 lib/nexus/lacp/__init__.py create mode 100644 lib/nexus/lacp/api.py create mode 100644 lib/nexus/lacp/bot_output.py create mode 100644 lib/nexus/lacp/info.py create mode 100644 lib/nexus/lacp/main.py create mode 100644 lib/nexus/lacp/output.py create mode 100644 lib/nexus/lldp/__init__.py create mode 100644 lib/nexus/lldp/api.py create mode 100644 lib/nexus/lldp/bot_output.py create mode 100644 lib/nexus/lldp/info.py create mode 100644 lib/nexus/lldp/main.py create mode 100644 lib/nexus/lldp/output.py create mode 100644 lib/nexus/mac/__init__.py create mode 100644 lib/nexus/mac/api.py create mode 100644 lib/nexus/mac/bot_output.py create mode 100644 lib/nexus/mac/info.py create mode 100644 lib/nexus/mac/main.py create mode 100644 lib/nexus/mac/output.py create mode 100644 lib/nexus/nxapi.py create mode 100644 lib/nexus/output.py create mode 100644 lib/nexus/server/__init__.py create mode 100644 lib/nexus/server/main.py create mode 100644 lib/nexus/settings.py create mode 100644 lib/nexus/version/__init__.py create mode 100644 lib/nexus/version/api.py create mode 100644 lib/nexus/version/bot_output.py create mode 100644 lib/nexus/version/info.py create mode 100644 lib/nexus/version/main.py create mode 100644 lib/nexus/version/output.py create mode 100644 lib/nexus/ws.py create mode 100644 lib/nso/__init__.py create mode 100644 lib/nso/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/nso/__pycache__/main.cpython-310.pyc create mode 100644 lib/nso/__pycache__/settings.cpython-310.pyc create mode 100644 lib/nso/api/__init__.py create mode 100644 lib/nso/api/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/nso/api/__pycache__/rest.cpython-310.pyc create mode 100644 lib/nso/api/rest.py create mode 100644 lib/nso/cnfm/__init__.py create mode 100644 lib/nso/cnfm/cluster/__init__.py create mode 100644 lib/nso/cnfm/cluster/api.py create mode 100644 lib/nso/cnfm/cluster/info.py create mode 100644 lib/nso/cnfm/cluster/main.py create mode 100644 lib/nso/cnfm/cnfd/__init__.py create mode 100644 lib/nso/cnfm/cnfd/api.py create mode 100644 lib/nso/cnfm/cnfd/info.py create mode 100644 lib/nso/cnfm/cnfd/main.py create mode 100644 lib/nso/cnfm/cnfd/output.py create mode 100644 lib/nso/cnfm/cnfi/__init__.py create mode 100644 lib/nso/cnfm/cnfi/api.py create mode 100644 lib/nso/cnfm/cnfi/info.py create mode 100644 lib/nso/cnfm/cnfi/main.py create mode 100644 lib/nso/cnfm/cnfi/output.py create mode 100644 lib/nso/cnfm/device/__init__.py create mode 100644 lib/nso/cnfm/device/api.py create mode 100644 lib/nso/cnfm/device/info.py create mode 100644 lib/nso/cnfm/device/main.py create mode 100644 lib/nso/cnfm/device/output.py create mode 100644 lib/nso/cnfm/main.py create mode 100644 lib/nso/cnfm/output.py create mode 100644 lib/nso/cnfm/plan/__init__.py create mode 100644 lib/nso/cnfm/plan/api.py create mode 100644 lib/nso/cnfm/plan/info.py create mode 100644 lib/nso/cnfm/plan/main.py create mode 100644 lib/nso/cnfm/release/__init__.py create mode 100644 lib/nso/cnfm/release/api.py create mode 100644 lib/nso/cnfm/release/info.py create mode 100644 lib/nso/cnfm/release/main.py create mode 100644 lib/nso/cnfm/result/__init__.py create mode 100644 lib/nso/cnfm/result/api.py create mode 100644 lib/nso/cnfm/result/info.py create mode 100644 lib/nso/cnfm/result/main.py create mode 100644 lib/nso/cnfm/todo.md create mode 100644 lib/nso/common.py create mode 100644 lib/nso/device/__init__.py create mode 100644 lib/nso/device/api.py create mode 100644 lib/nso/device/info.py create mode 100644 lib/nso/device/main.py create mode 100644 lib/nso/device/output.py create mode 100644 lib/nso/main.py create mode 100644 lib/nso/nfvo/__init__.py create mode 100644 lib/nso/nfvo/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/nso/nfvo/__pycache__/main.cpython-310.pyc create mode 100644 lib/nso/nfvo/__pycache__/vnfd.cpython-310.pyc create mode 100644 lib/nso/nfvo/__pycache__/vnfi.cpython-310.pyc create mode 100644 lib/nso/nfvo/api/__init__.py create mode 100644 lib/nso/nfvo/api/main.py create mode 100644 lib/nso/nfvo/main.py create mode 100644 lib/nso/nfvo/output.py create mode 100644 lib/nso/nfvo/vnfd/__init__.py create mode 100644 lib/nso/nfvo/vnfd/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfd/__pycache__/create.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfd/__pycache__/delete.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfd/__pycache__/get.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfd/__pycache__/main.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfd/__pycache__/output.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfd/__pycache__/print.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfd/create.py create mode 100644 lib/nso/nfvo/vnfd/delete.py create mode 100644 lib/nso/nfvo/vnfd/get.py create mode 100644 lib/nso/nfvo/vnfd/main.py create mode 100644 lib/nso/nfvo/vnfd/output.py create mode 100644 lib/nso/nfvo/vnfi/__init__.py create mode 100644 lib/nso/nfvo/vnfi/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfi/__pycache__/create.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfi/__pycache__/delete.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfi/__pycache__/get.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfi/__pycache__/main.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfi/__pycache__/output.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfi/__pycache__/print.cpython-310.pyc create mode 100644 lib/nso/nfvo/vnfi/create.py create mode 100644 lib/nso/nfvo/vnfi/delete.py create mode 100644 lib/nso/nfvo/vnfi/get.py create mode 100644 lib/nso/nfvo/vnfi/main.py create mode 100644 lib/nso/nfvo/vnfi/output.py create mode 100644 lib/nso/output.py create mode 100644 lib/nso/settings.py create mode 100644 lib/ocp/__init__.py create mode 100644 lib/ocp/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/__pycache__/common.cpython-310.pyc create mode 100644 lib/ocp/__pycache__/create.cpython-310.pyc create mode 100644 lib/ocp/__pycache__/delete.cpython-310.pyc create mode 100644 lib/ocp/__pycache__/kubeconfig.cpython-310.pyc create mode 100644 lib/ocp/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/__pycache__/output.cpython-310.pyc create mode 100644 lib/ocp/__pycache__/settings.cpython-310.pyc create mode 100644 lib/ocp/__pycache__/state.cpython-310.pyc create mode 100644 lib/ocp/__pycache__/validate.cpython-310.pyc create mode 100644 lib/ocp/cluster/__init__.py create mode 100644 lib/ocp/cluster/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/cluster/__pycache__/kubeconfig.cpython-310.pyc create mode 100644 lib/ocp/cluster/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/cluster/__pycache__/output.cpython-310.pyc create mode 100644 lib/ocp/cluster/cnv/__init__.py create mode 100644 lib/ocp/cluster/cnv/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/cluster/cnv/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/cluster/cnv/__pycache__/output.cpython-310.pyc create mode 100644 lib/ocp/cluster/cnv/main.py create mode 100644 lib/ocp/cluster/cnv/output.py create mode 100644 lib/ocp/cluster/console/__init__.py create mode 100644 lib/ocp/cluster/console/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/cluster/console/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/cluster/console/__pycache__/output.cpython-310.pyc create mode 100644 lib/ocp/cluster/console/main.py create mode 100644 lib/ocp/cluster/console/output.py create mode 100644 lib/ocp/cluster/kubeconfig/__init__.py create mode 100644 lib/ocp/cluster/kubeconfig/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/cluster/kubeconfig/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/cluster/kubeconfig/__pycache__/output.cpython-310.pyc create mode 100644 lib/ocp/cluster/kubeconfig/main.py create mode 100644 lib/ocp/cluster/kubeconfig/output.py create mode 100644 lib/ocp/cluster/main.py create mode 100644 lib/ocp/cluster/manager/__init__.py create mode 100644 lib/ocp/cluster/manager/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/cluster/manager/__pycache__/info.cpython-310.pyc create mode 100644 lib/ocp/cluster/manager/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/cluster/manager/__pycache__/output.cpython-310.pyc create mode 100644 lib/ocp/cluster/manager/main.py create mode 100644 lib/ocp/cluster/manager/output.py create mode 100644 lib/ocp/cluster/output.py create mode 100644 lib/ocp/cluster/vcenter/__init__.py create mode 100644 lib/ocp/cluster/vcenter/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/cluster/vcenter/__pycache__/info.cpython-310.pyc create mode 100644 lib/ocp/cluster/vcenter/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/cluster/vcenter/__pycache__/output.cpython-310.pyc create mode 100644 lib/ocp/cluster/vcenter/main.py create mode 100644 lib/ocp/cluster/vcenter/output.py create mode 100644 lib/ocp/lcm/__init__.py create mode 100644 lib/ocp/lcm/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/lcm/__pycache__/common.cpython-310.pyc create mode 100644 lib/ocp/lcm/__pycache__/create.cpython-310.pyc create mode 100644 lib/ocp/lcm/__pycache__/delete.cpython-310.pyc create mode 100644 lib/ocp/lcm/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/lcm/__pycache__/validate.cpython-310.pyc create mode 100644 lib/ocp/lcm/common.py create mode 100644 lib/ocp/lcm/create.py create mode 100644 lib/ocp/lcm/delete.py create mode 100644 lib/ocp/lcm/main.py create mode 100644 lib/ocp/lcm/validate.py create mode 100644 lib/ocp/lcm/vsphere/__init__.py create mode 100644 lib/ocp/lcm/vsphere/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/lcm/vsphere/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/lcm/vsphere/__pycache__/validate.cpython-310.pyc create mode 100644 lib/ocp/lcm/vsphere/ipi/__init__.py create mode 100644 lib/ocp/lcm/vsphere/ipi/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/lcm/vsphere/ipi/__pycache__/create.cpython-310.pyc create mode 100644 lib/ocp/lcm/vsphere/ipi/__pycache__/delete.cpython-310.pyc create mode 100644 lib/ocp/lcm/vsphere/ipi/__pycache__/installer.cpython-310.pyc create mode 100644 lib/ocp/lcm/vsphere/ipi/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/lcm/vsphere/ipi/__pycache__/validate.cpython-310.pyc create mode 100644 lib/ocp/lcm/vsphere/ipi/create.py create mode 100644 lib/ocp/lcm/vsphere/ipi/delete.py create mode 100644 lib/ocp/lcm/vsphere/ipi/installer.py create mode 100644 lib/ocp/lcm/vsphere/ipi/main.py create mode 100644 lib/ocp/lcm/vsphere/ipi/validate.py create mode 100644 lib/ocp/lcm/vsphere/main.py create mode 100644 lib/ocp/lcm/vsphere/validate.py create mode 100644 lib/ocp/main.py create mode 100644 lib/ocp/node/__init__.py create mode 100644 lib/ocp/node/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/node/__pycache__/info.cpython-310.pyc create mode 100644 lib/ocp/node/__pycache__/linux.cpython-310.pyc create mode 100644 lib/ocp/node/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/node/__pycache__/output.cpython-310.pyc create mode 100644 lib/ocp/node/__pycache__/sriov.cpython-310.pyc create mode 100644 lib/ocp/node/info.py create mode 100644 lib/ocp/node/linux.py create mode 100644 lib/ocp/node/main.py create mode 100644 lib/ocp/node/sriov.py create mode 100644 lib/ocp/output.py create mode 100644 lib/ocp/settings.py create mode 100644 lib/ocp/task/__init__.py create mode 100644 lib/ocp/task/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/task/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/task/chrony/__init__.py create mode 100644 lib/ocp/task/chrony/main.py create mode 100644 lib/ocp/task/chrony/output.py create mode 100644 lib/ocp/task/container_policy/__init__.py create mode 100644 lib/ocp/task/container_policy/main.py create mode 100644 lib/ocp/task/container_policy/output.py create mode 100644 lib/ocp/task/main.py create mode 100644 lib/ocp/task/node/__init__.py create mode 100644 lib/ocp/task/node/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/task/node/__pycache__/down.cpython-310.pyc create mode 100644 lib/ocp/task/node/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/task/node/__pycache__/nestedhv.cpython-310.pyc create mode 100644 lib/ocp/task/node/__pycache__/up.cpython-310.pyc create mode 100644 lib/ocp/task/node/down.py create mode 100644 lib/ocp/task/node/main.py create mode 100644 lib/ocp/task/node/nestedhv.py create mode 100644 lib/ocp/task/node/up.py create mode 100644 lib/ocp/task/output.py create mode 100644 lib/ocp/task/ssh.py create mode 100644 lib/ocp/vm/__init__.py create mode 100644 lib/ocp/vm/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/create.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/day0.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/delete.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/disk.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/disks.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/image.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/info.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/instance.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/mo.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/net.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/output.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/pod.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/report.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/ssh.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/svc.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/task.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/validate.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/vm.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/vm_mo.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/vmi.cpython-310.pyc create mode 100644 lib/ocp/vm/__pycache__/vmi_mo.cpython-310.pyc create mode 100644 lib/ocp/vm/create/__init__.py create mode 100644 lib/ocp/vm/create/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/vm/create/__pycache__/day0.cpython-310.pyc create mode 100644 lib/ocp/vm/create/__pycache__/deployment.cpython-310.pyc create mode 100644 lib/ocp/vm/create/__pycache__/image.cpython-310.pyc create mode 100644 lib/ocp/vm/create/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/vm/create/__pycache__/network.cpython-310.pyc create mode 100644 lib/ocp/vm/create/__pycache__/policy.cpython-310.pyc create mode 100644 lib/ocp/vm/create/__pycache__/service.cpython-310.pyc create mode 100644 lib/ocp/vm/create/__pycache__/vm.cpython-310.pyc create mode 100644 lib/ocp/vm/create/__pycache__/vmi.cpython-310.pyc create mode 100644 lib/ocp/vm/create/day0.py create mode 100644 lib/ocp/vm/create/deployment.py create mode 100644 lib/ocp/vm/create/image.py create mode 100644 lib/ocp/vm/create/main.py create mode 100644 lib/ocp/vm/create/network.py create mode 100644 lib/ocp/vm/create/policy.py create mode 100644 lib/ocp/vm/create/service.py create mode 100644 lib/ocp/vm/create/vm.py create mode 100644 lib/ocp/vm/delete/__init__.py create mode 100644 lib/ocp/vm/delete/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/vm/delete/__pycache__/day0.cpython-310.pyc create mode 100644 lib/ocp/vm/delete/__pycache__/deployment.cpython-310.pyc create mode 100644 lib/ocp/vm/delete/__pycache__/image.cpython-310.pyc create mode 100644 lib/ocp/vm/delete/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/vm/delete/__pycache__/network.cpython-310.pyc create mode 100644 lib/ocp/vm/delete/__pycache__/policy.cpython-310.pyc create mode 100644 lib/ocp/vm/delete/__pycache__/service.cpython-310.pyc create mode 100644 lib/ocp/vm/delete/__pycache__/vm.cpython-310.pyc create mode 100644 lib/ocp/vm/delete/__pycache__/vmi.cpython-310.pyc create mode 100644 lib/ocp/vm/delete/day0.py create mode 100644 lib/ocp/vm/delete/deployment.py create mode 100644 lib/ocp/vm/delete/image.py create mode 100644 lib/ocp/vm/delete/main.py create mode 100644 lib/ocp/vm/delete/network.py create mode 100644 lib/ocp/vm/delete/policy.py create mode 100644 lib/ocp/vm/delete/service.py create mode 100644 lib/ocp/vm/delete/vm.py create mode 100644 lib/ocp/vm/doc/disks.md create mode 100644 lib/ocp/vm/get/__init__.py create mode 100644 lib/ocp/vm/get/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/bgp.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/day0.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/disk.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/fabric.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/image.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/info.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/main.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/network.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/node.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/pod.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/service.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/sriov.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/ssh.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/vm.cpython-310.pyc create mode 100644 lib/ocp/vm/get/__pycache__/vmi.cpython-310.pyc create mode 100644 lib/ocp/vm/get/bgp.py create mode 100644 lib/ocp/vm/get/disk.py create mode 100644 lib/ocp/vm/get/fabric.py create mode 100644 lib/ocp/vm/get/image.py create mode 100644 lib/ocp/vm/get/info.py create mode 100644 lib/ocp/vm/get/main.py create mode 100644 lib/ocp/vm/get/network.py create mode 100644 lib/ocp/vm/get/report.py create mode 100644 lib/ocp/vm/get/sriov.py create mode 100644 lib/ocp/vm/get/ssh.py create mode 100644 lib/ocp/vm/main.py create mode 100644 lib/ocp/vm/output.py create mode 100644 lib/ocp/vm/validate.py create mode 100644 lib/openshift/__init__.py create mode 100644 lib/openshift/accountsmgmt/__init__.py create mode 100644 lib/openshift/accountsmgmt/api.py create mode 100644 lib/openshift/accountsmgmt/main.py create mode 100644 lib/openshift/accountsmgmt/output.py create mode 100644 lib/openshift/accountsmgmt/subscription/__init__.py create mode 100644 lib/openshift/accountsmgmt/subscription/api.py create mode 100644 lib/openshift/accountsmgmt/subscription/info.py create mode 100644 lib/openshift/accountsmgmt/subscription/main.py create mode 100644 lib/openshift/api.py create mode 100644 lib/openshift/assistedinstall/__init__.py create mode 100644 lib/openshift/assistedinstall/api.py create mode 100644 lib/openshift/assistedinstall/cluster/__init__.py create mode 100644 lib/openshift/assistedinstall/cluster/api.py create mode 100644 lib/openshift/assistedinstall/cluster/info.py create mode 100644 lib/openshift/assistedinstall/cluster/main.py create mode 100644 lib/openshift/assistedinstall/event/__init__.py create mode 100644 lib/openshift/assistedinstall/event/api.py create mode 100644 lib/openshift/assistedinstall/event/info.py create mode 100644 lib/openshift/assistedinstall/event/main.py create mode 100644 lib/openshift/assistedinstall/infra/__init__.py create mode 100644 lib/openshift/assistedinstall/infra/api.py create mode 100644 lib/openshift/assistedinstall/infra/info.py create mode 100644 lib/openshift/assistedinstall/infra/main.py create mode 100644 lib/openshift/assistedinstall/main.py create mode 100644 lib/openshift/assistedinstall/manifest/__init__.py create mode 100644 lib/openshift/assistedinstall/manifest/api.py create mode 100644 lib/openshift/assistedinstall/manifest/info.py create mode 100644 lib/openshift/assistedinstall/manifest/main.py create mode 100644 lib/openshift/assistedinstall/output.py create mode 100644 lib/openshift/assistedinstall/version/__init__.py create mode 100644 lib/openshift/assistedinstall/version/api.py create mode 100644 lib/openshift/assistedinstall/version/info.py create mode 100644 lib/openshift/assistedinstall/version/main.py create mode 100644 lib/openshift/console.py create mode 100644 lib/openshift/output.py create mode 100644 lib/openshift/settings.py create mode 100644 lib/osp/__init__.py create mode 100644 lib/osp/api.py create mode 100644 lib/osp/availability_zone/README.md create mode 100644 lib/osp/availability_zone/__init__.py create mode 100644 lib/osp/availability_zone/api.py create mode 100644 lib/osp/availability_zone/info.py create mode 100644 lib/osp/availability_zone/main.py create mode 100644 lib/osp/availability_zone/output.py create mode 100644 lib/osp/common.py create mode 100644 lib/osp/flavor/README.md create mode 100644 lib/osp/flavor/__init__.py create mode 100644 lib/osp/flavor/api.py create mode 100644 lib/osp/flavor/info.py create mode 100644 lib/osp/flavor/main.py create mode 100644 lib/osp/flavor/output.py create mode 100644 lib/osp/floating_ip/README.md create mode 100644 lib/osp/floating_ip/__init__.py create mode 100644 lib/osp/floating_ip/api.py create mode 100644 lib/osp/floating_ip/info.py create mode 100644 lib/osp/floating_ip/main.py create mode 100644 lib/osp/floating_ip/output.py create mode 100644 lib/osp/hypervisor/README.md create mode 100644 lib/osp/hypervisor/__init__.py create mode 100644 lib/osp/hypervisor/api.py create mode 100644 lib/osp/hypervisor/info.py create mode 100644 lib/osp/hypervisor/main.py create mode 100644 lib/osp/hypervisor/output.py create mode 100644 lib/osp/image/README.md create mode 100644 lib/osp/image/__init__.py create mode 100644 lib/osp/image/api.py create mode 100644 lib/osp/image/info.py create mode 100644 lib/osp/image/main.py create mode 100644 lib/osp/image/output.py create mode 100644 lib/osp/image/task.py create mode 100644 lib/osp/main.py create mode 100644 lib/osp/network/__init__.py create mode 100644 lib/osp/network/api.py create mode 100644 lib/osp/network/info.py create mode 100644 lib/osp/network/main.py create mode 100644 lib/osp/network/output.py create mode 100644 lib/osp/output.py create mode 100644 lib/osp/port/README.md create mode 100644 lib/osp/port/__init__.py create mode 100644 lib/osp/port/api.py create mode 100644 lib/osp/port/info.py create mode 100644 lib/osp/port/main.py create mode 100644 lib/osp/port/output.py create mode 100644 lib/osp/quota/README.md create mode 100644 lib/osp/quota/__init__.py create mode 100644 lib/osp/quota/api.py create mode 100644 lib/osp/quota/info.py create mode 100644 lib/osp/quota/main.py create mode 100644 lib/osp/quota/output.py create mode 100644 lib/osp/role/__init__.py create mode 100644 lib/osp/role/api.py create mode 100644 lib/osp/role/info.py create mode 100644 lib/osp/role/main.py create mode 100644 lib/osp/role/output.py create mode 100644 lib/osp/router/README.md create mode 100644 lib/osp/router/__init__.py create mode 100644 lib/osp/router/api.py create mode 100644 lib/osp/router/info.py create mode 100644 lib/osp/router/main.py create mode 100644 lib/osp/router/output.py create mode 100644 lib/osp/security_group/README.md create mode 100644 lib/osp/security_group/__init__.py create mode 100644 lib/osp/security_group/api.py create mode 100644 lib/osp/security_group/info.py create mode 100644 lib/osp/security_group/main.py create mode 100644 lib/osp/security_group/output.py create mode 100644 lib/osp/settings.py create mode 100644 lib/osp/snapshot/__init__.py create mode 100644 lib/osp/snapshot/api.py create mode 100644 lib/osp/snapshot/info.py create mode 100644 lib/osp/snapshot/main.py create mode 100644 lib/osp/snapshot/output.py create mode 100644 lib/osp/subnet/README.md create mode 100644 lib/osp/subnet/__init__.py create mode 100644 lib/osp/subnet/api.py create mode 100644 lib/osp/subnet/info.py create mode 100644 lib/osp/subnet/main.py create mode 100644 lib/osp/subnet/output.py create mode 100644 lib/osp/tenant/__init__.py create mode 100644 lib/osp/tenant/api.py create mode 100644 lib/osp/tenant/info.py create mode 100644 lib/osp/tenant/main.py create mode 100644 lib/osp/tenant/output.py create mode 100644 lib/osp/user/__init__.py create mode 100644 lib/osp/user/api.py create mode 100644 lib/osp/user/info.py create mode 100644 lib/osp/user/main.py create mode 100644 lib/osp/user/output.py create mode 100644 lib/osp/virtual_machine/README.md create mode 100644 lib/osp/virtual_machine/__init__.py create mode 100644 lib/osp/virtual_machine/api.py create mode 100644 lib/osp/virtual_machine/info.py create mode 100644 lib/osp/virtual_machine/main.py create mode 100644 lib/osp/virtual_machine/output.py create mode 100644 lib/osp/virtual_machine/task.py create mode 100644 lib/osp/volume/__init__.py create mode 100644 lib/osp/volume/api.py create mode 100644 lib/osp/volume/info.py create mode 100644 lib/osp/volume/main.py create mode 100644 lib/osp/volume/output.py create mode 100644 lib/output_helper.py create mode 100644 lib/psirt/__init__.py create mode 100644 lib/psirt/advisory/__init__.py create mode 100644 lib/psirt/advisory/api.py create mode 100644 lib/psirt/advisory/info.py create mode 100644 lib/psirt/advisory/main.py create mode 100644 lib/psirt/advisory/output.py create mode 100644 lib/psirt/api.py create mode 100644 lib/psirt/cache.py create mode 100644 lib/psirt/common.py create mode 100644 lib/psirt/main.py create mode 100644 lib/psirt/output.py create mode 100644 lib/psirt/settings.py create mode 100644 lib/redfish/__init__.py create mode 100644 lib/redfish/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/cache.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/common.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/dell.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/endpoint.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/endpoint_settings.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/fi.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/fi_inventory.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/generic.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/hp.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/settings.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/tree.cpython-310.pyc create mode 100644 lib/redfish/__pycache__/ucs_rack.cpython-310.pyc create mode 100644 lib/redfish/cache.py create mode 100644 lib/redfish/common.py create mode 100644 lib/redfish/dell/__init__.py create mode 100644 lib/redfish/dell/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/redfish/dell/__pycache__/endpoint.cpython-310.pyc create mode 100644 lib/redfish/dell/__pycache__/identity.cpython-310.pyc create mode 100644 lib/redfish/dell/__pycache__/power.cpython-310.pyc create mode 100644 lib/redfish/dell/__pycache__/template.cpython-310.pyc create mode 100644 lib/redfish/dell/__pycache__/thermal.cpython-310.pyc create mode 100644 lib/redfish/dell/endpoint.py create mode 100644 lib/redfish/dell/identity.py create mode 100644 lib/redfish/dell/output.py create mode 100644 lib/redfish/dell/power.py create mode 100644 lib/redfish/dell/template.py create mode 100644 lib/redfish/dell/thermal.py create mode 100644 lib/redfish/endpoint.py create mode 100644 lib/redfish/endpoint_settings.py create mode 100644 lib/redfish/fi/__init__.py create mode 100644 lib/redfish/fi/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/endpoint.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/identity_chassis.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/identity_server.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/inventory.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/main.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/power.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/power_chassis.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/power_server.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/templates.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/thermal.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/thermal_chassis.cpython-310.pyc create mode 100644 lib/redfish/fi/__pycache__/thermal_server.cpython-310.pyc create mode 100644 lib/redfish/fi/endpoint.py create mode 100644 lib/redfish/fi/identity_chassis.py create mode 100644 lib/redfish/fi/identity_server.py create mode 100644 lib/redfish/fi/inventory.py create mode 100644 lib/redfish/fi/output.py create mode 100644 lib/redfish/fi/power_chassis.py create mode 100644 lib/redfish/fi/power_server.py create mode 100644 lib/redfish/fi/templates.py create mode 100644 lib/redfish/fi/thermal_chassis.py create mode 100644 lib/redfish/fi/thermal_server.py create mode 100644 lib/redfish/hpe/__init__.py create mode 100644 lib/redfish/hpe/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/redfish/hpe/__pycache__/endpoint.cpython-310.pyc create mode 100644 lib/redfish/hpe/__pycache__/identity.cpython-310.pyc create mode 100644 lib/redfish/hpe/__pycache__/power.cpython-310.pyc create mode 100644 lib/redfish/hpe/__pycache__/template.cpython-310.pyc create mode 100644 lib/redfish/hpe/__pycache__/thermal.cpython-310.pyc create mode 100644 lib/redfish/hpe/endpoint.py create mode 100644 lib/redfish/hpe/identity.py create mode 100644 lib/redfish/hpe/output.py create mode 100644 lib/redfish/hpe/power.py create mode 100644 lib/redfish/hpe/template.py create mode 100644 lib/redfish/hpe/thermal.py create mode 100644 lib/redfish/output.py create mode 100644 lib/redfish/settings.py create mode 100644 lib/redfish/standard/__init__.py create mode 100644 lib/redfish/standard/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/redfish/standard/__pycache__/endpoint.cpython-310.pyc create mode 100644 lib/redfish/standard/endpoint.py create mode 100644 lib/redfish/tree.py create mode 100644 lib/redfish/ucs_rack/__init__.py create mode 100644 lib/redfish/ucs_rack/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/redfish/ucs_rack/__pycache__/endpoint.cpython-310.pyc create mode 100644 lib/redfish/ucs_rack/__pycache__/identity.cpython-310.pyc create mode 100644 lib/redfish/ucs_rack/__pycache__/power.cpython-310.pyc create mode 100644 lib/redfish/ucs_rack/__pycache__/template.cpython-310.pyc create mode 100644 lib/redfish/ucs_rack/__pycache__/thermal.cpython-310.pyc create mode 100644 lib/redfish/ucs_rack/account/__init__.py create mode 100644 lib/redfish/ucs_rack/account/main.py create mode 100644 lib/redfish/ucs_rack/endpoint.py create mode 100644 lib/redfish/ucs_rack/output.py create mode 100644 lib/redfish/ucs_rack/template/__init__.py create mode 100644 lib/redfish/ucs_rack/template/account/__init__.py create mode 100644 lib/redfish/ucs_rack/template/account/main.py create mode 100644 lib/redfish/ucs_rack/template/account/output.py create mode 100644 lib/redfish/ucs_rack/template/bios/__init__.py create mode 100644 lib/redfish/ucs_rack/template/bios/main.py create mode 100644 lib/redfish/ucs_rack/template/bios/output.py create mode 100644 lib/redfish/ucs_rack/template/cpu/__init__.py create mode 100644 lib/redfish/ucs_rack/template/cpu/main.py create mode 100644 lib/redfish/ucs_rack/template/cpu/output.py create mode 100644 lib/redfish/ucs_rack/template/fan/__init__.py create mode 100644 lib/redfish/ucs_rack/template/fan/main.py create mode 100644 lib/redfish/ucs_rack/template/fan/output.py create mode 100644 lib/redfish/ucs_rack/template/gpu/__init__.py create mode 100644 lib/redfish/ucs_rack/template/gpu/main.py create mode 100644 lib/redfish/ucs_rack/template/gpu/output.py create mode 100644 lib/redfish/ucs_rack/template/identity/__init__.py create mode 100644 lib/redfish/ucs_rack/template/identity/main.py create mode 100644 lib/redfish/ucs_rack/template/identity/output.py create mode 100644 lib/redfish/ucs_rack/template/main.py create mode 100644 lib/redfish/ucs_rack/template/mem/__init__.py create mode 100644 lib/redfish/ucs_rack/template/mem/main.py create mode 100644 lib/redfish/ucs_rack/template/mem/output.py create mode 100644 lib/redfish/ucs_rack/template/net/__init__.py create mode 100644 lib/redfish/ucs_rack/template/net/main.py create mode 100644 lib/redfish/ucs_rack/template/net/output.py create mode 100644 lib/redfish/ucs_rack/template/output.py create mode 100644 lib/redfish/ucs_rack/template/pci/__init__.py create mode 100644 lib/redfish/ucs_rack/template/pci/main.py create mode 100644 lib/redfish/ucs_rack/template/pci/output.py create mode 100644 lib/redfish/ucs_rack/template/power/__init__.py create mode 100644 lib/redfish/ucs_rack/template/power/main.py create mode 100644 lib/redfish/ucs_rack/template/power/output.py create mode 100644 lib/redfish/ucs_rack/template/psu/__init__.py create mode 100644 lib/redfish/ucs_rack/template/psu/main.py create mode 100644 lib/redfish/ucs_rack/template/psu/output.py create mode 100644 lib/redfish/ucs_rack/template/role/__init__.py create mode 100644 lib/redfish/ucs_rack/template/role/main.py create mode 100644 lib/redfish/ucs_rack/template/role/output.py create mode 100644 lib/redfish/ucs_rack/template/storage/__init__.py create mode 100644 lib/redfish/ucs_rack/template/storage/main.py create mode 100644 lib/redfish/ucs_rack/template/storage/output.py create mode 100644 lib/redfish/ucs_rack/template/thermal/__init__.py create mode 100644 lib/redfish/ucs_rack/template/thermal/main.py create mode 100644 lib/redfish/ucs_rack/template/thermal/output.py create mode 100644 lib/self_doc.py create mode 100644 lib/self_testing.py create mode 100644 lib/settings_helper.py create mode 100644 lib/ssh.py create mode 100644 lib/template.py create mode 100644 lib/template_helper.py create mode 100644 lib/ucsm/__init__.py create mode 100644 lib/ucsm/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ucsm/__pycache__/blade.cpython-310.pyc create mode 100644 lib/ucsm/__pycache__/chassis.cpython-310.pyc create mode 100644 lib/ucsm/__pycache__/endpoint_settings.cpython-310.pyc create mode 100644 lib/ucsm/__pycache__/manager.cpython-310.pyc create mode 100644 lib/ucsm/__pycache__/power.cpython-310.pyc create mode 100644 lib/ucsm/__pycache__/settings.cpython-310.pyc create mode 100644 lib/ucsm/__pycache__/thermal.cpython-310.pyc create mode 100644 lib/ucsm/blade.py create mode 100644 lib/ucsm/chassis.py create mode 100644 lib/ucsm/endpoint_settings.py create mode 100644 lib/ucsm/manager.py create mode 100644 lib/ucsm/mo/ComputeBlade.md create mode 100644 lib/ucsm/mo/ComputeMbPowerStats.md create mode 100644 lib/ucsm/mo/EquipmentChassis.md create mode 100644 lib/ucsm/mo/EquipmentChassisStats.md create mode 100644 lib/ucsm/mo/EquipmentPsuInputStats.md create mode 100644 lib/ucsm/mo/sys.md create mode 100644 lib/ucsm/power.py create mode 100644 lib/ucsm/power_modules/__init__.py create mode 100644 lib/ucsm/power_modules/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ucsm/power_modules/__pycache__/chassis.cpython-310.pyc create mode 100644 lib/ucsm/power_modules/__pycache__/fi.cpython-310.pyc create mode 100644 lib/ucsm/power_modules/__pycache__/server.cpython-310.pyc create mode 100644 lib/ucsm/power_modules/chassis.py create mode 100644 lib/ucsm/power_modules/fi.py create mode 100644 lib/ucsm/power_modules/server.py create mode 100644 lib/ucsm/settings.py create mode 100644 lib/ucsm/thermal.py create mode 100644 lib/ucsm/thermal_modules/__init__.py create mode 100644 lib/ucsm/thermal_modules/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/ucsm/thermal_modules/__pycache__/chassis.cpython-310.pyc create mode 100644 lib/ucsm/thermal_modules/__pycache__/fi.cpython-310.pyc create mode 100644 lib/ucsm/thermal_modules/__pycache__/server.cpython-310.pyc create mode 100644 lib/ucsm/thermal_modules/chassis.py create mode 100644 lib/ucsm/thermal_modules/fi.py create mode 100644 lib/ucsm/thermal_modules/server.py create mode 100644 lib/vc/__init__.py create mode 100644 lib/vc/common.py create mode 100644 lib/vc/connect.py create mode 100644 lib/vc/datacenter.py create mode 100644 lib/vc/datastore.py create mode 100644 lib/vc/helper.py create mode 100644 lib/vc/host/__init__.py create mode 100644 lib/vc/host/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/vc/host/__pycache__/api.cpython-310.pyc create mode 100644 lib/vc/host/__pycache__/filtering.cpython-310.pyc create mode 100644 lib/vc/host/__pycache__/main.cpython-310.pyc create mode 100644 lib/vc/host/__pycache__/networking.cpython-310.pyc create mode 100644 lib/vc/host/__pycache__/summary.cpython-310.pyc create mode 100644 lib/vc/host/api.py create mode 100644 lib/vc/host/filtering.py create mode 100644 lib/vc/host/main.py create mode 100644 lib/vc/host/networking.py create mode 100644 lib/vc/host/summary.py create mode 100644 lib/vc/network.py create mode 100644 lib/vc/settings.py create mode 100644 lib/vc/vcenter.py create mode 100644 lib/vc/virtual_machine.py create mode 100644 lib/vc/virtual_machine_deployment_lcm.py create mode 100644 lib/vc/virtual_machine_deployment_validator.py create mode 100644 lib/vc/virtual_machine_lcm.py create mode 100644 lib/vc/vm_cluster.py create mode 100644 lib/vc/vm_folder.py create mode 100644 lib/webex_bot/__init__.py create mode 100644 lib/webex_bot/api.py create mode 100644 lib/webex_bot/cards/__init__.py create mode 100644 lib/webex_bot/commands/__init__.py create mode 100644 lib/webex_bot/commands/aci.py create mode 100644 lib/webex_bot/commands/echo.py create mode 100644 lib/webex_bot/commands/help.py create mode 100644 lib/webex_bot/commands/info.py create mode 100644 lib/webex_bot/commands/nx.py create mode 100644 lib/webex_bot/commands/server.py create mode 100644 lib/webex_bot/commands/settings.py create mode 100644 lib/webex_bot/commands/template.py create mode 100644 lib/webex_bot/commands/validations.py create mode 100644 lib/webex_bot/commands/whoami.py create mode 100644 lib/webex_bot/exceptions.py create mode 100644 lib/webex_bot/formatting.py create mode 100644 lib/webex_bot/mode/__init__.py create mode 100644 lib/webex_bot/mode/backend.py create mode 100644 lib/webex_bot/mode/members.py create mode 100644 lib/webex_bot/models/__init__.py create mode 100644 lib/webex_bot/models/command.py create mode 100644 lib/webex_bot/models/response.py create mode 100644 lib/webex_bot/webex_bot.py create mode 100644 lib/webex_bot/websockets/__init__.py create mode 100644 lib/webex_bot/websockets/webex_websocket_client.py create mode 100644 lib/workflow/__init__.py create mode 100644 lib/workflow/ocp_bm_install.py create mode 100644 lib/workflow/osp_ocp_migration.py create mode 100644 lib/xd/__init__.py create mode 100644 lib/xd/__pycache__/__init__.cpython-310.pyc create mode 100644 lib/xd/__pycache__/aci.cpython-310.pyc create mode 100644 lib/xd/__pycache__/nexus.cpython-310.pyc create mode 100644 lib/xd/__pycache__/ocp2fabric.cpython-310.pyc create mode 100644 lib/xd/__pycache__/server2fabric.cpython-310.pyc create mode 100644 lib/xd/__pycache__/vc2fabric.cpython-310.pyc create mode 100644 lib/xd/aci.py create mode 100644 lib/xd/nexus.py create mode 100644 lib/xd/ocp2fabric.py create mode 100644 lib/xd/server2fabric.py create mode 100644 lib/xd/vc2fabric.py create mode 100644 lib/xmltodict.py create mode 100644 menu/__init__.py create mode 100644 menu/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/__pycache__/common.cpython-310.pyc create mode 100644 menu/__pycache__/defaults.cpython-310.pyc create mode 100644 menu/__pycache__/main.cpython-310.pyc create mode 100644 menu/__pycache__/progress.cpython-310.pyc create mode 100644 menu/__pycache__/user_inputs.cpython-310.pyc create mode 100644 menu/__pycache__/validations.cpython-310.pyc create mode 100644 menu/common.py create mode 100644 menu/create/__init__.py create mode 100644 menu/create/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/create/__pycache__/main.cpython-310.pyc create mode 100644 menu/create/__pycache__/os_image.cpython-310.pyc create mode 100644 menu/create/__pycache__/os_install.cpython-310.pyc create mode 100644 menu/create/__pycache__/scu.cpython-310.pyc create mode 100644 menu/create/__pycache__/user_inputs.cpython-310.pyc create mode 100644 menu/create/helm/__init__.py create mode 100644 menu/create/helm/chart.py create mode 100644 menu/create/helm/main.py create mode 100644 menu/create/helm/release.py create mode 100644 menu/create/k8s/__init__.py create mode 100644 menu/create/k8s/main.py create mode 100644 menu/create/k8s/pvc.py create mode 100644 menu/create/k8s/srnnp.py create mode 100644 menu/create/k8s/vm.py create mode 100644 menu/create/main.py create mode 100644 menu/create/nso/__init__.py create mode 100644 menu/create/nso/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/create/nso/__pycache__/main.cpython-310.pyc create mode 100644 menu/create/nso/main.py create mode 100644 menu/create/nso/nfvo/__init__.py create mode 100644 menu/create/nso/nfvo/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/create/nso/nfvo/__pycache__/main.cpython-310.pyc create mode 100644 menu/create/nso/nfvo/__pycache__/vnfd.cpython-310.pyc create mode 100644 menu/create/nso/nfvo/__pycache__/vnfi.cpython-310.pyc create mode 100644 menu/create/nso/nfvo/main.py create mode 100644 menu/create/nso/nfvo/vnfd.py create mode 100644 menu/create/nso/nfvo/vnfi.py create mode 100644 menu/create/ocp/__init__.py create mode 100644 menu/create/ocp/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/create/ocp/__pycache__/cluster.cpython-310.pyc create mode 100644 menu/create/ocp/__pycache__/main.cpython-310.pyc create mode 100644 menu/create/ocp/__pycache__/vm.cpython-310.pyc create mode 100644 menu/create/ocp/addon/__init__.py create mode 100644 menu/create/ocp/addon/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/create/ocp/addon/__pycache__/iwo.cpython-310.pyc create mode 100644 menu/create/ocp/addon/__pycache__/main.cpython-310.pyc create mode 100644 menu/create/ocp/addon/iwo.py create mode 100644 menu/create/ocp/addon/main.py create mode 100644 menu/create/ocp/cluster/bm.py create mode 100644 menu/create/ocp/cluster/main.py create mode 100644 menu/create/ocp/cluster/vsphere.py create mode 100644 menu/create/ocp/main.py create mode 100644 menu/create/ocp/migrate.py create mode 100644 menu/create/os_image.py create mode 100644 menu/create/os_install/__init__.py create mode 100644 menu/create/os_install/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/create/os_install/__pycache__/batch.cpython-310.pyc create mode 100644 menu/create/os_install/__pycache__/common.cpython-310.pyc create mode 100644 menu/create/os_install/__pycache__/dhcp.cpython-310.pyc create mode 100644 menu/create/os_install/__pycache__/embedded.cpython-310.pyc create mode 100644 menu/create/os_install/__pycache__/main.cpython-310.pyc create mode 100644 menu/create/os_install/__pycache__/static.cpython-310.pyc create mode 100644 menu/create/os_install/__pycache__/user_inputs.cpython-310.pyc create mode 100644 menu/create/os_install/__pycache__/validations.cpython-310.pyc create mode 100644 menu/create/os_install/batch.py create mode 100644 menu/create/os_install/common.py create mode 100644 menu/create/os_install/dhcp.py create mode 100644 menu/create/os_install/embedded.py create mode 100644 menu/create/os_install/main.py create mode 100644 menu/create/os_install/static.py create mode 100644 menu/create/os_install/validations.py create mode 100644 menu/create/osp/__init__.py create mode 100644 menu/create/osp/fip.py create mode 100644 menu/create/osp/flv.py create mode 100644 menu/create/osp/img.py create mode 100644 menu/create/osp/main.py create mode 100644 menu/create/osp/net.py create mode 100644 menu/create/osp/rule.py create mode 100644 menu/create/osp/sub.py create mode 100644 menu/create/osp/vm.py create mode 100644 menu/create/scu.py create mode 100644 menu/create/server/__init__.py create mode 100644 menu/create/server/main.py create mode 100644 menu/create/server/user.py create mode 100644 menu/create/vc/__init__.py create mode 100644 menu/create/vc/main.py create mode 100644 menu/create/vc/vm.py create mode 100644 menu/defaults.py create mode 100644 menu/delete/__init__.py create mode 100644 menu/delete/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/delete/__pycache__/main.cpython-310.pyc create mode 100644 menu/delete/__pycache__/os_image.cpython-310.pyc create mode 100644 menu/delete/__pycache__/scu.cpython-310.pyc create mode 100644 menu/delete/aci/__init__.py create mode 100644 menu/delete/aci/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/delete/aci/__pycache__/controller.cpython-310.pyc create mode 100644 menu/delete/aci/__pycache__/main.cpython-310.pyc create mode 100644 menu/delete/aci/__pycache__/manager.cpython-310.pyc create mode 100644 menu/delete/aci/controller.py create mode 100644 menu/delete/aci/main.py create mode 100644 menu/delete/cvim/__init__.py create mode 100644 menu/delete/cvim/cluster.py create mode 100644 menu/delete/cvim/main.py create mode 100644 menu/delete/helm/__init__.py create mode 100644 menu/delete/helm/chart.py create mode 100644 menu/delete/helm/main.py create mode 100644 menu/delete/helm/release.py create mode 100644 menu/delete/k8s/__init__.py create mode 100644 menu/delete/k8s/cluster.py create mode 100644 menu/delete/k8s/dv.py create mode 100644 menu/delete/k8s/main.py create mode 100644 menu/delete/k8s/pvc.py create mode 100644 menu/delete/k8s/srnnp.py create mode 100644 menu/delete/k8s/vm.py create mode 100644 menu/delete/linux/__init__.py create mode 100644 menu/delete/linux/main.py create mode 100644 menu/delete/linux/server.py create mode 100644 menu/delete/main.py create mode 100644 menu/delete/nso/__init__.py create mode 100644 menu/delete/nso/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/delete/nso/__pycache__/main.cpython-310.pyc create mode 100644 menu/delete/nso/main.py create mode 100644 menu/delete/nso/nfvo/__init__.py create mode 100644 menu/delete/nso/nfvo/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/delete/nso/nfvo/__pycache__/main.cpython-310.pyc create mode 100644 menu/delete/nso/nfvo/__pycache__/vnfd.cpython-310.pyc create mode 100644 menu/delete/nso/nfvo/__pycache__/vnfi.cpython-310.pyc create mode 100644 menu/delete/nso/nfvo/main.py create mode 100644 menu/delete/nso/nfvo/vnfd.py create mode 100644 menu/delete/nso/nfvo/vnfi.py create mode 100644 menu/delete/nx/__init__.py create mode 100644 menu/delete/nx/device.py create mode 100644 menu/delete/nx/main.py create mode 100644 menu/delete/ocp/__init__.py create mode 100644 menu/delete/ocp/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/delete/ocp/__pycache__/cluster.cpython-310.pyc create mode 100644 menu/delete/ocp/__pycache__/main.cpython-310.pyc create mode 100644 menu/delete/ocp/__pycache__/vm.cpython-310.pyc create mode 100644 menu/delete/ocp/addon/__init__.py create mode 100644 menu/delete/ocp/addon/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/delete/ocp/addon/__pycache__/iwo.cpython-310.pyc create mode 100644 menu/delete/ocp/addon/__pycache__/main.cpython-310.pyc create mode 100644 menu/delete/ocp/addon/iwo.py create mode 100644 menu/delete/ocp/addon/main.py create mode 100644 menu/delete/ocp/cluster/__init__.py create mode 100644 menu/delete/ocp/cluster/main.py create mode 100644 menu/delete/ocp/cluster/vsphere.py create mode 100644 menu/delete/ocp/main.py create mode 100644 menu/delete/os_image.py create mode 100644 menu/delete/osp/__init__.py create mode 100644 menu/delete/osp/cluster.py create mode 100644 menu/delete/osp/fip.py create mode 100644 menu/delete/osp/flv.py create mode 100644 menu/delete/osp/img.py create mode 100644 menu/delete/osp/main.py create mode 100644 menu/delete/osp/net.py create mode 100644 menu/delete/osp/rule.py create mode 100644 menu/delete/osp/sub.py create mode 100644 menu/delete/osp/vm.py create mode 100644 menu/delete/redfish/__init__.py create mode 100644 menu/delete/redfish/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/delete/redfish/__pycache__/access.cpython-310.pyc create mode 100644 menu/delete/redfish/__pycache__/adhoc.cpython-310.pyc create mode 100644 menu/delete/redfish/__pycache__/cache.cpython-310.pyc create mode 100644 menu/delete/redfish/__pycache__/configuration.cpython-310.pyc create mode 100644 menu/delete/redfish/__pycache__/endpoint.cpython-310.pyc create mode 100644 menu/delete/redfish/__pycache__/fi.cpython-310.pyc create mode 100644 menu/delete/redfish/__pycache__/main.cpython-310.pyc create mode 100644 menu/delete/redfish/__pycache__/settings.cpython-310.pyc create mode 100644 menu/delete/redfish/__pycache__/ucsc.cpython-310.pyc create mode 100644 menu/delete/redfish/access.py create mode 100644 menu/delete/redfish/cache.py create mode 100644 menu/delete/redfish/main.py create mode 100644 menu/delete/scu.py create mode 100644 menu/delete/server/main.py create mode 100644 menu/delete/server/user.py create mode 100644 menu/delete/ucsm/__init__.py create mode 100644 menu/delete/ucsm/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/delete/ucsm/__pycache__/main.cpython-310.pyc create mode 100644 menu/delete/ucsm/__pycache__/manager.cpython-310.pyc create mode 100644 menu/delete/ucsm/main.py create mode 100644 menu/delete/ucsm/manager.py create mode 100644 menu/delete/vc/__init__.py create mode 100644 menu/delete/vc/main.py create mode 100644 menu/delete/vc/vm.py create mode 100644 menu/get/__init__.py create mode 100644 menu/get/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/__pycache__/chassis.cpython-310.pyc create mode 100644 menu/get/__pycache__/chassiz.cpython-310.pyc create mode 100644 menu/get/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/__pycache__/os_config.cpython-310.pyc create mode 100644 menu/get/__pycache__/os_image.cpython-310.pyc create mode 100644 menu/get/__pycache__/os_vendor.cpython-310.pyc create mode 100644 menu/get/__pycache__/os_version.cpython-310.pyc create mode 100644 menu/get/__pycache__/power.cpython-310.pyc create mode 100644 menu/get/__pycache__/scu.cpython-310.pyc create mode 100644 menu/get/__pycache__/server.cpython-310.pyc create mode 100644 menu/get/__pycache__/servers.cpython-310.pyc create mode 100644 menu/get/__pycache__/summary.cpython-310.pyc create mode 100644 menu/get/__pycache__/thermal.cpython-310.pyc create mode 100644 menu/get/__pycache__/workflow.cpython-310.pyc create mode 100644 menu/get/__pycache__/workflows.cpython-310.pyc create mode 100644 menu/get/aci/__init__.py create mode 100644 menu/get/aci/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/aaep.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/ap.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/bd.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/cache.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/contract.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/controller.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/endpoint.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/endpoints.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/ep.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/epg.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/l2out.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/l3out.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/node.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/tenant.cpython-310.pyc create mode 100644 menu/get/aci/__pycache__/vrf.cpython-310.pyc create mode 100644 menu/get/aci/aaep.py create mode 100644 menu/get/aci/ap.py create mode 100644 menu/get/aci/bd.py create mode 100644 menu/get/aci/cache.py create mode 100644 menu/get/aci/contract/__init__.py create mode 100644 menu/get/aci/contract/filter.py create mode 100644 menu/get/aci/contract/main.py create mode 100644 menu/get/aci/contract/standard.py create mode 100644 menu/get/aci/contract/taboo.py create mode 100644 menu/get/aci/controller.py create mode 100644 menu/get/aci/domain/__init__.py create mode 100644 menu/get/aci/domain/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/aci/domain/__pycache__/aaa.cpython-310.pyc create mode 100644 menu/get/aci/domain/__pycache__/l2.cpython-310.pyc create mode 100644 menu/get/aci/domain/__pycache__/l3.cpython-310.pyc create mode 100644 menu/get/aci/domain/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/aci/domain/__pycache__/phy.cpython-310.pyc create mode 100644 menu/get/aci/domain/__pycache__/vmm.cpython-310.pyc create mode 100644 menu/get/aci/domain/aaa.py create mode 100644 menu/get/aci/domain/l2.py create mode 100644 menu/get/aci/domain/l3.py create mode 100644 menu/get/aci/domain/main.py create mode 100644 menu/get/aci/domain/phy.py create mode 100644 menu/get/aci/domain/vmm.py create mode 100644 menu/get/aci/ep.py create mode 100644 menu/get/aci/epg.py create mode 100644 menu/get/aci/intf/__init__.py create mode 100644 menu/get/aci/intf/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/cloudsec.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/fc.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/fcpc.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/l3.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/l3e.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/lb.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/macsec.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/mgmt.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/pc.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/phy.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/summary.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/svi.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/tun.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/vfc.cpython-310.pyc create mode 100644 menu/get/aci/intf/__pycache__/vpc.cpython-310.pyc create mode 100644 menu/get/aci/intf/cloudsec.py create mode 100644 menu/get/aci/intf/fc.py create mode 100644 menu/get/aci/intf/fcpc.py create mode 100644 menu/get/aci/intf/l3e.py create mode 100644 menu/get/aci/intf/lb.py create mode 100644 menu/get/aci/intf/macsec.py create mode 100644 menu/get/aci/intf/main.py create mode 100644 menu/get/aci/intf/mgmt.py create mode 100644 menu/get/aci/intf/pc.py create mode 100644 menu/get/aci/intf/phy.py create mode 100644 menu/get/aci/intf/summary.py create mode 100644 menu/get/aci/intf/svi.py create mode 100644 menu/get/aci/intf/tun.py create mode 100644 menu/get/aci/intf/vfc.py create mode 100644 menu/get/aci/intf/vpc.py create mode 100644 menu/get/aci/l2out.py create mode 100644 menu/get/aci/l3out.py create mode 100644 menu/get/aci/mac.py create mode 100644 menu/get/aci/main.py create mode 100644 menu/get/aci/mo.py create mode 100644 menu/get/aci/node.py create mode 100644 menu/get/aci/pg/__init__.py create mode 100644 menu/get/aci/pg/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/aci/pg/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/aci/pg/access/__init__.py create mode 100644 menu/get/aci/pg/access/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/aci/pg/access/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/aci/pg/access/intf/__init__.py create mode 100644 menu/get/aci/pg/access/intf/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/aci/pg/access/intf/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/aci/pg/access/intf/__pycache__/port.cpython-310.pyc create mode 100644 menu/get/aci/pg/access/intf/__pycache__/vpc.cpython-310.pyc create mode 100644 menu/get/aci/pg/access/intf/main.py create mode 100644 menu/get/aci/pg/access/intf/port.py create mode 100644 menu/get/aci/pg/access/intf/vpc.py create mode 100644 menu/get/aci/pg/access/main.py create mode 100644 menu/get/aci/pg/main.py create mode 100644 menu/get/aci/policy/__init__.py create mode 100644 menu/get/aci/policy/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/auth.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/cdp.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/copp.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/dpp.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/drain.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/fc.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/flap.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/l2.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/lacp.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/lacp_member.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/link.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/link_fc.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/lldp.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/mcp.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/pfc.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/portsec.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/storm.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/stp.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/synce.cpython-310.pyc create mode 100644 menu/get/aci/policy/__pycache__/transceiver.cpython-310.pyc create mode 100644 menu/get/aci/policy/auth.py create mode 100644 menu/get/aci/policy/cdp.py create mode 100644 menu/get/aci/policy/copp.py create mode 100644 menu/get/aci/policy/dpp.py create mode 100644 menu/get/aci/policy/drain.py create mode 100644 menu/get/aci/policy/fc.py create mode 100644 menu/get/aci/policy/flap.py create mode 100644 menu/get/aci/policy/l2.py create mode 100644 menu/get/aci/policy/lacp.py create mode 100644 menu/get/aci/policy/lacp_member.py create mode 100644 menu/get/aci/policy/link.py create mode 100644 menu/get/aci/policy/link_fc.py create mode 100644 menu/get/aci/policy/lldp.py create mode 100644 menu/get/aci/policy/main.py create mode 100644 menu/get/aci/policy/mcp.py create mode 100644 menu/get/aci/policy/pfc.py create mode 100644 menu/get/aci/policy/portsec.py create mode 100644 menu/get/aci/policy/storm.py create mode 100644 menu/get/aci/policy/stp.py create mode 100644 menu/get/aci/policy/synce.py create mode 100644 menu/get/aci/policy/transceiver.py create mode 100644 menu/get/aci/pool/__init__.py create mode 100644 menu/get/aci/pool/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/aci/pool/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/aci/pool/__pycache__/vlan.cpython-310.pyc create mode 100644 menu/get/aci/pool/main.py create mode 100644 menu/get/aci/pool/vlan.py create mode 100644 menu/get/aci/proto/__init__.py create mode 100644 menu/get/aci/proto/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/arp.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/bfd.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/bgp.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/cdp.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/hsrp.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/ipv4.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/ipv6.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/isis.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/lacp.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/lldp.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/aci/proto/__pycache__/nd.cpython-310.pyc create mode 100644 menu/get/aci/proto/arp.py create mode 100644 menu/get/aci/proto/bfd.py create mode 100644 menu/get/aci/proto/bgp.py create mode 100644 menu/get/aci/proto/cdp.py create mode 100644 menu/get/aci/proto/hsrp.py create mode 100644 menu/get/aci/proto/ipv4.py create mode 100644 menu/get/aci/proto/ipv6.py create mode 100644 menu/get/aci/proto/isis.py create mode 100644 menu/get/aci/proto/lacp.py create mode 100644 menu/get/aci/proto/lldp.py create mode 100644 menu/get/aci/proto/main.py create mode 100644 menu/get/aci/proto/nd.py create mode 100644 menu/get/aci/psirt.py create mode 100644 menu/get/aci/server.py create mode 100644 menu/get/aci/system/__init__.py create mode 100644 menu/get/aci/system/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/aci/system/__pycache__/fault.cpython-310.pyc create mode 100644 menu/get/aci/system/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/aci/system/fault.py create mode 100644 menu/get/aci/system/main.py create mode 100644 menu/get/aci/tenant.py create mode 100644 menu/get/aci/vrf.py create mode 100644 menu/get/chassis.py create mode 100644 menu/get/cvim/__init__.py create mode 100644 menu/get/cvim/cluster.py create mode 100644 menu/get/cvim/main.py create mode 100644 menu/get/helm/__init__.py create mode 100644 menu/get/helm/chart.py create mode 100644 menu/get/helm/main.py create mode 100644 menu/get/helm/release.py create mode 100644 menu/get/intersight/__init__.py create mode 100644 menu/get/intersight/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/chassis.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/chassiz.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/os_config.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/os_image.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/os_vendor.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/os_version.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/scu.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/server.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/servers.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/summary.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/workflow.cpython-310.pyc create mode 100644 menu/get/intersight/__pycache__/workflows.cpython-310.pyc create mode 100644 menu/get/intersight/alarm.py create mode 100644 menu/get/intersight/iaccount.py create mode 100644 menu/get/intersight/main.py create mode 100644 menu/get/intersight/os_config.py create mode 100644 menu/get/intersight/os_image.py create mode 100644 menu/get/intersight/os_vendor.py create mode 100644 menu/get/intersight/os_version.py create mode 100644 menu/get/intersight/scu.py create mode 100644 menu/get/intersight/settings.py create mode 100644 menu/get/intersight/workflow.py create mode 100644 menu/get/intersight/workflows.py create mode 100644 menu/get/iwo/__init__.py create mode 100644 menu/get/iwo/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/action.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/application.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/chassis.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/cluster.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/container.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/dc.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/dcs.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/disk.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/namespace.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/network.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/phy.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/pod.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/region.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/service.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/spec.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/storage.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/switch.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/target.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/targets.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/vdc.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/vdcs.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/vm.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/vms.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/volume.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/workload.cpython-310.pyc create mode 100644 menu/get/iwo/__pycache__/zone.cpython-310.pyc create mode 100644 menu/get/iwo/action.py create mode 100644 menu/get/iwo/application.py create mode 100644 menu/get/iwo/chassis.py create mode 100644 menu/get/iwo/cluster.py create mode 100644 menu/get/iwo/container.py create mode 100644 menu/get/iwo/dc.py create mode 100644 menu/get/iwo/disk.py create mode 100644 menu/get/iwo/main.py create mode 100644 menu/get/iwo/namespace.py create mode 100644 menu/get/iwo/network.py create mode 100644 menu/get/iwo/phy.py create mode 100644 menu/get/iwo/pod.py create mode 100644 menu/get/iwo/region.py create mode 100644 menu/get/iwo/service.py create mode 100644 menu/get/iwo/spec.py create mode 100644 menu/get/iwo/storage.py create mode 100644 menu/get/iwo/switch.py create mode 100644 menu/get/iwo/target.py create mode 100644 menu/get/iwo/vdc.py create mode 100644 menu/get/iwo/vm.py create mode 100644 menu/get/iwo/volume.py create mode 100644 menu/get/iwo/workload.py create mode 100644 menu/get/iwo/zone.py create mode 100644 menu/get/k8s/__init__.py create mode 100644 menu/get/k8s/am.py create mode 100644 menu/get/k8s/amcfg.py create mode 100644 menu/get/k8s/cluster.py create mode 100644 menu/get/k8s/cm.py create mode 100644 menu/get/k8s/cni.py create mode 100644 menu/get/k8s/cquota.py create mode 100644 menu/get/k8s/crb.py create mode 100644 menu/get/k8s/crd.py create mode 100644 menu/get/k8s/csv.py create mode 100644 menu/get/k8s/dc.py create mode 100644 menu/get/k8s/dep.py create mode 100644 menu/get/k8s/ds.py create mode 100644 menu/get/k8s/dv.py create mode 100644 menu/get/k8s/eip.py create mode 100644 menu/get/k8s/ep.py create mode 100644 menu/get/k8s/erouter.py create mode 100644 menu/get/k8s/ev.py create mode 100644 menu/get/k8s/ing.py create mode 100644 menu/get/k8s/kc.py create mode 100644 menu/get/k8s/kv.py create mode 100644 menu/get/k8s/limit.py create mode 100644 menu/get/k8s/main.py create mode 100644 menu/get/k8s/mc.py create mode 100644 menu/get/k8s/mcp.py create mode 100644 menu/get/k8s/nad.py create mode 100644 menu/get/k8s/nnce.py create mode 100644 menu/get/k8s/nncp.py create mode 100644 menu/get/k8s/nns.py create mode 100644 menu/get/k8s/node.py create mode 100644 menu/get/k8s/ns.py create mode 100644 menu/get/k8s/og.py create mode 100644 menu/get/k8s/pc.py create mode 100644 menu/get/k8s/pmon.py create mode 100644 menu/get/k8s/pod.py create mode 100644 menu/get/k8s/pp.py create mode 100644 menu/get/k8s/prb.py create mode 100644 menu/get/k8s/profile.py create mode 100644 menu/get/k8s/prom.py create mode 100644 menu/get/k8s/promrule.py create mode 100644 menu/get/k8s/pv.py create mode 100644 menu/get/k8s/pvc.py create mode 100644 menu/get/k8s/quota.py create mode 100644 menu/get/k8s/rb.py create mode 100644 menu/get/k8s/rc.py create mode 100644 menu/get/k8s/route.py create mode 100644 menu/get/k8s/rs.py create mode 100644 menu/get/k8s/ruler.py create mode 100644 menu/get/k8s/sa.py create mode 100644 menu/get/k8s/sc.py create mode 100644 menu/get/k8s/scc.py create mode 100644 menu/get/k8s/sec.py create mode 100644 menu/get/k8s/smon.py create mode 100644 menu/get/k8s/srn.py create mode 100644 menu/get/k8s/srnnp.py create mode 100644 menu/get/k8s/srnns.py create mode 100644 menu/get/k8s/sts.py create mode 100644 menu/get/k8s/sub.py create mode 100644 menu/get/k8s/svc.py create mode 100644 menu/get/k8s/tuned.py create mode 100644 menu/get/k8s/va.py create mode 100644 menu/get/k8s/ver.py create mode 100644 menu/get/k8s/vm.py create mode 100644 menu/get/k8s/vmc.py create mode 100644 menu/get/k8s/vmcf.py create mode 100644 menu/get/k8s/vmcp.py create mode 100644 menu/get/k8s/vme.py create mode 100644 menu/get/k8s/vmf.py create mode 100644 menu/get/k8s/vmi.py create mode 100644 menu/get/k8s/vmim.py create mode 100644 menu/get/k8s/vmipr.py create mode 100644 menu/get/k8s/vmirs.py create mode 100644 menu/get/k8s/vmp.py create mode 100644 menu/get/k8s/vmr.py create mode 100644 menu/get/k8s/vms.py create mode 100644 menu/get/k8s/vmsc.py create mode 100644 menu/get/k8s/vs.py create mode 100644 menu/get/k8s/vsc.py create mode 100644 menu/get/k8s/vsclass.py create mode 100644 menu/get/kv/__init__.py create mode 100644 menu/get/kv/main.py create mode 100644 menu/get/kv/vm.py create mode 100644 menu/get/kv/vmi.py create mode 100644 menu/get/linux/__init__.py create mode 100644 menu/get/linux/bond.py create mode 100644 menu/get/linux/boot.py create mode 100644 menu/get/linux/hp.py create mode 100644 menu/get/linux/main.py create mode 100644 menu/get/linux/server.py create mode 100644 menu/get/linux/sysctl.py create mode 100644 menu/get/main.py create mode 100644 menu/get/nc/__init__.py create mode 100644 menu/get/nc/main.py create mode 100644 menu/get/nc/notif.py create mode 100644 menu/get/nso/__init__.py create mode 100644 menu/get/nso/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/nso/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/nso/__pycache__/ncs.cpython-310.pyc create mode 100644 menu/get/nso/__pycache__/vnfd.cpython-310.pyc create mode 100644 menu/get/nso/cnfd.py create mode 100644 menu/get/nso/cnfi.py create mode 100644 menu/get/nso/cnfm.py create mode 100644 menu/get/nso/device.py create mode 100644 menu/get/nso/main.py create mode 100644 menu/get/nso/ncs.py create mode 100644 menu/get/nso/nfvo/__init__.py create mode 100644 menu/get/nso/nfvo/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/nso/nfvo/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/nso/nfvo/__pycache__/vnfd.cpython-310.pyc create mode 100644 menu/get/nso/nfvo/__pycache__/vnfi.cpython-310.pyc create mode 100644 menu/get/nso/nfvo/main.py create mode 100644 menu/get/nso/nfvo/vnfd.py create mode 100644 menu/get/nso/nfvo/vnfi.py create mode 100644 menu/get/nx/__init__.py create mode 100644 menu/get/nx/config.py create mode 100644 menu/get/nx/device.py create mode 100644 menu/get/nx/lacp.py create mode 100644 menu/get/nx/lldp.py create mode 100644 menu/get/nx/mac.py create mode 100644 menu/get/nx/main.py create mode 100644 menu/get/nx/psirt.py create mode 100644 menu/get/nx/server.py create mode 100644 menu/get/nx/ver.py create mode 100644 menu/get/ocp/__init__.py create mode 100644 menu/get/ocp/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/ocp/__pycache__/cluster.cpython-310.pyc create mode 100644 menu/get/ocp/__pycache__/installer.cpython-310.pyc create mode 100644 menu/get/ocp/__pycache__/kc.cpython-310.pyc create mode 100644 menu/get/ocp/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/ocp/__pycache__/node.cpython-310.pyc create mode 100644 menu/get/ocp/__pycache__/vcenter.cpython-310.pyc create mode 100644 menu/get/ocp/__pycache__/vm.cpython-310.pyc create mode 100644 menu/get/ocp/chrony.py create mode 100644 menu/get/ocp/cpolicy.py create mode 100644 menu/get/ocp/main.py create mode 100644 menu/get/ocp/node.py create mode 100644 menu/get/ocp/ssh.py create mode 100644 menu/get/ocp/vm.py create mode 100644 menu/get/openshift/__init__.py create mode 100644 menu/get/openshift/ai/__init__.py create mode 100644 menu/get/openshift/ai/cluster.py create mode 100644 menu/get/openshift/ai/main.py create mode 100644 menu/get/openshift/ai/version.py create mode 100644 menu/get/openshift/main.py create mode 100644 menu/get/osp/__init__.py create mode 100644 menu/get/osp/az.py create mode 100644 menu/get/osp/cluster.py create mode 100644 menu/get/osp/fip.py create mode 100644 menu/get/osp/flv.py create mode 100644 menu/get/osp/hv.py create mode 100644 menu/get/osp/img.py create mode 100644 menu/get/osp/main.py create mode 100644 menu/get/osp/net.py create mode 100644 menu/get/osp/port.py create mode 100644 menu/get/osp/quota.py create mode 100644 menu/get/osp/role.py create mode 100644 menu/get/osp/rtr.py create mode 100644 menu/get/osp/sg.py create mode 100644 menu/get/osp/snap.py create mode 100644 menu/get/osp/sub.py create mode 100644 menu/get/osp/tenant.py create mode 100644 menu/get/osp/user.py create mode 100644 menu/get/osp/vm.py create mode 100644 menu/get/osp/vol.py create mode 100644 menu/get/psirt.py create mode 100644 menu/get/redfish/__init__.py create mode 100644 menu/get/redfish/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/access.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/adhoc.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/cache.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/configuration.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/endpoint.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/fi.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/server.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/servers.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/settings.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/summary.cpython-310.pyc create mode 100644 menu/get/redfish/__pycache__/ucsc.cpython-310.pyc create mode 100644 menu/get/redfish/cache.py create mode 100644 menu/get/redfish/endpoint.py create mode 100644 menu/get/redfish/main.py create mode 100644 menu/get/redfish/template.py create mode 100644 menu/get/redfish/uri.py create mode 100644 menu/get/server.py create mode 100644 menu/get/ucsm/__init__.py create mode 100644 menu/get/ucsm/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/ucsm/__pycache__/blade.cpython-310.pyc create mode 100644 menu/get/ucsm/__pycache__/blades.cpython-310.pyc create mode 100644 menu/get/ucsm/__pycache__/chassis.cpython-310.pyc create mode 100644 menu/get/ucsm/__pycache__/chassiz.cpython-310.pyc create mode 100644 menu/get/ucsm/__pycache__/endpoint.cpython-310.pyc create mode 100644 menu/get/ucsm/__pycache__/inventory.cpython-310.pyc create mode 100644 menu/get/ucsm/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/ucsm/__pycache__/manager.cpython-310.pyc create mode 100644 menu/get/ucsm/__pycache__/query.cpython-310.pyc create mode 100644 menu/get/ucsm/__pycache__/server.cpython-310.pyc create mode 100644 menu/get/ucsm/blade.py create mode 100644 menu/get/ucsm/blades.py create mode 100644 menu/get/ucsm/chassis.py create mode 100644 menu/get/ucsm/chassiz.py create mode 100644 menu/get/ucsm/inventory.py create mode 100644 menu/get/ucsm/main.py create mode 100644 menu/get/ucsm/manager.py create mode 100644 menu/get/ucsm/query.py create mode 100644 menu/get/vc/__init__.py create mode 100644 menu/get/vc/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/vc/__pycache__/hosts.cpython-310.pyc create mode 100644 menu/get/vc/__pycache__/instance.cpython-310.pyc create mode 100644 menu/get/vc/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/vc/__pycache__/vms.cpython-310.pyc create mode 100644 menu/get/vc/host/__init__.py create mode 100644 menu/get/vc/host/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/get/vc/host/__pycache__/main.cpython-310.pyc create mode 100644 menu/get/vc/host/__pycache__/net.cpython-310.pyc create mode 100644 menu/get/vc/host/__pycache__/pnet.cpython-310.pyc create mode 100644 menu/get/vc/host/main.py create mode 100644 menu/get/vc/host/pnet.py create mode 100644 menu/get/vc/hosts.py create mode 100644 menu/get/vc/instance.py create mode 100644 menu/get/vc/main.py create mode 100644 menu/get/vc/vms.py create mode 100644 menu/main.py create mode 100644 menu/progress.py create mode 100644 menu/set/__init__.py create mode 100644 menu/set/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/__pycache__/os_image.cpython-310.pyc create mode 100644 menu/set/__pycache__/scu.cpython-310.pyc create mode 100644 menu/set/aci/__init__.py create mode 100644 menu/set/aci/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/aci/__pycache__/cache.cpython-310.pyc create mode 100644 menu/set/aci/__pycache__/controller.cpython-310.pyc create mode 100644 menu/set/aci/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/aci/__pycache__/mode.cpython-310.pyc create mode 100644 menu/set/aci/cache.py create mode 100644 menu/set/aci/controller.py create mode 100644 menu/set/aci/main.py create mode 100644 menu/set/aci/mode.py create mode 100644 menu/set/aci/ws.py create mode 100644 menu/set/cvim/__init__.py create mode 100644 menu/set/cvim/main.py create mode 100644 menu/set/cvim/openrc.py create mode 100644 menu/set/k8s/__init__.py create mode 100644 menu/set/k8s/kc.py create mode 100644 menu/set/k8s/main.py create mode 100644 menu/set/linux/__init__.py create mode 100644 menu/set/linux/main.py create mode 100644 menu/set/linux/server.py create mode 100644 menu/set/main.py create mode 100644 menu/set/nso/__init__.py create mode 100644 menu/set/nso/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/nso/__pycache__/controller.cpython-310.pyc create mode 100644 menu/set/nso/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/nso/__pycache__/ncs.cpython-310.pyc create mode 100644 menu/set/nso/main.py create mode 100644 menu/set/nso/ncs.py create mode 100644 menu/set/nx/__init__.py create mode 100644 menu/set/nx/device.py create mode 100644 menu/set/nx/main.py create mode 100644 menu/set/nx/ws.py create mode 100644 menu/set/ocp/__init__.py create mode 100644 menu/set/ocp/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/ocp/__pycache__/kubeconfig.cpython-310.pyc create mode 100644 menu/set/ocp/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/ocp/cluster/__init__.py create mode 100644 menu/set/ocp/cluster/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/ocp/cluster/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/ocp/cluster/__pycache__/nestedhv.cpython-310.pyc create mode 100644 menu/set/ocp/cluster/main.py create mode 100644 menu/set/ocp/cluster/nestedhv.py create mode 100644 menu/set/ocp/helm.py create mode 100644 menu/set/ocp/kc.py create mode 100644 menu/set/ocp/main.py create mode 100644 menu/set/ocp/node/__init__.py create mode 100644 menu/set/ocp/node/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/ocp/node/__pycache__/down.cpython-310.pyc create mode 100644 menu/set/ocp/node/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/ocp/node/__pycache__/nestedhv.cpython-310.pyc create mode 100644 menu/set/ocp/node/__pycache__/restart.cpython-310.pyc create mode 100644 menu/set/ocp/node/__pycache__/up.cpython-310.pyc create mode 100644 menu/set/ocp/node/down.py create mode 100644 menu/set/ocp/node/main.py create mode 100644 menu/set/ocp/node/nestedhv.py create mode 100644 menu/set/ocp/node/restart.py create mode 100644 menu/set/ocp/node/up.py create mode 100644 menu/set/ocp/ssh.py create mode 100644 menu/set/ocp/tools.py create mode 100644 menu/set/ocp/virtctl.py create mode 100644 menu/set/ocp/vm/__init__.py create mode 100644 menu/set/ocp/vm/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/ocp/vm/__pycache__/down.cpython-310.pyc create mode 100644 menu/set/ocp/vm/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/ocp/vm/__pycache__/nestedhv.cpython-310.pyc create mode 100644 menu/set/ocp/vm/__pycache__/restart.cpython-310.pyc create mode 100644 menu/set/ocp/vm/__pycache__/up.cpython-310.pyc create mode 100644 menu/set/ocp/vm/down.py create mode 100644 menu/set/ocp/vm/main.py create mode 100644 menu/set/ocp/vm/restart.py create mode 100644 menu/set/ocp/vm/up.py create mode 100644 menu/set/osp/__init__.py create mode 100644 menu/set/osp/main.py create mode 100644 menu/set/osp/openrc.py create mode 100644 menu/set/psirt.py create mode 100644 menu/set/redfish/__init__.py create mode 100644 menu/set/redfish/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/redfish/__pycache__/adhoc.cpython-310.pyc create mode 100644 menu/set/redfish/__pycache__/cache.cpython-310.pyc create mode 100644 menu/set/redfish/__pycache__/configuration.cpython-310.pyc create mode 100644 menu/set/redfish/__pycache__/endpoint.cpython-310.pyc create mode 100644 menu/set/redfish/__pycache__/fi.cpython-310.pyc create mode 100644 menu/set/redfish/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/redfish/__pycache__/server.cpython-310.pyc create mode 100644 menu/set/redfish/__pycache__/servers.cpython-310.pyc create mode 100644 menu/set/redfish/__pycache__/settings.cpython-310.pyc create mode 100644 menu/set/redfish/__pycache__/ucsc.cpython-310.pyc create mode 100644 menu/set/redfish/access/__init__.py create mode 100644 menu/set/redfish/access/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/redfish/access/__pycache__/fi.cpython-310.pyc create mode 100644 menu/set/redfish/access/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/redfish/access/__pycache__/server.cpython-310.pyc create mode 100644 menu/set/redfish/access/__pycache__/servers.cpython-310.pyc create mode 100644 menu/set/redfish/access/fi.py create mode 100644 menu/set/redfish/access/main.py create mode 100644 menu/set/redfish/access/server.py create mode 100644 menu/set/redfish/cache.py create mode 100644 menu/set/redfish/main.py create mode 100644 menu/set/redfish/settings.py create mode 100644 menu/set/redfish/user.py create mode 100644 menu/set/redfish/users.py create mode 100644 menu/set/server/__init__.py create mode 100644 menu/set/server/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/server/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/server/__pycache__/os_image.cpython-310.pyc create mode 100644 menu/set/server/__pycache__/scu.cpython-310.pyc create mode 100644 menu/set/server/locator/__init__.py create mode 100644 menu/set/server/locator/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/server/locator/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/server/locator/__pycache__/off.cpython-310.pyc create mode 100644 menu/set/server/locator/__pycache__/on.cpython-310.pyc create mode 100644 menu/set/server/locator/main.py create mode 100644 menu/set/server/locator/off.py create mode 100644 menu/set/server/locator/on.py create mode 100644 menu/set/server/main.py create mode 100644 menu/set/server/os_image.py create mode 100644 menu/set/server/power/__init__.py create mode 100644 menu/set/server/power/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/server/power/__pycache__/cycle.cpython-310.pyc create mode 100644 menu/set/server/power/__pycache__/hard.cpython-310.pyc create mode 100644 menu/set/server/power/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/server/power/__pycache__/off.cpython-310.pyc create mode 100644 menu/set/server/power/__pycache__/on.cpython-310.pyc create mode 100644 menu/set/server/power/__pycache__/reboot.cpython-310.pyc create mode 100644 menu/set/server/power/__pycache__/restart.cpython-310.pyc create mode 100644 menu/set/server/power/__pycache__/shut.cpython-310.pyc create mode 100644 menu/set/server/power/cycle.py create mode 100644 menu/set/server/power/hard.py create mode 100644 menu/set/server/power/main.py create mode 100644 menu/set/server/power/off.py create mode 100644 menu/set/server/power/on.py create mode 100644 menu/set/server/power/reboot.py create mode 100644 menu/set/server/power/shut.py create mode 100644 menu/set/server/scu.py create mode 100644 menu/set/server/tag.py create mode 100644 menu/set/ucsm/__init__.py create mode 100644 menu/set/ucsm/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/ucsm/__pycache__/inventory.cpython-310.pyc create mode 100644 menu/set/ucsm/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/ucsm/__pycache__/manager.cpython-310.pyc create mode 100644 menu/set/ucsm/inventory.py create mode 100644 menu/set/ucsm/main.py create mode 100644 menu/set/ucsm/manager.py create mode 100644 menu/set/vc/__init__.py create mode 100644 menu/set/vc/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/set/vc/__pycache__/controller.cpython-310.pyc create mode 100644 menu/set/vc/__pycache__/instance.cpython-310.pyc create mode 100644 menu/set/vc/__pycache__/main.cpython-310.pyc create mode 100644 menu/set/vc/instance.py create mode 100644 menu/set/vc/main.py create mode 100644 menu/settings/__init__.py create mode 100644 menu/settings/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/settings/__pycache__/main.cpython-310.pyc create mode 100644 menu/settings/defaults/__init__.py create mode 100644 menu/settings/defaults/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/settings/defaults/__pycache__/get.cpython-310.pyc create mode 100644 menu/settings/defaults/__pycache__/main.cpython-310.pyc create mode 100644 menu/settings/defaults/__pycache__/rfd.cpython-310.pyc create mode 100644 menu/settings/defaults/get.py create mode 100644 menu/settings/defaults/main.py create mode 100644 menu/settings/defaults/rfd.py create mode 100644 menu/settings/groups/__init__.py create mode 100644 menu/settings/groups/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/settings/groups/__pycache__/clear.cpython-310.pyc create mode 100644 menu/settings/groups/__pycache__/delete.cpython-310.pyc create mode 100644 menu/settings/groups/__pycache__/get.cpython-310.pyc create mode 100644 menu/settings/groups/__pycache__/main.cpython-310.pyc create mode 100644 menu/settings/groups/clear.py create mode 100644 menu/settings/groups/delete.py create mode 100644 menu/settings/groups/get.py create mode 100644 menu/settings/groups/main.py create mode 100644 menu/settings/iaccounts/__init__.py create mode 100644 menu/settings/iaccounts/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/settings/iaccounts/__pycache__/add.cpython-310.pyc create mode 100644 menu/settings/iaccounts/__pycache__/default.cpython-310.pyc create mode 100644 menu/settings/iaccounts/__pycache__/delete.cpython-310.pyc create mode 100644 menu/settings/iaccounts/__pycache__/get.cpython-310.pyc create mode 100644 menu/settings/iaccounts/__pycache__/main.cpython-310.pyc create mode 100644 menu/settings/iaccounts/add.py create mode 100644 menu/settings/iaccounts/cache.py create mode 100644 menu/settings/iaccounts/default.py create mode 100644 menu/settings/iaccounts/delete.py create mode 100644 menu/settings/iaccounts/get.py create mode 100644 menu/settings/iaccounts/main.py create mode 100644 menu/settings/main.py create mode 100644 menu/user_inputs.py create mode 100644 menu/utils/__init__.py create mode 100644 menu/utils/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/utils/__pycache__/doc.cpython-310.pyc create mode 100644 menu/utils/__pycache__/main.cpython-310.pyc create mode 100644 menu/utils/cli/__init__.py create mode 100644 menu/utils/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/utils/cli/__pycache__/bug.cpython-310.pyc create mode 100644 menu/utils/cli/__pycache__/list.cpython-310.pyc create mode 100644 menu/utils/cli/__pycache__/main.cpython-310.pyc create mode 100644 menu/utils/cli/bug.py create mode 100644 menu/utils/cli/list.py create mode 100644 menu/utils/cli/main.py create mode 100644 menu/utils/doc.py create mode 100644 menu/utils/main.py create mode 100644 menu/utils/test/__init__.py create mode 100644 menu/utils/test/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/utils/test/__pycache__/main.cpython-310.pyc create mode 100644 menu/utils/test/__pycache__/run.cpython-310.pyc create mode 100644 menu/utils/test/get/__init__.py create mode 100644 menu/utils/test/get/__pycache__/__init__.cpython-310.pyc create mode 100644 menu/utils/test/get/__pycache__/collection.cpython-310.pyc create mode 100644 menu/utils/test/get/__pycache__/collections.cpython-310.pyc create mode 100644 menu/utils/test/get/__pycache__/main.cpython-310.pyc create mode 100644 menu/utils/test/get/__pycache__/name.cpython-310.pyc create mode 100644 menu/utils/test/get/__pycache__/names.cpython-310.pyc create mode 100644 menu/utils/test/get/__pycache__/summary.cpython-310.pyc create mode 100644 menu/utils/test/get/collection.py create mode 100644 menu/utils/test/get/collections.py create mode 100644 menu/utils/test/get/main.py create mode 100644 menu/utils/test/get/name.py create mode 100644 menu/utils/test/get/names.py create mode 100644 menu/utils/test/get/summary.py create mode 100644 menu/utils/test/main.py create mode 100644 menu/utils/test/run.py create mode 100644 menu/validations.py create mode 100644 requirements.txt create mode 100644 version diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..f571110a --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +AUTHORS +ChangeLog +.mypy_cache +*.pyc +__pycache__ +*~ +.#* +*.egg-info +*.spec +/dist +/bdist +/build +/results +/Notes.md +/.eggs +/.stestr +/.tox +/.coverage.* +/.coverage +*~ +poetry.lock +*.toml +*.code-workspace \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..8c646c0a --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# iserver + +iserver is command line tool using REST API with various Cisco products. + +Important note: documentation is partial and it will be uploaded again once sensitive information is removed + +## Features + +Compute +- [Intersight](./doc/intersight/README.md) +- [IMC](./doc/imc/README.md) +- [Redfish](./doc/redfish/README.md) +- [UCSM](./doc/ucsm/README.md) + +Networking +- [ACI](./doc/aci/README.md) +- [Nexus](./doc/nexus/README.md) + +Virtualization +- [OpenStack](./doc/osp/README.md) +- [vCenter](./doc/vcenter/README.md) + +Containers +- [Helm](./doc/helm/README.md) +- [Kubernetes](./doc/k8s/README.md) +- [OpenShift](./doc/ocp/README.md) + +Orchestration +- [Network Services Orchestrator](./doc/nso/README.md) + +Security +- [PSIRT](./doc/psirt/README.md) + +Other +- [Webex Bot](./doc/bot/README.md) + +## Installation + +- iserver binary is compiled for Windows, Linux and MAC +- download the latest release from the [Releases](https://wwwin-github.cisco.com/emear-telcocloud/iserver/releases/latest) page. +- move binary somewhere that is on your path (e.g. /usr/local/bin) + +If binary is not available or you prefer using source code, clone the repository and run iserver using Python3 with [required](requirements) pip3 packages. + +## Requirements + +Features using Intersight API require [isctl](https://github.com/cgascoig/isctl) and OS installation requires isctl version >= 0.1.18. + +No requiremets for non-Intersight related features. diff --git a/iserver.py b/iserver.py new file mode 100644 index 00000000..579d270d --- /dev/null +++ b/iserver.py @@ -0,0 +1,43 @@ +import sys + +from lib import output_helper +from lib import settings_helper +from lib import my_servers_helper +from lib import my_server_helper +from menu import main as menu_main + + +def initialize(): + my_output = output_helper.OutputHelper() + + settings_handler = settings_helper.Settings() + if not settings_handler.initialize_settings(): + my_output.error('Local settings initialization failure...') + return False + + my_servers = my_servers_helper.MyServers() + if not my_servers.initialize(): + my_output.error('My servers settings initialization failure...') + return False + + my_server = my_server_helper.MyServer() + if not my_server.initialize(): + my_output.error('My server settings initialization failure...') + return False + + return True + + +if __name__ == "__main__": + if not initialize(): + sys.exit(1) + + parameters = [] + for item in sys.argv: + if len(item.split(' ')) == 1: + parameters.append(item) + else: + parameters.append('"%s"' % (item)) + + USER_INPUT = ' '.join(parameters) + menu_main.run(USER_INPUT) diff --git a/lib/__init__.py b/lib/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/__init__.py b/lib/aci/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/__pycache__/__init__.cpython-310.pyc b/lib/aci/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d978d4bb435925edf7ed83718c4451db886a3529 GIT binary patch literal 140 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!H%vsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oe0*kJW=VX!UP0w84x8Nkl+v73JCH%e JOhAH#0RSD*AF}`e literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/aepg.cpython-310.pyc b/lib/aci/__pycache__/aepg.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a8c62698c7495f4736f29ee4632517b55bafe7a GIT binary patch literal 2204 zcmah~&2HQ_5GE-~t6i_xK^(YoPy|7L(5fj?v}k(>45Mypq?fn`?31v8K#TNRwpLn` zl7lR?r=&+eKyPtxd4;}4Z@l)Do_k7xrZZePUTO(e4}!4u|r_|^4IU_ zZ=n5we`bdVf4+lhu7h|;B$4zv%x5enlI@VlOTm6=yghLr%!J8}UmElI(1&-OM(qdZGRm6gTjXt0&CnHQms^8rkQ7$j*( z0&<7Eq+1cS*N0^yE*vCkG>DkxM&J$(KY2aPsxt2lx9&BG3A1X40}R)rrdc znNj*g>3*K=^+lTX1vt1jdTPTY$%?E>5`4Qs(V^q_E{A&We9xtjF*7(_$TvV~$RTN{ zq^ESkD%!ATh?`;X3zaHFQ6+^KDv0{VKvnZ#jP-I=M4sm0Nw+~*PmGL1G!-qhtzL07 zNz1yZd{{PkxJyGi{&Wt({~o&p36H;p^ey~p$P02tCahtS)I@jiJ{tA|dEA|NjVI|U z06t>+X5%qJVePn!I{>t0vWTe0n~b=_6t6(W6PcMRD+YCD4wQ8Hh&k9z?17vIyL?5| zm>F{oLH@3+^J=PN-0RZr>G=4TyBMk!SQo&`jy$cv%3pX*>x@!ze5>LO z2bL}Z&wHl~V&`x{OIvZUf3mT;J+MJGl%f(**ZNYKRO=q3BJS?zWhs9uHj7k@;@*KU zk5XZ(owC-cihG&as4D%vFiL`tI2ej5J=nDz3p{R*(#>LjTdV!JGXnWgKT^Xz%SSpZ zZDt@V0C)<<2Xlrd^(G0V7@RXSqso z@A*I-ckaM6T@VelH%K{Dv8zjsjSm><=j9WnL7~}v)rD)h816~2?g|5)b;dJBb<38$k`2$j(BLf%>Ee(hG^v*w;x R9kt=wG=Oz?9)rA2{sp40C!GKQ literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/ap.cpython-310.pyc b/lib/aci/__pycache__/ap.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87b77e86883e805a1709360f29219d3522a3a19e GIT binary patch literal 2073 zcmb7F-D?|15Z~R~`;aVu#1^jQk`ic2do6KFAB}1n+>ke6upuB+j??X0J^OSg@19&N zPEfG>=>Ng)TmG6p7WTDI`4>`%J9DSha_W@!#Lmu*W@qQ)H*?wIVx7SA`^Ho88*qQ% z%lu=(%XhH!Dv%dM5J4|sowF_xY@hg61oAu2-zUBSu_Rq8NSBGaV8XhfT?;raY~VO> zj&Omqg(qqkr0WO@78lIwv(YGtqcD%NbWdf6aUwero4W*gT)VI|`Y%X90-*ck747)c ztPiswyfqSxDl0xST+8IpI7v1LV)2S72Ts57cei`TVG{SESVvh;$Wxj0VlCCFRJ|nb z_rfUdg`=&}nel=kPUAcX@P3V?PA4D#)8VamdUqVh+~6u5Zvs=0BT`U7FX@!!v|#6$ z0fr$g1GQTe*ZLCD5zNI)=Q#Bx6D;()Eu8O!IGY>y-JczP!n%khF z(LjTGbn^8*(fsT2J0YSAnA9@F4O)dL$e5_Lf?PqU*AQyKO34aVtYBEX0hwBu48dCD zd-B6z$_GSPztX84lc`hKAlsO_P-mxb+oW&{E@+Dg-Xf<&wQt`Fw>8r_d0aTcZjmb{ zoNFpT4lpCXfPIkHzy<(wOw~(#0~tNG)XS4i@WU&-D}ZSwUnkd;l2Wn&l17WnB;<$} zo>&x1mki{~ZIau#x5zn#eFf}WS5^TxQ*yGIJB1}4h*fBvwMzz(T2SU@r^^pdpN)(Y z4@H=VzHMwFb)*avso_|7!$&I4y6zaTD6*lchk35z{y3LfEklyu(5J5<#pE@D$~YBd zCbeqc{!CBmGvouWRzT+fptL^U8FDlTpuuvf4DW|pcKP$sK${xUUBpI&_TN3oBj)#E z=?0JjW&xy_T!RR3TiyZSwUg{8seqyJ`$+WKNjU6_aAyZ?ps@y-eEZ)ar?=Wk7KMr4 z0j9D9_gKgB%y(6ph8lu3NLFaEK0<;ma@(H@hZuH_?f|J%P8sDl zp2exdI9p;K<(>zW)VpbL1{w}^-g0~L)&EHD zomR$)fYYOF<40Z;4*|0~nfVl;0#gryVJ5~2@{J%k8HY*rkMht-Y_<|5>IrhUK9?L; mNnvy1D!+&xpr~%ud1Jej!xyF8?>lI`c6IYkc^W-iC4T{K{|Z|G literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/api.cpython-310.pyc b/lib/aci/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a0026363c79bfa036415adbf6a9d6cb372432a8 GIT binary patch literal 15856 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 S77iW10PD9&zxgr7bN>Y_6n=C7 literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/apic.cpython-310.pyc b/lib/aci/__pycache__/apic.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4242efcb4fcde35c7cb06e0adbbee2b0a5a518aa GIT binary patch literal 2678 zcmah~OK;pZ5SCVt)oNe1*YCIExbDV@6Wf=f2#Ta`ofa@$11?&CSU`|P+LlAER7&gA zfqH7L`4922e@WM#+H+4Wf_8@TYMo0eLBnrmNQxSMpBOcpt_IiA)4%AmhNk_F&fRMc zoM-SPSGuNAjp|$zI?;8+6~GlzQP==%5JO>;o5CWN!WOqhl~fhBxg%<%rf`+JqE6}x zJG>#9q^WR?w?vz?6?XZU7$@Tj*ZG9#kdDF)J}IWil)_CuEoR7!!Yw{4=E$7FZ9Xp+ z$b!OSd{HcsC56ZNvREN23QzD=u}0Pu?(lnJovbT7$?uB|vZ3%4|3qw(O@*iVr=m-` z3eWHdVvB4kJj)-7N92*hb9`GoCXW@K=TF2A+0nHZ8eO1^Z#25ds;te%S&h|MhfT2= zHpkZ40$XA$Y>jQQF56&R>=Ap+c3AV*S+Yx)PPFdwAGjl3J#R*XG#;eh1>-T35O8^P zKJuzT)KA&ZDI}bPrD@ndPXHUw;}9Ba-w!Sr0DC_YBI*OG{m4#FqTnUNArsHzn1_L% zhEe}mMrR?%&W$f+NYB|_6$g=>eb@wvBc?M6i42Ee$ry8lyDmAG2MkfZfsQpGGCe@+VPHsZE zf}?{#=>i7eRfnev&ptfKAt)i$F7?dG?5s-lw??LUmDIR2Gly2*>fl+aeOWC%C$k_{ zqZ(K@v#2)EwDbZ?))=G4* zMC&EGKSWf6np;O*Be#*tADXhT+@$s0f@ z5XCo26M0Qsdxc6QZhLMVM(4Q!b4wH5D$*AulDBWQ;$8TC%9+e-K5V^v%nWSR!?CGIfzDp3q3?P0)=xA8PklpaM-X%R(^lc`}}r4KkRiX2j( zbcQ*q4wWK@Hs2uC?hg4jPqUi9TW+a)}6#& znLxRXX6nPqR181`j^Z(#QAHfpI{NV8dQhOFkBikwR`f>#-kArEvLcSU9xW)wqpe7w z%tuot>YOVwsQpnURp(xj!5_k?N>}o>8u*J)gt^1&l3ls;v>@ddD42wTX=n`{?h4%4 RA}ZRCSl1XS`Tvpg=YM4Gf~o)j literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/bd.cpython-310.pyc b/lib/aci/__pycache__/bd.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08fe79da72859ca7ec0817a5b0a52f1df418417a GIT binary patch literal 4098 zcma)9Tay#V6`t<7Xf&(cm0`IovEy}ulPEC|y9jX{LK#?-G698Rag|G1XFQs2mSIOD zZO>>4s*x*I@XCJxzwzSVk$;e?uDs>RFL{XHa8<~6dbEoq7Lrj-PhU=-?$dqF`9Ad* z7Xu5=H~;!u{MAn^>z~w^erz;8#+zf%5|&`8)uAs>S&w%(vwm+0TR0Cb;XL3STd)nQ z<$eoUtKDL{o(#e}G95@2Q`hvfulOcTq#LaA7}WP~-^rq1ADOCu;b*!WVUX zJrRfnd~1+wh($>H;;>i}%c#{wQ@nw(z-(egH!i6}Y{~V0FG{j@%%@hTI=z?i=1mmB zDy^_8v5^hyDQma5Zua_N*C+{v(V~yd_k{Vdo5=#gPA=2i+DrReVIrPdst&c!T9-fC z+>X*@GfwijzbWLdOgEEUs$Hoz)1#iZ#cQnj8kN$z3tNVkI$T#Jx#K%WMu7@HReW=uUhNY7w?Vj zE!^eTZ0sb~*exCOHO5|vJ6*-?u3Dvs*DbyC*3QY&74E9_m<#U-6E#!wQLB@L2+mt2 ze{7fT6UMBa6NOW9u^<}ok;O+GYjXI=Qo9q}-o3QGVUACGNl!#Y)N(WzndZr$u??gSqM}eqcUZ_=EyBVP|KgOQGZ^txfBKdx+Ubh*Z0203n{Ign?{_|m68^i2 zW{bDg658gDo-)l6Q>zM!2koCvqh41;7k)=`Nr`Wbelv3wTe6sSj(p+^`RVg%KaSG; z0xFdjtYL4<`z=>_q`gja<21^1*f&U%LVM9*ATy!8ysru=S~W$Ns+W6F7Hvrp_Pcjw zT;!djGw!&*qF$O6)DBk5^~#L&WP55An&<63@oH-pAfEpWMX=~F&Yb7I?J$o!e2M$a zsrl?ETMHT-5A&G!AIBa2^#44knUEw0CZ{(}{7Y2ey4Dl8DBRR8Ih=8E?34~&V9B<* zI#Sw?S?L%T^GmzB)I*rp;_65Es5hzZnse+lXAc4{c4W4visD??CKdG#sh|*^a*E?G z9n$1TFF`IRhr)s2P#TC^{#S>O-hKT+OlHTF3ilop_h^`7IEl){bh|(#BW_JJKH+Ma zAqQ_*J4lzvR!-&5x30i=a#p>ZofGJo#aqqk;ko1gKLP5b%D*u>0rRyG-nNkFdwH>| ziAlx`12mPuK^CcBKo?~J^>Y-XwfU{jtDbR8x*dAWjjW(TITP8GJz`^Cu#!I@%;N-i z3x&+0tO&EHCxHluUh{c4M;SY&qgO_ zEPBP1n0#yRq1&WfWUP9I$^n=`;r0SEoC#*QQ<(Aj*qdNR4VdAVHG>)T(%Z)jLIl68 z8_e+MFvAwWj1s^OydZR9>MFHNfZOWo&IzOd2R%R|w-M*c~ z7t^$VuXAXBlMMg^|}s(xjIZpH>35`Wpr>;YYnF z)Lr?iqZS8_woa9R~^T^R$Wo{Q75SQ0Sb_`9Bg8s-ld)v6_g+h zVyL%JYXvU?R1x&4_o(KqjxP(d6}eMrRxDt<-9$5haTwi?=LQ(Sqs zO!C)W6{4esPj9U4MfGUm8b$HiHR6S%`o)_!)=YvKH9pI>v;Mto4T+{0`MYP=Oc;-r z_WDipEJn^9IC5^(yiP&BwvPFgP7`>B8*58_LffR+G<^3K__fyg>hoa#HMD4SvY}FL2WG AqW}N^ literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/cache.cpython-310.pyc b/lib/aci/__pycache__/cache.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..692f062ddc11f5580e6c37868c3a3d12c11e0f30 GIT binary patch literal 5556 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 M{2Vs1V9nY81I4lSyZ`_I literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/cdp_adj_ep.cpython-310.pyc b/lib/aci/__pycache__/cdp_adj_ep.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79bb6424f81dedc0ef5b83db163222204989ab77 GIT binary patch literal 1561 zcma)6&5j#I5bnQe&pKWQ78J=r0wmZdmf~2EA`U1apar2wkr7Ii!{BH%o^E^FJD!>C z9xr$`K4lMF@(u|%o`PrK+E-58I3vMQHD;Gx1cDy9y1Kf$y8P8wU2Jc+35;KU{2_hN zBIGArTpS!0AH&bR4MGt`GqRu&rQ~y>nBpfy@#idJN<1e0;Aik5ed^m;F^l(gR%)A~ z>EbvKcoVFeL{t$tzSRVy5m!P5CnOT8ty(HPp;4eHgudd#Jym|9=AV_LlwF92I)>bX zpL-ufMdq}oioT#ViJ4*`xgsD%BLhVs93MfJ60oQKW#JT9r%f_k6DsBDtC2OB~;dC~&0s?+dEQ0*&oxKmo2T5kesc~sBR{BV1 zW8<_v(srDg$v8=2@BF&k<;sU~Y;se@aR32a2%<|Rd~JIC`WYa%&wMTcg9q^P2ACV5 z%%FJR(KRz<&1?24c^0lkO>5C3HLt}zav0Vepkbr_)rhA_3CQcChsraRd#RRXroZul z$rVf@PZrv@^Q1CI`e~Nrku0;M0%utk7UoF0>dR%4d6<)G>3qwr+z1XuTcCU~nLkvI z{!*WM4hS?D^#i*Fx%%!R$&;B@aWR?ewDRIWubdYqpBA2j-Z*c>74&~+rmM3`C8^HS zRjhMW7ACI%z-fU_4vP>{u@llR73}!tIe`Ch_(_Ujo(;?oI%Nawx1cECTg_@d<=4nM zK*r4pXcA^x2enlE1zWf3mLf}Hd&s{T@{xfBz=uM-whqCUz2r4{DQeV7kEozWUeQ<3 zX@~FD!hV1rk4Y8a{G2Lz!0ZEzg=-~y$m-VU_*PYv1u%CtEDJT*b;G<+8fSog2-F&y z+*Ly}9elOxo*fSkm)fodRbl~w`{};Pl-2o-&3fRLlges6Xjp%L*Fnn!%>ggXLM2t= z+euYfGg(&JSqex%10gbg2LZiYL5tk=GAT=_i@lBup6R^5wW&AoMnNz77Uqjh*@4Pw zJB3=JxtnBJ@pZgdW|aXV`WWRO=L40SHBCT?8HuHYXGc)hkY*ww75sb#?@0@uE{WQwWK|xuAspf!e zB91sdgLz6Ch?5=U(+KQigMhXMQ#}SEPy=(+ARKdYh8mPp&VV!Sa2L44OWXtQ@+mm0 ztljmj)5+2Z!`9I-vYG2J6$8Q%U~&B$5Y3cGTGCu;$;FfP)n+?P;${@9C~IyFVW=#MxnbnX<~ckAbG;9Tu& zN+HtoXGShI){B5|0e%l;bZ@-u%jb3PtD6S7O&GcP+kjjrYdzV7K_G34Hk$JlHLMdIDd$1rK(Mua58o z@ZYqVKU3G}0-FIqg8PvO=8hNFrG~SZtjcdFsO)53s^r?2_L03VY z5|L`Ea_KYMWpcqFnCT$xL|Kx_$^Wx?g<^=m^nM1z;{aYp* literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/contract.cpython-310.pyc b/lib/aci/__pycache__/contract.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1f62b84c72ee94866722d12ff0cbae03cbb3bfd GIT binary patch literal 1686 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 literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/if_mgmt.cpython-310.pyc b/lib/aci/__pycache__/if_mgmt.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5aa49036855e60d02d02fe73187be5eef212d06 GIT binary patch literal 3331 zcma)8TW=h<6(%{?9jz|5Y*(^lXVE}tH;!fWrA=Meu%R}o0DD_R?#n{OV6^1QBhSu^ zIJ0TBSfK^t*8u$qa^Lda_o9D;uYEH53mUXezr)?tY8|`H40w3RLmran@{z^za>Ve7 zzyGcG*UOCkgBlk?!fDMmUlCM5Of31K4sFA z{tG63zJfN^<|fLD!}yuXN~O^XcVziU9{sWe-*}wO8&`JoTIqh$ zQ=cTmtllYxd0q8L$HmV<;~`2#M6oWHtSjV-6w-OYyN+CyuJpjU(wD&t*7am48>oF5 z$tBc*Y|3TSq2$=(nrZG%7kzR#s5?CYt+S7K7i9;f>VVYjh>zKrOa7(ctQHF`XQAaD zd3GGe$G#Mxfn=ber47ljxYL0Nd@@cdyU_sa(;jyF?MTxpO&G^%p4M@!X&2ffLVGgK z6>fjwbDu|iboHV+w`T|F z(RpScMH`*Pn)T0MBs+CrEH-3%eJrLmJA%2$q(_3xJsrXIZ94)rjLOF_>=Exf*Vw5G zj*W@V#yeKikEFB54$1V+*pcog`vv>m@~MY$&Y3%=nr|Y4H`z65rl^r5Qbi77|d>!K`R_>;S3A@6Keck@Cjs<*07jGqoRP7IkZ4i4{-g3{+mPV^H-&5SOnBm(%aRUh~$tD}?1k4?Us@x1xOG zx}%R4T>F32FC-Fqn*z>ye1kLiL-N1yQ<1{+DT80ceKr>GOb9>nF}yT(#_oM~+=R^8 zWM@peFFAP$oIl|p2{7xTJbXjmfSjFi8c7;u!_o-8rdU|AQt=LH(@JUF`CPe-7R`21 zuh_L$5j$(og)ZeK^a-?9@3Y*Om**{T>*&9NQ7_I%t<&s1c0O*}ZeQ)RmrRhzL7MN? zV1{+kQHMszynCtNE9#wRNuH~$GaMWsu?1qp8Pr4L+K7m%d{92sNr|amRVpQoU)4!H ztjtpN`?T&oOY=j>fGfWq*5$C)x8Rho`Q2A=3FLj>;1R~BS^io#u~--paNJy{wz z16muGz{dD}!strBM^Z5?jrXZmDmTt&O6o1@3{;*RWJTT zPGUrVSs*;SH%LbM-zKyZ=Rs_jj(hfgXnQty^mSU&eXdR_166d6s1)(+29&+Hp z2I2Y{u;3*JW_yGMV~$L^4W3X!Sl%MJ#qV{>sZiJ@^@mWRKLSCN5nyY2Mj20OU1bOe634H5wbL*dzh$2$|ga}=- zb7Zz#dycN^`ydfwNZ@y0yRIuDATRiDHk?T<{si3J`c6jw7U0reE#N)`Gv+YnjZ-lN zUI(=R0NYCwmn7`!?6FgH1>ThM( z^-^Q(TXE-)&{R>N5Zr{39|^pnC>$n#_%HXLqaQ4||J}OuJ?LqRPN&@)q!l literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/interface_fault_counts.cpython-310.pyc b/lib/aci/__pycache__/interface_fault_counts.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84b7d59b1d49abcdce751c83787228a93f3b76af GIT binary patch literal 1664 zcmb6ZO^@3|bY?tuylys?qTN*&30MiXk`e6+iBnZj(N-WNlndfwQdwTlIGtU`PG_7# zBIndz`yaN53%>&KH|ENTzW@^O-h_Nrix88{n>WwzYu;DAzaJ4;KmPJ_ey2mouXx#B z9$X&5HtzrsM9`9qX+kOaf(RzOmqd6kSi%JVn#BHZz(Zncqp}{QPh~lgI!Ds>S}VK@ zR7nyl2#AMH8BILFh5wQyTm+&6r!Ocd-m?c^R*lp}mdnqxY1y3D)2cCpoNZ}F9F?EL zcHTDRlD1UPSF|N56AYjy2tY0fDD?*5X@H(8k#q`B3Myk?qaN#hRgbI(AMN3|P7Ab| z=FVuEmzgoi(VOH#mEd8_EH|<&GzTp|5xob;@1LAM7+z(i8s^I6^-##?vK%TS^>e9* zrMehqxf-g~19z<5pUiBSrm9j+n)>*%06>ohG@|pjZwku&757eXP!wHq!NJInAeBGR z1yf|Ib5SzB_7LCjG z`$*ngy>WJ#gaDR82Pkm5roG>x)a7Hx0&-C! zlR*$t-VbSyayI|?#zg&xq8xL!TIecnmp=`NfYNRm=Bg!^r0|c(!f(knZT;7D5ww9I zQ=$*C&;e)1(56?O{s4H{wd=8!bit3vYeu29fsQ$6|=KRE$*F~v#J&nPct)Tr{>U{x_BUegct~ z;>7jY$+FKLoSd5V-v(+dvL@3Mo}S!te9IYNqpWGPx|lW+n-@kHv3)eRn^ui&V|}T0 zt#u#pI9#SbfQP^UupN8}PJ-Shx6N!KZFh4Aw!ToNQPpUw%u}eDDjQ3Cd)Jgny4&;O zjr!3CVEjGU=0gCCu6~>bfAEk|{#VF3?Xm#AK<)g=IcI&Kay~!%pH&poK^)-pKrhqO zMrk^(#k54co2JjES-Je8Z-FZ=D$cttk8ylyEN1NizyV^Gl^D^`?;bnqAogHVstY$b W9pxqkHhj1={wb!=psFtEdw&DE0>|Y5 literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/interface_management.cpython-310.pyc b/lib/aci/__pycache__/interface_management.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f664bf6df5f29260c30c1664ba3da44aba3445c1 GIT binary patch literal 4320 zcma)9&2QYs73Yv#?k;!rt;mx6k!?_?S-6tX7X5Nu*NR*R0;G)_IW0h_V5yy1nKGAL z4Y^K4tcn2f)j+Sk*}di5TQ52G59p!5^w^XCga(b%-y3>&wTk701Rvkbn|YjhZ{GVo zCR0Q-Xu8kwC8Nod8zl$+ z0}=IvM60sNdmH@lH$Cvx?P%Os+=??HJ3(9A4f;{Gne^i<#h~R;|4tAG2cj$DY&Q!s z@fum$rf;9VEHrN8N$-FN!(-g=Og_U+Zarq6#b>$AOWfuGajb{^2dI*vkhiqUB7-vsRW@P3>%bIA}6Rpxj z%Q-A-9nj@hxCvV22B@oPjT=~*)q-gpvUypf%D!w1aVdndiRwzqE z93o{Rv~p!_CkM)c3N_nJ{IKJb7QY<@X{zQ<^>o4rPE+owLAU{h8rgq3~BTYxiBzazKuhelFWT*lAB(RVDg$C zfj11!1~B>|>sU+1i4D#e5FL)Uw5A_%Yu7j+w^##<+bhN$;}26OC5*G4+5>vC6@!;n zjAsbIqhD|bPAiks7LNKt9{X7!4@Bk{#?4o=q?f=I$JcuaU%Q%Kj}tEFeKozSoUqG- zEKqKcWis6FXCl4dEU7BZ*Y1*2*sYukpexk$q)FGtqKy8nMHt#w~Eu z=%2x;k4B@WCq|()Fy+7L#9(xpR>-TG&SK^qpMPSbX91&d246E`kw!eVPLJSkpam_@ zNW+qr6L;nt&uGpCEiIiRUA{?{T_MYAYyJS%gdMRyqtB#5%;?r5L#mhkum-F?f8vbW z14r+Q?6isqaXRLb0Z;tn=x+lX(Q&cWtf_LqyJ5VWf$3*SOB^VZ$KG70on)I2f;bjY ztKZ#6Ix=yNt!~y=Hl13}P2+Cwz6^SpT1tCDaOI>xkbbIa>BnK#eh|h7kRdOA(9e4P zOg3vCE&g1mMu#G0i_0sJDYM^GrT3)}v9dlCT)s`6Wf2Ga5nA6v z>u!^I(?Jv^ANyUvTG)$(vf8|->nBk!1)a9A+~2e|GsSZ$eTT^;f>Konl1gtBO-$%WRgt z#mrA_Gru;OhhDp`i6le_JE{W~(LflY3K*Er052IESf8Pm_?)!>o6F~E1rUq4X&2U9 zh7P#`qTG>d(zAv;-*eivpJIAStE$6l`47M2-t^QqO&ea6T}P<;M>LRyDC&VXl(C)y z6*)FaMI+&1ftQH<)dC9<=N7ksv(CUFlpHW*!Zq-eiA~Mhz)NIapyYzi15Qi+8sEup zjn>>4AIq04Z@h%AMz^14jeXG=!v=43LYZbwCVvSv@*0sf5X2gxqpX9dl8`cy@>kSB zkTpEWBhwd?H%Ly0TfR$#3Y{?)>SaDgSNeSrSD!#&+zZ>bO&3^a;&xsv+r-&l+m*_nRTTC3_-bz2ew{9{lQ`BfyRU< zDDsa`1tHT`TFp6~xO9Tk2`#VdcwbLY!S81BO?)Pw9e3U7Bd2|mPmOzavVJ}@Zthab z&F71b{hF6Fx*r5K<37rd-GHY>VeL;?v`_g`A$dT98N* z)G4`*Bt@&IMZX(rMd6xlhw;N*AjLs*E??Ohm6(l@*&AAOZG%vzu}hgapV=MaL(!qC zA7~?xY<2@E)Bp@6sClw5i9M$iPz_n^W=0ZkcER@req7#0i%7=)- zuyZVL;M6ErkE2wdBH>lL$9|FgmCM66nJ|#Y2t}$)C54x&hQl&al@bZ%s{B9%cz+}1 zt@b3wz7nqf0!=A?iUAb37oA0bfet_lLX%bgYyT^MXLJg5@SU$r-h!g0*+RK~w^^l{ zfocrjSFZ1O6W))AulxQ{KZpv6{(+H~F|9}`?-55?O#YV0IB#f<3Ta7y>lD^0)$J9e z54Y}Ks_eLS{S7T^HKzay;lBP^^X9>=;}2>bF+mvbi=O_`^A?7JA^MYq61aC|C>hz; zKMno*pU`{jn}f#5wx|L0f8%!;m=^z*w69lfSXFKow!1|Ym)>>V0Epu^fbL7y{{i-z Bidz5x literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/interface_management_state.cpython-310.pyc b/lib/aci/__pycache__/interface_management_state.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b89e90791c3f11c527b3fc260bec8250c067657 GIT binary patch literal 1756 zcmbVML2uhO6edMVR$M0qg0^dRD6(}a;Dej(RG>(Q4Jl9rXgsXOcFwdhLH`cNz98_7isJb*KG>0n7HDw6saL7Q<+Ze2;wm$oJm&SgfzN3A7)7`8icB zLViW%Vq>6u0iU@Aogji{WJV)O$s-~>!JZSrzV{+e@B!)izkv(Sp$z6oA*<&4b)ZJx)@2nB>Vs&SY)}HnFmw zdKb`9#sl`@t8Z+{F|DYeFK9(#Pk7KXL7?Y?05I#rZ3Dcm5>cpThm)B-7fjMS%64>L6yCaD^#b1&oBYd7l?<=y$hg>kHMW#iaK_X6lPXh7R^`O&+g zbN775r6}QcyjmTlZ$X$qUVoq~PmvWmY^}PW&J+wF{uh!*ZU< zXHg5~Lt94cC_E`jh$e1ZLv=8hQn;WNZL@7)zb=z3@=ry2ATT~(m3CfQy#Y=+ubeyo zk(M%d?1>b08X&bHu5C2&6>%{-mZ^1oDi_9am5&R@K(39O4(r3+o=6M9|C@vV$PO%x z3p6y>pbIHq4{1m@XvgbN&O2w^TkgFxNB;pj#dMuFbO1`VN#7C#0Ti#iijCO~vf@bc zV*-*7BP6f#1$*JGf+`TCBzg;p4>BZG_*15PVCB7JSZ{AoUU?LX9qhkqRg$MpSfG_jh0z{{7o*O%^{^y zY&W^xPI0ffzrACczYEk%Bycc=*tvFMtyUvongMcPT-_#~ahV_*tIhdR>q6@fK<P>N1I>phZk_l|KuF?;4Jhxa4`TG_;|))`dYoZy!Ss@*`@t%fCYyh#j$J0@vIPK zhH@v4PoOHB6@3M+RYy$YgMYy>d=)j;jK&um32uIa18i3aB%~@ugdi#;SfGKMWvkKb*t>BuJ2SC8 z5xbhbqPKmAmOGw;N8sMKT=5D>1deBtCIN~NPHdlZ=A7eWf1ka@`g#{Zd-3O=(%lY1 zzc}S`qo8~UUEhR(BaSmP$0LlnuXT{7?utmf&EwZU%VEz%Q z0H)t|_wJ03l1z?MsncT2#fiwqQVVq=)HsuqagxfhJTEYwKdms~fu4M`5$`YQBo|omxdwbK_ zCyC4i|7c#0u3fQwtw-UR!J#CqUjP^OjqSGcS5=Z(Rw^;I%q&VV>YSA6mqI9aP+wH0 ztc+TR9a>VA*1M;K$khhu%NH`4AN8xUpB8y8QX{yf_XTfoiaZ4jMs}kGfXBt;5L_%f z5({ma%%_E=AUDqKu;%<uAL|S$Q=&L^Z2DP9Kq#U;7+YNL_dI1{rYY z-Vs%Af){>F+)cWOe?l-^WAH<^_{J4 z-Tqr&&UpgMV>r-JaK5DNCdMc^sf^GOvpu)aRr)9&0<0&LDwNs;ISN{u`EV@ogxHQd z7bk=l90IM!r8Y93RZ<@a9_PtisFz%-YghAY8%~odGjUt-U&yImfsi+#>$hPbxc&2g zXFelN_D=(k0Tq3aL(EPYW2A@KAB-*E|DS}6@G$b-J#;0*lqp;p(6mqj-;vbQss`p%H1vH9%ILC?Mwmc;(&%PH`ZZ9;l-7c<^gUj|CGQ6JMH2hINY>L I6`~&f6AAy%UH||9 literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/l1physif.cpython-310.pyc b/lib/aci/__pycache__/l1physif.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..276e1d1c2c347954fe0c7e9ea9b1e5993f12dcc2 GIT binary patch literal 2113 zcmZuyOK;pZ5GJYTKKzKCxLK!%9J57}AO+e(y9in&Mc|@wgKl~ewh&|uy;iK1WKv49 z3;C4v&_nJ$+P&pJ^q26^OHcU=DbRLC>$S6KByc!0fg2I9`Z=ff%yB6{CLXIk)%>)sh7qSRkMc0<4!ju#mICLC!|b z1rIp~d}zI7feRcxc8vf1oks^#y|cd?i+5ZTPvagAO;H1@S%`GVUh~~PH=RiyrgsW7 zP4@f3*jlFh#!d5an80hMTr_!m``(wM!zfKgaiZgV1oEj&M~Rl|sZ^sh*&9W1GFmvf zRZNW^hDnx`VMw3WMB03IX%XSA#p+U|lmZ$}q?eJY*%MZC;IH_xD0wYj&_M;o>}5Gf zj1S{o8O!oKer>E&W_?T9Xs%jFOluLAZjLf19<6M=YZ=CQm6ZAk!xD5uZm6tYT`jW+!-pQ#?T}8qGRoz7})`V|HxO8A0^eefIOO$M%?k^*cXy z5_aq+taia3u-d`3?y*9H zHh0jE3til2!^$aFlQZeu>coN7Q?f*hrL{G*abUe!BQIE(6<5!3PY0vmhn9MNw2jgw zjBVpks9#_cB^#wn1D3gP`9ebO3hK9T*Kg;$t}N|BskTns+CAl*9c`ChZNW!y6~WVc zB`{kSR>1ad;HPJ`Zro%7Q5p3&jTgZr$%Z8|RhjR~aUk}d83$w74q`V(YNJ+RF9{H47`0AKg7~9B7wl2NJy%Qu_vUlCS_&pESkt*y~tIGSbK=; z5!o4sG>?s=3n{^L^s}Ul50Y$*(KwZk#*zT>Lsb@4Y1&a)s${P!rB+nsZ~5&vSTfAG z;W8mfWTSc+;oU1yvF{ASfJN_qA<`pq z4N2b%T02=O)qWJqS?3$V$@O6wm2$Q=T$JjWqV)(1ADYqumFrSyZkL+A+&u@+HM}1D@3nKJ?nUkg|uN4Z5 z;i928RZ4$ROnt{~3%r#1+x~lY^*p`r87V5wzDJ-Vz=ok|hasZ4N{R1=;ZYT(^A$x1 zP%A{}{?%7RE@Emp3QQ4fXf*#&AM2xSwe9YAjUInV&HN!l;}7OvzS~$+WE<>1bN>Q{ literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/l2out.cpython-310.pyc b/lib/aci/__pycache__/l2out.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1313519a6f7194954b84e80bf9d14f60af496b20 GIT binary patch literal 1616 zcmZuxQES{r5Z+y_bUOL$xULIvD4~?lq9$>`^r;wAYC~U&Td*N;ToJN%>&n(i=Uts! zA37++ee@6Lo87nknf`!%?Nk0j3T?lUn&fP{VrNIA+0nN%-)yzK95IZCzdcotdW`)^ zFN?#&%a@pT4dQF2nBte1FT{{3alm3PgZ$@$-GeLJo9GqDhtbeg-EmLMzEumtjez2y5bcj357imhr|$HGag ziyvH2RL4oKUNRHF|MipIFGi?dUB;e~*l+p}I0T)^wnyj$s>IyAw|kPTnwGT>qorK~9`e}-9nL#Gx8R2G zrA;l|KcEm?#iq=>->_@Iz5(n;w3b!Maw90;$87Gko??UTvG2c{%VVaz-}&6n**s`` z*zV7Js7=uHwpr6_q~aS)$qjbS%=Wvtrnm8*&)K6UQ2qwH7Am;m3U;u8{fhXo_Ynj9 znR4@--eBXWo_T)upz*G~2L7C#J*Z_vtXcvu2Ui04JS2K~e;5{9`sW%;X`RNt z^Od%laYB_&Qu2@6Hej=l?^M!m zZWmRS7Ip_p=Z;|BslJGP)1vEB)w3eC*79JNx zb#$UL@Qkp#mD^S)5#J8|mWt*>c-+Bms3D22mU=$ok_#^X2|dXJA;pRaxeP-PbCs`i z@ykQGE(9M43?A^{Z|Tog?;i6OSBcle`j)GoK>_DDI47_QtSuu?c!MSb6X=mwK5y@a z*xyGxQS!}w5_F5jo|F4j`{1zc!`aed%Yl#f4tBpgjHUA{qqK3oA9ae=y8g7pTI8j6 zew`i_)U^HaMS{khfL$Tf&MdpkQVz{0Bt9iUx6eZB4kji?^LKsyIli@5E7B7Lfk5KA zC;Dr))+J@p-4HF}9^FpF-Xw8Rl8h@gEl3|E$=Nh5x-W)0+$@uz>X;`a-a%ykNDdyicHCC&`hOc;xZVAEr`=7+*4V$u;c2Y^ literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/l3out.cpython-310.pyc b/lib/aci/__pycache__/l3out.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7775a8caee73bc59915eb7ccdb25a5a8328b048 GIT binary patch literal 1703 zcmZ8i&u=3&6t+D-GfBIpTM+GGg%FoP&_z@N2}KoBi?~2Qw9-mZ&}cIDmT4z5sb^AX zG?9?D9QP04)^gi_$yd1SzpzNa_nht0#v?yJf3ct6d;a`Vt*u22&HMdh*$o-{lO}hY zgUOfZ^(MsEOft!@(4UDRlj4ZQP6qs5d$Z$Hz={pIWJ4h%DWr47hmPz@S9;J~Xub@f zc`}rpD>n2chsB=pzS;Y3)(kRn$1dsA5729JS+bTTkVotVAH>{*lPW3ps#y~YufeRS}}=qxSrQI^+PHInK=6{EaX`a(;T|+n+KD^|rZCs9Oi$fzq;5*78o>%dWZPH+s+5A5AVi0ca4u+Q4C^(5bB(%ohkO!xnvwc+;bHRm6+f%LZ7wUGV| zmjPB||8KAlyaOAc)QsyVGy}%Z9R1{c2bm^x3^W2NfR2H>*G?PUaL&$m8n-3V^+4b? z+zDp5kM+SYEcVnd4Jc>)d?M2(jRWIJRcG1=Sq|4!`LxoR`k~1hU6?Li*H>jaE|fH` zy}_tSH8OixXHyf*Kq*;GOq4c_&d0Mx)%q=D^A&&ml4E>HtTFzQ0h*pwM(}MTo#=Li zUiTncJU8Tm-2ei6^h03ayH`{{D-DI`t9%IiMLHSFbpLa*LB@J){{9L9>fL@(Woc3G zLs>3|G3QKO#-6q=c8Dxlk=C{G>S>W9J?V6+N@@JM(v6aFXO*B2CTW?TD4A5_Ql_tx(wexgA#F~vHNf6xZD@6SQjC8qmYMugKu&1>mzqd z2u{5x(6|r6yWV_bHQsyWgdP^X9n19(p@6d-oD~=aMlk!7opO4=U_5>9bC26{6MKW$ zvA3Xiuu*S8#Ex+X^p^c&`>^NTW6Oy54v!ALKaO4FRaz=-f}d21u{NDqiLuB_WxR%{ zg!kW>TqbzlQ}8f^x`bcX0Lr6|NszNE`7*t!&QVR4)uE3Cwpt@azVA~7Sbovp^UY;a z?k?BF5AbRL(xd1RpOeHyNiwPAtRTIYB*bk_V4|kt1DN!1X|~ppNnrd z3HcR`i!B1@Z^9tRMMxkAsLelWF!el-pW`Kh!>6Em;#TfWx8R`LJx$+cpl(1X4DviKfvtvWk(G2Lv<$J#FGf$ml6sb()SO3u3pCq%$Nf0}tc|^7Qg5fw}Bi z)R1SqL7i+98E=#4^f}by(e;Mg4{^qQ;$!TeP$>?X{S;%NEyXrczcV@>`l_yg-OJs& zlEWRhTUJtG4`A;i_jYyZ{H~r3zuR$-j)zAJWtT&rTfpFUv9FD^s=Tqbhi)VP(YO-G+_%Ny_`jhUl^}zqr#Td&g*iv&~6`yQUZ_c8yNGY%ey-J zDtKQc%$xs`@sDA?`v3%^>rec_1gHFzbF{^uNzAEWJt$I6dz77uQ!WJUGfungc;|ny zYCz$UdN2@J{&@5(3*9W6S8`!c?`7E$l+1d>_V5CTm&G^m!c~ya7O8FVmBgo@eLxb@ lrHSaj*Lp{T2w>Ke_VH^y{}do3x7M3~f=P53szzW`EDr`Z4i literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/node.cpython-310.pyc b/lib/aci/__pycache__/node.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50c04af2827a62adf89a662cd3d8023cd06b6086 GIT binary patch literal 3683 zcmZ`*&2rqv5ylJ#Sa7*N{1YQeF|#?y(Z&{? zmIJI@M1fVVvJRd{Mip zlU&-*+0X_jqytWXb7cdZ1J096;9S|1%g?Q0L$+iaZ%=N@j_hJ(Nq$eR$~ACJxh^-b zwk#R`e_e|~D#O8uUowJtdhX-NHbJCST0YDMg*l*HTKJd`hRws^Kt&_c(YJMDocak^ z-JUW2C=Rkrcjm*xD9%IG=UQZ8e5lMf;?GXL71N-;a_g_kFT7b3t6@vL-9qWX#TdwYD(_QuLUO{S{1U zJ;mmxOf|?GB{ny;)D6sHt4}!|Tk;qDjF;Fjtw?(&#nk&!lx)*Fv!z3_o8%T7oG6Lb zzk8p)J2Fm$CU?tvVEwUuCLm{>J0-pOmL(fo)&*nM$z2l}Z}7O!^!mv(RHuF(sG~6V zEB8Gtx_LTD;k(oKCaJu0D=T`VCs8a_n7my{-pQs1xeCKO#{YM3W!jC#GROnn4Dwt> z2h%*v`mQ41=_OKa1QjKp5;VC+lj9%>jza0D2T#LMuH9fV2@~0O6gg45_&K7dyLGWl zugNIOqvU8BWl!*R5{yHnKuwnkctt$YwL-Cs5c?uD8I(~%WIq9EGQm79Km~JOd4fhB zYcaujHRE8Ow-9?guZ1YCnfPDTSIYz1COsw(Ho#CM5PkN7o$;KN{2QtbKKPEQ6|5p( zjgKhxGHu6U(zlHZ%&NA7Np^KV9daMZ`=fN4{J$*)zY$y$kz( zhJmq<8~g0iM)q`&JwhUDN_NcECU|=bHOo+zC!Q%zF;D;`OAF(Ejw)k{YIz>LC1V{e zR=aSj-3fYK-OcjC)=0hs9a#&6w$j4QUkhHW)VCDLn!hQ{7W=u50r`5%ItK<`FtYrd zNpV3wcLtiv)X?Ud|-LDt@- zF9b^3L2&xgrSCBkyH*0oelr5+VSWixzXsm~zYP9Yi!Z#|7Z}aHXhG`nWvSVG8}nZ- z{y_3veGAKsRb;E|0Ax7cU8AduKN9?XOEchMCHA(0y)DMo9*zAgrL$>auSE$s>#q(7 zgMT~CC)2#&(TzX?fB^O)kbC*i3ntO%@#!Q~Kcpz#1kqmAEcSBkjFDxrx`ElDM;S+w zTBtM*wF|%p66nShj7-PceFo4;m2RL7WKo)E2a$UuRiAWn8h-+)OSJt(DAkW?vN27L zlk}@Zy-TC!C{1#xjza|q8|BfnaOg!z#Tm2A8mpFopVDix9-5 z`8HC4dLL8UrDO1hBgMd1Sc5d7wRf?GDlToTfuG?}=Q0i%KbwH7@8hR)w-LPR24w&` ziFykowN2y)M5qT;#PkSn?x_^>8NrBP9GGAAgbg@s1D%0?4JTA*fVup`|6k)Jw7hXZ z)&*CU_-B&hzkfCF?~VCptj(Zo^t?ATVfPjGxVchS`O z1*bYXZo;-_?xMq+C0!gU0OY8mMg`Lbnv0thyR5h9T|tg??;QqF9Lf;^;`}0> zKy43?0prrt?zwe=DKswQXdEA$IQ9_+f>+(*gdhbnP#$7ZF`{+U8exAx6-pxm!_dc$0 zxLE#Jj-#Zvmj`)Rv>uvsdNmq~F9>Lz&!8yQ?%oV<|4_l}(EYtJXy`qd{rhp>(N3yx zF3^o9VSsn0*Mk_j<(paH=7GVtrD=jim<#23a1e)davGodsc91016xgt3N%g3e?xxx zlt?}1dU>Lvq&h`qf5Uo4DF;;Sx?PI${BFLSojxv!_t~It4+aC2!oz-x`V<{>d|x+x zAFXE^6W{XvlW7oFD{6@>pg*WBB0VC6`Bm=zk~lg(soxQKW2xaNgA~;yJ(Za_w>F(- kuPMBS=QKZPuC}&~!~hjUQvXYZ_I4}d?ioE)lWW$004@Yu>Hq)$ literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/output.cpython-310.pyc b/lib/aci/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbd3d3a837c1e1457eeaedc96923fd4e75702e8a GIT binary patch literal 3499 zcmai0OOM>f5$1b19M0^{&OS7HcqPj=Fov}Wtedfstw>%;i7>mcHa-w*5FB>zimT?s zO^%!$i~t7~kdtyr0AGBtbMqg`kLaU)$|-jTHd57GKJ3Ug308ky)m7}SuCD5|-**&v z?vMXL{yb8YZ?V&U)}iwre7UPC3Q>s4lvwpt6|u&&Sod^^b!Nn-XG&}^EADt5iA`q5 zU9T&##hke3^(5{vH|~3ViETEBSG*O8yKFTcdP9jFwib`Pk;FZ=9&dOX61!|O-tx92 z?z0Q=*c(ecU>D;{-X)1w*yZ?&cSYh=_Da0%ZA(04SL18mHHp{QtMPU3x~kk$$cU^z zSI9cmsYyGuOMA3WSLl$A=my=QV|s~Rq1*Htz5dzAdyQ;7QYM@KMn6qd(NE_^HZT0g zlx36yQW=>3w^2h8qt92h4H1iRK9}9F02}LYGl`_TO+4Ny&AbS>epycqm>%1)@WFxwHl3T zv|gi)3K0d?tWPJpuvmKHM?`d z+z-HI933xg-;a{0@O_Tn;^;1JA?YBok#vz@rr|bRCUUlrYykOM;a8yf?#7*Wj-CW8ItrsaOpgeCO4(7AQx3~HV$tj<2&1EN#yi;= zzXUoH`0^bfhN{We{@yYj%~5~p9jJ>@6CgX)YD36q^@A9FCgTJbN>qpn$a3IoZMrv6 z`9)wta~T>r{gS)_UE$`mkpA@3<6~(7O*!gftM%LVm=OJ5J?Lumv{ZZtCQ>L%m8e96 zgrvXFo~cXquJX~dXL_V8;Xv#nHOC6yCKjO1u0m|&j}^p;L%Qc&r{MzXf!qbHU8#k= zeoJ!zny%EWB$YNuTH0v=hez6487rTuJglv)wyX_*WDO;iHIOvc^1qO^^WF%?R2arD zwfwJS9b_B3%E!)$LN@=YJ~N=*f)@URI-@ZmPY@f_O%PTMtkfH`G=ZH(MK;aY)DIwuhL$Q^qLIcXnAC z1}wh?pwtKJ`V)GF$E-Y$!b%esC3KEa@XZ&07f#tfjKU|vyvHd`&PAUK{R2vb83y5F zDmsu)XAJtibASrp4W)3W#RB`YQyLbYQ?_#0YB{XoEVLUpgi#diaACbEA7N)fo_~^Z zGI97-n48d|Oc+_p3t`XUTuO&wiWU};1&qG|9sU-Og;Ux`dmInw#1Y0694xd42f{dz zHvV*OL)ZuBKN411=R9j)x<~NS*&KuKjB4g&3vPgSos;D{n#vj*kk*M}t;_7HZ!q)SJV1CnmoE zI>Lth4WX2B{u}HX!3jMS-KUVX35M0gT=e#3uwBK?UO4BSKhiV4iwgSf6DUg`%JKYn zz?o=rEBIZ+M!5?{lpLo&@8eGQ!;0WUElwB9OPG}bb>i&hf6el%0a@LpPp@KVwk%;g2OlHpyY zkrj|YlX_JcTaAyN^4b%4t&!XMvN#a-ZW&0o@H!#SzpLO`|K-=wn*jbfWdG-XI3;nm literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/port.cpython-310.pyc b/lib/aci/__pycache__/port.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..036e70d6979369e0e5c9b7e77ba54eaa328be0de GIT binary patch literal 8638 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 MYWft0|0(_d0g{h^K>z>% literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/port_epg_stats.cpython-310.pyc b/lib/aci/__pycache__/port_epg_stats.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba46cdb1ba5b26654ed7627220af7aa368bff6c5 GIT binary patch literal 1773 zcmah}PjA~c6ep=aRum=e(ym=DTLvt_Jj}^**kx#fp-EO07>r=)Npm5{B5fowmYIqtHLu>s}2;LyOzoc|$^*ySxFj!zlnSRKa1c%t6sVGO^L^gxx?y9zpkD=+A%{ za!gCg=@~6a#5eG4nMlP(MzQfs`}v0PLox(7P6;o0RNRJbo<|5?|svG70a}f zq&mqvT$~EoNwrX?LUm-??ZipinOD78j4LmS(kwMmXT>vIVz zz5W(~X~3u*_8Tx9+*PvD>RFG-)JBIL6W|<}X=#@Zx6atqEnQAVM6F_|`{+&v5@(g{ zlb6kDqik?@mGDNrUYmNQ$Gvy!$J2$9oLl7rUjUg8V{w&S(5YYgfJxOe(8SK|(!YSj zI{E74^OH4$+8Gb{5~SGj83qyG#UOO|+LLvY7deDxyjA49wXV0aoC}=wSZ@`Bv2Oji zu3t``DqXbnsB4rEtu#yIh>M-xNXix$h0Mo8k(mt>tG+NTMA(U?yj~Zv8SJcU$P(vd zB-Hr3%1wtnHgV<2?L$!UyjOY2AeCH+EPPNTd8YS_l4`$(-ZQVm`?c@~q4SYS1V}1B zHb$l0kr6s{67zaLOXzi2U`8Hu?+AttfRqrMRdP-)FlAZ0va@(7@JTZNNhn}wS|`$s zU|=iniHwI`9`AmMAcz)_$@W}UfVsEwdGm?PlUV9qU}m=g+j=F&Pz;zV)e7Dj##!7K zJj%PrA~6c{u6lqQaZ$)LiA|bkSR<7S0+I2`)lfBpHy70co^>HuP;ONNeT{Y3s8bsx zD?HUE&HAHM4?qE0sh04{y?LFwTAmk#!7P$d9f@#Ry><56wTBg(X1)Bjmuh?F3k$uc zp8{cY_PhTw*QWNBZR6U#^cQFJnjO>Y}T7@nD(T{{~)4Jk?+RKTECupn9x2M{U9Tmw0-%k2jV(IHiHcYK`x310i^I@rtTfVvw2`8-{_KgJc@60TsdG_)8XT7KC zFz;o#&5EAV`+C^Rtv37G^oIF%FU|7a{CDq94qP)y@^M}!i4O?dL|Ebhej%T|I>*ob z^KBXNa{dJ9(7BqYU(r$Q&;w6w%FNA5oV9EhOo2bPE5M*Q+riEI^$xV)lULw$m-oF@ zb|}$f6~*)Y;2MY@DQ}Anh;^^>lw4zv*mvziAN#yxSy9W^nDW=y2~4&3sS2P;gEYCh zH`V4KDN{4hAid^v_F7p?3aD}LU{a_L?%4<9LTPI6*$o%uBbAn^3)8YR`S!Hb_DSTs z1v+1AWg7UmhUhZzI&(ofndq^C)>H&8047}E8U#w68>4ib4zx;&?OmOf)`c}pGEPU@ zEnQx$)jSO?0=rEDNoP)}4QipgR5BfWS56 z1`5gAhKk(z+L*$)5J0B1-{<9yd6V|YQ@=NAzMyXV5^**CSNJs@ockQFy@L?Kn*u-i zTuLcIz9c1$UWgyz*4O`+-iUYMux`|#JB;cmNnDsDqe4xG)Ndup9*lRoV%qqaxlMuc zu9KKcj4H`cu^GDFNTO4zkzW`z@3dCy`EKOl0?)VW`@Eic8H8&-Jk8+?PB;YCVk_Q1 Db9B;e literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/port_fc_stats.cpython-310.pyc b/lib/aci/__pycache__/port_fc_stats.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac6f96786ba883fdd27326b385b6941fea817bfc GIT binary patch literal 1825 zcmaJ>U2oh(6rCB5y&GpY4Jk?+RA51^z#v+XkU*#)q*MVUWJRP;)*{RC%x;`|*PF37 zC@V)oBCkmNgoGEwGw=M6dF6?}z(dQq&Ih|`i&wt$eSG(vbEoKbeTJv^+n?zlON{+R zgZan7;7h#a8wiRip0g2;IA>omC6sf*l=G8_gpxZfaR0_07I5q5#W3E}`9zzPrskh3 zzz;F2S;Q5?alZlMk)xKCRPG6nr1Dhjghj4ut0lCa;`l_zE^im6+Ddn-q$pw~I zte<9OTJ)7Z)OkNEwK>$LpJ%)MB+dE@-@QLMvh6s|##t4|E-=bA!V35B^ZD%6IfCwA zZcB-n%f~~9&NW2+f{tRx4v1n?W^UHvqGkJ_3Iwu!0Sd*%4sPCWcAy2JyauWJeBi9J zV~HNCDPHae*+BeAIXi4fv^%w<kX;1*Q#PtK#rpalR|xPuY52rl&1Dxxn;d?JJeo|E?+nrXrd>puT ziOx4-nHK)7A-W9A&a9VACVH$OHdTT3fC(Ge7J*Xd#wZylL#^UscVDMfY5fK!9w#Gh zR~8o=InP6fz;2U38I+yrMc9<|Xhz{h$`%KE&-FZo0 z2D?xTBrmzFk@!7yhA7=%`LW1IY5@s+2*zv3amvnE?bPxiJ80LCDiC4NiTot3rb+(z zXrir9<7jy}%{IxQ+uuBj{HsA2wa^biN93Zj9Y!9S@AP3a+zF#@R#G`_8(r#gWnHQq zZDj@As7;a1LToIUY!bMQ5at##w(^NSDxx`SX zY6izUXOQ6lbq1{4`-XJp|a09u4 zLbA4@BDbzKrZCnAkg3WavTDz~NqgkE-&+k|P`A54TtojgeoYVOKF3?$LGa;CfuDRT zr4&A2k&;Hw#E)?6>;Fq{z(Y7J3|e%DQ60sx_2YO{sA*39P8=V=c;_poi;tPx6e#Z| ziMhn6k_;7_q3ew#I+q&x`Cj`@XT6yZ0|z&Fw%c6j&CH7+Z2RGP4qtG>A+QcxbN&U7 C(bAy+ literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/port_qos_stat.cpython-310.pyc b/lib/aci/__pycache__/port_qos_stat.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c21f56c7940558845bcac2658fe4011272853da1 GIT binary patch literal 2680 zcmai0UvCpf5Z}GqJD-hXLQD%mZE+<)xD}*Sl}g(PwFUK$R7I4eFK*E3>^+AIXP>is z24Y>LO63))A0g>OCB8&I$Vz?cQ@;XIp}*O4sGWc~>t<(X=jQh2_nTQ~3kx-d>$5-p z?ETeX>~EUPUM?nI;?|cSB$GU49U7gK51fv}*|$u(Qaol-{OWXE$=6xi`v<;kt<6m> z&9=gOaXN}sk8HEo%gEPZjai3F)^TKAI?{d25otjR=|L0HmzBq?z z=ZWl`*va(Z`~J-|(z@*{ifG&)vMuAn!JHXn;Rvq};T3AyK-eQsbN2W`KS}dgnN!DB z+Kv%APWwtA_*14%V0iY)&CfUQM`^OzOLQ;Wl<|W&-Ar_>9>i)hO}d*=FWH=X_0`d? z3BoWLCV3e8h@k_B2KVu+@yT1WX}Wso*Q4|tUi6TM+otO`D3a~DNEaJ3)hwLp$hMI% zq>*hqNTf6M;Oax`fe~rt1yZ}s`|jIpPe5Y@$wPmn91*Wccb#of^4$UqT4uM{-Gx05 ze(t^~XynUGdduv9bGCC``hccF&@^|(vDyvuNNvS=Sf+JyF3(08AlY3RW%9~Jy)w*X zOyfoUjq#I#jPl6TqC8hgcbvz1qwSe0J#X<+6@0Cte5opg@uSfw9!daC)nR#tR^_ z&kk7O7Gjm{1O?D)J8Ms?#z9$}y7TBOIY{!acah7R*?5?Dnp4y5sCPfkr^dxQk8Y`K zG~>2ZTIRe?Z5)p_HO=`gZXAnNT4ue#5KjZ#1-XU4_S zQIO6MHD2LN=xE|Zz(qaaOMqr_VGe}XJlLa@A6~>ZDmDv23WZ9<7Da<-zmGzZ&H8_T1)8Yz(Vi3nkeb)~0w^$NAmm85^= z=ZpHTapbVa50ikAbn2+`!ETt1^U*jr0o2kg%ELhr&Waj?YLlSjyA-zFpB|}X zc(j*v;G@q%oCcVI6V&~B33v%}?b+o0IXGVxqs`aQkJs7(o%(d}grTX0;UJUal=ONS z?u?_fTu}?OD|(})uVtJ1h^GH<*J`w9PSC8Mw<~R7#J0|c_zRSD a?LQ)GepMtBtd{$^L8Y##tO8c&OYVPiu*FvZ literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/port_qos_stats.cpython-310.pyc b/lib/aci/__pycache__/port_qos_stats.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbb28b97148b84320eefe0be25883d4ae2a5dade GIT binary patch literal 2665 zcmai0-EI>{6rR~XuZ?3uObbD!xDvFu6+~33ico~w2K7g(EJ|`y*J!o&tiy)2*O^%Z zu{Khra*NbQNP1K85`BhV&uy>z3P>&e&a6#s2gF)?=FFKhXLrwczB5i&Rw@kF#ozzv z{aIt|FPh9>HYQ)-R_{XyCV0XIyv;fLh6zj9PnocPvD%h!wpr8t8$PVbbtOr6g9lME zie!&W^Vh3@H(`xfn+t~RRTGT2ZLuO8;XdVUM|h(2l(k*qi!w$}RKzKaCBgBiny%hW zW%fg=wzDu(t)4aa4ASW_Te#I_h>Y#=oD2Sp=Pa;<1!)Tg=@{t>hLCm(Z|>2X$D(~| zKUIV8`ddk;RMV3bQQP0AyV{0>J~v2%5gs4FD^TsKg(9oonj8#7tYt?9`2kTK+u?ODjA zHTB@~6XSsqdF45ByT|+XyX??`#&VJ~f8-nyZwPyv?Navb+!oF{yTk6U9J=tckDQ!F zzRrZZ&W=%K`!|ILY)XVpeSaLugCGm#Zj=Q@UMCl_bd&;47M?_rcpjjQ*b+>z;M&TXx* zEO?#SIT>wgTJT%lIT5X}%zL3iTm_g%P1m3&&*2-j^DsJ4?fN2RK$d>0Z7eN=bdE~n zHO?O)mZF;Qxl{G|8lah6UI5_@8+(-U*+tbxWHS&XP>3Ri6g4XQBM?Pc#}bg6GcQLM6&~7i2~>4*YR`U4ubq6$ z$>;PLjef6T8d+mn#Eof%HwI&sHM&vb{~{BOek@fsx%wvRsROk^{c|JkU;F8by00xU z?D1I=Fp^F!bsM)La^xt*qU=nu$qTR%o=N&Rl2CZO43xi_goCaKZ|_hH3RY#48*f46 z`eu^$!bIJMQtWPWd6Aw~GW?eWj&>s{Q>iP+hs@ODIC~)1V3%|PYEL0sk-!G323aR@ z7NT7;RRfCDjPmMaFlE>-7wHVdaOp$jC2YQhTYU;q0mUu+oPQn1u`1lMX=ZWnpBh?# zL;6eSrS-Gr!G?RQo=H+GNmZlOFL{(o9NFY=p&|O<9wV^Z>5>}AqcsDuUIksz6eDV)<955(YDQpl`=z<8a>F^iNMHX z>@|4w2S5zjqzfwOuXI5YCKymp5TM*qUl54r4Pd(gZZ{WkOPY;(_HbiI-<$LUg%PcH zznWSP4D8CRN@~cRXiT1DMXI%Z`?PYB7e*@EIi>A0%e5>fibKFZh-$&|@6EL@Mq6o- zkFs26)kw%EvKZxBswYy7ihMjuvwU=v?s~mr!z9Ve+$4z){yGHGr2*U#-939$lk2aH zGOWd`D*y()Ty1^>Mvy%ZYD4Bktt{B#N;aW7P&2a0pla;Uf~u>|0#>LYT|gZ->BM`N z>~Y}80;zXs5A}tJ9}90trmoTpPw-W;PJZm{`C!NQ{ROUcl?Z>89KaZDe=Y*(Lj(J; zvOSk-Co!p-N|P*WxqIGJbp`d`xlvc*+7*4Htc1k%ioRomd?r$p+9)+f<>R@L`f)$7 zP4ssSQVsZ8g~hVnS4~+4R!vj}X?!Js7}G>|T!JqvHaZ;|ab zyz`(je2b||!bb@#JrRJe0lK~jQF6K_=pxX4CR(6lAT?1xBm$$Hko%oM|6&}aSthmq zzDUcsofbv)R0CtkY=_uo|mGK_evq3#hq+2{rcDs#X)NFClWm^6Q%WK znWc5?=cSoEjyrH5&HcRG8k)6@Y3$FW$YC%92)Q~xdZck zggM%Jpm}|$SMX>Z+W;g@st>_kUjPzP-V13+yR^;1!>3I-Z@=Jd_u}ywzahq{A;tkd z8scw2K%{Zl(na*x2YeFjfKkxF$dNt7Bt)4mV3r%=eL%MZsxB|cK3{kTF#g+sbAU5^ zV7sTY?|zE=>N!yF9Ukc3;c4&9=GyeevUhy$L~oKSZPa_PD<~g=h(dUUVN|M8HiAIP z=%=~aP}k6gFOj9;Y9>l`6+N)vuT@rE2VD%0t7HVnpTW&vaL!poyPTu+lKl*TaPI#q z*{6d(8w~ml92117B(YJF%qlT2kZ&i+HjLczjq2bgR*~RFUH%h$!ue2$V+#Ky*bR*k p8Ip)bL3pA4iPI1I9{e5ivHMv%&6`5l@YZqDhMoZIAgT$iKgJfe@gpY1fuek^nDSEDvW`si8_oGLBUnaR+kH9dL}ly zo3JAeaE?9};nD8{F=T_5RM6jONg^f~P)`t`+)-Z;u;+DQ+W~Gn75%z2>!acF`i{Ok z=mZKaTJK)5W<5}_bHgGUf$vD8^C-z;t?ilP!a%dNK6V-~0*JH( zAUEj1dy7ms%t(pUJJ1J!!QwUH^~jooy7UB}Crjk#=EMg*zUP-X(s?5Md9n}rv~@!S z5Qqu}Vs2|J)lOt$wI)q81#|ZuQ;Z4-z|PfCAueCiSMx$h953nHHb{peHnFY6#;A04 zY@~kJ32YVDy9lWYe62#TZ0l82riN7&g+V+T$y`9Vu^wyyJ|Gor1)bpJjbWU}Yf?nT z>V`~=wl!xq%HyE~i^pEN$WBQEjlGHCN+HO*@<`@j`1MCXI6cKU#XER$%0ERpV{RV$ zAYl!NEIcnc-@P!4?uizU)d7C*VW@urW{pfBYvOQ+JGI#TyrN(+`Zqyuztf!6YR9p=DwF3G_w4KGd?)z@AJT-FI zuS4ZQ{iV5(kNZ`K+H`7tCwU$HIn05XsVGae`4D{RHV{r*ETpI5M$}t0gquo)n71tDTLI0o=mO_!G1WJG{0D^#h2qi;HK(_QszCgAb@D7j{ ze3PjQ!bc7?JrRJc0k#n*t$Z8<_LexRVfUBasM+90q!gre8&Uq+^B#~PG1Sr}@ zoMpu$DUi{&u^K0vBbdtjaboMM<6LC&E@En%$zbi<**avqu}Qb3Gs8q~eVHfm2oX1f zhqehl(A-P&&7N6YU$g#DiWF)wpRIARTpEuuu-?L8+)`>O)jy8o%+`^=EtC6DYPR7R z*yf^9nGKPcGt_X)QFlq2I6YVn&H7f}Gq#Bf9u!dj3csp~Y;Po`uz{Nz>vqyJ z&a-x no(s=3uDdtgjtBoG>8krpagvja*l=OGm9Me$YBbj%r@j9G%sHxD literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/port_vlan_stats.cpython-310.pyc b/lib/aci/__pycache__/port_vlan_stats.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1661a73f511e2afd73238c2f2d09d4e502506810 GIT binary patch literal 2647 zcmai0-EP!I6rLH6z0R^5qJ+|fQgvH?#1<9QBDDxbs3=fMg%;XWT&xyZUXOQi;>nDudpQ_@HJ|k}sH&&qdo&e3dobe__j7O>U}b z-VdI{=`hw2&AofQ^?V((F>71pz3ocnp-I9N7|gFG1G?E%>Y1-(Cr(y%DZ(lIN&BrRiY=KsIc z6h;w(>+~}-_Y0`<3BFZ}|-i*^uQp9>Q)}1uzcETv>9C`bd;g<1( zAjy(42t0Txe27`@;jZ%W=|iEqvTqnsi1sgf%0;sw`wfa>+YUm;MoceE#9q(V5Hy66 ztqBBE>{)Pq*;=4SX!!);UE@9HG~1TY*o5T1J;Dx;Un^&o^$7rHf;3uUx7p+RwhKFF zM^32cOH8>-Y?pJkab07Y>Z;P6_law$7L`L?f6WY4|4#sb#<7luPzi6#gO-h!qp_*zW?(=!mp3x~rvQ-GZ)Vm$anLYN9U zCFSHG%))-Gg1oyHM`dBE)=iLwgV@X-UbK)-MU9-DA&3&7JC2WL5Um%NAS9m?lGE+I zo^$886vFDhiy2V^q-bxX9A7#N>-$|F;s$|C`DTHB2Bi;n|IW8X0>BdnIK(oW2mn$A ze0&0McGxcFCvur>)UfUV8o4g?dF7HdM$R(JJmnpXpj9yM!|M85s|x%A_P2I>is;pS4-UQ02) zco^9CxrzwJ{fqcZ&BEG&Ld>&Vn+dlWAkTqyEjz1YsG@!HU}!^Rv+Ky#^<_Nx6PhgtRS;g_manChq6+d;X~4`I`9?ewo}eoKTDs%U zKlp8j>HsAV6+N3UKSEJBAvbwZrE?P8r7~TcCW{hOA5bS8^hl32Is&W}Nd1nS&L2he;@u5zq<+SEYLP>u^yS+w&4(6$_Rs5r&M%EprcNa#*BE%`+;|t&S z{3&vTp5WD2<8y}*I@U{*w~*bfrcX7Cs#*}3Y7h)^HA+dZ1;GaD+H^(NX=C(Gn}s%U z^bHyw?AU6wZB2Bd>Tl`fvnsE8{#pNv+M-=)N+Z{b9Mup%8TOCIP9NvV_{-D%+$5G3 L#0a0&_`LHUrmLdy literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/settings.cpython-310.pyc b/lib/aci/__pycache__/settings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0319ce16e979310818fc76a5bc31e0fbf23ed109 GIT binary patch literal 9870 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 literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/tenant.cpython-310.pyc b/lib/aci/__pycache__/tenant.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4504862cbcdffc0c2edd585c2ad9204ff6e672c0 GIT binary patch literal 2000 zcmZ`)-EZ4A5GN^0mK8fmopfuu4ah?=K*Jgg?aMXt9};*x{&;u%xDRICu1DY-Z~iFkWkUYI!TX;D zgKwY}Js?ksAc9^(`;85VU`NEaBET2EcN(7pEXjZhGGM|LOjwt6UF1CKt>|vJLWt z{Cs&~jft>+rx!dX7k0$~yLaKhf$hrKCY4iJf^HDOH^>=L+qa|2*=S@=AAmhp*}?`n z=ZXT?0!?yaEnu#}_yX28n7x2`26Gm$C4;pZtRuQtxZd&ty3(Ml26Y$o?-;DTfb{@l z*Is4cP)bhkmrE5BYhoRu?CuqVJHjaYpg(Yr&uTAdC!UC~41HVMLKczIOr+XQqGzvC z&C_rqb!!U#71>04VOgqpG%aPJy5J)SnWfs-K`l5EyV*1?wR@(HYpxaMHPa6F@^Q_2 z$)jh}vgTQu`An^XG0i7=QfM!E{BF`ZmxW$Nc>fmcMp;^_Flr2RWh(M4PV3=9C}CJ( z$Q?l|IzTE&wGDDjZUFLGe|`o#$zDkXhoP|v@|s{EYIi#cCnFK=9HI?0)*-V8P5h2! zIZv0Z?IerBq}TzbRseI>OL^{h6lSn)qi~djMWH`LcBEo4mI2&q7^gvmw>IeF1l(Lb z)Suum%=09U!ZOa%AXnLOoXBR{NXvZO3|CM(d6Z3I8RLT*czg@=P-1?0jgZ0SH`rhf ztO<~IicFPK_$|fp1S^v;4aZUh+2}+@WuaTO>(N6CGn&J>3+>d?Y7>e5xZPT8-VIn;a0t^cQtdT%&)z)IcEr8^d5j5^eL z!|hq`-`-oOl6YA3y(vJS0Rx4ELLp($Gw3ZWGbd1jDh6c(e|}|CQ$>Bd?|UYy)EX$N zbtHF?V7XU!k=#RaAIV2ZJ_h1@n)e~mW=r4Z`Q}0GWo_*pJe_sFGjX!{#KeiVUL1a} z?R`ui=rAW{-5(D2j~*T!ZknNXcbn|c?p~7^&wZ}#ObMxU>lYb9U+DHUg+7T>sqHcx zB@*g=dvYE?wB%sh1-6E{alZN-_xdH0uaMwV@Lra5a|H=Fcj!+rY2G(*UDxR{a7X=n zf6dmL%U@7Xm{-1oj|G;IAkbbAOfoTrSPyh32u`PAQqL$CSN;OY4wBoA7!LiWFzvAw eDC@$5<650VgTfnU`u|dcRIiuZF}k>=9{C$@H~!E7 literal 0 HcmV?d00001 diff --git a/lib/aci/__pycache__/vrf.cpython-310.pyc b/lib/aci/__pycache__/vrf.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..291bc99365154d9f0e635ce8c47f9545b637a864 GIT binary patch literal 1838 zcmZuxQES{r5Z+y_bUNMHabmZP12spGZ|djWUIPDpJt z9Y?QZHkK+u(fs)EgRej;2^#G(5eO!n6WVovxyikLk zgv}X69_JQJjqekrA`#F%@{XcE-l&L<)F5P*YnctKmleY(74L}hLHqrKt#5hN9M?`I0@2bY? zrOx5~$`kG?Ib*^*rvl`Vd-4m|2YC~009s0_Ug8d9^uSRs5ARjZnNxv2C5QJ6uMk5m z0A~A?fqxE!cVVaN4vx0W8|$Sb5t}#+>{4Gm$p?i>B&=~ilhzedC(1IB+vRk;4Qjht zoXe*&R(YBaZR;R^{Va*K`7SY*W0tHxPQb`^s%*37c9k61MhVCf#i;8;ntsTId}D*y z7?t)*BehzF_`au)E-0)Q2o3Aa5}%;tY9No`+JmW~P$4B4yfbnRBEXCK6l4GzH!EIC z1q@9;286$n#iPE6H(#I)G}b1QwK*i{^^L4Z;!JM>GgAda&Vf7*U4?kCO~g!+#adfe zkF(TRFCLF&F07{uWuyrGIauBr#d$oGA}ad(GBH{$qK(CyQp>?UU>ahhzJT+OyjJ+u zTQD{Dhv0Kg8Rh@_4yPXDY?1ktFZclICAvb{&ue^zG1_J@s7JkjxH~JwtJ1lFa;%01 z%o^nnfC02pKr4fl!CGT^pH@(mfFb<&sY~lF61qEKqYk-RgNq6aS$%@!GbDGB+y)Z* zmhT`iyytZ-TW_!I=h94;5l)>NPn{2dYCbD7lOm!f_jijdO^!QTMQ&7)buOVflDX*s zydauskxv$Px1MwmV^YaHk(1Wr?JG_3Jml6bl#t3cUdb3%ZJQ;aPi1Ki;5LYHXe-Up zaa5FMTpH^GI}`I+7BOGy5t1*FU|X1LFu_=*(4HW1`bRj?cYr`D0g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HKvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oVnIxNd}dx|NqoFsLFFwDo80`A(wtN~ MkXgk{K!Sw<0E^fl;{X5v literal 0 HcmV?d00001 diff --git a/lib/aci/ap/__pycache__/api.cpython-310.pyc b/lib/aci/ap/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..460a7c617d17e5e7bf4173bde2b262d9d521d2c5 GIT binary patch literal 1186 zcmZ`&&2G~`5Z<-d8#e@~Dt=UifD=+AQgPt|EoxOH#HB*&1w}!tjdzo7aBO$iuGGpo zwO4N3xFknjgD2qZD{p~B%Zx+Sw3L;1{O!zqGvnEDdh=$J!20s_yE^8C{KUiJ^5L)v z+pU0jOB7M`1opAlCCb|+Z9fA2rRBkC6SjK@LX$34r0XfFyc5#(m9H4QnF@f*tGioS z7Mn=sCQaVkbYNn=m6?bF^L!!3klU~w)~ZNJ1V{)#ciObNCof`%Y#v06Q?M|n$=LKF~ zw%oOI*GqLnGYRgx?jHb3GJ>iLYC}Z3aGp{{XLLeKXc6cimlVGYtlrdDfJbEJ(VDjl z&7OFmVW9Vv|Jj@Pr4KA(*RT^q@B$_@ca^*$AD>KE37)G&1*>EdK&AkAO!1jt28yp^ z?zyH>YZ|B-ktr{O8Kq?Z#lJO78&@l8hdW(1IM~XLURjrQT+z?1)*I2DiIvsK(*ev`eoE2qK7eRaPMPOX zb{6^^Fd)iKIb$9J>`{IiGDf-AqAjqX#-rhH7Mvpvh@Wvb=b^sl2S?AZpV|MHw9^i7 z`V%?ULR3uwO;bgTxFy7XA>+Bl;&9tLDDeMU5co|Ne_PxR-9i%5mS5}OkFDPe{x!XB PRJcCR^}1%_4X=+>N6i0fpj^35N zY@n~z?RqftvoW{jvTVv0R(aCKNmk0McSoZ%=|_2z4S%IF94P)`xRdqy%t2^u;k}1f zlNlr{Scvuk`JX z$);8TD~`EpNM7)(Y`{Tbd#teNmR?#@JLiS{oWnMv^SYkL!)TaquIuf#RbIc~E5qsr zOD`S`aNeB^avu%iJiI_wmv$Nt+d{cGO4+D%hr?(;Rt=(DxoC|sUe$OcbYp??u%C^G zIf>|HG=h8F=fbkM#oafanA~1qx%aA@vnJicxi$ZZ$pBvdH`p&>Q#)aWEv+rs@#pOK z%Toalu?vB@DEJ{$9~Zn3tEaSs0J8QfJ7Q8CbLp%ycrg2;MSNM?V$!4D%<8Lb$GS>% zAG+8P?o2iyAFQ%t-m^f*D%k|jHZ41%`)$o}mkgI$c4VJ%A-_y?!a%3(l#YybUzL^| zmV$1i6eE>n-P#xqDzkm^#$S%}(KuI^@#U}ityct!SA@{gt!{GStm|9rT3sQUPf8vd z?R;2PG7BL`ssI*u)Fw89;% z&ZNF`cz3j6(CjL5`||oC!|Z3J3)sd(scw>>oo0iw7LAgAxSzG{>Kc~juR*KtLG)eQ zF9NnU_q&M|`nza+7@ABkxQo_B4~U<*C$4K@EZ(@zheEyDpifpld+Hca&^8vo4NpgS zgk`m#WAvO${=`y&v|xFH`=6(FVIOg66C|f%>PRtl3nV8<-IUhU%`Mp7!R-L*$Ckdy z0eq}Q;)29ya}utR`0QMw28sJ~5(o^?asOPxgT#m=WZi_C5q7U(FN6-9tu^(qyTII*vEj*7fA_tQas)#CA=!pk0we zDax4LpxQ_03ah&-)oeCH{g6)M#7bqVU9a5wqYLttaaNPgx2{IbOP@`y=FyvQZXc`m^IO12+ zrpaH;g2R2U9kdEdZ4KD8RkV&Q1feEnGPn;ylcCt4AY-0V*q&Xqr1O>$9N#GMcua z$ySe`TU0u#b;s6p2|2iF@+tKmR)K=b=Mj3!u7-!PXU4=ADuW&e9LmLJe_21Klhna= z)H8DRIj#>_HD1!rl%HMoS4gKL-fWO%t43xmN_J zRaa0qUqV$D6afHrxudB1Gzgmbr*$TZGXpNvn?4m`6$aFgAc$0+$+)a1LloINQ6EEt z6UxNhD*65yZu$NZo~109muUwqUO?kyY{WUI}B>_evOhmaaB& zt-WkQjR`0wQj~Q%go!d;zq&HY)7{4I%*3zm&M^Gyw#>MBDs<{1cgO&r)3*mvnx6e{ z(Taereo75xT`))C`KIsOl4?TYPk8kNjn||oL~#mb5qgS6D8f&KU9}eXPXZK6#G!&o zpfInBsNkGtaqk=9R(vYn{r`&E+038e_}>Jsh4LPH5Z5NRKF~1~Rq}1Wvu&PEr_-)e zjZ0N)7?ysB>O~@UV;qFx!8l4Qj-tvytx!Yd&WsO{A!dwY0y_O0QB+sZW~O@aP(1p! t*YLjYU9)~h-#7nj{m006+BPbwW z#&5|o`3Mk!&BjPy=_2wbgHa(QulXDFZQbbkMy$G z8IVDv2wm%52#XPHfDj_g5F!95Ht3Yu{vdV^ z+nen2Y5u-2IxlrsHn~)LWpdpqyH_?h`dwa>IxpJ1Ds-K-pDeb@eOO%zkkE0S(W}R& zb!THb8}J2ktBXnrF(g7%jocaJsSqD_g*hnhc9+)#Fpy;c7`nrf7)hBs*(?|Q43f+s z$*gGM(ar~cZ*r)iXPh1UVsctwzhqdIbLo}_9@Kv|H1C$S#f~|Aho18D$(=Q{%t1n@ iU51l7&~A&x4D8vV{O8yT-4lS6q;#B#@6msg-TVQUR_7-G literal 0 HcmV?d00001 diff --git a/lib/aci/ap/__pycache__/output.cpython-310.pyc b/lib/aci/ap/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4211c1e80470e4ab3ef679feb6fe3993820333b GIT binary patch literal 3947 zcmd5H+>^~a>8fn?A!NIFO+t$<|EB|1Z^AeCWkmd=4>!q`0B2T}#3{d55&i(2sH z1LDw)UeEVjC-%bNE)P4N&%W%(y?*SHoJT0*xeRBd0Z;|BNpl-OXc6-}T!m2yFU~Dr zX+Lm$ukCt~8@4IiWPaO=7~f>P?R#r&$MxDyuN}(gG2cZHd`uKbkV4(8(fpTBDPbi7i0eM6YLcHNudQu`vIzqJvDt{AK{Yk2iVksnHMEyGolR!VY}HXwr%HP^}0(x5cZq&>7*c~VYw>sB*4oO8W4jB4$h z6Q`nYSGQGB=?9c?-wT+STVtJ&Gdo}p@%}IHS`k_^3|L(k#s+izctaQ+r|-v+umY#c zR$1T#aWc<(>rrDgAhaI$LR9*EsI(%LUMx;)H3gaI``r&p`qovA@q=g zm!b?#z%>%HJbY+Jtmkki4!Kx#d>;nnB0K7@Jz!fAH_?4PcGi5ht&2)`%T9AF%9P2M z5G9`l!h{LANL1PPJtv^H??rL6t#iz$(7d1%f*CLN8DD}CegGjWFpdQ%j=&2CvF(h? z*Y2hD8(}3x=KwTf5R0hrGhSAWD$$6knx{rgw;$IbrD4TV*0R3HW`%~!w~bu--oVvZAp9W0A%w#SM-g@<_h@mrZM6Iz=sbTP zU_8Sb8RocblnZlw`89GZA6l4begZtfzCWEaoeTFUE>pyOF^h2n-_*t)PjZ7W-I0U& z4DgfSfv98;5|zvfKMhmGkv_Rcq%#{|qlvcwl23APIBkOfw-2kP>0;~d90mwjcapH5 zfiNiX69bhheT6R-6L+vf>e@g}NxY*@Aa)&y{rr&FjU2H{LI+|uf!Ot3#IDf_wboUj zc5R?%)UMK*C+3jctA$CvwaJ3Gb|+jPYpkS^3s|lsa;tqOifgBaTBAnXF3TPil?e7v zWad?&xlj;7cb$I3MA_xci5V3J^s>uWh2?HI!8*Ig;#JU{i1LK4o$8i_q=K+N3 zyD}}q-13V!a|z)?gv$V}${nx6+$|UO&5v*p)A%Y0e~eS(xtd7Ad*ws!=Fr$t{0mqs z-fXiROxSE+D+8kkzrrOuAAiwL;L`trOXNplo=L3iBXOpg)c2^5+E>hlPpfe%IX{g; z0h{panDoyOWN#zqrklc5ly-IEnLRo&O#qkv{Rz4e8koKpC)C09+S}YPK7;?c@YBM!g=O2_koJ9)tG4}J-|^EKjvvzeIKml(cMy= 300: + self.log.error( + 'apic.get_class', + 'Url %s response code %s' % ( + url, + response.status_code + ) + ) + + self.log.error( + 'apic.get_class', + 'Url %s response %s' % ( + url, + response.content + ) + ) + + self.request_info['error'] = response.content.decode('utf-8') + success = False + response = None + + if response is not None: + if response_format == 'json': + response = response.json() + item_count = len(response['imdata']) + else: + response = response.content + + except BaseException: + self.log.error( + 'apic.get_class', + traceback.format_exc() + ) + response = None + success = False + + end_time = int(time.time() * 1000) + duration_ms = end_time - start_time + self.request_info['duration'] = duration_ms + + log_info = '%s:%s class %s' % ( + self.apic_ip, + self.apic_port, + class_name + ) + if query_target_filter is not None: + log_info = '%s filter %s' % ( + log_info, + query_target_filter + ) + if query is not None: + log_info = '%s query %s' % ( + log_info, + query + ) + + self.log.apic( + log_info, + success, + duration_ms, + item_count=item_count + ) + + return response + + def get_managed_object(self, distinguished_name, response_format='json', query_target_filter=None, query=None, node_mo=False): + self.request_info = {} + self.request_info['url'] = '--' + self.request_info['status_code'] = '--' + self.request_info['duration'] = '--' + self.request_info['error'] = None + self.request_info['connected'] = True + + if not self.is_connected(): + self.request_info['connected'] = False + return None + + if node_mo: + url = "https://%s:%s/api/node/mo/%s.%s" % ( + self.apic_ip, + self.apic_port, + distinguished_name, + response_format + ) + else: + url = "https://%s:%s/api/mo/%s.%s" % ( + self.apic_ip, + self.apic_port, + distinguished_name, + response_format + ) + + if query is not None: + url = '%s?%s' % ( + url, + query + ) + + if query_target_filter is not None: + url = '%s?query-target=%s' % ( + url, + query_target_filter + ) + + headers = { + "Cookie": "APIC-Cookie=%s" % (self.token), + } + + start_time = int(time.time() * 1000) + requests.packages.urllib3.disable_warnings() + success = True + item_count = None + try: + self.request_info['url'] = url + response = requests.get( + url, + headers=headers, + verify=False + ) + self.request_info['status_code'] = response.status_code + if response.status_code >= 300: + self.log.error( + 'apic.get_managed_object', + 'Url %s response code %s' % ( + url, + response.status_code + ) + ) + + self.log.error( + 'apic.get_managed_object', + 'Url %s response %s' % ( + url, + response.content + ) + ) + + self.request_info['error'] = response.content.decode('utf-8') + success = False + response = None + + if response is not None: + if response_format == 'json': + response = response.json() + item_count = len(response['imdata']) + else: + response = response.content + + except BaseException: + self.log.error( + 'apic.get_managed_object', + traceback.format_exc() + ) + response = None + success = False + + end_time = int(time.time() * 1000) + duration_ms = end_time - start_time + self.request_info['duration'] = duration_ms + + log_info = '%s:%s mo %s' % ( + self.apic_ip, + self.apic_port, + distinguished_name + ) + if query_target_filter is not None: + log_info = '%s filter %s' % ( + log_info, + query_target_filter + ) + if query is not None: + log_info = '%s query %s' % ( + log_info, + query + ) + + self.log.apic( + log_info, + success, + duration_ms, + item_count=item_count + ) + + return response + + def get_mos(self, bar_enabled=False): + if bar_enabled: + bar_handler = Bar('Global Objects', max=79) + bar_handler.goto(0) + + self.get_application_profile_mo() + if bar_enabled: + bar_handler.next() + + self.get_bridge_domains_mo() + if bar_enabled: + bar_handler.next() + + self.get_contracts_mo() + if bar_enabled: + bar_handler.next() + + self.get_filters_mo() + if bar_enabled: + bar_handler.next() + + self.get_subjects_mo() + if bar_enabled: + bar_handler.next() + + self.get_taboos_mo() + if bar_enabled: + bar_handler.next() + + self.get_taboo_subjects_mo() + if bar_enabled: + bar_handler.next() + + self.get_domain_aaa_mo() + if bar_enabled: + bar_handler.next() + + self.get_domain_l2_mo() + if bar_enabled: + bar_handler.next() + + self.get_domain_l3_mo() + if bar_enabled: + bar_handler.next() + + self.get_domain_phy_mo() + if bar_enabled: + bar_handler.next() + + self.get_domain_vmm_mo() + if bar_enabled: + bar_handler.next() + + self.get_domain_vmm_epg_mo() + if bar_enabled: + bar_handler.next() + + self.get_endpoints_mo() + if bar_enabled: + bar_handler.next() + + self.get_endpoint_vmm_vnic_mo() + if bar_enabled: + bar_handler.next() + + self.get_endpoint_vmm_vm_mo() + if bar_enabled: + bar_handler.next() + + self.get_endpoint_vmm_hv_mo() + if bar_enabled: + bar_handler.next() + + self.get_epgs_mo() + if bar_enabled: + bar_handler.next() + + self.get_epg_locale_mo() + if bar_enabled: + bar_handler.next() + + self.get_l2out_mo() + if bar_enabled: + bar_handler.next() + + self.get_l3out_mo() + if bar_enabled: + bar_handler.next() + + self.get_l3out_logical_node_profile_mo() + if bar_enabled: + bar_handler.next() + + self.get_node_mo() + if bar_enabled: + bar_handler.next() + + self.get_node_power_mo() + if bar_enabled: + bar_handler.next() + + self.get_node_psu_mo() + if bar_enabled: + bar_handler.next() + + self.get_node_sensor_mo() + if bar_enabled: + bar_handler.next() + + self.get_node_system_mo() + if bar_enabled: + bar_handler.next() + + self.get_node_temp_mo() + if bar_enabled: + bar_handler.next() + + self.get_fabric_path_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_group_access_interface_breakout_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_group_access_interface_port_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_group_access_interface_vpc_node_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_group_access_interface_vpc_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_global_aae_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_auth_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_auth_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_cdp_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_cdp_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_copp_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_copp_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_copp_protocol_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_dpp_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_dpp_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_fc_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_fc_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_l2_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_l2_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_link_flap_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_link_flap_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_link_level_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_link_level_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_link_level_fc_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_link_level_fc_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_lldp_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_lldp_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_mcp_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_mcp_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_pfc_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_pfc_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_port_channel_mo() + if bar_enabled: + bar_handler.next() + + self.get_policies_interface_port_channel_info() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_port_channel_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_port_channel_member_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_port_channel_member_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_port_security_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_port_security_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_slow_drain_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_slow_drain_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_storm_control_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_storm_control_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_stp_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_stp_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_synce_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_synce_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_transceiver_mo() + if bar_enabled: + bar_handler.next() + + self.get_policy_interface_transceiver_attachment_mo() + if bar_enabled: + bar_handler.next() + + self.get_pool_vlan_mo() + if bar_enabled: + bar_handler.next() + + self.get_tenant_mo() + if bar_enabled: + bar_handler.next() + + self.get_vrfs_mo() + if bar_enabled: + bar_handler.next() + + if bar_enabled: + bar_handler.finish() + + nodes = self.get_nodes() + for node in nodes: + if bar_enabled: + bar_handler = Bar('Node Objects: %s' % (node['id']), max=59) + + self.get_adjacency_cdp_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_adjacency_lacp_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_adjacency_lldp_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_cloudsec_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_encap_routed_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_fc_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_fcpc_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_node_address_ipv4_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_node_interface_ipv4_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_node_address_ipv6_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_node_interface_ipv6_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interfaces_lacp_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_lacp_stats_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_loopback_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_macsec_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_management_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_management_state_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_management_stats_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_phy_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_phy_cap_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_phy_eee_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_phy_load_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_phy_pc_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_phy_rmon_stats_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_phy_ether_stats_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_phy_fc_stats_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_phy_qos_stats_mo( + node['podId'], + node['id'], + cache_enabled=False + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_port_channels_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_svi_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_tunnel_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interface_vfc_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_interfaces_virtual_port_channel_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_vlan_stats_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_node_interface_policy_profile_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_arp_domains_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_arp_adjacencies_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_bfd_instance_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_bfd_interfaces_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_bfd_sessions_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_bgp_domains_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_bgp_instance_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_bgp_neighbors_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_cdp_instance_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_cdp_interfaces_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_cdp_neighbors_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_hsrp_domains_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_hsrp_instance_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_hsrp_interfaces_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_ipv4_domains_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_ipv6_domains_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_isis_domains_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_isis_instance_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_lacp_instance_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_lldp_instance_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_lldp_stats_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_nd_domain_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_nd_instance_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_nd_interface_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + self.get_protocol_nd_neighbor_mo( + node['podId'], + node['id'] + ) + if bar_enabled: + bar_handler.next() + + if bar_enabled: + bar_handler.finish() + + # get_interface_fault_counts_mo(self, pod_id, node_id, interface_type, interface_id) + + # get_interface_macsec_castats_mo(self, pod_id, node_id, interface_id) + # get_interface_macsec_rx_mo(self, pod_id, node_id, interface_id) + # get_interface_macsec_stats_mo(self, pod_id, node_id, interface_id) + # get_interface_macsec_tx_mo(self, pod_id, node_id, interface_id) + + # get_interface_phy_epg_stats_mo(self, pod_id, node_id, interface_id) + + # get_interface_policy_profile_mo(self, profile_name) + # get_interface_port_channel_relations_mo(self, pod_id, node_id, port_channel_id) + # get_policy_group_access_interface_vpc_port_mo(self, policy_group_name, node_id) + # get_policy_snoop_igmp_mo(self, tenant, name) + # get_policy_snoop_mld_mo(self, tenant, name) + # get_protocol_bfd_session_peer_mo(self, pod_id, node_id, session_id) + # get_protocol_bfd_session_stats_mo(self, pod_id, node_id, session_id) + # get_protocol_bgp_neighbor_stats_mo(self, pod_id, node_id, bgp_domain_name, bgp_peer_addr, bgp_state_addr) + # get_protocol_ipv4_routes_mo(self, pod_id, node_id, ipv4_domain_name) + # get_protocol_ipv6_routes_mo(self, pod_id, node_id, ipv6_domain_name) + # get_protocol_isis_domain_interfaces_mo(self, pod_id, node_id, instance_name, domain_name) + # get_protocol_isis_domain_lsps_mo(self, pod_id, node_id, instance_name, domain_name) + # get_protocol_isis_domain_neighbors_mo(self, pod_id, node_id, instance_name, domain_name) + # get_protocol_isis_domain_routes_mo(self, pod_id, node_id, instance_name, domain_name) + # get_protocol_isis_domain_trees_mo(self, pod_id, node_id, instance_name, domain_name) + # get_protocol_isis_domain_tunnels_mo(self, pod_id, node_id, instance_name, domain_name) + # get_vrf_ipv4_mo(self, tenant, name) + # get_vrf_ipv6_mo(self, tenant, name) diff --git a/lib/aci/apic.py b/lib/aci/apic.py new file mode 100644 index 00000000..dae29f70 --- /dev/null +++ b/lib/aci/apic.py @@ -0,0 +1,116 @@ +from lib import output_helper +from lib import log_helper +from lib import context + +from lib.aci import settings + +from lib.aci.api import Api +from lib.aci.cache import Cache +from lib.aci.common import Common +from lib.aci.ws import WebSocket + +from lib.aci.ap.main import ApplicationProfile +from lib.aci.bd.main import BridgeDomain +from lib.aci.context import Context +from lib.aci.contract.main import Contract +from lib.aci.domain.main import Domain +from lib.aci.endpoint.main import Endpoint +from lib.aci.epg.main import Epg +from lib.aci.intf.main import Interface +from lib.aci.l2out.main import L2Out +from lib.aci.l3out.main import L3Out +from lib.aci.node.main import Node +from lib.aci.path.main import FabricPath +from lib.aci.pg.main import PolicyGroup +from lib.aci.policy.main import Policy +from lib.aci.pool.main import Pool +from lib.aci.proto.main import Protocol +from lib.aci.server.main import Server +from lib.aci.system.main import System +from lib.aci.tenant.main import Tenant +from lib.aci.vrf.main import Vrf + + +class Apic( + Api, + ApplicationProfile, + BridgeDomain, + Cache, + Common, + Context, + Contract, + Domain, + Endpoint, + Epg, + FabricPath, + Interface, + L2Out, + L3Out, + Node, + Policy, + Pool, + PolicyGroup, + Protocol, + Server, + System, + Tenant, + Vrf, + WebSocket + ): + def __init__(self, apic_ip, apic_port, username, password, apic_name=None, verbose=False, debug=False, log_id=None, no_cache=False): + self.my_output = output_helper.OutputHelper( + log_id=log_id, + verbose=verbose, + debug=debug + ) + self.log = log_helper.Log(log_id=log_id) + + self.context_handler = context.Context(log_id=log_id) + self.apic_name = apic_name + self.apic_settings = None + if apic_name is not None: + settings_handler = settings.ApicSettings() + self.apic_settings = settings_handler.get_apic_controller( + apic_name + ) + + Api.__init__( + self, + apic_ip, + apic_port, + username, + password + ) + Cache.__init__(self, self.apic_name, no_cache=no_cache) + Common.__init__(self) + Context.__init__(self) + WebSocket.__init__( + self, + apic_ip, + debug=debug + ) + + ApplicationProfile.__init__(self) + BridgeDomain.__init__(self) + Contract.__init__(self) + Domain.__init__(self) + Endpoint.__init__(self) + Epg.__init__(self) + FabricPath.__init__(self) + Interface.__init__(self) + L2Out.__init__(self) + L3Out.__init__(self) + Node.__init__(self) + Policy.__init__(self) + Pool.__init__(self) + PolicyGroup.__init__(self) + Protocol.__init__(self) + Server.__init__(self) + System.__init__(self) + Tenant.__init__(self) + Vrf.__init__(self) + + def get_apic_name(self): + if self.apic_name is None: + return self.apic_ip + return self.apic_name diff --git a/lib/aci/bd/TODO.md b/lib/aci/bd/TODO.md new file mode 100644 index 00000000..b7628ae2 --- /dev/null +++ b/lib/aci/bd/TODO.md @@ -0,0 +1,5 @@ +Bridge domain +- l3out details in verbose output +- contract details for epg in verbose output +- stats (counters) +- related commands incl. context support \ No newline at end of file diff --git a/lib/aci/bd/__init__.py b/lib/aci/bd/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/bd/__pycache__/__init__.cpython-310.pyc b/lib/aci/bd/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de81516b5e0ce6d2846230b89a4d8d7745e88f80 GIT binary patch literal 143 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HKvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oQc6sGd}dx|NqoFsLFFwDo80`A(wtN~ MkXgk{K!Sw<0E%NE*Z=?k literal 0 HcmV?d00001 diff --git a/lib/aci/bd/__pycache__/api.cpython-310.pyc b/lib/aci/bd/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4389e87e991feb6785206a9a1883e811d7edb1f5 GIT binary patch literal 1550 zcmb_cUvJ|?5Z_&|osE;Uxk_*pA;C*Qk?4JZyDPeDgHVMi=z2mZ3bGvUCUtS_bk~l! z$a&&k`2t8tEpI&Xb@r8Sfkcm)4HZt|5lcIs`OV)QkEiJMLITgh&%epEOUUmiG#?Ly zXK>6Okk5!DlD>xX0~-;^&dI<_0N;8TNYCJy_kbueqLPf5q>{ZRBTssg!<$PVd;`0C ztW!Bt!(tw%`SV4ZQ1H2XkjG#ra12%{NlhZ4;7ZR1)b=ONJCe>lniqg^qq6C*M02qJ zSYrpm(CecF|&6j~}VJz&_ z3?f1nUy6MKalT#$bs*_Jk?no5Zb4Nb0TSMLbxVd%vCa+BaY)A@EoakpNVkFX9MWqb zI}X`tAiECPZ6JMz^c%( z)KPMgW>TyC!v=Vm=1Epbb#$TPti1Sm8dq6)m=slB!sxZ8%NORP{NDDEIhHSrPZuv# zX+soGXY+;0Z5#P7G6`(QSq)znUsk0R)8%}cwn|tCRuFE(Sd7*)^(eN)4-9geqg5$5-NO00d;pR%G zxhY2-cdrw?mKlT^$JX{SX)(D}Nf{+^a-po36*Jp{K~EsNZKK}RYJH`3q3yef%!}x* zkCBw?Jeg4>#{D`q0FfG zll%V%7eJKY4J6)F;I9tuuMOb1@r1tU;F_+nQS?);9(${OeV=BUsCPwcYx@}uLhq+06+P%OOh_Hi0j8B5KuT+ zh_MiG0vMsZ0+g50I70Oi`tgQ*pf5tlRWp5R+|u}hO}j*&Y!e=mVqh!~C|qE41!IX4 z6`cxWN|%I#*WTjHyr~wsE#I2lHK&ExNya+!F>$R(AW)nbedi)nZQRtewH3dQj$dT+ z+}W(Kbx~z#&Wy`!ZTy+>nX{8DFKjl!?6m!7u>2NMt!-%=tz*v5g)4FX@ZXvS*M0^2 zToeDy=(WW)q*%C!EUc;7A*`w49_w-lO?&p>Qe4P20WcT-5M%c15xPS_wU&xf&A~sx zgkA?_B%n-i@5YDXlDYEFG2O961jd~axAA_}ELTmC#ma}6y7y-Dj4BH9gTc)^){;-g zx$0|(PrNZD!6$9m^p)qOB^J_hGAX(VnNo_L^@gP*JkAjruZ3+6>QQZ7sKjhjh68^(C)jyM|pjkbeNh C1Hx+n literal 0 HcmV?d00001 diff --git a/lib/aci/bd/__pycache__/igmp.cpython-310.pyc b/lib/aci/bd/__pycache__/igmp.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81a8f67bd0a78a518e9cef44d1e8ed019bfc363d GIT binary patch literal 1106 zcmaJ=%}x|S5bmBo)@49kg=C{4UO22lxEo@KkQgqj0Z)@jItsJ-sAs@FX65 z3q5-EF?;|IbM>^ZK#Z}fCo2RAJ*k@d`KqhBy1HCiYBOBle|(0Y3yl3D zkpTmqv7ASovzH7UaL*aIADzen?}+vM8DdzE*X^tviMKKvOP!MG>T*!oMXDYllPu!E zFr0&P&LS6F@bK?}kJ|@}H8WMe;Gu`}ewr)w# z@A=eJI*kx@TZp`bNk(!g#CvQ&Elp!-8CE>-XH+#W$g; WwbpV|c-`7*vOcHVvkx$2o!~FnodC=L literal 0 HcmV?d00001 diff --git a/lib/aci/bd/__pycache__/info.cpython-310.pyc b/lib/aci/bd/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be54fade4417ae89dff60b7e9e273cfc6ebd455e GIT binary patch literal 7830 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 GX8s>ojNq&Q literal 0 HcmV?d00001 diff --git a/lib/aci/bd/__pycache__/l3out.cpython-310.pyc b/lib/aci/bd/__pycache__/l3out.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15e36b52af1937ffd3495f12d5a6fdb757d25ce6 GIT binary patch literal 795 zcmaJ!6~Uo z!(TwjchFH&ZA-;3q(IE<=>jN-vF7c}?2LEj?Y3K6DMR`4^#gq4jD08PPYKaEMm4(# z&loV^SE%oUoI&uC4Z{lKe@TGeF{;@|P%P)b@&GslS1b=91c9r72y0`v^R&}2SEucw z)Xnq57rm{pi5nrC^aRxi1YlUkv(E@l7*)?YI?coN_~c3Px~z3kX;ZZYsB={p+Nkba zbw#bGMOo=$3PpX`_I9*<=MpJ(qpg(m4?`gM>fx=9Mw_&XQZ_=oP)EMCGc+{23^cpI zNhj>n6hn^##%93-il>-E?B2_$OQdDlTNm2X z=9-Ux5F@M5HjiCwRZ})L-?m7edTTK;D;LU%25}V~nDK#eDLH385m}4OvetGOb~J$7 zUX)EaS0LNzD^*!1bTeyzbK22_Zhx+u&E@}ol?@}BmfDrlrBW_h=xeeEQoiZSdcD)pk==cQo6BEY)NQwUGbTnaVF@3E XK9&u+U;kC)lF9n4BdYdKVVC^^+HANl literal 0 HcmV?d00001 diff --git a/lib/aci/bd/__pycache__/main.cpython-310.pyc b/lib/aci/bd/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43c0d8d0514bcec12acf291460d5eaed7eebea67 GIT binary patch literal 1414 zcmZuw%Z}496t$Z^(l$xk>2w|oKA@X!h803+hT$P3C=w&Fup&ii?T#Ysq&RIQ(CnBG zfhB8pEcuLXSs?bTSaGjIBWGqD`RMo_$G*Og%=bG4#`fC}{;NUAPh8le2a8jf`F8+L zIF&?EMk(@|tSN^%hC8yZ8mwV>T{cyVwG3}aSG8H&@TTmjF6$cJlAiLJZ@4Q1)nh%w z+p@0)Y+!gt?x`Ug8s3%rYQ#o{d-6aXvO`Lq6Ylfin(#nS(GZSkiMHqpU-ZO448=$s zehSzT?_H2_|2Ozg#&p|ztP_4Io@6Rc(z9g(roL@@kuI`ZwoA1H+rZxU^5pe;b@RMe zl7nev?|UOwB3&g}3c{W(T&!oQxOKu?y|{VP*_tP~uX6p<4V-$@_$*#aG*%uo&A6E3 zgtfED>nugDiDi&d>; zPRZ&eYm}^6vR295lC?|LDOtB<-i~nsp3>>q*Z82V8%0T)tfENQVX4tY4Mk0K6QPCR zBD4{(?sXTzL+}A0boE@w#aE&Su>3nYe-OTlWfIPle4d3|Y=jJxTCo?{Ymx+lL>siJGYTiVP?b}wU`UyVGM3apy zNuFfuRiR;g+0fFIAC5MLc}~(j@{@*p;KTB z;4hk+c*L0F4-`I5F&gdh%vV1HlNiBCh}NMb5*@4q2L&^ z0^$je5KV*x7zXjd7bGq+vK-fx%ag0UqbJ#EUaG86rqCJ4Gg)TJ$ofpyS*b=@UZ`vY z*|dcH*||%EP?fSmV9(6ZZz4Xww^q&m%BdiS70^Ve8ei6XWE6WBD0YE8_SpsY*=3&? zgr7M?T?R3*kElUw%Uf@FK3Vg;>0{c<81%h`cBI}n?K9|5{8H+&aj-+y4f4T(Y!0ZK zmyMk@)`j-Cy5a{5n%jaZbuBBayt2bPmIi!MX+3+T%RxSsZoAOcSWTK*0;*JTPTB?a zI!|#<=9llDyPX%d$;)de7ggvwk9W<%u5oP=Ui&n-nb^!qWqV=m({D`kDxXLYdh|vX z)+8MMG)Z@VBCQztQxM>9L12E|&{!vEH#h literal 0 HcmV?d00001 diff --git a/lib/aci/bd/__pycache__/nd.cpython-310.pyc b/lib/aci/bd/__pycache__/nd.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..418e671450044e865a939ff409af14faa0fab95f GIT binary patch literal 1152 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 literal 0 HcmV?d00001 diff --git a/lib/aci/bd/__pycache__/retention.cpython-310.pyc b/lib/aci/bd/__pycache__/retention.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..780761f3bf83026c5dcb7c3fd96e37515af2a22f GIT binary patch literal 821 zcmah{Piqu06i+6ZbsV=+3JMD%Md)DUf3%=pKdGF=@{Uy!LPD+5*KQ82xh>)LX+$ILbOW<}7#2X@s zq*uUSqMXR+0~xXk{QnSC=`tRHqDW39$s2GKSoqe{f>8oT{^CR%-KJ zIc1z~Ohs=ML>>7QxaA-ufmE7(2jO|E>WRgUL0msOJuWWFS{IdWtEP}@sp>+v$}W{H zYCSH>N*7~U*iEa$`K3>U&_+8UVr+rMI9)y7I@#eSw8F3rAx1b^81WnwO+H7OtYPaB zS;OW7@|8&TjY=N0xYOXg7tZetFg6(xc^7@1H6WAdA^KB@L8R|xIO*Gkn=hPa?#x`% zqhE;3iaGPt_W-=oxO~@{*UMLP0P|f_XXQ+JZa}W$gZAj4^(h+XAr$b7+j*_skXc;8 z-=CGHoGK}r@kdoT&$XE}f6=wLqu-w@C&uC0gbep4ZqNiACrtuT;k9s@(EX@SBie&6 z{mtXm^X;hquVgliad#YD2%icuYviIvy)VS4MOk+z7BA55qPTeyoraTJ#0r(R2O=Q} Y?X%#^hBW-QCHZ93^?HHX;c@J-Ke?5|hyVZp literal 0 HcmV?d00001 diff --git a/lib/aci/bd/__pycache__/subnet.cpython-310.pyc b/lib/aci/bd/__pycache__/subnet.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b5111bb9619ffc16345a5d7471f1c8e6e34682b GIT binary patch literal 1696 zcmZ`)QEwYX5Z>L}v(L^YHNj021$Y1=Y97)G@q`SjXruzF0#bRhT%FFIwb}Y|zU-Y{ zB|1x$=s)NK65^rdjlZ;y@Km08%0tA=o}Gk}uC=qXGdr_$GvBPI>+4O1<9zQ0{2em( z7j3Q%4>$L4<{uyd20UR$yvI3vz(9caoPqbV=n0UISjT^jXIO{ZhR&j&RFWw(B+1nw zaB~l5{xK58dK?&9a}dv2&jSx6t`dBx;p#&jy#{vkYolST4yH%3P9Mz%sVasX%~ykX zn)h+$5(zN0C&+>SzY$Kk>I*A8~>Ig$gvNv=d>1_TvW-l6QFrAw5QQo^b zaOI4^)ibIRotp;P)T*5gRuR~>6^Fhq%V;RAwl!A8(mrxgY@pO3E8x{H#A6VIeL{pgw+zUgsDpRyVhK22B4e~{5^Av9Hxci9*l;&;CAN)Kz-T1d>j zC?)1zmVD04dnGTaj!t$Qq77CV zhT0JQJapRi3oUZ6;SeO?24aWfSzKQVXuaa_&JrgAHl3GC&ASvOw7U##y~@Vf-lTJg zlC48(iSK7cHY++cD|BWDV?hqejXY1y-2U`q*cgvh}$(#Vk(DHYUz` zCn~r81EW+rqjvf8w->$j3%einaIzHtVs=s8TU%O_#@r$gb(Ip@px3&3xzpoA#>^Iy zGk(WV^BHPgL)h-s$8n*a#wTVScO6+lb(_k*ME8F%i@|4!F6<^9a9}1RM+E$i@8E1V zj^Y#>0HW#Oi5eDG>U1=mhv;wC|Iv>skQ&WHkK{qsl)+BDWC1B4`kfL&R$+ zLf%A4C@!f$Sqm|}B{wBQ?SgT57>KKn{ z6ZwS5#ba7=)QW~`NdF``r8{64wHLOX^swVu4i+$$ck&Bnh= Cm!G-- literal 0 HcmV?d00001 diff --git a/lib/aci/bd/__pycache__/vrf.cpython-310.pyc b/lib/aci/bd/__pycache__/vrf.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88f84b1ddfbc29b2cb6825d24b916b33ea49919d GIT binary patch literal 940 zcmZ`%&2AGh5VpO$A>^l(ii8N_z@sv6KT#1#l1-ER7(782>RO7~Al>kBo+?I<059 zu3nl+!7*k-q!SO3ZHxjK2Jz7s6h5}9oEWMV#O1;8I6KQrofX;^bp~pw%1m2jmda$M z9%p%>voT~#GdY~U^-U>trJaef~_hnqtM9oP^}gt`fBeM3dFcS5ssyyJkK z<2`!}qBCKRQIC6sCmS4f5p={qF=%||a4l%fwTAxd!QTpT?E!-hVQZ_$CgLXL>u&O4 zoyd%@ssnU(D<2~5kPUOd4q6<$rF^u@-4V^@>B7wy&L`I8PNj`WZDtC5sw^J2&a7XOaZPgvGY>9eq?Bp zerJ|f`BZ_d$FEf3e5@-h`FpX3M(uA;m6PM}RwRVSB5{$p!bzQ=-`+zJ^Cs_z4)5^0 z$bvWUYyIpbgrFyUu~^;TUh>tcNBx8bLN}1ox1^lauqa9INcnn^muruq7R(J2f7%Wj i^=>xL*f!8=GHfLZ*r?CL|9?TgIat?vNYUYa?y+A$Ptx`P literal 0 HcmV?d00001 diff --git a/lib/aci/bd/api.py b/lib/aci/bd/api.py new file mode 100644 index 00000000..53194297 --- /dev/null +++ b/lib/aci/bd/api.py @@ -0,0 +1,108 @@ +class BridgeDomainApi(): + def __init__(self): + self.bridge_domain_mo = None + + def get_bridge_domains_mo(self): + if self.bridge_domain_mo is not None: + return self.bridge_domain_mo + + cache = self.get_object_cache( + 'fvBD' + ) + if cache is not None: + self.bridge_domain_mo = cache + self.log.apic_mo( + 'fvBD', + self.bridge_domain_mo + ) + return self.bridge_domain_mo + + query = 'rsp-subtree=children&rsp-subtree-include=health,fault-count' + + # fvRsCtx + # fvRsBdToEpRet + # fvRsIgmpsn + # fvRsMldsn + # fvRsBDToNdP + # fvRsBDToOut + # fvRtLIfCtxToBD + # fvSubnet + # fvRtEPpInfoToBD + # fvRtBDDefToBD + + children = [ + 'fvRsCtx', + 'fvRsBdToEpRet', + 'fvRsIgmpsn', + 'fvRsMldsn', + 'fvRsBDToOut', + 'fvSubnet' + ] + for child in children: + query = '%s&rsp-subtree-class=%s' % (query, child) + + managed_objects = self.get_class( + 'fvBD', + query=query + ) + if managed_objects is None: + self.log.error( + 'get_bridge_domains_mo', + 'API failed' + ) + return None + + self.bridge_domain_mo = [] + + for managed_object in managed_objects['imdata']: + attributes = managed_object['fvBD']['attributes'] + attributes['fvSubnet'] = self.get_mo_children_attributes( + 'fvBD', + managed_object, + 'fvSubnet' + ) + attributes['fvRsBDToOut'] = self.get_mo_children_attributes( + 'fvBD', + managed_object, + 'fvRsBDToOut' + ) + attributes['fvRsCtx'] = self.get_mo_child_attributes( + 'fvBD', + managed_object, + 'fvRsCtx' + ) + attributes['fvRsMldsn'] = self.get_mo_child_attributes( + 'fvBD', + managed_object, + 'fvRsMldsn' + ) + attributes['fvRsIgmpsn'] = self.get_mo_child_attributes( + 'fvBD', + managed_object, + 'fvRsIgmpsn' + ) + attributes['fvRsBdToEpRet'] = self.get_mo_child_attributes( + 'fvBD', + managed_object, + 'fvRsBdToEpRet' + ) + attributes['healthInst'] = self.get_mo_child_attributes( + 'fvBD', + managed_object, + 'healthInst' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'fvBD', + managed_object, + 'faultCounts' + ) + self.bridge_domain_mo.append( + attributes + ) + + self.set_object_cache( + 'fvBD', + self.bridge_domain_mo + ) + + return self.bridge_domain_mo diff --git a/lib/aci/bd/audit/__init__.py b/lib/aci/bd/audit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/bd/audit/api.py b/lib/aci/bd/audit/api.py new file mode 100644 index 00000000..20ac03bd --- /dev/null +++ b/lib/aci/bd/audit/api.py @@ -0,0 +1,48 @@ +class BridgeDomainAuditApi(): + def __init__(self): + self.bridge_domain_audit_mo = None + + def get_bridge_domain_audit_mo(self): + cache = self.get_object_cache( + 'fvBD.audit' + ) + if cache is not None: + self.bridge_domain_audit_mo = cache + self.log.apic_mo( + 'fvBD.audit', + self.bridge_domain_audit_mo + ) + return self.bridge_domain_audit_mo + + query = 'rsp-subtree-include=audit-logs,no-scoped,subtree&order-by=aaaModLR.created|desc&page=0&page-size=%s' % (self.api_audit_limit) + managed_objects = self.get_class( + 'fvBD', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_bridge_domain_audit_mo', + 'API failed' + ) + return None + + self.bridge_domain_audit_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['aaaModLR']['attributes'] + self.bridge_domain_audit_mo.append( + attributes + ) + + self.log.apic_mo( + 'fvBD.audit', + self.bridge_domain_audit_mo + ) + + self.set_object_cache( + 'fvBD.audit', + self.bridge_domain_audit_mo + ) + + return self.bridge_domain_audit_mo diff --git a/lib/aci/bd/audit/info.py b/lib/aci/bd/audit/info.py new file mode 100644 index 00000000..abac592b --- /dev/null +++ b/lib/aci/bd/audit/info.py @@ -0,0 +1,110 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class BridgeDomainAuditInfo(): + def __init__(self): + self.bridge_domain_audit = None + + def get_bridge_domain_audit_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['bdName'] = None + + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/BD-bmk8s_2_BD + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/BD-' in info['affected']: + info['bdName'] = info['affected'].split('/BD-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['bdName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['bdName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_bridge_domain_audit(self): + if self.bridge_domain_audit is not None: + return self.bridge_domain_audit + + managed_objects = self.get_bridge_domain_audit_mo() + if managed_objects is None: + return None + + self.bridge_domain_audit = [] + for managed_object in managed_objects: + audit_info = self.get_bridge_domain_audit_info( + managed_object + ) + self.bridge_domain_audit.append( + audit_info + ) + + self.log.apic_mo( + 'fvBD.auditRecord.info', + self.bridge_domain_audit + ) + + return self.bridge_domain_audit + + def get_bridge_domain_id_audit(self, tenant_name, bd_name, audit_filter=None): + audits = [] + + all_audits = self.get_bridge_domain_audit() + if all_audits is None: + return audits + + for audit_info in all_audits: + if audit_info['tenantName'] is not None and audit_info['bdName'] is not None: + if audit_info['tenantName'] == tenant_name and audit_info['bdName'] == bd_name: + if not self.match_system_fault(audit_info, audit_filter, exclude_cleared=False): + continue + + audits.append( + audit_info + ) + + return audits diff --git a/lib/aci/bd/audit/main.py b/lib/aci/bd/audit/main.py new file mode 100644 index 00000000..1634c007 --- /dev/null +++ b/lib/aci/bd/audit/main.py @@ -0,0 +1,8 @@ +from lib.aci.bd.audit.api import BridgeDomainAuditApi +from lib.aci.bd.audit.info import BridgeDomainAuditInfo + + +class BridgeDomainAudit(BridgeDomainAuditApi, BridgeDomainAuditInfo): + def __init__(self): + BridgeDomainAuditApi.__init__(self) + BridgeDomainAuditInfo.__init__(self) diff --git a/lib/aci/bd/event/__init__.py b/lib/aci/bd/event/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/bd/event/api.py b/lib/aci/bd/event/api.py new file mode 100644 index 00000000..38b5af2d --- /dev/null +++ b/lib/aci/bd/event/api.py @@ -0,0 +1,51 @@ +class BridgeDomainEventApi(): + def __init__(self): + self.bridge_domain_event_mo = None + + def get_bridge_domain_event_mo(self): + if self.bridge_domain_event_mo is not None: + return self.bridge_domain_event_mo + + cache = self.get_object_cache( + 'fvBD.eventLog' + ) + if cache is not None: + self.bridge_domain_event_mo = cache + self.log.apic_mo( + 'fvBD.eventLog', + self.bridge_domain_event_mo + ) + return self.bridge_domain_event_mo + + query = 'rsp-subtree-include=event-logs,no-scoped,subtree&order-by=eventRecord.created|desc&page=0&page-size=%s' % (self.api_event_limit) + managed_objects = self.get_class( + 'fvBD', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_bridge_domain_event_mo', + 'API failed' + ) + return None + + self.bridge_domain_event_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['eventRecord']['attributes'] + self.bridge_domain_event_mo.append( + attributes + ) + + self.log.apic_mo( + 'fvBD.eventLog', + self.bridge_domain_event_mo + ) + + self.set_object_cache( + 'fvBD.eventLog', + self.bridge_domain_event_mo + ) + + return self.bridge_domain_event_mo diff --git a/lib/aci/bd/event/info.py b/lib/aci/bd/event/info.py new file mode 100644 index 00000000..b0af3ddf --- /dev/null +++ b/lib/aci/bd/event/info.py @@ -0,0 +1,124 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class BridgeDomainEventInfo(): + def __init__(self): + self.bridge_domain_event = None + + def get_bridge_domain_event_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['bdName'] = None + + if 'affected' in info: + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/BD-bmk8s_2_BD + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/BD-' in info['affected']: + info['bdName'] = info['affected'].split('/BD-')[1].split('/')[0] + + if 'affected' not in info and 'dn' in info: + if 'uni/tn-' in info['dn']: + # uni/tn-k8s/BD-bmk8s_2_BD + info['tenantName'] = info['dn'].split('uni/tn-')[1].split('/')[0] + + if '/BD-' in info['dn']: + info['bdName'] = info['dn'].split('/BD-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['bdName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['bdName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_bridge_domain_event(self, deduplicate=True): + if self.bridge_domain_event is not None: + return self.bridge_domain_event + + managed_objects = self.get_bridge_domain_event_mo() + if managed_objects is None: + return None + + self.bridge_domain_event = [] + transaction_ids = [] + for managed_object in managed_objects: + event_info = self.get_bridge_domain_event_info( + managed_object + ) + if not deduplicate or event_info['txId'] not in transaction_ids: + self.bridge_domain_event.append( + event_info + ) + transaction_ids.append( + event_info['txId'] + ) + + self.log.apic_mo( + 'fvBD.eventLog.info', + self.bridge_domain_event + ) + + return self.bridge_domain_event + + def get_bridge_domain_id_event(self, tenant_name, bd_name, event_filter=None): + events = [] + + all_events = self.get_bridge_domain_event() + if all_events is None: + return events + + for event_info in all_events: + if event_info['tenantName'] is not None and event_info['bdName'] is not None: + if event_info['tenantName'] == tenant_name and event_info['bdName'] == bd_name: + if not self.match_system_fault(event_info, event_filter): + continue + + events.append( + event_info + ) + + return events diff --git a/lib/aci/bd/event/main.py b/lib/aci/bd/event/main.py new file mode 100644 index 00000000..0a052387 --- /dev/null +++ b/lib/aci/bd/event/main.py @@ -0,0 +1,8 @@ +from lib.aci.bd.event.api import BridgeDomainEventApi +from lib.aci.bd.event.info import BridgeDomainEventInfo + + +class BridgeDomainEvent(BridgeDomainEventApi, BridgeDomainEventInfo): + def __init__(self): + BridgeDomainEventApi.__init__(self) + BridgeDomainEventInfo.__init__(self) diff --git a/lib/aci/bd/fault/__init__.py b/lib/aci/bd/fault/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/bd/fault/api.py b/lib/aci/bd/fault/api.py new file mode 100644 index 00000000..2d10c8a0 --- /dev/null +++ b/lib/aci/bd/fault/api.py @@ -0,0 +1,118 @@ +class BridgeDomainFaultApi(): + def __init__(self): + self.bridge_domain_fault_mo = None + self.bridge_domain_fault_record_mo = None + + def get_bridge_domain_fault_mo(self): + cache = self.get_object_cache( + 'fvBD.fault' + ) + if cache is not None: + self.bridge_domain_fault_mo = cache + self.log.apic_mo( + 'fvBD.fault', + self.bridge_domain_fault_mo + ) + return self.bridge_domain_fault_mo + + query = 'rsp-subtree-include=faults,no-scoped,subtree' + managed_objects = self.get_class( + 'fvBD', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_bridge_domain_fault_mo', + 'API failed' + ) + return None + + self.bridge_domain_fault_mo = [] + + for managed_object in managed_objects['imdata']: + if 'faultInst' in managed_object: + attributes = managed_object['faultInst']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = False + self.bridge_domain_fault_mo.append( + attributes + ) + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = True + self.bridge_domain_fault_mo.append( + attributes + ) + + self.log.apic_mo( + 'fvBD.fault', + self.bridge_domain_fault_mo + ) + + self.set_object_cache( + 'fvBD.fault', + self.bridge_domain_fault_mo + ) + + return self.bridge_domain_fault_mo + + def get_bridge_domain_fault_record_mo(self): + cache = self.get_object_cache( + 'fvBD.faultRecord' + ) + if cache is not None: + self.bridge_domain_fault_record_mo = cache + self.log.apic_mo( + 'fvBD.faultRecord', + self.bridge_domain_fault_record_mo + ) + return self.bridge_domain_fault_record_mo + + query = 'rsp-subtree-include=fault-records,no-scoped,subtree&order-by=faultRecord.created|desc&page=0&page-size=%s' % (self.api_fault_limit) + managed_objects = self.get_class( + 'fvBD', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_bridge_domain_fault_record_mo', + 'API failed' + ) + return None + + self.bridge_domain_fault_record_mo = [] + + for managed_object in managed_objects['imdata']: + if 'faultRecord' in managed_object: + attributes = managed_object['faultRecord']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = False + self.bridge_domain_fault_record_mo.append( + attributes + ) + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = True + self.bridge_domain_fault_record_mo.append( + attributes + ) + + self.log.apic_mo( + 'fvBD.faultRecord', + self.bridge_domain_fault_record_mo + ) + + self.set_object_cache( + 'fvBD.faultRecord', + self.bridge_domain_fault_record_mo + ) + + return self.bridge_domain_fault_record_mo diff --git a/lib/aci/bd/fault/info.py b/lib/aci/bd/fault/info.py new file mode 100644 index 00000000..6cb2330b --- /dev/null +++ b/lib/aci/bd/fault/info.py @@ -0,0 +1,155 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class BridgeDomainFaultInfo(): + def __init__(self): + self.bridge_domain_fault = None + self.bridge_domain_fault_record = None + + def get_bridge_domain_fault_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['bdName'] = None + + if not managed_object['delegated']: + if 'affected' in info: + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/BD-bmk8s_2_BD + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/BD-' in info['affected']: + info['bdName'] = info['affected'].split('/BD-')[1].split('/')[0] + + if info['tenantName'] is None: + if 'uni/tn-' in info['dn']: + # uni/tn-k8s/BD-bmk8s_2_BD + info['tenantName'] = info['dn'].split('uni/tn-')[1].split('/')[0] + + if '/BD-' in info['dn']: + info['bdName'] = info['dn'].split('/BD-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['bdName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['bdName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_bridge_domain_fault(self): + if self.bridge_domain_fault is not None: + return self.bridge_domain_fault + + managed_objects = self.get_bridge_domain_fault_mo() + if managed_objects is None: + return None + + self.bridge_domain_fault = [] + + for managed_object in managed_objects: + fault_info = self.get_bridge_domain_fault_info( + managed_object + ) + self.bridge_domain_fault.append( + fault_info + ) + + self.log.apic_mo( + 'fvBD.fault.info', + self.bridge_domain_fault + ) + + return self.bridge_domain_fault + + def get_bridge_domain_fault_record(self, deduplicate=True): + if self.bridge_domain_fault_record is not None: + return self.bridge_domain_fault_record + + managed_objects = self.get_bridge_domain_fault_record_mo() + if managed_objects is None: + return None + + self.bridge_domain_fault_record = [] + fault_ids = [] + + for managed_object in managed_objects: + fault_info = self.get_bridge_domain_fault_info( + managed_object + ) + if not deduplicate or fault_info['id'] not in fault_ids: + self.bridge_domain_fault_record.append( + fault_info + ) + fault_ids.append( + fault_info['id'] + ) + + self.log.apic_mo( + 'fvBD.faultRecord.info', + self.bridge_domain_fault_record + ) + + return self.bridge_domain_fault_record + + def get_bridge_domain_id_fault(self, tenant_name, bd_name, fault_object, fault_filter=None): + faults = [] + + if fault_object == 'faultInst': + all_faults = self.get_bridge_domain_fault() + if all_faults is None: + return faults + + fault_filter = self.remove_system_fault_timestamp_filter( + fault_filter + ) + + if fault_object == 'faultRecord': + all_faults = self.get_bridge_domain_fault_record() + if all_faults is None: + return faults + + for fault_info in all_faults: + if fault_info['tenantName'] is not None and fault_info['bdName'] is not None: + if fault_info['tenantName'] == tenant_name and fault_info['bdName'] == bd_name: + if not self.match_system_fault(fault_info, fault_filter, exclude_cleared=False): + continue + + faults.append( + fault_info + ) + + return faults diff --git a/lib/aci/bd/fault/main.py b/lib/aci/bd/fault/main.py new file mode 100644 index 00000000..bf15af07 --- /dev/null +++ b/lib/aci/bd/fault/main.py @@ -0,0 +1,8 @@ +from lib.aci.bd.fault.api import BridgeDomainFaultApi +from lib.aci.bd.fault.info import BridgeDomainFaultInfo + + +class BridgeDomainFault(BridgeDomainFaultApi, BridgeDomainFaultInfo): + def __init__(self): + BridgeDomainFaultApi.__init__(self) + BridgeDomainFaultInfo.__init__(self) diff --git a/lib/aci/bd/igmp/__init__.py b/lib/aci/bd/igmp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/bd/igmp/__pycache__/__init__.cpython-310.pyc b/lib/aci/bd/igmp/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f8236567078dcfccd408f12f3c817bce3fc0d02 GIT binary patch literal 148 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HyvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oQc6r_dTv2Xe0*kJW=VX!UP0w84x8Nk Rl+v73JCK3JOhAH#0RT)$BIW=9 literal 0 HcmV?d00001 diff --git a/lib/aci/bd/igmp/__pycache__/info.cpython-310.pyc b/lib/aci/bd/igmp/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e961bec9f05dd0040a98d42e46b72fd0faa6fe1 GIT binary patch literal 1123 zcmaJ=&1w`u5bmD8teZ)UYYYT6c*$V}6TzE=5KKUFStao_3^cP-y=$A?Ixq$E+L95W~9Mwu@>g-pgVvbxx+6%R^-kseXh^vV;S} za1P!DOMLJlz<&TCZWr0rS6abP9#o@Dm50O8_^=#QImf`OMKaMoQXL=zhLODYgUSeM zSqwB;9lLz7|1v$v3YF%n&Z`vUsVq`eOMNPJTBv@S79Sb3$D$Y9N*1D*TOtVxK(4&hgAU>>SU%jx9X#^kE~T-E;O}oqb~v ze&-M&Vgc9}M54Flymy@3{tvn6V&WzSu}kPj?y$={4DM2Vqph=nw?^I-w?|Wjug`B* z0rT_SyFCl;x$JV_&d@=PWBruH!<)I^qlUhjnDNBeur`^INi?YRNJ8S9gYuGZ&*(m9 z)HWL#S!Sh4I>z1paamR4w^h;0MlxB=t8$=*6DJm-Q>`IoKNmg9D zZBQa;8gACxo3(9|@~+9?o1@bDM-p&s!g^dN)Ae;oH7t*^G8;+|RsVy`jSXlpu7^rT z1bR4>M)cjV3UJdZXozrf2Gt@0>Zizp2Q40ZG2h@Ze}d%k2*389IE*=Z_!<&@fj50V zcfM{(((8uQSUQmqwk^b{f=NMgEW}4_LgUf+#F<_r_U~CV5*l0}PPw z0J&nXJPk0shq&`gT@bT6y0IFU>b5E}T~3$9YFaL;+!xyxP%=-F$)O;|1=j0P|H>9wJclH7wL=b`gvsoNiKc?_v4`yW{Fr5O7&jvg zG`q|SC1u@{vZ!!l{Jk&b<0dovN`u%CYK2n*w_ctf=X~fwpEWPDn5Pl3ONd=E$HcQs dG%dMN+qATRyin`W>hAS^{>X2xf$T%X{{e9!aRdMW literal 0 HcmV?d00001 diff --git a/lib/aci/bd/igmp/info.py b/lib/aci/bd/igmp/info.py new file mode 100644 index 00000000..32f69cc4 --- /dev/null +++ b/lib/aci/bd/igmp/info.py @@ -0,0 +1,55 @@ +from lib import log_helper + + +# https://www.cisco.com/c/en/us/td/docs/switches/datacenter/aci/apic/sw/2-x/KB/b_KB_Cisco_APIC_IGMP_Multicast.html + + +class BridgeDomainIgmpInfo(): + def __init__(self): + pass + + def get_bridge_domain_igmp_info(self, managed_object): + # "annotation": "", + # "childAction": "", + # "extMngdBy": "", + # "forceResolve": "yes", + # "lcOwn": "local", + # "modTs": "2021-10-27T15:21:50.404+01:00", + # "monPolDn": "uni/tn-common/monepg-default", + # "rType": "mo", + # "rn": "rsigmpsn", + # "state": "formed", + # "stateQual": "default-target", + # "status": "", + # "tCl": "igmpSnoopPol", + # "tContextDn": "", + # "tDn": "uni/tn-common/snPol-default", + # "tRn": "snPol-default", + # "tType": "name", + # "tnIgmpSnoopPolName": "", + # "uid": "0", + # "userdom": "all" + info = {} + info['__Output'] = {} + + if managed_object['state'] == 'formed': + info['state'] = managed_object['state'] + info['tenant'] = managed_object['tDn'].split('/')[1][3:] + info['configuredPolicyName'] = managed_object['tnIgmpSnoopPolName'] + info['actualPolicyName'] = managed_object['tDn'].split('/')[2].split('snPol-')[1] + info['name'] = info['actualPolicyName'] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + + if managed_object['state'] != 'formed': + info['state'] = managed_object['state'] + info['tenant'] = None + info['configuredPolicyName'] = managed_object['tnIgmpSnoopPolName'] + info['actualPolicyName'] = managed_object['tRn'].split('snPol-')[1] + info['name'] = info['actualPolicyName'] + info['nameTenant'] = info['name'] + info['__Output']['nameTenant'] = 'Red' + + return info diff --git a/lib/aci/bd/igmp/main.py b/lib/aci/bd/igmp/main.py new file mode 100644 index 00000000..4487d6e3 --- /dev/null +++ b/lib/aci/bd/igmp/main.py @@ -0,0 +1,6 @@ +from lib.aci.bd.igmp.info import BridgeDomainIgmpInfo + + +class BridgeDomainIgmp(BridgeDomainIgmpInfo): + def __init__(self): + BridgeDomainIgmpInfo.__init__(self) diff --git a/lib/aci/bd/info.py b/lib/aci/bd/info.py new file mode 100644 index 00000000..5aec36b2 --- /dev/null +++ b/lib/aci/bd/info.py @@ -0,0 +1,507 @@ +import copy + +from lib import filter_helper +from lib import ip_helper + + +class BridgeDomainInfo(): + def __init__(self): + self.bridge_domains = None + + def get_bridge_domain_count(self, tenant_name=None): + bridge_domain_filter = None + if tenant_name is not None: + bridge_domain_filter = ['tenant:%s' % (tenant_name)] + + bridge_domains = self.get_bridge_domains( + bridge_domain_filter=bridge_domain_filter + ) + return len(bridge_domains) + + def get_bridge_domain_info(self, managed_object): + info = {} + info['__Output'] = {} + + keys = [ + 'arpFlood', + 'bcastP', + 'descr', + 'dn', + 'epClear', + 'epMoveDetectMode', + 'hostBasedRouting', + 'intersiteBumTrafficAllow', + 'intersiteL2Stretch', + 'ipLearning', + 'ipv6McastAllow', + 'limitIpLearnToSubnets', + 'llAddr', + 'mac', + 'mcastARPDrop', + 'mcastAllow', + 'mtu', + 'multiDstPktAct', + 'name', + 'pcTag', + 'seg', + 'type', + 'unicastRoute', + 'unkMacUcastAct', + 'unkMcastAct', + 'v6unkMcastAct', + 'vmac', + ] + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + if info['vmac'] == 'not-applicable': + info['vmac'] = '' + + info['unkMacUcastActT'] = info['unkMacUcastAct'] + if info['unkMacUcastAct'] == 'flood': + info['unkMacUcastActT'] = 'Flood' + if info['unkMacUcastAct'] == 'proxy': + info['unkMacUcastActT'] = 'Hardware Proxy' + + info['multiDstPktActT'] = info['multiDstPktAct'] + if info['multiDstPktAct'] == 'bd-flood': + info['multiDstPktActT'] = 'Flood in BD' + if info['multiDstPktAct'] == 'drop': + info['multiDstPktActT'] = 'Drop' + if info['multiDstPktAct'] == 'encap-flood': + info['multiDstPktActT'] = 'Flood in Encap' + + if info['arpFlood'] == 'yes': + info['arpFloodTick'] = '\u2713' + else: + info['arpFloodTick'] = '\u2717' + + if info['epClear'] == 'yes': + info['epClearTick'] = '\u2713' + else: + info['epClearTick'] = '\u2717' + + if info['intersiteL2Stretch'] == 'yes': + info['intersiteL2StretchTick'] = '\u2713' + else: + info['intersiteL2StretchTick'] = '\u2717' + + if info['unicastRoute'] == 'yes': + info['unicastRouteTick'] = '\u2713' + else: + info['unicastRouteTick'] = '\u2717' + + if info['ipLearning'] == 'yes': + info['ipLearningTick'] = '\u2713' + else: + info['ipLearningTick'] = '\u2717' + + if info['limitIpLearnToSubnets'] == 'yes': + info['limitIpLearnToSubnetsTick'] = '\u2713' + else: + info['limitIpLearnToSubnetsTick'] = '\u2717' + + if info['hostBasedRouting'] == 'yes': + info['hostBasedRoutingTick'] = '\u2713' + else: + info['hostBasedRoutingTick'] = '\u2717' + + info['vmacT'] = info['vmac'] + if info['vmac'] is None or len(info['vmac']) == 0: + info['vmacT'] = '--' + + info['epMoveDetectModeT'] = info['epMoveDetectMode'] + if info['epMoveDetectMode'] is None or len(info['epMoveDetectMode']) == 0: + info['epMoveDetectModeT'] = '--' + + if info['mcastAllow'] == 'yes': + info['mcastAllowTick'] = '\u2713' + info['__Output']['mcastAllowTick'] = 'Green' + else: + info['mcastAllowTick'] = '\u2717' + info['__Output']['mcastAllowTick'] = 'Red' + + info['unkMcastActT'] = info['unkMcastAct'] + if info['unkMcastAct'] == 'flood': + info['unkMcastActT'] = 'Flood' + if info['unkMcastAct'] == 'opt-flood': + info['unkMcastActT'] = 'Optimized Flood' + + if info['ipv6McastAllow'] == 'yes': + info['ipv6McastAllowTick'] = '\u2713' + info['__Output']['ipv6McastAllowTick'] = 'Green' + else: + info['ipv6McastAllowTick'] = '\u2717' + info['__Output']['ipv6McastAllowTick'] = 'Red' + + info['v6unkMcastActT'] = info['v6unkMcastAct'] + if info['v6unkMcastAct'] == 'flood': + info['v6unkMcastActT'] = 'Flood' + if info['v6unkMcastAct'] == 'opt-flood': + info['v6unkMcastActT'] = 'Optimized Flood' + + info['tenant'] = info['dn'].split('/')[1][3:] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + + subnets = [] + info['fvSubnet'] = [] + for subnet_managed_object in managed_object['fvSubnet']: + subnet_info = self.get_bridge_domain_subnet_info( + subnet_managed_object + ) + info['fvSubnet'].append( + subnet_info + ) + subnets.append( + subnet_info['ip'] + ) + info['fvSubnetCount'] = len( + info['fvSubnet'] + ) + info['fvSubnets'] = ','.join(subnets) + + info['fvRsCtx'] = self.get_bridge_domain_vrf_info( + managed_object['fvRsCtx'] + ) + + info['fvRsBDToOut'] = [] + for l3out_managed_object in managed_object['fvRsBDToOut']: + info['fvRsBDToOut'].append( + self.get_bridge_domain_l3out_info( + l3out_managed_object + ) + ) + info['l3OutCount'] = len( + info['fvRsBDToOut'] + ) + + info['fvRsIgmpsn'] = self.get_bridge_domain_igmp_info( + managed_object['fvRsIgmpsn'] + ) + + info['fvRsMldsn'] = self.get_bridge_domain_mld_info( + managed_object['fvRsMldsn'] + ) + + (info['__Output']['health'], info['health']) = self.get_health_info( + managed_object['healthInst']['cur'] + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_bridge_domains_info(self): + if self.bridge_domains is not None: + return self.bridge_domains + + bridge_domains_mo = self.get_bridge_domains_mo() + if bridge_domains_mo is None: + return None + + self.bridge_domains = [] + for managed_object in bridge_domains_mo: + self.bridge_domains.append( + self.get_bridge_domain_info( + managed_object + ) + ) + + return self.bridge_domains + + def match_bridge_domain(self, bridge_domain_info, bridge_domain_filter): + if bridge_domain_filter is None or len(bridge_domain_filter) == 0: + return True + + for aepg_rule in bridge_domain_filter: + (key, value) = aepg_rule.split(':') + key_found = False + + if key == 'name': + key_found = True + if not filter_helper.match_string(value, bridge_domain_info['name']): + return False + + if key == 'dn': + key_found = True + if not filter_helper.match_string(value, bridge_domain_info['dn']): + return False + + if key == 'tenant': + key_found = True + if not filter_helper.match_string(value, bridge_domain_info['tenant']): + return False + + if key == 'vrf': + key_found = True + if bridge_domain_info['fvRsCtx'] is None or 'name' not in bridge_domain_info['fvRsCtx']: + return False + + if not filter_helper.match_tenant_name(value, bridge_domain_info['fvRsCtx']['nameTenant']): + return False + + if key == 'epg': + key_found = True + if 'fvAEPg' not in bridge_domain_info or bridge_domain_info['fvAEPg'] is None: + return False + + found = False + for epg_info in bridge_domain_info['fvAEPg']: + if filter_helper.match_tenant_name(value, epg_info['nameTenant']): + found = True + break + + if not found: + return False + + if key == 'l3out': + key_found = True + if bridge_domain_info['fvRsBDToOut'] is None: + return False + + found = False + for l3out_info in bridge_domain_info['fvRsBDToOut']: + if filter_helper.match_tenant_name(value, l3out_info['nameTenant']): + found = True + break + + if not found: + return False + + if key == 'subnet': + key_found = True + if bridge_domain_info['fvSubnet'] is None: + return False + + found = False + for bd_subnet in bridge_domain_info['fvSubnet']: + if ip_helper.is_subnet_in_subnet(bd_subnet['network'], value): + found = True + break + + if not found: + return False + + if key == 'ip': + key_found = True + if bridge_domain_info['fvSubnet'] is None: + return False + + found = False + for bd_subnet in bridge_domain_info['fvSubnet']: + if ip_helper.is_ipv4_in_cidr(value, bd_subnet['network']): + found = True + break + + if not found: + return False + + if key == 'fault': + key_found = True + if value == 'any': + if not bridge_domain_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_bd', + 'Unsupported fault filtering value: %s' % (value) + ) + + if not key_found: + self.log.error( + 'match_bd', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_bridge_domain( + self, + tenant_name, + bridge_domain_name, + endpoint_info=False, + endpoint_vm_info=False, + snoop_info=False, + vrf_info=False, + epg_info=False + ): + bridge_domain_filter = [] + bridge_domain_filter.append( + 'tenant:%s' % (tenant_name) + ) + bridge_domain_filter.append( + 'name:%s' % (bridge_domain_name) + ) + + bridge_domains = self.get_bridge_domains( + bridge_domain_filter=bridge_domain_filter, + endpoint_info=endpoint_info, + endpoint_vm_info=endpoint_vm_info, + snoop_info=snoop_info, + vrf_info=vrf_info, + epg_info=epg_info + ) + if len(bridge_domains) == 1: + return bridge_domains[0] + + self.log.error( + 'get_bridge_domain', + 'Not found: %s/%s (%s)' % ( + tenant_name, + bridge_domain_name, + len(bridge_domains) + ) + ) + + return None + + def get_bridge_domains( + self, + bridge_domain_filter=None, + endpoint_info=False, + endpoint_vm_info=False, + endpoint_fabric_info=False, + snoop_info=False, + vrf_info=False, + epg_info=False, + node_info=False, + fault_info=False, + hfault_info=False, + event_info=False, + audit_info=False, + hfault_filter=None, + event_filter=None, + audit_filter=None + ): + all_bridge_domains = self.get_bridge_domains_info() + if all_bridge_domains is None: + return None + + bridge_domains = [] + for bridge_domain_info in all_bridge_domains: + if vrf_info: + bridge_domain_info['fvCtx'] = copy.deepcopy( + self.get_vrf( + bridge_domain_info['fvRsCtx']['dn'] + ) + ) + + if epg_info: + epg_filter = ['bd:%s/%s' % (bridge_domain_info['tenant'], bridge_domain_info['name'])] + bridge_domain_info['fvAEPg'] = copy.deepcopy( + self.get_epgs( + epg_filter=epg_filter, + bd_info=True, + endpoint_info=True + ) + ) + bridge_domain_info['epgCount'] = len( + bridge_domain_info['fvAEPg'] + ) + + if not self.match_bridge_domain(bridge_domain_info, bridge_domain_filter): + continue + + if endpoint_info: + endpoint_filter = ['bd:%s/%s' % (bridge_domain_info['tenant'], bridge_domain_info['name'])] + bridge_domain_info['fvCEp'] = copy.deepcopy( + self.get_endpoints( + endpoint_filter=endpoint_filter, + vm_info=endpoint_vm_info, + fabric_info=endpoint_fabric_info + ) + ) + + bridge_domain_info['endpointCount'] = 0 + if bridge_domain_info['fvCEp'] is not None: + bridge_domain_info['endpointCount'] = len( + bridge_domain_info['fvCEp'] + ) + + bridge_domain_info['fvSubnet'] = copy.deepcopy( + self.get_subnet_usage( + bridge_domain_info['fvSubnet'], + bridge_domain_info['fvCEp'] + ) + ) + + if snoop_info: + bridge_domain_info['fvRsIgmpsn']['policy'] = copy.deepcopy( + self.get_policy_snoop_igmp( + bridge_domain_info['fvRsIgmpsn']['tenant'], + bridge_domain_info['fvRsIgmpsn']['actualPolicyName'] + ) + ) + + bridge_domain_info['fvRsMldsn']['policy'] = copy.deepcopy( + self.get_policy_snoop_mld( + bridge_domain_info['fvRsMldsn']['tenant'], + bridge_domain_info['fvRsMldsn']['actualPolicyName'] + ) + ) + + if node_info: + ap_node_info = self.get_bridge_domain_node( + bridge_domain_info['tenant'], + bridge_domain_info['name'] + ) + bridge_domain_info['node'] = None + bridge_domain_info['interface'] = None + if ap_node_info is not None: + bridge_domain_info['node'] = ap_node_info['node'] + bridge_domain_info['interface'] = ap_node_info['interface'] + + if fault_info: + bridge_domain_info['faultInst'] = self.get_bridge_domain_id_fault( + bridge_domain_info['tenant'], + bridge_domain_info['name'], + 'faultInst' + ) + + if hfault_info: + bridge_domain_info['faultRecord'] = self.get_bridge_domain_id_fault( + bridge_domain_info['tenant'], + bridge_domain_info['name'], + 'faultRecord', + fault_filter=hfault_filter + ) + + if event_info: + bridge_domain_info['eventLog'] = self.get_bridge_domain_id_event( + bridge_domain_info['tenant'], + bridge_domain_info['name'], + event_filter=event_filter + ) + + if audit_info: + bridge_domain_info['auditLog'] = self.get_bridge_domain_id_audit( + bridge_domain_info['tenant'], + bridge_domain_info['name'], + audit_filter=audit_filter + ) + + bridge_domains.append(bridge_domain_info) + + bridge_domains = sorted( + bridge_domains, + key=lambda i: i['nameTenant'].lower() + ) + + self.log.apic_mo( + 'fvBD.info', + bridge_domains + ) + + return bridge_domains diff --git a/lib/aci/bd/l3out/__init__.py b/lib/aci/bd/l3out/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/bd/l3out/__pycache__/__init__.cpython-310.pyc b/lib/aci/bd/l3out/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48e4845f604fe8fe63d46e451cd4cff78d385c72 GIT binary patch literal 149 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!H8vsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oQc6sYaeiq@OniK1US>&ryk0@&Ee@O9 S{FKt1R6CG~#Y{kgg#iF>$|ErV literal 0 HcmV?d00001 diff --git a/lib/aci/bd/l3out/__pycache__/info.cpython-310.pyc b/lib/aci/bd/l3out/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc09b2e757ea0659d36e23e780989abd57060fb5 GIT binary patch literal 812 zcmaJfe$UAVd;7YXv=ugTN2C)UBO8GN7^d><8ww|kswW*)^y2pU@r&ZTtaVXoQ?&)C3so1| zsO~~_MXkq0S?OX7MSa-zw$NB>fBwlOQtC!qDd|Usgy4(EYg^l2g;o@{A_9q8^F5xS zqS@y_vr8O%#4d649d^wiyx}0c7A-ZrkNy3<9g0mx4DOQ;Ee`0L1l#0KF@~UikWr_I z(Y&`Vv?t9iKln+|EJE8nb+J`V+1Py3B9iK(#lWnbDJL3~i)har>=~DmapnUNzR1jL zZHHk;1Gvpu*_2ZSvK_xym34yf`2%i86T020vU2QSO@eA^$*A3 z10Lg-{u0sR*?K(x_q%Ku(ZtlUlrEKW)>iqN!)G1QlpN$)dHCq ct%N0f5PDxWiGQwo6&yva^xc=O)mgFz1{%IQ0P)Az>}?eM9X5sDK^2*?biEMg3<06pXz zK(5#uk3976An5$k6a=guUs#Rz>M~Dbo!v}stMWQq<%#RI!=qwGC`ObNL=1tL7!UrYgwgaa+?x~Tgkngkgb(%#pCl212-qU;X0Y zPUmOhAvRhhx=3g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HSvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oQc6s2PD)ICd}dx|NqoFsLFFwDo80`A Q(wtN~ka@*SK!Sw<03)&@bpQYW literal 0 HcmV?d00001 diff --git a/lib/aci/bd/mld/__pycache__/info.cpython-310.pyc b/lib/aci/bd/mld/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..804c3c8b9319a1dd62ae6b88baf3d631f412d68a GIT binary patch literal 908 zcmZ`1O=}ZDbY?%|8aJ)hT8I?!(nAiW;88*;wjdsiLOq3rVY6=%MmIZgXHsaWUaY^s zKcGkd(p<$u{(y%b#P=q~s>HXvH}7-br*5^H4B`91NB9;q_LYP`Aw=O2(QF}k!hiw4 zKzttz7z8J*6Beld3j&l55zQ_V$p#$QAOH@*1sjAALWFMwF~&CB?Z>r(u{_q3Tvg9X zcv_8g!7*+H#1kGNng|In4CMVUNL*xOIjSk2CzlV89%ZldQe}lQh0Z{p$}&?%)~B-0 zN;S;#LS;k9CM9GFGj*qDE)hai$_jzaGeiH1_2UmK~5{6@laX5zIVtd_BK%L z92@Sjb8NcJJ~0SCbBNjuVqhOogVu((Uh{nNkLPtC(_F@&?+vsg^}cD3L5t#-Qk#u} z9kOna4^C#YPaQp<+3C!>&>mNpe1Aa$Tu`O1VP%z9c5utmv`;Fnr!REb&nMDt7rGj$ z@vN4BDpj13c0s+)QyiH2<@>g8_sssDaZM6l`ZTzr*i1`hJ7Mk9 zZ%pzkA4?E=_(~SmMYM&h1=ci4cXuqU82Y;q;15G!e%#VXCulc2NTNFlzZazZK2LeT z8~8PUMDe`4Zg2npUB464w5VVqTvLdNhFM8`D#RP?acQaPH0o_4zi(~HQN1-yml)GP blCXrQq1W|0+`sFBT+&K*3VR;07>2z6Ruq zz4J7{@E+pMFI7Rz>fx2u_@J(jmRlT83OSz4Azix`GZ-^h{*A7BduuAx=@6W!9#A>mzmjS8p1|S%N-K8^~3pY&btVDta+KnJROp@gtR3yOh{XzX~E5? YO+|~xPiZ|_9i4C6U--2(j6E3ff2#y;1poj5 literal 0 HcmV?d00001 diff --git a/lib/aci/bd/mld/info.py b/lib/aci/bd/mld/info.py new file mode 100644 index 00000000..84411b66 --- /dev/null +++ b/lib/aci/bd/mld/info.py @@ -0,0 +1,41 @@ +# https://www.cisco.com/c/en/us/td/docs/switches/datacenter/aci/apic/sw/4-x/L3-configuration/Cisco-APIC-Layer-3-Networking-Configuration-Guide-411/Cisco-APIC-Layer-3-Networking-Configuration-Guide-411_chapter_010100.html + + +class BridgeDomainMldInfo(): + def __init__(self): + pass + + def get_bridge_domain_mld_info(self, managed_object): + # "annotation": "", + # "childAction": "", + # "extMngdBy": "", + # "forceResolve": "yes", + # "lcOwn": "local", + # "modTs": "2021-10-27T15:21:50.404+01:00", + # "monPolDn": "uni/tn-common/monepg-default", + # "rType": "mo", + # "rn": "rsmldsn", + # "state": "formed", + # "stateQual": "default-target", + # "status": "", + # "tCl": "mldSnoopPol", + # "tContextDn": "", + # "tDn": "uni/tn-common/mldsnoopPol-default", + # "tRn": "mldsnoopPol-default", + # "tType": "name", + # "tnMldSnoopPolName": "", + # "uid": "0", + # "userdom": "all" + info = {} + info['__Output'] = {} + + info['tenant'] = managed_object['tDn'].split('/')[1][3:] + info['configuredPolicyName'] = managed_object['tnMldSnoopPolName'] + info['actualPolicyName'] = managed_object['tDn'].split('/')[2].split('mldsnoopPol-')[1] + info['name'] = info['actualPolicyName'] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + + return info diff --git a/lib/aci/bd/mld/main.py b/lib/aci/bd/mld/main.py new file mode 100644 index 00000000..3424db0e --- /dev/null +++ b/lib/aci/bd/mld/main.py @@ -0,0 +1,6 @@ +from lib.aci.bd.mld.info import BridgeDomainMldInfo + + +class BridgeDomainMld(BridgeDomainMldInfo): + def __init__(self): + BridgeDomainMldInfo.__init__(self) diff --git a/lib/aci/bd/node/__init__.py b/lib/aci/bd/node/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/bd/node/api.py b/lib/aci/bd/node/api.py new file mode 100644 index 00000000..6f561827 --- /dev/null +++ b/lib/aci/bd/node/api.py @@ -0,0 +1,61 @@ +class BridgeDomainNodeApi(): + def __init__(self): + self.bridge_domain_node_mo = {} + + def get_bridge_domain_node_mo(self, tenant_name, bd_name): + key = '%s.%s' % (tenant_name, bd_name) + if key in self.bridge_domain_node_mo: + return self.bridge_domain_node_mo[key] + + cache = self.get_object_cache( + 'fvBD.%s' % (key) + ) + if cache is not None: + self.bridge_domain_node_mo[key] = cache + self.log.apic_mo( + 'fvBD.%s' % (key), + self.bridge_domain_node_mo[key] + ) + return self.bridge_domain_node_mo[key] + + distinguished_name = 'uni/tn-%s/BD-%s' % (tenant_name, bd_name) + query = 'rsp-subtree-include=full-deployment&target-node=all&target-path=BDToNwIf' + managed_objects = self.get_managed_object( + distinguished_name, + query=query, + node_mo=True + ) + + if managed_objects is None: + self.log.error( + 'get_bridge_domain_node_mo', + 'API failed' + ) + return None + + if managed_objects['totalCount'] != '1': + self.log.error( + 'get_bridge_domain_node_mo', + 'Unexpected object count' + ) + return None + + for managed_object in managed_objects['imdata']: + attributes = managed_object['fvBD']['attributes'] + attributes['pconsResourceCtx'] = self.get_mo_node_resource_ctx( + 'fvBD', + managed_object + ) + self.bridge_domain_node_mo[key] = attributes + + self.log.apic_mo( + 'fvBD.%s' % (key), + self.bridge_domain_node_mo[key] + ) + + self.set_object_cache( + 'fvBD.%s' % (key), + self.bridge_domain_node_mo[key] + ) + + return self.bridge_domain_node_mo[key] diff --git a/lib/aci/bd/node/info.py b/lib/aci/bd/node/info.py new file mode 100644 index 00000000..ea81c279 --- /dev/null +++ b/lib/aci/bd/node/info.py @@ -0,0 +1,82 @@ +class BridgeDomainNodeInfo(): + def __init__(self): + self.bridge_domain_node = {} + + def get_bridge_domain_node_info(self, managed_object): + info = {} + info['__Output'] = {} + info['name'] = managed_object['name'] + + node = {} + info['interface'] = [] + for item in managed_object['pconsResourceCtx']: + node_name = self.get_node_name( + item['nodeId'] + ) + + if node_name not in node: + node[node_name] = {} + node[node_name]['node_id'] = item['nodeId'] + node[node_name]['interfaces'] = 0 + + port_info = {} + port_info['__Output'] = {} + port_info['pod_id'] = item['ctxDn'].split('/')[1].split('-')[1] + port_info['node_id'] = item['nodeId'] + port_info['node_name'] = self.get_node_name( + item['nodeId'] + ) + port_info['intf_type'] = item['ctxClass'] + # "topology/pod-1/node-2201/sys/vmms-[eth1/43]" + port_info['intf_name'] = item['ctxDn'].split('[')[1].split(']')[0] + info['interface'].append( + port_info + ) + + node[node_name]['interfaces'] = node[node_name]['interfaces'] + 1 + + info['node'] = [] + for key in node: + node_info = {} + node_info['id'] = node[key]['node_id'] + node_info['name'] = key + node_info['interfaces'] = node[key]['interfaces'] + info['node'].append( + node_info + ) + + info['node'] = sorted( + info['node'], + key=lambda i: i['name'] + ) + + info['interface'] = sorted( + info['interface'], + key=lambda i: ( + i['node_name'], + i['intf_name'] + ) + ) + + return info + + def get_bridge_domain_node(self, tenant_name, ap_name): + key = '%s.%s' % (tenant_name, ap_name) + if key in self.bridge_domain_node: + return self.bridge_domain_node[key] + + # one object or None value is expected + nodes_mo = self.get_bridge_domain_node_mo(tenant_name, ap_name) + if nodes_mo is None: + return None + + self.bridge_domain_node[key] = self.get_bridge_domain_node_info( + nodes_mo + ) + + self.log.apic_mo( + 'fvBD.%s.info' % (key), + self.bridge_domain_node[key] + ) + + return self.bridge_domain_node[key] diff --git a/lib/aci/bd/node/main.py b/lib/aci/bd/node/main.py new file mode 100644 index 00000000..c82ce432 --- /dev/null +++ b/lib/aci/bd/node/main.py @@ -0,0 +1,8 @@ +from lib.aci.bd.node.api import BridgeDomainNodeApi +from lib.aci.bd.node.info import BridgeDomainNodeInfo + + +class BridgeDomainNode(BridgeDomainNodeApi, BridgeDomainNodeInfo): + def __init__(self): + BridgeDomainNodeApi.__init__(self) + BridgeDomainNodeInfo.__init__(self) diff --git a/lib/aci/bd/output.py b/lib/aci/bd/output.py new file mode 100644 index 00000000..e8d24dfe --- /dev/null +++ b/lib/aci/bd/output.py @@ -0,0 +1,777 @@ +class BridgeDomainOutput(): + def __init__(self): + pass + + def print_bridge_domain_properties(self, info): + order = [ + 'health', + 'faults', + 'tenant', + 'name', + 'dn', + 'descr', + 'type', + 'fvSubnetCount', + 'fvRsCtx.nameTenant', + 'l3OutCount', + 'endpointCount', + 'epgCount' + ] + + headers = [ + 'Health', + 'Faults', + 'Tenant', + 'Name', + 'Dn', + 'Description', + 'Type', + 'Subnet Count', + 'VRF', + 'L3Out', + 'Endpoint', + 'EPG' + ] + + self.my_output.dictionary( + info, + title='Bridge Domain Properties', + underline=True, + prefix="- ", + justify=True, + keys=order, + title_keys=headers + ) + + def print_bridge_domain_l2_properties(self, info): + order = [ + 'unkMacUcastActT', + 'bcastP', + 'multiDstPktActT', + 'epClearTick', + 'intersiteL2StretchTick' + ] + + headers = [ + 'L2 Unknown Unicast', + 'Multicast Address (GIPo)', + 'Multi Destination Flooding', + 'Clear Remote MAC Entries', + 'Scaled L2 Only Mode' + ] + + self.my_output.dictionary( + info, + title='L2 Forwarding Properties', + underline=True, + prefix="- ", + justify=True, + keys=order, + title_keys=headers + ) + + def print_bridge_domain_mcast_properties(self, info): + order = [ + 'fvRsIgmpsn.nameTenant', + 'fvRsMldsn.nameTenant', + 'mcastAllowTick', + 'unkMcastActT', + 'ipv6McastAllowTick', + 'v6unkMcastActT' + ] + + headers = [ + 'IGMP Snooping Policy', + 'MLD Snooping Policy', + 'IPv4 Multicast', + 'IPv4 L3 Unknown Multicast Flooding', + 'IPv6 Multicast', + 'IPv6 L3 Unknown Multicast' + ] + + self.my_output.dictionary( + info, + title='Multicast Properties', + underline=True, + prefix="- ", + justify=True, + keys=order, + title_keys=headers + ) + + def print_bridge_domain_l3_properties(self, info): + order = [ + 'unicastRouteTick', + 'mac', + 'vmacT', + 'ipLearningTick', + 'hostBasedRoutingTick', + 'limitIpLearnToSubnetsTick', + 'arpFloodTick', + 'epMoveDetectModeT' + ] + + headers = [ + 'Unicast Routing', + 'BD MAC Address', + 'Virtual MAC Address', + 'IP Learning', + 'Advertise Host Routes', + 'Limit Local IP Learning to BD/EPG Subnets', + 'ARP Flooding', + 'EP Move Detection Mode' + ] + + self.my_output.dictionary( + info, + title='L3 Forwarding Properties', + underline=True, + prefix="- ", + justify=True, + keys=order, + title_keys=headers + ) + + def print_bridge_domain_subnets(self, info): + order = [ + 'network', + 'gateway', + 'preferredTick', + 'virtualTick', + 'scope', + 'ipDPLearningTick', + 'usage', + 'available' + ] + + headers = [ + 'Network', + 'Gateway', + 'Preferred', + 'Virtual', + 'Scope', + 'IP Data Plane Learning', + 'IP Usage', + 'IP Available' + ] + + self.my_output.my_table( + info, + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=False, + underline=True, + table=True + ) + + def print_bridge_domain_epgs(self, info): + self.my_output.default( + 'Endpoint Groups', + underline=True, + before_newline=True + ) + + order = [ + 'adminUpTick', + 'nameApTenant', + 'endpointCount', + 'contractCount' + ] + + headers = [ + 'Up', + 'EPG', + 'Endpoints', + 'Contract' + ] + + self.my_output.my_table( + info['fvAEPg'], + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_bridge_domain_endpoints(self, info): + self.my_output.default( + 'Bridge Domain Endpoints', + underline=True + ) + + self.print_endpoints( + info['fvCEp'] + ) + + vmm_endpoints = [] + for endpoint_info in info['fvCEp']: + if 'fvRsToVm' in endpoint_info and endpoint_info['fvRsToVm'] is not None: + vmm_endpoints.append( + endpoint_info + ) + + if len(vmm_endpoints) > 0: + self.my_output.default( + 'Bridge Domain Endpoints with VMM information', + underline=True, + before_newline=True + ) + self.print_endpoints_vmm( + vmm_endpoints + ) + + def print_bridge_domain(self, info): + self.print_bridge_domain_properties( + info + ) + + self.print_bridge_domain_l2_properties( + info + ) + + self.print_bridge_domain_mcast_properties( + info + ) + + self.print_policy_snoop_igmp( + info['fvRsIgmpsn']['policy'] + ) + + self.print_policy_snoop_mld( + info['fvRsMldsn']['policy'] + ) + + self.print_bridge_domain_l3_properties( + info + ) + + if len(info['fvSubnet']) > 0: + self.print_bridge_domain_subnets( + info['fvSubnet'] + ) + + if len(info['fvAEPg']) > 0: + self.print_bridge_domain_epgs( + info + ) + + self.print_vrf_properties( + info['fvCtx'] + ) + + if len(info['fvCEp']) > 0: + self.print_bridge_domain_endpoints( + info + ) + + def print_bridge_domains_l2(self, info, title=False): + if title: + self.my_output.default( + 'Bridge Domain - L2 Forwarding Properties [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'unkMacUcastActT', + 'bcastP', + 'arpFloodTick', + 'multiDstPktActT', + 'epClearTick' + ] + + headers = [ + 'Bridge Domain', + 'L2 Unknown Ucast', + 'Mcast (GIPo)', + 'ARP Flooding', + 'Multi Dest Flooding', + 'Clear Remote MAC' + ] + + self.my_output.my_table( + info, + order=order, + headers=headers, + allow_order_subkeys=True, + row_separator=True, + underline=True, + table=True + ) + + def print_bridge_domains_l3(self, info, title=False): + if title: + self.my_output.default( + 'Bridge Domain - L3 Forwarding Properties [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'unicastRouteTick', + 'mac', + 'vmacT', + 'ipLearningTick', + 'limitIpLearnToSubnetsTick', + 'hostBasedRoutingTick', + 'epMoveDetectModeT' + ] + + headers = [ + 'Bridge Domain', + 'Ucast Routing', + 'BD MAC', + 'Virtual MAC', + 'IP Learning', + 'Limit Local IP Learning', + 'Adv Host Routes', + 'EP Move Detection Mode' + ] + + self.my_output.my_table( + info, + order=order, + headers=headers, + allow_order_subkeys=True, + row_separator=True, + remove_empty_columns=False, + underline=True, + table=True + ) + + def print_bridge_domains_mcast(self, info, title=False): + if title: + self.my_output.default( + 'Bridge Domain - Multicast Properties [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'mcastAllowTick', + 'unkMcastActT', + 'fvRsIgmpsn.nameTenant', + 'ipv6McastAllowTick', + 'v6unkMcastActT', + 'fvRsMldsn.nameTenant' + ] + + headers = [ + 'Bridge Domain', + 'PIM', + 'Unknown IPv4 Flooding', + 'IGMP Snooping Policy', + 'PIMv6', + 'Unknown IPv6 Flooding', + 'MLD Snooping Policy' + ] + + self.my_output.my_table( + info, + order=order, + headers=headers, + allow_order_subkeys=True, + row_separator=True, + underline=True, + table=True + ) + + def print_bridge_domains_vrf(self, info, title=False): + if title: + self.my_output.default( + 'Bridge Domain - VRF Properties [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'fvCtx.nameTenant', + 'fvCtx.ipDataPlaneLearningTick', + 'fvCtx.pcEnfDir', + 'fvCtx.pcEnfPref', + 'fvCtx.bdEnforcedEnableTick' + ] + + headers = [ + 'Bridge Domain', + 'VRF', + 'Learning', + 'PCE Direction', + 'PCE Preference', + 'BD Enforcement' + ] + + self.my_output.my_table( + info, + order=order, + headers=headers, + allow_order_subkeys=True, + row_separator=True, + underline=True, + table=True + ) + + def print_bridge_domains(self, info, title=False): + if title: + self.my_output.default( + 'Bridge Domain [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'health', + 'faults', + 'nameTenant', + 'pcTag', + 'seg', + 'fvSubnet.ip', + 'fvSubnet.usage', + 'fvAEPg.nameTenant', + 'fvRsCtx.nameTenant', + 'fvRsBDToOut.nameTenant' + ] + + headers = [ + 'Health', + 'Faults', + 'Bridge Domain', + 'Class ID', + 'VNID', + 'Subnet', + 'Usage', + 'EPG', + 'VRF', + 'L3Out' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['fvSubnet', 'fvRsBDToOut', 'fvAEPg'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + row_separator=True, + remove_empty_columns=False, + underline=True, + table=True + ) + + def print_bridge_domains_node(self, info, title=False): + if title: + self.my_output.default( + 'Bridge Domain - Nodes [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'nameTenant', + 'node.name', + 'node.interfaces' + ] + + headers = [ + 'Faults', + 'Bridge Domain', + 'Node', + 'Interfaces' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['node'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_bridge_domains_interface(self, info, title=False): + if title: + self.my_output.default( + 'Bridge Domain - Interfaces [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'nameTenant', + 'interface.node_name', + 'interface.intf_name' + ] + + headers = [ + 'Faults', + 'Bridge Domain', + 'Node', + 'Interface' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['interface'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_bridge_domains_event_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Bridge Domain - Event Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Bridge Domain - Event Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Bridge Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) + + def print_bridge_domains_fault_inst(self, info, title=False): + if title: + self.my_output.default( + 'Bridge Domain - Faults [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Bridge Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_bridge_domains_fault_record(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Bridge Domain - Fault Records [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Bridge Domain - Fault Records last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Bridge Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_bridge_domains_audit_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Bridge Domain - Audit Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Bridge Domain - Audit Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Bridge Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/bd/retention/__init__.py b/lib/aci/bd/retention/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/bd/retention/__pycache__/__init__.cpython-310.pyc b/lib/aci/bd/retention/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7765bc5978ad20f57c1eb46653a2686ef6ad4dea GIT binary patch literal 153 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HGvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oQc6rwYDsEdNoIatOniK1US>&ryk0@& WEe@O9{FKt1R6CHV#Y{kgg#iE^tR)rz literal 0 HcmV?d00001 diff --git a/lib/aci/bd/retention/__pycache__/info.cpython-310.pyc b/lib/aci/bd/retention/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd0818453c2e79d5472d517b458ce00a8eca42c0 GIT binary patch literal 838 zcmah{&2H2%5Vm6{gs??b4@fID)m(XQK(FJy?qIL;85*Y{6o`zw zMWfw_Sv-QjJ+DkPQ&O~(cdB-tBTIj1ws=OrJ5x?f!W{}3E>T?43S3Ux6r#e@;WVYY z(SSxYfiL^TJ)zK8o@DIKB`*6Jp-VWrKJi#D`_o^g9+W(r%-=d>=i+=`Hew epi4ldB&7oueEEom|G$!aI_`TNVRm>VJM1@koyq0^ literal 0 HcmV?d00001 diff --git a/lib/aci/bd/retention/__pycache__/main.cpython-310.pyc b/lib/aci/bd/retention/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e814e4f2a9278bfb46defd51be6c2d09774b875 GIT binary patch literal 544 zcmZutu};G<5Ix5!R8`xl3|$awmdpqts3;O*=>S_~$x3rBvTzcx(@G#V`Um^~jC=~e zkd=vFVB(yrC__)WXJ34I_uiF*K@TX*`5S)G`R$8#gj7r@-4Ou-G6OkF7=tUo0Qnk_ zEB4Bh0K;2|IzQ9}5v#`+R^y$zEb~+sH>y%arOV>FSd^LXXh%TBgwl-&6eJ9R*cb+D zNH}t04eNuQbQz;Rw&Cxba!Toj1Qooq7x*Bl2t>kWQDFV7x+|qFbR{L}44pEIPq2IR z@OwNx5%;OlBGWD_1*(-YLOW$w$_k_BBF(gzqp({)!n=zfo~++ehtl~0L-u^QQ*XQ- zJR?h_qDXTkW!;l9FL7!7y)WhCGBul*hPIK`f_<7`y-`2YdFVo)HD6{CPsXG(CY|vd g6Hoe~ImTvj6}9 literal 0 HcmV?d00001 diff --git a/lib/aci/bd/retention/info.py b/lib/aci/bd/retention/info.py new file mode 100644 index 00000000..3b77c23b --- /dev/null +++ b/lib/aci/bd/retention/info.py @@ -0,0 +1,19 @@ +# https://www.kareemccie.com/2021/12/what-is-endpoint-retention-policy-in-aci.html + + +class BridgeDomainRetentionInfo(): + def __init__(self): + pass + + def get_bridge_domain_retention_info(self, managed_object): + info = {} + info['__Output'] = {} + + info['tenant'] = managed_object['tDn'].split('/')[1].split('tn-')[1] + info['name'] = managed_object['tnFvEpRetPolName'] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + + return info diff --git a/lib/aci/bd/retention/main.py b/lib/aci/bd/retention/main.py new file mode 100644 index 00000000..543a0515 --- /dev/null +++ b/lib/aci/bd/retention/main.py @@ -0,0 +1,6 @@ +from lib.aci.bd.retention.info import BridgeDomainRetentionInfo + + +class BridgeDomainRetention(BridgeDomainRetentionInfo): + def __init__(self): + BridgeDomainRetentionInfo.__init__(self) diff --git a/lib/aci/bd/subnet/__init__.py b/lib/aci/bd/subnet/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/bd/subnet/__pycache__/__init__.cpython-310.pyc b/lib/aci/bd/subnet/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5002ab874cd09618854e64943f17e0ab373f94ae GIT binary patch literal 150 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HevsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oQc6s5X;NNlNlbivW?p7Ve7s&kl5Z~R~v(L^YHNkZgl|K@qD&`@TPJ!`Z0a=z@H zT_rk8Mf4l=0SWQY^2S%%M|kQBPdw$JVrI`yLY1=C&d$#4%+AgHW@e2pqxmpZ#e;M_ z8*y~89>mkUhclN*fT1lv_=Dn+xk|={q>h|^e(#IHG*0wjr1Q~i0BWI5oLoF?Y>_SCmlOP$^_Hofdgt zju#IyD`Nm->sW;+Gc!H)Z{)XbFW6pGMX)grYiCtn_!3h z&X->4Vf|W5iTM|$#Qe*WFPM3+k9#`mmJ<%VMV~U^K!0vm!gDr zkD;ws**M#)bPkcyIiS|~c3x!jqFb{mY*L+0Y$G#jtc+1$g-NZCO_wQK zUuaXz;;eV9a_iqWN~LpZnLmGf-rqd4`(BTxEAcPpI;#5{D{Io2YviG>QbHW` zTNf{PdVJZK=^#1fw+uC)p%ylT?|yv}7wSoTY&LP%l@(lfsO&3*{|C1ie3t0KZqoq= zXhL&D;P3hl(st`GPO%9fnhk$cqryshKdhXpY5S_ifXb4FP32AI>uer`fBm^UfO`3Ga!g6=Bk;VJa-6Wvcnab8bprwDo zpK`60f5FPx4S|CUyt$p5;mvzf4+cG;c$>WAH+_Fx(T}mo@+81;0a53drXXU?_{wO!Q`dEw>T0phDz&<;mUZsh?Fgut66}bQf`lOu6~kZ) z2}e$pVRLfGl`|UOhkJ9vj9`b9R`9`I;FClm5CfY>fpLqPu9UjcD=A4~XjQTN0&_%- zzw_CJxK9f$a&7ZkpxUTHXsgUd8Byp=q`4Lu3hSK+XDWVpGVVAXf_3ae_I!G%G~TbA zlM~usrKOUx=}B4ExGvngFXiJpEp{Ex=|#2DG0_`m(Jiztb)nDvpLxWSF)55mVVq&S eQy6PHw)gCZT2#)iaePhpa;IS8?&nGSFyjBL#C1;q literal 0 HcmV?d00001 diff --git a/lib/aci/bd/subnet/info.py b/lib/aci/bd/subnet/info.py new file mode 100644 index 00000000..d80c42ff --- /dev/null +++ b/lib/aci/bd/subnet/info.py @@ -0,0 +1,96 @@ +from lib import ip_helper + + +# Scope +# Public : This means that ACI will automatically advertise this subnet outside the fabric. Users are not longer required to create route-maps or distributing routes. ACI will automate this for you +# Private: This means this subnet will stay within the Tenant. This is the default setting for subnets within a BD. +# Shared: This means that the subnet can be shared with other VRF within the same Tenant. It is important to note if you enable this knob to users different subnets. + + +class BridgeDomainSubnetInfo(): + def __init__(self): + pass + + def get_subnet_usage(self, bridge_domain_subnets, endpoints): + for subnet in bridge_domain_subnets: + subnet['endpoints'] = 1 + if endpoints is not None: + for endpoint in endpoints: + for endpoint_ip in endpoint['fvIp']: + if ip_helper.is_ipv4_in_cidr(endpoint_ip['addr'], subnet['network']): + subnet['endpoints'] = subnet['endpoints'] + 1 + + subnet['usage'] = '%s/%s' % ( + subnet['endpoints'], + subnet['size'] + ) + + subnet['available'] = None + if subnet['size'] is not None: + subnet['available'] = subnet['size'] - subnet['endpoints'] + + return bridge_domain_subnets + + def get_bridge_domain_subnet_info(self, managed_object): + # "annotation": "", + # "childAction": "", + # "configIssues": "", + # "ctrl": "", + # "debugMessage": "", + # "descr": "", + # "extMngdBy": "", + # "ip": "/24", + # "ipDPLearning": "enabled", + # "lcOwn": "local", + # "modTs": "2021-10-27T15:21:50.404+01:00", + # "monPolDn": "uni/tn-common/monepg-default", + # "name": "", + # "nameAlias": "", + # "preferred": "no", + # "rn": "subnet-[/24]", + # "scope": "private", + # "status": "", + # "uid": "15374", + # "userdom": ":all:common:", + # "virtual": "no" + info = {} + info['__Output'] = {} + + keys = [ + 'ip', + 'ipDPLearning', + 'preferred', + 'rn', + 'scope', + 'virtual' + ] + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + if info['preferred'] == 'yes': + info['__Output']['preferred'] = 'Green' + info['preferredTick'] = '\u2713' + else: + info['preferredTick'] = '\u2717' + + if info['virtual'] == 'yes': + info['virtualTick'] = '\u2713' + else: + info['virtualTick'] = '\u2717' + + if info['ipDPLearning'] == 'enabled': + info['ipDPLearningTick'] = '\u2713' + else: + info['ipDPLearningTick'] = '\u2717' + + info['network'] = '%s/%s' % ( + ip_helper.get_network_ipv4_in_cidr(info['ip']), + info['ip'].split('/')[1] + ) + info['gateway'] = info['ip'].split('/')[0] + info['size'] = ip_helper.get_ipv4_cidr_size(info['ip']) + + return info diff --git a/lib/aci/bd/subnet/main.py b/lib/aci/bd/subnet/main.py new file mode 100644 index 00000000..7377b02f --- /dev/null +++ b/lib/aci/bd/subnet/main.py @@ -0,0 +1,6 @@ +from lib.aci.bd.subnet.info import BridgeDomainSubnetInfo + + +class BridgeDomainSubnet(BridgeDomainSubnetInfo): + def __init__(self): + BridgeDomainSubnetInfo.__init__(self) diff --git a/lib/aci/bd/vrf/__init__.py b/lib/aci/bd/vrf/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/bd/vrf/__pycache__/__init__.cpython-310.pyc b/lib/aci/bd/vrf/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f771ed67acdda138fe7d0bd32139f0957d3e20e GIT binary patch literal 147 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HSvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oQc6r&QCduVd}dx|NqoFsLFFwDo80`A Q(wtN~ka@*SK!Sw<0459~h5!Hn literal 0 HcmV?d00001 diff --git a/lib/aci/bd/vrf/__pycache__/info.cpython-310.pyc b/lib/aci/bd/vrf/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..433ee46b9b3ff12766c69d6abe66615bfc2195da GIT binary patch literal 957 zcmZ`1%Zd|0u)Aj_#ynP7MTqRd%L+NT3m%uCi&+#wBB*!>1I=WrC$u}6iQS!`VLiEj z;1B50@9^R`^wpEUum`cKLwu2~rmE}F_2{aqyWJK;c>3TYe2p0UPQu@SI(Cd`cac11 zz<{44eh^~@;sxtRIqLrbfzmOe-9w_-m;)ON;2_S~ID!abykkhvx8bipG#aMrq@HEE zdS!|yRZ-_0{Wd^6;SkZrNPwXuAALdMW2?%-P`*Ge?hTL9)2!5Ku5DhYpq8pkwN+-R zOj_zmn&mp3K)N(Vsxi~S{GD$~sVnWIq%f99%vXC`$~xFQ%<0hvs6A9xsP7vxn!OjA zo#BTE>bBQFAv`cDiRpE+C!TyxE#{c5ncf?s>UphLQ~)MJIX zN%6Xyc$gZX3EDE(p9o=5BIHak?=CS^3ihzIK#xw zOYQoRp-%dpSyp9J1+t#JR=M*rjp@&X4Yk_enkpwJVR0mc&5<}!9Ai-@Xt#He#JtHn zqQg7ikj_M64cNSdI7UvMN$t-r4-R%&W}j+7?hSA$MZ}1qnkS9)`gh5{{hs z!unu`C}UK+HGk*iQ*t*XSilE+g-?=)K;PLc3asx^ccs*&UPwvWLZ?jr1$K`Tf5+1k z@sJuVGVQWTpjs&-v{QDatT1{m(oBmvij~cUpCx{Lwtgoaa_6as?B#GrW4vuPqXDRM znHEaQx+i5(;nMhfU&^OtYBrgMu#wY(ed4x$IN!~A=t7@0FSCdzBhnU=ws?*)X^S;2 bxEZynXz} 1: + object_selector = '.'.join(name[8:].split('.')[1:]) + + filename = os.path.join( + logs_directory, + name + ) + + if not name.startswith('apic.mo.'): + print('Remove non apic.mo. file: %s' % (filename)) + os.remove(filename) + continue + + try: + with open(filename, 'r', encoding='utf-8') as file_handler: + content = json.loads(file_handler.read()) + + except BaseException: + print('Remove file on failed json load: %s' % (filename)) + os.remove(filename) + continue + + print('Import cache: %s from file %s' % (object_name, filename)) + success = self.set_object_cache( + object_name, + content, + object_selector=object_selector, + enforce=True + ) + + if not success: + print('Import failed') + + os.remove(filename) + + def is_cache_enabled(self): + return self.cache_enabled + + def is_object_cache_enabled(self, object_name): + if not self.is_cache_enabled(): + return False + + if object_name not in self.cache_settings['object']: + return True + + return self.cache_settings['object'][object_name]['enabled'] + + def get_object_cache_filename(self, object_name): + filename = os.path.join( + self.cache_directory, + object_name + ) + return filename + + def get_object_cache_ttl(self, object_name): + if object_name in self.cache_settings['object']: + return self.cache_settings['object'][object_name]['ttl'] + + return self.cache_settings['ttl'] + + def get_object_cache(self, object_name, object_selector=None): + if not self.is_cache_enabled(): + return None + + filename = self.get_object_cache_filename(object_name) + if filename is None: + return None + + if object_selector is not None: + filename = '%s.%s' % (filename, object_selector) + + try: + with open(filename, 'r', encoding='utf-8') as file_handler: + content = json.loads(file_handler.read()) + + except BaseException: + return None + + ttl = self.get_object_cache_ttl(object_name) + age = int(time.time()) - content['timestamp'] + if ttl > 0: + if age > ttl: + return None + + self.log.cache_hit( + 'aci', + self.apic_name, + object_name, + filename, + ttl, + age + ) + + return content['cache'] + + def set_object_cache(self, object_name, cache, object_selector=None, enforce=False): + if not self.cache_write_enabled: + if not enforce: + return False + + filename = self.get_object_cache_filename(object_name) + if filename is None: + return False + + if not os.path.isdir(self.cache_directory): + os.makedirs(self.cache_directory, exist_ok=True) + + content = {} + content['object'] = object_name + content['selector'] = object_selector + content['timestamp'] = int(time.time()) + content['cache'] = cache + + if object_selector is not None: + object_selector = object_selector.replace('/', '_') + filename = '%s.%s' % (filename, object_selector) + + try: + with open(filename, 'w', encoding='utf-8') as file_handler: + file_handler.write(json.dumps(content, indent=4)) + + except BaseException: + self.log.error( + 'apic.set_object_cache', + 'Set cache failed: %s %s %s %s' % ( + self.apic_name, + object_name, + object_selector, + filename + ) + ) + return False + + return True + + def get_cache_stats(self): + info = [] + + if not os.path.isdir(self.cache_directory): + return info + + for name in os.listdir(self.cache_directory): + filename = os.path.join( + self.cache_directory, name + ) + + try: + with open(filename, 'r', encoding='utf-8') as file_handler: + content = json.loads(file_handler.read()) + + cache_item = {} + cache_item['__Output'] = {} + cache_item['object'] = content['object'] + cache_item['selector'] = content['selector'] + if cache_item['selector'] is None: + cache_item['selector'] = '' + + cache_item['ttl'] = self.get_object_cache_ttl( + content['object'] + ) + if cache_item['ttl'] <= 0: + cache_item['ttlT'] = '--' + else: + cache_item['ttlT'] = '{}'.format(str(timedelta(seconds=cache_item['ttl']))) + + cache_item['age'] = int(time.time()) - content['timestamp'] + cache_item['ageT'] = '{}'.format(str(timedelta(seconds=cache_item['age']))) + + cache_item['valid'] = True + cache_item['validTick'] = '\u2713' + cache_item['__Output']['validTick'] = 'Green' + if cache_item['ttl'] > 0: + if cache_item['age'] > cache_item['ttl']: + cache_item['valid'] = False + cache_item['validTick'] = '\u2717' + cache_item['__Output']['validTick'] = 'Red' + + info.append( + cache_item + ) + + except BaseException: + pass + + info = sorted( + info, + key=lambda i: ( + i['object'], + i['selector'] + ) + ) + + return info + + def clear_cache(self, bar_enabled=False): + if not os.path.isdir(self.cache_directory): + return True + + names = os.listdir(self.cache_directory) + if bar_enabled: + bar_handler = Bar('Cache Files', max=len(names)) + + for name in names: + filename = os.path.join( + self.cache_directory, name + ) + os.remove(filename) + if bar_enabled: + bar_handler.next() + + if bar_enabled: + bar_handler.finish() + + return True diff --git a/lib/aci/common.py b/lib/aci/common.py new file mode 100644 index 00000000..760935b2 --- /dev/null +++ b/lib/aci/common.py @@ -0,0 +1,85 @@ +class Common(): + def __init__(self): + pass + + def get_health_info(self, value): + try: + ivalue = int(value) + except BaseException: + return None, value + + if ivalue >= 75: + return 'Green', value + + if ivalue >= 50: + return 'Magenta', value + + return 'Red', value + + def is_any_fault(self, faults): + for key in ['crit', 'maj', 'minor', 'warn']: + if faults[key] != '0': + return True + return False + + def get_faults_info(self, faults): + # "childAction": "", + # "crit": "0", + # "critAcked": "0", + # "critAckedandDelegated": "0", + # "critDelegated": "0", + # "maj": "0", + # "majAcked": "0", + # "majAckedandDelegated": "0", + # "majDelegated": "0", + # "minor": "0", + # "minorAcked": "0", + # "minorAckedandDelegated": "0", + # "minorDelegated": "0", + # "rn": "fltCnts", + # "status": "", + # "warn": "0", + # "warnAcked": "0", + # "warnAckedandDelegated": "0", + # "warnDelegated": "0" + + info = '' + color = ':' + + info = '%s%s' % ( + info, + faults['crit'] + ) + color = '%s%s' % ( + color, + ''.rjust(len(str(faults['crit'])), 'R') + ) + + info = '%s %s' % ( + info, + faults['maj'] + ) + color = '%s.%s' % ( + color, + ''.rjust(len(str(faults['maj'])), 'M') + ) + + info = '%s %s' % ( + info, + faults['minor'] + ) + color = '%s.%s' % ( + color, + ''.rjust(len(str(faults['minor'])), 'Y') + ) + + info = '%s %s' % ( + info, + faults['warn'] + ) + color = '%s.%s' % ( + color, + ''.rjust(len(str(faults['warn'])), 'G') + ) + + return color, info diff --git a/lib/aci/context.py b/lib/aci/context.py new file mode 100644 index 00000000..c5cc4367 --- /dev/null +++ b/lib/aci/context.py @@ -0,0 +1,45 @@ +class Context(): + def __init__(self): + pass + + def get_context_server_connectivity_interface(self, servers_connectivity_info): + interfaces = [] + + for server_connectivity_info in servers_connectivity_info: + if 'MacAddressInfo' not in server_connectivity_info: + continue + + for mac_address_info in server_connectivity_info['MacAddressInfo']: + if mac_address_info['endpoint'] is not None: + for fabric_info in mac_address_info['endpoint']['fabric']: + interface_label = 'aci:%s:pod-%s:node-%s:%s' % ( + mac_address_info['endpoint']['apic'], + fabric_info['pod_id'], + fabric_info['node_id'], + fabric_info['port_id'] + ) + if interface_label not in interfaces: + interfaces.append(interface_label) + + if mac_address_info['lacp'] is not None: + for lacp_info in mac_address_info['lacp']: + interface_label = 'aci:%s:pod-%s:node-%s:%s' % ( + lacp_info['apic'], + lacp_info['podId'], + lacp_info['nodeId'], + lacp_info['id'] + ) + if interface_label not in interfaces: + interfaces.append(interface_label) + + if mac_address_info['adjacency'] is not None: + interface_label = 'aci:%s:%s:%s:%s' % ( + mac_address_info['adjacency']['apic'], + mac_address_info['adjacency']['pod_id'], + mac_address_info['adjacency']['node_id'], + mac_address_info['adjacency']['interface_id'] + ) + if interface_label not in interfaces: + interfaces.append(interface_label) + + return interfaces diff --git a/lib/aci/contract/__init__.py b/lib/aci/contract/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/__pycache__/__init__.cpython-310.pyc b/lib/aci/contract/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb6c3410ea36ddc869398b5d480680e9f1b7ae57 GIT binary patch literal 149 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!H8vsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vlq%JKd+=HF}WlrK0Y%qvm`!Vub}c4hfQvN RN@-529mvFDCLqDW004SMBX$4) literal 0 HcmV?d00001 diff --git a/lib/aci/contract/__pycache__/api.cpython-310.pyc b/lib/aci/contract/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba6113e77ee8b2ea60f0529531b50f46c610cad1 GIT binary patch literal 1316 zcmaJ>PiqrF6rY)$-E20gmLf={peG?bDTu`rd4Vn<5U(?0diW?>B$mW*Zv;fpPWyr?{>W@(Y#fa6mbPskdPH zKm-x=3g%bVA%dNfmJNo z#z{=Ue>G6XL~WQF845BZA*>Kak6Y9<735sC;)#tqqrBavV|i+9*`vjmfnKR8Au#(CY*0pEcLf|BdgDp-AqMg|!rLbA$>*1IK7+VzB5K=Y?m}G;vT)%qotZ2AePmK1b&J$1 zNMMn`A~hS;ut)=u0a^GncS$L^*taa!STE}L_t0t{cf85;oob&2nW&Eu-AYVe}* zSdN6*)DT=P*YXs$qj7C<1?@`A!(lXv`cm9EYV%+nP}n@SE6T-1)rSQIox>7Pk8;K+ zzx5ptWRNJo@i=E3WJbLk-$fMg8_qq}q)qTZol*aqyZ@6suzI&1FLR==&FxNis(p3; z;*MJ`cH<}-$}luR2q!3t6y;_ZUKCMUS`@aO-AiSE*#F9I5`Q5$HM;r4r%gwp4u22( S{a29j_sd#uZ6x0M7Wo4YrA^BK literal 0 HcmV?d00001 diff --git a/lib/aci/contract/__pycache__/info.cpython-310.pyc b/lib/aci/contract/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca06b964661eb0efdc502932fa2fc7fe8d94e6eb GIT binary patch literal 5208 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 GXYmh1*RDnY literal 0 HcmV?d00001 diff --git a/lib/aci/contract/filter/__init__.py b/lib/aci/contract/filter/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/filter/__pycache__/__init__.cpython-310.pyc b/lib/aci/contract/filter/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb6c3410ea36ddc869398b5d480680e9f1b7ae57 GIT binary patch literal 149 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!H8vsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vlq%JKd+=HF}WlrK0Y%qvm`!Vub}c4hfQvN RN@-529mvFDCLqDW004SMBX$4) literal 0 HcmV?d00001 diff --git a/lib/aci/contract/filter/__pycache__/api.cpython-310.pyc b/lib/aci/contract/filter/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5c76cb58b11524ee194589952a195e3a5c2f33e GIT binary patch literal 1271 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 literal 0 HcmV?d00001 diff --git a/lib/aci/contract/filter/__pycache__/output.cpython-310.pyc b/lib/aci/contract/filter/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f36459cf9b5198eb5df96af39a10e70a75ec4bca GIT binary patch literal 3637 zcmd5V_!{uWo9cOkVD7Um#8Dy=kGH zx`Hhqz>Op9`U(61F5J7kTUV~p4I?w2bJH|^rPb%c8Pmxx_wP9;=g;q^(dw$L!1d!V zKas&3it;OVX0IG{uEEU@1AL(ng{Y6rPRQ+BHtcYCp?&e(u$ytm=zIsj2%r&=2W2%XcQ#WWa|@chd5rRF_1@SC2`y{JiO zp9W2zQ`V=f8Th+R*Mqr<%4SRIY(`S)R(BvQ$MHiyb{v$*5p;EUe36M;>B_2yE=n&0 z8U?t~*k^r!k;c|W%3bBIO4L{zsSnj-;A;5g9_Lgg86o;TjUC5TKd8ibqN?&0+X^wC zs^8||nTMw?rR3x)eWZ?Z#A>Tga--Zxm-0|%;c-6MTd`}yqp8{D#I@zGHa7X!^|2-j zy^v5A_#qXgUD}EmbwYX{`@ez3iqLCONGmJCY`MK4=E4r$4z1JB4dY?4KfD0}8*Jg& zu$1;_yhm9*>$|LbtLtT}yDW-_>*;E@+YJWwsLI^-@K8F)V>hO)UXTglQIB~v+eRpl z{m_m5D9pCSUiVHfpd9V3Cia@i3pWgDDLl})p>_Sv?Q%76+YRG3SQ9l0sJ}zQm^ZAQ ziE?4?NTrRH&ogBWLuwHDiK$~#7!d;(iu@jR;mMhWep_YHeTUPo%iK6(V%-e_7?3L+ z-rK!L2V5AjyBpB4Aqt&=lO&$V6DmC|asds61ru_SDAEUAHzZEr^O%nfhKVM0KWs%H z#*YKa)?tJlL70{R!x9n4y37w_C(U#x$#jnC$=?OgRa3Q94Swc}qFGdR)zYkzSu*9A zu4*qd180+;{m1ZZnoWsslRDj6tYv9M@CTs!zpMySXlrvdVNYvfrIwX)S`+8WUvjri zC$+)yU>`#YWh(#`ofWaY3Lvc1mokJ=1d}D4T$7WjcN#|B-Hjr43a2&@kZIX#2qzHc z;`I7r4>~=x>J!+oJX(1(pF|6AK3eBfdkzq-L|4tjyh$$;8t4W|V^5(m%CU`+MwA|; z+j2S!Q>xQPT0(6tZ2{dGKzHXSbZ5@couoOSI}7N}n4>!#PZb$lePm1tPa`XjtqJ87 zYr|9NYiHrT(T4&r-;COPHpas2u z34_lBAeH-jG-PF*%jC_a>d7Uk3cdiQ3Bbc1?0lVN}e zyn};Cs_Z<%dkF6Xh{8?3MZJLsMEwB{V%Wg#nTIiA>>|Sc*es-qW&W2(2Yj~h_&boa zoG+$6U%>AF%Hx^BmpCK+^x@xwDgOt~ke^7ijIr-H*j$ni#OX}h^)u|_mjMo5XA5HfQTjdysj^x1FGW2)DcGA} zQ)Mv^U+)qBU_3mta+ycpLdR_(Oqq~f!0uAFE-M}v&64ExC+@!l@bBm+6HrmB6|GjS z*!V93zm6S8*pAbQ2z;JGyXZLI^xPnsVaQMHB*G@b#|YODt|NSgkY$E!;rYzcKSTTw m^en|v?VNqlJ`ML)>4KcCRaE(0v|U)26LYSj9Qps|u<{ovVw`XQ literal 0 HcmV?d00001 diff --git a/lib/aci/contract/filter/api.py b/lib/aci/contract/filter/api.py new file mode 100644 index 00000000..e79dff8b --- /dev/null +++ b/lib/aci/contract/filter/api.py @@ -0,0 +1,60 @@ +class ContractFilterApi(): + def __init__(self): + self.contract_filter_mo = None + + def get_contract_filters_mo(self): + if self.contract_filter_mo is not None: + return self.contract_filter_mo + + cache = self.get_object_cache( + 'vzFilter' + ) + if cache is not None: + self.contract_filter_mo = cache + self.log.apic_mo( + 'vzFilter', + self.contract_filter_mo + ) + return self.contract_filter_mo + + query = 'rsp-subtree=children&rsp-subtree-include=fault-count&rsp-subtree-class=vzEntry' + managed_objects = self.get_class( + 'vzFilter', + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_contract_filters_mo', + 'API failed' + ) + return None + + self.contract_filter_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['vzFilter']['attributes'] + attributes['vzEntry'] = self.get_mo_children_attributes( + 'vzFilter', + managed_object, + 'vzEntry' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'vzFilter', + managed_object, + 'faultCounts' + ) + self.contract_filter_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzFilter', + self.contract_filter_mo + ) + + self.set_object_cache( + 'vzFilter', + self.contract_filter_mo + ) + + return self.contract_filter_mo diff --git a/lib/aci/contract/filter/audit/__init__.py b/lib/aci/contract/filter/audit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/filter/audit/api.py b/lib/aci/contract/filter/audit/api.py new file mode 100644 index 00000000..e81d4224 --- /dev/null +++ b/lib/aci/contract/filter/audit/api.py @@ -0,0 +1,48 @@ +class ContractFilterAuditApi(): + def __init__(self): + self.filter_contract_audit_mo = None + + def get_filter_contract_audit_mo(self): + cache = self.get_object_cache( + 'vzFilter.audit' + ) + if cache is not None: + self.filter_contract_audit_mo = cache + self.log.apic_mo( + 'vzFilter.audit', + self.filter_contract_audit_mo + ) + return self.filter_contract_audit_mo + + query = 'rsp-subtree-include=audit-logs,no-scoped,subtree&order-by=aaaModLR.created|desc&page=0&page-size=%s' % (self.api_audit_limit) + managed_objects = self.get_class( + 'vzFilter', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_filter_contract_audit_mo', + 'API failed' + ) + return None + + self.filter_contract_audit_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['aaaModLR']['attributes'] + self.filter_contract_audit_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzFilter.audit', + self.filter_contract_audit_mo + ) + + self.set_object_cache( + 'vzFilter.audit', + self.filter_contract_audit_mo + ) + + return self.filter_contract_audit_mo diff --git a/lib/aci/contract/filter/audit/info.py b/lib/aci/contract/filter/audit/info.py new file mode 100644 index 00000000..218a3b45 --- /dev/null +++ b/lib/aci/contract/filter/audit/info.py @@ -0,0 +1,110 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class ContractFilterAuditInfo(): + def __init__(self): + self.filter_contract_audit = None + + def get_filter_contract_audit_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['filterName'] = None + + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/filter-BT-Demo + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/flt-' in info['affected']: + info['filterName'] = info['affected'].split('/flt-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['filterName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['filterName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_filter_contract_audit(self): + if self.filter_contract_audit is not None: + return self.filter_contract_audit + + managed_objects = self.get_filter_contract_audit_mo() + if managed_objects is None: + return None + + self.filter_contract_audit = [] + for managed_object in managed_objects: + audit_info = self.get_filter_contract_audit_info( + managed_object + ) + self.filter_contract_audit.append( + audit_info + ) + + self.log.apic_mo( + 'vzFilter.auditRecord.info', + self.filter_contract_audit + ) + + return self.filter_contract_audit + + def get_filter_contract_id_audit(self, tenant_name, filter_name, audit_filter=None): + audits = [] + + all_audits = self.get_filter_contract_audit() + if all_audits is None: + return audits + + for audit_info in all_audits: + if audit_info['tenantName'] is not None and audit_info['filterName'] is not None: + if audit_info['tenantName'] == tenant_name and audit_info['filterName'] == filter_name: + if not self.match_system_fault(audit_info, audit_filter, exclude_cleared=False): + continue + + audits.append( + audit_info + ) + + return audits diff --git a/lib/aci/contract/filter/audit/main.py b/lib/aci/contract/filter/audit/main.py new file mode 100644 index 00000000..576579dc --- /dev/null +++ b/lib/aci/contract/filter/audit/main.py @@ -0,0 +1,8 @@ +from lib.aci.contract.filter.audit.api import ContractFilterAuditApi +from lib.aci.contract.filter.audit.info import ContractFilterAuditInfo + + +class ContractFilterAudit(ContractFilterAuditApi, ContractFilterAuditInfo): + def __init__(self): + ContractFilterAuditApi.__init__(self) + ContractFilterAuditInfo.__init__(self) diff --git a/lib/aci/contract/filter/event/__init__.py b/lib/aci/contract/filter/event/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/filter/event/api.py b/lib/aci/contract/filter/event/api.py new file mode 100644 index 00000000..9224f980 --- /dev/null +++ b/lib/aci/contract/filter/event/api.py @@ -0,0 +1,51 @@ +class ContractFilterEventApi(): + def __init__(self): + self.filter_contract_event_mo = None + + def get_filter_contract_event_mo(self): + if self.filter_contract_event_mo is not None: + return self.filter_contract_event_mo + + cache = self.get_object_cache( + 'vzFilter.eventLog' + ) + if cache is not None: + self.filter_contract_event_mo = cache + self.log.apic_mo( + 'vzFilter.eventLog', + self.filter_contract_event_mo + ) + return self.filter_contract_event_mo + + query = 'rsp-subtree-include=event-logs,no-scoped,subtree&order-by=eventRecord.created|desc&page=0&page-size=%s' % (self.api_event_limit) + managed_objects = self.get_class( + 'vzFilter', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_filter_contract_event_mo', + 'API failed' + ) + return None + + self.filter_contract_event_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['eventRecord']['attributes'] + self.filter_contract_event_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzFilter.eventLog', + self.filter_contract_event_mo + ) + + self.set_object_cache( + 'vzFilter.eventLog', + self.filter_contract_event_mo + ) + + return self.filter_contract_event_mo diff --git a/lib/aci/contract/filter/event/info.py b/lib/aci/contract/filter/event/info.py new file mode 100644 index 00000000..b83a367f --- /dev/null +++ b/lib/aci/contract/filter/event/info.py @@ -0,0 +1,124 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class ContractFilterEventInfo(): + def __init__(self): + self.filter_contract_event = None + + def get_filter_contract_event_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['filterName'] = None + + if 'affected' in info: + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/flt-BT-Demo + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/flt-' in info['affected']: + info['filterName'] = info['affected'].split('/flt-')[1].split('/')[0] + + if 'affected' not in info and 'dn' in info: + if 'uni/tn-' in info['dn']: + # uni/tn-k8s/flt-BT-Demo + info['tenantName'] = info['dn'].split('uni/tn-')[1].split('/')[0] + + if '/flt-' in info['dn']: + info['filterName'] = info['dn'].split('/flt-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['filterName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['filterName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_filter_contract_event(self, deduplicate=True): + if self.filter_contract_event is not None: + return self.filter_contract_event + + managed_objects = self.get_filter_contract_event_mo() + if managed_objects is None: + return None + + self.filter_contract_event = [] + transaction_ids = [] + for managed_object in managed_objects: + event_info = self.get_filter_contract_event_info( + managed_object + ) + if not deduplicate or event_info['txId'] not in transaction_ids: + self.filter_contract_event.append( + event_info + ) + transaction_ids.append( + event_info['txId'] + ) + + self.log.apic_mo( + 'vzFilter.eventLog.info', + self.filter_contract_event + ) + + return self.filter_contract_event + + def get_filter_contract_id_event(self, tenant_name, filter_name, event_filter=None): + events = [] + + all_events = self.get_filter_contract_event() + if all_events is None: + return events + + for event_info in all_events: + if event_info['tenantName'] is not None and event_info['filterName'] is not None: + if event_info['tenantName'] == tenant_name and event_info['filterName'] == filter_name: + if not self.match_system_fault(event_info, event_filter): + continue + + events.append( + event_info + ) + + return events diff --git a/lib/aci/contract/filter/event/main.py b/lib/aci/contract/filter/event/main.py new file mode 100644 index 00000000..e1fe22f1 --- /dev/null +++ b/lib/aci/contract/filter/event/main.py @@ -0,0 +1,8 @@ +from lib.aci.contract.filter.event.api import ContractFilterEventApi +from lib.aci.contract.filter.event.info import ContractFilterEventInfo + + +class ContractFilterEvent(ContractFilterEventApi, ContractFilterEventInfo): + def __init__(self): + ContractFilterEventApi.__init__(self) + ContractFilterEventInfo.__init__(self) diff --git a/lib/aci/contract/filter/fault/__init__.py b/lib/aci/contract/filter/fault/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/filter/fault/api.py b/lib/aci/contract/filter/fault/api.py new file mode 100644 index 00000000..094034fb --- /dev/null +++ b/lib/aci/contract/filter/fault/api.py @@ -0,0 +1,118 @@ +class ContractFilterFaultApi(): + def __init__(self): + self.filter_contract_fault_mo = None + self.filter_contract_fault_record_mo = None + + def get_filter_contract_fault_mo(self): + cache = self.get_object_cache( + 'vzFilter.fault' + ) + if cache is not None: + self.filter_contract_fault_mo = cache + self.log.apic_mo( + 'vzFilter.fault', + self.filter_contract_fault_mo + ) + return self.filter_contract_fault_mo + + query = 'rsp-subtree-include=faults,no-scoped,subtree' + managed_objects = self.get_class( + 'vzFilter', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_filter_contract_fault_mo', + 'API failed' + ) + return None + + self.filter_contract_fault_mo = [] + + for managed_object in managed_objects['imdata']: + if 'faultInst' in managed_object: + attributes = managed_object['faultInst']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = False + self.filter_contract_fault_mo.append( + attributes + ) + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = True + self.filter_contract_fault_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzFilter.fault', + self.filter_contract_fault_mo + ) + + self.set_object_cache( + 'vzFilter.fault', + self.filter_contract_fault_mo + ) + + return self.filter_contract_fault_mo + + def get_filter_contract_fault_record_mo(self): + cache = self.get_object_cache( + 'vzFilter.faultRecord' + ) + if cache is not None: + self.filter_contract_fault_record_mo = cache + self.log.apic_mo( + 'vzFilter.faultRecord', + self.filter_contract_fault_record_mo + ) + return self.filter_contract_fault_record_mo + + query = 'rsp-subtree-include=fault-records,no-scoped,subtree&order-by=faultRecord.created|desc&page=0&page-size=%s' % (self.api_fault_limit) + managed_objects = self.get_class( + 'vzFilter', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_filter_contract_fault_record_mo', + 'API failed' + ) + return None + + self.filter_contract_fault_record_mo = [] + + for managed_object in managed_objects['imdata']: + if 'faultRecord' in managed_object: + attributes = managed_object['faultRecord']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = False + self.filter_contract_fault_record_mo.append( + attributes + ) + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = True + self.filter_contract_fault_record_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzFilter.faultRecord', + self.filter_contract_fault_record_mo + ) + + self.set_object_cache( + 'vzFilter.faultRecord', + self.filter_contract_fault_record_mo + ) + + return self.filter_contract_fault_record_mo diff --git a/lib/aci/contract/filter/fault/info.py b/lib/aci/contract/filter/fault/info.py new file mode 100644 index 00000000..c8092407 --- /dev/null +++ b/lib/aci/contract/filter/fault/info.py @@ -0,0 +1,155 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class ContractFilterFaultInfo(): + def __init__(self): + self.filter_contract_fault = None + self.filter_contract_fault_record = None + + def get_filter_contract_fault_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['filterName'] = None + + if not managed_object['delegated']: + if 'affected' in info: + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/flt-BT-Demo + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/flt-' in info['affected']: + info['filterName'] = info['affected'].split('/flt-')[1].split('/')[0] + + if info['tenantName'] is None: + if 'uni/tn-' in info['dn']: + # uni/tn-k8s/flt-BT-Demo + info['tenantName'] = info['dn'].split('uni/tn-')[1].split('/')[0] + + if '/flt-' in info['dn']: + info['filterName'] = info['dn'].split('/flt-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['filterName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['filterName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_filter_contract_fault(self): + if self.filter_contract_fault is not None: + return self.filter_contract_fault + + managed_objects = self.get_filter_contract_fault_mo() + if managed_objects is None: + return None + + self.filter_contract_fault = [] + + for managed_object in managed_objects: + fault_info = self.get_filter_contract_fault_info( + managed_object + ) + self.filter_contract_fault.append( + fault_info + ) + + self.log.apic_mo( + 'vzFilter.fault.info', + self.filter_contract_fault + ) + + return self.filter_contract_fault + + def get_filter_contract_fault_record(self, deduplicate=True): + if self.filter_contract_fault_record is not None: + return self.filter_contract_fault_record + + managed_objects = self.get_filter_contract_fault_record_mo() + if managed_objects is None: + return None + + self.filter_contract_fault_record = [] + fault_ids = [] + + for managed_object in managed_objects: + fault_info = self.get_filter_contract_fault_info( + managed_object + ) + if not deduplicate or fault_info['id'] not in fault_ids: + self.filter_contract_fault_record.append( + fault_info + ) + fault_ids.append( + fault_info['id'] + ) + + self.log.apic_mo( + 'vzFilter.faultRecord.info', + self.filter_contract_fault_record + ) + + return self.filter_contract_fault_record + + def get_filter_contract_id_fault(self, tenant_name, filter_name, fault_object, fault_filter=None): + faults = [] + + if fault_object == 'faultInst': + all_faults = self.get_filter_contract_fault() + if all_faults is None: + return faults + + fault_filter = self.remove_system_fault_timestamp_filter( + fault_filter + ) + + if fault_object == 'faultRecord': + all_faults = self.get_filter_contract_fault_record() + if all_faults is None: + return faults + + for fault_info in all_faults: + if fault_info['tenantName'] is not None and fault_info['filterName'] is not None: + if fault_info['tenantName'] == tenant_name and fault_info['filterName'] == filter_name: + if not self.match_system_fault(fault_info, fault_filter, exclude_cleared=False): + continue + + faults.append( + fault_info + ) + + return faults diff --git a/lib/aci/contract/filter/fault/main.py b/lib/aci/contract/filter/fault/main.py new file mode 100644 index 00000000..e87ae43c --- /dev/null +++ b/lib/aci/contract/filter/fault/main.py @@ -0,0 +1,8 @@ +from lib.aci.contract.filter.fault.api import ContractFilterFaultApi +from lib.aci.contract.filter.fault.info import ContractFilterFaultInfo + + +class ContractFilterFault(ContractFilterFaultApi, ContractFilterFaultInfo): + def __init__(self): + ContractFilterFaultApi.__init__(self) + ContractFilterFaultInfo.__init__(self) diff --git a/lib/aci/contract/filter/info.py b/lib/aci/contract/filter/info.py new file mode 100644 index 00000000..d9609f84 --- /dev/null +++ b/lib/aci/contract/filter/info.py @@ -0,0 +1,270 @@ +from lib import filter_helper + + +class ContractFilterInfo(): + def __init__(self): + self.contract_filter = None + + def get_contract_filter_count(self, tenant_name=None): + filter_filter = None + if tenant_name is not None: + filter_filter = ['tenant:%s' % (tenant_name)] + + filters = self.get_contract_filters( + filter_filter=filter_filter + ) + return len(filters) + + def get_contract_filter(self, tenant, name): + filter_filter = [] + filter_filter.append( + 'tenant:%s' % (tenant) + ) + filter_filter.append( + 'name:%s' % (name) + ) + + filters = self.get_contract_filters( + filter_filter=filter_filter + ) + + if len(filters) == 1: + return filters[0] + + return None + + def get_contract_filter_entry_info(self, managed_object): + keys = [ + 'applyToFrag', + 'arpOpc', + 'dFromPort', + 'dToPort', + 'descr', + 'etherT', + 'icmpv4T', + 'icmpv6T', + 'matchDscp', + 'name', + 'prot', + 'sFromPort', + 'sToPort', + 'stateful', + 'status', + 'tcpRules' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['source'] = '' + if info['sFromPort'] != 'unspecified' and info['sToPort'] != 'unspecified': + info['source'] = '%s - %s' % ( + info['sFromPort'], + info['sToPort'] + ) + + info['destination'] = '' + if info['dFromPort'] != 'unspecified' and info['dToPort'] != 'unspecified': + info['destination'] = '%s - %s' % ( + info['dFromPort'], + info['dToPort'] + ) + + for key in ['etherT', 'arpOpc', 'prot']: + if info[key] == 'unspecified': + info[key] = '' + + return info + + def get_contract_filter_info(self, managed_object): + keys = [ + 'descr', + 'dn', + 'name', + 'userdom' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['tenant'] = info['dn'].split('/')[1][3:] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + + info['vzEntry'] = [] + for entry_mo in managed_object['vzEntry']: + info['vzEntry'].append( + self.get_contract_filter_entry_info( + entry_mo + ) + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_contract_filters_info(self): + if self.contract_filter is None: + self.contract_filter = [] + + filters = self.get_contract_filters_mo() + if filters is not None: + for managed_object in filters: + self.contract_filter.append( + self.get_contract_filter_info( + managed_object + ) + ) + + return self.contract_filter + + def match_contract_filter(self, filter_info, filter_filter): + if filter_filter is None or len(filter_filter) == 0: + return True + + for filter_rule in filter_filter: + (key, value) = filter_rule.split(':') + key_found = False + + if key == 'name': + key_found = True + if not filter_helper.match_tenant_name(value, filter_info['nameTenant']): + return False + + if key == 'tenant': + key_found = True + if not filter_helper.match_string(value, filter_info['tenant']): + return False + + if key == 'fault': + key_found = True + if value == 'any': + if not filter_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_contract_filter', + 'Unsupported fault filtering value: %s' % (value) + ) + + if not key_found: + self.log.error( + 'match_contract_filter', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_contract_filter_usage_info(self, filter_info): + filter_filter = ['filter:%s' % (filter_info['nameTenant'])] + + filter_info['taboo'] = [] + + contracts = self.get_contract_filters( + filter_filter=filter_filter + ) + if contracts is not None: + for contract in contracts: + filter_info['taboo'].append( + contract['nameTenant'] + ) + + filter_info['contract'] = [] + + contracts = self.get_standard_contracts( + contract_filter=filter_filter + ) + if contracts is not None: + for contract in contracts: + filter_info['contract'].append( + contract['nameTenant'] + ) + + return filter_info + + def get_contract_filters( + self, + filter_filter=None, + usage_info=False, + fault_info=False, + hfault_info=False, + event_info=False, + audit_info=False, + hfault_filter=None, + event_filter=None, + audit_filter=None + ): + all_filters = self.get_contract_filters_info() + if all_filters is None: + return None + + filters = [] + + for filter_info in all_filters: + if not self.match_contract_filter(filter_info, filter_filter): + continue + + if usage_info: + filter_info = self.get_contract_filter_usage_info(filter_info) + + if fault_info: + filter_info['faultInst'] = self.get_filter_contract_id_fault( + filter_info['tenant'], + filter_info['name'], + 'faultInst' + ) + + if hfault_info: + filter_info['faultRecord'] = self.get_filter_contract_id_fault( + filter_info['tenant'], + filter_info['name'], + 'faultRecord', + fault_filter=hfault_filter + ) + + if event_info: + filter_info['eventLog'] = self.get_filter_contract_id_event( + filter_info['tenant'], + filter_info['name'], + event_filter=event_filter + ) + + if audit_info: + filter_info['auditLog'] = self.get_filter_contract_id_audit( + filter_info['tenant'], + filter_info['name'], + audit_filter=audit_filter + ) + + filters.append(filter_info) + + filters = sorted( + filters, + key=lambda i: i['name'].lower() + ) + + self.log.apic_mo( + 'vzFilter.info', + filters + ) + + return filters diff --git a/lib/aci/contract/filter/main.py b/lib/aci/contract/filter/main.py new file mode 100644 index 00000000..05f4028b --- /dev/null +++ b/lib/aci/contract/filter/main.py @@ -0,0 +1,20 @@ +from lib.aci.contract.filter.api import ContractFilterApi +from lib.aci.contract.filter.info import ContractFilterInfo +from lib.aci.contract.filter.audit.main import ContractFilterAudit +from lib.aci.contract.filter.event.main import ContractFilterEvent +from lib.aci.contract.filter.fault.main import ContractFilterFault + + +class ContractFilter( + ContractFilterApi, + ContractFilterInfo, + ContractFilterAudit, + ContractFilterEvent, + ContractFilterFault + ): + def __init__(self): + ContractFilterApi.__init__(self) + ContractFilterInfo.__init__(self) + ContractFilterAudit.__init__(self) + ContractFilterEvent.__init__(self) + ContractFilterFault.__init__(self) diff --git a/lib/aci/contract/filter/output.py b/lib/aci/contract/filter/output.py new file mode 100644 index 00000000..02fdcbc2 --- /dev/null +++ b/lib/aci/contract/filter/output.py @@ -0,0 +1,304 @@ +class ContractFilterOutput(): + def __init__(self): + pass + + def print_contract_filters(self, info, title=False): + if title: + self.my_output.default( + 'Contract Filter [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'faults', + 'nameTenant', + 'vzEntry.name', + 'vzEntry.etherT', + 'vzEntry.arpOpc', + 'vzEntry.prot', + 'vzEntry.applyToFrag', + 'vzEntry.stateful', + 'vzEntry.source', + 'vzEntry.destination', + 'vzEntry.tcpRules' + ] + + headers = [ + 'Faults', + 'Filter', + 'Entry', + 'Ether', + 'ARP Flag', + 'Proto', + 'Fragments', + 'Stateful', + 'Source', + 'Destination', + 'Rules' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['vzEntry'] + ), + order=order, + headers=headers, + underline=True, + row_separator=True, + allow_order_subkeys=True, + table=True + ) + + def print_contract_filters_usage(self, info, title=False): + if title: + self.my_output.default( + 'Contract Filter - Usage [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'faults', + 'nameTenant', + 'contract', + 'taboo' + ] + + headers = [ + 'Faults', + 'Filter', + 'Contract', + 'Taboo' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['contract', 'taboo'] + ), + order=order, + headers=headers, + underline=True, + row_separator=True, + allow_order_subkeys=True, + table=True + ) + + def print_contract_filters_event_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Contract Filter - Event Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Contract Filter - Event Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Contract Filter', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) + + def print_contract_filters_fault_inst(self, info, title=False): + if title: + self.my_output.default( + 'Contract Filter - Faults [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Contract Filter', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_contract_filters_fault_record(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Contract Filter - Fault Records [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Contract Filter - Fault Records last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Contract Filter', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_contract_filters_audit_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Contract Filter - Audit Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Contract Filter - Audit Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Contract Filter', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/contract/main.py b/lib/aci/contract/main.py new file mode 100644 index 00000000..aca2798a --- /dev/null +++ b/lib/aci/contract/main.py @@ -0,0 +1,14 @@ +from lib.aci.contract.standard.main import ContractStandard +from lib.aci.contract.filter.main import ContractFilter +from lib.aci.contract.taboo.main import ContractTaboo + + +class Contract( + ContractStandard, + ContractFilter, + ContractTaboo, + ): + def __init__(self): + ContractStandard.__init__(self) + ContractFilter.__init__(self) + ContractTaboo.__init__(self) diff --git a/lib/aci/contract/output.py b/lib/aci/contract/output.py new file mode 100644 index 00000000..7f005093 --- /dev/null +++ b/lib/aci/contract/output.py @@ -0,0 +1,10 @@ +from lib.aci.contract.standard.output import ContractStandardOutput +from lib.aci.contract.filter.output import ContractFilterOutput +from lib.aci.contract.taboo.output import ContractTabooOutput + + +class ContractOutput(ContractStandardOutput, ContractFilterOutput, ContractTabooOutput): + def __init__(self): + ContractStandardOutput.__init__(self) + ContractFilterOutput.__init__(self) + ContractTabooOutput.__init__(self) diff --git a/lib/aci/contract/standard/__init__.py b/lib/aci/contract/standard/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/standard/api.py b/lib/aci/contract/standard/api.py new file mode 100644 index 00000000..f469aaa1 --- /dev/null +++ b/lib/aci/contract/standard/api.py @@ -0,0 +1,70 @@ +class ContractStandardApi(): + def __init__(self): + self.standard_contract_mo = None + + def get_standard_contract_mo(self): + if self.standard_contract_mo is not None: + return self.standard_contract_mo + + cache = self.get_object_cache( + 'vzBrCP' + ) + if cache is not None: + self.standard_contract_mo = cache + self.log.apic_mo( + 'vzBrCP', + self.standard_contract_mo + ) + return self.standard_contract_mo + + query = 'rsp-subtree=children&rsp-subtree-include=fault-count&rsp-subtree-class=vzSubj,vzRtCons,vzRtProv' + managed_objects = self.get_class( + 'vzBrCP', + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_standard_contract_mo', + 'API failed' + ) + return None + + self.standard_contract_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['vzBrCP']['attributes'] + attributes['vzSubj'] = self.get_mo_children_attributes( + 'vzBrCP', + managed_object, + 'vzSubj' + ) + attributes['vzRtCons'] = self.get_mo_children_attributes( + 'vzBrCP', + managed_object, + 'vzRtCons' + ) + attributes['vzRtProv'] = self.get_mo_children_attributes( + 'vzBrCP', + managed_object, + 'vzRtProv' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'vzBrCP', + managed_object, + 'faultCounts' + ) + self.standard_contract_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzBrCP', + self.standard_contract_mo + ) + + self.set_object_cache( + 'vzBrCP', + self.standard_contract_mo + ) + + return self.standard_contract_mo diff --git a/lib/aci/contract/standard/audit/__init__.py b/lib/aci/contract/standard/audit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/standard/audit/api.py b/lib/aci/contract/standard/audit/api.py new file mode 100644 index 00000000..826da5d4 --- /dev/null +++ b/lib/aci/contract/standard/audit/api.py @@ -0,0 +1,48 @@ +class ContractStandardAuditApi(): + def __init__(self): + self.standard_contract_audit_mo = None + + def get_standard_contract_audit_mo(self): + cache = self.get_object_cache( + 'vzBrCP.audit' + ) + if cache is not None: + self.standard_contract_audit_mo = cache + self.log.apic_mo( + 'vzBrCP.audit', + self.standard_contract_audit_mo + ) + return self.standard_contract_audit_mo + + query = 'rsp-subtree-include=audit-logs,no-scoped,subtree&order-by=aaaModLR.created|desc&page=0&page-size=%s' % (self.api_audit_limit) + managed_objects = self.get_class( + 'vzBrCP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_standard_contract_audit_mo', + 'API failed' + ) + return None + + self.standard_contract_audit_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['aaaModLR']['attributes'] + self.standard_contract_audit_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzBrCP.audit', + self.standard_contract_audit_mo + ) + + self.set_object_cache( + 'vzBrCP.audit', + self.standard_contract_audit_mo + ) + + return self.standard_contract_audit_mo diff --git a/lib/aci/contract/standard/audit/info.py b/lib/aci/contract/standard/audit/info.py new file mode 100644 index 00000000..1d113977 --- /dev/null +++ b/lib/aci/contract/standard/audit/info.py @@ -0,0 +1,110 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class ContractStandardAuditInfo(): + def __init__(self): + self.standard_contract_audit = None + + def get_standard_contract_audit_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['contractName'] = None + + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/brc-BT-Demo + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/brc-' in info['affected']: + info['contractName'] = info['affected'].split('/brc-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['contractName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['contractName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_standard_contract_audit(self): + if self.standard_contract_audit is not None: + return self.standard_contract_audit + + managed_objects = self.get_standard_contract_audit_mo() + if managed_objects is None: + return None + + self.standard_contract_audit = [] + for managed_object in managed_objects: + audit_info = self.get_standard_contract_audit_info( + managed_object + ) + self.standard_contract_audit.append( + audit_info + ) + + self.log.apic_mo( + 'vzBrCP.auditRecord.info', + self.standard_contract_audit + ) + + return self.standard_contract_audit + + def get_standard_contract_id_audit(self, tenant_name, contract_name, audit_filter=None): + audits = [] + + all_audits = self.get_standard_contract_audit() + if all_audits is None: + return audits + + for audit_info in all_audits: + if audit_info['tenantName'] is not None and audit_info['contractName'] is not None: + if audit_info['tenantName'] == tenant_name and audit_info['contractName'] == contract_name: + if not self.match_system_fault(audit_info, audit_filter, exclude_cleared=False): + continue + + audits.append( + audit_info + ) + + return audits diff --git a/lib/aci/contract/standard/audit/main.py b/lib/aci/contract/standard/audit/main.py new file mode 100644 index 00000000..6c01a115 --- /dev/null +++ b/lib/aci/contract/standard/audit/main.py @@ -0,0 +1,8 @@ +from lib.aci.contract.standard.audit.api import ContractStandardAuditApi +from lib.aci.contract.standard.audit.info import ContractStandardAuditInfo + + +class ContractStandardAudit(ContractStandardAuditApi, ContractStandardAuditInfo): + def __init__(self): + ContractStandardAuditApi.__init__(self) + ContractStandardAuditInfo.__init__(self) diff --git a/lib/aci/contract/standard/event/__init__.py b/lib/aci/contract/standard/event/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/standard/event/api.py b/lib/aci/contract/standard/event/api.py new file mode 100644 index 00000000..5b48dae8 --- /dev/null +++ b/lib/aci/contract/standard/event/api.py @@ -0,0 +1,51 @@ +class ContractStandardEventApi(): + def __init__(self): + self.standard_contract_event_mo = None + + def get_standard_contract_event_mo(self): + if self.standard_contract_event_mo is not None: + return self.standard_contract_event_mo + + cache = self.get_object_cache( + 'vzBrCP.eventLog' + ) + if cache is not None: + self.standard_contract_event_mo = cache + self.log.apic_mo( + 'vzBrCP.eventLog', + self.standard_contract_event_mo + ) + return self.standard_contract_event_mo + + query = 'rsp-subtree-include=event-logs,no-scoped,subtree&order-by=eventRecord.created|desc&page=0&page-size=%s' % (self.api_event_limit) + managed_objects = self.get_class( + 'vzBrCP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_standard_contract_event_mo', + 'API failed' + ) + return None + + self.standard_contract_event_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['eventRecord']['attributes'] + self.standard_contract_event_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzBrCP.eventLog', + self.standard_contract_event_mo + ) + + self.set_object_cache( + 'vzBrCP.eventLog', + self.standard_contract_event_mo + ) + + return self.standard_contract_event_mo diff --git a/lib/aci/contract/standard/event/info.py b/lib/aci/contract/standard/event/info.py new file mode 100644 index 00000000..3f4afe7e --- /dev/null +++ b/lib/aci/contract/standard/event/info.py @@ -0,0 +1,124 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class ContractStandardEventInfo(): + def __init__(self): + self.standard_contract_event = None + + def get_standard_contract_event_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['contractName'] = None + + if 'affected' in info: + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/brc-BT-Demo + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/brc-' in info['affected']: + info['contractName'] = info['affected'].split('/brc-')[1].split('/')[0] + + if 'affected' not in info and 'dn' in info: + if 'uni/tn-' in info['dn']: + # uni/tn-k8s/brc-BT-Demo + info['tenantName'] = info['dn'].split('uni/tn-')[1].split('/')[0] + + if '/brc-' in info['dn']: + info['contractName'] = info['dn'].split('/brc-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['contractName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['contractName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_standard_contract_event(self, deduplicate=True): + if self.standard_contract_event is not None: + return self.standard_contract_event + + managed_objects = self.get_standard_contract_event_mo() + if managed_objects is None: + return None + + self.standard_contract_event = [] + transaction_ids = [] + for managed_object in managed_objects: + event_info = self.get_standard_contract_event_info( + managed_object + ) + if not deduplicate or event_info['txId'] not in transaction_ids: + self.standard_contract_event.append( + event_info + ) + transaction_ids.append( + event_info['txId'] + ) + + self.log.apic_mo( + 'vzBrCP.eventLog.info', + self.standard_contract_event + ) + + return self.standard_contract_event + + def get_standard_contract_id_event(self, tenant_name, contract_name, event_filter=None): + events = [] + + all_events = self.get_standard_contract_event() + if all_events is None: + return events + + for event_info in all_events: + if event_info['tenantName'] is not None and event_info['contractName'] is not None: + if event_info['tenantName'] == tenant_name and event_info['contractName'] == contract_name: + if not self.match_system_fault(event_info, event_filter): + continue + + events.append( + event_info + ) + + return events diff --git a/lib/aci/contract/standard/event/main.py b/lib/aci/contract/standard/event/main.py new file mode 100644 index 00000000..a58a4b22 --- /dev/null +++ b/lib/aci/contract/standard/event/main.py @@ -0,0 +1,8 @@ +from lib.aci.contract.standard.event.api import ContractStandardEventApi +from lib.aci.contract.standard.event.info import ContractStandardEventInfo + + +class ContractStandardEvent(ContractStandardEventApi, ContractStandardEventInfo): + def __init__(self): + ContractStandardEventApi.__init__(self) + ContractStandardEventInfo.__init__(self) diff --git a/lib/aci/contract/standard/fault/__init__.py b/lib/aci/contract/standard/fault/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/standard/fault/api.py b/lib/aci/contract/standard/fault/api.py new file mode 100644 index 00000000..479da925 --- /dev/null +++ b/lib/aci/contract/standard/fault/api.py @@ -0,0 +1,118 @@ +class ContractStandardFaultApi(): + def __init__(self): + self.standard_contract_fault_mo = None + self.standard_contract_fault_record_mo = None + + def get_standard_contract_fault_mo(self): + cache = self.get_object_cache( + 'vzBrCP.fault' + ) + if cache is not None: + self.standard_contract_fault_mo = cache + self.log.apic_mo( + 'vzBrCP.fault', + self.standard_contract_fault_mo + ) + return self.standard_contract_fault_mo + + query = 'rsp-subtree-include=faults,no-scoped,subtree' + managed_objects = self.get_class( + 'vzBrCP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_standard_contract_fault_mo', + 'API failed' + ) + return None + + self.standard_contract_fault_mo = [] + + for managed_object in managed_objects['imdata']: + if 'faultInst' in managed_object: + attributes = managed_object['faultInst']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = False + self.standard_contract_fault_mo.append( + attributes + ) + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = True + self.standard_contract_fault_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzBrCP.fault', + self.standard_contract_fault_mo + ) + + self.set_object_cache( + 'vzBrCP.fault', + self.standard_contract_fault_mo + ) + + return self.standard_contract_fault_mo + + def get_standard_contract_fault_record_mo(self): + cache = self.get_object_cache( + 'vzBrCP.faultRecord' + ) + if cache is not None: + self.standard_contract_fault_record_mo = cache + self.log.apic_mo( + 'vzBrCP.faultRecord', + self.standard_contract_fault_record_mo + ) + return self.standard_contract_fault_record_mo + + query = 'rsp-subtree-include=fault-records,no-scoped,subtree&order-by=faultRecord.created|desc&page=0&page-size=%s' % (self.api_fault_limit) + managed_objects = self.get_class( + 'vzBrCP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_standard_contract_fault_record_mo', + 'API failed' + ) + return None + + self.standard_contract_fault_record_mo = [] + + for managed_object in managed_objects['imdata']: + if 'faultRecord' in managed_object: + attributes = managed_object['faultRecord']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = False + self.standard_contract_fault_record_mo.append( + attributes + ) + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = True + self.standard_contract_fault_record_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzBrCP.faultRecord', + self.standard_contract_fault_record_mo + ) + + self.set_object_cache( + 'vzBrCP.faultRecord', + self.standard_contract_fault_record_mo + ) + + return self.standard_contract_fault_record_mo diff --git a/lib/aci/contract/standard/fault/info.py b/lib/aci/contract/standard/fault/info.py new file mode 100644 index 00000000..f6712848 --- /dev/null +++ b/lib/aci/contract/standard/fault/info.py @@ -0,0 +1,155 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class ContractStandardFaultInfo(): + def __init__(self): + self.standard_contract_fault = None + self.standard_contract_fault_record = None + + def get_standard_contract_fault_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['contractName'] = None + + if not managed_object['delegated']: + if 'affected' in info: + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/brc-BT-Demo + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/brc-' in info['affected']: + info['contractName'] = info['affected'].split('/brc-')[1].split('/')[0] + + if info['tenantName'] is None: + if 'uni/tn-' in info['dn']: + # uni/tn-k8s/brc-BT-Demo + info['tenantName'] = info['dn'].split('uni/tn-')[1].split('/')[0] + + if '/brc-' in info['dn']: + info['contractName'] = info['dn'].split('/brc-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['contractName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['contractName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_standard_contract_fault(self): + if self.standard_contract_fault is not None: + return self.standard_contract_fault + + managed_objects = self.get_standard_contract_fault_mo() + if managed_objects is None: + return None + + self.standard_contract_fault = [] + + for managed_object in managed_objects: + fault_info = self.get_standard_contract_fault_info( + managed_object + ) + self.standard_contract_fault.append( + fault_info + ) + + self.log.apic_mo( + 'vzBrCP.fault.info', + self.standard_contract_fault + ) + + return self.standard_contract_fault + + def get_standard_contract_fault_record(self, deduplicate=True): + if self.standard_contract_fault_record is not None: + return self.standard_contract_fault_record + + managed_objects = self.get_standard_contract_fault_record_mo() + if managed_objects is None: + return None + + self.standard_contract_fault_record = [] + fault_ids = [] + + for managed_object in managed_objects: + fault_info = self.get_standard_contract_fault_info( + managed_object + ) + if not deduplicate or fault_info['id'] not in fault_ids: + self.standard_contract_fault_record.append( + fault_info + ) + fault_ids.append( + fault_info['id'] + ) + + self.log.apic_mo( + 'vzBrCP.faultRecord.info', + self.standard_contract_fault_record + ) + + return self.standard_contract_fault_record + + def get_standard_contract_id_fault(self, tenant_name, contract_name, fault_object, fault_filter=None): + faults = [] + + if fault_object == 'faultInst': + all_faults = self.get_standard_contract_fault() + if all_faults is None: + return faults + + fault_filter = self.remove_system_fault_timestamp_filter( + fault_filter + ) + + if fault_object == 'faultRecord': + all_faults = self.get_standard_contract_fault_record() + if all_faults is None: + return faults + + for fault_info in all_faults: + if fault_info['tenantName'] is not None and fault_info['contractName'] is not None: + if fault_info['tenantName'] == tenant_name and fault_info['contractName'] == contract_name: + if not self.match_system_fault(fault_info, fault_filter, exclude_cleared=False): + continue + + faults.append( + fault_info + ) + + return faults diff --git a/lib/aci/contract/standard/fault/main.py b/lib/aci/contract/standard/fault/main.py new file mode 100644 index 00000000..db1373e8 --- /dev/null +++ b/lib/aci/contract/standard/fault/main.py @@ -0,0 +1,8 @@ +from lib.aci.contract.standard.fault.api import ContractStandardFaultApi +from lib.aci.contract.standard.fault.info import ContractStandardFaultInfo + + +class ContractStandardFault(ContractStandardFaultApi, ContractStandardFaultInfo): + def __init__(self): + ContractStandardFaultApi.__init__(self) + ContractStandardFaultInfo.__init__(self) diff --git a/lib/aci/contract/standard/info.py b/lib/aci/contract/standard/info.py new file mode 100644 index 00000000..60d842e6 --- /dev/null +++ b/lib/aci/contract/standard/info.py @@ -0,0 +1,361 @@ +from lib import filter_helper + + +class ContractStandardInfo(): + def __init__(self): + self.standard_contract = None + + def get_standard_contract_count(self, tenant_name=None): + contract_filter = None + if tenant_name is not None: + contract_filter = ['tenant:%s' % (tenant_name)] + + contracts = self.get_standard_contracts( + contract_filter=contract_filter + ) + return len(contracts) + + def get_standard_contract(self, tenant, name): + contract_filter = [] + contract_filter.append( + 'tenant:%s' % (tenant) + ) + contract_filter.append( + 'name:%s' % (name) + ) + + contracts = self.get_standard_contracts( + contract_filter=contract_filter + ) + + if len(contracts) == 1: + return contracts[0] + + return None + + def get_standard_contract_epg_info(self, managed_object): + if managed_object['tCl'] not in ['fvAEPg', 'l2extInstP', 'l3extInstP', 'mgmtInB']: + self.log.error( + 'get_contract_epg_info', + 'Unsupported object class: %s' % (managed_object) + ) + return None + + if managed_object['tCl'] == 'fvAEPg': + # "tDn": "uni/tn-mgmt/ap-EU-SPDC_ANP/epg-EU-SPDC-MGMT" + info = {} + info['class'] = 'fvAEPg' + info['tenant'] = managed_object['tDn'].split('/')[1][3:] + info['application_profile'] = managed_object['tDn'].split('/')[2][3:] + info['name'] = managed_object['tDn'].split('/')[3][4:] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + info['nameLong'] = '%s/%s/%s' % ( + info['tenant'], + info['application_profile'], + info['name'] + ) + + if managed_object['tCl'] == 'l3extInstP': + # "tDn": "uni/tn-common/out-Infra_privIP_L3out/instP-Infra_privIP_ExtEPG" + info = {} + info['class'] = 'l3extInstP' + info['tenant'] = managed_object['tDn'].split('/')[1][3:] + info['l3out'] = managed_object['tDn'].split('/')[2][4:] + info['name'] = managed_object['tDn'].split('/')[3][6:] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + info['nameLong'] = '%s/%s/%s' % ( + info['tenant'], + info['l3out'], + info['name'] + ) + + if managed_object['tCl'] == 'l2extInstP': + # "tDn": "uni/tn-common/l2out-VNF-mgmt_L2out/instP-VNF-mgmt_L2ext" + info = {} + info['class'] = 'l2extInstP' + info['tenant'] = managed_object['tDn'].split('/')[1][3:] + info['l3out'] = managed_object['tDn'].split('/')[2][4:] + info['name'] = managed_object['tDn'].split('/')[3][6:] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + info['nameLong'] = '%s/%s/%s' % ( + info['tenant'], + info['l3out'], + info['name'] + ) + + if managed_object['tCl'] == 'mgmtInB': + # "tDn": "uni/tn-mgmt/mgmtp-default/inb-default" + info = {} + info['class'] = 'mgmtInB' + info['tenant'] = managed_object['tDn'].split('/')[1][3:] + info['mgmt'] = managed_object['tDn'].split('/')[2][6:] + info['name'] = managed_object['tDn'].split('/')[3][4:] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + info['nameLong'] = '%s/%s/%s' % ( + info['tenant'], + info['mgmt'], + info['name'] + ) + + return info + + def get_standard_contract_filters_info(self, managed_object): + info = [] + for item in managed_object['vzSubj']: + subject_name = item['name'] + subject_tenant = managed_object['dn'].split('/')[1][3:] + subject_info = self.get_subject( + subject_tenant, + subject_name + ) + if subject_info is None: + continue + + for filter_item in subject_info['vzFilter']: + filter_tenant = filter_item['tenant'] + if len(filter_tenant) == 0: + filter_tenant = subject_tenant + + filter_info = self.get_contract_filter( + filter_tenant, + filter_item['name'] + ) + if filter_info is None: + self.log.error( + 'get_standard_contract_filters_info', + 'Filter not found: %s/%s' % ( + filter_tenant, + filter_item['name'] + ) + ) + self.log.error( + 'get_standard_contract_filters_info', + subject_info + ) + self.log.error( + 'get_standard_contract_filters_info', + managed_object + ) + continue + + filter_info['subjectName'] = subject_name + filter_info['subjectTenant'] = subject_tenant + filter_info['subjectNameTenant'] = '%s/%s' % ( + subject_tenant, + subject_name + ) + info.append( + filter_info + ) + + return info + + def get_standard_contract_info(self, managed_object): + keys = [ + 'descr', + 'dn', + 'intent', + 'name', + 'scope', + 'targetDscp', + 'userdom' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['tenant'] = info['dn'].split('/')[1][3:] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + + info['vzFilter'] = self.get_standard_contract_filters_info( + managed_object + ) + + info['consumerEpg'] = [] + for item in managed_object['vzRtCons']: + contract_epg_info = self.get_standard_contract_epg_info( + item + ) + if contract_epg_info is not None: + info['consumerEpg'].append( + contract_epg_info + ) + + info['providerEpg'] = [] + for item in managed_object['vzRtProv']: + contract_epg_info = self.get_standard_contract_epg_info( + item + ) + if contract_epg_info is not None: + info['providerEpg'].append( + contract_epg_info + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_standard_contracts_info(self): + if self.standard_contract is None: + self.standard_contract = [] + + contracts = self.get_standard_contract_mo() + if contracts is not None: + for managed_object in contracts: + self.standard_contract.append( + self.get_standard_contract_info( + managed_object + ) + ) + + return self.standard_contract + + def match_standard_contract(self, contract_info, contract_filter): + if contract_filter is None or len(contract_filter) == 0: + return True + + for contract_rule in contract_filter: + (key, value) = contract_rule.split(':') + key_found = False + + if key == 'name': + key_found = True + if not filter_helper.match_tenant_name(value, contract_info['nameTenant']): + return False + + if key == 'names': + key_found = True + found = False + for name in value.split(','): + if filter_helper.match_tenant_name(name, contract_info['nameTenant']): + found = True + break + + if not found: + return False + + if key == 'tenant': + key_found = True + if not filter_helper.match_string(value, contract_info['tenant']): + return False + + if key == 'filter': + key_found = True + found = False + for filter_info in contract_info['vzFilter']: + if filter_helper.match_tenant_name(value, filter_info['nameTenant']): + found = True + break + + if not found: + return False + + if key == 'fault': + key_found = True + if value == 'any': + if not contract_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_standard_contract', + 'Unsupported fault filtering value: %s' % (value) + ) + + if not key_found: + self.log.error( + 'match_standard_contract', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_standard_contracts( + self, + contract_filter=None, + fault_info=False, + hfault_info=False, + event_info=False, + audit_info=False, + hfault_filter=None, + event_filter=None, + audit_filter=None + ): + all_contracts = self.get_standard_contracts_info() + if all_contracts is None: + return None + + contracts = [] + + for contract_info in all_contracts: + if not self.match_standard_contract(contract_info, contract_filter): + continue + + if fault_info: + contract_info['faultInst'] = self.get_standard_contract_id_fault( + contract_info['tenant'], + contract_info['name'], + 'faultInst' + ) + + if hfault_info: + contract_info['faultRecord'] = self.get_standard_contract_id_fault( + contract_info['tenant'], + contract_info['name'], + 'faultRecord', + fault_filter=hfault_filter + ) + + if event_info: + contract_info['eventLog'] = self.get_standard_contract_id_event( + contract_info['tenant'], + contract_info['name'], + event_filter=event_filter + ) + + if audit_info: + contract_info['auditLog'] = self.get_standard_contract_id_audit( + contract_info['tenant'], + contract_info['name'], + audit_filter=audit_filter + ) + + contracts.append(contract_info) + + contracts = sorted( + contracts, + key=lambda i: i['nameTenant'].lower() + ) + + self.log.apic_mo( + 'vzBrCP.info', + contracts + ) + + return contracts diff --git a/lib/aci/contract/standard/main.py b/lib/aci/contract/standard/main.py new file mode 100644 index 00000000..b15dc829 --- /dev/null +++ b/lib/aci/contract/standard/main.py @@ -0,0 +1,23 @@ +from lib.aci.contract.standard.api import ContractStandardApi +from lib.aci.contract.standard.info import ContractStandardInfo +from lib.aci.contract.standard.subject.main import ContractSubject +from lib.aci.contract.standard.audit.main import ContractStandardAudit +from lib.aci.contract.standard.event.main import ContractStandardEvent +from lib.aci.contract.standard.fault.main import ContractStandardFault + + +class ContractStandard( + ContractStandardApi, + ContractStandardInfo, + ContractSubject, + ContractStandardAudit, + ContractStandardEvent, + ContractStandardFault + ): + def __init__(self): + ContractStandardApi.__init__(self) + ContractStandardInfo.__init__(self) + ContractSubject.__init__(self) + ContractStandardAudit.__init__(self) + ContractStandardEvent.__init__(self) + ContractStandardFault.__init__(self) diff --git a/lib/aci/contract/standard/output.py b/lib/aci/contract/standard/output.py new file mode 100644 index 00000000..33ba421b --- /dev/null +++ b/lib/aci/contract/standard/output.py @@ -0,0 +1,316 @@ +import copy + + +class ContractStandardOutput(): + def __init__(self): + pass + + def print_standard_contracts(self, info, show_contract_filters=False, title=False): + if title: + self.my_output.default( + 'Standard Contract [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'faults', + 'nameTenant', + 'scope', + 'intent', + 'targetDscp', + 'vzFilter.subjectNameTenant', + 'vzFilter.nameTenant' + ] + + headers = [ + 'Faults', + 'Contract', + 'Scope', + 'Intent', + 'Target DSCP', + 'Subject', + 'Filter' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['vzFilter'] + ), + order=order, + headers=headers, + underline=True, + row_separator=True, + allow_order_subkeys=True, + table=True + ) + + if show_contract_filters: + filters_in_the_list = [] + filters = [] + for contract in info: + for item in contract['vzFilter']: + if item['nameTenant'] not in filters_in_the_list: + filters_in_the_list.append( + item['nameTenant'] + ) + new_entry = copy.deepcopy(item) + filters.append(new_entry) + + self.print_contract_filters( + filters, + title=title + ) + + def print_standard_contracts_usage(self, info, title=False): + if title: + self.my_output.default( + 'Standard Contract - Usage [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'faults', + 'nameTenant', + 'consumerEpg.nameLong', + 'providerEpg.nameLong' + ] + + headers = [ + 'Faults', + 'Contract', + 'Consumer EPG', + 'Provider EPG' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['consumerEpg', 'providerEpg'] + ), + order=order, + headers=headers, + underline=True, + row_separator=True, + allow_order_subkeys=True, + table=True + ) + + def print_standard_contracts_event_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Standard Contract - Event Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Standard Contract - Event Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Standard Contract', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) + + def print_standard_contracts_fault_inst(self, info, title=False): + if title: + self.my_output.default( + 'Standard Contract - Faults [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Standard Contract', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_standard_contracts_fault_record(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Standard Contract - Fault Records [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Standard Contract - Fault Records last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Standard Contract', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_standard_contracts_audit_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Standard Contract - Audit Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Standard Contract - Audit Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Standard Contract', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/contract/standard/subject/__init__.py b/lib/aci/contract/standard/subject/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/standard/subject/api.py b/lib/aci/contract/standard/subject/api.py new file mode 100644 index 00000000..73024a90 --- /dev/null +++ b/lib/aci/contract/standard/subject/api.py @@ -0,0 +1,60 @@ +class ContractSubjectApi(): + def __init__(self): + self.subjects_mo = None + + def get_subjects_mo(self): + if self.subjects_mo is not None: + return self.subjects_mo + + cache = self.get_object_cache( + 'vzSubj' + ) + if cache is not None: + self.subjects_mo = cache + self.log.apic_mo( + 'vzSubj', + self.subjects_mo + ) + return self.subjects_mo + + query = 'rsp-subtree=children&rsp-subtree-include=fault-count&rsp-subtree-class=vzRsSubjFiltAtt' + managed_objects = self.get_class( + 'vzSubj', + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_subjects_mo', + 'API failed' + ) + return None + + self.subjects_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['vzSubj']['attributes'] + attributes['vzRsSubjFiltAtt'] = self.get_mo_children_attributes( + 'vzSubj', + managed_object, + 'vzRsSubjFiltAtt' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'vzSubj', + managed_object, + 'faultCounts' + ) + self.subjects_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzSubj', + self.subjects_mo + ) + + self.set_object_cache( + 'vzSubj', + self.subjects_mo + ) + + return self.subjects_mo diff --git a/lib/aci/contract/standard/subject/info.py b/lib/aci/contract/standard/subject/info.py new file mode 100644 index 00000000..74651eda --- /dev/null +++ b/lib/aci/contract/standard/subject/info.py @@ -0,0 +1,99 @@ +class ContractSubjectInfo(): + def __init__(self): + self.subjects = None + + def get_subject_info(self, managed_object): + keys = [ + 'descr', + 'dn', + 'name' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['tenant'] = info['dn'].split('/')[1][3:] + contract_dn = info['dn'].split('/')[2] + if contract_dn.split('-')[0] == 'brc': + info['contract'] = contract_dn[4:] + if contract_dn.split('-')[0] == 'oobbrc': + info['contract'] = contract_dn[7:] + + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + + info['vzFilter'] = [] + for rule_mo in managed_object['vzRsSubjFiltAtt']: + if rule_mo['tCl'] != 'vzFilter': + self.log.error( + 'get_subject_info', + 'Unsupported tCl: %s' % (rule_mo['tCl']) + ) + continue + + filter_info = {} + filter_info['name'] = rule_mo['tnVzFilterName'] + try: + filter_info['tenant'] = rule_mo['tDn'].split('/')[1][3:] + except BaseException: + filter_info['tenant'] = '' + + info['vzFilter'].append( + filter_info + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_subjects_info(self): + if self.subjects is None: + self.subjects = [] + + subjects = self.get_subjects_mo() + if subjects is not None: + for managed_object in subjects: + self.subjects.append( + self.get_subject_info( + managed_object + ) + ) + + self.log.apic_mo( + 'vzSubj.info', + self.subjects + ) + + return self.subjects + + def get_subjects(self, tenant, contract_name): + all_subjects = self.get_subjects_info() + subjects = [] + for subject in all_subjects: + if subject['tenant'] == tenant and subject['contract'] == contract_name: + subjects.append( + subject + ) + + return subjects + + def get_subject(self, tenant, name): + all_subjects = self.get_subjects_info() + for subject in all_subjects: + if subject['tenant'] == tenant and subject['name'] == name: + return subject + + return None diff --git a/lib/aci/contract/standard/subject/main.py b/lib/aci/contract/standard/subject/main.py new file mode 100644 index 00000000..17809317 --- /dev/null +++ b/lib/aci/contract/standard/subject/main.py @@ -0,0 +1,8 @@ +from lib.aci.contract.standard.subject.api import ContractSubjectApi +from lib.aci.contract.standard.subject.info import ContractSubjectInfo + + +class ContractSubject(ContractSubjectApi, ContractSubjectInfo): + def __init__(self): + ContractSubjectApi.__init__(self) + ContractSubjectInfo.__init__(self) diff --git a/lib/aci/contract/taboo/__init__.py b/lib/aci/contract/taboo/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/taboo/__pycache__/__init__.cpython-310.pyc b/lib/aci/contract/taboo/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb6c3410ea36ddc869398b5d480680e9f1b7ae57 GIT binary patch literal 149 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!H8vsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vlq%JKd+=HF}WlrK0Y%qvm`!Vub}c4hfQvN RN@-529mvFDCLqDW004SMBX$4) literal 0 HcmV?d00001 diff --git a/lib/aci/contract/taboo/__pycache__/api.cpython-310.pyc b/lib/aci/contract/taboo/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64c10a67034f62ebdf7bd0c5d328988bab479776 GIT binary patch literal 1312 zcmZuxPiqrF6rb6h-E6k0)`Cbx&{H8`y?IbtX^kLWN-CA4RAvxKr zUqOdZ3Qg>M%9Z6l6>ykdRA{YSi4zF)fN0MWS8?Ak#8E`A!srgg-Cp zFI%5^nzZ6X$5~6rp-fwemTD+fD^1!h9)oX@-?HUee2_dFoSPtul75m$5mL}7LOQD6 zCj9I=YK6HE(Ks#h-=K_17kC#`1*kQ^o>D<)bVA2)K7c|?U2`v&L(k0Vi?9C`8XM1+d6^_&LZN{~Yqh@J1ve!ELsPtf0 z7wue0xgVbamuychkA{o-F-S7z0Z$TmcKrS z>-NqHsm{&)j?AOA=P(KnkKa8x;Ylim@spn5IX5BCbCtAL z2hU*b#*S(pc3z+NWE7b&f)f-)ih3oA&I+E+Jqo+a?qz9z*zwA468{`HHHHNwpcPl4 W4L=S0{a=y^_U3E7vYB}6+vFc)kW%&l literal 0 HcmV?d00001 diff --git a/lib/aci/contract/taboo/__pycache__/info.cpython-310.pyc b/lib/aci/contract/taboo/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65e9247898b8f8b41cc6d38b2fcbdf6ba608a0b9 GIT binary patch literal 4703 zcma)A&u<&Y72cVhT`reP+LGnCatudpEypxk8$k~)1j9(;L_y$|F=7=(2^Q>{vyy33 zBsH^CVPXjcuzMY+eRQh^?P?LX1~VbNPJ4e|#R5NfO6n^{sn9e4%K&b)c^X7=s( z-uG66YBh9l{pDdb+5NzA{!N3Umy5y2`01-?q$63+*7rTfy6?hD@JQap0% z-gnS(>MXCWcYA4~+E0?+Fi{|(JhkLo~md_V|F8Z!qkaKb#7DDObR2TEP`-6U};!e62KOPLe z?5__x?8tej&+)sDpC)feCv)0pA33jB1CLWnX9R(Zv)ZujHOL`5ViPajen$Ji#I znID}t26vA7Db4B{8o>em}cMDHn%s@{Lzd`Dp(11J1*czKljN!F(nTglk$sUW!Bje~qub zi>HpErVNARcjKdfpaUNfYS^Olne+RHiYC_y900;BOUaOmy|3TK*Gr#HZvvvngA&&4(7W5Zfn7M>NUf2Vw#RFaMvtGWi+F^b%liGU zqGD(2e(vdEubVb6pRsYFZbNJuGsSTbVuOv`OOzTYbpa1jFIynhHsgN0k;wMI948la zY_w^z*_^j=TG%xa*<3g-voJiVNj92uR@1t}EY2&%faXucvbuspUBgeWq7f`Y;9dqi zIsU|(0MLy1;m9{~J15@oQow^k621`z#{7G+IR5BeKz!_l9YZvw;aSxG2ZIg7``?iH zx`_TRB3^Pr5zu{pB9PtPOkfOrZ#(Kr#xk*3$hIQN1!rL%@)D34(4DkpdC@Tlbq#VU z9@rjb65w}(<|FLDWYxsOyongZ!yYT*g{j|>4t8=g-yr)7L<~h-Z4p_j#W9OWljmT? zHLZgfC}tr!PjbY;T%%sfJ(=i^Qj2(S6AaC&N|NokH;U8blU@%{>;Q! zz)f@ScyOa`*2_W@8^%kf>NnmZ}Atf-2?mU>rRx=u^L5k=||aY08XUOd0P9( zQ4}oTabnB-;^9Nj9JDzwE>|n0=UT_UhraRdiG*+#x!a_gVTGn;A-rV$2Ku7-KkyHH z|J_L5nmR`E#KrXHj7J`Vfl=Imf^?Xo2Lfjx@JNCtG79;>ngRe+MqxD(6Hf{RA?O`i zHzf!xUdSpO}p&pcU0 zf5#>Xy;Ep-^4vC4-{QS{yS_Xx=Q7XIZszO1&!qF2D9E@*eyd+-n8IdlpRKH#l%j6I z-?>LQK<~4kndE?|HUz6~n>iDixr=~Qzks056oEBg*o@Q8lM|KXc=hmmt@m3hsev=v~B8v+%q@pjT>a}c=Aw$#y{hyC7K1`Jm59c3U=P$ zpNhB|`gG@DKZ=Q?bJ3|e$~2@!EQ-iMo|*QLS-i8d$yv@`?NG%xy{J;31<$`QK!R|P zKFV3yB$bdVUQ~o(RtD4?lM1DmtO9o9`qEY{UA-r=&kypOvJ)LlQ7-=BeLep0p3=0~wh4GUh|@V8tY}TIy$^{V0^t z4#$a|r=?v~j9Ivcx-tt*ooIQ?)QDvRv@iQQE!gSnq%%+w-*b_fDGCf4;~TCIvN8D1 z12g*7V1s7jk;M1fbjFM@b1Y-iHvs|j5q_HdouM3|qGFFeCV0bO2)4Z5;E#zyhjmYY zDG%=U;?2i0zW17Jkg>=a-}xc-nC5PM>uzt*iF^7UI@Sh4kuW_*NxVj1vbTuVP*>iC z(7?9&{uvz5m6llFHffylwn^g`OWVFSQEq}TFU7-dr@c9-N0wB~cVlS1Pp8T&PmT;i z`x?wdXdQ3*)k3MrKfk8u_zF!kjC(zsYP2$ZMK$UP-I_BjjxCrZ;%cw{Dg9r@gr0dIU10aOAbFqhxyMOhXO8mqV(jYhpf1sP@7 zb~_K-aFRqeLO*J^w?=W#&M1myHAl@QYOYX2G=2Cs?MLWgb}~Ks;8QLdqJI4oGyw{l z&<(<1KKL;BC^*OO(fJSmYX3F*4Se0Y_%DVc5E{u5f6hz;u=c$72>hBhiJW=&|Mte2 Awg3PC literal 0 HcmV?d00001 diff --git a/lib/aci/contract/taboo/__pycache__/main.cpython-310.pyc b/lib/aci/contract/taboo/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..677985efa540f11c8c0020b3b1870e45c0b6292f GIT binary patch literal 1008 zcmZ`%y^ho{5VrHP`PnSu(1`+Q5Y;w$fD=M{S^=Wj=BTVlQ8xBU1}9nKWTiuN+=D>L zJJ8Yd0BNasg{zoxF3U!z*z%{(lTqgLH&ZPZA%XSt_b;w&LjK_8bOmr(!O=SaPB>Mh zpo~)Fma+<)*@oN7DO~0n?xY2I7xK@ynLW z`_b12QQnWf$y(LqsN-~5a9P38=Kz8*$_cYL<<<>hHn%~$(=A3da|)TmLJlUAH5|PH zXvjDEg?tA)8|%pIBXf?-J+j%rIDv9>v-E0I)%j^EOWCApjTLGK!9|!McmUvsqlMc2 zAoU!sw-@V+V2#=bz^WQw=99=b zkaoWK5m*gNys6HBmxHTu%|FMB6n;c)3^01=7kutVFT|F?hp4=NV>xBvhE literal 0 HcmV?d00001 diff --git a/lib/aci/contract/taboo/__pycache__/output.cpython-310.pyc b/lib/aci/contract/taboo/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5807853b4ae3a3f65cb29f07f04e51ba64afc55 GIT binary patch literal 3782 zcmd5<&2!U66xT|!Br8s!NuUiMQy0oiJ%vzOpoLOe8j|#bahb-wq-In_yKzKh$*g44 zc$AsWz?J`?(*bVzJ9_J}$G!H{GjPca(DznRY$r|$(@W*i&#T?{cAwtIZ&%UisI9>D z;?Ljdw`E273m^I~4IaLLJ3azH6-okSQJGh$O11k6)$XZ_gpviNqW=x!O4UQ`zqa*n zLN8N5T3J*nq3V5QQKN5AofhtsMV*dQgPPDP&%$Dn0F>i|6n zts=Ex)k!fi6NL$Py`<(YMbUTdq}5J5(q{p-@t%P@)&Zyjiln*$AoQ38%N%W#uz6+X za(&ee{JQ7IUR0;7!-BdWGu~mm9{5Xj*MqUG73&EuS&!tJ)2%gOIgTItiQ^P-Efqi~ z-D5)xoX!R3JhUjkMxarITbe4Mk!t)vs@zs?gO3w6CHKf-^gQ_ffku?9hw7^;KaNrl z2`xM#M804{p~hpfuEW0x{{=aVCZ+V0q&l@4?R_{=eqLa#<4 ztLVa5cH2P`3p;e1tj0n&Ou9!p-8nx<7@v;YOShSqRC{9++haWioMtYYrXcMR=0c_j z{c<8<%MGa$_%Xbz;kH^Vq(b*1%s9$e zOSTTTxF04?o}13Hv^}njaLh2F`{8o5I3BNnVK8kJ%p#ek4ejW^>C*AL+m!#R$XutjFb7# zk+CZpN4k&+)dhb?3FJDXv#rK7CijgfY=Fopii`ntM{njL<=LC_qSUX!$3bGFz^70e zd7d9dIEHW>0ERG$_z8r;eAyZKqeDIJwDCo*fqMJ_z>xS8%YbWW{OxDmv-^&1wo-L~ zRt;DZU52#!d924N*i)s25Bh0hItz3shUykvO0u*3qZf;B(V}|^wBTUF4C_x zlzxFm8|n@MR)Hd|j3O&QkMHbChuIEPTlq%Ri2HM*TlqJ^z>SmgsV#+G`fQjob3`$Q zEsp!iS`8V6GEwl{cFct7appok34^lO<27M>D{k0e3oNN^n44pROA2j)b%Z`6Cz!zr zHcKQcKMK3{jGU?rbMf;K4t@au4B93kei%B$BxlX2!yMLZC2K%z zLAx2o{17T2lkhhY-Urw)dg&?jyDKbwMUs|>Cnde*byfTYOJ?;uWx{0z`3q(EH^xP7E2id@x!Zy|p7Q{51A$AFi^k zVGrNSoe%b$IQbQn_F@Uu+V=O(T>@C*HN4$hZWmMJn?d{=81jE$id_da8xLx7(-^6C z-yNO{jl(^2xky* zW9MHXe2wr8LN6<13y)b`ei1<;~PHifXRWF}q3 M4*~f(XDQ>_KNb_OEdT%j literal 0 HcmV?d00001 diff --git a/lib/aci/contract/taboo/api.py b/lib/aci/contract/taboo/api.py new file mode 100644 index 00000000..dd375c7b --- /dev/null +++ b/lib/aci/contract/taboo/api.py @@ -0,0 +1,65 @@ +class ContractTabooApi(): + def __init__(self): + self.taboo_contract_mo = None + + def get_taboo_contract_mo(self): + if self.taboo_contract_mo is not None: + return self.taboo_contract_mo + + cache = self.get_object_cache( + 'vzTaboo' + ) + if cache is not None: + self.taboo_contract_mo = cache + self.log.apic_mo( + 'vzTaboo', + self.taboo_contract_mo + ) + return self.taboo_contract_mo + + query = 'rsp-subtree=children&rsp-subtree-include=fault-count&rsp-subtree-class=vzTSubj,vzRtProtBy' + managed_objects = self.get_class( + 'vzTaboo', + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_taboo_contract_mo', + 'API failed' + ) + return None + + self.taboo_contract_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['vzTaboo']['attributes'] + attributes['vzTSubj'] = self.get_mo_children_attributes( + 'vzTaboo', + managed_object, + 'vzTSubj' + ) + attributes['vzRtProtBy'] = self.get_mo_children_attributes( + 'vzTaboo', + managed_object, + 'vzRtProtBy' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'vzTaboo', + managed_object, + 'faultCounts' + ) + self.taboo_contract_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzTaboo', + self.taboo_contract_mo + ) + + self.set_object_cache( + 'vzTaboo', + self.taboo_contract_mo + ) + + return self.taboo_contract_mo diff --git a/lib/aci/contract/taboo/audit/__init__.py b/lib/aci/contract/taboo/audit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/taboo/audit/api.py b/lib/aci/contract/taboo/audit/api.py new file mode 100644 index 00000000..79eedaab --- /dev/null +++ b/lib/aci/contract/taboo/audit/api.py @@ -0,0 +1,48 @@ +class ContractTabooAuditApi(): + def __init__(self): + self.taboo_contract_audit_mo = None + + def get_taboo_contract_audit_mo(self): + cache = self.get_object_cache( + 'vzTaboo.audit' + ) + if cache is not None: + self.taboo_contract_audit_mo = cache + self.log.apic_mo( + 'vzTaboo.audit', + self.taboo_contract_audit_mo + ) + return self.taboo_contract_audit_mo + + query = 'rsp-subtree-include=audit-logs,no-scoped,subtree&order-by=aaaModLR.created|desc&page=0&page-size=%s' % (self.api_audit_limit) + managed_objects = self.get_class( + 'vzTaboo', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_taboo_contract_audit_mo', + 'API failed' + ) + return None + + self.taboo_contract_audit_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['aaaModLR']['attributes'] + self.taboo_contract_audit_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzTaboo.audit', + self.taboo_contract_audit_mo + ) + + self.set_object_cache( + 'vzTaboo.audit', + self.taboo_contract_audit_mo + ) + + return self.taboo_contract_audit_mo diff --git a/lib/aci/contract/taboo/audit/info.py b/lib/aci/contract/taboo/audit/info.py new file mode 100644 index 00000000..6acdef3e --- /dev/null +++ b/lib/aci/contract/taboo/audit/info.py @@ -0,0 +1,110 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class ContractTabooAuditInfo(): + def __init__(self): + self.taboo_contract_audit = None + + def get_taboo_contract_audit_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['contractName'] = None + + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/taboo-BT-Demo + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/taboo-' in info['affected']: + info['contractName'] = info['affected'].split('/taboo-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['contractName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['contractName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_taboo_contract_audit(self): + if self.taboo_contract_audit is not None: + return self.taboo_contract_audit + + managed_objects = self.get_taboo_contract_audit_mo() + if managed_objects is None: + return None + + self.taboo_contract_audit = [] + for managed_object in managed_objects: + audit_info = self.get_taboo_contract_audit_info( + managed_object + ) + self.taboo_contract_audit.append( + audit_info + ) + + self.log.apic_mo( + 'vzTaboo.auditRecord.info', + self.taboo_contract_audit + ) + + return self.taboo_contract_audit + + def get_taboo_contract_id_audit(self, tenant_name, contract_name, audit_filter=None): + audits = [] + + all_audits = self.get_taboo_contract_audit() + if all_audits is None: + return audits + + for audit_info in all_audits: + if audit_info['tenantName'] is not None and audit_info['contractName'] is not None: + if audit_info['tenantName'] == tenant_name and audit_info['contractName'] == contract_name: + if not self.match_system_fault(audit_info, audit_filter, exclude_cleared=False): + continue + + audits.append( + audit_info + ) + + return audits diff --git a/lib/aci/contract/taboo/audit/main.py b/lib/aci/contract/taboo/audit/main.py new file mode 100644 index 00000000..d6e68fa4 --- /dev/null +++ b/lib/aci/contract/taboo/audit/main.py @@ -0,0 +1,8 @@ +from lib.aci.contract.taboo.audit.api import ContractTabooAuditApi +from lib.aci.contract.taboo.audit.info import ContractTabooAuditInfo + + +class ContractTabooAudit(ContractTabooAuditApi, ContractTabooAuditInfo): + def __init__(self): + ContractTabooAuditApi.__init__(self) + ContractTabooAuditInfo.__init__(self) diff --git a/lib/aci/contract/taboo/event/__init__.py b/lib/aci/contract/taboo/event/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/taboo/event/api.py b/lib/aci/contract/taboo/event/api.py new file mode 100644 index 00000000..1d72411c --- /dev/null +++ b/lib/aci/contract/taboo/event/api.py @@ -0,0 +1,51 @@ +class ContractTabooEventApi(): + def __init__(self): + self.taboo_contract_event_mo = None + + def get_taboo_contract_event_mo(self): + if self.taboo_contract_event_mo is not None: + return self.taboo_contract_event_mo + + cache = self.get_object_cache( + 'vzTaboo.eventLog' + ) + if cache is not None: + self.taboo_contract_event_mo = cache + self.log.apic_mo( + 'vzTaboo.eventLog', + self.taboo_contract_event_mo + ) + return self.taboo_contract_event_mo + + query = 'rsp-subtree-include=event-logs,no-scoped,subtree&order-by=eventRecord.created|desc&page=0&page-size=%s' % (self.api_event_limit) + managed_objects = self.get_class( + 'vzTaboo', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_taboo_contract_event_mo', + 'API failed' + ) + return None + + self.taboo_contract_event_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['eventRecord']['attributes'] + self.taboo_contract_event_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzTaboo.eventLog', + self.taboo_contract_event_mo + ) + + self.set_object_cache( + 'vzTaboo.eventLog', + self.taboo_contract_event_mo + ) + + return self.taboo_contract_event_mo diff --git a/lib/aci/contract/taboo/event/info.py b/lib/aci/contract/taboo/event/info.py new file mode 100644 index 00000000..01871819 --- /dev/null +++ b/lib/aci/contract/taboo/event/info.py @@ -0,0 +1,124 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class ContractTabooEventInfo(): + def __init__(self): + self.taboo_contract_event = None + + def get_taboo_contract_event_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['contractName'] = None + + if 'affected' in info: + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/taboo-BT-Demo + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/taboo-' in info['affected']: + info['contractName'] = info['affected'].split('/taboo-')[1].split('/')[0] + + if 'affected' not in info and 'dn' in info: + if 'uni/tn-' in info['dn']: + # uni/tn-k8s/taboo-BT-Demo + info['tenantName'] = info['dn'].split('uni/tn-')[1].split('/')[0] + + if '/taboo-' in info['dn']: + info['contractName'] = info['dn'].split('/taboo-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['contractName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['contractName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_taboo_contract_event(self, deduplicate=True): + if self.taboo_contract_event is not None: + return self.taboo_contract_event + + managed_objects = self.get_taboo_contract_event_mo() + if managed_objects is None: + return None + + self.taboo_contract_event = [] + transaction_ids = [] + for managed_object in managed_objects: + event_info = self.get_taboo_contract_event_info( + managed_object + ) + if not deduplicate or event_info['txId'] not in transaction_ids: + self.taboo_contract_event.append( + event_info + ) + transaction_ids.append( + event_info['txId'] + ) + + self.log.apic_mo( + 'vzTaboo.eventLog.info', + self.taboo_contract_event + ) + + return self.taboo_contract_event + + def get_taboo_contract_id_event(self, tenant_name, contract_name, event_filter=None): + events = [] + + all_events = self.get_taboo_contract_event() + if all_events is None: + return events + + for event_info in all_events: + if event_info['tenantName'] is not None and event_info['contractName'] is not None: + if event_info['tenantName'] == tenant_name and event_info['contractName'] == contract_name: + if not self.match_system_fault(event_info, event_filter): + continue + + events.append( + event_info + ) + + return events diff --git a/lib/aci/contract/taboo/event/main.py b/lib/aci/contract/taboo/event/main.py new file mode 100644 index 00000000..12146730 --- /dev/null +++ b/lib/aci/contract/taboo/event/main.py @@ -0,0 +1,8 @@ +from lib.aci.contract.taboo.event.api import ContractTabooEventApi +from lib.aci.contract.taboo.event.info import ContractTabooEventInfo + + +class ContractTabooEvent(ContractTabooEventApi, ContractTabooEventInfo): + def __init__(self): + ContractTabooEventApi.__init__(self) + ContractTabooEventInfo.__init__(self) diff --git a/lib/aci/contract/taboo/fault/__init__.py b/lib/aci/contract/taboo/fault/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/taboo/fault/api.py b/lib/aci/contract/taboo/fault/api.py new file mode 100644 index 00000000..7975f461 --- /dev/null +++ b/lib/aci/contract/taboo/fault/api.py @@ -0,0 +1,118 @@ +class ContractTabooFaultApi(): + def __init__(self): + self.taboo_contract_fault_mo = None + self.taboo_contract_fault_record_mo = None + + def get_taboo_contract_fault_mo(self): + cache = self.get_object_cache( + 'vzTaboo.fault' + ) + if cache is not None: + self.taboo_contract_fault_mo = cache + self.log.apic_mo( + 'vzTaboo.fault', + self.taboo_contract_fault_mo + ) + return self.taboo_contract_fault_mo + + query = 'rsp-subtree-include=faults,no-scoped,subtree' + managed_objects = self.get_class( + 'vzTaboo', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_taboo_contract_fault_mo', + 'API failed' + ) + return None + + self.taboo_contract_fault_mo = [] + + for managed_object in managed_objects['imdata']: + if 'faultInst' in managed_object: + attributes = managed_object['faultInst']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = False + self.taboo_contract_fault_mo.append( + attributes + ) + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = True + self.taboo_contract_fault_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzTaboo.fault', + self.taboo_contract_fault_mo + ) + + self.set_object_cache( + 'vzTaboo.fault', + self.taboo_contract_fault_mo + ) + + return self.taboo_contract_fault_mo + + def get_taboo_contract_fault_record_mo(self): + cache = self.get_object_cache( + 'vzTaboo.faultRecord' + ) + if cache is not None: + self.taboo_contract_fault_record_mo = cache + self.log.apic_mo( + 'vzTaboo.faultRecord', + self.taboo_contract_fault_record_mo + ) + return self.taboo_contract_fault_record_mo + + query = 'rsp-subtree-include=fault-records,no-scoped,subtree&order-by=faultRecord.created|desc&page=0&page-size=%s' % (self.api_fault_limit) + managed_objects = self.get_class( + 'vzTaboo', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_taboo_contract_fault_record_mo', + 'API failed' + ) + return None + + self.taboo_contract_fault_record_mo = [] + + for managed_object in managed_objects['imdata']: + if 'faultRecord' in managed_object: + attributes = managed_object['faultRecord']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = False + self.taboo_contract_fault_record_mo.append( + attributes + ) + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = True + self.taboo_contract_fault_record_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzTaboo.faultRecord', + self.taboo_contract_fault_record_mo + ) + + self.set_object_cache( + 'vzTaboo.faultRecord', + self.taboo_contract_fault_record_mo + ) + + return self.taboo_contract_fault_record_mo diff --git a/lib/aci/contract/taboo/fault/info.py b/lib/aci/contract/taboo/fault/info.py new file mode 100644 index 00000000..de3e4bb0 --- /dev/null +++ b/lib/aci/contract/taboo/fault/info.py @@ -0,0 +1,155 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class ContractTabooFaultInfo(): + def __init__(self): + self.taboo_contract_fault = None + self.taboo_contract_fault_record = None + + def get_taboo_contract_fault_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['contractName'] = None + + if not managed_object['delegated']: + if 'affected' in info: + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/taboo-BT-Demo + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/taboo-' in info['affected']: + info['contractName'] = info['affected'].split('/taboo-')[1].split('/')[0] + + if info['tenantName'] is None: + if 'uni/tn-' in info['dn']: + # uni/tn-k8s/taboo-BT-Demo + info['tenantName'] = info['dn'].split('uni/tn-')[1].split('/')[0] + + if '/taboo-' in info['dn']: + info['contractName'] = info['dn'].split('/taboo-')[1].split('/')[0] + + info['nameTenant'] = '--' + if info['tenantName'] is not None and info['contractName'] is not None: + info['nameTenant'] = '%s/%s' % ( + info['tenantName'], + info['contractName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_taboo_contract_fault(self): + if self.taboo_contract_fault is not None: + return self.taboo_contract_fault + + managed_objects = self.get_taboo_contract_fault_mo() + if managed_objects is None: + return None + + self.taboo_contract_fault = [] + + for managed_object in managed_objects: + fault_info = self.get_taboo_contract_fault_info( + managed_object + ) + self.taboo_contract_fault.append( + fault_info + ) + + self.log.apic_mo( + 'vzTaboo.fault.info', + self.taboo_contract_fault + ) + + return self.taboo_contract_fault + + def get_taboo_contract_fault_record(self, deduplicate=True): + if self.taboo_contract_fault_record is not None: + return self.taboo_contract_fault_record + + managed_objects = self.get_taboo_contract_fault_record_mo() + if managed_objects is None: + return None + + self.taboo_contract_fault_record = [] + fault_ids = [] + + for managed_object in managed_objects: + fault_info = self.get_taboo_contract_fault_info( + managed_object + ) + if not deduplicate or fault_info['id'] not in fault_ids: + self.taboo_contract_fault_record.append( + fault_info + ) + fault_ids.append( + fault_info['id'] + ) + + self.log.apic_mo( + 'vzTaboo.faultRecord.info', + self.taboo_contract_fault_record + ) + + return self.taboo_contract_fault_record + + def get_taboo_contract_id_fault(self, tenant_name, contract_name, fault_object, fault_filter=None): + faults = [] + + if fault_object == 'faultInst': + all_faults = self.get_taboo_contract_fault() + if all_faults is None: + return faults + + fault_filter = self.remove_system_fault_timestamp_filter( + fault_filter + ) + + if fault_object == 'faultRecord': + all_faults = self.get_taboo_contract_fault_record() + if all_faults is None: + return faults + + for fault_info in all_faults: + if fault_info['tenantName'] is not None and fault_info['contractName'] is not None: + if fault_info['tenantName'] == tenant_name and fault_info['contractName'] == contract_name: + if not self.match_system_fault(fault_info, fault_filter, exclude_cleared=False): + continue + + faults.append( + fault_info + ) + + return faults diff --git a/lib/aci/contract/taboo/fault/main.py b/lib/aci/contract/taboo/fault/main.py new file mode 100644 index 00000000..77b47f6b --- /dev/null +++ b/lib/aci/contract/taboo/fault/main.py @@ -0,0 +1,8 @@ +from lib.aci.contract.taboo.fault.api import ContractTabooFaultApi +from lib.aci.contract.taboo.fault.info import ContractTabooFaultInfo + + +class ContractTabooFault(ContractTabooFaultApi, ContractTabooFaultInfo): + def __init__(self): + ContractTabooFaultApi.__init__(self) + ContractTabooFaultInfo.__init__(self) diff --git a/lib/aci/contract/taboo/info.py b/lib/aci/contract/taboo/info.py new file mode 100644 index 00000000..20c51044 --- /dev/null +++ b/lib/aci/contract/taboo/info.py @@ -0,0 +1,261 @@ +from lib import filter_helper + + +class ContractTabooInfo(): + def __init__(self): + self.taboo_contract = None + + def get_taboo_contract_count(self, tenant_name=None): + taboo_filter = None + if tenant_name is not None: + taboo_filter = ['tenant:%s' % (tenant_name)] + + contracts = self.get_taboo_contracts( + taboo_filter=taboo_filter + ) + return len(contracts) + + def get_taboo_contract(self, tenant, name): + taboo_filter = [] + taboo_filter.append( + 'tenant:%s' % (tenant) + ) + taboo_filter.append( + 'name:%s' % (name) + ) + + taboos = self.get_taboo_contracts( + taboo_filter=taboo_filter + ) + + if len(taboos) == 1: + return taboos[0] + + return None + + def get_taboo_contract_filters_info(self, managed_object): + info = [] + for item in managed_object['vzTSubj']: + taboo_subject_name = item['name'] + taboo_subject_tenant = managed_object['dn'].split('/')[1][3:] + taboo_subject_info = self.get_taboo_contract_subject( + taboo_subject_tenant, + taboo_subject_name + ) + if taboo_subject_info is None: + continue + + for taboo_filter_name in taboo_subject_info['vzFilterName']: + filter_info = self.get_contract_filter( + taboo_subject_tenant, + taboo_filter_name + ) + if filter_info is None: + self.log.error( + 'get_taboo_contract_filters_info', + 'Filter not found: %s/%s' % ( + taboo_subject_tenant, + taboo_filter_name + ) + ) + continue + + filter_info['subjectName'] = taboo_subject_name + filter_info['subjectTenant'] = taboo_subject_tenant + filter_info['subjectNameTenant'] = '%s/%s' % ( + taboo_subject_tenant, + taboo_subject_name + ) + info.append( + filter_info + ) + + return info + + def get_taboo_taboo_info(self, managed_object): + keys = [ + 'descr', + 'dn', + 'name', + 'reevaluateAll', + 'scope', + 'status', + 'userdom' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['tenant'] = info['dn'].split('/')[1][3:] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + + info['vzFilter'] = self.get_taboo_contract_filters_info( + managed_object + ) + + info['protectedEpg'] = [] + for item in managed_object['vzRtProtBy']: + contract_epg_info = self.get_standard_contract_epg_info( + item + ) + if contract_epg_info is not None: + info['protectedEpg'].append( + contract_epg_info + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_taboo_contracts_info(self): + if self.taboo_contract is None: + self.taboo_contract = [] + + taboos = self.get_taboo_contract_mo() + if taboos is not None: + for managed_object in taboos: + self.taboo_contract.append( + self.get_taboo_taboo_info( + managed_object + ) + ) + + return self.taboo_contract + + def match_taboo_contract(self, taboo_info, taboo_filter): + if taboo_filter is None or len(taboo_filter) == 0: + return True + + for taboo_rule in taboo_filter: + (key, value) = taboo_rule.split(':') + key_found = False + + if key == 'name': + key_found = True + if not filter_helper.match_tenant_name(value, taboo_info['nameTenant']): + return False + + if key == 'names': + key_found = True + found = False + for name in value.split(','): + if filter_helper.match_tenant_name(name, taboo_info['nameTenant']): + found = True + break + + if not found: + return False + + if key == 'tenant': + key_found = True + if not filter_helper.match_string(value, taboo_info['tenant']): + return False + + if key == 'filter': + key_found = True + found = False + for filter_info in taboo_info['vzFilter']: + if filter_helper.match_tenant_name(value, filter_info['nameTenant']): + found = True + break + + if not found: + return False + + if key == 'fault': + key_found = True + if value == 'any': + if not taboo_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_taboo_contract', + 'Unsupported fault filtering value: %s' % (value) + ) + + if not key_found: + self.log.error( + 'match_taboo_contract', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_taboo_contracts( + self, + taboo_filter=None, + fault_info=False, + hfault_info=False, + event_info=False, + audit_info=False, + hfault_filter=None, + event_filter=None, + audit_filter=None + ): + all_taboos = self.get_taboo_contracts_info() + if all_taboos is None: + return None + + taboos = [] + + for taboo_info in all_taboos: + if not self.match_taboo_contract(taboo_info, taboo_filter): + continue + + if fault_info: + taboo_info['faultInst'] = self.get_taboo_contract_id_fault( + taboo_info['tenant'], + taboo_info['name'], + 'faultInst' + ) + + if hfault_info: + taboo_info['faultRecord'] = self.get_taboo_contract_id_fault( + taboo_info['tenant'], + taboo_info['name'], + 'faultRecord', + fault_filter=hfault_filter + ) + + if event_info: + taboo_info['eventLog'] = self.get_taboo_contract_id_event( + taboo_info['tenant'], + taboo_info['name'], + event_filter=event_filter + ) + + if audit_info: + taboo_info['auditLog'] = self.get_taboo_contract_id_audit( + taboo_info['tenant'], + taboo_info['name'], + audit_filter=audit_filter + ) + + taboos.append(taboo_info) + + taboos = sorted( + taboos, + key=lambda i: i['name'].lower() + ) + + self.log.apic_mo( + 'vzTaboo.info', + taboos + ) + + return taboos diff --git a/lib/aci/contract/taboo/main.py b/lib/aci/contract/taboo/main.py new file mode 100644 index 00000000..935a4cc2 --- /dev/null +++ b/lib/aci/contract/taboo/main.py @@ -0,0 +1,23 @@ +from lib.aci.contract.taboo.api import ContractTabooApi +from lib.aci.contract.taboo.info import ContractTabooInfo +from lib.aci.contract.taboo.subject.main import ContractTabooSubject +from lib.aci.contract.taboo.audit.main import ContractTabooAudit +from lib.aci.contract.taboo.event.main import ContractTabooEvent +from lib.aci.contract.taboo.fault.main import ContractTabooFault + + +class ContractTaboo( + ContractTabooApi, + ContractTabooInfo, + ContractTabooSubject, + ContractTabooAudit, + ContractTabooEvent, + ContractTabooFault + ): + def __init__(self): + ContractTabooApi.__init__(self) + ContractTabooInfo.__init__(self) + ContractTabooSubject.__init__(self) + ContractTabooAudit.__init__(self) + ContractTabooEvent.__init__(self) + ContractTabooFault.__init__(self) diff --git a/lib/aci/contract/taboo/output.py b/lib/aci/contract/taboo/output.py new file mode 100644 index 00000000..98d76d22 --- /dev/null +++ b/lib/aci/contract/taboo/output.py @@ -0,0 +1,307 @@ +import copy + + +class ContractTabooOutput(): + def __init__(self): + pass + + def print_taboo_contracts(self, info, show_taboo_filters=False, title=False): + if title: + self.my_output.default( + 'Taboo Contract [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'faults', + 'nameTenant', + 'vzFilter.subjectNameTenant', + 'vzFilter.nameTenant' + ] + + headers = [ + 'Faults', + 'Taboo', + 'Subject', + 'Filter' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['vzFilter'] + ), + order=order, + headers=headers, + underline=True, + row_separator=True, + allow_order_subkeys=True, + table=True + ) + + if show_taboo_filters: + filters_in_the_list = [] + filters = [] + for taboo in info: + for item in taboo['vzFilter']: + if item['nameTenant'] not in filters_in_the_list: + filters_in_the_list.append( + item['nameTenant'] + ) + new_entry = copy.deepcopy(item) + filters.append(new_entry) + + self.print_contract_filters( + filters, + title=title + ) + + def print_taboo_contracts_usage(self, info, title=False): + if title: + self.my_output.default( + 'Taboo Contract - Usage [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + order = [ + 'faults', + 'nameTenant', + 'protectedEpg.nameLong' + ] + + headers = [ + 'Faults', + 'Taboo', + 'Protected EPG' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['protectedEpg'] + ), + order=order, + headers=headers, + underline=True, + row_separator=True, + allow_order_subkeys=True, + table=True + ) + + def print_taboo_contracts_event_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Taboo Contract - Event Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Taboo Contract - Event Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Taboo Contract', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) + + def print_taboo_contracts_fault_inst(self, info, title=False): + if title: + self.my_output.default( + 'Taboo Contract - Faults [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Taboo Contract', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_taboo_contracts_fault_record(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Taboo Contract - Fault Records [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Taboo Contract - Fault Records last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Taboo Contract', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_taboo_contracts_audit_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Taboo Contract - Audit Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Taboo Contract - Audit Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Taboo Contract', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/contract/taboo/subject/__init__.py b/lib/aci/contract/taboo/subject/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/contract/taboo/subject/api.py b/lib/aci/contract/taboo/subject/api.py new file mode 100644 index 00000000..88c2ed1d --- /dev/null +++ b/lib/aci/contract/taboo/subject/api.py @@ -0,0 +1,60 @@ +class ContractTabooSubjectApi(): + def __init__(self): + self.taboo_contract_subject_mo = None + + def get_taboo_contract_subject_mo(self): + if self.taboo_contract_subject_mo is not None: + return self.taboo_contract_subject_mo + + cache = self.get_object_cache( + 'vzTSubj' + ) + if cache is not None: + self.taboo_contract_subject_mo = cache + self.log.apic_mo( + 'vzTSubj', + self.taboo_contract_subject_mo + ) + return self.taboo_contract_subject_mo + + query = 'rsp-subtree=children&rsp-subtree-include=fault-count&rsp-subtree-class=vzRsDenyRule' + managed_objects = self.get_class( + 'vzTSubj', + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_taboo_contract_subject_mo', + 'API failed' + ) + return None + + self.taboo_contract_subject_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['vzTSubj']['attributes'] + attributes['vzRsDenyRule'] = self.get_mo_children_attributes( + 'vzTSubj', + managed_object, + 'vzRsDenyRule' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'vzTSubj', + managed_object, + 'faultCounts' + ) + self.taboo_contract_subject_mo.append( + attributes + ) + + self.log.apic_mo( + 'vzTSubj', + self.taboo_contract_subject_mo + ) + + self.set_object_cache( + 'vzTSubj', + self.taboo_contract_subject_mo + ) + + return self.taboo_contract_subject_mo diff --git a/lib/aci/contract/taboo/subject/info.py b/lib/aci/contract/taboo/subject/info.py new file mode 100644 index 00000000..1f033776 --- /dev/null +++ b/lib/aci/contract/taboo/subject/info.py @@ -0,0 +1,85 @@ +class ContractTabooSubjectInfo(): + def __init__(self): + self.taboo_contract_subject = None + + def get_taboo_contract_subject_info(self, managed_object): + keys = [ + 'descr', + 'dn', + 'name' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['tenant'] = info['dn'].split('/')[1][3:] + info['taboo'] = info['dn'].split('/')[2][6:] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + + info['vzFilterName'] = [] + for rule_mo in managed_object['vzRsDenyRule']: + if rule_mo['tCl'] != 'vzFilter': + self.log.error( + 'get_taboo_contract_subject_info', + 'Unsupported tCl: %s' % (rule_mo['tCl']) + ) + continue + + info['vzFilterName'].append( + rule_mo['tnVzFilterName'] + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_taboo_contract_subjects_info(self): + if self.taboo_contract_subject is None: + self.taboo_contract_subject = [] + + taboo_contract_subject = self.get_taboo_contract_subject_mo() + if taboo_contract_subject is not None: + for managed_object in taboo_contract_subject: + self.taboo_contract_subject.append( + self.get_taboo_contract_subject_info( + managed_object + ) + ) + + self.log.apic_mo( + 'vzTSubj', + self.subjects_mo + ) + + return self.taboo_contract_subject + + def get_taboo_contract_subjects(self, tenant, contract_name): + all_taboo_contract_subjects = self.get_taboo_contract_subjects_info() + taboo_contract_subjects = [] + for taboo_contract_subject in all_taboo_contract_subjects: + if taboo_contract_subject['tenant'] == tenant and taboo_contract_subject['taboo'] == contract_name: + taboo_contract_subject.append( + taboo_contract_subject + ) + return taboo_contract_subjects + + def get_taboo_contract_subject(self, tenant_name, subject_name): + all_taboo_contract_subjects = self.get_taboo_contract_subjects_info() + for taboo_contract_subject in all_taboo_contract_subjects: + if taboo_contract_subject['tenant'] == tenant_name and taboo_contract_subject['name'] == subject_name: + return taboo_contract_subject + return None diff --git a/lib/aci/contract/taboo/subject/main.py b/lib/aci/contract/taboo/subject/main.py new file mode 100644 index 00000000..1b63f793 --- /dev/null +++ b/lib/aci/contract/taboo/subject/main.py @@ -0,0 +1,8 @@ +from lib.aci.contract.taboo.subject.api import ContractTabooSubjectApi +from lib.aci.contract.taboo.subject.info import ContractTabooSubjectInfo + + +class ContractTabooSubject(ContractTabooSubjectApi, ContractTabooSubjectInfo): + def __init__(self): + ContractTabooSubjectApi.__init__(self) + ContractTabooSubjectInfo.__init__(self) diff --git a/lib/aci/domain/__init__.py b/lib/aci/domain/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/__pycache__/__init__.cpython-310.pyc b/lib/aci/domain/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e9b50d2696c983bc5adb0c0f80b6b173816031d GIT binary patch literal 147 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HSvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oN`7u)W?oEud}dx|NqoFsLFFwDo80`A Q(wtN~ka@*SK!Sw<04Gu+jsO4v literal 0 HcmV?d00001 diff --git a/lib/aci/domain/__pycache__/main.cpython-310.pyc b/lib/aci/domain/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..163fc5b9e5a5d0d3ecceccdab6c64f1e4ab388b0 GIT binary patch literal 1103 zcmZ`&PiqrF6rY*>H=Cx`i?xd2IhPy~lp;YY6}+^eAQTxEhIMCJ7iW?J2bO6g9+B zK`CNpm<>eG;=qJ95>bmo6Wc^2EshMgsYoe#MO3VkYoZcOb)X}i==5_UdWyd$gY+jv zCj;7~FXuKdXD{*`6z-Ly(FPvhIGwz^yircAEilF=F;EWRR*!&bBB&yQDXQ2t5rGO+ z2r^U=^pI|lV795XW9GQlvz<$#XM7bsZCZ^+AX!qO!+p;i!xK~ zyfPfxaB=ByT|00qjL@V0+@V)HzP(|Wzrb=j!dljS?t@a2PcWwyQ*1(105Sv_fs8>W zAo+x>z`i8z;fk&31L$%^agS5Mj>aN2WBsv)lqZ72ma4MIjo=GF?KgHb0+&(e5}Y0% zi)3jn8r#+fflHwbv8CGXWPQ2NO=9!KqMV(#9-eK1Q?qxjYq{Yl&)nR~x-h$7t?mK~ zDen&BG-OwgArlVlf4`g#B3#uhw_3`kC#9XM3xl{X<%f&hcuPBNw+$IKYQn)gEX*aq za32*emlK}!llI$muqE!p{)Vu>p)Y)x=lKvzYM+VN{mW`b-iS-OZ5(?eKBil7Vdmb7 nuk4l;X6~(6VO!h38fo~%_x~LK5Y-;AKIv0`dI6)|;lKX?vyAyt literal 0 HcmV?d00001 diff --git a/lib/aci/domain/__pycache__/output.cpython-310.pyc b/lib/aci/domain/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..851b63ecea49b2d20c7d2468eccb090c05efe784 GIT binary patch literal 844 zcmZWmO^XyU5UupbboXrUdQnjD56qqz_0pc6&HzR%xuOpk5iM|f)@;4gPN)A22`e*j&-UtUHr)ST;=a!QT)Z~uwcWz zSFM%J`clfb+kUg{F?AMFZ_bZ07l+L4vv=3~yQvS>hSZ8WOczcYCcBS717`|&q?n3s zfX6CERmo6>-nSLlFO&lR5TDTW??vhVN4k7q*CiBE3NsAoL(*yU`8PQFuYXUjp4DHZY3fzet=d}Yoi=sTX}8m^HqED6u9{kT zFYDGjS#9=?KC{5nQH?nZ`;2{iFdefRbu7^U6t$LC3o*=vu&vq}!le*jx6%a0SM{nU z;RGAF3g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HevsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oL4JNtOj%B1UQB#^W?p7Ve7s&kn{KyIDxscW;}0ZG9DKzD_sKX$G4yAYe2|vROXit$}W&y z1NM$6qUaUSXRl9`cSIsT0sF%8K-&efPk?FCr;7AFMU{6&`o8iNgPo}Wu-x?yijhq7 zJt_CbX+i;TyHLhR`#=^;RHP;XIN<1EMBR#Nph8M1Mg#Jac9FULe6IO%o22p&2OajOi0FtTB%&!C0*>0jvc^%9s zC1=u<>qns7p}{PIXd> zL?$QN`B^b^9k{9lZrm;5c^h&a#Ze)e%EVk;F2`e?E4OOz#EQ7V$#y{#*@P%R9LZb` zwfdjbx(AB}vkYF%c(n|k3vrJy^};Bk*}ezXrJOR)qwFU1ImjSU_Lno}F_7`&*CA(= zdp+8Nv(^?~^8ik6IBWeGXbmp7e7Z1*_YxmQ0S<63M_LHi70?k?WhnQAIICpVo){cd svyKd(${fSW4L&?1i*6waY0qzL@aCF*&cA^-T?n_^TyGmBUf&w|2c$I=ng9R* literal 0 HcmV?d00001 diff --git a/lib/aci/domain/aaa/__pycache__/info.cpython-310.pyc b/lib/aci/domain/aaa/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a47941af2b7b8095cfae9d7f49a280e53015d4fd GIT binary patch literal 2203 zcmaJ?&u`l{6ecN3b{yMHn;=85u1GNioqNbI4A>zJiWMz7?BZcfcQHH&iYU8kWyvAs z3^8P2KzrC_|3k7{|0P~`+P~04yYErXudWyYQjhOFK0fk&{8V&0Er#~==T363&Dh^G zx!OETzDGBAFes*Y#wL8gIs1Vrp}aRtd9TGlD0#qo{y*?xJ#IUrG%FJwzDTlZqGQrt zZ5J_jp-tF;D~1SMi8pNEDNjj!rSesPudiCFsaD?bL7*DgW7T$^6q6{;A4SoR`KXBb zmB=Jhe~fM<2E`88Ti$<5NlBArBke=$hIijR-W$G(vUC`yCN735IZm=+Y7%{%=wX%~ z4x>07D!11#ilSkP-FBxZwi$+Lo|a)qp^U&F`F!(QQoH9aF`3UB`BPFZyBxw8*ZCJ; zh?Fh7lvSP*`>YaA*sp5~sW7i3=Cb0)Oy90}CAXHkqjtqkS;dvN#m@Lp(8?{Q$Qzf3 zk)85$D>Odoadknz=UZPTCe~J{+{!$fB!dl|m{O;4nW$%nQCy$H2BwV4nW4k}G%KgG z(yor8SynzSW_f9B;3melQu8Q3c}kX^us6m@8P*nD(WtQP)PzxfQtNuY4sdAOokV#w zPE=SNzD(lM%2&yWvC=K@AYYb9H^_gTqSkc?Q3n^f34=pqlgnn4Hw8LxbMd?x#F*cZYyz6S82ZRD(@6kpc*XX z!dG$;Q~)l#?klkfN^$B{J}Tj(PQu*hs1epm6~N=cHIKk~Jh<>^z#}9NV5A9*G%8=M zK=-VURyB^fezx?+6Cv*l3)A66oK;vB6bI|ukf-qKY%w#vSldOUMa5pqQ(xUsYn8u= zTsf-(^T&nuW+iLwQI}5NyVck9%$~pFdr$Q$Buyj&(43eune;p>C*w(Jy(r6U5Eqk4 z0koBRmRNrjWyXB~893x8dJRi^TyIl^wMkUQFRoO3zVl0NX47e*fzNG+t?imz(tNyq z9A&d)Z+pkg*RQ$(M5OEm*2|LI`evG?rKYE7+w}&7_>dqNj(TuZ=LocRbV)yl*-$Kkf#gyU zSOk|J+EVbgKm#a(_kk}+3vkT8_}@#=^!vd9!Ro~QVQ5<+vQ|Je6H?f literal 0 HcmV?d00001 diff --git a/lib/aci/domain/aaa/__pycache__/main.cpython-310.pyc b/lib/aci/domain/aaa/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9db8f1144f9a13b9afcd0a856b009d025392d387 GIT binary patch literal 582 zcmZuuJx{|h5Ix6f302B~P~k6R$;f~ZYSl`Jr3;&7$uhAkS>&VGZ6y#J{UI>&m$EYP z7hvJ+s#OL~y34)TdGFn&84d@4F$1N3@%iOJH+l%hm@dbnK#>wE!U*wwR7MqLl)x=0 zs^TrESQAa(Viv33J!JiF{01`8rn9D!rk+SSSsKK{1HP*lP2q2KBSJ97bZ1yJFrt7( zil}G{j4F!EaeI8AC$ z7|Vd1keAbg<$SL=$4OAWmX#Kw9SBi1YF+w172;_v%iT#J3wAmsL0;?0y;4v~ASL0= zJnOL$ddtyUzVnu&w_Gkw7@3{_b7=5agbf6Wj*wr2^=fT$z4LeD*X;asDN2s$AA^5= A;Q#;t literal 0 HcmV?d00001 diff --git a/lib/aci/domain/aaa/__pycache__/output.cpython-310.pyc b/lib/aci/domain/aaa/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a37a59a9293b307393e2e9ef2cd9c48c41f6d51 GIT binary patch literal 874 zcmZuvy^a$x5VpNP*@T1>cS53|2og=2)CeJT(V;`4SPH13l`LoNz+Rl)VDBDE6slay zJ3xgfc?#aaEftRd1!BfaMEJ2apU3n2?X0W8phsYR{_sie7$INqa<~GxoPyY6fX74< zNv}Y5Y)T}1Mn*vn_CFR>X)|tvqR5m=GG&rVc15Ov3}gsrC?m*?-O;0JDT;C;#M7o; zHFZu8N}-N&24X`1Ng#=)9|2rwm7W{y<>C9iv-{aX=pxGtn^&1smr7@aRpwHeOc%3E zTMOoCGV=;>m(#@^Eh>iC_IR@+(lIntZhEG7L$(HV@qzh)Q zZ^;FH$0U1Csb`L#{(`+>GLkWz0s1e3E#0zhAUm)VknY<~8$If!U$M>RB&~)(c-V3u z&a0-BE}n}<*VculSSlBv``hMdGMNlp;=>di&(C4RQDvkuuJcj}IITMoT34^Rw{qLe z7HVx>7m6yQi&D9P0k2gnVMJXS7u8~>)hKjqzBExCCs!f=mF6U9Y9e zfwjTMWv(IM+*-h?xf?4}lr?WdEyhM*ws!&gv`<6I0!G6hEJlnYMh|!I+vZODos<2` z8UIr+9Yy$WaYCHC9_PzSHX8Ll=dT)}TaUrM<|e{#ie5vWX8#Cn47Y?Nv>$j|I->sk RUy@56w7ni;wtrH`@|)k**W literal 0 HcmV?d00001 diff --git a/lib/aci/domain/aaa/api.py b/lib/aci/domain/aaa/api.py new file mode 100644 index 00000000..cc5aa3a8 --- /dev/null +++ b/lib/aci/domain/aaa/api.py @@ -0,0 +1,52 @@ +class DomainAaaApi(): + def __init__(self): + self.domain_aaa_mo = None + + def get_domain_aaa_mo(self): + if self.domain_aaa_mo is not None: + return self.domain_aaa_mo + + cache = self.get_object_cache( + 'aaaDomain' + ) + if cache is not None: + self.domain_aaa_mo = cache + self.log.apic_mo( + 'aaaDomain', + self.domain_aaa_mo + ) + return self.domain_aaa_mo + + query = 'rsp-subtree=children&rsp-subtree-include=fault-count' + managed_objects = self.get_class( + 'aaaDomain', + query=query, + node_class=True + ) + + if managed_objects is None: + return None + + self.domain_aaa_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['aaaDomain']['attributes'] + attributes['faultCounts'] = self.get_mo_child_attributes( + 'aaaDomain', + managed_object, + 'faultCounts' + ) + self.domain_aaa_mo.append( + attributes + ) + + self.log.apic_mo( + 'aaaDomain', + self.domain_aaa_mo + ) + + self.set_object_cache( + 'aaaDomain', + self.domain_aaa_mo + ) + + return self.domain_aaa_mo diff --git a/lib/aci/domain/aaa/info.py b/lib/aci/domain/aaa/info.py new file mode 100644 index 00000000..b6c20432 --- /dev/null +++ b/lib/aci/domain/aaa/info.py @@ -0,0 +1,111 @@ +from lib import filter_helper + + +class DomainAaaInfo(): + def __init__(self): + pass + + def get_domain_aaa_info(self, managed_object): + keys = [ + 'descr', + 'dn', + 'name', + 'restrictedRbacDomain', + 'status' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def match_domain_aaa(self, domain_info, domain_filter): + if domain_filter is None or len(domain_filter) == 0: + return True + + for aepg_rule in domain_filter: + (key, value) = aepg_rule.split(':') + key_found = False + + if key == 'name': + key_found = True + if not filter_helper.match_string(value, domain_info['name']): + return False + + if key == 'dn': + key_found = True + if not filter_helper.match_string(value, domain_info['dn']): + return False + + if key == 'system': + key_found = True + keys = ['mgmt', 'all', 'common'] + if value == 'true': + if domain_info['name'] not in keys: + return False + + if value == 'false': + if domain_info['name'] in keys: + return False + + if key == 'fault': + key_found = True + if value == 'any': + if not domain_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_domain_aaa', + 'Unsupported fault filtering value: %s' % (value) + ) + + if not key_found: + self.log.error( + 'match_domain_aaa', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_domains_aaa(self, domain_filter=None): + all_domains = self.get_domain_aaa_mo() + if all_domains is None: + return None + + domain_aaa = [] + + for managed_object in all_domains: + domain_info = self.get_domain_aaa_info( + managed_object + ) + + if not self.match_domain_aaa(domain_info, domain_filter): + continue + + domain_aaa.append(domain_info) + + domain_aaa = sorted( + domain_aaa, + key=lambda i: i['name'].lower() + ) + + self.log.apic_mo( + 'aaaDomain.info', + domain_aaa + ) + + return domain_aaa diff --git a/lib/aci/domain/aaa/main.py b/lib/aci/domain/aaa/main.py new file mode 100644 index 00000000..33823945 --- /dev/null +++ b/lib/aci/domain/aaa/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.aaa.api import DomainAaaApi +from lib.aci.domain.aaa.info import DomainAaaInfo + + +class DomainAaa(DomainAaaApi, DomainAaaInfo): + def __init__(self): + DomainAaaApi.__init__(self) + DomainAaaInfo.__init__(self) diff --git a/lib/aci/domain/aaa/output.py b/lib/aci/domain/aaa/output.py new file mode 100644 index 00000000..6f5282e4 --- /dev/null +++ b/lib/aci/domain/aaa/output.py @@ -0,0 +1,28 @@ +class DomainAaaOutput(): + def __init__(self): + pass + + def print_domains_aaa(self, domain_aaa): + if len(domain_aaa) == 0: + self.my_output.default('No aaa domain found') + return + + order = [ + 'faults', + 'name' + ] + + headers = [ + 'Faults', + 'AAA Domain Name' + ] + + self.my_output.my_table( + domain_aaa, + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=False, + table=True + ) diff --git a/lib/aci/domain/l2/__init__.py b/lib/aci/domain/l2/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/l2/__pycache__/__init__.cpython-310.pyc b/lib/aci/domain/l2/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0213b4bd1bbf458de84f8f3b18a053eda97858a2 GIT binary patch literal 150 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HevsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oL4JNtOj%B1UQB#^W?p7Ve7s&kinF_mQONh-aMWb8{{GWcgQ z0N>E|pI1|nmoG+pvpl0<|9zm0f%ahUAU-FjK(wJcLg@(f3o7X)UC=r70`U8Dip9XLci~HrPsyc6 zo!=33b>RWR0Qaz4pZtYC_rZ_oN6sUVfeg_en{fhO5XqM->*P84^~r+G!E>F+Xq_wq z$Q(i(CVQ9uJdnK|KkZ-T9H-!-Gw>(snS3}PRXN}SyY+P1SaTm<4 zo~WA3&cQm5_g?<;<3!|zk~YkzQq;o6qONs*+||8SzdWn~SO}iIevEctnVF;1FhOCW`UM^2? zzR`Yo_sneH{Kf~v0Iz;2riybLbLggQ3X~Jh&l*v*I~wn}tE*EhzBbwwj1Lx0gJuzl aXyR+s;jME2|K(((oi^7~=ZPm^jr;>1S#7ld literal 0 HcmV?d00001 diff --git a/lib/aci/domain/l2/__pycache__/info.cpython-310.pyc b/lib/aci/domain/l2/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..477a28096e31263b8421dfc02acb0e13ccc3d8ae GIT binary patch literal 5290 zcmaJ_&2JmW72nw}E?3JBeOR^}e=r|T%b->e1x*XXapTxg;lN>CJ57o$gT=Fo&6v@Rv5Fm%%q*D-}=brmF^tgvydh)q9r-}P}GfP@joKV==x9`1q^XAQ) zH^0%KQgJo>l0R0W;ku^%hdz$}41BzSCpm|PYn;W}4)Yn)ey?$z8=q?2_(b=0Zr;(F z)y*Q0Ta4(97k?0Wj=x=88&)`Oy&$tE)jO(9jzQGM{;%#z^+jv{N#2vit za=Gjt`va?7<~6>+y-%56;&oo(RZtEu!<)t2yFSYOyO%^_FB0vz zcefpOdTrIa9dERI7-W+iuxLmc+hyYuM;%1)~{GGX^+Y1x}u{`(Qj1r5uW z=PW;f|F#+_v$+kQDx^B32KS_Iw)CQ%X&>qb2J)e--3o$ug$z#!hHYzvtBJ1UTFuW^7fED)swGho~+Dy@-?jwKY{tJl1E=K zQHD>e%BLe=6#bLi`Vo$b{VBwLO|HUeP|wiHk~JCqGl&P{XV)~$$-|rsex_KrVwJvN zyNj82fVJo6Xx-X6bPSAiUPh8y?ZBQ&A!`sH`{CJEuJe9w_QRcs()bUfbT~?LHw>d; zK+GgxK$eT}c8YYql^f}`*sn>>)iiyppZ3yy;$H7RVlO|W+oqo1U=#t!N9lZ$_O zNCo5(`#{h;FNa|WYbZ6jHzRLH-F%@Nj^gy%VAM~O+?F3n?)H+a{rydnG)uW14u?^n z=TP zXd_K5(NTbng+n1@*is7+^o@48(b`Wvs=sq)-Zny-u(*Xc}@EeV5C`O285qNR?*sWR>#eCk7KFi(E+# zmE<`zh__rX#29O3GZSl}Keiv+HlmI7w5@UDC!#nr)}hc%e{@vN!nld#&vXh`;-;WJ zVVt3cdR#|1=|uW+Vq^xYw?WlrVooe>qUPgdht^A6pV%qtbw(8l=g^^^yu>uZ5zw%q zu}K=}QG&cA>zX@piXP6PF5ZB=wEJ3CO5jM*&q2TU=PZ|{<@aYAWoX=&mR)%&+%HDJ znFf#DNf{%USvj*X!mb=)3nSd0^S~px|yi=xpbf zECIQJoi7NSHJNyYbZR?c+PU|nj*c%JEq}68L*cVtf2*+<#-oS|>3I358VUq4QJ{=C z>Wc;p3o6~Yr>rNbK<~VwzIy#M+CtHy3>K7lO;;761(m(3OjU{xH8`qfG~5crD2~K0 z$+9I~$;%iz=%QqzCd!wO@>-lU;$<3Oeg}vR@cxP?xr=56dF|*`*_x~_^B={(ODTV&l_{`jnITq~JW~Tx-roR&)sD{e2^A7|N&n>5$^=2HL9; zKI7H{qM%Q$#1oph3O(Zhdx@8nc9Dlu4YH(YpbO;w;-rpmpam4Pa#kmlhjw92>+0x9 zIPV?!X%~KW;ioA+1Ba}`heI}5lwK1KBtI(f1{`?&8Qwr@;6Vl&`=yXuz&KT+rO)ii z7yS8XvV;P>MEI6h@var`I&3USBnQNX9u>^f0cROjm-vcoPr%+PKl#9%EN9E)gVbB* zr@*gC4OoMOzJaI;o}^~{y40i5micKJp|g{fY-P3%-xW0BFnGD9Vc&nJD4;B*2bqlA zw`o~PK4J8}tflV3g5m%}E^(l@-LEnmUOt0}dWZe)kD=d z=I0=FApI?*71b|W;Ee~=^I6EskZnRnQHIUT~HXHEL&z`rVgfnUIV?!^Z> za?wZW&mT_VNm{J}In`5sDFgGyPWKS&#L zYg38wJ;GRT^*iD4&3JokT}Up1=@8hV9=@Fp=neci;89+tQX{%yCmQP)FZ%WX_scuL zeDr>2s?ZGxP67zNa_ioHa-*Bu!vPO^JTH+ABFIcvqN;bB%&$@*O42Y*)I2Oniv`Tp zFVAGY714x!i`pbF%SuYPuz-2Dqs~BZTo*kl2~?S*Z(I@kKy30(oICRC=3t8?;fUi- zIF-mRNam0WAxx^gckm>19%Q%z60|?0%c|Z|tHE+B9^8)vjI!Rb3Yj~X<8bFL53j7l zn7n&>+W6vJ8Jl0M^~*S6!Z^7CLiNPqLPfe+6TiYs)?B|rooGP=ipZ1VFCmRzpR0_+ zd;9(|cu#BLFOrSfng&qI?L>lob=;gFxd{76F$sU=8IdSxTpT9^dbq;APvOgGKZP%2 z-8>ynv zgWRM+7Q#3#4(TK>sktQLHImaQ=hutr&3qA8sT(<@Hh^@faB!BS$Ch6F4t@TKC;1l| zr)KId;55Kr0pbaK(;?@6@5w{X#c}7EbqU&SdHC6ny%On@rU{s?z`qATS;e7BUkp)!|xhs&uCawlLz&l{OL9PC=ZK{zSKu|^Da`3%vE83lL-5)%Qt{$+B zV|e_`&*W@}@b&aZ5P@z%^4z@y0uY_8YFlh#q88HsN9gveKQQF&pAhWHlw}qWtg&r~ zH3I*@cc_=xVpeNhqKbA2aL728D&iDuOX$|rWvs=kU;ymX;Nl83v$RrOed5g{m|Sk8 zSvJ2)n{)|k2pj@RfA;q)2$RFcr+*><^nWU^wORaHtyWXt+-#QVx=yYKLGA{)L2!UA z&|VPij>1?;1mP2P0hw)WH5Ixh9dT7UEpLW&BcNy}FQRcYq=4bHos;_O%G=|u``_wB gP@h)Q0G#aIm0MeKo@O59N_l#PN?$?)dD@ckf7qlA4*&oF literal 0 HcmV?d00001 diff --git a/lib/aci/domain/l2/__pycache__/main.cpython-310.pyc b/lib/aci/domain/l2/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e50c454c55a609b8e78a6ed16d1272bab48562b GIT binary patch literal 927 zcmZuvy^ho{5VrHPaefx*B%tA5V4D;x(IABGbo>YjZ9`{8vO?^YEbL@Sc2@$?aSs9| zk3h#O(5AhLSGbB9hlHR#TmJNoJ@(9eo@TjB2#jApe##q4{Av zRfS>Z0|Xd~y$?hYP9@=735f%s$02CH<%51-rHU;zc@zs;!eQ9)2 z>8@%DsgBANx>M~@wT02|in7v$blMhXU7*JK?qiF8eFm$`01`URd-T)USad$-vOy_? zs7tGa=o2AqBM%07Cd7wBX@(Q`rb}uD_65*|3Z7*YfnA9y=cZWeQ!a6q)3)YeJL^c;bHOi?c#ld zQMGC*@LT%JU+I^1MfnHb4F5E^`54alEWjrURVaA|=Tmh@q3V`mYaWb`{PGzg3^Qei zP-RD@gsRV!9gSX~IxRdSJ33GXEdo^lszgno44^Dp2C4{Dg;s$o(TjARE&yf1*co~j zC=13G=@L+7pw7|rKvn1*>}FZa-H8rdKipjXtdq1miARR^hBTh*aK<_SRbUQj90LeF zW5XgY}!ueK+u%o*#Qrld?k=H2s+IL&lqdzuR;@ze(j{&0w_|$>r+pBT;f3 zKlBsFL0K_^PSOjb+p70@Hat{U|7QSU!YMcScObedpYJLUm4}3qMD3EN?K>{cX9*L5?Isk*Xa7lqMsJ3$f)J#-J4uw0k59VB4{XQhkz z+`1bCk@smt*~$4~@%3F8-oFRZc@=hmGB+}rMz)gB*VgXdKQVu^xz?!NkD@^6Qp%#- zVB87Z#E-(-Z4{GQTg>adw5{<45Xj32DEinCg^0uJi{b<3!Zj9)xT(jE9ChN(?mjz; zc@cO;mBV<<+AepKh>Jqv?gq>@gn4k}WKJlGl*zXjTEIeKxa~FzsVD)1WEK_n`?ecW zC-CDWJ~lYIpwOir3yGfu3~my3z~8_PzKM{B1;?-v3vKR)i9@CL$4;3+<-?843K#SD0_0bUI;LyPF;(z`Y3-8y(TL>Vc>oLz z%66=KIiHjUo)5!(890s${4#Ra5UwCxMYsk4kI?%3ZG?9arW*a+X)`#uz)xY$%T<6W zmNyM^s-3URu(MoXs+MVv%1&vFHr^2LPh5mADYS7l7U=;FjZl^8X?7$O?cF znz_bxq)w&U@u25v`0Z(#S0DIAYH}8Y_2j6{dL*V^TOU|AE%zjEBTxUP zfo+A3b7#c%xB+p}-_U^nC2basVrDjdygbfKo47#3!%E%%VG_WagN^0O7XV$2U+t>U z3PLrJC2nGa8TOk`y{l%;W=oyWfEJ(ueP5PHLXCd&*)O2I6p*!vL!nPiYRN)6+$O5D z{Jhj_6e0LWGW*>_7ACdLXm7-->9t`W7~%=sIH_Il@eZo)aZy-V-y$t&#?aSuKRMbK zx(9JC3ZC1EnJ9XkLF7_lK>hakwy?YhZn(#`Sh9UwloeQLTkKHi>vGmQ&N`{AXR~VC zK6pp@4o>yk*afE6x}0AF0elS%z;6S9q(QlT3kJjzX9v+CbJ#&UIdZ%x=p2MGzl0O8 z`{Un1z&g@v+hpMu`r`*IoKe2t9IG+#=Fr3ipwJT#`0^tFXx8!uuJp<Z6EMdHh@&`;$3b)oFzTp3@L%AgQOi&4AjYjLzX0Il zC{EskZ{8SNh|ywk+M*LO%}jd^78y%7{hmDj6RiCIkZxot8BR7MUHj!RyF(@M;QMPd z+q^TKZA!x7pP>nVg&^bpbEIS^_)DZtmHSI$QJSfk%f0*#Et!@5ZyKi)toprKQ98Wj zm|gp2gx`ei+ozNCT8H|xlJpSIG@bnfRfEMU(;4PUeh*=);>H8O#jVKn_9du|H(>hg z1T~mslMP#KY}i%&LkD{T#}Ss}97MDeAYE~sM;$lFo^Wi8xQ+0Agc}GSAp98NQ-m#q zZG>MV3=A(RtkxX%DgU5~@w=|1l!&ESA6hGL+_Y@#M^=6AhU973L|!Ke5v5z%9zQ~9 K^8cr^%6|a!Sf335 literal 0 HcmV?d00001 diff --git a/lib/aci/domain/l2/api.py b/lib/aci/domain/l2/api.py new file mode 100644 index 00000000..d2398fc7 --- /dev/null +++ b/lib/aci/domain/l2/api.py @@ -0,0 +1,78 @@ +class DomainL2Api(): + def __init__(self): + self.domain_l2_mo = None + + def get_domain_l2_mo(self): + if self.domain_l2_mo is not None: + return self.domain_l2_mo + + cache = self.get_object_cache( + 'l2extDomP' + ) + if cache is not None: + self.domain_l2_mo = cache + self.log.apic_mo( + 'l2extDomP', + self.domain_l2_mo + ) + return self.domain_l2_mo + + query = 'rsp-subtree=children&rsp-subtree-include=fault-count&rsp-subtree-class=infraRsVlanNs,infraRtDomP,l2extRtL2DomAtt,aaaDomainRef' + managed_objects = self.get_class( + 'l2extDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l2_mo', + 'API failed' + ) + return None + + self.domain_l2_mo = [] + + for managed_object in managed_objects['imdata']: + attributes = managed_object['l2extDomP']['attributes'] + attributes['infraRsVlanNs'] = self.get_mo_child_attributes( + 'l2extDomP', + managed_object, + 'infraRsVlanNs' + ) + attributes['infraRtDomP'] = self.get_mo_children_attributes( + 'l2extDomP', + managed_object, + 'infraRtDomP' + ) + attributes['l2extRtL2DomAtt'] = self.get_mo_children_attributes( + 'l2extDomP', + managed_object, + 'l2extRtL2DomAtt' + ) + attributes['aaaDomainRef'] = self.get_mo_children_attributes( + 'l2extDomP', + managed_object, + 'aaaDomainRef' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'l2extDomP', + managed_object, + 'faultCounts' + ) + + self.domain_l2_mo.append( + attributes + ) + + self.log.apic_mo( + 'l2extDomP', + self.domain_l2_mo + ) + + self.set_object_cache( + 'l2extDomP', + self.domain_l2_mo + ) + + return self.domain_l2_mo diff --git a/lib/aci/domain/l2/audit/__init__.py b/lib/aci/domain/l2/audit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/l2/audit/api.py b/lib/aci/domain/l2/audit/api.py new file mode 100644 index 00000000..fc2d30e6 --- /dev/null +++ b/lib/aci/domain/l2/audit/api.py @@ -0,0 +1,48 @@ +class DomainL2AuditApi(): + def __init__(self): + self.domain_l2_audit_mo = None + + def get_domain_l2_audit_mo(self): + cache = self.get_object_cache( + 'l2extDomP.audit' + ) + if cache is not None: + self.domain_l2_audit_mo = cache + self.log.apic_mo( + 'l2extDomP.audit', + self.domain_l2_audit_mo + ) + return self.domain_l2_audit_mo + + query = 'rsp-subtree-include=audit-logs,no-scoped,subtree&order-by=aaaModLR.created|desc&page=0&page-size=%s' % (self.api_audit_limit) + managed_objects = self.get_class( + 'l2extDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l2_audit_mo', + 'API failed' + ) + return None + + self.domain_l2_audit_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['aaaModLR']['attributes'] + self.domain_l2_audit_mo.append( + attributes + ) + + self.log.apic_mo( + 'l2extDomP.audit', + self.domain_l2_audit_mo + ) + + self.set_object_cache( + 'l2extDomP.audit', + self.domain_l2_audit_mo + ) + + return self.domain_l2_audit_mo diff --git a/lib/aci/domain/l2/audit/info.py b/lib/aci/domain/l2/audit/info.py new file mode 100644 index 00000000..c94da139 --- /dev/null +++ b/lib/aci/domain/l2/audit/info.py @@ -0,0 +1,97 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class DomainL2AuditInfo(): + def __init__(self): + self.domain_l2_audit = None + + def get_domain_l2_audit_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['domainName'] = None + if 'uni/l2dom-' in info['affected']: + info['domainName'] = info['affected'].split('uni/l2dom-')[1].split('/')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_domain_l2_audit(self): + if self.domain_l2_audit is not None: + return self.domain_l2_audit + + managed_objects = self.get_domain_l2_audit_mo() + if managed_objects is None: + return None + + self.domain_l2_audit = [] + for managed_object in managed_objects: + audit_info = self.get_domain_l2_audit_info( + managed_object + ) + self.domain_l2_audit.append( + audit_info + ) + + self.log.apic_mo( + 'l2extDomP.auditRecord.info', + self.domain_l2_audit + ) + + return self.domain_l2_audit + + def get_domain_l2_id_audit(self, domain_name, audit_filter=None): + audits = [] + + all_audits = self.get_domain_l2_audit() + if all_audits is None: + return audits + + for audit_info in all_audits: + if audit_info['domainName'] is not None: + if audit_info['domainName'] == domain_name: + if not self.match_system_fault(audit_info, audit_filter, exclude_cleared=False): + continue + + audits.append( + audit_info + ) + + return audits diff --git a/lib/aci/domain/l2/audit/main.py b/lib/aci/domain/l2/audit/main.py new file mode 100644 index 00000000..226968cc --- /dev/null +++ b/lib/aci/domain/l2/audit/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.l2.audit.api import DomainL2AuditApi +from lib.aci.domain.l2.audit.info import DomainL2AuditInfo + + +class DomainL2Audit(DomainL2AuditApi, DomainL2AuditInfo): + def __init__(self): + DomainL2AuditApi.__init__(self) + DomainL2AuditInfo.__init__(self) diff --git a/lib/aci/domain/l2/event/__init__.py b/lib/aci/domain/l2/event/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/l2/event/api.py b/lib/aci/domain/l2/event/api.py new file mode 100644 index 00000000..54ebc0ec --- /dev/null +++ b/lib/aci/domain/l2/event/api.py @@ -0,0 +1,51 @@ +class DomainL2EventApi(): + def __init__(self): + self.domain_l2_event_mo = None + + def get_domain_l2_event_mo(self): + if self.domain_l2_event_mo is not None: + return self.domain_l2_event_mo + + cache = self.get_object_cache( + 'l2extDomP.eventLog' + ) + if cache is not None: + self.domain_l2_event_mo = cache + self.log.apic_mo( + 'l2extDomP.eventLog', + self.domain_l2_event_mo + ) + return self.domain_l2_event_mo + + query = 'rsp-subtree-include=event-logs,no-scoped,subtree&order-by=eventRecord.created|desc&page=0&page-size=%s' % (self.api_event_limit) + managed_objects = self.get_class( + 'l2extDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l2_event_mo', + 'API failed' + ) + return None + + self.domain_l2_event_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['eventRecord']['attributes'] + self.domain_l2_event_mo.append( + attributes + ) + + self.log.apic_mo( + 'l2extDomP.eventLog', + self.domain_l2_event_mo + ) + + self.set_object_cache( + 'l2extDomP.eventLog', + self.domain_l2_event_mo + ) + + return self.domain_l2_event_mo diff --git a/lib/aci/domain/l2/event/info.py b/lib/aci/domain/l2/event/info.py new file mode 100644 index 00000000..b85933a0 --- /dev/null +++ b/lib/aci/domain/l2/event/info.py @@ -0,0 +1,107 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class DomainL2EventInfo(): + def __init__(self): + self.domain_l2_event = None + + def get_domain_l2_event_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['domainName'] = None + if 'affected' in info: + if 'uni/l2dom-' in info['affected']: + info['domainName'] = info['affected'].split('uni/l2dom-')[1].split('/')[0] + + if 'affected' not in info and 'dn' in info: + if 'uni/l2dom-' in info['dn']: + info['domainName'] = info['dn'].split('uni/l2dom-')[1].split('/')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T12:22:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_domain_l2_event(self, deduplicate=True): + if self.domain_l2_event is not None: + return self.domain_l2_event + + managed_objects = self.get_domain_l2_event_mo() + if managed_objects is None: + return None + + self.domain_l2_event = [] + transaction_ids = [] + for managed_object in managed_objects: + event_info = self.get_domain_l2_event_info( + managed_object + ) + if not deduplicate or event_info['txId'] not in transaction_ids: + self.domain_l2_event.append( + event_info + ) + transaction_ids.append( + event_info['txId'] + ) + + self.log.apic_mo( + 'l2extDomP.eventLog.info', + self.domain_l2_event + ) + + return self.domain_l2_event + + def get_domain_l2_id_event(self, domain_name, event_filter=None): + events = [] + + all_events = self.get_domain_l2_event() + if all_events is None: + return events + + for event_info in all_events: + if event_info['domainName'] is not None: + if event_info['domainName'] == domain_name: + if not self.match_system_fault(event_info, event_filter): + continue + + events.append( + event_info + ) + + return events diff --git a/lib/aci/domain/l2/event/main.py b/lib/aci/domain/l2/event/main.py new file mode 100644 index 00000000..0b3f0992 --- /dev/null +++ b/lib/aci/domain/l2/event/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.l2.event.api import DomainL2EventApi +from lib.aci.domain.l2.event.info import DomainL2EventInfo + + +class DomainL2Event(DomainL2EventApi, DomainL2EventInfo): + def __init__(self): + DomainL2EventApi.__init__(self) + DomainL2EventInfo.__init__(self) diff --git a/lib/aci/domain/l2/fault/__init__.py b/lib/aci/domain/l2/fault/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/l2/fault/api.py b/lib/aci/domain/l2/fault/api.py new file mode 100644 index 00000000..ed8ae726 --- /dev/null +++ b/lib/aci/domain/l2/fault/api.py @@ -0,0 +1,112 @@ +class DomainL2FaultApi(): + def __init__(self): + self.domain_l2_fault_mo = None + self.domain_l2_fault_record_mo = None + + def get_domain_l2_fault_mo(self): + cache = self.get_object_cache( + 'l2extDomP.fault' + ) + if cache is not None: + self.domain_l2_fault_mo = cache + self.log.apic_mo( + 'l2extDomP.fault', + self.domain_l2_fault_mo + ) + return self.domain_l2_fault_mo + + query = 'rsp-subtree-include=faults,no-scoped,subtree' + managed_objects = self.get_class( + 'l2extDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l2_fault_mo', + 'API failed' + ) + return None + + self.domain_l2_fault_mo = [] + for managed_object in managed_objects['imdata']: + if 'faultInst' in managed_object: + attributes = managed_object['faultInst']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = True + + self.domain_l2_fault_mo.append( + attributes + ) + + self.log.apic_mo( + 'l2extDomP.fault', + self.domain_l2_fault_mo + ) + + self.set_object_cache( + 'l2extDomP.fault', + self.domain_l2_fault_mo + ) + + return self.domain_l2_fault_mo + + def get_domain_l2_fault_record_mo(self): + cache = self.get_object_cache( + 'l2extDomP.faultRecord' + ) + if cache is not None: + self.domain_l2_fault_record_mo = cache + self.log.apic_mo( + 'l2extDomP.faultRecord', + self.domain_l2_fault_record_mo + ) + return self.domain_l2_fault_record_mo + + query = 'rsp-subtree-include=fault-records,no-scoped,subtree&order-by=faultRecord.created|desc&page=0&page-size=%s' % (self.api_fault_limit) + managed_objects = self.get_class( + 'l2extDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l2_fault_record_mo', + 'API failed' + ) + return None + + self.domain_l2_fault_record_mo = [] + for managed_object in managed_objects['imdata']: + if 'faultRecord' in managed_object: + attributes = managed_object['faultRecord']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = True + + self.domain_l2_fault_record_mo.append( + attributes + ) + + self.log.apic_mo( + 'l2extDomP.faultRecord', + self.domain_l2_fault_record_mo + ) + + self.set_object_cache( + 'l2extDomP.faultRecord', + self.domain_l2_fault_record_mo + ) + + return self.domain_l2_fault_record_mo diff --git a/lib/aci/domain/l2/fault/info.py b/lib/aci/domain/l2/fault/info.py new file mode 100644 index 00000000..c4a26dea --- /dev/null +++ b/lib/aci/domain/l2/fault/info.py @@ -0,0 +1,139 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class DomainL2FaultInfo(): + def __init__(self): + self.domain_l2_fault = None + self.domain_l2_fault_record = None + + def get_domain_l2_fault_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['domainName'] = None + + if not managed_object['delegated']: + if 'affected' in info: + if 'uni/l2dom-' in info['affected']: + info['domainName'] = info['affected'].split('uni/l2dom-')[1].split('/')[0] + + # "dn": "topology/pod-1/node-2208/sys/inst-overlay-1/lb-[lo0]" + if info['domainName'] is None: + if 'uni/l2dom-' in info['dn']: + info['domainName'] = info['dn'].split('uni/l2dom-')[1].split('/')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T12:22:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_domain_l2_fault(self): + if self.domain_l2_fault is not None: + return self.domain_l2_fault + + managed_objects = self.get_domain_l2_fault_mo() + if managed_objects is None: + return None + + self.domain_l2_fault = [] + for managed_object in managed_objects: + fault_info = self.get_domain_l2_fault_info( + managed_object + ) + self.domain_l2_fault.append( + fault_info + ) + + self.log.apic_mo( + 'l2extDomP.fault.info', + self.domain_l2_fault + ) + + return self.domain_l2_fault + + def get_domain_l2_fault_record(self, deduplicate=True): + if self.domain_l2_fault_record is not None: + return self.domain_l2_fault_record + + managed_objects = self.get_domain_l2_fault_record_mo() + if managed_objects is None: + return None + + self.domain_l2_fault_record = [] + fault_ids = [] + + for managed_object in managed_objects: + fault_info = self.get_domain_l2_fault_info( + managed_object + ) + if not deduplicate or fault_info['id'] not in fault_ids: + self.domain_l2_fault.append( + fault_info + ) + fault_ids.append( + fault_info['id'] + ) + + self.log.apic_mo( + 'l2extDomP.faultRecord.info', + self.domain_l2_fault_record + ) + + return self.domain_l2_fault_record + + def get_domain_l2_id_fault(self, domain_name, fault_object, fault_filter=None): + faults = [] + + if fault_object == 'faultInst': + all_faults = self.get_domain_l2_fault() + if all_faults is None: + return faults + + fault_filter = self.remove_system_fault_timestamp_filter( + fault_filter + ) + + if fault_object == 'faultRecord': + all_faults = self.get_domain_l2_fault_record() + if all_faults is None: + return faults + + for fault_info in all_faults: + if fault_info['domainName'] is not None: + if fault_info['domainName'] == domain_name: + if not self.match_system_fault(fault_info, fault_filter, exclude_cleared=False): + continue + + faults.append( + fault_info + ) + + return faults diff --git a/lib/aci/domain/l2/fault/main.py b/lib/aci/domain/l2/fault/main.py new file mode 100644 index 00000000..e3ffa5c8 --- /dev/null +++ b/lib/aci/domain/l2/fault/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.l2.fault.api import DomainL2FaultApi +from lib.aci.domain.l2.fault.info import DomainL2FaultInfo + + +class DomainL2Fault(DomainL2FaultApi, DomainL2FaultInfo): + def __init__(self): + DomainL2FaultApi.__init__(self) + DomainL2FaultInfo.__init__(self) diff --git a/lib/aci/domain/l2/info.py b/lib/aci/domain/l2/info.py new file mode 100644 index 00000000..f834a050 --- /dev/null +++ b/lib/aci/domain/l2/info.py @@ -0,0 +1,316 @@ +from lib import filter_helper + + +class DomainL2Info(): + def __init__(self): + self.domain_l2 = None + + def get_domain_l2_info(self, managed_object): + keys = [ + 'dn', + 'name' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['aaep_names'] = [] + if 'infraRtDomP' in managed_object: + if managed_object['infraRtDomP'] is not None: + for item in managed_object['infraRtDomP']: + # "tCl": "infraAttEntityP", + # "tDn": "uni/infra/attentp-UCSB1-R2DC_AAEP" + if item['tCl'] == 'infraAttEntityP': + info['aaep_names'].append( + item['tDn'].split('/')[2][8:] + ) + + info['reln'] = [] + if 'infraRtDomP' in managed_object: + if managed_object['infraRtDomP'] is not None: + for item in managed_object['infraRtDomP']: + # "tCl": "infraAttEntityP", + # "tDn": "uni/infra/attentp-UCSB1-R3DC_AAEP" + if item['tCl'] == 'infraAttEntityP': + reln_info = {} + reln_info['tCl'] = item['tCl'] + reln_info['tDn'] = item['tDn'] + reln_info['type'] = 'AAEP' + reln_info['name'] = item['tDn'].split('/')[2][8:] + info['reln'].append( + reln_info + ) + continue + + self.log.error( + 'get_domain_l2_info', + 'Unsupported infraRtDomP tCl: %s' % (item['tCl']) + ) + + if 'l2extRtL2DomAtt' in managed_object: + if managed_object['l2extRtL2DomAtt'] is not None: + for item in managed_object['l2extRtL2DomAtt']: + # "tCl": "l2extOut", + # "tDn": "uni/tn-k8s/l2out-Test" + if item['tCl'] == 'l2extOut': + reln_info = {} + reln_info['tCl'] = item['tCl'] + reln_info['tDn'] = item['tDn'] + reln_info['type'] = 'L2 Out' + reln_info['name'] = self.get_l2out_name_from_dn( + item['tDn'] + ) + info['reln'].append( + reln_info + ) + continue + + self.log.error( + 'get_domain_l2_info', + 'Unsupported extnwRtL3DomAtt tCl: %s' % (item['tCl']) + ) + + info['vlan'] = None + if 'infraRsVlanNs' in managed_object: + if managed_object['infraRsVlanNs'] is not None: + if managed_object['infraRsVlanNs']['tCl'] == 'fvnsVlanInstP': + info['vlan'] = managed_object['infraRsVlanNs']['tDn'].split('vlanns-[')[1].split(']')[0] + + info['aaaDomain'] = [] + for item in managed_object['aaaDomainRef']: + info['aaaDomain'].append( + item['name'] + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_domains_l2_info(self): + if self.domain_l2 is not None: + return self.domain_l2 + + domains_mo = self.get_domain_l2_mo() + if domains_mo is None: + return None + + self.domain_l2 = [] + for managed_object in domains_mo: + self.domain_l2.append( + self.get_domain_l2_info( + managed_object + ) + ) + + self.log.apic_mo( + 'l2extDomP.info', + self.domain_l2 + ) + + return self.domain_l2 + + def match_domain_l2(self, domain_info, domain_filter): + if domain_filter is None or len(domain_filter) == 0: + return True + + for aepg_rule in domain_filter: + (key, value) = aepg_rule.split(':') + key_found = False + + if key == 'name': + key_found = True + if not filter_helper.match_string(value, domain_info['name']): + return False + + if key == 'aaep': + key_found = True + found = False + for aaep_name in domain_info['aaep_names']: + if filter_helper.match_string(value, aaep_name): + found = True + + if not found: + return False + + if key == 'pool': + key_found = True + if not filter_helper.match_string(value, domain_info['vlan']): + return False + + if key == 'vlan': + key_found = True + if 'vlan_block' in domain_info: + found = False + for vlan_block in domain_info['vlan_block']: + if filter_helper.match_integer(vlan_block, value): + found = True + + if not found: + return False + + if key == 'fault': + key_found = True + if value == 'any': + if not domain_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_domain_l2', + 'Unsupported fault filtering value: %s' % (value) + ) + + if not key_found: + self.log.error( + 'match_domain_l2', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_domains_l2( + self, + domain_filter=None, + vlan_info=False, + vlan_usage_info=False, + node_info=False, + intf_vlan_info=False, + fault_info=False, + hfault_info=False, + event_info=False, + audit_info=False, + hfault_filter=None, + event_filter=None, + audit_filter=None + ): + all_domains = self.get_domains_l2_info() + + domains = [] + + for domain_info in all_domains: + if not self.match_domain_l2(domain_info, domain_filter): + continue + + if vlan_info: + domain_info['vlan_info'] = None + domain_info['vlan_block'] = [] + if domain_info['vlan'] is not None: + domain_info['vlan_info'] = self.get_pool_vlan( + domain_info['vlan'], + vlan_usage_info=vlan_usage_info, + domain_name=domain_info['name'] + ) + if domain_info['vlan_info'] is None: + self.log.error( + 'get_domains_l2', + 'Vlan pool not found: %s' % (domain_info['vlan']) + ) + if domain_info['vlan_info'] is not None: + for vlan_block in domain_info['vlan_info']['fvnsEncapBlk']: + domain_info['vlan_block'].append( + '%s-%s' % ( + vlan_block['fromVlan'], + vlan_block['toVlan'] + ) + ) + + if not self.match_domain_phy(domain_info, domain_filter): + continue + + if node_info: + domain_node_info = self.get_domain_l2_node( + domain_info['name'] + ) + domain_info['node'] = None + domain_info['interface'] = None + if domain_node_info is not None: + domain_info['node'] = domain_node_info['node'] + domain_info['interface'] = domain_node_info['interface'] + + if intf_vlan_info: + if domain_info['interface'] is not None: + for interface in domain_info['interface']: + interface['vlan'] = [] + interface['operSt'] = '--' + interface['operMode'] = '--' + + if interface['intf_type'] == 'l1PhysIf': + interface_info = self.get_interface_phy( + interface['pod_id'], + interface['node_id'], + interface['intf_name'], + epg_stats_info=True + ) + if interface_info is not None: + interface['operSt'] = interface_info['stats']['operSt'] + interface['__Output']['operSt'] = interface_info['stats']['__Output']['operSt'] + interface['operMode'] = interface_info['stats']['operMode'] + for intf_epg_stats in interface_info['epg_stats']: + if intf_epg_stats['vlan'] is not None: + if intf_epg_stats['vlan']['evlan'] not in interface['vlan']: + interface['vlan'].append( + intf_epg_stats['vlan']['evlan'] + ) + + interface['vlan'] = sorted( + interface['vlan'] + ) + interface['vlans'] = filter_helper.get_range_from_values( + interface['vlan'] + ) + + if fault_info: + domain_info['faultInst'] = self.get_domain_l2_id_fault( + domain_info['name'], + 'faultInst' + ) + + if hfault_info: + domain_info['faultRecord'] = self.get_domain_l2_id_fault( + domain_info['name'], + 'faultRecord', + fault_filter=hfault_filter + ) + + if event_info: + domain_info['eventLog'] = self.get_domain_l2_id_event( + domain_info['name'], + event_filter=event_filter + ) + + if audit_info: + domain_info['auditLog'] = self.get_domain_l2_id_audit( + domain_info['name'], + audit_filter=audit_filter + ) + + domains.append(domain_info) + + domains = sorted( + domains, + key=lambda i: i['name'].lower() + ) + + return domains + + def get_domain_l2(self, domain_name, vlan_info=False, vlan_usage_info=False): + domain_filter = ['name:%s' % (domain_name)] + domains = self.get_domains_l2( + domain_filter=domain_filter, + vlan_info=vlan_info, + vlan_usage_info=vlan_usage_info + ) + if domains is None or len(domains) != 1: + return None + return domains[0] diff --git a/lib/aci/domain/l2/main.py b/lib/aci/domain/l2/main.py new file mode 100644 index 00000000..c120f3da --- /dev/null +++ b/lib/aci/domain/l2/main.py @@ -0,0 +1,23 @@ +from lib.aci.domain.l2.api import DomainL2Api +from lib.aci.domain.l2.info import DomainL2Info +from lib.aci.domain.l2.audit.main import DomainL2Audit +from lib.aci.domain.l2.event.main import DomainL2Event +from lib.aci.domain.l2.fault.main import DomainL2Fault +from lib.aci.domain.l2.node.main import DomainL2Node + + +class DomainL2( + DomainL2Api, + DomainL2Info, + DomainL2Audit, + DomainL2Event, + DomainL2Fault, + DomainL2Node + ): + def __init__(self): + DomainL2Api.__init__(self) + DomainL2Info.__init__(self) + DomainL2Audit.__init__(self) + DomainL2Event.__init__(self) + DomainL2Fault.__init__(self) + DomainL2Node.__init__(self) diff --git a/lib/aci/domain/l2/node/__init__.py b/lib/aci/domain/l2/node/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/l2/node/api.py b/lib/aci/domain/l2/node/api.py new file mode 100644 index 00000000..6cfc2d18 --- /dev/null +++ b/lib/aci/domain/l2/node/api.py @@ -0,0 +1,61 @@ +class DomainL2NodeApi(): + def __init__(self): + self.domain_l2_node_mo = {} + + def get_domain_l2_node_mo(self, domain_name): + if domain_name in self.domain_l2_node_mo: + return self.domain_l2_node_mo[domain_name] + + key = domain_name + cache = self.get_object_cache( + 'l2extDomP.%s' % (key) + ) + if cache is not None: + self.domain_l2_node_mo[key] = cache + self.log.apic_mo( + 'l2extDomP.%s' % (key), + self.domain_l2_node_mo[key] + ) + return self.domain_l2_node_mo[key] + + distinguished_name = 'uni/l2dom-%s' % (domain_name) + query = 'rsp-subtree-include=full-deployment&target-node=all&target-path=ADomPToEthIf' + managed_objects = self.get_managed_object( + distinguished_name, + query=query, + node_mo=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l2_node_mo', + 'API failed' + ) + return None + + if managed_objects['totalCount'] != '1': + self.log.error( + 'get_domain_l2_node_mo', + 'Unexpected object count' + ) + return None + + for managed_object in managed_objects['imdata']: + attributes = managed_object['l2extDomP']['attributes'] + attributes['pconsResourceCtx'] = self.get_mo_node_resource_ctx( + 'l2extDomP', + managed_object + ) + self.domain_l2_node_mo[key] = attributes + + self.log.apic_mo( + 'l2extDomP.%s' % (key), + self.domain_l2_node_mo[key] + ) + + self.set_object_cache( + 'l2extDomP.%s' % (key), + self.domain_l2_node_mo[key] + ) + + return self.domain_l2_node_mo[key] diff --git a/lib/aci/domain/l2/node/info.py b/lib/aci/domain/l2/node/info.py new file mode 100644 index 00000000..b9f71642 --- /dev/null +++ b/lib/aci/domain/l2/node/info.py @@ -0,0 +1,81 @@ +class DomainL2NodeInfo(): + def __init__(self): + self.domain_l2_node = {} + + def get_domain_l2_node_info(self, managed_object): + info = {} + info['__Output'] = {} + info['name'] = managed_object['name'] + + node = {} + info['interface'] = [] + for item in managed_object['pconsResourceCtx']: + node_name = self.get_node_name( + item['nodeId'] + ) + + if node_name not in node: + node[node_name] = {} + node[node_name]['node_id'] = item['nodeId'] + node[node_name]['interfaces'] = 0 + + port_info = {} + port_info['__Output'] = {} + port_info['pod_id'] = item['ctxDn'].split('/')[1].split('-')[1] + port_info['node_id'] = item['nodeId'] + port_info['node_name'] = self.get_node_name( + item['nodeId'] + ) + port_info['intf_type'] = item['ctxClass'] + # "topology/pod-1/node-2201/sys/l2s-[eth1/42]" + port_info['intf_name'] = item['ctxDn'].split('[')[1].split(']')[0] + info['interface'].append( + port_info + ) + + node[node_name]['interfaces'] = node[node_name]['interfaces'] + 1 + + info['node'] = [] + for key in node: + node_info = {} + node_info['id'] = node[key]['node_id'] + node_info['name'] = key + node_info['interfaces'] = node[key]['interfaces'] + info['node'].append( + node_info + ) + + info['node'] = sorted( + info['node'], + key=lambda i: i['name'] + ) + + info['interface'] = sorted( + info['interface'], + key=lambda i: ( + i['node_name'], + i['intf_name'] + ) + ) + + return info + + def get_domain_l2_node(self, domain_name): + if domain_name in self.domain_l2_node: + return self.domain_l2_node[domain_name] + + # one object or None value is expected + domain_nodes_mo = self.get_domain_l2_node_mo(domain_name) + if domain_nodes_mo is None: + return None + + self.domain_l2_node[domain_name] = self.get_domain_l2_node_info( + domain_nodes_mo + ) + + self.log.apic_mo( + 'l2extDomP.%s.info' % (domain_name), + self.domain_l2_node[domain_name] + ) + + return self.domain_l2_node[domain_name] diff --git a/lib/aci/domain/l2/node/main.py b/lib/aci/domain/l2/node/main.py new file mode 100644 index 00000000..8d253aaa --- /dev/null +++ b/lib/aci/domain/l2/node/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.l2.node.api import DomainL2NodeApi +from lib.aci.domain.l2.node.info import DomainL2NodeInfo + + +class DomainL2Node(DomainL2NodeApi, DomainL2NodeInfo): + def __init__(self): + DomainL2NodeApi.__init__(self) + DomainL2NodeInfo.__init__(self) diff --git a/lib/aci/domain/l2/output.py b/lib/aci/domain/l2/output.py new file mode 100644 index 00000000..13427712 --- /dev/null +++ b/lib/aci/domain/l2/output.py @@ -0,0 +1,455 @@ +class DomainL2Output(): + def __init__(self): + pass + + def print_domains_l2(self, info, title=False): + if title: + self.my_output.default( + 'L2 Domain [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + for item in info: + item['fvnsEncapBlk'] = [] + if item['vlan_info'] is not None: + item['fvnsEncapBlk'] = item['vlan_info']['fvnsEncapBlk'] + + for item in info: + if len(item['aaaDomain']) == 0: + item['aaaDomain'].append('--') + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'vlan_info.allocMode', + 'fvnsEncapBlk.blockInfo', + 'aaaDomain' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Mode', + 'Encapsulation Block', + 'Sec Domain' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'fvnsEncapBlk', 'aaaDomain'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_l2_node(self, info, title=False): + if title: + self.my_output.default( + 'L2 Domain - Nodes [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'node.name', + 'node.interfaces' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Node', + 'Interfaces' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'node'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_l2_interface(self, info, title=False): + if title: + self.my_output.default( + 'L2 Domain - Interfaces [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'interface.node_name', + 'interface.intf_name' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Node', + 'Interface' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'interface'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_l2_vlan(self, info, title=False): + if title: + self.my_output.default( + 'L2 Domain - Interfaces VLAN [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + for item in info: + item['fvnsEncapBlk'] = [] + if item['vlan_info'] is not None: + item['fvnsEncapBlk'] = item['vlan_info']['fvnsEncapBlk'] + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'fvnsEncapBlk.blockInfo', + 'interface.node_name', + 'interface.intf_name', + 'interface.operSt', + 'interface.operMode', + 'interface.vlans' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Encapsulation Block', + 'Node', + 'Interface', + 'State', + 'Mode', + 'VLANs' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'interface', 'fvnsEncapBlk'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_l2_reln(self, info, title=False): + if title: + self.my_output.default( + 'L2 Domain - Policy Relationships [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'reln.type', + 'reln.name' + ] + + headers = [ + 'Faults', + 'Domain', + 'Policy Type', + 'Policy Name' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['reln'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_l2_event_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'L2 Domain - Event Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'L2 Domain - Event Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) + + def print_domains_l2_fault_inst(self, info, title=False): + if title: + self.my_output.default( + 'L2 Domain - Faults [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_domains_l2_fault_record(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'L2 Domain - Fault Records [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'L2 Domain - Fault Records last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_domains_l2_audit_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'L2 Domain - Audit Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'L2 Domain - Audit Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/domain/l3/__init__.py b/lib/aci/domain/l3/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/l3/__pycache__/__init__.cpython-310.pyc b/lib/aci/domain/l3/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0213b4bd1bbf458de84f8f3b18a053eda97858a2 GIT binary patch literal 150 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HevsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oL4JNtOj%B1UQB#^W?p7Ve7s&kE;r>m+O3}OP~)3+~j)Fb38D&66O z@(`xE49jC8iKHK3zW2sNdV6H(XMisa5449c%?(%-8BHr_WSMa zyXi|&>KNQ+S_X8FeKt&KR(%e>|s6B}G&dUB=1 zaO1DR64ek4aXPA3f%u#p0nvu)2&FyHPpPD5bV29P3&3yADHa2}-l;D^J|brxb$)x$ z)rAKL1Kh)Iee@Up+y_6R?>LV@1~No@Y{mh2K_p+Utdd9M-+K!-2hUX^qgAp9Aae+D znCzYT^Fa3QBbOD2#14r&NZ%p-4w5(|aY!3y;E(|#N8~h`2WOO$<4wnFsgl#)`MQP| zc5JU0sW&xr^x4Tmo7uW)_G_)wW_FktQmgWx4!E9|SpK&j!bh(r;~CR#I^n%w9TB zHJ6=(brNqqdva?c@Lb#$H$kbOKiH-nC1BDqdL>%sW_O8dBzY zl>LhQ5M+=j`x!FkF_7^W{)j@vVdp1fp_h0G*tC1m4;K7CDGVXfuaLFz(aYrtPHwax z-aRuL=fCmJFu=K-)1X;IBAWOb Xb$F}X|9?5z=zg2)f%C)@aGCrD^}%mY literal 0 HcmV?d00001 diff --git a/lib/aci/domain/l3/__pycache__/info.cpython-310.pyc b/lib/aci/domain/l3/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00f307d9e70098105e6310daf6e8f857ba578577 GIT binary patch literal 5198 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 J|395p{s)(-pCAAL literal 0 HcmV?d00001 diff --git a/lib/aci/domain/l3/api.py b/lib/aci/domain/l3/api.py new file mode 100644 index 00000000..389240d5 --- /dev/null +++ b/lib/aci/domain/l3/api.py @@ -0,0 +1,78 @@ +class DomainL3Api(): + def __init__(self): + self.domain_l3_mo = None + + def get_domain_l3_mo(self): + if self.domain_l3_mo is not None: + return self.domain_l3_mo + + cache = self.get_object_cache( + 'l3extDomP' + ) + if cache is not None: + self.domain_l3_mo = cache + self.log.apic_mo( + 'l3extDomP', + self.domain_l3_mo + ) + return self.domain_l3_mo + + query = 'rsp-subtree=children&rsp-subtree-include=fault-count&rsp-subtree-class=infraRsVlanNs,infraRtDomP,extnwRtL3DomAtt,aaaDomainRef' + managed_objects = self.get_class( + 'l3extDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l3_mo', + 'API failed' + ) + return None + + self.domain_l3_mo = [] + + for managed_object in managed_objects['imdata']: + attributes = managed_object['l3extDomP']['attributes'] + attributes['infraRsVlanNs'] = self.get_mo_child_attributes( + 'l3extDomP', + managed_object, + 'infraRsVlanNs' + ) + attributes['infraRtDomP'] = self.get_mo_children_attributes( + 'l3extDomP', + managed_object, + 'infraRtDomP' + ) + attributes['extnwRtL3DomAtt'] = self.get_mo_children_attributes( + 'l3extDomP', + managed_object, + 'extnwRtL3DomAtt' + ) + attributes['aaaDomainRef'] = self.get_mo_children_attributes( + 'l3extDomP', + managed_object, + 'aaaDomainRef' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'l3extDomP', + managed_object, + 'faultCounts' + ) + + self.domain_l3_mo.append( + attributes + ) + + self.log.apic_mo( + 'l3extDomP', + self.domain_l3_mo + ) + + self.set_object_cache( + 'l3extDomP', + self.domain_l3_mo + ) + + return self.domain_l3_mo diff --git a/lib/aci/domain/l3/audit/__init__.py b/lib/aci/domain/l3/audit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/l3/audit/api.py b/lib/aci/domain/l3/audit/api.py new file mode 100644 index 00000000..d6e1bb11 --- /dev/null +++ b/lib/aci/domain/l3/audit/api.py @@ -0,0 +1,48 @@ +class DomainL3AuditApi(): + def __init__(self): + self.domain_l3_audit_mo = None + + def get_domain_l3_audit_mo(self): + cache = self.get_object_cache( + 'l3extDomP.audit' + ) + if cache is not None: + self.domain_l3_audit_mo = cache + self.log.apic_mo( + 'l3extDomP.audit', + self.domain_l3_audit_mo + ) + return self.domain_l3_audit_mo + + query = 'rsp-subtree-include=audit-logs,no-scoped,subtree&order-by=aaaModLR.created|desc&page=0&page-size=%s' % (self.api_audit_limit) + managed_objects = self.get_class( + 'l3extDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l3_audit_mo', + 'API failed' + ) + return None + + self.domain_l3_audit_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['aaaModLR']['attributes'] + self.domain_l3_audit_mo.append( + attributes + ) + + self.log.apic_mo( + 'l3extDomP.audit', + self.domain_l3_audit_mo + ) + + self.set_object_cache( + 'l3extDomP.audit', + self.domain_l3_audit_mo + ) + + return self.domain_l3_audit_mo diff --git a/lib/aci/domain/l3/audit/info.py b/lib/aci/domain/l3/audit/info.py new file mode 100644 index 00000000..912f51c8 --- /dev/null +++ b/lib/aci/domain/l3/audit/info.py @@ -0,0 +1,97 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class DomainL3AuditInfo(): + def __init__(self): + self.domain_l3_audit = None + + def get_domain_l3_audit_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['domainName'] = None + if 'uni/l3dom-' in info['affected']: + info['domainName'] = info['affected'].split('uni/l3dom-')[1].split('/')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_domain_l3_audit(self): + if self.domain_l3_audit is not None: + return self.domain_l3_audit + + managed_objects = self.get_domain_l3_audit_mo() + if managed_objects is None: + return None + + self.domain_l3_audit = [] + for managed_object in managed_objects: + audit_info = self.get_domain_l3_audit_info( + managed_object + ) + self.domain_l3_audit.append( + audit_info + ) + + self.log.apic_mo( + 'l3extDomP.auditRecord.info', + self.domain_l3_audit + ) + + return self.domain_l3_audit + + def get_domain_l3_id_audit(self, domain_name, audit_filter=None): + audits = [] + + all_audits = self.get_domain_l3_audit() + if all_audits is None: + return audits + + for audit_info in all_audits: + if audit_info['domainName'] is not None: + if audit_info['domainName'] == domain_name: + if not self.match_system_fault(audit_info, audit_filter, exclude_cleared=False): + continue + + audits.append( + audit_info + ) + + return audits diff --git a/lib/aci/domain/l3/audit/main.py b/lib/aci/domain/l3/audit/main.py new file mode 100644 index 00000000..0eaef74d --- /dev/null +++ b/lib/aci/domain/l3/audit/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.l3.audit.api import DomainL3AuditApi +from lib.aci.domain.l3.audit.info import DomainL3AuditInfo + + +class DomainL3Audit(DomainL3AuditApi, DomainL3AuditInfo): + def __init__(self): + DomainL3AuditApi.__init__(self) + DomainL3AuditInfo.__init__(self) diff --git a/lib/aci/domain/l3/event/__init__.py b/lib/aci/domain/l3/event/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/l3/event/api.py b/lib/aci/domain/l3/event/api.py new file mode 100644 index 00000000..c59ee8ec --- /dev/null +++ b/lib/aci/domain/l3/event/api.py @@ -0,0 +1,51 @@ +class DomainL3EventApi(): + def __init__(self): + self.domain_l3_event_mo = None + + def get_domain_l3_event_mo(self): + if self.domain_l3_event_mo is not None: + return self.domain_l3_event_mo + + cache = self.get_object_cache( + 'l3extDomP.eventLog' + ) + if cache is not None: + self.domain_l3_event_mo = cache + self.log.apic_mo( + 'l3extDomP.eventLog', + self.domain_l3_event_mo + ) + return self.domain_l3_event_mo + + query = 'rsp-subtree-include=event-logs,no-scoped,subtree&order-by=eventRecord.created|desc&page=0&page-size=%s' % (self.api_event_limit) + managed_objects = self.get_class( + 'l3extDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l3_event_mo', + 'API failed' + ) + return None + + self.domain_l3_event_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['eventRecord']['attributes'] + self.domain_l3_event_mo.append( + attributes + ) + + self.log.apic_mo( + 'l3extDomP.eventLog', + self.domain_l3_event_mo + ) + + self.set_object_cache( + 'l3extDomP.eventLog', + self.domain_l3_event_mo + ) + + return self.domain_l3_event_mo diff --git a/lib/aci/domain/l3/event/info.py b/lib/aci/domain/l3/event/info.py new file mode 100644 index 00000000..d876bcfd --- /dev/null +++ b/lib/aci/domain/l3/event/info.py @@ -0,0 +1,107 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class DomainL3EventInfo(): + def __init__(self): + self.domain_l3_event = None + + def get_domain_l3_event_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['domainName'] = None + if 'affected' in info: + if 'uni/l3dom-' in info['affected']: + info['domainName'] = info['affected'].split('uni/l3dom-')[1].split('/')[0] + + if 'affected' not in info and 'dn' in info: + if 'uni/l3dom-' in info['dn']: + info['domainName'] = info['dn'].split('uni/l3dom-')[1].split('/')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_domain_l3_event(self, deduplicate=True): + if self.domain_l3_event is not None: + return self.domain_l3_event + + managed_objects = self.get_domain_l3_event_mo() + if managed_objects is None: + return None + + self.domain_l3_event = [] + transaction_ids = [] + for managed_object in managed_objects: + event_info = self.get_domain_l3_event_info( + managed_object + ) + if not deduplicate or event_info['txId'] not in transaction_ids: + self.domain_l3_event.append( + event_info + ) + transaction_ids.append( + event_info['txId'] + ) + + self.log.apic_mo( + 'l3extDomP.eventLog.info', + self.domain_l3_event + ) + + return self.domain_l3_event + + def get_domain_l3_id_event(self, domain_name, event_filter=None): + events = [] + + all_events = self.get_domain_l3_event() + if all_events is None: + return events + + for event_info in all_events: + if event_info['domainName'] is not None: + if event_info['domainName'] == domain_name: + if not self.match_system_fault(event_info, event_filter): + continue + + events.append( + event_info + ) + + return events diff --git a/lib/aci/domain/l3/event/main.py b/lib/aci/domain/l3/event/main.py new file mode 100644 index 00000000..55471d32 --- /dev/null +++ b/lib/aci/domain/l3/event/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.l3.event.api import DomainL3EventApi +from lib.aci.domain.l3.event.info import DomainL3EventInfo + + +class DomainL3Event(DomainL3EventApi, DomainL3EventInfo): + def __init__(self): + DomainL3EventApi.__init__(self) + DomainL3EventInfo.__init__(self) diff --git a/lib/aci/domain/l3/fault/__init__.py b/lib/aci/domain/l3/fault/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/l3/fault/api.py b/lib/aci/domain/l3/fault/api.py new file mode 100644 index 00000000..15eff883 --- /dev/null +++ b/lib/aci/domain/l3/fault/api.py @@ -0,0 +1,112 @@ +class DomainL3FaultApi(): + def __init__(self): + self.domain_l3_fault_mo = None + self.domain_l3_fault_record_mo = None + + def get_domain_l3_fault_mo(self): + cache = self.get_object_cache( + 'l3extDomP.fault' + ) + if cache is not None: + self.domain_l3_fault_mo = cache + self.log.apic_mo( + 'l3extDomP.fault', + self.domain_l3_fault_mo + ) + return self.domain_l3_fault_mo + + query = 'rsp-subtree-include=faults,no-scoped,subtree' + managed_objects = self.get_class( + 'l3extDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l3_fault_mo', + 'API failed' + ) + return None + + self.domain_l3_fault_mo = [] + for managed_object in managed_objects['imdata']: + if 'faultInst' in managed_object: + attributes = managed_object['faultInst']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = True + + self.domain_l3_fault_mo.append( + attributes + ) + + self.log.apic_mo( + 'l3extDomP.fault', + self.domain_l3_fault_mo + ) + + self.set_object_cache( + 'l3extDomP.fault', + self.domain_l3_fault_mo + ) + + return self.domain_l3_fault_mo + + def get_domain_l3_fault_record_mo(self): + cache = self.get_object_cache( + 'l3extDomP.faultRecord' + ) + if cache is not None: + self.domain_l3_fault_record_mo = cache + self.log.apic_mo( + 'l3extDomP.faultRecord', + self.domain_l3_fault_record_mo + ) + return self.domain_l3_fault_record_mo + + query = 'rsp-subtree-include=fault-records,no-scoped,subtree&order-by=faultRecord.created|desc&page=0&page-size=%s' % (self.api_fault_limit) + managed_objects = self.get_class( + 'l3extDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l3_fault_record_mo', + 'API failed' + ) + return None + + self.domain_l3_fault_record_mo = [] + for managed_object in managed_objects['imdata']: + if 'faultRecord' in managed_object: + attributes = managed_object['faultRecord']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = True + + self.domain_l3_fault_record_mo.append( + attributes + ) + + self.log.apic_mo( + 'l3extDomP.faultRecord', + self.domain_l3_fault_record_mo + ) + + self.set_object_cache( + 'l3extDomP.faultRecord', + self.domain_l3_fault_record_mo + ) + + return self.domain_l3_fault_record_mo diff --git a/lib/aci/domain/l3/fault/info.py b/lib/aci/domain/l3/fault/info.py new file mode 100644 index 00000000..11ba60ce --- /dev/null +++ b/lib/aci/domain/l3/fault/info.py @@ -0,0 +1,139 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class DomainL3FaultInfo(): + def __init__(self): + self.domain_l3_fault = None + self.domain_l3_fault_record = None + + def get_domain_l3_fault_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['domainName'] = None + + if not managed_object['delegated']: + if 'affected' in info: + if 'uni/l3dom-' in info['affected']: + info['domainName'] = info['affected'].split('uni/l3dom-')[1].split('/')[0] + + # "dn": "topology/pod-1/node-2208/sys/inst-overlay-1/lb-[lo0]" + if info['domainName'] is None: + if 'uni/l3dom-' in info['dn']: + info['domainName'] = info['dn'].split('uni/l3dom-')[1].split('/')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_domain_l3_fault(self): + if self.domain_l3_fault is not None: + return self.domain_l3_fault + + managed_objects = self.get_domain_l3_fault_mo() + if managed_objects is None: + return None + + self.domain_l3_fault = [] + for managed_object in managed_objects: + fault_info = self.get_domain_l3_fault_info( + managed_object + ) + self.domain_l3_fault.append( + fault_info + ) + + self.log.apic_mo( + 'l3extDomP.fault.info', + self.domain_l3_fault + ) + + return self.domain_l3_fault + + def get_domain_l3_fault_record(self, deduplicate=True): + if self.domain_l3_fault_record is not None: + return self.domain_l3_fault_record + + managed_objects = self.get_domain_l3_fault_record_mo() + if managed_objects is None: + return None + + self.domain_l3_fault_record = [] + fault_ids = [] + + for managed_object in managed_objects: + fault_info = self.get_domain_l3_fault_info( + managed_object + ) + if not deduplicate or fault_info['id'] not in fault_ids: + self.domain_l3_fault_record.append( + fault_info + ) + fault_ids.append( + fault_info['id'] + ) + + self.log.apic_mo( + 'l3extDomP.faultRecord.info', + self.domain_l3_fault_record + ) + + return self.domain_l3_fault_record + + def get_domain_l3_id_fault(self, domain_name, fault_object, fault_filter=None): + faults = [] + + if fault_object == 'faultInst': + all_faults = self.get_domain_l3_fault() + if all_faults is None: + return faults + + fault_filter = self.remove_system_fault_timestamp_filter( + fault_filter + ) + + if fault_object == 'faultRecord': + all_faults = self.get_domain_l3_fault_record() + if all_faults is None: + return faults + + for fault_info in all_faults: + if fault_info['domainName'] is not None: + if fault_info['domainName'] == domain_name: + if not self.match_system_fault(fault_info, fault_filter, exclude_cleared=False): + continue + + faults.append( + fault_info + ) + + return faults diff --git a/lib/aci/domain/l3/fault/main.py b/lib/aci/domain/l3/fault/main.py new file mode 100644 index 00000000..4e864cb2 --- /dev/null +++ b/lib/aci/domain/l3/fault/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.l3.fault.api import DomainL3FaultApi +from lib.aci.domain.l3.fault.info import DomainL3FaultInfo + + +class DomainL3Fault(DomainL3FaultApi, DomainL3FaultInfo): + def __init__(self): + DomainL3FaultApi.__init__(self) + DomainL3FaultInfo.__init__(self) diff --git a/lib/aci/domain/l3/info.py b/lib/aci/domain/l3/info.py new file mode 100644 index 00000000..b64178d3 --- /dev/null +++ b/lib/aci/domain/l3/info.py @@ -0,0 +1,311 @@ +from lib import filter_helper + + +class DomainL3Info(): + def __init__(self): + self.domain_l3 = None + + def get_domain_l3_info(self, managed_object): + keys = [ + 'dn', + 'name' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['aaep_names'] = [] + if 'infraRtDomP' in managed_object: + if managed_object['infraRtDomP'] is not None: + for item in managed_object['infraRtDomP']: + # "tCl": "infraAttEntityP", + # "tDn": "uni/infra/attentp-UCSB1-R3DC_AAEP" + if item['tCl'] == 'infraAttEntityP': + info['aaep_names'].append( + item['tDn'].split('/')[2][8:] + ) + + info['reln'] = [] + if 'infraRtDomP' in managed_object: + if managed_object['infraRtDomP'] is not None: + for item in managed_object['infraRtDomP']: + # "tCl": "infraAttEntityP", + # "tDn": "uni/infra/attentp-UCSB1-R3DC_AAEP" + if item['tCl'] == 'infraAttEntityP': + reln_info = {} + reln_info['tCl'] = item['tCl'] + reln_info['tDn'] = item['tDn'] + reln_info['type'] = 'AAEP' + reln_info['name'] = item['tDn'].split('/')[2][8:] + info['reln'].append( + reln_info + ) + continue + + self.log.error( + 'get_domain_l3_info', + 'Unsupported infraRtDomP tCl: %s' % (item['tCl']) + ) + + if 'extnwRtL3DomAtt' in managed_object: + if managed_object['extnwRtL3DomAtt'] is not None: + for item in managed_object['extnwRtL3DomAtt']: + # "tCl": "l3extOut", + # "tDn": "uni/tn-k8s/out-bml3_k8s" + if item['tCl'] == 'l3extOut': + reln_info = {} + reln_info['tCl'] = item['tCl'] + reln_info['tDn'] = item['tDn'] + reln_info['type'] = 'L3 Out' + reln_info['name'] = self.get_l3out_name_from_dn( + item['tDn'] + ) + info['reln'].append( + reln_info + ) + continue + + self.log.error( + 'get_domain_l3_info', + 'Unsupported extnwRtL3DomAtt tCl: %s' % (item['tCl']) + ) + + info['vlan'] = None + if 'infraRsVlanNs' in managed_object: + if managed_object['infraRsVlanNs'] is not None: + if managed_object['infraRsVlanNs']['tCl'] == 'fvnsVlanInstP': + info['vlan'] = managed_object['infraRsVlanNs']['tDn'].split('vlanns-[')[1].split(']')[0] + + info['aaaDomain'] = [] + for item in managed_object['aaaDomainRef']: + info['aaaDomain'].append( + item['name'] + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_domains_l3_info(self): + if self.domain_l3 is not None: + return self.domain_l3 + + domains_mo = self.get_domain_l3_mo() + if domains_mo is None: + return None + + self.domain_l3 = [] + for managed_object in domains_mo: + self.domain_l3.append( + self.get_domain_l3_info( + managed_object + ) + ) + + self.log.apic_mo( + 'l3extDomP.info', + self.domain_l3 + ) + + return self.domain_l3 + + def match_domain_l3(self, domain_info, domain_filter): + if domain_filter is None or len(domain_filter) == 0: + return True + + for aepg_rule in domain_filter: + (key, value) = aepg_rule.split(':') + key_found = False + + if key == 'name': + key_found = True + if not filter_helper.match_string(value, domain_info['name']): + return False + + if key == 'aaep': + key_found = True + found = False + for aaep_name in domain_info['aaep_names']: + if filter_helper.match_string(value, aaep_name): + found = True + + if not found: + return False + + if key == 'pool': + key_found = True + if not filter_helper.match_string(value, domain_info['vlan']): + return False + + if key == 'vlan': + key_found = True + if 'vlan_block' in domain_info: + found = False + for vlan_block in domain_info['vlan_block']: + if filter_helper.match_integer(vlan_block, value): + found = True + + if not found: + return False + + if key == 'fault': + key_found = True + if value == 'any': + if not domain_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_domain_l3', + 'Unsupported fault filtering value: %s' % (value) + ) + + if not key_found: + self.log.error( + 'match_domain_l3', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_domains_l3( + self, + domain_filter=None, + vlan_info=False, + vlan_usage_info=False, + node_info=False, + intf_vlan_info=False, + fault_info=False, + hfault_info=False, + event_info=False, + audit_info=False, + hfault_filter=None, + event_filter=None, + audit_filter=None + ): + all_domains = self.get_domains_l3_info() + + domains = [] + + for domain_info in all_domains: + if not self.match_domain_l3(domain_info, domain_filter): + continue + + if vlan_info: + domain_info['vlan_info'] = None + domain_info['vlan_block'] = [] + if domain_info['vlan'] is not None: + domain_info['vlan_info'] = self.get_pool_vlan( + domain_info['vlan'], + vlan_usage_info=vlan_usage_info, + domain_name=domain_info['name'] + ) + if domain_info['vlan_info'] is not None: + for vlan_block in domain_info['vlan_info']['fvnsEncapBlk']: + domain_info['vlan_block'].append( + '%s-%s' % ( + vlan_block['fromVlan'], + vlan_block['toVlan'] + ) + ) + + if not self.match_domain_phy(domain_info, domain_filter): + continue + + if node_info: + domain_node_info = self.get_domain_l3_node( + domain_info['name'] + ) + domain_info['node'] = None + domain_info['interface'] = None + if domain_node_info is not None: + domain_info['node'] = domain_node_info['node'] + domain_info['interface'] = domain_node_info['interface'] + + if intf_vlan_info: + if domain_info['interface'] is not None: + for interface in domain_info['interface']: + interface['vlan'] = [] + interface['operSt'] = '--' + interface['operMode'] = '--' + + if interface['intf_type'] == 'l1PhysIf': + interface_info = self.get_interface_phy( + interface['pod_id'], + interface['node_id'], + interface['intf_name'], + epg_stats_info=True + ) + if interface_info is not None: + interface['operSt'] = interface_info['stats']['operSt'] + interface['__Output']['operSt'] = interface_info['stats']['__Output']['operSt'] + interface['operMode'] = interface_info['stats']['operMode'] + for intf_epg_stats in interface_info['epg_stats']: + if intf_epg_stats['vlan'] is not None: + if intf_epg_stats['vlan']['evlan'] not in interface['vlan']: + interface['vlan'].append( + intf_epg_stats['vlan']['evlan'] + ) + + interface['vlan'] = sorted( + interface['vlan'] + ) + interface['vlans'] = filter_helper.get_range_from_values( + interface['vlan'] + ) + + if fault_info: + domain_info['faultInst'] = self.get_domain_l3_id_fault( + domain_info['name'], + 'faultInst' + ) + + if hfault_info: + domain_info['faultRecord'] = self.get_domain_l3_id_fault( + domain_info['name'], + 'faultRecord', + fault_filter=hfault_filter + ) + + if event_info: + domain_info['eventLog'] = self.get_domain_l3_id_event( + domain_info['name'], + event_filter=event_filter + ) + + if audit_info: + domain_info['auditLog'] = self.get_domain_l3_id_audit( + domain_info['name'], + audit_filter=audit_filter + ) + + domains.append(domain_info) + + domains = sorted( + domains, + key=lambda i: i['name'].lower() + ) + + return domains + + def get_domain_l3(self, domain_name, vlan_info=False, vlan_usage_info=False): + domain_filter = ['name:%s' % (domain_name)] + domains = self.get_domains_l3( + domain_filter=domain_filter, + vlan_info=vlan_info, + vlan_usage_info=vlan_usage_info + ) + if domains is None or len(domains) != 1: + return None + return domains[0] diff --git a/lib/aci/domain/l3/main.py b/lib/aci/domain/l3/main.py new file mode 100644 index 00000000..68946a27 --- /dev/null +++ b/lib/aci/domain/l3/main.py @@ -0,0 +1,23 @@ +from lib.aci.domain.l3.api import DomainL3Api +from lib.aci.domain.l3.info import DomainL3Info +from lib.aci.domain.l3.audit.main import DomainL3Audit +from lib.aci.domain.l3.event.main import DomainL3Event +from lib.aci.domain.l3.fault.main import DomainL3Fault +from lib.aci.domain.l3.node.main import DomainL3Node + + +class DomainL3( + DomainL3Api, + DomainL3Info, + DomainL3Audit, + DomainL3Event, + DomainL3Fault, + DomainL3Node + ): + def __init__(self): + DomainL3Api.__init__(self) + DomainL3Info.__init__(self) + DomainL3Audit.__init__(self) + DomainL3Event.__init__(self) + DomainL3Fault.__init__(self) + DomainL3Node.__init__(self) diff --git a/lib/aci/domain/l3/node/__init__.py b/lib/aci/domain/l3/node/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/l3/node/api.py b/lib/aci/domain/l3/node/api.py new file mode 100644 index 00000000..93d5ea3d --- /dev/null +++ b/lib/aci/domain/l3/node/api.py @@ -0,0 +1,61 @@ +class DomainL3NodeApi(): + def __init__(self): + self.domain_l3_node_mo = {} + + def get_domain_l3_node_mo(self, domain_name): + if domain_name in self.domain_l3_node_mo: + return self.domain_l3_node_mo[domain_name] + + key = domain_name + cache = self.get_object_cache( + 'l3extDomP.%s' % (key) + ) + if cache is not None: + self.domain_l3_node_mo[key] = cache + self.log.apic_mo( + 'l3extDomP.%s' % (key), + self.domain_l3_node_mo[key] + ) + return self.domain_l3_node_mo[key] + + distinguished_name = 'uni/l3dom-%s' % (domain_name) + query = 'rsp-subtree-include=full-deployment&target-node=all&target-path=ADomPToEthIf' + managed_objects = self.get_managed_object( + distinguished_name, + query=query, + node_mo=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_l3_node_mo', + 'API failed' + ) + return None + + if managed_objects['totalCount'] != '1': + self.log.error( + 'get_domain_l3_node_mo', + 'Unexpected object count' + ) + return None + + for managed_object in managed_objects['imdata']: + attributes = managed_object['l3extDomP']['attributes'] + attributes['pconsResourceCtx'] = self.get_mo_node_resource_ctx( + 'l3extDomP', + managed_object + ) + self.domain_l3_node_mo[key] = attributes + + self.log.apic_mo( + 'l3extDomP.%s' % (key), + self.domain_l3_node_mo[key] + ) + + self.set_object_cache( + 'l3extDomP.%s' % (key), + self.domain_l3_node_mo[key] + ) + + return self.domain_l3_node_mo[key] diff --git a/lib/aci/domain/l3/node/info.py b/lib/aci/domain/l3/node/info.py new file mode 100644 index 00000000..4c0b94c0 --- /dev/null +++ b/lib/aci/domain/l3/node/info.py @@ -0,0 +1,81 @@ +class DomainL3NodeInfo(): + def __init__(self): + self.domain_l3_node = {} + + def get_domain_l3_node_info(self, managed_object): + info = {} + info['__Output'] = {} + info['name'] = managed_object['name'] + + node = {} + info['interface'] = [] + for item in managed_object['pconsResourceCtx']: + node_name = self.get_node_name( + item['nodeId'] + ) + + if node_name not in node: + node[node_name] = {} + node[node_name]['node_id'] = item['nodeId'] + node[node_name]['interfaces'] = 0 + + port_info = {} + port_info['__Output'] = {} + port_info['pod_id'] = item['ctxDn'].split('/')[1].split('-')[1] + port_info['node_id'] = item['nodeId'] + port_info['node_name'] = self.get_node_name( + item['nodeId'] + ) + port_info['intf_type'] = item['ctxClass'] + # "topology/pod-1/node-2201/sys/l3s-[eth1/43]" + port_info['intf_name'] = item['ctxDn'].split('[')[1].split(']')[0] + info['interface'].append( + port_info + ) + + node[node_name]['interfaces'] = node[node_name]['interfaces'] + 1 + + info['node'] = [] + for key in node: + node_info = {} + node_info['id'] = node[key]['node_id'] + node_info['name'] = key + node_info['interfaces'] = node[key]['interfaces'] + info['node'].append( + node_info + ) + + info['node'] = sorted( + info['node'], + key=lambda i: i['name'] + ) + + info['interface'] = sorted( + info['interface'], + key=lambda i: ( + i['node_name'], + i['intf_name'] + ) + ) + + return info + + def get_domain_l3_node(self, domain_name): + if domain_name in self.domain_l3_node: + return self.domain_l3_node[domain_name] + + # one object or None value is expected + domain_nodes_mo = self.get_domain_l3_node_mo(domain_name) + if domain_nodes_mo is None: + return None + + self.domain_l3_node[domain_name] = self.get_domain_l3_node_info( + domain_nodes_mo + ) + + self.log.apic_mo( + 'l3extDomP.%s.info' % (domain_name), + self.domain_l3_node[domain_name] + ) + + return self.domain_l3_node[domain_name] diff --git a/lib/aci/domain/l3/node/main.py b/lib/aci/domain/l3/node/main.py new file mode 100644 index 00000000..c98bdd04 --- /dev/null +++ b/lib/aci/domain/l3/node/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.l3.node.api import DomainL3NodeApi +from lib.aci.domain.l3.node.info import DomainL3NodeInfo + + +class DomainL3Node(DomainL3NodeApi, DomainL3NodeInfo): + def __init__(self): + DomainL3NodeApi.__init__(self) + DomainL3NodeInfo.__init__(self) diff --git a/lib/aci/domain/l3/output.py b/lib/aci/domain/l3/output.py new file mode 100644 index 00000000..30894115 --- /dev/null +++ b/lib/aci/domain/l3/output.py @@ -0,0 +1,455 @@ +class DomainL3Output(): + def __init__(self): + pass + + def print_domains_l3(self, info, title=False): + if title: + self.my_output.default( + 'L3 Domain [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + for item in info: + item['fvnsEncapBlk'] = [] + if item['vlan_info'] is not None: + item['fvnsEncapBlk'] = item['vlan_info']['fvnsEncapBlk'] + + for item in info: + if len(item['aaaDomain']) == 0: + item['aaaDomain'].append('--') + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'vlan_info.allocMode', + 'fvnsEncapBlk.blockInfo', + 'aaaDomain' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Mode', + 'Encapsulation Block', + 'Sec Domain' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'fvnsEncapBlk', 'aaaDomain'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_l3_node(self, info, title=False): + if title: + self.my_output.default( + 'L3 Domain - Nodes [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'node.name', + 'node.interfaces' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Node', + 'Interfaces' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'node'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_l3_interface(self, info, title=False): + if title: + self.my_output.default( + 'L3 Domain - Interfaces [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'interface.node_name', + 'interface.intf_name' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Node', + 'Interface' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'interface'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_l3_vlan(self, info, title=False): + if title: + self.my_output.default( + 'L3 Domain - Interfaces VLAN [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + for item in info: + item['fvnsEncapBlk'] = [] + if item['vlan_info'] is not None: + item['fvnsEncapBlk'] = item['vlan_info']['fvnsEncapBlk'] + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'fvnsEncapBlk.blockInfo', + 'interface.node_name', + 'interface.intf_name', + 'interface.operSt', + 'interface.operMode', + 'interface.vlans' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Encapsulation Block', + 'Node', + 'Interface', + 'State', + 'Mode', + 'VLANs' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'interface', 'fvnsEncapBlk'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_l3_reln(self, info, title=False): + if title: + self.my_output.default( + 'L3 Domain - Policy Relationships [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'reln.type', + 'reln.name' + ] + + headers = [ + 'Faults', + 'Domain', + 'Policy Type', + 'Policy Name' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['reln'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_l3_event_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'L3 Domain - Event Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'L3 Domain - Event Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) + + def print_domains_l3_fault_inst(self, info, title=False): + if title: + self.my_output.default( + 'L3 Domain - Faults [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_domains_l3_fault_record(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'L3 Domain - Fault Records [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'L3 Domain - Fault Records last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_domains_l3_audit_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'L3 Domain - Audit Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'L3 Domain - Audit Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/domain/main.py b/lib/aci/domain/main.py new file mode 100644 index 00000000..bef52a33 --- /dev/null +++ b/lib/aci/domain/main.py @@ -0,0 +1,32 @@ +from lib.aci.domain.aaa.main import DomainAaa +from lib.aci.domain.l2.main import DomainL2 +from lib.aci.domain.l3.main import DomainL3 +from lib.aci.domain.phy.main import DomainPhy +from lib.aci.domain.vmm.main import DomainVmm + + +class Domain( + DomainAaa, + DomainL2, + DomainL3, + DomainPhy, + DomainVmm + ): + def __init__(self): + DomainAaa.__init__(self) + DomainL2.__init__(self) + DomainL3.__init__(self) + DomainPhy.__init__(self) + DomainVmm.__init__(self) + + def get_domain_type_from_tcl(self, domain_type): + mapping = {} + mapping['l3extDomP'] = 'L3' + mapping['physDomP'] = 'Physical' + mapping['l2extDomP'] = 'L2' + mapping['vmmDomP'] = 'VMM' + + if domain_type in mapping: + return mapping[domain_type] + + return domain_type diff --git a/lib/aci/domain/output.py b/lib/aci/domain/output.py new file mode 100644 index 00000000..ac12e700 --- /dev/null +++ b/lib/aci/domain/output.py @@ -0,0 +1,14 @@ +from lib.aci.domain.aaa.output import DomainAaaOutput +from lib.aci.domain.l2.output import DomainL2Output +from lib.aci.domain.l3.output import DomainL3Output +from lib.aci.domain.phy.output import DomainPhyOutput +from lib.aci.domain.vmm.output import DomainVmmOutput + + +class DomainOutput(DomainAaaOutput, DomainL2Output, DomainL3Output, DomainPhyOutput, DomainVmmOutput): + def __init__(self): + DomainAaaOutput.__init__(self) + DomainL2Output.__init__(self) + DomainL3Output.__init__(self) + DomainPhyOutput.__init__(self) + DomainVmmOutput.__init__(self) diff --git a/lib/aci/domain/phy/TODO.md b/lib/aci/domain/phy/TODO.md new file mode 100644 index 00000000..4f6b61ad --- /dev/null +++ b/lib/aci/domain/phy/TODO.md @@ -0,0 +1,8 @@ +Domain Physical +--------------- + +- context for vlan pool +- context for aaep +- context for node +- context for intf +- context for epg \ No newline at end of file diff --git a/lib/aci/domain/phy/__init__.py b/lib/aci/domain/phy/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/phy/__pycache__/__init__.cpython-310.pyc b/lib/aci/domain/phy/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0213b4bd1bbf458de84f8f3b18a053eda97858a2 GIT binary patch literal 150 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HevsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oL4JNtOj%B1UQB#^W?p7Ve7s&k7%o!KTcLhCLF zdi6WBN56z0Bv-$MVD-I>!ff$imSkUk@89peNmBLuF@cdj{U#sw2>Fhi?(kvr9Hv=< zh!z~_bsyXP>?9at0@Qb~rMq|*CLhQ9PAgMTIi@C|LUU5!Ov z?jD|OPV$U`!{322M%sdDkfJ10!eIqJx-+1*FP$r&9G>uT1pqUu7=0z0f$@(=TTjw= zqR7)MH(8ZR^IkJh*q>2J&*_X#p&x+Xn^LR?wBDI7K|Uhq9(8_u(Ak*> z2m{>1j(zcG{?rFQq8~etKn5~Id+f&nctIpzE-aI6^7iSBO~G@S$Y`0&0>~Uf9433` z{xp!ib>y<(kk}z{2U&E;Vh2eak~pM|(|1T8kt1>zO@nhv$?=BcHCM@5?{Zy(D?2uV zb{pvE?&$|@Cab2|ueDMe*P`kruDa zn?jU3W~JTLn4u$Y*7b@IqWzMu)adoVv%ztr^ofnjN-FL`+3N?Y=CXURPUFqpm-j~^ zFO;-lK9-^uHWqcQ^Zlk)#`fpZ+r>`);U6860RqFM%fK$WsOwJ@s8ZT%=2E&r zsPV$vz$Moa%2&st6bDNF;brWVc|a#%x31jD=p}C1BI)qMt1IKPe0$(yx%U@zKlW2~O{}-@Sci*03>i-*{&b z;LR_^SaEJ+4*ir(fpWt6aU+UWqw$8j$~x8JYolGs_+sHSXcm!(Ccef!JXY@iUrsh! NZ*x6!o_Ge9$Zrb#amD}u literal 0 HcmV?d00001 diff --git a/lib/aci/domain/phy/__pycache__/info.cpython-310.pyc b/lib/aci/domain/phy/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcf2c3a0fb6f35826949a133050573f228ee132d GIT binary patch literal 5405 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 literal 0 HcmV?d00001 diff --git a/lib/aci/domain/phy/__pycache__/main.cpython-310.pyc b/lib/aci/domain/phy/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cdabbd8abced9701377a8d6f47060cb6da40c209 GIT binary patch literal 942 zcmZuvy^ho{5VqrF<7BfZ9YW9?71cH=DG)+;I(|g6LZY)GSt0i7ESzLXc2`y=C}$C>rZKm?Bac2G?M< z5*2+Q%lHq(B1_sOuj(>4)%&Z%#m0cW80>e|x(3I|;JDZ+v%Tkez1P)!&zpQ_(R26A zs#dzdVB-NY^d&z8qKTl22v1SvT@%3+g9QC98Uhz|bQd{;bqT9I2iTGu`jvbKy|&)K z*ueaO1p}KMnIaI1u9jhg8FgGrQ<<%l4Mu2ugaBcN5CTAHeyi>J2WjSD-afm0o_)%# z$qLgJb*A)Q+sw4O+3O~==3|x@CR0x0Y;$$UQ0sJaXz}stK~vGf*e!GG3|3q zA;&b|7$=8#Jh5q@E1Wvw$;57sEs|o9PQ1x8AW`-I3~D=hW{qvszk||?vx!(0G**8E jKgLxwsvCc&!QwmqqL=F>c20W+kdTBPXUsf$H~H;9{DR-} literal 0 HcmV?d00001 diff --git a/lib/aci/domain/phy/__pycache__/output.cpython-310.pyc b/lib/aci/domain/phy/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..870b1dd479457a03bc5fecef57ce4979e923cd88 GIT binary patch literal 5196 zcmd5=PjlPG6~}@gNI;|{Tee~~jziaVGE5>iY3q!~b<@bQmAZ8qO{AtXDpL%ET}rSZ zfZhe=5<|~)#=iR0LvNkLH|0z8GqlIOHiz`=_M#cj^t}ZMk|G%?qf3dw4-bpow-4_> z7?sPm2EWyB|4zTDY1+T=X84zbn~&iX=K(&^s7A>%IG^fU8r3(nYR-f4kzckVgkh#_ z5vpzJlu-Sdww0r=QG@26ku3u#lNNx=168CJP$p0|odK!D$+}Ij?M#R!Pq%^ z9w-~e7U%__W`Md#7lA6#S&(K)&fSgnT|Zpk?R?sfTkY5*L&71A=PI1S0H7KyBK1Q6 zX$TfHxelWWj&82rYV5gz-|&3lMGeXhSkUkV;|Gj40)M;VdVYhd-5RakP9swL)mj}{ zbR0kQW5+>e0>L23rDKBC`jgf?)L8##0%5_aMEoZZU7gQ$wTIe6LP@N5$y2fjnujCz zJV&&2gc^G~e-mcDfiu4(H2)PL>gBrRuJ*-+C%GN1o1^A!#KIChX%l{!S|rs`}xxd;XlzUKy&R4tW1T)Qs5*gVvw)eb4+fgdtCyUm&rXHLi-?n z5=L-UvXHHyousj{a&P^}`uxF4y|Nxf zfix7C1tp+p2X5>~VdW08N$d^g^4zDi@yUc~FkP9f(V@HiT zqP@MxI)WEqt}JsH7p&!SH;%Z>$L@B(s;0E|J5K70vOt-7dzlMZC{4H3Vj-19n4l)h z68lrj4XG3OA{K`xM@N)~(qlgMwqlh{Ou!+cdT4N@WoDe6VI&J+F5MSY&ks%z0UZ8M!m^jCTwSEPsi-{fkl;4GSJ zWBZK+4{qKMo|j#?Ia~068=K(X5InSi?ylTCr`+5CH-`|R){YKt4vwC=xt+QBOg*`L z+|8FOb?~pAw{r}3jskN`!c~*cB0Yzo9OE2Ni50?%8oF#Ur%2E^<4xCN0#+>GKF z5f%Y3L@2oW{cN7%1`zX)zj?^(9nGlD#|6gIMxD7BR4zo;LESu%CL?muD;#I?GSR^39*}UrH zG`xdeGMt31%uDQg^4_?YtVeezW0xb}o-pI}K`^$)bCE$Duc?G|Fd^yRJ78g4c@XW4m^XQ6+$Dx)2Cj%J*Ly1l_4%+M?X=TT z2DJoy5pX~5Y)Zp}_?LOlZ3`v~9%m5IRGO3tk8eub+jYYow!z}f!-A^SGPl7Fq_L`2 zt>UVq(rUV@vgw1f%-qGLehd4?#9meFE5Lx?0b_793ve0~=F2c3FL1UW9WaOOx8jcD zML~N%6#NZbfc+xBf`Eml*XXGdFOA2$EIgsmUmh<)@aoX_1)$d>;P~<*0BG;Bmaq8A zG@-qN1Dn5I>o>L0(~13`E-|=Id!@j`&>F}s<|@mSLvt1yA1G{|!DGb%BY! z#so8~uLtxju+3N+>bLXaZ?O0OLmE=GW;h9rH2l}6 zH~^Fy55D0>v(WNMlcyvizK$0C3_<0CO{7!{`2Z6n@O)rS8Zgs)D{Q$ny TlbFcj?Nr8(kem98>%8_qec{&6 literal 0 HcmV?d00001 diff --git a/lib/aci/domain/phy/api.py b/lib/aci/domain/phy/api.py new file mode 100644 index 00000000..b52ea3b2 --- /dev/null +++ b/lib/aci/domain/phy/api.py @@ -0,0 +1,78 @@ +class DomainPhyApi(): + def __init__(self): + self.domain_phy_mo = None + + def get_domain_phy_mo(self): + if self.domain_phy_mo is not None: + return self.domain_phy_mo + + cache = self.get_object_cache( + 'physDomP' + ) + if cache is not None: + self.domain_phy_mo = cache + self.log.apic_mo( + 'physDomP', + self.domain_phy_mo + ) + return self.domain_phy_mo + + query = 'rsp-subtree=children&rsp-subtree-include=fault-count&rsp-subtree-class=infraRsVlanNs,infraRtDomP,infraRtDomAtt,aaaDomainRef' + managed_objects = self.get_class( + 'physDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_phy_mo', + 'API failed' + ) + return None + + self.domain_phy_mo = [] + + for managed_object in managed_objects['imdata']: + attributes = managed_object['physDomP']['attributes'] + attributes['infraRsVlanNs'] = self.get_mo_child_attributes( + 'physDomP', + managed_object, + 'infraRsVlanNs' + ) + attributes['infraRtDomP'] = self.get_mo_children_attributes( + 'physDomP', + managed_object, + 'infraRtDomP' + ) + attributes['infraRtDomAtt'] = self.get_mo_children_attributes( + 'physDomP', + managed_object, + 'infraRtDomAtt' + ) + attributes['aaaDomainRef'] = self.get_mo_children_attributes( + 'physDomP', + managed_object, + 'aaaDomainRef' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'physDomP', + managed_object, + 'faultCounts' + ) + + self.domain_phy_mo.append( + attributes + ) + + self.log.apic_mo( + 'physDomP', + self.domain_phy_mo + ) + + self.set_object_cache( + 'physDomP', + self.domain_phy_mo + ) + + return self.domain_phy_mo diff --git a/lib/aci/domain/phy/audit/__init__.py b/lib/aci/domain/phy/audit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/phy/audit/api.py b/lib/aci/domain/phy/audit/api.py new file mode 100644 index 00000000..8cb16419 --- /dev/null +++ b/lib/aci/domain/phy/audit/api.py @@ -0,0 +1,48 @@ +class DomainPhyAuditApi(): + def __init__(self): + self.domain_phy_audit_mo = None + + def get_domain_phy_audit_mo(self): + cache = self.get_object_cache( + 'physDomP.audit' + ) + if cache is not None: + self.domain_phy_audit_mo = cache + self.log.apic_mo( + 'physDomP.audit', + self.domain_phy_audit_mo + ) + return self.domain_phy_audit_mo + + query = 'rsp-subtree-include=audit-logs,no-scoped,subtree&order-by=aaaModLR.created|desc&page=0&page-size=%s' % (self.api_audit_limit) + managed_objects = self.get_class( + 'physDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_phy_audit_mo', + 'API failed' + ) + return None + + self.domain_phy_audit_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['aaaModLR']['attributes'] + self.domain_phy_audit_mo.append( + attributes + ) + + self.log.apic_mo( + 'physDomP.audit', + self.domain_phy_audit_mo + ) + + self.set_object_cache( + 'physDomP.audit', + self.domain_phy_audit_mo + ) + + return self.domain_phy_audit_mo diff --git a/lib/aci/domain/phy/audit/info.py b/lib/aci/domain/phy/audit/info.py new file mode 100644 index 00000000..928547ab --- /dev/null +++ b/lib/aci/domain/phy/audit/info.py @@ -0,0 +1,97 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class DomainPhyAuditInfo(): + def __init__(self): + self.domain_phy_audit = None + + def get_domain_phy_audit_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['domainName'] = None + if 'uni/phys-' in info['affected']: + info['domainName'] = info['affected'].split('uni/phys-')[1].split('/')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_domain_phy_audit(self): + if self.domain_phy_audit is not None: + return self.domain_phy_audit + + managed_objects = self.get_domain_phy_audit_mo() + if managed_objects is None: + return None + + self.domain_phy_audit = [] + for managed_object in managed_objects: + audit_info = self.get_domain_phy_audit_info( + managed_object + ) + self.domain_phy_audit.append( + audit_info + ) + + self.log.apic_mo( + 'physDomP.auditRecord.info', + self.domain_phy_audit + ) + + return self.domain_phy_audit + + def get_domain_phy_id_audit(self, domain_name, audit_filter=None): + audits = [] + + all_audits = self.get_domain_phy_audit() + if all_audits is None: + return audits + + for audit_info in all_audits: + if audit_info['domainName'] is not None: + if audit_info['domainName'] == domain_name: + if not self.match_system_fault(audit_info, audit_filter, exclude_cleared=False): + continue + + audits.append( + audit_info + ) + + return audits diff --git a/lib/aci/domain/phy/audit/main.py b/lib/aci/domain/phy/audit/main.py new file mode 100644 index 00000000..0f0ea2b9 --- /dev/null +++ b/lib/aci/domain/phy/audit/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.phy.audit.api import DomainPhyAuditApi +from lib.aci.domain.phy.audit.info import DomainPhyAuditInfo + + +class DomainPhyAudit(DomainPhyAuditApi, DomainPhyAuditInfo): + def __init__(self): + DomainPhyAuditApi.__init__(self) + DomainPhyAuditInfo.__init__(self) diff --git a/lib/aci/domain/phy/event/__init__.py b/lib/aci/domain/phy/event/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/phy/event/api.py b/lib/aci/domain/phy/event/api.py new file mode 100644 index 00000000..8539cf00 --- /dev/null +++ b/lib/aci/domain/phy/event/api.py @@ -0,0 +1,51 @@ +class DomainPhyEventApi(): + def __init__(self): + self.domain_phy_event_mo = None + + def get_domain_phy_event_mo(self): + if self.domain_phy_event_mo is not None: + return self.domain_phy_event_mo + + cache = self.get_object_cache( + 'physDomP.eventLog' + ) + if cache is not None: + self.domain_phy_event_mo = cache + self.log.apic_mo( + 'physDomP.eventLog', + self.domain_phy_event_mo + ) + return self.domain_phy_event_mo + + query = 'rsp-subtree-include=event-logs,no-scoped,subtree&order-by=eventRecord.created|desc&page=0&page-size=%s' % (self.api_event_limit) + managed_objects = self.get_class( + 'physDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_phy_event_mo', + 'API failed' + ) + return None + + self.domain_phy_event_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['eventRecord']['attributes'] + self.domain_phy_event_mo.append( + attributes + ) + + self.log.apic_mo( + 'physDomP.eventLog', + self.domain_phy_event_mo + ) + + self.set_object_cache( + 'physDomP.eventLog', + self.domain_phy_event_mo + ) + + return self.domain_phy_event_mo diff --git a/lib/aci/domain/phy/event/info.py b/lib/aci/domain/phy/event/info.py new file mode 100644 index 00000000..662eca37 --- /dev/null +++ b/lib/aci/domain/phy/event/info.py @@ -0,0 +1,107 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class DomainPhyEventInfo(): + def __init__(self): + self.domain_phy_event = None + + def get_domain_phy_event_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['domainName'] = None + if 'affected' in info: + if 'uni/phys-' in info['affected']: + info['domainName'] = info['affected'].split('uni/phys-')[1].split('/')[0] + + if 'affected' not in info and 'dn' in info: + if 'uni/phys-' in info['dn']: + info['domainName'] = info['dn'].split('uni/phys-')[1].split('/')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_domain_phy_event(self, deduplicate=True): + if self.domain_phy_event is not None: + return self.domain_phy_event + + managed_objects = self.get_domain_phy_event_mo() + if managed_objects is None: + return None + + self.domain_phy_event = [] + transaction_ids = [] + for managed_object in managed_objects: + event_info = self.get_domain_phy_event_info( + managed_object + ) + if not deduplicate or event_info['txId'] not in transaction_ids: + self.domain_phy_event.append( + event_info + ) + transaction_ids.append( + event_info['txId'] + ) + + self.log.apic_mo( + 'physDomP.eventLog.info', + self.domain_phy_event + ) + + return self.domain_phy_event + + def get_domain_phy_id_event(self, domain_name, event_filter=None): + events = [] + + all_events = self.get_domain_phy_event() + if all_events is None: + return events + + for event_info in all_events: + if event_info['domainName'] is not None: + if event_info['domainName'] == domain_name: + if not self.match_system_fault(event_info, event_filter): + continue + + events.append( + event_info + ) + + return events diff --git a/lib/aci/domain/phy/event/main.py b/lib/aci/domain/phy/event/main.py new file mode 100644 index 00000000..1c8ac988 --- /dev/null +++ b/lib/aci/domain/phy/event/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.phy.event.api import DomainPhyEventApi +from lib.aci.domain.phy.event.info import DomainPhyEventInfo + + +class DomainPhyEvent(DomainPhyEventApi, DomainPhyEventInfo): + def __init__(self): + DomainPhyEventApi.__init__(self) + DomainPhyEventInfo.__init__(self) diff --git a/lib/aci/domain/phy/fault/__init__.py b/lib/aci/domain/phy/fault/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/phy/fault/api.py b/lib/aci/domain/phy/fault/api.py new file mode 100644 index 00000000..a85b7e88 --- /dev/null +++ b/lib/aci/domain/phy/fault/api.py @@ -0,0 +1,112 @@ +class DomainPhyFaultApi(): + def __init__(self): + self.domain_phy_fault_mo = None + self.domain_phy_fault_record_mo = None + + def get_domain_phy_fault_mo(self): + cache = self.get_object_cache( + 'physDomP.fault' + ) + if cache is not None: + self.domain_phy_fault_mo = cache + self.log.apic_mo( + 'physDomP.fault', + self.domain_phy_fault_mo + ) + return self.domain_phy_fault_mo + + query = 'rsp-subtree-include=faults,no-scoped,subtree' + managed_objects = self.get_class( + 'physDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_phy_fault_mo', + 'API failed' + ) + return None + + self.domain_phy_fault_mo = [] + for managed_object in managed_objects['imdata']: + if 'faultInst' in managed_object: + attributes = managed_object['faultInst']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = True + + self.domain_phy_fault_mo.append( + attributes + ) + + self.log.apic_mo( + 'physDomP.fault', + self.domain_phy_fault_mo + ) + + self.set_object_cache( + 'physDomP.fault', + self.domain_phy_fault_mo + ) + + return self.domain_phy_fault_mo + + def get_domain_phy_fault_record_mo(self): + cache = self.get_object_cache( + 'physDomP.faultRecord' + ) + if cache is not None: + self.domain_phy_fault_record_mo = cache + self.log.apic_mo( + 'physDomP.faultRecord', + self.domain_phy_fault_record_mo + ) + return self.domain_phy_fault_record_mo + + query = 'rsp-subtree-include=fault-records,no-scoped,subtree&order-by=faultRecord.created|desc&page=0&page-size=%s' % (self.api_fault_limit) + managed_objects = self.get_class( + 'physDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_phy_fault_record_mo', + 'API failed' + ) + return None + + self.domain_phy_fault_record_mo = [] + for managed_object in managed_objects['imdata']: + if 'faultRecord' in managed_object: + attributes = managed_object['faultRecord']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = True + + self.domain_phy_fault_record_mo.append( + attributes + ) + + self.log.apic_mo( + 'physDomP.faultRecord', + self.domain_phy_fault_record_mo + ) + + self.set_object_cache( + 'physDomP.faultRecord', + self.domain_phy_fault_record_mo + ) + + return self.domain_phy_fault_record_mo diff --git a/lib/aci/domain/phy/fault/info.py b/lib/aci/domain/phy/fault/info.py new file mode 100644 index 00000000..849c91fc --- /dev/null +++ b/lib/aci/domain/phy/fault/info.py @@ -0,0 +1,139 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class DomainPhyFaultInfo(): + def __init__(self): + self.domain_phy_fault = None + self.domain_phy_fault_record = None + + def get_domain_phy_fault_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['domainName'] = None + + if not managed_object['delegated']: + if 'affected' in info: + if 'uni/phys-' in info['affected']: + info['domainName'] = info['affected'].split('uni/phys-')[1].split('/')[0] + + # "dn": "topology/pod-1/node-2208/sys/inst-overlay-1/lb-[lo0]" + if info['domainName'] is None: + if 'uni/phys-' in info['dn']: + info['domainName'] = info['dn'].split('uni/phys-')[1].split('/')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_domain_phy_fault(self): + if self.domain_phy_fault is not None: + return self.domain_phy_fault + + managed_objects = self.get_domain_phy_fault_mo() + if managed_objects is None: + return None + + self.domain_phy_fault = [] + for managed_object in managed_objects: + fault_info = self.get_domain_phy_fault_info( + managed_object + ) + self.domain_phy_fault.append( + fault_info + ) + + self.log.apic_mo( + 'physDomP.fault.info', + self.domain_phy_fault + ) + + return self.domain_phy_fault + + def get_domain_phy_fault_record(self, deduplicate=True): + if self.domain_phy_fault_record is not None: + return self.domain_phy_fault_record + + managed_objects = self.get_domain_phy_fault_record_mo() + if managed_objects is None: + return None + + self.domain_phy_fault_record = [] + fault_ids = [] + + for managed_object in managed_objects: + fault_info = self.get_domain_phy_fault_info( + managed_object + ) + if not deduplicate or fault_info['id'] not in fault_ids: + self.domain_phy_fault_record.append( + fault_info + ) + fault_ids.append( + fault_info['id'] + ) + + self.log.apic_mo( + 'physDomP.faultRecord.info', + self.domain_phy_fault_record + ) + + return self.domain_phy_fault_record + + def get_domain_phy_id_fault(self, domain_name, fault_object, fault_filter=None): + faults = [] + + if fault_object == 'faultInst': + all_faults = self.get_domain_phy_fault() + if all_faults is None: + return faults + + fault_filter = self.remove_system_fault_timestamp_filter( + fault_filter + ) + + if fault_object == 'faultRecord': + all_faults = self.get_domain_phy_fault_record() + if all_faults is None: + return faults + + for fault_info in all_faults: + if fault_info['domainName'] is not None: + if fault_info['domainName'] == domain_name: + if not self.match_system_fault(fault_info, fault_filter, exclude_cleared=False): + continue + + faults.append( + fault_info + ) + + return faults diff --git a/lib/aci/domain/phy/fault/main.py b/lib/aci/domain/phy/fault/main.py new file mode 100644 index 00000000..8e621eaf --- /dev/null +++ b/lib/aci/domain/phy/fault/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.phy.fault.api import DomainPhyFaultApi +from lib.aci.domain.phy.fault.info import DomainPhyFaultInfo + + +class DomainPhyFault(DomainPhyFaultApi, DomainPhyFaultInfo): + def __init__(self): + DomainPhyFaultApi.__init__(self) + DomainPhyFaultInfo.__init__(self) diff --git a/lib/aci/domain/phy/info.py b/lib/aci/domain/phy/info.py new file mode 100644 index 00000000..abc28bf2 --- /dev/null +++ b/lib/aci/domain/phy/info.py @@ -0,0 +1,319 @@ +from lib import filter_helper + + +class DomainPhyInfo(): + def __init__(self): + self.domain_phy = None + + def get_domain_phy_info(self, managed_object): + keys = [ + 'dn', + 'name' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['aaep_names'] = [] + if 'infraRtDomP' in managed_object: + if managed_object['infraRtDomP'] is not None: + for item in managed_object['infraRtDomP']: + # "tCl": "infraAttEntityP", + # "tDn": "uni/infra/attentp-UCSB1-R3DC_AAEP" + if item['tCl'] == 'infraAttEntityP': + info['aaep_names'].append( + item['tDn'].split('/')[2][8:] + ) + + info['reln'] = [] + if 'infraRtDomP' in managed_object: + if managed_object['infraRtDomP'] is not None: + for item in managed_object['infraRtDomP']: + # "tCl": "infraAttEntityP", + # "tDn": "uni/infra/attentp-UCSB1-R3DC_AAEP" + if item['tCl'] == 'infraAttEntityP': + reln_info = {} + reln_info['tCl'] = item['tCl'] + reln_info['tDn'] = item['tDn'] + reln_info['type'] = 'AAEP' + reln_info['name'] = item['tDn'].split('/')[2][8:] + info['reln'].append( + reln_info + ) + continue + + self.log.error( + 'get_domain_phy_info', + 'Unsupported infraRtDomP tCl: %s' % (item['tCl']) + ) + + if 'infraRtDomAtt' in managed_object: + if managed_object['infraRtDomAtt'] is not None: + for item in managed_object['infraRtDomAtt']: + # "tCl": "fvAEPg", + # "tDn": "uni/tn-k8s/ap-k8s_ANP/epg-site1_pe" + if item['tCl'] == 'fvAEPg': + reln_info = {} + reln_info['tCl'] = item['tCl'] + reln_info['tDn'] = item['tDn'] + reln_info['type'] = 'Application EPG' + reln_info['name'] = self.get_epg_name_from_dn( + item['tDn'] + ) + info['reln'].append( + reln_info + ) + continue + + self.log.error( + 'get_domain_phy_info', + 'Unsupported infraRtDomAtt tCl: %s' % (item['tCl']) + ) + + info['reln'] = sorted( + info['reln'], + key=lambda i: ( + i['tCl'], + i['tDn'] + ) + ) + + info['vlan'] = None + if 'infraRsVlanNs' in managed_object: + if managed_object['infraRsVlanNs'] is not None: + if managed_object['infraRsVlanNs']['tCl'] == 'fvnsVlanInstP': + info['vlan'] = managed_object['infraRsVlanNs']['tDn'].split('vlanns-[')[1].split(']')[0] + + info['aaaDomain'] = [] + for item in managed_object['aaaDomainRef']: + info['aaaDomain'].append( + item['name'] + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_domains_phy_info(self): + if self.domain_phy is not None: + return self.domain_phy + + domains_mo = self.get_domain_phy_mo() + if domains_mo is None: + return None + + self.domain_phy = [] + for managed_object in domains_mo: + self.domain_phy.append( + self.get_domain_phy_info( + managed_object + ) + ) + + self.log.apic_mo( + 'physDomP.info', + self.domain_phy + ) + + return self.domain_phy + + def match_domain_phy(self, domain_info, domain_filter): + if domain_filter is None or len(domain_filter) == 0: + return True + + for aepg_rule in domain_filter: + (key, value) = aepg_rule.split(':') + key_found = False + + if key == 'name': + key_found = True + if not filter_helper.match_string(value, domain_info['name']): + return False + + if key == 'aaep': + key_found = True + found = False + for aaep_name in domain_info['aaep_names']: + if filter_helper.match_string(value, aaep_name): + found = True + + if not found: + return False + + if key == 'pool': + key_found = True + if not filter_helper.match_string(value, domain_info['vlan']): + return False + + if key == 'vlan': + key_found = True + if 'vlan_block' in domain_info: + found = False + for vlan_block in domain_info['vlan_block']: + if filter_helper.match_integer(vlan_block, value): + found = True + + if not found: + return False + + if key == 'fault': + key_found = True + if value == 'any': + if not domain_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_domain_phy', + 'Unsupported fault filtering value: %s' % (value) + ) + + if not key_found: + self.log.error( + 'match_domain_phy', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_domains_phy( + self, + domain_filter=None, + vlan_info=False, + vlan_usage_info=False, + node_info=False, + intf_vlan_info=False, + fault_info=False, + hfault_info=False, + event_info=False, + audit_info=False, + hfault_filter=None, + event_filter=None, + audit_filter=None + ): + all_domains = self.get_domains_phy_info() + + domains = [] + + for domain_info in all_domains: + if not self.match_domain_phy(domain_info, domain_filter): + continue + + if vlan_info: + domain_info['vlan_info'] = None + domain_info['vlan_block'] = [] + if domain_info['vlan'] is not None: + domain_info['vlan_info'] = self.get_pool_vlan( + domain_info['vlan'], + vlan_usage_info=vlan_usage_info, + domain_name=domain_info['name'] + ) + if domain_info['vlan_info'] is not None: + for vlan_block in domain_info['vlan_info']['fvnsEncapBlk']: + domain_info['vlan_block'].append( + '%s-%s' % ( + vlan_block['fromVlan'], + vlan_block['toVlan'] + ) + ) + + if not self.match_domain_phy(domain_info, domain_filter): + continue + + if node_info: + domain_node_info = self.get_domain_phy_node( + domain_info['name'] + ) + domain_info['node'] = None + domain_info['interface'] = None + if domain_node_info is not None: + domain_info['node'] = domain_node_info['node'] + domain_info['interface'] = domain_node_info['interface'] + + if intf_vlan_info: + if domain_info['interface'] is not None: + for interface in domain_info['interface']: + interface['vlan'] = [] + interface['operSt'] = '--' + interface['operMode'] = '--' + + if interface['intf_type'] == 'l1PhysIf': + interface_info = self.get_interface_phy( + interface['pod_id'], + interface['node_id'], + interface['intf_name'], + epg_stats_info=True + ) + if interface_info is not None: + interface['operSt'] = interface_info['stats']['operSt'] + interface['__Output']['operSt'] = interface_info['stats']['__Output']['operSt'] + interface['operMode'] = interface_info['stats']['operMode'] + for intf_epg_stats in interface_info['epg_stats']: + if intf_epg_stats['vlan'] is not None: + if intf_epg_stats['vlan']['evlan'] not in interface['vlan']: + interface['vlan'].append( + intf_epg_stats['vlan']['evlan'] + ) + + interface['vlan'] = sorted( + interface['vlan'] + ) + interface['vlans'] = filter_helper.get_range_from_values( + interface['vlan'] + ) + + if fault_info: + domain_info['faultInst'] = self.get_domain_phy_id_fault( + domain_info['name'], + 'faultInst' + ) + + if hfault_info: + domain_info['faultRecord'] = self.get_domain_phy_id_fault( + domain_info['name'], + 'faultRecord', + fault_filter=hfault_filter + ) + + if event_info: + domain_info['eventLog'] = self.get_domain_phy_id_event( + domain_info['name'], + event_filter=event_filter + ) + + if audit_info: + domain_info['auditLog'] = self.get_domain_phy_id_audit( + domain_info['name'], + audit_filter=audit_filter + ) + + domains.append(domain_info) + + domains = sorted( + domains, + key=lambda i: i['name'].lower() + ) + + return domains + + def get_domain_phy(self, domain_name, vlan_info=False, vlan_usage_info=False): + domain_filter = ['name:%s' % (domain_name)] + domains = self.get_domains_phy( + domain_filter=domain_filter, + vlan_info=vlan_info, + vlan_usage_info=vlan_usage_info + ) + if domains is None or len(domains) != 1: + return None + return domains[0] diff --git a/lib/aci/domain/phy/main.py b/lib/aci/domain/phy/main.py new file mode 100644 index 00000000..a3c88730 --- /dev/null +++ b/lib/aci/domain/phy/main.py @@ -0,0 +1,23 @@ +from lib.aci.domain.phy.api import DomainPhyApi +from lib.aci.domain.phy.info import DomainPhyInfo +from lib.aci.domain.phy.audit.main import DomainPhyAudit +from lib.aci.domain.phy.event.main import DomainPhyEvent +from lib.aci.domain.phy.fault.main import DomainPhyFault +from lib.aci.domain.phy.node.main import DomainPhyNode + + +class DomainPhy( + DomainPhyApi, + DomainPhyInfo, + DomainPhyAudit, + DomainPhyEvent, + DomainPhyFault, + DomainPhyNode + ): + def __init__(self): + DomainPhyApi.__init__(self) + DomainPhyInfo.__init__(self) + DomainPhyAudit.__init__(self) + DomainPhyEvent.__init__(self) + DomainPhyFault.__init__(self) + DomainPhyNode.__init__(self) diff --git a/lib/aci/domain/phy/node/__init__.py b/lib/aci/domain/phy/node/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/phy/node/api.py b/lib/aci/domain/phy/node/api.py new file mode 100644 index 00000000..28a78ec0 --- /dev/null +++ b/lib/aci/domain/phy/node/api.py @@ -0,0 +1,61 @@ +class DomainPhyNodeApi(): + def __init__(self): + self.domain_phy_node_mo = {} + + def get_domain_phy_node_mo(self, domain_name): + if domain_name in self.domain_phy_node_mo: + return self.domain_phy_node_mo[domain_name] + + key = domain_name + cache = self.get_object_cache( + 'physDomP.%s' % (key) + ) + if cache is not None: + self.domain_phy_node_mo[key] = cache + self.log.apic_mo( + 'physDomP.%s' % (key), + self.domain_phy_node_mo[key] + ) + return self.domain_phy_node_mo[key] + + distinguished_name = 'uni/phys-%s' % (domain_name) + query = 'rsp-subtree-include=full-deployment&target-node=all&target-path=ADomPToEthIf' + managed_objects = self.get_managed_object( + distinguished_name, + query=query, + node_mo=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_phy_node_mo', + 'API failed' + ) + return None + + if managed_objects['totalCount'] != '1': + self.log.error( + 'get_domain_phy_node_mo', + 'Unexpected object count' + ) + return None + + for managed_object in managed_objects['imdata']: + attributes = managed_object['physDomP']['attributes'] + attributes['pconsResourceCtx'] = self.get_mo_node_resource_ctx( + 'physDomP', + managed_object + ) + self.domain_phy_node_mo[key] = attributes + + self.log.apic_mo( + 'physDomP.%s' % (key), + self.domain_phy_node_mo[key] + ) + + self.set_object_cache( + 'physDomP.%s' % (key), + self.domain_phy_node_mo[key] + ) + + return self.domain_phy_node_mo[key] diff --git a/lib/aci/domain/phy/node/info.py b/lib/aci/domain/phy/node/info.py new file mode 100644 index 00000000..c3768710 --- /dev/null +++ b/lib/aci/domain/phy/node/info.py @@ -0,0 +1,81 @@ +class DomainPhyNodeInfo(): + def __init__(self): + self.domain_phy_node = {} + + def get_domain_phy_node_info(self, managed_object): + info = {} + info['__Output'] = {} + info['name'] = managed_object['name'] + + node = {} + info['interface'] = [] + for item in managed_object['pconsResourceCtx']: + node_name = self.get_node_name( + item['nodeId'] + ) + + if node_name not in node: + node[node_name] = {} + node[node_name]['node_id'] = item['nodeId'] + node[node_name]['interfaces'] = 0 + + port_info = {} + port_info['__Output'] = {} + port_info['pod_id'] = item['ctxDn'].split('/')[1].split('-')[1] + port_info['node_id'] = item['nodeId'] + port_info['node_name'] = self.get_node_name( + item['nodeId'] + ) + port_info['intf_type'] = item['ctxClass'] + # "topology/pod-1/node-2201/sys/phys-[eth1/43]" + port_info['intf_name'] = item['ctxDn'].split('[')[1].split(']')[0] + info['interface'].append( + port_info + ) + + node[node_name]['interfaces'] = node[node_name]['interfaces'] + 1 + + info['node'] = [] + for key in node: + node_info = {} + node_info['id'] = node[key]['node_id'] + node_info['name'] = key + node_info['interfaces'] = node[key]['interfaces'] + info['node'].append( + node_info + ) + + info['node'] = sorted( + info['node'], + key=lambda i: i['name'] + ) + + info['interface'] = sorted( + info['interface'], + key=lambda i: ( + i['node_name'], + i['intf_name'] + ) + ) + + return info + + def get_domain_phy_node(self, domain_name): + if domain_name in self.domain_phy_node: + return self.domain_phy_node[domain_name] + + # one object or None value is expected + domain_nodes_mo = self.get_domain_phy_node_mo(domain_name) + if domain_nodes_mo is None: + return None + + self.domain_phy_node[domain_name] = self.get_domain_phy_node_info( + domain_nodes_mo + ) + + self.log.apic_mo( + 'physDomP.%s.info' % (domain_name), + self.domain_phy_node[domain_name] + ) + + return self.domain_phy_node[domain_name] diff --git a/lib/aci/domain/phy/node/main.py b/lib/aci/domain/phy/node/main.py new file mode 100644 index 00000000..55e1fea2 --- /dev/null +++ b/lib/aci/domain/phy/node/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.phy.node.api import DomainPhyNodeApi +from lib.aci.domain.phy.node.info import DomainPhyNodeInfo + + +class DomainPhyNode(DomainPhyNodeApi, DomainPhyNodeInfo): + def __init__(self): + DomainPhyNodeApi.__init__(self) + DomainPhyNodeInfo.__init__(self) diff --git a/lib/aci/domain/phy/output.py b/lib/aci/domain/phy/output.py new file mode 100644 index 00000000..a5a9bfef --- /dev/null +++ b/lib/aci/domain/phy/output.py @@ -0,0 +1,455 @@ +class DomainPhyOutput(): + def __init__(self): + pass + + def print_domains_phy(self, info, title=False): + if title: + self.my_output.default( + 'Physical Domain [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + for item in info: + item['fvnsEncapBlk'] = [] + if item['vlan_info'] is not None: + item['fvnsEncapBlk'] = item['vlan_info']['fvnsEncapBlk'] + + for item in info: + if len(item['aaaDomain']) == 0: + item['aaaDomain'].append('--') + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'vlan_info.allocMode', + 'fvnsEncapBlk.blockInfo', + 'aaaDomain' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Mode', + 'Encapsulation Block', + 'Sec Domain' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'fvnsEncapBlk', 'aaaDomain'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_phy_node(self, info, title=False): + if title: + self.my_output.default( + 'Physical Domain - Node [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'node.name', + 'node.interfaces' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Node', + 'Interfaces' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'node'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_phy_interface(self, info, title=False): + if title: + self.my_output.default( + 'Physical Domain - Interfaces [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'interface.node_name', + 'interface.intf_name' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Node', + 'Interface' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'interface'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_phy_vlan(self, info, title=False): + if title: + self.my_output.default( + 'Physical Domain - Interfaces VLAN [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + for item in info: + item['fvnsEncapBlk'] = [] + if item['vlan_info'] is not None: + item['fvnsEncapBlk'] = item['vlan_info']['fvnsEncapBlk'] + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'fvnsEncapBlk.blockInfo', + 'interface.node_name', + 'interface.intf_name', + 'interface.operSt', + 'interface.operMode', + 'interface.vlans' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Encapsulation Block', + 'Node', + 'Interface', + 'State', + 'Mode', + 'VLANs' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'interface', 'fvnsEncapBlk'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_phy_reln(self, info, title=False): + if title: + self.my_output.default( + 'Physical Domain - Policy Relationships [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'reln.type', + 'reln.name' + ] + + headers = [ + 'Faults', + 'Domain', + 'Policy Type', + 'Policy Name' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['reln'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_phy_event_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Physical Domain - Event Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Physical Domain - Event Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) + + def print_domains_phy_fault_inst(self, info, title=False): + if title: + self.my_output.default( + 'Physical Domain - Faults [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_domains_phy_fault_record(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Physical Domain - Fault Records [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Physical Domain - Fault Records last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_domains_phy_audit_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Physical Domain - Audit Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Physical Domain - Audit Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/domain/vmm/__init__.py b/lib/aci/domain/vmm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/vmm/__pycache__/__init__.cpython-310.pyc b/lib/aci/domain/vmm/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0213b4bd1bbf458de84f8f3b18a053eda97858a2 GIT binary patch literal 150 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HevsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oL4JNtOj%B1UQB#^W?p7Ve7s&k>PmH90*x|4fP{q9Xp$W)&;(7?L5NM%nm`t%2FoeC6KCqtv8#d- zb+2Z&^AE{x*zgg2hPV6$(#&wLixJfWOWd;i`rOy?wd>ZyVM1U${Oot}MM}sYxakic zHcw!h9az32f(ZHo=5sG2!aE@&KL>nec(8i{(|iPrBpDSX^8^*%3zGT57XkbSA_U*a zrbl(jRdrgHhjW!vaCkRR#z#}5J4M1RIG5eM10F3|q za{Tr5886f{S0=BgLSD;as*KdvQcnwYHs!gRb`ho!Van%fe|}?Q##E&m#xS+PC84(; z_DSx)vshspfhA7I_GjR}AeX?kr8-9G1on4S(0jV13#bR+pDZYz2ejUuFF?K|_a1eA zCs5g?2S@<8hZTG2Fa3oNenfxeJVFtQ2<@>R=imjAe6hAmj>u1J87#namxy?mEJMf~ zL7YGg?)^n529J@;nnMzYBo66p)*Z6mvq>G2_K=}NhCQzhhivq0HXX9rL$(~U)$`hR z$TlLE_mq;W19!fairfv}ug_@b*sj5~!Np8&f752ZXWFwyOL>rAs6uF2ecl82 zRFxO4kOwo~7R_E>w^g&E&kJtMfvRSjKW#APBZ&RuyinD%$+)hXN1e)?7Q8w(PHFUE zo;$m7qYLe%)01CRlV42gLghEkk8|F=ou_h!Zr{!)M?Z`_8(y_i-`J$8g=8+f-9DEM z6a6QBn;cHQ|8&MxA%%@pDR{$e!kb2`v$l~Y`v4;TD`%D<_l{n+v3d@>-aBJ90A)ws z4p$Cn(?0JE3ys9>x~tz9%V$Q3#;?O}A?^C?QsxcId43_SU)1Mz4Zf!wK1(}5eRsl8 zYF%sl0Fkn0?xxs3$FUFl3b?|)F5>gKtc2Y%@1+|>8atE?U2+|xyjk*!pG)yKFJm`W z0S$ewYZI2&eyApC!&2;xO=qoCt~(H)=g_T%n(ox1+Hj|E(LLdT;JTUy0S$(T(T)Lpa%$|+-4 xEiXEa#@6L3&=mwbXs1cnCmTQRa(&}G@vZETzW@{cuciP1 literal 0 HcmV?d00001 diff --git a/lib/aci/domain/vmm/__pycache__/info.cpython-310.pyc b/lib/aci/domain/vmm/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e75154346bd790e4422d7bde8d09fb7a36f3cf6d GIT binary patch literal 6471 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 XO%_=ff$tGY+p`ooV-i-aH3s7ZcKaEC6HXP; zlu?S@QI2+*Yq+aC?K9tSPmOfI0>gb3>WD>#k5sJ3Y;1U-5}mTt@K8jVuc+3-^o@ zNKfapsKF|CVNu9Ru8X3f-=-1I5mYMo=lvekzMhw3)$_6Q)R{cl1)9$R6ueQk5l3kt1D zEsA0n7lp3*Mj=m%;&M}}?!;VdO6$P{ax^&Pn6<_Cg(QiMXFj{Z?m(Rx)R}d4W>9BV zuA~u%-5ofTFkVJ0_F&+aPmp+-vfa3E%3r>_e{x!JveK(V^$BCr>O=|J)7e>!Z{ zV9XL{wz~&A$?gwis$hz{5bU!NrzascyFndy;nPm}XE>(qBY=b?wExAfLl3|3_dk3G B5wQRO literal 0 HcmV?d00001 diff --git a/lib/aci/domain/vmm/__pycache__/output.cpython-310.pyc b/lib/aci/domain/vmm/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f80ead088d4c4a70975459d41e1bb0b462c20bd GIT binary patch literal 7229 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 YLFFwDo80`A(wtN~kh#T7K!Sw<0C4Oj+5i9m literal 0 HcmV?d00001 diff --git a/lib/aci/domain/vmm/epg/__pycache__/api.cpython-310.pyc b/lib/aci/domain/vmm/epg/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4be936180afd75f4b7e0220e31caacba329c8f13 GIT binary patch literal 1042 zcmZuw&1&2*5SCzd6^1BC_(ErlNTl1oo5r6eSww1*H#>0xmZiluD5wbzd14K#R9 zO^T1JAv#rf*FrS^UaJujmnjkn7}&yaiO1wg#5wH-4(!Q8^mpZ zdPg+T^aA8N8xqZq$RJ3;zpxnWwn5wzP=*YtCPSvFW*1}_=skguWVGmf@uMYP<0<-a?)JCSca?U>*nOgow|9QM~`2N|6%5tN<$O^4$ zz za?4=i$%mZCvuXzVHHl<$fZT9C7jhyF33uC#l z$TpmeWpCDLa%N~!)z%lFQUDKKCPY8Yv-^V z8#48$oX^E3wJprePn=}`)Dz=$hJ7nng|=l<-y3;Z>wA+4th-D;lULSF^+xMQ|Cpza z^dF6XKtJ;GYKOxAWS9+xSz!fn&mZhjJPUg>^5aL+t@=@v^d2WNKqha+en0FL4K4S8 zCVmXI-ts$pl)ig}lfuq|*pIV4N)or?4+b5-AM8<@6cr>L^+wK(^p5_y^-}u5U;t3K zcAEJa^s~|VlDnoi$5;}NYR?`&zE&osTPrj9>DC}9_IXlV2pNy8ea)d9-&zceo>(d|uSWC!AivZT;5%tJ|0>U*YgsA^1Gr+Phh68d4>1TB9#d zLGJ^bPE-)`J{?9Qu?r?=FDVXX&Yq-&P|3ORaYT;();sgXs6xNuOOU$4pM`w9XQwIHmHqOaPi)LZ`%UA z`OdaR?T>YD+9RJHJX2r}{rfjMKqCB@)~KEVj~q3lF2xG!+8DRO*vtjI`e1D37SL(# z@~#-$<4SHz3z9c80WVh&3%dosrZ+j(Ax5^WV0J|cRLx3>YOHg{RY)GIgX3Ce=FT<; zt!;CY8El=aC+JnTIk=S=k=mGn7IR}JHu&RT!Ep>(X%R~s*MZNE5y%%1ZsW4tsEs~ik!+7BgY!nwy43^ie z+t6EiGFT1cK)O?9SF0|nK8l5>hEbsCCNHc_KN<#Zm8z1rs*=82(QKCNGod`0EVHGN zlY9RFW$70nvy=`3Xa!asKCRQnP<_0i`d_e@8nUNdimxeU{pqxMq+h%71_y?a3 zD|9rfLpeTsTG#?0RSopDWAMSi!;>y@79+p^T>AGFt)qw!b-k?425cv$Gu+v0kfkYM&eAI0a*Fj;Y&zQ6@iK<&PLmx6F(WUmn8QbFhVrj~Kifu~j I>TJgNAA~fcWdHyG literal 0 HcmV?d00001 diff --git a/lib/aci/domain/vmm/epg/__pycache__/main.cpython-310.pyc b/lib/aci/domain/vmm/epg/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76fbb3eb268b3964d3dff6fcdf95fdc451ee018a GIT binary patch literal 606 zcmZ`$u};G<5Ix6fiK-MB09Eh>S^NPNLPZ53mM%yPktHj{Ze?LN!D%Z%Z1h85t ztW5j@6X#S#SvcuVcW3*(cjuzt?*ZE9qm%;z@a2oPb+8zrR}6y$Neoz$65{i~1eT_h zz!gX;!!^iI5k+6aG?bkiNV?zn1`<;5T@*Ic^IK~#%h`FUv9;fBUC*aQ?(eoOz+!}6 z9biz95(#M_i44||Qb`d%tm8IHj{5)1=M;U6UJWoT;ElY%J1SoU+e`wYkV!(FC#xeN z^jt55aQ-EV3@c@(AK-Sd{27ji{5~_9=eo)ZF4amIt}EqM%5kIbc$RA}n?d=?TCU0& z_fxa-$@wjI(W?+ckL;4?!?tp^C7$3+sA8U3B}Cm5!WMFAd>#w&u*}Tnq`_-cwL*l@ z&f|NshA4uVG@VJ(Nsmz?Ly2r7k)cF}5?NO2X8QExp9>m4r&&k?)gts;ah|n~PB%Kw N{MIW!XpGcH^cU_(h#dd` literal 0 HcmV?d00001 diff --git a/lib/aci/domain/vmm/epg/api.py b/lib/aci/domain/vmm/epg/api.py new file mode 100644 index 00000000..179197a9 --- /dev/null +++ b/lib/aci/domain/vmm/epg/api.py @@ -0,0 +1,49 @@ +class DomainVmmEpgApi(): + def __init__(self): + self.domain_vmm_epg_mo = None + + def get_domain_vmm_epg_mo(self): + if self.domain_vmm_epg_mo is not None: + return self.domain_vmm_epg_mo + + cache = self.get_object_cache( + 'vmmEpPD' + ) + if cache is not None: + self.domain_vmm_epg_mo = cache + self.log.apic_mo( + 'vmmEpPD', + self.domain_vmm_epg_mo + ) + return self.domain_vmm_epg_mo + + managed_objects = self.get_class( + 'vmmEpPD', + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_vmm_epg_mo', + 'API failed' + ) + return None + + self.domain_vmm_epg_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['vmmEpPD']['attributes'] + self.domain_vmm_epg_mo.append( + attributes + ) + + self.log.apic_mo( + 'vmmEpPD', + self.domain_vmm_epg_mo + ) + + self.set_object_cache( + 'vmmEpPD', + self.domain_vmm_epg_mo + ) + + return self.domain_vmm_epg_mo diff --git a/lib/aci/domain/vmm/epg/info.py b/lib/aci/domain/vmm/epg/info.py new file mode 100644 index 00000000..88e593df --- /dev/null +++ b/lib/aci/domain/vmm/epg/info.py @@ -0,0 +1,117 @@ +from lib import filter_helper + + +class DomainVmmEpgInfo(): + def __init__(self): + self.domain_vmm_epg = None + + def get_domain_vmm_epg_info(self, managed_object): + info = {} + info['__Output'] = {} + + for key in managed_object: + info[key] = managed_object[key] + + info['vlanId'] = int(info['encap'][5:]) + + if info['allocMode'] == 'dynamic': + info['tenant'] = info['encapAllocKey'].split('/')[1][3:] + info['appName'] = info['encapAllocKey'].split('/')[2][3:] + info['epgName'] = info['encapAllocKey'].split('/')[3][4:] + info['tenantAppEpg'] = '%s/%s/%s' % ( + info['tenant'], + info['appName'], + info['epgName'] + ) + + if info['allocMode'] == 'static': + info['tenant'] = '' + info['appName'] = '' + info['epgName'] = '' + info['tenantAppEpg'] = 'static allocation' + + info['domainType'] = 'VMM Domain' + info['domainName'] = None + + if info['domainName'] is None and 'dn' in info: + info['domainName'] = '%s/%s' % ( + info['dn'].split('/')[1][5:], + info['dn'].split('/')[2][4:] + ) + + if info['domainName'] is None and 'idConsumerDn' in info: + if len(info['idConsumerDn']) > 0: + info['domainName'] = '%s/%s' % ( + info['idConsumerDn'].split('/')[1][5:], + info['idConsumerDn'].split('/')[2][4:] + ) + + return info + + def get_domain_vmm_epg_infos(self): + if self.domain_vmm_epg is not None: + return self.domain_vmm_epg + + managed_objects = self.get_domain_vmm_epg_mo() + if managed_objects is None: + return None + + self.domain_vmm_epg = [] + for managed_object in managed_objects: + self.domain_vmm_epg.append( + self.get_domain_vmm_epg_info( + managed_object + ) + ) + + self.log.apic_mo( + 'vmmEpPD.info', + self.domain_vmm_epg + ) + + return self.domain_vmm_epg + + def match_domain_vmm_epg(self, domain_vmm_epg_info, domain_vmm_epg_filter): + if domain_vmm_epg_filter is None or len(domain_vmm_epg_filter) == 0: + return True + + range_defined = False + range_match = False + + for aepg_rule in domain_vmm_epg_filter: + (key, value) = aepg_rule.split(':') + if key == 'pool': + if not filter_helper.match_string(value, domain_vmm_epg_info['encapCtx']): + return False + + if key == 'range': + range_defined = True + (vlan_from, vlan_to) = value.split(',') + vlan_id = domain_vmm_epg_info['encap'][5:] + if int(vlan_from) <= int(vlan_id) <= int(vlan_to): + range_match = True + + if range_defined and not range_match: + return False + + return True + + def get_domain_vmm_epgs(self, domain_vmm_epg_filter=None): + all_epgs = self.get_domain_vmm_epg_infos() + if all_epgs is None: + return None + + epgs = [] + + for domain_vmm_epg_info in all_epgs: + if not self.match_domain_vmm_epg(domain_vmm_epg_info, domain_vmm_epg_filter): + continue + + epgs.append(domain_vmm_epg_info) + + epgs = sorted( + epgs, + key=lambda i: i['vlanId'] + ) + + return epgs diff --git a/lib/aci/domain/vmm/epg/main.py b/lib/aci/domain/vmm/epg/main.py new file mode 100644 index 00000000..1fbe558d --- /dev/null +++ b/lib/aci/domain/vmm/epg/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.vmm.epg.api import DomainVmmEpgApi +from lib.aci.domain.vmm.epg.info import DomainVmmEpgInfo + + +class DomainVmmEpg(DomainVmmEpgApi, DomainVmmEpgInfo): + def __init__(self): + DomainVmmEpgApi.__init__(self) + DomainVmmEpgInfo.__init__(self) diff --git a/lib/aci/domain/vmm/event/__init__.py b/lib/aci/domain/vmm/event/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/vmm/event/api.py b/lib/aci/domain/vmm/event/api.py new file mode 100644 index 00000000..4e680c9d --- /dev/null +++ b/lib/aci/domain/vmm/event/api.py @@ -0,0 +1,51 @@ +class DomainVmmEventApi(): + def __init__(self): + self.domain_vmm_event_mo = None + + def get_domain_vmm_event_mo(self): + if self.domain_vmm_event_mo is not None: + return self.domain_vmm_event_mo + + cache = self.get_object_cache( + 'vmmDomP.eventLog' + ) + if cache is not None: + self.domain_vmm_event_mo = cache + self.log.apic_mo( + 'vmmDomP.eventLog', + self.domain_vmm_event_mo + ) + return self.domain_vmm_event_mo + + query = 'rsp-subtree-include=event-logs,no-scoped,subtree&order-by=eventRecord.created|desc&page=0&page-size=%s' % (self.api_event_limit) + managed_objects = self.get_class( + 'vmmDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_vmm_event_mo', + 'API failed' + ) + return None + + self.domain_vmm_event_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['eventRecord']['attributes'] + self.domain_vmm_event_mo.append( + attributes + ) + + self.log.apic_mo( + 'vmmDomP.eventLog', + self.domain_vmm_event_mo + ) + + self.set_object_cache( + 'vmmDomP.eventLog', + self.domain_vmm_event_mo + ) + + return self.domain_vmm_event_mo diff --git a/lib/aci/domain/vmm/event/info.py b/lib/aci/domain/vmm/event/info.py new file mode 100644 index 00000000..bf698c98 --- /dev/null +++ b/lib/aci/domain/vmm/event/info.py @@ -0,0 +1,107 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class DomainVmmEventInfo(): + def __init__(self): + self.domain_vmm_event = None + + def get_domain_vmm_event_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['domainName'] = None + if 'affected' in info: + if 'uni/vmmp-VMware/dom-' in info['affected']: + info['domainName'] = info['affected'].split('uni/vmmp-VMware/dom-')[1].split('/')[0] + + if 'affected' not in info and 'dn' in info: + if 'uni/vmmp-VMware/dom-' in info['dn']: + info['domainName'] = info['dn'].split('uni/vmmp-VMware/dom-')[1].split('/')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_domain_vmm_event(self, deduplicate=True): + if self.domain_vmm_event is not None: + return self.domain_vmm_event + + managed_objects = self.get_domain_vmm_event_mo() + if managed_objects is None: + return None + + self.domain_vmm_event = [] + transaction_ids = [] + for managed_object in managed_objects: + event_info = self.get_domain_vmm_event_info( + managed_object + ) + if not deduplicate or event_info['txId'] not in transaction_ids: + self.domain_vmm_event.append( + event_info + ) + transaction_ids.append( + event_info['txId'] + ) + + self.log.apic_mo( + 'vmmDomP.eventLog.info', + self.domain_vmm_event + ) + + return self.domain_vmm_event + + def get_domain_vmm_id_event(self, domain_name, event_filter=None): + events = [] + + all_events = self.get_domain_vmm_event() + if all_events is None: + return events + + for event_info in all_events: + if event_info['domainName'] is not None: + if event_info['domainName'] == domain_name: + if not self.match_system_fault(event_info, event_filter): + continue + + events.append( + event_info + ) + + return events diff --git a/lib/aci/domain/vmm/event/main.py b/lib/aci/domain/vmm/event/main.py new file mode 100644 index 00000000..d4e606d9 --- /dev/null +++ b/lib/aci/domain/vmm/event/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.vmm.event.api import DomainVmmEventApi +from lib.aci.domain.vmm.event.info import DomainVmmEventInfo + + +class DomainVmmEvent(DomainVmmEventApi, DomainVmmEventInfo): + def __init__(self): + DomainVmmEventApi.__init__(self) + DomainVmmEventInfo.__init__(self) diff --git a/lib/aci/domain/vmm/fault/__init__.py b/lib/aci/domain/vmm/fault/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/vmm/fault/api.py b/lib/aci/domain/vmm/fault/api.py new file mode 100644 index 00000000..8fc1ab95 --- /dev/null +++ b/lib/aci/domain/vmm/fault/api.py @@ -0,0 +1,112 @@ +class DomainVmmFaultApi(): + def __init__(self): + self.domain_vmm_fault_mo = None + self.domain_vmm_fault_record_mo = None + + def get_domain_vmm_fault_mo(self): + cache = self.get_object_cache( + 'vmmDomP.fault' + ) + if cache is not None: + self.domain_vmm_fault_mo = cache + self.log.apic_mo( + 'vmmDomP.fault', + self.domain_vmm_fault_mo + ) + return self.domain_vmm_fault_mo + + query = 'rsp-subtree-include=faults,no-scoped,subtree' + managed_objects = self.get_class( + 'vmmDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_vmm_fault_mo', + 'API failed' + ) + return None + + self.domain_vmm_fault_mo = [] + for managed_object in managed_objects['imdata']: + if 'faultInst' in managed_object: + attributes = managed_object['faultInst']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = True + + self.domain_vmm_fault_mo.append( + attributes + ) + + self.log.apic_mo( + 'vmmDomP.fault', + self.domain_vmm_fault_mo + ) + + self.set_object_cache( + 'vmmDomP.fault', + self.domain_vmm_fault_mo + ) + + return self.domain_vmm_fault_mo + + def get_domain_vmm_fault_record_mo(self): + cache = self.get_object_cache( + 'vmmDomP.faultRecord' + ) + if cache is not None: + self.domain_vmm_fault_record_mo = cache + self.log.apic_mo( + 'vmmDomP.faultRecord', + self.domain_vmm_fault_record_mo + ) + return self.domain_vmm_fault_record_mo + + query = 'rsp-subtree-include=fault-records,no-scoped,subtree&order-by=faultRecord.created|desc&page=0&page-size=%s' % (self.api_fault_limit) + managed_objects = self.get_class( + 'vmmDomP', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_vmm_fault_record_mo', + 'API failed' + ) + return None + + self.domain_vmm_fault_record_mo = [] + for managed_object in managed_objects['imdata']: + if 'faultRecord' in managed_object: + attributes = managed_object['faultRecord']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = True + + self.domain_vmm_fault_record_mo.append( + attributes + ) + + self.log.apic_mo( + 'vmmDomP.faultRecord', + self.domain_vmm_fault_record_mo + ) + + self.set_object_cache( + 'vmmDomP.faultRecord', + self.domain_vmm_fault_record_mo + ) + + return self.domain_vmm_fault_record_mo diff --git a/lib/aci/domain/vmm/fault/info.py b/lib/aci/domain/vmm/fault/info.py new file mode 100644 index 00000000..d16110fd --- /dev/null +++ b/lib/aci/domain/vmm/fault/info.py @@ -0,0 +1,144 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class DomainVmmFaultInfo(): + def __init__(self): + self.domain_vmm_fault = None + self.domain_vmm_fault_record = None + + def get_domain_vmm_fault_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['domainName'] = None + info['controllerName'] = None + + if not managed_object['delegated']: + # "uni/vmmp-VMware/dom-EU-SPDC-CDC-22/ctrlr-EU-SPDC-CDC-22" + if 'affected' in info: + if 'uni/vmmp-VMware/dom-' in info['affected']: + info['domainName'] = info['affected'].split('uni/vmmp-VMware/dom-')[1].split('/')[0] + if len(info['affected'].split('/')) == 4: + info['controllerName'] = info['affected'].split('uni/vmmp-VMware/dom-')[1].split('/')[1][6:] + + # "dn": "uni/vmmp-VMware/dom-EU-SPDC-CDC-22/ctrlr-EU-SPDC-CDC-22/fd-[comp/prov-VMware/ctrlr-[EU-SPDC-CDC-22]-EU-SPDC-CDC-22/hv-host-3381]-fault-F2840" + if info['domainName'] is None: + if 'uni/vmmp-VMware/dom-' in info['dn']: + info['domainName'] = info['dn'].split('uni/vmmp-VMware/dom-')[1].split('/')[0] + info['controllerName'] = info['dn'].split('uni/vmmp-VMware/dom-')[1].split('/')[1][6:] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_domain_vmm_fault(self): + if self.domain_vmm_fault is not None: + return self.domain_vmm_fault + + managed_objects = self.get_domain_vmm_fault_mo() + if managed_objects is None: + return None + + self.domain_vmm_fault = [] + for managed_object in managed_objects: + fault_info = self.get_domain_vmm_fault_info( + managed_object + ) + self.domain_vmm_fault.append( + fault_info + ) + + self.log.apic_mo( + 'vmmDomP.fault.info', + self.domain_vmm_fault + ) + + return self.domain_vmm_fault + + def get_domain_vmm_fault_record(self, deduplicate=True): + if self.domain_vmm_fault_record is not None: + return self.domain_vmm_fault_record + + managed_objects = self.get_domain_vmm_fault_record_mo() + if managed_objects is None: + return None + + self.domain_vmm_fault_record = [] + fault_ids = [] + + for managed_object in managed_objects: + fault_info = self.get_domain_vmm_fault_info( + managed_object + ) + if not deduplicate or fault_info['id'] not in fault_ids: + self.domain_vmm_fault_record.append( + fault_info + ) + fault_ids.append( + fault_info['id'] + ) + + self.log.apic_mo( + 'vmmDomP.faultRecord.info', + self.domain_vmm_fault_record + ) + + return self.domain_vmm_fault_record + + def get_domain_vmm_id_fault(self, domain_name, fault_object, fault_filter=None): + faults = [] + + if fault_object == 'faultInst': + all_faults = self.get_domain_vmm_fault() + if all_faults is None: + return faults + + fault_filter = self.remove_system_fault_timestamp_filter( + fault_filter + ) + + if fault_object == 'faultRecord': + all_faults = self.get_domain_vmm_fault_record() + if all_faults is None: + return faults + + for fault_info in all_faults: + if fault_info['domainName'] is not None: + if fault_info['domainName'] == domain_name: + if not self.match_system_fault(fault_info, fault_filter, exclude_cleared=False): + continue + + faults.append( + fault_info + ) + + return faults diff --git a/lib/aci/domain/vmm/fault/main.py b/lib/aci/domain/vmm/fault/main.py new file mode 100644 index 00000000..bd3b7de1 --- /dev/null +++ b/lib/aci/domain/vmm/fault/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.vmm.fault.api import DomainVmmFaultApi +from lib.aci.domain.vmm.fault.info import DomainVmmFaultInfo + + +class DomainVmmFault(DomainVmmFaultApi, DomainVmmFaultInfo): + def __init__(self): + DomainVmmFaultApi.__init__(self) + DomainVmmFaultInfo.__init__(self) diff --git a/lib/aci/domain/vmm/info.py b/lib/aci/domain/vmm/info.py new file mode 100644 index 00000000..711defe9 --- /dev/null +++ b/lib/aci/domain/vmm/info.py @@ -0,0 +1,380 @@ +from lib import filter_helper + + +class DomainVmmInfo(): + def __init__(self): + self.domain_vmm = None + + def get_domain_vmm_info(self, managed_object): + keys = [ + 'accessMode', + 'aveTimeOut', + 'configInfraPg', + 'ctrlKnob', + 'dn', + 'enableAVE', + 'enableTag', + 'enableVmFolder', + 'encapMode', + 'epInventoryType', + 'epRetTime', + 'hvAvailMonitor', + 'name' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + # No clue why I get unknown value while APIC UI gets vlan value... + if info['encapMode'] == 'unknown': + info['encapMode'] = 'vlan' + + info['accessModeT'] = '--' + if info['accessMode'] == 'read-write': + info['accessModeT'] = 'RW' + if info['accessMode'] == 'read-only': + info['accessModeT'] = 'RO' + + info['vmmVSwitchPolicyContRn'] = None + if 'vmmVSwitchPolicyCont' in managed_object: + if managed_object['vmmVSwitchPolicyCont'] is not None: + info['vmmVSwitchPolicyCont'] = managed_object['vmmVSwitchPolicyCont']['rn'] + + info['vmmCtrlrP'] = [] + if 'vmmCtrlrP' in managed_object: + if managed_object['vmmCtrlrP'] is not None: + for item in managed_object['vmmCtrlrP']: + vc_info = {} + vc_info['name'] = item['name'] + vc_info['rootContName'] = item['rootContName'] + vc_info['hostOrIp'] = item['hostOrIp'] + vc_info['usr'] = '' + if 'vmmUsrAccP' in managed_object: + if managed_object['vmmUsrAccP'] is not None: + for user_item in managed_object['vmmUsrAccP']: + cred_name = '%s_cred' % (item['name']) + if user_item['name'].lower() == cred_name.lower(): + vc_info['usr'] = user_item['usr'] + + info['vmmCtrlrP'].append( + vc_info + ) + + info['numOfUplinks'] = None + if 'vmmUplinkPCont' in managed_object: + if managed_object['vmmUplinkPCont'] is not None: + info['numOfUplinks'] = managed_object['vmmUplinkPCont']['numOfUplinks'] + + info['aaep_names'] = [] + if 'infraRtDomP' in managed_object: + if managed_object['infraRtDomP'] is not None: + for item in managed_object['infraRtDomP']: + # "tCl": "infraAttEntityP", + # "tDn": "uni/infra/attentp-UCSB1-R3DC_AAEP" + if item['tCl'] == 'infraAttEntityP': + info['aaep_names'].append( + item['tDn'].split('/')[2][8:] + ) + + info['vlan'] = None + if 'infraRsVlanNs' in managed_object: + if managed_object['infraRsVlanNs'] is not None: + if managed_object['infraRsVlanNs']['tCl'] == 'fvnsVlanInstP': + info['vlan'] = managed_object['infraRsVlanNs']['tDn'].split('vlanns-[')[1].split(']')[0] + + info['aaaDomain'] = [] + for item in managed_object['aaaDomainRef']: + info['aaaDomain'].append( + item['name'] + ) + + info['vmmEpPD'] = [] + for epg_mo in managed_object['vmmEpPD']: + info['vmmEpPD'].append( + self.get_domain_vmm_epg_info( + epg_mo + ) + ) + + info['epgCount'] = len( + info['vmmEpPD'] + ) + + info['reln'] = [] + if 'infraRtDomP' in managed_object: + if managed_object['infraRtDomP'] is not None: + for item in managed_object['infraRtDomP']: + # "tCl": "infraAttEntityP", + # "tDn": "uni/infra/attentp-UCSB1-R3DC_AAEP" + if item['tCl'] == 'infraAttEntityP': + reln_info = {} + reln_info['tCl'] = item['tCl'] + reln_info['tDn'] = item['tDn'] + reln_info['type'] = 'AAEP' + reln_info['name'] = item['tDn'].split('/')[2][8:] + info['reln'].append( + reln_info + ) + continue + + self.log.error( + 'get_domain_phy_info', + 'Unsupported infraRtDomP tCl: %s' % (item['tCl']) + ) + + if 'vmmEpPD' in managed_object: + if managed_object['vmmEpPD'] is not None: + for item in managed_object['vmmEpPD']: + reln_info = {} + reln_info['tCl'] = 'fvAEPg' + reln_info['tDn'] = item['encapAllocKey'] + reln_info['type'] = 'Application EPG' + reln_info['name'] = self.get_epg_name_from_dn( + reln_info['tDn'] + ) + info['reln'].append( + reln_info + ) + + info['reln'] = sorted( + info['reln'], + key=lambda i: ( + i['tCl'], + i['tDn'] + ) + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_domains_vmm_info(self): + if self.domain_vmm is not None: + return self.domain_vmm + + domains_mo = self.get_domain_vmm_mo() + if domains_mo is None: + return None + + self.domain_vmm = [] + for managed_object in domains_mo: + self.domain_vmm.append( + self.get_domain_vmm_info( + managed_object + ) + ) + + self.log.apic_mo( + 'vmmDomP.info', + self.domain_vmm + ) + + return self.domain_vmm + + def match_domain_vmm(self, domain_info, domain_filter): + if domain_filter is None or len(domain_filter) == 0: + return True + + for aepg_rule in domain_filter: + (key, value) = aepg_rule.split(':') + key_found = False + + if key == 'name': + key_found = True + if not filter_helper.match_string(value, domain_info['name']): + return False + + if key == 'aaep': + key_found = True + found = False + for aaep_name in domain_info['aaep_names']: + if filter_helper.match_string(value, aaep_name): + found = True + + if not found: + return False + + if key == 'pool': + key_found = True + if not filter_helper.match_string(value, domain_info['vlan']): + return False + + if key == 'vlan': + key_found = True + if 'vlan_block' in domain_info: + found = False + for vlan_block in domain_info['vlan_block']: + if filter_helper.match_integer(vlan_block, value): + found = True + + if not found: + return False + + if key == 'fault': + key_found = True + if value == 'any': + if not domain_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_domain_vmm', + 'Unsupported fault filtering value: %s' % (value) + ) + + if not key_found: + self.log.error( + 'match_domain_vmm', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_domains_vmm( + self, + domain_filter=None, + vlan_info=False, + vlan_usage_info=False, + node_info=False, + intf_vlan_info=False, + controller_info=False, + fault_info=False, + hfault_info=False, + event_info=False, + audit_info=False, + hfault_filter=None, + event_filter=None, + audit_filter=None + ): + all_domains = self.get_domains_vmm_info() + + domains = [] + + self.get_domain_vmm_controller_mo() + for domain_info in all_domains: + if not self.match_domain_vmm(domain_info, domain_filter): + continue + + if vlan_info: + domain_info['vlan_info'] = None + domain_info['vlan_block'] = [] + if domain_info['vlan'] is not None: + domain_info['vlan_info'] = self.get_pool_vlan( + domain_info['vlan'], + vlan_usage_info=vlan_usage_info, + domain_name=domain_info['name'] + ) + if domain_info['vlan_info'] is not None: + for vlan_block in domain_info['vlan_info']['fvnsEncapBlk']: + domain_info['vlan_block'].append( + '%s-%s' % ( + vlan_block['fromVlan'], + vlan_block['toVlan'] + ) + ) + + if not self.match_domain_vmm(domain_info, domain_filter): + continue + + if node_info: + domain_node_info = self.get_domain_vmm_node( + domain_info['name'] + ) + domain_info['node'] = None + domain_info['interface'] = None + if domain_node_info is not None: + domain_info['node'] = domain_node_info['node'] + domain_info['interface'] = domain_node_info['interface'] + + if intf_vlan_info: + if domain_info['interface'] is not None: + for interface in domain_info['interface']: + interface['vlan'] = [] + interface['operSt'] = '--' + interface['operMode'] = '--' + + if interface['intf_type'] == 'l1PhysIf': + interface_info = self.get_interface_phy( + interface['pod_id'], + interface['node_id'], + interface['intf_name'], + epg_stats_info=True + ) + if interface_info is not None: + interface['operSt'] = interface_info['stats']['operSt'] + interface['__Output']['operSt'] = interface_info['stats']['__Output']['operSt'] + interface['operMode'] = interface_info['stats']['operMode'] + for intf_epg_stats in interface_info['epg_stats']: + if intf_epg_stats['vlan'] is not None: + if intf_epg_stats['vlan']['evlan'] not in interface['vlan']: + interface['vlan'].append( + intf_epg_stats['vlan']['evlan'] + ) + + interface['vlan'] = sorted( + interface['vlan'] + ) + interface['vlans'] = filter_helper.get_range_from_values( + interface['vlan'] + ) + + if controller_info: + domain_info['controller'] = self.get_domain_vmm_controllers( + domain_vmm_controller_filter=['domain:%s' % (domain_info['name'])] + ) + + if fault_info: + domain_info['faultInst'] = self.get_domain_vmm_id_fault( + domain_info['name'], + 'faultInst' + ) + + if hfault_info: + domain_info['faultRecord'] = self.get_domain_vmm_id_fault( + domain_info['name'], + 'faultRecord', + fault_filter=hfault_filter + ) + + if event_info: + domain_info['eventLog'] = self.get_domain_vmm_id_event( + domain_info['name'], + event_filter=event_filter + ) + + if audit_info: + domain_info['auditLog'] = self.get_domain_vmm_id_audit( + domain_info['name'], + audit_filter=audit_filter + ) + + domains.append(domain_info) + + domains = sorted( + domains, + key=lambda i: i['name'].lower() + ) + + return domains + + def get_domain_vmm(self, domain_name, vlan_info=False, vlan_usage_info=False): + domain_filter = ['name:%s' % (domain_name)] + domains = self.get_domains_vmm( + domain_filter=domain_filter, + vlan_info=vlan_info, + vlan_usage_info=vlan_usage_info + ) + if domains is None or len(domains) != 1: + return None + return domains[0] diff --git a/lib/aci/domain/vmm/main.py b/lib/aci/domain/vmm/main.py new file mode 100644 index 00000000..a03dfcdc --- /dev/null +++ b/lib/aci/domain/vmm/main.py @@ -0,0 +1,29 @@ +from lib.aci.domain.vmm.api import DomainVmmApi +from lib.aci.domain.vmm.info import DomainVmmInfo +from lib.aci.domain.vmm.audit.main import DomainVmmAudit +from lib.aci.domain.vmm.controller.main import DomainVmmController +from lib.aci.domain.vmm.epg.main import DomainVmmEpg +from lib.aci.domain.vmm.event.main import DomainVmmEvent +from lib.aci.domain.vmm.fault.main import DomainVmmFault +from lib.aci.domain.vmm.node.main import DomainVmmNode + + +class DomainVmm( + DomainVmmApi, + DomainVmmInfo, + DomainVmmAudit, + DomainVmmController, + DomainVmmEpg, + DomainVmmEvent, + DomainVmmFault, + DomainVmmNode + ): + def __init__(self): + DomainVmmApi.__init__(self) + DomainVmmInfo.__init__(self) + DomainVmmAudit.__init__(self) + DomainVmmController.__init__(self) + DomainVmmEpg.__init__(self) + DomainVmmEvent.__init__(self) + DomainVmmFault.__init__(self) + DomainVmmNode.__init__(self) diff --git a/lib/aci/domain/vmm/node/__init__.py b/lib/aci/domain/vmm/node/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/domain/vmm/node/api.py b/lib/aci/domain/vmm/node/api.py new file mode 100644 index 00000000..f0f3ad2b --- /dev/null +++ b/lib/aci/domain/vmm/node/api.py @@ -0,0 +1,61 @@ +class DomainVmmNodeApi(): + def __init__(self): + self.domain_vmm_node_mo = {} + + def get_domain_vmm_node_mo(self, domain_name): + if domain_name in self.domain_vmm_node_mo: + return self.domain_vmm_node_mo[domain_name] + + key = domain_name + cache = self.get_object_cache( + 'vmmDomP.%s' % (key) + ) + if cache is not None: + self.domain_vmm_node_mo[key] = cache + self.log.apic_mo( + 'vmmDomP.%s' % (key), + self.domain_vmm_node_mo[key] + ) + return self.domain_vmm_node_mo[key] + + distinguished_name = 'uni/vmmp-VMware/dom-%s' % (domain_name) + query = 'rsp-subtree-include=full-deployment&target-node=all&target-path=ADomPToEthIf' + managed_objects = self.get_managed_object( + distinguished_name, + query=query, + node_mo=True + ) + + if managed_objects is None: + self.log.error( + 'get_domain_vmm_node_mo', + 'API failed' + ) + return None + + if managed_objects['totalCount'] != '1': + self.log.error( + 'get_domain_vmm_node_mo', + 'Unexpected object count' + ) + return None + + for managed_object in managed_objects['imdata']: + attributes = managed_object['vmmDomP']['attributes'] + attributes['pconsResourceCtx'] = self.get_mo_node_resource_ctx( + 'vmmDomP', + managed_object + ) + self.domain_vmm_node_mo[key] = attributes + + self.log.apic_mo( + 'vmmDomP.%s' % (key), + self.domain_vmm_node_mo[key] + ) + + self.set_object_cache( + 'vmmDomP.%s' % (key), + self.domain_vmm_node_mo[key] + ) + + return self.domain_vmm_node_mo[key] diff --git a/lib/aci/domain/vmm/node/info.py b/lib/aci/domain/vmm/node/info.py new file mode 100644 index 00000000..323749e5 --- /dev/null +++ b/lib/aci/domain/vmm/node/info.py @@ -0,0 +1,81 @@ +class DomainVmmNodeInfo(): + def __init__(self): + self.domain_vmm_node = {} + + def get_domain_vmm_node_info(self, managed_object): + info = {} + info['__Output'] = {} + info['name'] = managed_object['name'] + + node = {} + info['interface'] = [] + for item in managed_object['pconsResourceCtx']: + node_name = self.get_node_name( + item['nodeId'] + ) + + if node_name not in node: + node[node_name] = {} + node[node_name]['node_id'] = item['nodeId'] + node[node_name]['interfaces'] = 0 + + port_info = {} + port_info['__Output'] = {} + port_info['pod_id'] = item['ctxDn'].split('/')[1].split('-')[1] + port_info['node_id'] = item['nodeId'] + port_info['node_name'] = self.get_node_name( + item['nodeId'] + ) + port_info['intf_type'] = item['ctxClass'] + # "topology/pod-1/node-2201/sys/vmms-[eth1/43]" + port_info['intf_name'] = item['ctxDn'].split('[')[1].split(']')[0] + info['interface'].append( + port_info + ) + + node[node_name]['interfaces'] = node[node_name]['interfaces'] + 1 + + info['node'] = [] + for key in node: + node_info = {} + node_info['id'] = node[key]['node_id'] + node_info['name'] = key + node_info['interfaces'] = node[key]['interfaces'] + info['node'].append( + node_info + ) + + info['node'] = sorted( + info['node'], + key=lambda i: i['name'] + ) + + info['interface'] = sorted( + info['interface'], + key=lambda i: ( + i['node_name'], + i['intf_name'] + ) + ) + + return info + + def get_domain_vmm_node(self, domain_name): + if domain_name in self.domain_vmm_node: + return self.domain_vmm_node[domain_name] + + # one object or None value is expected + domain_nodes_mo = self.get_domain_vmm_node_mo(domain_name) + if domain_nodes_mo is None: + return None + + self.domain_vmm_node[domain_name] = self.get_domain_vmm_node_info( + domain_nodes_mo + ) + + self.log.apic_mo( + 'vmmDomP.%s.info' % (domain_name), + self.domain_vmm_node[domain_name] + ) + + return self.domain_vmm_node[domain_name] diff --git a/lib/aci/domain/vmm/node/main.py b/lib/aci/domain/vmm/node/main.py new file mode 100644 index 00000000..9e8b68b6 --- /dev/null +++ b/lib/aci/domain/vmm/node/main.py @@ -0,0 +1,8 @@ +from lib.aci.domain.vmm.node.api import DomainVmmNodeApi +from lib.aci.domain.vmm.node.info import DomainVmmNodeInfo + + +class DomainVmmNode(DomainVmmNodeApi, DomainVmmNodeInfo): + def __init__(self): + DomainVmmNodeApi.__init__(self) + DomainVmmNodeInfo.__init__(self) diff --git a/lib/aci/domain/vmm/output.py b/lib/aci/domain/vmm/output.py new file mode 100644 index 00000000..0e2b7c1c --- /dev/null +++ b/lib/aci/domain/vmm/output.py @@ -0,0 +1,624 @@ +class DomainVmmOutput(): + def __init__(self): + pass + + def print_domains_vmm(self, info, title=False): + if title: + self.my_output.default( + 'VMM Domain [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + for item in info: + item['fvnsEncapBlk'] = [] + if item['vlan_info'] is not None: + item['fvnsEncapBlk'] = item['vlan_info']['fvnsEncapBlk'] + + for item in info: + if len(item['aaaDomain']) == 0: + item['aaaDomain'].append('--') + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'vlan_info.allocMode', + 'fvnsEncapBlk.blockInfo', + 'epgCount', + 'aaaDomain' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Mode', + 'Encapsulation Block', + 'EPG', + 'Sec Domain' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'fvnsEncapBlk', 'aaaDomain'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_vmm_prop(self, info, title=False): + if title: + self.my_output.default( + 'VMM Domain - Properties [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'name', + 'encapMode', + 'accessModeT', + 'configInfraPg', + 'enableTag', + 'enableVmFolder', + 'epInventoryType', + 'epRetTime', + 'numOfUplinks' + ] + + headers = [ + 'Domain Name', + 'Encap', + 'Access Mode', + 'Cfg Infra PGs', + 'Tag Collection', + 'VM Folder Data', + 'Ep Inventory', + 'Ep Retention Time', + 'Uplinks' + ] + + self.my_output.my_table( + info, + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_vmm_vcenter(self, info, title=False): + if title: + self.my_output.default( + 'VMM Domain - vCenter [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'controller.faults', + 'controller.name', + 'controller.hostOrIp', + 'controller.usr', + 'controller.operStTick', + 'controller.model', + 'controller.serialShort', + 'controller.rev', + 'controller.rootContName', + 'controller.hvCount', + 'controller.vmCount' + ] + + headers = [ + 'Faults', + 'Domain Name', + 'Controller Faults', + 'Controller Name', + 'IP', + 'Username', + 'Online', + 'Model', + 'Serial', + 'Rev', + 'Datacenter', + 'HV', + 'VM' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['controller'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_vmm_epg(self, info, title=False): + epg = [] + for item in info: + for epg_info in item['vmmEpPD']: + epg_info['domainName'] = item['name'] + epg.append( + epg_info + ) + + epg = sorted( + epg, + key=lambda i: ( + i['domainName'], + i['tenantAppEpg'] + ) + ) + + if title: + self.my_output.default( + 'VMM Domain - Associated EPG [#%s]' % (len(epg)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'tenantAppEpg', + 'encapCtx', + 'allocMode', + 'vlanId', + 'instrImedcy', + 'resImedcy', + 'switchingMode' + ] + + headers = [ + 'Domain Name', + 'EPG', + 'VLAN Pool', + 'Alloc Mode', + 'VLAN', + 'Deployment', + 'Resolution', + 'Switching' + ] + + self.my_output.my_table( + epg, + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_vmm_node(self, info, title=False): + if title: + self.my_output.default( + 'VMM Domain - Nodes [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'node.name', + 'node.interfaces' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Node', + 'Interfaces' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'node'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_vmm_interface(self, info, title=False): + if title: + self.my_output.default( + 'VMM Domain - Interfaces [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'interface.node_name', + 'interface.intf_name' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Node', + 'Interface' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'interface'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_vmm_vlan(self, info, title=False): + if title: + self.my_output.default( + 'VMM Domain - Interfaces VLAN [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + for item in info: + item['fvnsEncapBlk'] = [] + if item['vlan_info'] is not None: + item['fvnsEncapBlk'] = item['vlan_info']['fvnsEncapBlk'] + + order = [ + 'faults', + 'name', + 'aaep_names', + 'vlan', + 'fvnsEncapBlk.blockInfo', + 'interface.node_name', + 'interface.intf_name', + 'interface.operSt', + 'interface.operMode', + 'interface.vlans' + ] + + headers = [ + 'Faults', + 'Domain', + 'AAEP', + 'VLAN Pool', + 'Encapsulation Block', + 'Node', + 'Interface', + 'State', + 'Mode', + 'VLANs' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['aaep_names', 'interface', 'fvnsEncapBlk'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_vmm_reln(self, info, title=False): + if title: + self.my_output.default( + 'VMM Domain - Policy Relationships [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [ + 'faults', + 'name', + 'reln.type', + 'reln.name' + ] + + headers = [ + 'Faults', + 'Domain', + 'Policy Type', + 'Policy Name' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['reln'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_domains_vmm_event_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'VMM Domain - Event Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'VMM Domain - Event Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) + + def print_domains_vmm_fault_inst(self, info, title=False): + if title: + self.my_output.default( + 'VMM Domain - Faults [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_domains_vmm_fault_record(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'VMM Domain - Fault Records [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'VMM Domain - Fault Records last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_domains_vmm_audit_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'VMM Domain - Audit Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'VMM Domain - Audit Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'domainName', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Domain', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/endpoint/__init__.py b/lib/aci/endpoint/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/endpoint/__pycache__/__init__.cpython-310.pyc b/lib/aci/endpoint/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c15d795b59a9d386ebb86cc644b348626d2efb84 GIT binary patch literal 149 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!H8vsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oYF&ryk0@&Ee@O9 S{FKt1R6CG~#Y{kgg#iG1gd=$X literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/__pycache__/api.cpython-310.pyc b/lib/aci/endpoint/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00e3d968b7491903ace722475a3572b2d770514a GIT binary patch literal 1438 zcmah}PjA~c6elT4mK8fLivB@{V%w!H3^YBgx3(!-q`_7c2#O}y!SEn3B5f;^ErpZ} z#E?(RX+Xb2(%ZhpuKNnS?pq9Ky7%a~Q+k;IK0W^4zaJkSnRmMpf$#QTf6Cw6g#3-0 z=I6oYB`k9j#E(Q0NzY*Y#s);P1Jd^rz^{D_b}wO>dmt1UP)P<%QpwK9z>}Wj@aNKp z*uZY=&18|Mv+`AuCKUYFAL^KB7nVVWlGG#y31M`lzdhUEFFA ze7ttJ#xw-S0G4C=1MsfNG4QOY4pBRR{W+ENf-Y$dtpNPHn&Mf&%FaCr`Z2j+)Wsb@ zQ1K7Ue``}-v0W`{ocOyNAumiV)0CyV%tu{F6%Q(?M^n%6L67Fma3M)w?&}k3^a&X@hhsMJa3~ z%2KCCRjG`|vCwd#h{oyF8z?#;`jN)bvNtecesrvoGEPJ?QP#`yv2DRHCXnB@(e8Ly zUum6d`wb$~JYF9+{;!(7+q5+efhY=~ZEu*b%JoBySKIooxbC7Ju2TbwJ+-~5n2E8H zS4557ybkCdgt;rX68@Kyty_h+6H#*pBBBB1j8XnM^a9X9qx>@9oP{)OZ8{sH!DYzN z2G&c?1J+@kD+{CHCjgx7|Fi)7g3ke8)!_bBEq`&Zd84syO{)7aL+}pF#8kzxjbdOg zs|@u{9G_GoTUj(-c>OI3d~X^8&#Lk9!e!7cBq8m14uf~g{Tu!++_f!yzN+=YMdFOy GB>w_rW@`8V literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/__pycache__/hv.cpython-310.pyc b/lib/aci/endpoint/__pycache__/hv.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e6ba7b60ebeb7e4b092970f9c02eb960cd6fae3 GIT binary patch literal 1103 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 Ov>7AH(p?R%OaBi!DKPf{ literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/__pycache__/ip.cpython-310.pyc b/lib/aci/endpoint/__pycache__/ip.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f7f42a4371a7e40cc7b046b5cfbb6eea870dfcd GIT binary patch literal 1103 zcmaKr&ubJh6vy*xw$o)>%XSe~L=jP#gFSeZQiQfhMb?A2WhBhb%Wh+5XJ#|A3oWxy zuvh;8Z|co|Dd5SI|AGhgWwt-I70oco%S-aj%jYH8+FFxf`S$S%#0^5eyUudq*m;hB zaStmXKoc^ieM-p-0u1;W0sfx#8HhI|@P6PN5>VSrvXMMgNv=%nT+8KB@G*K7=~E!M z+^@xGpMwDJjPwOGUhU>vHVpwvK)N@v!YPR&QYJ%6$-aWo1Sc5#l3Ygel31C8M!awe~HG3%o(^7 zur8Sq^KfAS?UFt6wln7y$M)7-R08-BGY=~EiBueTmw@P!&zPA>d$L|Jmye$H<3pW* zQK|KYv)%pNis9@ax6P<5jUG%(RX8+Jp5tKx&#Yhoc6}VB(MW;J2Jci{nsw*&Y9Y&y z)NzeyQLVb6J0n%f3m8)8@=DynEN){ZXp3%8A3s5xRQzVA?3ZYqJX*r@Z%54l^r|M`7H(yGf;U^E_^T2Pf9IRCJI9^F2qT zMcJufC-?uu!mSNxFKD<}(`c-uv`s0;8B7yrx1^j*qhv8++>17wuIgS7%%#J)oEi6I q9L2)9eA1*oZ?$S~45jR5S9F~{@g$zh2)a^UVLgVrIeIV+Ftfj$Uzu{V`-^~WV^OwXz8u_A(%Lc@C=JTvb}^>!N*Sg*~k=p91-AX%>n$R(Wa06`EzH8GS?irCSP zahYqet3Bg0-(pX1Ouzz*eI1&JMHX*#Y!a4G@{x!@g!e>*l1f+lGLVr>euXR*(HF9d z|3WXaqhs=+5>2hD{(Yl>rZfFq9ctk5!kabwG_2XR0k#ynHm1bl>jknWiKhT0VN?+2 z2r8U=!d&6PK;9V6txCH36|oEF3Ql(kp(nrTPx1iv^v;6Z1$hhd7qpp?Akc~KcR`B- zjUnf%Qa$G_c4$2eK86j300QXpI;jtjq)mYSdv*0Dzb&-NOVyQiF61C}t~%Kcvdy)+ z$%|6u^2yQM6spRa?=4<1K7lSpK<9lzf4rDAXY(j~bb|A$Fp~2z=G@fcP9sh^|8`gC zDPwEenN|VIw;=><*rA+|q||=d@3!m|2Fzf|UhSIEI z&!oQ&QyQ&&COw!bjV816qvC^k%A@~w_LV}sgcfCv;oHfWclbcM69_42o%ebkAUP*9gr%=wG|8JX)aU#vWnD9%Y2l6JyV0CbQsa zu_p6a@2%J0WzF)sV$Mr_15)?r8s1T(;gbbbe+EXmV> zprF;_;>r3Ky~8+7di_N9^B&_9p7s*S#e|Dqn(X)De$wNYFYD#{ZLQ)+c~O*PNf|{L zN}{mHbm{f1TC+8Mw9hWYSiDXTi?56WL)wh&8YQX7OW1-#Dw;TFW(BilV?x9OJ-46` zyVL#~V<{^xl72U&%1va1SeYr$LMkx2YRr z!=lsGTP5A)+f^>(gLs^l?LNktT^@ir7`oCw092M(z-kW&BPGRJ-vN5SZJwIMs5Q)j z>L22&Gs5h1LiFdWj5FAab8>7Cjbo>>MaY~X0ptt~=Ke;OKnoTZEKisR7PoT2($E&S zqH?ox&Mf9*yvhYMrxE62>vuU7seoLpIi%-ivWRbsphDXL`lGl^<6h z%b)NIG{za@B26-`=J)v^7d*=N3!DoF>Q+`K2j~I}J!KElcqo-Qiu)Ih!DOpw#f%BH zz>8rg9`UuJ%dj}4qob&9E&<1jAsQ%~G4<4~twN9ZeRqsR5_|1*96&CT@MF@cSQMd{{A0RX)zw1J`9z^qIWFakuU z6$PSGO>{uV7Fd><2^Ooez+!2O1tcd2;D11{kt)jUAvrghQ_;#|&gJc%dY3f!IyGAx z;w^Z!z^xE?v`?MMs5Kdlrtb4e3-@>Gf|RFfY^~Qye}Yh}#R~X$fju^S=OMrG zWk0~^k5M2e#fKn5OY=#DsQ3iMr>M2B=~Me_j@(6$d$;Hj!8Ytb2#IHSO$kkipeBS9 z)KswkM+N`i>7zFj0Yi5}v#Wcd4F$sA2DdYclpjT-oQ+e&K@|Nwj?>yAkT7+LpCS4j s#Wlk4m?>4OioT{ zNhSS4OCl^uAl>Q$wde4~zHN!5Qdd+#t_&*q`Pqt7^WqHJk%t*5V)uMoNmbf1(Dt zzK2e`0y6AWomIiLS;nnLBbAGrR*2(5+~Q&@uQtJO+NA5$fnSqyYW=o8ad!TEt~HA> z7B)+-05BA(n=tEDFvh{^4%4H!B3*M_$6X|{ka7{vQN|ObAAng*?@s(edf6_3grG@C zO3-tMjNsmUqu2Va&$tAC$#+P}OA0z~m9zv6Yu}_K{%@ig~rV`2VtC@n!_$d90Y5U7W)JDl_yvL literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/__pycache__/vmm.cpython-310.pyc b/lib/aci/endpoint/__pycache__/vmm.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c81a9ff274c9592797d90a8c8421b4ec99b3799 GIT binary patch literal 2352 zcmb7GOK%)S5boEEXV+sJj0u>hNkYhw#3+imfQb+ZL_%mS#ZeB!Mx*g`uNiwD>z>&~ zw#FxN&3}lw+N+;-= ze#QZBf>)7{N&?FlZ7>>gDWvm|ghIM<4n{|MvIV0n+j1VpIqAy<7(Gd0!zDBSeIfg0 zTGaRRypyo0jZnwEZo#iw22qn;+E7U!(S}4!5?IeVa99@)o63M|Tw?f7<&NRt3z!j= z%6eLW`w7t=49{-d`l`DZXK6P{tEB8oHB?zQt&|=r-ObYNZk(iDb#kWeFwfWf2gZw{ zv`FhHav(&7yDZbgm8p}jpH7&$0nWy~?G1*Yq~wUDq+yb7kR5>kcY4Gdew#e-jzmKn zu?p`Ru|f8In8R1eVdm5$Y1(B^Q4^fpkoR*7uyF?~bMgGIq=p?`}=Ts>t63mv?{ z=AiBm>c9!zq_-nCE5l@AL=or8@G_Ogsp_~^+J|#Kqdz~Tc6^|5G#r4?OQ40Ve)+4? zN^Ta$xucaT48N-+WWlNWSz14F^c*f&%;O^7Q8FsGcU4jwkrutuh&^>s84l7WVkm6*2b90>8YM?L1vEz&jSGoK3KKNsxq(sUkP9%d#pn3Zv6 zegH!Pv(7dJH)c$3>&;5K|7FW-ITAdG!J90b$kZk2sqJVgIZOvpoOH>}21Kb=KzLLz zMj3UVdqPm33A(}#uf7`YNvIjnXUbt6;=fKg0JyxP=V2Ap`2q}~TS9l*s>AtM#(e|`LrdLRNan2IVS%iDPf>z_j3AU)yXXb`Kf){DkupR?y z@e^usOD)j|ORcvomBg4@@1NK&q}KZXq1G38v};JQ(6bclq>0Afuh&p~g5o?1B$mE_ z;v$G(RJi&Q=!WNUV#%aG!}n*P{4aql8k4LmSY!zVHTt>)IumM!KrX}`SM4Df2=9>S zukot@HAn_@tV2ygHB;=O2>oN|jK>tZEW%FpMesnsJ;v_|^jol?<{N&@j-1A^Grj~L zZyYavC~k90c(JaF7(vi@NRXlyq_Ch-!Am$2-SxmPH=}b1g^e}-Vab*K@os3 zt^6P=Z8tW4uAonxSTNl-&xLU##QtYf61q^~kd<)R_C+uzaEB`+AM$zPJ)1Q@meMv> zj9J4m>>q*^>Qj%l8I(E{y7!MSCK?pMyVJ!!9U!2cpoL!*{C-4{X-83B%0Y&@A4U6v zI2*mu`0r!{fQ1497(sCzwF$MXhNY^pqA<g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HuvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oYF5gg5S{%{DuUyd5GaKl3O)IfYoVABa6+4lduUH$%c5x4&epQz?5+h4G8CF$ z(p&%1Ui$-j@2RtL)HWpp^LBPtPxEG`J~-G1w3m9Jelma`@$#=>4$jcsA;McwpvWEi zSDJyMA7I1^%s()Sw=;BijG!SS3NosQqIZxn#T3Vrs|2}wVR%ugRc$K&uDPscbwQBQ zTa2Sm&>crmfE+UYju5!h<;=!X9sGJdc_S8iX+&XMQ46ITT?*s0ZL}4oxe|F{guX8( zt{Y*n+{tPaQYlSkyp-`@E&?aF&mYP<>AxxBdv6H_QC6q#6axcWYM{kl$1um~d?Q=d zvUB+KY|9nqTRw)Cx1<4k+>(~RxX;}T+HR85DCYgzuhxE)1Zu00IG=kRn4gpg=T(;Y zkDHb5S{@}f?j{VEd6mz#lJ(VRUHHIbXMr#D#s!A>cSts>4M%hBWj_gd-C+B(I`-0S zm=9Bu()0-;84&t~)7w}74dXHX6a}OBDqm_T!@iWuTCK|%52Uj> jMNyjVH}3ZEmI5kZU2Zxe-T4?Pq~l$!)5z`?cnH4%UVx+} literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/hv/__pycache__/main.cpython-310.pyc b/lib/aci/endpoint/hv/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..501457a4b033e469e80ba0c33d13430c98f3b697 GIT binary patch literal 509 zcmYjNu};G<5Ix5!L{-~`4vef>vLYdbDis7QUDzT^R>--kRVOKS8wtclKZ5~Aekm&x zzre&frD{%kFFyP7?%h?xVIL^2)e_(7`|Xo%gp^DO?u-ZlnSp|(jKM8nfP4$c6?@}p zfZ+qgy&tNAm^GuD5?7Tj*LU@OIj?em-Hm{f3Biqt6r>D+Bp3!;NI7zn3Y-2xBWF~$ z4}a!_DZ!11*6_hz;gd`u(4TA;2i7-eA}MvL*HV(B&?z(j0((Rczvt5nvCNDXxpsLa zP}Rx^?Ub#R6-GabEZ0K)k02JcC^B6pt7q%i(IYsoKVmN@2an0V*^InX=Q1mllucjC zqQZ^w=Yf<@o6PK9TCLVjhmJ|s`r&*d=P7~#Yj0*TPfy8PLf(?Sw`5T#niky7+m?02 V{HWF|HqqtI! 0: + info['bdTenant'] = info['bdDn'].split('/')[1].split('tn-')[1] + info['bdName'] = info['bdDn'].split('/')[2].split('BD-')[1] + info['bdNameTenant'] = '%s/%s' % ( + info['bdTenant'], + info['bdName'] + ) + + if info['vrfDn'] is not None and len(info['vrfDn']) > 0: + info['vrfTenant'] = info['vrfDn'].split('/')[1].split('tn-')[1] + info['vrfName'] = info['vrfDn'].split('/')[2].split('ctx-')[1] + info['vrfNameTenant'] = '%s/%s' % ( + info['vrfTenant'], + info['vrfName'] + ) + + if info['dn'].startswith('uni/tn-'): + info['tenant'] = info['dn'].split('/')[1][3:] + + if info['dn'].startswith('uni/tn-') and '/ap-' in info['dn']: + info['epgName'] = info['dn'].split('/')[3][4:] + info['apName'] = info['dn'].split('/')[2][3:] + info['epgNameApTenant'] = '%s/%s/%s' % ( + info['tenant'], + info['apName'], + info['epgName'] + ) + + info['fvIp'] = [] + address = [] + for ip_managed_object in managed_object['fvIp']: + ip_info = self.get_endpoint_ip_info( + ip_managed_object + ) + info['fvIp'].append( + ip_info + ) + address.append(ip_info['addr']) + + info['ip'] = ','.join(address) + + info['fvRsToVm'] = None + if 'fvRsToVm' in managed_object and managed_object['fvRsToVm'] is not None: + info['fvRsToVm'] = self.get_endpoint_vm_info( + managed_object['fvRsToVm'] + ) + + info['fvRsHyper'] = None + if 'fvRsHyper' in managed_object and managed_object['fvRsHyper'] is not None: + info['fvRsHyper'] = self.get_endpoint_hv_info( + managed_object['fvRsHyper'] + ) + + if len(info['fabricPathDn']) == 0: + if managed_object['fvRsCEpToPathEp'] is not None: + if 'tDn' in managed_object['fvRsCEpToPathEp']: + info['fabricPathDn'] = managed_object['fvRsCEpToPathEp']['tDn'] + + return info + + def get_endpoints_info(self): + if self.endpoints is not None: + return self.endpoints + + managed_objects = self.get_endpoints_mo() + if managed_objects is None: + return None + + self.endpoints = [] + for managed_object in managed_objects: + self.endpoints.append( + self.get_endpoint_info( + managed_object + ) + ) + + self.log.apic_mo( + 'fvCEp.info', + self.endpoints + ) + + return self.endpoints + + def match_endpoint(self, endpoint_info, endpoint_filter): + if endpoint_filter is None or len(endpoint_filter) == 0: + return True + + # support multiple mac: filtering with 'or' logic + + mac_filtering = False + mac_match = False + for rule in endpoint_filter: + key = rule.split(':')[0] + value = ':'.join(rule.split(':')[1:]) + + if key == 'mac': + mac_filtering = True + if ip_helper.is_mac_match(value, endpoint_info['mac']): + mac_match = True + + if mac_filtering and not mac_match: + return False + + for rule in endpoint_filter: + key = rule.split(':')[0] + value = ':'.join(rule.split(':')[1:]) + key_found = False + + if key == 'mac': + key_found = True + + if key == 'tenant': + key_found = True + if not filter_helper.match_string(value, endpoint_info['tenant']): + return False + + if key == 'bd': + key_found = True + if not filter_helper.match_tenant_name(value, endpoint_info['bdNameTenant']): + return False + + if key == 'epg': + key_found = True + if not filter_helper.match_tenant_ap_name(value, endpoint_info['epgNameApTenant']): + return False + + if key == 'ap': + key_found = True + if not filter_helper.match_string(value, endpoint_info['apName']): + return False + + if key == 'vrf': + key_found = True + if not filter_helper.match_tenant_name(value, endpoint_info['vrfNameTenant']): + return False + + if key == 'bdDn': + key_found = True + if not filter_helper.match(value, endpoint_info['bdDn']): + return False + + if key == 'vlan': + key_found = True + if not filter_helper.match_integer(value, endpoint_info['encapVlan']): + return False + + if key == 'ip': + key_found = True + found = False + for ip_address in endpoint_info['fvIp']: + if value == ip_address['addr']: + found = True + break + + if not found: + return False + + if key == 'subnet': + key_found = True + found = False + for ip_address in endpoint_info['fvIp']: + if ip_helper.is_ipv4_in_cidr(ip_address['addr'], value): + found = True + break + + if not found: + return False + + if key == 'vm-info': + key_found = True + if value not in ['enabled']: + self.log.error( + 'match_endpoint', + 'Unsupported key:value %s:%s' % (key, value) + ) + + if value == 'enabled': + if endpoint_info['fvRsToVm'] is None: + return False + + if key == 'vmm': + key_found = True + if 'vm' in endpoint_info: + if not filter_helper.match_string(value, endpoint_info['vm']['vmm']): + return False + + if key == 'hv': + key_found = True + if 'hv' in endpoint_info: + if not filter_helper.match_string(value, endpoint_info['hv']['name']): + return False + + if key == 'vm': + key_found = True + if 'vm' in endpoint_info: + if not filter_helper.match_string(value, endpoint_info['vm']['name']): + return False + + if key == 'node': + key_found = True + nodes = value.split(',') + if 'fabric' in endpoint_info: + node_match = False + for fabric in endpoint_info['fabric']: + if fabric['node_id'] in nodes: + node_match = True + break + + if not node_match: + return False + + if not key_found: + self.log.error( + 'match_endpoint', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_endpoints(self, endpoint_filter=None, vm_info=False, fabric_info=False): + all_endpoints = self.get_endpoints_info() + if all_endpoints is None: + return None + + endpoints = [] + + for endpoint_info in all_endpoints: + if not self.match_endpoint(endpoint_info, endpoint_filter): + continue + + if vm_info: + if 'fvRsToVm' in endpoint_info and endpoint_info['fvRsToVm'] is not None: + vm_dn = endpoint_info['fvRsToVm']['tDn'] + vm_mac = endpoint_info['mac'] + hv_dn = endpoint_info['fvRsHyper']['tDn'] + + endpoint_info['vm'] = self.get_endpoint_vmm_vm( + vm_filter=['dn:%s' % (vm_dn)], + expected_single=True + ) + + endpoint_info['vnic'] = self.get_endpoint_vmm_vnic( + vm_filter=[ + 'dn:%s' % (vm_dn), + 'mac:%s' % (vm_mac) + ], + expected_single=True + ) + + endpoint_info['hv'] = self.get_endpoint_vmm_hv( + vm_filter=['dn:%s' % (hv_dn)], + expected_single=True + ) + + if not self.match_endpoint(endpoint_info, endpoint_filter): + continue + + if fabric_info: + endpoint_info['fabric'] = self.get_fabric_path_ports( + endpoint_info['fabricPathDn'], + resolve=True + ) + if not self.match_endpoint(endpoint_info, endpoint_filter): + continue + + endpoints.append(endpoint_info) + + endpoints = sorted( + endpoints, + key=lambda i: i['mac'] + ) + + return endpoints diff --git a/lib/aci/endpoint/ip/__init__.py b/lib/aci/endpoint/ip/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/endpoint/ip/__pycache__/__init__.cpython-310.pyc b/lib/aci/endpoint/ip/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a619d7f838d4bdca1356a44304a592cf4b89a434 GIT binary patch literal 152 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HuvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oYFXr83E zzLKtai=H~;joYSVU_Q-^G@5T_>hbu1fCRnNg&^bwoqvUca{=m)0KO7UG<^pB&QhY; z4M}(o@i)T2y8!hk0EVPglay(y*)vJG=32lhbOgD3;qa=`O>L|8y1A|vbxt8=5VTP* zK|N4|+K@wMKLLX9rd&8I)x)nZmuGUBl~(4~=e5*kV@hegaU0`gY3DM_tu(L2q-~^y za;MEhh?TOHZI!~mJc6K)AK%hC9p2=4KS%@y((3u0gJH>*S<*qT6H>r*e$XxN_>|m! z*a{8tPE1HAI=Uh5q@$hq^cuS#b^Rn~NaowRZPsnVgUGaY>Ha+P=Bg>CRfsljF|GP` zlgQy-!r>~bvchOp&+km$27z4#u`~}paKOIz6s7p7Ii6qIeC^+k<+^xGB3F^yRq z0n!m=Pl7#u{%;WP<0KrTGe`8qCHaTew~%O8;5n=7~#*_b{0}|!?yh% bcrgJ6ypPQi+Mn+wg?O^7b&lEn@{Y)F56pBbMxp)f;OU!Ix>E^@Tw4iviKf{9_{Y$xe z@-GO2v#F&ScrQDlS+1(wU-u)RWKM81A_XZ!API)S4pNSsq{4P|)W{i? z9m1bEVL@Di66?%pk!zP% z0@YR-p`Ef@WrfiXBFnW<|04)piz3ryTt8XAjsd}W{V97sJ9>-{%@XoXoy)9HQnn*0 ziwZZ!pT|-@ZZflf>9jgKJvt>>>xc7=oTnj-S$C5}JUu6GF?ov*-eO(Hniky6+m-di V{HWF|w!`baha11UPIe44{s%PhZU6uP literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/ip/info.py b/lib/aci/endpoint/ip/info.py new file mode 100644 index 00000000..cd55e520 --- /dev/null +++ b/lib/aci/endpoint/ip/info.py @@ -0,0 +1,38 @@ +class EndpointIpInfo(): + def __init__(self): + pass + + def get_endpoint_ip_info(self, managed_object): + # "addr": "", + # "annotation": "", + # "baseEpgDn": "", + # "bdDn": "", + # "childAction": "", + # "createTs": "2022-09-14T22:56:47.772+01:00", + # "debugMACMessage": "", + # "esgUsegDn": "", + # "extMngdBy": "", + # "fabricPathDn": "topology/pod-1/paths-2205/pathep-[eth1/25]", + # "flags": "", + # "lcOwn": "local", + # "modTs": "2022-09-14T22:57:01.829+01:00", + # "monPolDn": "uni/tn-common/monepg-default", + # "rn": "ip-[]", + # "status": "", + # "uid": "0", + # "userdom": "all", + # "vrfDn": "uni/tn-common/ctx-Infra_VRF" + info = {} + info['__Output'] = {} + + keys = [ + 'addr', + 'baseEpgDn', + 'vrfDn' + ] + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + return info diff --git a/lib/aci/endpoint/ip/main.py b/lib/aci/endpoint/ip/main.py new file mode 100644 index 00000000..76041a82 --- /dev/null +++ b/lib/aci/endpoint/ip/main.py @@ -0,0 +1,6 @@ +from lib.aci.endpoint.ip.info import EndpointIpInfo + + +class EndpointIp(EndpointIpInfo): + def __init__(self): + EndpointIpInfo.__init__(self) diff --git a/lib/aci/endpoint/main.py b/lib/aci/endpoint/main.py new file mode 100644 index 00000000..526c69d7 --- /dev/null +++ b/lib/aci/endpoint/main.py @@ -0,0 +1,16 @@ +from lib.aci.endpoint.api import EndpointApi +from lib.aci.endpoint.info import EndpointInfo +from lib.aci.endpoint.ip.main import EndpointIp +from lib.aci.endpoint.hv.main import EndpointHv +from lib.aci.endpoint.vm.main import EndpointVm +from lib.aci.endpoint.vmm.main import EndpointVmm + + +class Endpoint(EndpointApi, EndpointInfo, EndpointIp, EndpointHv, EndpointVm, EndpointVmm): + def __init__(self): + EndpointApi.__init__(self) + EndpointInfo.__init__(self) + EndpointIp.__init__(self) + EndpointHv.__init__(self) + EndpointVm.__init__(self) + EndpointVmm.__init__(self) diff --git a/lib/aci/endpoint/output.py b/lib/aci/endpoint/output.py new file mode 100644 index 00000000..036b5b54 --- /dev/null +++ b/lib/aci/endpoint/output.py @@ -0,0 +1,128 @@ +class EndpointOutput(): + def __init__(self): + pass + + def print_endpoints_apic(self, endpoints): + if not self.is_apic: + return False + + if len(endpoints) == 0: + return False + + if 'apic' not in endpoints[0]: + return False + + return True + + def print_endpoints(self, endpoints, bridge_domain_name=True, stream='default', title=False): + if title: + self.my_output.default( + 'Endpoint [#%s]' % (len(endpoints)), + underline=True, + before_newline=True + ) + + if len(endpoints) == 0: + self.my_output.default('None') + return + + is_apic = self.print_endpoints_apic(endpoints) + order = [] + if is_apic: + order = ['apic'] + + order = order + [ + 'flags', + 'mac', + 'fvIp.addr', + 'epgNameApTenant', + 'encapT', + 'bdNameTenant', + 'vrfNameTenant', + 'fabric.ep' + ] + + headers = [] + if is_apic: + headers = ['Apic'] + + headers = headers + [ + 'SF', + 'MAC Address', + 'IP Address', + 'EPG', + 'Encap', + 'BD', + 'VRF', + 'Fabric' + ] + + if not bridge_domain_name: + order.remove('bdNameTenant') + headers.remove('BD') + + self.my_output.my_table( + self.my_output.expand_lists( + endpoints, + order, + ['fvIp', 'fabric'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + remove_empty_columns=True, + table=True, + stream=stream + ) + + def print_endpoints_vmm(self, endpoints): + order = [] + + is_apic = self.print_endpoints_apic(endpoints) + if is_apic: + order = ['apic'] + + order = order + [ + 'flags', + 'mac', + 'fvIp.addr', + 'vm.vmm', + 'hv.name', + 'vm.name', + 'vm.state', + 'vnic.name', + 'vnic.operSt' + ] + + headers = [] + if is_apic: + headers = ['Apic'] + + headers = headers + [ + 'SF', + 'MAC Address', + 'IP Address', + 'VMM', + 'Hypervisor', + 'VM Name', + 'VM State', + 'vNIC Name', + 'vNIC State' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + endpoints, + order, + ['fvIp'] + ), + merge=True, + order=order, + headers=headers, + allow_order_subkeys=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/endpoint/vm/__init__.py b/lib/aci/endpoint/vm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/endpoint/vm/__pycache__/__init__.cpython-310.pyc b/lib/aci/endpoint/vm/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec82bbaa45df3c9f5f57e5c0f71a8b0e748705bc GIT binary patch literal 152 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HuvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oYF zTmO=-z4SNql+ikyHYEe|G5tgBbFoo%qZT@(cLkEh8a;Xqlzec2Q#La;&^hEVD4TReyG%{HkJQceyZkmPB5jn z7)PI=JC2|LbI9~3Lf}ppa~n%_@aNs+y;x?25xH@BEtGC_A&k?u(N+}ZT4cEq`mva3 zN@1|v>1q>FDNSX(l<{9K0w=d`p36Gzzsci!ZwUrbR;TX_0|Q%Xpv7Ltu)yiulPzo6 z1za6&xkA3>V`zCx8nDMLY5Chn?q<+-lbl8|mutUT`%x08twQ2_=5=6xQXpI);lFHF zx@&oq*tnZ8EVC+GXeI0GZ#wsZ$Ib#@>WvEw@$ZmqR2yC|w3q!PWK&}M^E&p@ZI};J zlG5}QA{h|+ozvTs|Az5W{uBkH_$n*4lwn`WvR3ON#sevD)>*N8v9XRljPSI&T@CTsuLOR~nI*Zxe0*~MUxH_c# literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/vm/__pycache__/main.cpython-310.pyc b/lib/aci/endpoint/vm/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a5c7be5554e8ea46da3cad75e0395885aa916bd GIT binary patch literal 509 zcmYjNu};G<5Ix5!R8`xB4vef>vLYdbDpd%vbU|W>ELkDvN>=Tp*li>b8~p|*1{nFJ ztW5j@6X%qwIqALl?901%SB*vkpm!8^8$p7LY6U z%CiXLJ4kvzR0RoZ#@8jTDqXJc?QOZJig4YHh>|J6Plyy`41pvVMq9`@a*~Rh!9k;7 zRJMQb+zBuBAVX7L5?h#r2=XBT3b8!Za$ zi%OuXl@Z!2S1Tuseh_(~h58>s)K=JBm+9)sg?01@KIo6x^U1+ux^Ffo@6@@>t&*}C zNNFqFm~b9S`MAl=?xodg?R4mvWL+38H1dJ^Fl6n`JmJ|Xc}vM#y7!jWHr2G?cHXwE WBNj$=L9yvy?mS$D-Lg`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HGvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oYF&ryk0@& WEe@O9{FKt1R6CHV#Y{kgg#iE|2qh^1 literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/vmm/__pycache__/hv.cpython-310.pyc b/lib/aci/endpoint/vmm/__pycache__/hv.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d53c335814e9f7427fcc206c2011d98f5ed8d89 GIT binary patch literal 2023 zcmah~%Wm676rC9kDO#qT)JantEmAe;i$LRL7KKr?NFOQCC_vq2p(-V44lUE>L!O}o zM4*8J&9)!Voz-1`iQBHS?AD9A=Teeia9|3$GjnI=a^{?SE{m0wHpBDppAXe@kFkGf zaPhG)_!56}A4W07QP`MhqY#UR*=(_yS5a$S7R z0zQH_W<9PLwtG!5-m{cc_AAzt%26$}wsO@HT1U0jGTN5nc+pC|@=dOWMUt1#v+T*Z z8;J|Apgz6jG5%&9reyoP;)?&lD;5aFU@gTEM|5#mhYp)4UuxP|TR#+o+JdiM%ZebL zza|)GS+F1&==H$`i&-({qn)IW@L`7f4<2danCf4Iv_tRvjA4W-k z5vY$q{k`$#@MY}=L6RqB5ZH)fDB>z_^U1wSSKC}HiZ~W59$HNQ=86iPiXDTSDLAXH>>!^44r}^W625Z`VtMxD28+G)6l(Y26Bk zNfcy-ZqdjIheKck^j#X>%ECMx#40Fu_T#8D_3CAZUcssc_L-sNt=}gY6EHA|uM!4? zcMD?4d2R>;}9$x0)hWMAVkH|cu=2r|7b|ex; zP;Y?(CH~?7+X4Z%k0f$YRC0?|vf^W=->Y~9GG@L*4|_lrh?P^W?55|S*P<25#V%0n zFLf!Ao{h@ksPvb5UN{bu^edGm`F7b`Zbr|bLmEWIC@+5=rb&KK3zhfo#CaL(Bp*Bt zp`NT2?1braPI*+3G2X=2dOZKLqK3w#gFZ|Ox|gBISM}7 zRZ(q{-TLk|hcXlY=`6K7^VIHSBU5&E;?8+?sm^YqO*sKmq_Ryy&~G(D(RXm{nSktA z>q6@f$Z?y@EtrLXz=xUP-x_BPoL6wy53u@2{7na@4QMI*Nefa+(H3n$y-){~@Zd(c z&876G)ITe}RN|>JO(6lKECJr8!dr<3RLFqpPsI;}Uau^{IOYz$d1-F)&F9T|7q_!< zCzWf;5d9GulJ|BB0*5M z1C%p0N~!M!!Qm)OXES=4j@K~Putm`8Psp5~yXjFG(*zsAXYd_nE>R=hcim0zUNh76 eEqs=eo#rdmc&-alyIZrPd_n4LJ}Mqtv;GI#ChMO7 literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/vmm/__pycache__/main.cpython-310.pyc b/lib/aci/endpoint/vmm/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..432c94e3848e5269add93afaa4f65958caf2236b GIT binary patch literal 704 zcmZ`%v5wR*5S@vW-PPXi(VP$kqM%EY8le+9>4c!#=A-zA#$>Rh|qhVZ)o>tY+| z;=v?i+q$OV%BcxDoRO!81QsM3kQw#OjJQE53{t;hIGWIGnv7Bp#xZl8lc%QyJNS;D z;g;swW%rRdLy=A3_BJZ--l)29%Kq7h>O)YWc5QX_G0v%+J@E@Haf!$H>0~lcbuWSw z%A8fTb+B3wORYm^u06*qtv_7Xe*a}89feKch{|I@z&weES->%lH=A-UACt<8R8|L- z6{)P=_Z15r_wk>UKI~I?NAk%(S$cZgeG<1FTTX=W0wb#%7N`4pUeF&3X+f}p6|V4+ F_zm%Nq{{#R literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/vmm/__pycache__/vm.cpython-310.pyc b/lib/aci/endpoint/vmm/__pycache__/vm.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cf92ed24c923c05826836ac6290130186fc1e62 GIT binary patch literal 2042 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 XEmv-GQn)*lP`;s#oRYgLTebcL=kxmY literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/vmm/hv/__pycache__/main.cpython-310.pyc b/lib/aci/endpoint/vmm/hv/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..702f5bc7b48f8472dda9250c870fdd3809e1099c GIT binary patch literal 613 zcmZ`$!AiqG5S`7Y8cHh)QUtwt%q1V7B9$WQr5C|NSXg3qOPB5@F`EVyZ}vm<=)oV# z)sw&A$=TFOdvM?lGqbz%-puCxeizU_s+l+@0G}>dw+<#lgpJS%5JZC^F(EGYv}b5c z30#4o!e4;!C6V;SkA2a(g>dT&-#|#3-OEfAxyq_LW3KCqLSb!hqjr-`^3>g4HxH8` z!tSG!5EB8hCy4MC5K}>s!EgE-ZBiWJ&shWBPqMI$^U!E0!vo=1j<1YNo6#Ygsa_?pcy5CVyvTwJ~g3 zGn1$+DjrL>$t{HS(RIlVc^YhJk5<%U91C@1iIJQ)UCvD|=Gw(Q&L8H9UY@iKTU~1| zz}}@JaBMA806o%H#$hKuM3E7Sj8-Be6d6tHC@ECCfcWUY8w!7@T}s<*jnZwVbi7S) Qwp4oVHgDamJtQB{A1auO?*IS* literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/vmm/hv/api.py b/lib/aci/endpoint/vmm/hv/api.py new file mode 100644 index 00000000..292223a1 --- /dev/null +++ b/lib/aci/endpoint/vmm/hv/api.py @@ -0,0 +1,48 @@ +class EndpointVmmHvApi(): + def __init__(self): + self.endpoint_vmm_hv_mo = None + + def get_endpoint_vmm_hv_mo(self): + if self.endpoint_vmm_hv_mo is not None: + return self.endpoint_vmm_hv_mo + + cache = self.get_object_cache( + 'compHv' + ) + if cache is not None: + self.endpoint_vmm_hv_mo = cache + self.log.apic_mo( + 'compHv', + self.endpoint_vmm_hv_mo + ) + return self.endpoint_vmm_hv_mo + + managed_objects = self.get_class( + 'compHv' + ) + if managed_objects is None: + self.log.error( + 'get_endpoint_vmm_hv_mo', + 'API failed' + ) + return None + + self.endpoint_vmm_hv_mo = [] + + for managed_object in managed_objects['imdata']: + attributes = managed_object['compHv']['attributes'] + self.endpoint_vmm_hv_mo.append( + attributes + ) + + self.log.apic_mo( + 'compHv', + self.endpoint_vmm_hv_mo + ) + + self.set_object_cache( + 'compHv', + self.endpoint_vmm_hv_mo + ) + + return self.endpoint_vmm_hv_mo diff --git a/lib/aci/endpoint/vmm/hv/info.py b/lib/aci/endpoint/vmm/hv/info.py new file mode 100644 index 00000000..fe4aaad0 --- /dev/null +++ b/lib/aci/endpoint/vmm/hv/info.py @@ -0,0 +1,92 @@ +from lib import filter_helper + + +class EndpointVmmHvInfo(): + def __init__(self): + self.endpoint_vmm_hv = None + + def get_endpoint_vmm_hv_info(self, managed_object): + info = {} + info['__Output'] = {} + keys = [ + 'availAdminSt', + 'availOperSt', + 'countUplink', + 'dn', + 'enteringMaintenance', + 'mgmtIp', + 'name', + 'oid', + 'state' + ] + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['vmm'] = info['dn'].split('[')[1].split(']')[0] + + return info + + def get_endpoints_vmm_hv_info(self): + if self.endpoint_vmm_hv is not None: + return self.endpoint_vmm_hv + + managed_objects = self.get_endpoint_vmm_hv_mo() + if managed_objects is None: + return None + + self.endpoint_vmm_hv = [] + for managed_object in managed_objects: + self.endpoint_vmm_hv.append( + self.get_endpoint_vmm_hv_info( + managed_object + ) + ) + + self.log.apic_mo( + 'compHv.info', + self.endpoint_vmm_hv + ) + + return self.endpoint_vmm_hv + + def match_endpoint_vmm_hv(self, vm_info, vm_filter): + if vm_filter is None or len(vm_filter) == 0: + return True + + for rule in vm_filter: + key = rule.split(':')[0] + value = ':'.join(rule.split(':')[1:]) + + if key == 'dn': + if not filter_helper.match_string(value, vm_info['dn']): + return False + + return True + + def get_endpoint_vmm_hv(self, vm_filter=None, expected_single=False): + all_vms = self.get_endpoints_vmm_hv_info() + + vms = [] + + for vm_info in all_vms: + if self.match_endpoint_vmm_hv(vm_info, vm_filter): + vms.append( + vm_info + ) + + if expected_single: + if len(vms) == 0: + return None + + if len(vms) == 1: + return vms[0] + + self.log.error( + 'get_endpoint_vmm_hv', + 'Expected single result' + ) + return None + + return vms diff --git a/lib/aci/endpoint/vmm/hv/main.py b/lib/aci/endpoint/vmm/hv/main.py new file mode 100644 index 00000000..3c082e0e --- /dev/null +++ b/lib/aci/endpoint/vmm/hv/main.py @@ -0,0 +1,8 @@ +from lib.aci.endpoint.vmm.hv.api import EndpointVmmHvApi +from lib.aci.endpoint.vmm.hv.info import EndpointVmmHvInfo + + +class EndpointVmmHv(EndpointVmmHvApi, EndpointVmmHvInfo): + def __init__(self): + EndpointVmmHvApi.__init__(self) + EndpointVmmHvInfo.__init__(self) diff --git a/lib/aci/endpoint/vmm/main.py b/lib/aci/endpoint/vmm/main.py new file mode 100644 index 00000000..463646f6 --- /dev/null +++ b/lib/aci/endpoint/vmm/main.py @@ -0,0 +1,10 @@ +from lib.aci.endpoint.vmm.hv.main import EndpointVmmHv +from lib.aci.endpoint.vmm.vm.main import EndpointVmmVm +from lib.aci.endpoint.vmm.vnic.main import EndpointVmmVnic + + +class EndpointVmm(EndpointVmmHv, EndpointVmmVm, EndpointVmmVnic): + def __init__(self, log_id=None): + EndpointVmmHv.__init__(self) + EndpointVmmVm.__init__(self) + EndpointVmmVnic.__init__(self) diff --git a/lib/aci/endpoint/vmm/vm/__init__.py b/lib/aci/endpoint/vmm/vm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/endpoint/vmm/vm/__pycache__/__init__.cpython-310.pyc b/lib/aci/endpoint/vmm/vm/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9936fa5f312fb18f7acd3edf8f46dabb42d81c06 GIT binary patch literal 156 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!H$vsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oYF#q7f!* literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/vmm/vm/__pycache__/api.cpython-310.pyc b/lib/aci/endpoint/vmm/vm/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e05c6176e69be1a3323729acfd6daa2e33d25bc0 GIT binary patch literal 1027 zcmZuw&1xGl5SFxBWn-K)QSy*wV9td^O| zzMBx`81_(F^<+m6-LU?kuRY}ze2DwaN=oIQmH>xCE;$^2^UZ8ht(F;@dVQ$=sxbC9 zP3D_}$@l2#=Mai19^m`P?m}3-qVxDZNp#oCT0L%$sm>Nl(uQ$8n5~C7J4I|4(K-Y(IbU^l|&J z6NT+=n0Ax4(#JY#hp9Hl+O(r^uifc}?U{`>Y@oM8xUn&KWBniq`(YLYE?rN4l=;cM zYaVaRwsmRCtkD^XUby}{l#rc@kmbN=ll6f6ANF&QQ=ZnK1gx0emzS6W$+T=h}A@# zB5G|YIXeK|hTQn1?O;CQV|L1O@O{Y4EuvztAZ5-G%f(Yc`$mu>Cl_NrMwT7j!I~Vo ziqp5T;DuFCSTs)-yGcCQjW_6N4bKo`?CMRf#)@CkefGOjMjz147mrtX^+tXO$~a%3oz zZ6)qx-B&@HnXunOa0()qj^l!db^*$yL|SQvkv4TY;~saSp}q?F%EZzYKL3OR>1~MH z0M!>Yeiw2XaErH~@K@IXzR^l^>l(b|Xu;qDUQ`Y+*69Jfoa#*#V1dO1(pZ?4Tmn$H z;HjSr^G)XDavFv;V)t||0PZ?KMi3|q3O=LC6PsyQUi>>I@D|Y8Pv>biW!cH(vqH92_{yM2T_D8P)Z=o zLpnFJGaIau$v2v3U>u*k6`Hre~O6Dr;mh%s?ruba| literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/vmm/vm/__pycache__/main.cpython-310.pyc b/lib/aci/endpoint/vmm/vm/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f266bc577feff478ea6d06aace65af115a45ab43 GIT binary patch literal 613 zcmZ`$!Ab)$5S?tcbt$bVND=hnaY6P2RHPyzUV0IFSOQ_)q!60yuF1Bbc(Wg(M}KLr zp8N$*PPSIsg9C4vnI!YxOv=Ha2WY2mCQb;zr%yJmgUJZt5_AFt(O^hQh>rsu7@AT7 zw;-qpmmoq(Bz+CjP;~Ag?tbALh)J_|Q;4cmMLjWQVy-HMwf(KyT`?_le|yscOhyQI zfKEb61f+o=B3MF71x1Fi8Em!5afCnfF-2S>+#$Le-pC8Qqxd>lM*^@78OPLmwkG0S z6{_ak`j;p(bW%@0!0urBeSUq$W|>wjS1vD^kPE4qa?&oOWm-M3ELTka&dL_XAehNi zkyKCCZ?cPUA-W#fCC|ex?a7*YjANmWA~TZnrpLJ{#a#Qi&-vp#)2oxVVXJGyMcCVV z0?*bmMbIa0WgK_XBNUmS$Yd=tL6L|gt5myy^!UFU3V*0wO51FM(r?Ck-X^+ODZTWY LcYfABk`L(*9~_I2 literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/vmm/vm/api.py b/lib/aci/endpoint/vmm/vm/api.py new file mode 100644 index 00000000..3d06f99b --- /dev/null +++ b/lib/aci/endpoint/vmm/vm/api.py @@ -0,0 +1,48 @@ +class EndpointVmmVmApi(): + def __init__(self): + self.endpoint_vmm_vm_mo = None + + def get_endpoint_vmm_vm_mo(self): + if self.endpoint_vmm_vm_mo is not None: + return self.endpoint_vmm_vm_mo + + cache = self.get_object_cache( + 'compVm' + ) + if cache is not None: + self.endpoint_vmm_vm_mo = cache + self.log.apic_mo( + 'compVm', + self.endpoint_vmm_vm_mo + ) + return self.endpoint_vmm_vm_mo + + managed_objects = self.get_class( + 'compVm' + ) + if managed_objects is None: + self.log.error( + 'get_endpoint_vmm_vm_mo', + 'API failed' + ) + return None + + self.endpoint_vmm_vm_mo = [] + + for managed_object in managed_objects['imdata']: + attributes = managed_object['compVm']['attributes'] + self.endpoint_vmm_vm_mo.append( + attributes + ) + + self.log.apic_mo( + 'compVm', + self.endpoint_vmm_vm_mo + ) + + self.set_object_cache( + 'compVm', + self.endpoint_vmm_vm_mo + ) + + return self.endpoint_vmm_vm_mo diff --git a/lib/aci/endpoint/vmm/vm/info.py b/lib/aci/endpoint/vmm/vm/info.py new file mode 100644 index 00000000..312e81e9 --- /dev/null +++ b/lib/aci/endpoint/vmm/vm/info.py @@ -0,0 +1,115 @@ +from lib import filter_helper + + +class EndpointVmmVmInfo(): + def __init__(self): + self.endpoint_vmm_vm = None + + def get_endpoint_vmm_vm_info(self, managed_object): + # "cfgdOs": "Red Hat Enterprise Linux 8 (64-bit)", + # "childAction": "", + # "descr": "", + # "dn": "comp/prov-VMware/ctrlr-[EU-SPDC-POD2B]-EU-SPDC-POD2B/vm-vm-12127", + # "ftRole": "unset", + # "guid": "5034b867-282f-2aff-9024-d4d063029325", + # "id": "0", + # "issues": "", + # "lcOwn": "local", + # "modTs": "2023-01-16T21:15:07.545+01:00", + # "monPolDn": "uni/tn-common/monepg-default", + # "name": "cluster-6csrc-rhcos", + # "nameAlias": "", + # "oid": "vm-12127", + # "os": "", + # "state": "poweredOff", + # "status": "", + # "template": "yes", + # "type": "virt", + # "uuid": "4234e811-d953-f70b-d555-fa5d1b947709" + info = {} + info['__Output'] = {} + + keys = [ + 'cfgdOs', + 'dn', + 'name', + 'oid', + 'os', + 'state' + ] + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['vmm'] = info['dn'].split('[')[1].split(']')[0] + + if info['state'] == 'poweredOn': + info['__Output']['state'] = 'Green' + else: + info['__Output']['state'] = 'Red' + + return info + + def get_endpoints_vmm_vm_info(self): + if self.endpoint_vmm_vm is not None: + return self.endpoint_vmm_vm + + managed_objects = self.get_endpoint_vmm_vm_mo() + if managed_objects is None: + return None + + self.endpoint_vmm_vm = [] + for managed_object in managed_objects: + self.endpoint_vmm_vm.append( + self.get_endpoint_vmm_vm_info( + managed_object + ) + ) + + self.log.apic_mo( + 'compVm.info', + self.endpoint_vmm_vm + ) + + return self.endpoint_vmm_vm + + def match_endpoint_vmm_vm(self, vm_info, vm_filter): + if vm_filter is None or len(vm_filter) == 0: + return True + + for rule in vm_filter: + key = rule.split(':')[0] + value = ':'.join(rule.split(':')[1:]) + + if key == 'dn': + if not filter_helper.match_string(value, vm_info['dn']): + return False + + return True + + def get_endpoint_vmm_vm(self, vm_filter=None, expected_single=False): + all_vms = self.get_endpoints_vmm_vm_info() + + vms = [] + + for vm_info in all_vms: + if self.match_endpoint_vmm_vm(vm_info, vm_filter): + vms.append( + vm_info + ) + + if expected_single: + if len(vms) == 0: + return None + + if len(vms) == 1: + return vms[0] + + self.log.error( + 'get_endpoint_vmm_vm', + 'Expected single result' + ) + return None + + return vms diff --git a/lib/aci/endpoint/vmm/vm/main.py b/lib/aci/endpoint/vmm/vm/main.py new file mode 100644 index 00000000..91eb120b --- /dev/null +++ b/lib/aci/endpoint/vmm/vm/main.py @@ -0,0 +1,8 @@ +from lib.aci.endpoint.vmm.vm.api import EndpointVmmVmApi +from lib.aci.endpoint.vmm.vm.info import EndpointVmmVmInfo + + +class EndpointVmmVm(EndpointVmmVmApi, EndpointVmmVmInfo): + def __init__(self): + EndpointVmmVmApi.__init__(self) + EndpointVmmVmInfo.__init__(self) diff --git a/lib/aci/endpoint/vmm/vnic/__init__.py b/lib/aci/endpoint/vmm/vnic/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/endpoint/vmm/vnic/__pycache__/__init__.cpython-310.pyc b/lib/aci/endpoint/vmm/vnic/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec34fad5dd0919e445e730ad9547e6d627a2ac6a GIT binary patch literal 158 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HcvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oYFO#L}6!!fQ5Xf_%?Y%K5d)_HSlZ`6>gJrj(oGI=9iR`vsZUd znYC`8*^PSrI4$z>xMx!TXs9c(Y}U=LPum9{KRi2;CezACCRehOzAdZDn!&izt{Yoy zp5H`*VsNU{N~ALVtbLFbL*IgS0k|27xx%-xEl_B<_n_J|qMR|xuj3#B8!XDNBK|MNFm}ax#5%0g zAfoGt&v86l;KS+jd*c9s<1wnJy3T;x7 zmy}Qo6c8Zpy`LcU)-UNl@Y+*;A&0ncDA|x51tq}Y?s9fG``)}^r&=vDT>lJC6|XY( zFHL4I3zHvkC!fJ6rg+3+-r$_QU`iS`0v z>g;tL^Bb&c*5HaE0$1XKH7sQ*iKkSya`3cONx67Bs;U-M<$^a#Y60I`%J1#9Rksti z)5ADEY=^;5?c+|sXTC#Yf%`e`gifhg#ynVT=XIp{iJnIA`f=>_5d(`d(b4hW%sANa z?z`vDnx}pgHiIw;I!&efI%g(JqO*IKVLmAsdR2Wx#5ewSfO$d}w9XkLvnGas#Sqr%{Fv`d@1(ZeoHH_b9ADEG?xTV zE>HD&l3TEa^Td?M|6xm~-W90V)Bwrjj*IunLm0X0a#y$xEU$3!x*{rE%F25w2HW%S z{dmY5B}0`-#21J+G04~n3Z}=6OQQqKM|{kNJVVX)m|3P`Y87RbaqzG>6y!I89a)(e z^D&fiwuUu1vK6OyW5J84C_+&mRD(|3J*%75>LQ@8!Tu8ylp#P($|*)~xZ)_*ib8>A0?>X-r9R@y8sp76L%~~s z`Dz8_|A$y-V?MMqv<~cinpz`?(zaI_$g=THBu_b0CB&1;g~wjuv2epxP=h%Xj?QTN)VZA_Mt2+1cFBt=JC+3!6Kn_^%%)H5+`O{OzP0g(&h9v?fDp&MUE> z2Cuv%HDS92iVIPc`f*Xw`2q%$c9~1li?q2%d+fd+_4IAp)+UiY(8kZ$QpjQj#JFOK zKY(2+=p!p$Ll#@}sQO5}`u+z*QPPDfPB1`qGpN97frgCwPZh938JV5&u`u^D32N-3 z_T5aFC#jXmDWQ)@G1IvK37a4Tbds_PjiCFJLdYvC{wWg*%m$%yf3|F|t9G!u_j?zO zMXN^%5RUXCqmy2g0%~d%=1VfGWauAe)?jj58`CjUGRzmWbVpC4c#|klRuthQXi_kS z6mg3W^A*;pOCv?(E zgU%Id1mlY5o%Q@^^2ShKEPBGsi7C06gh^?J`l}%gQkzMrbGyjfwcIUtZE3l9Q?FSl b58^>uo$7+2!jAYG#C;S;&M-WhQ^e@ zEeI<76$oDvNnicg7oB?uyI(j1A*uIoGEw9zTTG3aW-7fd6m}1`x_8+uPu)b@JS;}& z_7H=Fm!0mG!x z0JoP8!r?Vo0rW}JnS`DA1c^pSG};i2kZ9zHMoFQXGsLI=|D*7&n&UJJTd?jzrNgd+ Ri#6LT_X5@_?jwOC`U97tkvsqZ literal 0 HcmV?d00001 diff --git a/lib/aci/endpoint/vmm/vnic/api.py b/lib/aci/endpoint/vmm/vnic/api.py new file mode 100644 index 00000000..f42d0a98 --- /dev/null +++ b/lib/aci/endpoint/vmm/vnic/api.py @@ -0,0 +1,48 @@ +class EndpointVmmVnicApi(): + def __init__(self): + self.endpoint_vmm_vnic_mo = None + + def get_endpoint_vmm_vnic_mo(self): + if self.endpoint_vmm_vnic_mo is not None: + return self.endpoint_vmm_vnic_mo + + cache = self.get_object_cache( + 'compVNic' + ) + if cache is not None: + self.endpoint_vmm_vnic_mo = cache + self.log.apic_mo( + 'compVNic', + self.endpoint_vmm_vnic_mo + ) + return self.endpoint_vmm_vnic_mo + + managed_objects = self.get_class( + 'compVNic' + ) + if managed_objects is None: + self.log.error( + 'get_endpoint_vmm_vnic_mo', + 'API failed' + ) + return None + + self.endpoint_vmm_vnic_mo = [] + + for managed_object in managed_objects['imdata']: + attributes = managed_object['compVNic']['attributes'] + self.endpoint_vmm_vnic_mo.append( + attributes + ) + + self.log.apic_mo( + 'compVNic', + self.endpoint_vmm_vnic_mo + ) + + self.set_object_cache( + 'compVNic', + self.endpoint_vmm_vnic_mo + ) + + return self.endpoint_vmm_vnic_mo diff --git a/lib/aci/endpoint/vmm/vnic/info.py b/lib/aci/endpoint/vmm/vnic/info.py new file mode 100644 index 00000000..21ba622e --- /dev/null +++ b/lib/aci/endpoint/vmm/vnic/info.py @@ -0,0 +1,116 @@ +from lib import filter_helper + + +class EndpointVmmVnicInfo(): + def __init__(self): + self.endpoint_vmm_vnic = None + + def get_endpoint_vmm_vnic_info(self, managed_object): + # "adapterType": "Vmxnet3", + # "addressType": "assigned", + # "childAction": "", + # "descr": "", + # "dn": "comp/prov-VMware/ctrlr-[EU-SPDC-POD2B]-EU-SPDC-POD2B/vm-vm-12127/vnic-00:50:56:B4:16:6D", + # "guid": "241", + # "id": "0", + # "ip": "", + # "issues": "", + # "lcOwn": "local", + # "mac": "00:50:56:B4:16:6D", + # "modTs": "2023-01-16T20:52:58.626+01:00", + # "monPolDn": "uni/tn-common/monepg-default", + # "name": "Network adapter 1", + # "nameAlias": "", + # "oid": "4000", + # "operSt": "down", + # "status": "", + # "type": "virt", + # "uuid": "", + # "vmName": "" + info = {} + info['__Output'] = {} + + keys = [ + 'dn', + 'name', + 'operSt', + 'adapterType' + ] + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + if info['operSt'] == 'up': + info['__Output']['operSt'] = 'Green' + else: + info['__Output']['operSt'] = 'Red' + + return info + + def get_endpoints_vmm_vnic_info(self): + if self.endpoint_vmm_vnic is not None: + return self.endpoint_vmm_vnic + + managed_objects = self.get_endpoint_vmm_vnic_mo() + if managed_objects is None: + return None + + self.endpoint_vmm_vnic = [] + for managed_object in managed_objects: + self.endpoint_vmm_vnic.append( + self.get_endpoint_vmm_vnic_info( + managed_object + ) + ) + + self.log.apic_mo( + 'compVNic.info', + self.endpoint_vmm_vnic + ) + + return self.endpoint_vmm_vnic + + def match_endpoint_vmm_vnic(self, vm_info, vm_filter): + if vm_filter is None or len(vm_filter) == 0: + return True + + for rule in vm_filter: + key = rule.split(':')[0] + value = ':'.join(rule.split(':')[1:]) + + if key == 'dn': + if not filter_helper.match_string('%s/*' % (value), vm_info['dn']): + return False + + if key == 'mac': + if not filter_helper.match_string('*/vnic-%s' % (value), vm_info['dn']): + return False + + return True + + def get_endpoint_vmm_vnic(self, vm_filter=None, expected_single=False): + all_vms = self.get_endpoints_vmm_vnic_info() + + vms = [] + + for vm_info in all_vms: + if self.match_endpoint_vmm_vnic(vm_info, vm_filter): + vms.append( + vm_info + ) + + if expected_single: + if len(vms) == 0: + return None + + if len(vms) == 1: + return vms[0] + + self.log.error( + 'get_endpoint_vmm_vnic', + 'Expected single result' + ) + return None + + return vms diff --git a/lib/aci/endpoint/vmm/vnic/main.py b/lib/aci/endpoint/vmm/vnic/main.py new file mode 100644 index 00000000..2eb5008c --- /dev/null +++ b/lib/aci/endpoint/vmm/vnic/main.py @@ -0,0 +1,8 @@ +from lib.aci.endpoint.vmm.vnic.api import EndpointVmmVnicApi +from lib.aci.endpoint.vmm.vnic.info import EndpointVmmVnicInfo + + +class EndpointVmmVnic(EndpointVmmVnicApi, EndpointVmmVnicInfo): + def __init__(self): + EndpointVmmVnicApi.__init__(self) + EndpointVmmVnicInfo.__init__(self) diff --git a/lib/aci/epg/__init__.py b/lib/aci/epg/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/epg/__pycache__/__init__.cpython-310.pyc b/lib/aci/epg/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..503e1c6ce7dc190b4188fb4e60c9ea969749e163 GIT binary patch literal 145 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HCvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oVroHpOniK1US>&ryk0@&Ee@O9{FKt1 OR6CGq#Y{kgg#iH9rXjHa literal 0 HcmV?d00001 diff --git a/lib/aci/epg/__pycache__/api.cpython-310.pyc b/lib/aci/epg/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63fd62c0f290aa7b13522eb95ff908b44d0ff713 GIT binary patch literal 1561 zcmb_cJ#XYT5G5swmbL5i#}$E-07(^KfwQ|bfgPMb4#5>MjJOjv5NMIRE1y zcB@=_W!l7U0;J5}VVi#uAim5{w>a(9AwcT!%?#&pKux{1l@J)e|Mr(mdxZRro9+l< z^Ae`ngXISziKK5~{t~1_23KSd=D@Fw0Cq27nlE8dB&Cw1fuu5cOVUt=lEIhB2x7V8 zuV&+uS&>t4T@A!|#u-e5;v`v+3|5Gs7X#|JnvJt*4Tu?4j{YQ?f!9BWXWtFqh_V>w zg~{uoRC84h3#0U0>0w!14@F)KA#^Ba#o_GE#aUKVh0QWdW^hU9{dOzpaAjLl#=!@t zS2hHl3vvUx8mePNSFnGel0MQUUBIn@|7t-|J6MBJco98PN^Xz* z{nqO7u=#0q2G1`XAI(o*U5@X6)n;~Jnro|-I?g9WDYdG;>5vCSm6wfF#}g$=J9#k@ zO=%DEx~c4%TV4udjz{yK%&B~VpR>9$9$e~rz5@324x#-~*n9%{TVB}7iM1Y|*HeJ- z0HfPR={wgOE1SX7GVm<#latHWUynplD(QGJmBI>_2y1n5-B@K(xD=*$Y&1VTPvez} z7NLwZK@Je;Nc&wOXjzF$d)}*6)rPdPT+$Zdb!DvU`AVE&AvL3q)_%Cv}fZIg7uat|F*0pw@BQveDRq3;j*Kwb9ZCwKwvze--+cBS{8*q(X z#YH~3juCH9MJ2{ce$Zvyvvop4Z)*Q@|Fi1|gAz>LHUr$7KVV5Hrz{94dmo1!Fd)jF zIAZ|=98mrgN5}&I#263yv=1J*4`}=^i~e84;XMAHvsMM3?$t#1yC3?@#~WM>B5X;O zn5ryuNe19mI1ReRB&Pk)bI>>ax8v`_eI4VY NHrMw)65q%k`43fuk5K>s literal 0 HcmV?d00001 diff --git a/lib/aci/epg/__pycache__/info.cpython-310.pyc b/lib/aci/epg/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0dc1dbb9bc7795ee15676ba4958d30bc3002114 GIT binary patch literal 14195 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 U?hG}aqIwKCM<359^46&HzmR+PlmGw# literal 0 HcmV?d00001 diff --git a/lib/aci/epg/__pycache__/main.cpython-310.pyc b/lib/aci/epg/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd53b6d7d63324dc6ceb4bd6fe656a1da0379f06 GIT binary patch literal 1001 zcmY+C%Z}496o&0wnoEj3Qq)LE@H8~4cUs%-;s6n2l60m+Rd(Z*DrSx$OC#)l{H|1SZ?a7I!)fzMXm%) zeEj{u<^IH1M^T;mRen&&xY4%eqQE1@&4S4#jP^c=AdGUtEKa#~N0`lRNXzMLSX@wu zpBpkbN;WXs_aJ-noqi=hz`MOQkUfwykUP+9Aa5Z5Oq{^Mbh{23%&+saOjdHAWeuL% zI4Ca448=q7Q34RStkVir{v=Hd(|=DkPt%XNl4&8^qE5Lu3YE%MG)K{-N`6T5LZ)JO zo$6dx$?kK5WpM$cU4evj+!ypq1YRWPbhcm)5!{FVzxBd zjAQ}3H&~!}UW-@qNfeqd+x0!Rgwzs9ErHaMd?$?&Y&HHWp)iag?BV2dSwN8_cpc-^ zG^$M1^ii~sJs7Xev5fj4T00GbbJZz`mQRBv7Fxd&pMqVCx2>S^`WU{Dx#P$Qe5MBN a==|rsfiJMY+D9M}iRie8wneAi|N9?3I^M?s literal 0 HcmV?d00001 diff --git a/lib/aci/epg/__pycache__/output.cpython-310.pyc b/lib/aci/epg/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..163d6fa0be1c74bc83b1dd91553ef0e8b95f1969 GIT binary patch literal 12714 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�ZHKB2@JS`OQePbVo3ZEKbus8zD3R( zXYpS`%)ElAd)2(#{FwQe`H*?le8gNv`C-6^@cfkdxH&iW7-Lw)m#~B>Z3=0eQ-|>c L_24YbROWvGL$XRA literal 0 HcmV?d00001 diff --git a/lib/aci/epg/api.py b/lib/aci/epg/api.py new file mode 100644 index 00000000..c7574276 --- /dev/null +++ b/lib/aci/epg/api.py @@ -0,0 +1,95 @@ +class EpgApi(): + def __init__(self): + self.epg_mo = None + + def get_epg_mo(self): + if self.epg_mo is not None: + return self.epg_mo + + cache = self.get_object_cache( + 'fvAEPg' + ) + if cache is not None: + self.epg_mo = cache + self.log.apic_mo( + 'fvAEPg', + self.epg_mo + ) + return self.epg_mo + + query = 'rsp-subtree=children&rsp-subtree-include=health,fault-count&rsp-subtree-class=fvRsBd,fvRsCons,fvRsProv,fvRsProtBy,fvRtMatchEPg,fvRsPathAtt,fvRsDomAtt' + managed_objects = self.get_class( + 'fvAEPg', + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_epgs_mo', + 'API failed' + ) + return None + + self.epg_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['fvAEPg']['attributes'] + attributes['fvBD'] = self.get_mo_children_attributes( + 'fvAEPg', + managed_object, + 'fvRsBd' + ) + attributes['fvRsCons'] = self.get_mo_children_attributes( + 'fvAEPg', + managed_object, + 'fvRsCons' + ) + attributes['fvRsProv'] = self.get_mo_children_attributes( + 'fvAEPg', + managed_object, + 'fvRsProv' + ) + attributes['fvRsProtBy'] = self.get_mo_children_attributes( + 'fvAEPg', + managed_object, + 'fvRsProtBy' + ) + attributes['fvMatchEPg'] = self.get_mo_children_attributes( + 'fvAEPg', + managed_object, + 'fvRtMatchEPg' + ) + attributes['fvRsPathAtt'] = self.get_mo_children_attributes( + 'fvAEPg', + managed_object, + 'fvRsPathAtt' + ) + attributes['fvRsDomAtt'] = self.get_mo_children_attributes( + 'fvAEPg', + managed_object, + 'fvRsDomAtt' + ) + attributes['healthInst'] = self.get_mo_child_attributes( + 'fvAEPg', + managed_object, + 'healthInst' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'fvAEPg', + managed_object, + 'faultCounts' + ) + self.epg_mo.append( + attributes + ) + + self.log.apic_mo( + 'fvAEPg', + self.epg_mo + ) + + self.set_object_cache( + 'fvAEPg', + self.epg_mo + ) + + return self.epg_mo diff --git a/lib/aci/epg/audit/__init__.py b/lib/aci/epg/audit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/epg/audit/api.py b/lib/aci/epg/audit/api.py new file mode 100644 index 00000000..7c1025d7 --- /dev/null +++ b/lib/aci/epg/audit/api.py @@ -0,0 +1,48 @@ +class EpgAuditApi(): + def __init__(self): + self.epg_audit_mo = None + + def get_epg_audit_mo(self): + cache = self.get_object_cache( + 'fvAEPg.audit' + ) + if cache is not None: + self.epg_audit_mo = cache + self.log.apic_mo( + 'fvAEPg.audit', + self.epg_audit_mo + ) + return self.epg_audit_mo + + query = 'rsp-subtree-include=audit-logs,no-scoped,subtree&order-by=aaaModLR.created|desc&page=0&page-size=%s' % (self.api_audit_limit) + managed_objects = self.get_class( + 'fvAEPg', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_epg_audit_mo', + 'API failed' + ) + return None + + self.epg_audit_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['aaaModLR']['attributes'] + self.epg_audit_mo.append( + attributes + ) + + self.log.apic_mo( + 'fvAEPg.audit', + self.epg_audit_mo + ) + + self.set_object_cache( + 'fvAEPg.audit', + self.epg_audit_mo + ) + + return self.epg_audit_mo diff --git a/lib/aci/epg/audit/info.py b/lib/aci/epg/audit/info.py new file mode 100644 index 00000000..057598a2 --- /dev/null +++ b/lib/aci/epg/audit/info.py @@ -0,0 +1,115 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class EpgAuditInfo(): + def __init__(self): + self.epg_audit = None + + def get_epg_audit_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['apName'] = None + info['epgName'] = None + + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/ap-k8s_ANP/epg-bmk8s_prov + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/ap-' in info['affected']: + info['apName'] = info['affected'].split('/ap-')[1].split('/')[0] + + if '/epg-' in info['affected']: + info['epgName'] = info['affected'].split('/epg-')[1].split('/')[0] + + info['nameApTenant'] = '--' + if info['tenantName'] is not None and info['apName'] is not None and info['epgName'] is not None: + info['nameApTenant'] = '%s/%s/%s' % ( + info['tenantName'], + info['apName'], + info['epgName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_epg_audit(self): + if self.epg_audit is not None: + return self.epg_audit + + managed_objects = self.get_epg_audit_mo() + if managed_objects is None: + return None + + self.epg_audit = [] + for managed_object in managed_objects: + audit_info = self.get_epg_audit_info( + managed_object + ) + self.epg_audit.append( + audit_info + ) + + self.log.apic_mo( + 'fvAEPg.auditRecord.info', + self.epg_audit + ) + + return self.epg_audit + + def get_epg_id_audit(self, tenant_name, ap_name, epg_name, audit_filter=None): + audits = [] + + all_audits = self.get_epg_audit() + if all_audits is None: + return audits + + for audit_info in all_audits: + if audit_info['tenantName'] is not None and audit_info['apName'] is not None and audit_info['epgName'] is not None: + if audit_info['tenantName'] == tenant_name and audit_info['apName'] == ap_name and audit_info['epgName'] == epg_name: + if not self.match_system_fault(audit_info, audit_filter, exclude_cleared=False): + continue + + audits.append( + audit_info + ) + + return audits diff --git a/lib/aci/epg/audit/main.py b/lib/aci/epg/audit/main.py new file mode 100644 index 00000000..92360a7e --- /dev/null +++ b/lib/aci/epg/audit/main.py @@ -0,0 +1,8 @@ +from lib.aci.epg.audit.api import EpgAuditApi +from lib.aci.epg.audit.info import EpgAuditInfo + + +class EpgAudit(EpgAuditApi, EpgAuditInfo): + def __init__(self): + EpgAuditApi.__init__(self) + EpgAuditInfo.__init__(self) diff --git a/lib/aci/epg/event/__init__.py b/lib/aci/epg/event/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/epg/event/api.py b/lib/aci/epg/event/api.py new file mode 100644 index 00000000..9f7299d8 --- /dev/null +++ b/lib/aci/epg/event/api.py @@ -0,0 +1,51 @@ +class EpgEventApi(): + def __init__(self): + self.epg_event_mo = None + + def get_epg_event_mo(self): + if self.epg_event_mo is not None: + return self.epg_event_mo + + cache = self.get_object_cache( + 'fvAEPg.eventLog' + ) + if cache is not None: + self.epg_event_mo = cache + self.log.apic_mo( + 'fvAEPg.eventLog', + self.epg_event_mo + ) + return self.epg_event_mo + + query = 'rsp-subtree-include=event-logs,no-scoped,subtree&order-by=eventRecord.created|desc&page=0&page-size=%s' % (self.api_event_limit) + managed_objects = self.get_class( + 'fvAEPg', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_epg_event_mo', + 'API failed' + ) + return None + + self.epg_event_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['eventRecord']['attributes'] + self.epg_event_mo.append( + attributes + ) + + self.log.apic_mo( + 'fvAEPg.eventLog', + self.epg_event_mo + ) + + self.set_object_cache( + 'fvAEPg.eventLog', + self.epg_event_mo + ) + + return self.epg_event_mo diff --git a/lib/aci/epg/event/info.py b/lib/aci/epg/event/info.py new file mode 100644 index 00000000..0a4be535 --- /dev/null +++ b/lib/aci/epg/event/info.py @@ -0,0 +1,132 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class EpgEventInfo(): + def __init__(self): + self.epg_event = None + + def get_epg_event_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['apName'] = None + info['epgName'] = None + + if 'affected' in info: + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/ap-k8s_ANP/epg-bmk8s_prov + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/ap-' in info['affected']: + info['apName'] = info['affected'].split('/ap-')[1].split('/')[0] + + if '/epg-' in info['affected']: + info['epgName'] = info['affected'].split('/epg-')[1].split('/')[0] + + if 'affected' not in info and 'dn' in info: + if 'uni/tn-' in info['dn']: + # uni/tn-k8s/ap-k8s_ANP/epg-bmk8s_prov + info['tenantName'] = info['dn'].split('uni/tn-')[1].split('/')[0] + + if '/ap-' in info['dn']: + info['apName'] = info['dn'].split('/ap-')[1].split('/')[0] + + if '/epg-' in info['dn']: + info['epgName'] = info['dn'].split('/epg-')[1].split('/')[0] + + info['nameApTenant'] = '--' + if info['tenantName'] is not None and info['apName'] is not None and info['epgName'] is not None: + info['nameApTenant'] = '%s/%s/%s' % ( + info['tenantName'], + info['apName'], + info['epgName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_epg_event(self, deduplicate=True): + if self.epg_event is not None: + return self.epg_event + + managed_objects = self.get_epg_event_mo() + if managed_objects is None: + return None + + self.epg_event = [] + transaction_ids = [] + for managed_object in managed_objects: + event_info = self.get_epg_event_info( + managed_object + ) + if not deduplicate or event_info['txId'] not in transaction_ids: + self.epg_event.append( + event_info + ) + transaction_ids.append( + event_info['txId'] + ) + + self.log.apic_mo( + 'fvAEPg.eventLog.info', + self.epg_event + ) + + return self.epg_event + + def get_epg_id_event(self, tenant_name, ap_name, epg_name, event_filter=None): + events = [] + + all_events = self.get_epg_event() + if all_events is None: + return events + + for event_info in all_events: + if event_info['tenantName'] is not None and event_info['apName'] is not None and event_info['epgName'] is not None: + if event_info['tenantName'] == tenant_name and event_info['apName'] == ap_name and event_info['epgName'] == epg_name: + if not self.match_system_fault(event_info, event_filter): + continue + + events.append( + event_info + ) + + return events diff --git a/lib/aci/epg/event/main.py b/lib/aci/epg/event/main.py new file mode 100644 index 00000000..a2d794ce --- /dev/null +++ b/lib/aci/epg/event/main.py @@ -0,0 +1,8 @@ +from lib.aci.epg.event.api import EpgEventApi +from lib.aci.epg.event.info import EpgEventInfo + + +class EpgEvent(EpgEventApi, EpgEventInfo): + def __init__(self): + EpgEventApi.__init__(self) + EpgEventInfo.__init__(self) diff --git a/lib/aci/epg/fault/__init__.py b/lib/aci/epg/fault/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/epg/fault/api.py b/lib/aci/epg/fault/api.py new file mode 100644 index 00000000..b6bb714b --- /dev/null +++ b/lib/aci/epg/fault/api.py @@ -0,0 +1,118 @@ +class EpgFaultApi(): + def __init__(self): + self.epg_fault_mo = None + self.epg_fault_record_mo = None + + def get_epg_fault_mo(self): + cache = self.get_object_cache( + 'fvAEPg.fault' + ) + if cache is not None: + self.epg_fault_mo = cache + self.log.apic_mo( + 'fvAEPg.fault', + self.epg_fault_mo + ) + return self.epg_fault_mo + + query = 'rsp-subtree-include=faults,no-scoped,subtree' + managed_objects = self.get_class( + 'fvAEPg', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_epg_fault_mo', + 'API failed' + ) + return None + + self.epg_fault_mo = [] + + for managed_object in managed_objects['imdata']: + if 'faultInst' in managed_object: + attributes = managed_object['faultInst']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = False + self.epg_fault_mo.append( + attributes + ) + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = True + self.epg_fault_mo.append( + attributes + ) + + self.log.apic_mo( + 'fvAEPg.fault', + self.epg_fault_mo + ) + + self.set_object_cache( + 'fvAEPg.fault', + self.epg_fault_mo + ) + + return self.epg_fault_mo + + def get_epg_fault_record_mo(self): + cache = self.get_object_cache( + 'fvAEPg.faultRecord' + ) + if cache is not None: + self.epg_fault_record_mo = cache + self.log.apic_mo( + 'fvAEPg.faultRecord', + self.epg_fault_record_mo + ) + return self.epg_fault_record_mo + + query = 'rsp-subtree-include=fault-records,no-scoped,subtree&order-by=faultRecord.created|desc&page=0&page-size=%s' % (self.api_fault_limit) + managed_objects = self.get_class( + 'fvAEPg', + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_epg_fault_record_mo', + 'API failed' + ) + return None + + self.epg_fault_record_mo = [] + + for managed_object in managed_objects['imdata']: + if 'faultRecord' in managed_object: + attributes = managed_object['faultRecord']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = False + self.epg_fault_record_mo.append( + attributes + ) + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = True + self.epg_fault_record_mo.append( + attributes + ) + + self.log.apic_mo( + 'fvAEPg.faultRecord', + self.epg_fault_record_mo + ) + + self.set_object_cache( + 'fvAEPg.faultRecord', + self.epg_fault_record_mo + ) + + return self.epg_fault_record_mo diff --git a/lib/aci/epg/fault/info.py b/lib/aci/epg/fault/info.py new file mode 100644 index 00000000..4abaf5d2 --- /dev/null +++ b/lib/aci/epg/fault/info.py @@ -0,0 +1,163 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class EpgFaultInfo(): + def __init__(self): + self.epg_fault = None + self.epg_fault_record = None + + def get_epg_fault_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['tenantName'] = None + info['apName'] = None + info['epgName'] = None + + if not managed_object['delegated']: + if 'affected' in info: + if 'uni/tn-' in info['affected']: + # uni/tn-k8s/ap-k8s_ANP/epg-bmk8s_prov + info['tenantName'] = info['affected'].split('uni/tn-')[1].split('/')[0] + + if '/ap-' in info['affected']: + info['apName'] = info['affected'].split('/ap-')[1].split('/')[0] + + if '/epg-' in info['affected']: + info['epgName'] = info['affected'].split('/epg-')[1].split('/')[0] + + if info['tenantName'] is None: + if 'uni/tn-' in info['dn']: + # uni/tn-k8s/ap-k8s_ANP/epg-bmk8s_prov + info['tenantName'] = info['dn'].split('uni/tn-')[1].split('/')[0] + + if '/ap-' in info['dn']: + info['apName'] = info['dn'].split('/ap-')[1].split('/')[0] + + if '/epg-' in info['dn']: + info['epgName'] = info['dn'].split('/epg-')[1].split('/')[0] + + info['nameApTenant'] = '--' + if info['tenantName'] is not None and info['apName'] is not None and info['epgName'] is not None: + info['nameApTenant'] = '%s/%s/%s' % ( + info['tenantName'], + info['apName'], + info['epgName'] + ) + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_epg_fault(self): + if self.epg_fault is not None: + return self.epg_fault + + managed_objects = self.get_epg_fault_mo() + if managed_objects is None: + return None + + self.epg_fault = [] + + for managed_object in managed_objects: + fault_info = self.get_epg_fault_info( + managed_object + ) + self.epg_fault.append( + fault_info + ) + + self.log.apic_mo( + 'fvAEPg.fault.info', + self.epg_fault + ) + + return self.epg_fault + + def get_epg_fault_record(self, deduplicate=True): + if self.epg_fault_record is not None: + return self.epg_fault_record + + managed_objects = self.get_epg_fault_record_mo() + if managed_objects is None: + return None + + self.epg_fault_record = [] + fault_ids = [] + + for managed_object in managed_objects: + fault_info = self.get_epg_fault_info( + managed_object + ) + if not deduplicate or fault_info['id'] not in fault_ids: + self.epg_fault_record.append( + fault_info + ) + fault_ids.append( + fault_info['id'] + ) + + self.log.apic_mo( + 'fvAEPg.faultRecord.info', + self.epg_fault_record + ) + + return self.epg_fault_record + + def get_epg_id_fault(self, tenant_name, ap_name, epg_name, fault_object, fault_filter=None): + faults = [] + + if fault_object == 'faultInst': + all_faults = self.get_epg_fault() + if all_faults is None: + return faults + + fault_filter = self.remove_system_fault_timestamp_filter( + fault_filter + ) + + if fault_object == 'faultRecord': + all_faults = self.get_epg_fault_record() + if all_faults is None: + return faults + + for fault_info in all_faults: + if fault_info['tenantName'] is not None and fault_info['apName'] is not None and fault_info['epgName'] is not None: + if fault_info['tenantName'] == tenant_name and fault_info['apName'] == ap_name and fault_info['epgName'] == epg_name: + if not self.match_system_fault(fault_info, fault_filter, exclude_cleared=False): + continue + + faults.append( + fault_info + ) + + return faults diff --git a/lib/aci/epg/fault/main.py b/lib/aci/epg/fault/main.py new file mode 100644 index 00000000..eafe0e99 --- /dev/null +++ b/lib/aci/epg/fault/main.py @@ -0,0 +1,8 @@ +from lib.aci.epg.fault.api import EpgFaultApi +from lib.aci.epg.fault.info import EpgFaultInfo + + +class EpgFault(EpgFaultApi, EpgFaultInfo): + def __init__(self): + EpgFaultApi.__init__(self) + EpgFaultInfo.__init__(self) diff --git a/lib/aci/epg/ifconn/__init__.py b/lib/aci/epg/ifconn/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/epg/ifconn/__pycache__/__init__.cpython-310.pyc b/lib/aci/epg/ifconn/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3276759305b6240377376c04459cf99a76041be1 GIT binary patch literal 151 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HOvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oYC(ETPJVJ?PHIeid}dx|NqoFsLFFwD Uo80`A(wtN~keS6yK!Sw<0LCFCA^-pY literal 0 HcmV?d00001 diff --git a/lib/aci/epg/ifconn/__pycache__/api.cpython-310.pyc b/lib/aci/epg/ifconn/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09c9a8e4b4712a0830766f94f235915be1623fee GIT binary patch literal 997 zcmZWo&2AGh5VpPE?Gh!W6mh78fNL(5I3OWZp;iS!FA-92(IU%TJHcU--P)T-RNE6h z@(}5fE3d!J)Q*gLlXk(;95Qily(hva}{OF)heNR_oVMaOlifIV|ce)t;Bo=N#{=GVUlYNzi z$#UcJGE;h?i_AD}7usfpImu*hGKi415i(hs-Rhf9g)lQy3xTN}st!GSvRdTsEn}_P z7?_whRQn5zhD@N=IkhQT$FN^gMK9?&ZQwlsf8J2M51g`Pq`;n#OGblVVDrFc4Ffi@ zF9R=DOhw4TR~Q2q{F&lAG=3lgrigN5X z;7xOAjemgWc_E$iv9`9fK9Np&^t~gIvmv#dqxlVY?8lUaClY}R&4PXKygS*NlLp>z+n2r VcZDC^!|l_(HrLzWiEZ2_{{c5O>UsbG literal 0 HcmV?d00001 diff --git a/lib/aci/epg/ifconn/__pycache__/info.cpython-310.pyc b/lib/aci/epg/ifconn/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38d66a32b4e0b262f017bc80928c73030842c3b7 GIT binary patch literal 8146 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 OWxTxN5#qFx)BX!H@xy)q literal 0 HcmV?d00001 diff --git a/lib/aci/epg/ifconn/__pycache__/main.cpython-310.pyc b/lib/aci/epg/ifconn/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75cc1b78bffea625ba1f2b884da4bb89225f94c8 GIT binary patch literal 582 zcmZuuy-ve05I)Cg302B~P~jD_WMn`H6;%jz>B44NvO?@s7S0cGTM5KQM;-!3-UD7D zD-*8(3+Gg=GH}ve?u(u8`|eT>hXcU){CJVS`22F98$ASLOdDg7Ac=vTFhX4K884@d z61WCQrN0L0E28ML&wSatfvEqD-#|o~@T!_mvq@PLmz735+~H}Fm8rYc4G+N>(;i__ zz=#CqNg};9Fe)iB`_2B2A|-fh8?L9A6HI%8WdX0`3Et4~!rOKdkb=x2T05mC5JDGv zAw=!IM0>tfCVPi^58==0RwCIzny@wNq 1: + info['pathType'] = 'Intf' + else: + info['pathType'] = 'Policy Group' + + info['encap'] = new_dn.split('conndef/conn-[')[1].split(']')[0] + return info + + if new_dn.startswith('attEntitypathatt-'): + # "uni/epp/fv-[{epgPKey}]/node-{id}/attEntitypathatt-[{pathName}]/conndef/conn-[{encap}]-[{addr}]", + info['type'] = 'attEntitypathatt' + info['pathName'] = new_dn.split(']/conndef/conn-[', maxsplit=1)[0].split('attEntitypathatt-[')[1] + info['encap'] = new_dn.split('conndef/conn-[')[1].split(']')[0] + return info + + self.log.error( + 'get_epg_ifconn_type_info', + 'Unsupported dn type: %s' % (info['dn']) + ) + + return None + + def get_epg_ifconn_info(self, managed_object): + # "addr": "", + # "auto": "no", + # "autostate": "disabled", + # "bcastP": "", + # "childAction": "", + # "classPref": "encap", + # "descr": "", + # "dn": "uni/epp/fv-[uni/tn-k8s/ap-k8s_ANP/epg-vk8s_4]/node-2207/dyatt-[topology/pod-1/protpaths-2207-2208/pathep-[k8s_esx72_PolGrp]]/conndef/conn-[vlan-1368]-[]", + # "encap": "vlan-1368", + # "extEncap": "unknown", + # "gw": "", + # "ifInstT": "l3-port", + # "ipv6Dad": "enabled", + # "isMultiPodDirect": "no", + # "lcOwn": "local", + # "llAddr": "", + # "mac": "00:00:00:00:00:00", + # "mcastAddr": "", + # "modTs": "2022-12-16T16:55:06.272+02:00", + # "mode": "regular", + # "monPolDn": "uni/tn-common/monepg-default", + # "mtu": "inherit", + # "name": "", + # "nameAlias": "", + # "resImedcy": "immediate", + # "status": "", + # "validState": "not-validated" + keys = [ + 'addr', + 'auto', + 'autostate', + 'classPref', + 'dn', + 'encap', + 'extEncap', + 'gw', + 'ifInstT', + 'mac', + 'mode', + 'mtu', + 'resImedcy' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + is_supported_dn = False + for supported_dn in self.epg_ifconn_dns: + if info['dn'].startswith('%s-' % (supported_dn)): + info['type'] = supported_dn.rsplit('/', maxsplit=1)[-1] + info['typeDn'] = '%s' % (supported_dn) + is_supported_dn = True + break + + if not is_supported_dn: + self.log.error( + 'get_epg_ifconn_info', + 'Unsupported dn: %s' % (info['dn']) + ) + return None + + is_supported_dn = True + unsupported_dns = [ + '/LDevInst-[' + ] + for unsupported_dn in unsupported_dns: + if unsupported_dn in info['dn']: + # Avoid log debug of every unsupported dn + if unsupported_dn not in self.epg_ifconn_unsupported_dn: + self.epg_ifconn_unsupported_dn.append( + unsupported_dn + ) + self.log.debug( + 'get_epg_ifconn_info', + 'Unsupported dn: %s' % (info['dn']) + ) + + return None + + info = self.get_epg_ifconn_type_info( + info + ) + + return info + + def get_epgs_ifconn_info(self): + if self.epg_ifconn is not None: + return self.epg_ifconn + + epgs_ifconn_mo = self.get_epg_ifconn_mo() + if epgs_ifconn_mo is None: + return None + + self.epg_ifconn = [] + for epg_ifconn_mo in epgs_ifconn_mo: + epg_ifconn_info = self.get_epg_ifconn_info( + epg_ifconn_mo + ) + if epg_ifconn_info is not None: + self.epg_ifconn.append( + epg_ifconn_info + ) + + self.epg_ifconn = sorted( + self.epg_ifconn, + key=lambda i: ( + i['nodeName'], + i['pathName'] + ) + ) + + self.log.apic_mo( + 'fvIfConn.info', + self.epg_ifconn + ) + + return self.epg_ifconn + + def match_epg_ifconn(self, epg_ifconn_info, epg_ifconn_filter): + if epg_ifconn_filter is None or len(epg_ifconn_filter) == 0: + return True + + for aepg_rule in epg_ifconn_filter: + (key, value) = aepg_rule.split(':') + key_found = False + + if key == 'name': + key_found = True + if not filter_helper.match_tenant_ap_name(value, epg_ifconn_info['epgFullName']): + return False + + if not key_found: + self.log.error( + 'match_epg_ifconn', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_epg_ifconn(self, epg_ifconn_filter=None): + all_epg_ifconn = self.get_epgs_ifconn_info() + if all_epg_ifconn is None: + return None + + epg_ifconn = [] + + for epg_ifconn_info in all_epg_ifconn: + if not self.match_epg_ifconn(epg_ifconn_info, epg_ifconn_filter): + continue + + epg_ifconn.append(epg_ifconn_info) + + return epg_ifconn diff --git a/lib/aci/epg/ifconn/main.py b/lib/aci/epg/ifconn/main.py new file mode 100644 index 00000000..9edc1347 --- /dev/null +++ b/lib/aci/epg/ifconn/main.py @@ -0,0 +1,8 @@ +from lib.aci.epg.ifconn.api import EpgIfConnApi +from lib.aci.epg.ifconn.info import EpgIfConnInfo + + +class EpgIfConn(EpgIfConnApi, EpgIfConnInfo): + def __init__(self): + EpgIfConnApi.__init__(self) + EpgIfConnInfo.__init__(self) diff --git a/lib/aci/epg/info.py b/lib/aci/epg/info.py new file mode 100644 index 00000000..5842eb5b --- /dev/null +++ b/lib/aci/epg/info.py @@ -0,0 +1,973 @@ +import copy +import json + +from lib import filter_helper +from lib import ip_helper + + +class EpgInfo(): + def __init__(self): + self.epg = None + + def get_epg_count(self, tenant_name=None): + epg_filter = None + if tenant_name is not None: + epg_filter = ['tenant:%s' % (tenant_name)] + + aepgs = self.get_epgs( + epg_filter=epg_filter + ) + return len(aepgs) + + def get_epg(self, epg_distinguished_name): + epg_filter = ['dn:%s' % (epg_distinguished_name)] + aepgs = self.get_epgs( + epg_filter=epg_filter + ) + + if len(aepgs) == 1: + return aepgs[0] + + return None + + def get_epg_contract_info(self, managed_object, info): + info['contractConsumed'] = [] + for item in managed_object['fvRsCons']: + if item['tCl'] == 'vzBrCP': + if item['state'] == 'formed': + contract = {} + contract['dn'] = item['tDn'] + contract['tenant'] = item['tDn'].split('/')[1][3:] + contract['name'] = item['tDn'].split('/')[2][4:] + contract['nameTenant'] = '%s/%s' % ( + contract['tenant'], + contract['name'] + ) + info['contractConsumed'].append(contract) + + if item['state'] != 'formed': + contract = {} + contract['__Output'] = {} + contract['__Output']['nameTenant'] = 'Red' + contract['dn'] = item['tDn'] + contract['tenant'] = None + contract['name'] = item['tnVzBrCPName'] + contract['nameTenant'] = item['tnVzBrCPName'] + info['contractConsumed'].append(contract) + + info['contractProvided'] = [] + for item in managed_object['fvRsProv']: + if item['tCl'] == 'vzBrCP': + if item['state'] == 'formed': + contract = {} + contract['dn'] = item['tDn'] + contract['tenant'] = item['tDn'].split('/')[1][3:] + contract['name'] = item['tDn'].split('/')[2][4:] + contract['nameTenant'] = '%s/%s' % ( + contract['tenant'], + contract['name'] + ) + info['contractProvided'].append(contract) + + if item['state'] != 'formed': + contract = {} + contract['__Output'] = {} + contract['__Output']['nameTenant'] = 'Red' + contract['dn'] = item['tDn'] + contract['tenant'] = None + contract['name'] = item['tnVzBrCPName'] + contract['nameTenant'] = item['tnVzBrCPName'] + info['contractProvided'].append(contract) + + info['contractTaboo'] = [] + for item in managed_object['fvRsProtBy']: + if item['tCl'] == 'vzTaboo': + if item['state'] == 'formed': + contract = {} + contract['dn'] = item['tDn'] + contract['tenant'] = item['tDn'].split('/')[1][3:] + contract['name'] = item['tDn'].split('/')[2][6:] + contract['nameTenant'] = '%s/%s' % ( + contract['tenant'], + contract['name'] + ) + info['contractTaboo'].append(contract) + + if item['state'] != 'formed': + contract = {} + contract['__Output'] = {} + contract['__Output']['nameTenant'] = 'Red' + contract['dn'] = item['tDn'] + contract['tenant'] = None + contract['name'] = item['tnVzTabooName'] + contract['nameTenant'] = item['tnVzTabooName'] + info['contractTaboo'].append(contract) + + info['contractCount'] = len(info['contractConsumed']) + len(info['contractProvided']) + len(info['contractTaboo']) + info['contractTick'] = '' + if info['contractCount'] > 0: + info['contractTick'] = '\u2713' + info['__Output']['contractTick'] = 'Green' + + return info + + def get_epg_bd_info(self, managed_object, info): + if len(managed_object['fvBD']) != 1: + self.log.error( + 'get_epg_bd_info', + 'Unexpected fvBD count: %s' % (managed_object) + ) + return None + + bd_mo = managed_object['fvBD'][0] + if bd_mo['state'] == 'formed': + info['bd_tenant_name'] = managed_object['fvBD'][0]['tDn'].split('/')[1][3:] + info['bd_name'] = managed_object['fvBD'][0]['tDn'].split('/')[2][3:] + info['bd_state'] = bd_mo['state'] + + if bd_mo['state'] != 'formed': + info['bd_tenant_name'] = bd_mo['tnFvBDName'] + info['bd_name'] = bd_mo['tnFvBDName'] + info['bd_state'] = bd_mo['state'] + info['__Output']['bd_tenant_name'] = 'Red' + + return info + + def get_epg_static_ports_info(self, managed_object, info): + # "annotation": "", + # "childAction": "", + # "descr": "", + # "encap": "vlan-3000", + # "extMngdBy": "", + # "forceResolve": "yes", + # "instrImedcy": "lazy", + # "lcC": "", + # "lcOwn": "local", + # "modTs": "2023-03-06T21:44:13.066+02:00", + # "mode": "regular", + # "monPolDn": "uni/tn-common/monepg-default", + # "primaryEncap": "unknown", + # "rType": "mo", + # "rn": "rspathAtt-[topology/pod-1/paths-2702/pathep-[eth1/19]]", + # "state": "unformed", + # "stateQual": "none", + # "status": "", + # "tCl": "fabricPathEp", + # "tDn": "topology/pod-1/paths-2702/pathep-[eth1/19]", + # "tType": "mo", + # "uid": "15374", + # "userdom": ":all:common:" + info['staticPort'] = [] + + for item in managed_object['fvRsPathAtt']: + keys = [ + 'encap', + 'forceResolve', + 'instrImedcy', + 'mode', + 'primaryEncap', + 'state', + 'rn', + 'tCl', + 'tDn' + ] + port_info = {} + port_info['__Output'] = {} + + for key in keys: + port_info[key] = None + if key in item: + port_info[key] = item[key] + + port_info['modeT'] = port_info['mode'] + if port_info['mode'] == 'regular': + port_info['modeT'] = 'Trunk' + + if port_info['tCl'] != 'fabricPathEp': + self.log.error( + 'get_epg_static_ports_info', + 'Unsupported tCl: %s' % (port_info['tCl']) + ) + + port_info['pathNode'] = '' + port_info['pathNodeName'] = [] + port_info['pathType'] = '' + port_info['pathEp'] = '' + if port_info['tCl'] == 'fabricPathEp': + if port_info['tDn'].split('/')[2].startswith('protpaths-'): + # "topology/pod-1/protpaths-2207-2208/pathep-[k8s_ocp_bm_1_PolGrp]" + port_info['pathType'] = 'PG' + port_info['podId'] = port_info['tDn'].split('/')[1][4:] + port_info['pathNode'] = port_info['tDn'].split('/')[2][10:] + port_info['pathNodeT'] = 'node-%s' % (port_info['pathNode']) + for node_id in port_info['pathNode'].split('-'): + port_info['pathNodeName'].append( + 'pod-%s/%s' % ( + port_info['podId'], + self.get_node_name( + node_id + ) + ) + ) + port_info['pathEp'] = port_info['tDn'].split('[')[1].split(']')[0] + + if port_info['tDn'].split('/')[2].startswith('paths-'): + # "topology/pod-1/paths-2207/pathep-[eth1/3/1]" + port_info['pathType'] = 'Intf' + port_info['podId'] = port_info['tDn'].split('/')[1][4:] + port_info['pathNode'] = port_info['tDn'].split('/')[2][6:] + port_info['pathNodeT'] = 'node-%s' % (port_info['pathNode']) + for node_id in port_info['pathNode'].split('-'): + port_info['pathNodeName'].append( + 'pod-%s/%s' % ( + port_info['podId'], + self.get_node_name( + node_id + ) + ) + ) + port_info['pathEp'] = port_info['tDn'].split('[')[1].split(']')[0] + + info['staticPort'].append( + port_info + ) + + info['staticPort'] = sorted( + info['staticPort'], + key=lambda i: ( + i['pathNode'], + i['pathEp'] + ) + ) + info['staticPortCount'] = len(info['staticPort']) + + return info + + def get_epg_domain_info(self, managed_object, info): + # "annotation": "orchestrator:terraform", + # "bindingType": "none", + # "childAction": "", + # "classPref": "encap", + # "configIssues": "", + # "customEpgName": "", + # "delimiter": "", + # "encap": "unknown", + # "encapMode": "auto", + # "epgCos": "Cos0", + # "epgCosPref": "disabled", + # "extMngdBy": "", + # "forceResolve": "yes", + # "instrImedcy": "lazy", + # "lagPolicyName": "", + # "lcOwn": "local", + # "modTs": "2023-04-05T21:31:58.171+02:00", + # "mode": "default", + # "monPolDn": "uni/tn-common/monepg-default", + # "netflowDir": "both", + # "netflowPref": "disabled", + # "numPorts": "0", + # "portAllocation": "none", + # "primaryEncap": "unknown", + # "primaryEncapInner": "unknown", + # "rType": "mo", + # "resImedcy": "lazy", + # "rn": "rsdomAtt-[uni/phys-k8s_phys_PhysDom]", + # "secondaryEncapInner": "unknown", + # "state": "formed", + # "stateQual": "none", + # "status": "", + # "switchingMode": "native", + # "tCl": "physDomP", + # "tDn": "uni/phys-k8s_phys_PhysDom", + # "tType": "mo", + # "triggerSt": "not_triggerable", + # "txId": "7493989779975624787", + # "uid": "15374", + # "untagged": "no", + # "userdom": ":all:common:", + # "vnetOnly": "no" + info['domain'] = [] + + for item in managed_object['fvRsDomAtt']: + domain_info = {} + domain_info['__Output'] = {} + + for key in item: + domain_info[key] = item[key] + + if domain_info['tCl'] not in ['physDomP', 'vmmDomP', 'infraDomP']: + self.log.error( + 'get_epg_domain_info', + 'Unsupported epg domain type: %s' % (domain_info['tCl']) + ) + self.log.error( + 'get_epg_domain_info', + json.dumps(domain_info, indent=4) + ) + return None + + domain_info['type'] = domain_info['tCl'] + if domain_info['type'] == 'physDomP': + # "tDn": "uni/phys-k8s_phys_PhysDom" + domain_info['typeT'] = 'Physical' + domain_info['name'] = domain_info['tDn'].split('/')[1][5:] + + if domain_info['type'] == 'infraDomP': + # "tDn": "uni/phys-all-physical-devices" + domain_info['typeT'] = 'Infra' + domain_info['name'] = domain_info['tDn'].split('/')[1][5:] + + if domain_info['type'] == 'vmmDomP': + # "tDn": "uni/vmmp-VMware/dom-EU-SPDC-POD2B" + domain_info['typeT'] = 'VMM' + domain_info['vmmType'] = domain_info['tDn'].split('/')[1][5:] + domain_info['vmmName'] = domain_info['tDn'].split('/')[2][4:] + domain_info['name'] = '%s/%s' % ( + domain_info['vmmType'], + domain_info['vmmName'] + ) + + info['domain'].append( + domain_info + ) + + info['domain'] = sorted( + info['domain'], + key=lambda i: i['name'] + ) + + info['domainCount'] = len(info['domain']) + + return info + + def get_epg_name_from_dn(self, epg_dn): + # [0]: uni/tn-{name}/ap-{name}/epg-{name} + if len(epg_dn) == 0: + return '' + + tenant = epg_dn.split('/')[1][3:] + application_profile = epg_dn.split('/')[2][3:] + name = epg_dn.split('/')[3][4:] + epg_name = '%s/%s/%s' % ( + tenant, + application_profile, + name + ) + return epg_name + + def get_epg_info(self, managed_object): + keys = [ + 'annotation', + 'configSt', + 'descr', + 'dn', + 'exceptionTag', + 'floodOnEncap', + 'hasMcastSource', + 'isAttrBasedEPg', + 'matchT', + 'name', + 'nameAlias', + 'pcEnfPref', + 'pcTag', + 'prefGrMemb', + 'prio', + 'shutdown' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + # state + if info['shutdown'] == 'no': + info['adminUp'] = True + info['adminUpTick'] = '\u2713' + info['__Output']['adminUpTick'] = 'Green' + else: + info['adminUp'] = False + info['adminUpTick'] = '\u2717' + info['__Output']['adminUpTick'] = 'Red' + + if info['configSt'] == 'applied': + info['__Output']['configSt'] = 'Green' + else: + info['__Output']['configSt'] = 'Red' + + # pcTag Number Ranges + # System Reserved pcTag – This pcTag is used for system internal rules (1-15). + # Globally scoped pcTag – This pcTag is used for shared service (16-16385). + # Locally scoped pcTag – This pcTag is locally used per VRF (range from 16386-65535). + info['pcTagT'] = info['pcTag'] + if 15 < int(info['pcTag']) < 16386: + info['pcTagT'] = '%s (global)' % (info['pcTag']) + info['__Output']['pcTagT'] = 'Red' + + if int(info['pcTag']) < 16: + info['pcTagT'] = '%s (system)' % (info['pcTag']) + info['__Output']['pcTagT'] = 'Red' + + # Dn format + # [0]: uni/tn-{name}/ap-{name}/epg-{name} + info['tenant'] = info['dn'].split('/')[1][3:] + info['nameTenant'] = '%s/%s' % ( + info['tenant'], + info['name'] + ) + info['application_profile'] = info['dn'].split('/')[2][3:] + info['nameApTenant'] = '%s/%s/%s' % ( + info['tenant'], + info['application_profile'], + info['name'] + ) + + info = self.get_epg_contract_info( + managed_object, + info + ) + if info is None: + return None + + info = self.get_epg_bd_info( + managed_object, + info + ) + if info is None: + return None + + info = self.get_epg_static_ports_info( + managed_object, + info + ) + if info is None: + return None + + info = self.get_epg_domain_info( + managed_object, + info + ) + if info is None: + return None + + (info['__Output']['health'], info['health']) = self.get_health_info( + managed_object['healthInst']['cur'] + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_epgs_info(self): + if self.epg is not None: + return self.epg + + epgs_mo = self.get_epg_mo() + if epgs_mo is None: + return None + + self.epg = [] + for epg_mo in epgs_mo: + epg_info = self.get_epg_info( + epg_mo + ) + if epg_info is None: + continue + + self.epg.append( + epg_info + ) + + self.log.apic_mo( + 'fvAEPg.info', + self.epg + ) + + return self.epg + + def match_epg_member(self, epg_member_info, epg_filter): + if epg_filter is None or len(epg_filter) == 0: + return True + + for aepg_rule in epg_filter: + (key, value) = aepg_rule.split(':') + + if key == 'pg': + if epg_member_info['pathType'] != 'Policy Group': + return False + + if not filter_helper.match_string(value, epg_member_info['pathName']): + return False + + return True + + def match_epg(self, epg_info, epg_filter): + if epg_filter is None or len(epg_filter) == 0: + return True + + for aepg_rule in epg_filter: + (key, value) = aepg_rule.split(':') + key_found = False + + if key == 'tenant': + key_found = True + if not filter_helper.match_string(value, epg_info['tenant']): + return False + + if key == 'profile': + key_found = True + if not filter_helper.match_string(value, epg_info['application_profile']): + return False + + if key == 'name': + key_found = True + if not filter_helper.match_tenant_ap_name(value, epg_info['nameApTenant']): + return False + + if key == 'dn': + key_found = True + if not filter_helper.match_string(value, epg_info['dn']): + return False + + if key == 'node': + key_found = True + if 'fabricNode' in epg_info: + found = False + + for node_info in epg_info['fabricNode']: + if filter_helper.match_string(value, node_info['name']): + found = True + break + + if not found: + return False + + if key == 'contract': + key_found = True + found = False + + for contract in epg_info['contractConsumed']: + if filter_helper.match_tenant_name(value, contract['nameTenant']): + found = True + break + + for contract in epg_info['contractProvided']: + if filter_helper.match_tenant_name(value, contract['nameTenant']): + found = True + break + + for contract in epg_info['contractTaboo']: + if filter_helper.match_tenant_name(value, contract['nameTenant']): + found = True + break + + if not found: + return False + + if key == 'bd': + key_found = True + if 'fvBD' in epg_info: + if epg_info['fvBD'] is None: + return False + + if not filter_helper.match_tenant_name(value, epg_info['fvBD']['nameTenant']): + return False + + if key == 'subnet': + key_found = True + if 'fvBD' in epg_info: + if epg_info['fvBD'] is None: + return False + + found = False + for bd_subnet in epg_info['fvBD']['fvSubnet']: + if ip_helper.is_subnet_in_subnet(value, bd_subnet['network']): + found = True + break + + if not found: + return False + + if key == 'ip': + key_found = True + if 'fvBD' in epg_info: + if epg_info['fvBD'] is None: + return False + + found = False + for bd_subnet in epg_info['fvBD']['fvSubnet']: + if ip_helper.is_ipv4_in_cidr(value, bd_subnet['network']): + found = True + break + + if not found: + return False + + if key == 'pctag': + key_found = True + if value == 'global': + if int(epg_info['pcTag']) >= 16386: + return False + + if value == 'system': + if int(epg_info['pcTag']) >= 16: + return False + + if value not in ['global', 'system']: + if not filter_helper.match_integer(value, epg_info['pcTag']): + return False + + if key == 'domain': + key_found = True + if 'domain' in epg_info: + found = False + + for domain_info in epg_info['domain']: + if filter_helper.match_string(value, domain_info['name']): + found = True + break + + if not found: + return False + + if key == 'pg': + key_found = True + if 'member' in epg_info: + found = False + + for member_info in epg_info['member']: + if member_info['pathType'] == 'Policy Group': + if filter_helper.match_string(value, member_info['pathName']): + found = True + break + + if not found: + return False + + if key == 'member_type': + key_found = True + if 'member' in epg_info: + found = False + + for member_info in epg_info['member']: + if member_info['memberType'] == 'dynamic' and value == 'dyn': + found = True + break + + if member_info['memberType'] == 'static' and value == 'st': + found = True + break + + if not found: + return False + + if key == 'fault': + key_found = True + if value == 'any': + if not epg_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_epg', + 'Unsupported fault filtering value: %s' % (value) + ) + + if not key_found: + self.log.error( + 'match_epg', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_epg_contract_filter(self, epg_contracts): + contracts = [] + for contract in epg_contracts: + contracts.append( + contract['nameTenant'] + ) + + contract_filter = '' + if len(contracts) > 0: + contract_filter = ['names:%s' % (','.join(contracts))] + + return contract_filter + + def get_epgs_contract_filter(self, epgs_info): + contracts = [] + for epg in epgs_info: + for contract in epg['contractConsumed']: + if contract['nameTenant'] not in contracts: + contracts.append( + contract['nameTenant'] + ) + + for contract in epg['contractProvided']: + if contract['nameTenant'] not in contracts: + contracts.append( + contract['nameTenant'] + ) + + contract_filter = '' + if len(contracts) > 0: + contract_filter = ['names:%s' % (','.join(contracts))] + + return contract_filter + + def get_epgs_taboo_filter(self, epgs_info): + contracts = [] + for epg in epgs_info: + for contract in epg['contractTaboo']: + if contract['nameTenant'] not in contracts: + contracts.append( + contract['nameTenant'] + ) + + contract_filter = '' + if len(contracts) > 0: + contract_filter = ['names:%s' % (','.join(contracts))] + + return contract_filter + + def get_epg_l3out_filter(self, epg_info): + l3outs = [] + for l3out in epg_info['fvBD']['fvRsBDToOut']: + l3outs.append( + l3out['nameTenant'] + ) + + l3out_filter = '' + if len(l3outs) > 0: + l3out_filter = ['names:%s' % (','.join(l3outs))] + + return l3out_filter + + def get_epgs( + self, + epg_filter=None, + bd_info=False, + locale_info=False, + ifconn_info=False, + endpoint_info=False, + endpoint_vm_info=False, + endpoint_fabric_info=False, + contract_info=False, + vrf_info=False, + l3out_info=False, + node_info=False, + fault_info=False, + hfault_info=False, + event_info=False, + audit_info=False, + hfault_filter=None, + event_filter=None, + audit_filter=None + ): + all_epgs = self.get_epgs_info() + if all_epgs is None: + return None + + epgs = [] + + for epg_info in all_epgs: + if not self.match_epg(epg_info, epg_filter): + continue + + if ifconn_info: + epg_info['ifconn'] = self.get_epg_ifconn( + epg_ifconn_filter=['name:%s' % (epg_info['nameApTenant'])] + ) + + epg_info['ifconnSummary'] = self.get_epg_ifconn_summary( + epg_info['ifconn'] + ) + + epg_info['member'] = [] + for ifconn in epg_info['ifconn']: + if ifconn['type'] in ['stpathatt', 'dyatt']: + if self.match_epg_member(ifconn, epg_filter): + epg_info['member'].append( + ifconn + ) + + if not self.match_epg(epg_info, epg_filter): + continue + + if locale_info: + epg_info['locale'] = self.get_epg_locale( + epg_locale_filter=['name:%s' % (epg_info['nameApTenant'])] + ) + + epg_info['fabricNode'] = self.get_epg_locale_node( + epg_info['locale'] + ) + + epg_info['nodeCount'] = 0 + if epg_info['fabricNode'] is not None: + epg_info['nodeCount'] = len( + epg_info['fabricNode'] + ) + + if not self.match_epg(epg_info, epg_filter): + continue + + if bd_info: + epg_info['fvBD'] = self.get_bridge_domain( + epg_info['bd_tenant_name'], + epg_info['bd_name'] + ) + + if not self.match_epg(epg_info, epg_filter): + continue + + if endpoint_info: + endpoint_filter = ['epg:%s' % (epg_info['name'])] + epg_info['fvCEp'] = self.get_endpoints( + endpoint_filter=endpoint_filter, + vm_info=endpoint_vm_info, + fabric_info=endpoint_fabric_info + ) + + epg_info['endpointCount'] = 0 + if epg_info['fvCEp'] is not None: + epg_info['endpointCount'] = len( + epg_info['fvCEp'] + ) + + if epg_info['fvBD'] is not None: + epg_info['fvBD']['fvSubnet'] = self.get_subnet_usage( + epg_info['fvBD']['fvSubnet'], + epg_info['fvCEp'] + ) + + if not self.match_epg(epg_info, epg_filter): + continue + + if contract_info: + epg_info['contractConsumedInfo'] = [] + contract_filter = self.get_epg_contract_filter( + epg_info['contractConsumed'] + ) + if len(contract_filter) > 0: + epg_info['contractConsumedInfo'] = copy.deepcopy( + self.get_standard_contracts( + contract_filter=contract_filter + ) + ) + + epg_info['contractProvidedInfo'] = [] + contract_filter = self.get_epg_contract_filter( + epg_info['contractProvided'] + ) + if len(contract_filter) > 0: + epg_info['contractProvidedInfo'] = copy.deepcopy( + self.get_standard_contracts( + contract_filter=contract_filter + ) + ) + + epg_info['contractTabooInfo'] = [] + contract_filter = self.get_epg_contract_filter( + epg_info['contractTaboo'] + ) + if len(contract_filter) > 0: + epg_info['contractTabooInfo'] = copy.deepcopy( + self.get_taboo_contracts( + taboo_filter=contract_filter + ) + ) + + if not self.match_epg(epg_info, epg_filter): + continue + + if vrf_info: + if epg_info['fvBD'] is not None: + vrf_dn = epg_info['fvBD']['fvRsCtx']['dn'] + epg_info['fvBD']['fvCtxInfo'] = copy.deepcopy( + self.get_vrf( + vrf_dn + ) + ) + + if not self.match_epg(epg_info, epg_filter): + continue + + if l3out_info: + if epg_info['fvBD'] is not None: + epg_info['fvBD']['l3extOutInfo'] = [] + l3out_filter = self.get_epg_l3out_filter( + epg_info + ) + if len(l3out_filter) > 0: + epg_info['fvBD']['l3extOutInfo'] = copy.deepcopy( + self.get_l3outs( + l3out_filter=l3out_filter + ) + ) + + if not self.match_epg(epg_info, epg_filter): + continue + + if node_info: + ap_node_info = self.get_bridge_domain_node( + epg_info['tenant'], + epg_info['application_profile'], + epg_info['name'] + ) + epg_info['node'] = None + epg_info['interface'] = None + if ap_node_info is not None: + epg_info['node'] = ap_node_info['node'] + epg_info['interface'] = ap_node_info['interface'] + + if fault_info: + epg_info['faultInst'] = self.get_epg_id_fault( + epg_info['tenant'], + epg_info['application_profile'], + epg_info['name'], + 'faultInst' + ) + + if hfault_info: + epg_info['faultRecord'] = self.get_epg_id_fault( + epg_info['tenant'], + epg_info['application_profile'], + epg_info['name'], + 'faultRecord', + fault_filter=hfault_filter + ) + + if event_info: + epg_info['eventLog'] = self.get_epg_id_event( + epg_info['tenant'], + epg_info['application_profile'], + epg_info['name'], + event_filter=event_filter + ) + + if audit_info: + epg_info['auditLog'] = self.get_epg_id_audit( + epg_info['tenant'], + epg_info['application_profile'], + epg_info['name'], + audit_filter=audit_filter + ) + + epgs.append(epg_info) + + epgs = sorted( + epgs, + key=lambda i: i['nameApTenant'].lower() + ) + + return epgs diff --git a/lib/aci/epg/locale/__init__.py b/lib/aci/epg/locale/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/epg/locale/__pycache__/__init__.cpython-310.pyc b/lib/aci/epg/locale/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3276759305b6240377376c04459cf99a76041be1 GIT binary patch literal 151 zcmd1j<>g`kf)nf7lR@-j5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HOvsFxXVoqjE za%ORIeoRVgS!zy9W^rm!S!z*CPG(X}Vsd6oYC(ETPJVJ?PHIeid}dx|NqoFsLFFwD Uo80`A(wtN~keS6yK!Sw<0LCFCA^-pY literal 0 HcmV?d00001 diff --git a/lib/aci/epg/locale/__pycache__/api.cpython-310.pyc b/lib/aci/epg/locale/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4bfc2673eb005d1a08d7de5e5581cbaa5ee22fac GIT binary patch literal 997 zcmZWoPjAyO6t^8G3spPD5Qj<#xb`xM0}?`L+B6U#p$ciYD#&tUx1^*^W~Y^yvJ*S< zA=)EH_#)hW#ZE~tNCDqk40cB#_Aw|;22_y&Q&h1_G6+Apc&Ryh^^xJWJBd zrbVLkLgz_lwOMGBKhX_i2Qq=}HoGCL^0xmbv7mQ_MvYKy8x&mV0Td2qwnsx|~B z=JnP72BRhusC756S88|`*}9^Y*sU16Z72j zLd8^oEPRDAaKWD`-X(9y=iQ5-hB#fK!Y;Ys7;hQXd_^fadwDm@a_4r=Ueq7NqeasV zgI7Oq9e?`pY$UT>D;H%`B`fJ#vZ_oroLAcRVo!5>V_k`2IMHb(Qkj0yF35|q+krPt zp*8Lvo~OCA)`i-b!njD5rJgCbXK#7-LW2Y6!Y0oBshr8NR_o~2?QR1m2C{E>qp%I` z0jAp;4utJ{P%Ro!&KTv_aS(wG7UfqFUt=5*z^*utSev#zBf5@w!{gzaAD%zi8i_jz z`@IlHX(p#y2-gzu3TmFC-4^0(F7xKZL|FbqR5&~v3M)4F3!qq}#U!Tfz+*7|{=32V R?*8`i>n7Ks_rx~tlmAK%>AwH~ literal 0 HcmV?d00001 diff --git a/lib/aci/epg/locale/__pycache__/info.cpython-310.pyc b/lib/aci/epg/locale/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e40234199d14e8cf7760491a19f237cd5f1d40c6 GIT binary patch literal 4500 zcmd5<&5s*N6|btUZnwYZYbQ*|F3GZiHEd=?0xJ>j*cSsqv0>BQ6a zRJRSWY!S5K$N|I^X@*;_T)FTk?75C`nls`u5*vQ6+T*dEC@Ulmc&1-fy?Rw$_3G8{ z{km5y<`{k(U;RP-{SssUpvL^qLE~q5;&&hvQ@qRed5v>+k13&?=S(?YikeVzmsQ+j z*suyW#dg?D0^N8Nbo+sBk#_z!oAWbh16JdTVFs?mb5?Vdqa;eHT;-v3RYv(JJ(X2C zlo^#*1(d!jsuIeqDytQgIklnI)cSK?%d1ta{rG?xBY@?A5)!t zc#|g2F^O5H+2>qMhSU*XfRJ2rUlh3DQh3~Z z={u6@FU2z{N0%1;^qP4VTt+cSjJ2?a6Pkxt_vYPZmAJ*_hG|rph$d&QP$jw8h%aCe64)>%al5R*eI1 z7@0in2S%vqgnxca(R;$b&}q4IOj|Kom^}=lW|SOLWEdCioBd;o3X?&-+T0ID{^fYb z{+setb+exidclnw_q$>8!m+2R%NSVmV1)=@KBUbh=eCFTSig-S@g{^XE{OA-{shN4 z;V<`Z>5bmIGk+nsUq8t!heW%xhcraxe|SiR*-;di4(Y51hh&eTTs3a@YHyI}4J<;x zMS?b}&yn~R2|5hDMdCa}EpN?J-)f58W4fcYtX0!l=%>B z2&;bI%Tvd$kYlg?caA0VImc>BOmHlztz*AOo_w=+&n?BC zPLy@;hcxtkh|%RY#_Fm4f=?-r5)j&89U&e%2-iRJi3kD2A;8z7ivS?6Oe7MHGnVjz z9CLv3g)tvX0%+156vn_G*aL@-I7+f}2#b{WMCfZOLvx|!-e8fZ{IeF`n8h1im792D z7jMc>$QGCcV9y+J{Xi8a-oeeW7uS&l#Gyl3G_}}dM}i{}?lQ7b z)CMbkjyiiRhg|=L%0qXYrG#N;^Ok2z=R0Vfu0gF}4Zp|ku&N`D^fX1DtKFv~*W00vlTZ7qnFP1(`vRr&2m_N3qd3v` z_XE{>YP=qZ&~8FW{uhI!4s5QRHI zzrWKSUO8**=_@CN(;md+Tq}(B=32ep-j%y{{|{fuu#~4qYoDG`nu{vBe(`cV%I`e5 z9SrYd6IVXhKf?0#RT9@o{FuZ~ASyXiq|0OzdIVfExj1RU+rJExN5<*)I>(eIJs`y_qg_!aT8WWQf~T>~M#e$a6z8c|Y|3HW znAe!XLaV$;)nZdxR4l=+CIGmJCr%*zOW+T>T?9A#%e8Os~-uu{;-<4VQZrq=p@W*i5e%jeMU*9^!IZCU_1lTytbz zXbB?Hc`KqiDz=9YEIZz&b%6&Gp)#vW;JV+lZnbBxe@YgaW+}G#4}H#jg#}- z(YvpO{DnzdL`F`3g!L5E7VmxFJzNZut;7>Y`^tgq1-U$4OHligD+%o0P%i1=_$P#Z zhg^YM*2P2uvmIczR2f)ZRqn(~fX-tVbNa{vBEAYNr8%X_!s6C~1vn%uZp|$6uy{DN zkaiC6OISRdSrlOrEX)D!35#H6QHI5E!D7W)45t=eO!)5}dTLdzjb)lW4mN3jmGx@M zlh)y#yOtR}JmJ@kmsozPi6@#&U-$5p80fdDB?&t8MXILX2DZJ8wkEcdg5}D7Gig1V z`#Kn{&%+kbfpDvm0qg{kewW5sDqKj%0gM6lW+QE-YiTt54f`sJOMM-pl1cgRJ=D$W zT;!#nv?kjmogQH2ACZYWY<35M$>Qyec5e`=rRdaEvcePJhA1G|HgM5>LD1o&wqnEc z%_RX3F=_cVz{VZDvlyt$Ua2my61tM~*eInHeC4^5x)OVRCu&Fru=P2yf?6t1Asnb4zwpKzCn>!>63Yy%xr<1yLp31)`5>k*0iV_?{WX8Z&*Sgc{`t}e)}mT*5QX8M4M3}z+x%=Y SpLZ literal 0 HcmV?d00001 diff --git a/lib/aci/epg/locale/__pycache__/main.cpython-310.pyc b/lib/aci/epg/locale/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8dba4f8ca1440c381c15e6e2fed749ee140c1698 GIT binary patch literal 582 zcmZuuJx{|h5Ix6f302B~P~k6R$;g0ERa7B_gu1XO7C+>4#}-d(DGzXuqf!&mu>&o2*lqk~|C=~65bBr#ABMu_hN6BLwD z0#_iZ3|AmSMHGDrStvWVkaWNC8%RhKU)HmmD$k6%s5RpL7GIasD)+Z`BS0|1bVpbe zFd~5klE`2Mj7o~kVY9!b$O+!sgzqWl7}K3#nZp}-hIceP4>p|yq#%=oTCdbZLg-S@ zg|Plhv==&MrXOJU5dNHw&-i_2G|#omD=yVi8LpkOOJ%vycRb5ASM`jWc0gWax=iaw z>lfF>bRm`=IUrAmTg&N2ae|Yee3=zWh^8k*QOSkzeJsSoA~WlgmaMh2QzGQGp4=<7 zDiOq_eKScqY=GWU^p>KxbnPw8YTb^^j{iB-_$%5Cv=lo+eht>EHPQLn-_Wnw`RQVm G9MC`B6@M)N literal 0 HcmV?d00001 diff --git a/lib/aci/epg/locale/api.py b/lib/aci/epg/locale/api.py new file mode 100644 index 00000000..ba871826 --- /dev/null +++ b/lib/aci/epg/locale/api.py @@ -0,0 +1,48 @@ +class EpgLocaleApi(): + def __init__(self): + self.epg_locale_mo = None + + def get_epg_locale_mo(self): + if self.epg_locale_mo is not None: + return self.epg_locale_mo + + cache = self.get_object_cache( + 'fvLocale' + ) + if cache is not None: + self.epg_locale_mo = cache + self.log.apic_mo( + 'fvLocale', + self.epg_locale_mo + ) + return self.epg_locale_mo + + managed_objects = self.get_class( + 'fvLocale' + ) + + if managed_objects is None: + self.log.error( + 'epg_locale_mo', + 'API failed' + ) + return None + + self.epg_locale_mo = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['fvLocale']['attributes'] + self.epg_locale_mo.append( + attributes + ) + + self.log.apic_mo( + 'fvLocale', + self.epg_locale_mo + ) + + self.set_object_cache( + 'fvLocale', + self.epg_locale_mo + ) + + return self.epg_locale_mo diff --git a/lib/aci/epg/locale/info.py b/lib/aci/epg/locale/info.py new file mode 100644 index 00000000..4d8a7de5 --- /dev/null +++ b/lib/aci/epg/locale/info.py @@ -0,0 +1,275 @@ +from lib import filter_helper + + +class EpgLocaleInfo(): + def __init__(self): + self.epg_locale = None + self.epg_locale_unsupported_dn = [] + + def get_epg_locale_node(self, locales_info): + info = [] + node_ids = [] + + for locale_info in locales_info: + if locale_info['id'] in node_ids: + continue + + node_info = self.get_node( + node_id=locale_info['id'] + ) + if node_info is not None: + info.append( + node_info + ) + + return info + + def get_epg_locale_fv_info(self, info): + # "dn": "uni/epp/fv-[uni/tn-common/ap-privIP_TEST/epg-privIP_TEST]/node-2202" + info['type'] = 'epg' + + epg_dn = info['dn'].split('[')[1].split(']')[0] + info['epgTenant'] = epg_dn.split('/')[1][3:] + info['epgAp'] = epg_dn.split('/')[2][3:] + info['epgName'] = epg_dn.split('/')[3][4:] + info['epgNameApTenant'] = '%s/%s/%s' % ( + info['epgTenant'], + info['epgAp'], + info['epgName'] + ) + + return info + + def get_epg_locale_br_info(self, info): + # uni/epp/br-[uni/tn-k8s/l2out-Test/instP-L2Out-ext-epg]/node-2208 + info['type'] = 'l2out' + + epg_dn = info['dn'].split('[')[1].split(']')[0] + info['l2outTenant'] = epg_dn.split('/')[1][3:] + info['l2outName'] = epg_dn.split('/')[2][6:] + info['epgName'] = epg_dn.split('/')[3][6:] + + return info + + def get_epg_locale_rtd_info(self, info): + # uni/epp/rtd-[uni/tn-Ericsson_PACO/out-RAN/instP-RAN]/node-2208 + info['type'] = 'l3out' + + epg_dn = info['dn'].split('[')[1].split(']')[0] + info['l3outTenant'] = epg_dn.split('/')[1][3:] + info['l3outName'] = epg_dn.split('/')[2][4:] + info['epgName'] = epg_dn.split('/')[3][6:] + + return info + + def get_epg_locale_info(self, managed_object): + # "boostrapTriggered": "no", + # "childAction": "", + # "deployAllPorts": "no", + # "dn": "uni/epp/fv-[uni/tn-common/ap-privIP_TEST/epg-privIP_TEST]/node-2202", + # "fabricExtCtrlPeering": "no", + # "fabricExtIntersiteCtrlPeering": "no", + # "fabricExtIntersitePeering": "no", + # "firstUpdateDeployed": "yes", + # "id": "2202", + # "instrImedcy": "immediate", + # "ipv4LbAddr": "", + # "ipv6LbAddr": "", + # "lcOwn": "local", + # "modTs": "2023-06-12T11:29:17.382+02:00", + # "modeMisconfiguration": "no", + # "monPolDn": "uni/tn-common/monepg-default", + # "operSt": "allocated", + # "rtrId": "", + # "rtrIdLoopBack": "yes", + # "status": "", + # "summaryNeeded": "full" + keys = [ + 'deployAllPorts', + 'dn', + 'fabricExtCtrlPeering', + 'fabricExtIntersiteCtrlPeering', + 'fabricExtIntersitePeering', + 'firstUpdateDeployed', + 'id', + 'instrImedcy', + 'operSt' + ] + + info = {} + info['__Output'] = {} + + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + info['nodeName'] = self.get_node_name( + info['id'] + ) + + # state + if info['operSt'] == 'allocated': + info['__Output']['operSt'] = 'Green' + else: + info['__Output']['operSt'] = 'Red' + + # Dn format + # "uni/epp/sec-[{epgPKey}]/node-{id}", + # "uni/epp/cld-[{epgPKey}]/node-{id}", + # "uni/epp/tnlp-[{epgPKey}]/node-{id}", + # "uni/epp/instp-[{epgPKey}]/node-{id}", + # "uni/epp/vns-[{epgPKey}]/node-{id}", + # "uni/epp/inb-[{epgPKey}]/node-{id}", + # "uni/epp/oob-[{epgPKey}]/node-{id}", + # "uni/epp/node-{id}", + # "uni/epp/fv-[{epgPKey}]/node-{id}", + # "uni/epp/rtd-[{epgPKey}]/node-{id}", + # "uni/epp/br-[{epgPKey}]/node-{id}", + # "uni/epp/node-{id}", + # "uni/epp/node-{id}" + + supported_dns = [ + 'uni/epp/fv-', + 'uni/epp/br-', + 'uni/epp/rtd-', + 'uni/epp/inb-', + 'uni/epp/oob-' + ] + is_supported_dn = False + for supported_dn in supported_dns: + if info['dn'].startswith(supported_dn): + is_supported_dn = True + + if not is_supported_dn: + self.log.error( + 'get_epg_locale_info', + 'Unsupported dn: %s' % (info['dn']) + ) + return None + + is_supported_dn = True + unsupported_dns = [ + '/LDevInst-[' + ] + for unsupported_dn in unsupported_dns: + if unsupported_dn in info['dn']: + # Avoid log debug of every unsupported dn + if unsupported_dn not in self.epg_locale_unsupported_dn: + self.epg_locale_unsupported_dn.append( + unsupported_dn + ) + self.log.debug( + 'get_epg_locale_info', + 'Unsupported dn: %s' % (info['dn']) + ) + + return None + + if info['dn'].startswith('uni/epp/fv-'): + info = self.get_epg_locale_fv_info( + info + ) + + if info['dn'].startswith('uni/epp/br-'): + info = self.get_epg_locale_br_info( + info + ) + + if info['dn'].startswith('uni/epp/rtd-'): + info = self.get_epg_locale_rtd_info( + info + ) + + if info['dn'].startswith('uni/epp/inb-'): + return None + + if info['dn'].startswith('uni/epp/oob-'): + return None + + return info + + def get_epgs_locale_info(self): + if self.epg_locale is not None: + return self.epg_locale + + epgs_locale_mo = self.get_epg_locale_mo() + if epgs_locale_mo is None: + return None + + self.epg_locale = [] + for epg_locale_mo in epgs_locale_mo: + epg_locale_info = self.get_epg_locale_info( + epg_locale_mo + ) + + if epg_locale_info is not None: + self.epg_locale.append( + epg_locale_info + ) + + self.log.apic_mo( + 'fvLocale.info', + self.epg_locale + ) + + return self.epg_locale + + def match_epg_locale(self, epg_locale_info, epg_locale_filter): + if epg_locale_info['type'] != 'epg': + return False + + if epg_locale_filter is None or len(epg_locale_filter) == 0: + return True + + for aepg_rule in epg_locale_filter: + (key, value) = aepg_rule.split(':') + key_found = False + + if key == 'tenant': + key_found = True + if not filter_helper.match_string(value, epg_locale_info['epgTenant']): + return False + + if key == 'profile': + key_found = True + if not filter_helper.match_string(value, epg_locale_info['epgAp']): + return False + + if key == 'name': + key_found = True + if not filter_helper.match_tenant_ap_name(value, epg_locale_info['epgNameApTenant']): + return False + + if key == 'node_name': + key_found = True + if not filter_helper.match_string(value, epg_locale_info['nodeName']): + return False + + if key == 'node_id': + key_found = True + if not filter_helper.match_string(value, epg_locale_info['id']): + return False + + if not key_found: + self.log.error( + 'match_epg_locale', + 'Unsupported key: %s' % (key) + ) + + return True + + def get_epg_locale(self, epg_locale_filter=None): + all_epg_locale = self.get_epgs_locale_info() + if all_epg_locale is None: + return None + + epg_locale = [] + + for epg_locale_info in all_epg_locale: + if not self.match_epg_locale(epg_locale_info, epg_locale_filter): + continue + + epg_locale.append(epg_locale_info) + + return epg_locale diff --git a/lib/aci/epg/locale/main.py b/lib/aci/epg/locale/main.py new file mode 100644 index 00000000..36ca3801 --- /dev/null +++ b/lib/aci/epg/locale/main.py @@ -0,0 +1,8 @@ +from lib.aci.epg.locale.api import EpgLocaleApi +from lib.aci.epg.locale.info import EpgLocaleInfo + + +class EpgLocale(EpgLocaleApi, EpgLocaleInfo): + def __init__(self): + EpgLocaleApi.__init__(self) + EpgLocaleInfo.__init__(self) diff --git a/lib/aci/epg/main.py b/lib/aci/epg/main.py new file mode 100644 index 00000000..d719f308 --- /dev/null +++ b/lib/aci/epg/main.py @@ -0,0 +1,29 @@ +from lib.aci.epg.api import EpgApi +from lib.aci.epg.info import EpgInfo +from lib.aci.epg.ifconn.main import EpgIfConn +from lib.aci.epg.locale.main import EpgLocale +from lib.aci.epg.audit.main import EpgAudit +from lib.aci.epg.event.main import EpgEvent +from lib.aci.epg.fault.main import EpgFault +from lib.aci.epg.node.main import EpgNode + + +class Epg( + EpgApi, + EpgInfo, + EpgIfConn, + EpgLocale, + EpgAudit, + EpgEvent, + EpgFault, + EpgNode + ): + def __init__(self): + EpgApi.__init__(self) + EpgInfo.__init__(self) + EpgIfConn.__init__(self) + EpgLocale.__init__(self) + EpgAudit.__init__(self) + EpgEvent.__init__(self) + EpgFault.__init__(self) + EpgNode.__init__(self) diff --git a/lib/aci/epg/node/__init__.py b/lib/aci/epg/node/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/epg/node/api.py b/lib/aci/epg/node/api.py new file mode 100644 index 00000000..03b82813 --- /dev/null +++ b/lib/aci/epg/node/api.py @@ -0,0 +1,61 @@ +class EpgNodeApi(): + def __init__(self): + self.epg_node_mo = {} + + def get_epg_node_mo(self, tenant_name, ap_name, epg_name): + key = '%s.%s.%s' % (tenant_name, ap_name, epg_name) + if key in self.epg_node_mo: + return self.epg_node_mo[key] + + cache = self.get_object_cache( + 'fvAEPg.%s' % (key) + ) + if cache is not None: + self.epg_node_mo[key] = cache + self.log.apic_mo( + 'fvAEPg.%s' % (key), + self.epg_node_mo[key] + ) + return self.epg_node_mo[key] + + distinguished_name = 'uni/tn-%s/ap-%s/epg-%s' % (tenant_name, ap_name, epg_name) + query = 'rsp-subtree-include=full-deployment&target-node=all&target-path=EPgToNwIf' + managed_objects = self.get_managed_object( + distinguished_name, + query=query, + node_mo=True + ) + + if managed_objects is None: + self.log.error( + 'get_epg_node_mo', + 'API failed' + ) + return None + + if managed_objects['totalCount'] != '1': + self.log.error( + 'get_epg_node_mo', + 'Unexpected object count' + ) + return None + + for managed_object in managed_objects['imdata']: + attributes = managed_object['fvAEPg']['attributes'] + attributes['pconsResourceCtx'] = self.get_mo_node_resource_ctx( + 'fvAEPg', + managed_object + ) + self.epg_node_mo[key] = attributes + + self.log.apic_mo( + 'fvAEPg.%s' % (key), + self.epg_node_mo[key] + ) + + self.set_object_cache( + 'fvAEPg.%s' % (key), + self.epg_node_mo[key] + ) + + return self.epg_node_mo[key] diff --git a/lib/aci/epg/node/info.py b/lib/aci/epg/node/info.py new file mode 100644 index 00000000..0b653080 --- /dev/null +++ b/lib/aci/epg/node/info.py @@ -0,0 +1,82 @@ +class EpgNodeInfo(): + def __init__(self): + self.epg_node = {} + + def get_epg_node_info(self, managed_object): + info = {} + info['__Output'] = {} + info['name'] = managed_object['name'] + + node = {} + info['interface'] = [] + for item in managed_object['pconsResourceCtx']: + node_name = self.get_node_name( + item['nodeId'] + ) + + if node_name not in node: + node[node_name] = {} + node[node_name]['node_id'] = item['nodeId'] + node[node_name]['interfaces'] = 0 + + port_info = {} + port_info['__Output'] = {} + port_info['pod_id'] = item['ctxDn'].split('/')[1].split('-')[1] + port_info['node_id'] = item['nodeId'] + port_info['node_name'] = self.get_node_name( + item['nodeId'] + ) + port_info['intf_type'] = item['ctxClass'] + # "topology/pod-1/node-2201/sys/vmms-[eth1/43]" + port_info['intf_name'] = item['ctxDn'].split('[')[1].split(']')[0] + info['interface'].append( + port_info + ) + + node[node_name]['interfaces'] = node[node_name]['interfaces'] + 1 + + info['node'] = [] + for key in node: + node_info = {} + node_info['id'] = node[key]['node_id'] + node_info['name'] = key + node_info['interfaces'] = node[key]['interfaces'] + info['node'].append( + node_info + ) + + info['node'] = sorted( + info['node'], + key=lambda i: i['name'] + ) + + info['interface'] = sorted( + info['interface'], + key=lambda i: ( + i['node_name'], + i['intf_name'] + ) + ) + + return info + + def get_epg_node(self, tenant_name, ap_name, epg_name): + key = '%s.%s.%s' % (tenant_name, ap_name, epg_name) + if key in self.epg_node: + return self.epg_node[key] + + # one object or None value is expected + nodes_mo = self.get_epg_node_mo(tenant_name, ap_name, epg_name) + if nodes_mo is None: + return None + + self.epg_node[key] = self.get_epg_node_info( + nodes_mo + ) + + self.log.apic_mo( + 'fvAEPg.%s.info' % (key), + self.epg_node[key] + ) + + return self.epg_node[key] diff --git a/lib/aci/epg/node/main.py b/lib/aci/epg/node/main.py new file mode 100644 index 00000000..a68859f5 --- /dev/null +++ b/lib/aci/epg/node/main.py @@ -0,0 +1,8 @@ +from lib.aci.epg.node.api import EpgNodeApi +from lib.aci.epg.node.info import EpgNodeInfo + + +class EpgNode(EpgNodeApi, EpgNodeInfo): + def __init__(self): + EpgNodeApi.__init__(self) + EpgNodeInfo.__init__(self) diff --git a/lib/aci/epg/output.py b/lib/aci/epg/output.py new file mode 100644 index 00000000..37c85fb8 --- /dev/null +++ b/lib/aci/epg/output.py @@ -0,0 +1,1077 @@ +class EpgOutput(): + def __init__(self): + pass + + def print_epg_properties(self, info): + order = [ + 'health', + 'faults', + 'configSt', + 'name', + 'application_profile', + 'tenant', + 'fvBD.nameTenant', + 'nameAlias', + 'descr', + 'annotation', + 'pcTagT', + 'exceptionTag', + 'prio', + 'pcEnfPref', + 'prefGrMemb', + 'floodOnEncap', + 'isMatch' + ] + + headers = [ + 'Health', + 'Faults', + 'Configuration State', + 'EPG Name', + 'Application Profile', + 'Tenant', + 'Bridge Domain', + 'Alias', + 'Description', + 'Annotations', + 'Class ID', + 'Contract Exception Tag', + 'QoS Class', + 'Intra EPG Isolation', + 'Preferred Group Member', + 'Flood in Encapsulation', + 'ESG Matched' + ] + + self.my_output.dictionary( + info, + title='Application EPG Properties', + underline=True, + prefix="- ", + justify=True, + keys=order, + title_keys=headers + ) + + def print_epg_contracts(self, info): + if len(info['contractConsumed']) > 0: + self.my_output.default( + 'Contract Consumed', + underline=True + ) + for contract in info['contractConsumed']: + self.my_output.default( + '- %s' % (contract['nameTenant']) + ) + + if len(info['contractConsumedInfo']) > 0: + self.print_contracts( + info['contractConsumedInfo'], + show_contract_filters=True + ) + + if len(info['contractProvided']) > 0: + self.my_output.default( + 'Contract Provided', + underline=True, + before_newline=True + ) + for contract in info['contractProvided']: + self.my_output.default( + '- %s' % (contract['nameTenant']) + ) + + if len(info['contractProvidedInfo']) > 0: + self.print_contracts( + info['contractProvidedInfo'], + show_contract_filters=True + ) + + if len(info['contractTaboo']) > 0: + self.my_output.default( + 'Contract Taboo', + underline=True, + before_newline=True + ) + for contract in info['contractTaboo']: + self.my_output.default( + '- %s' % (contract['nameTenant']) + ) + + if len(info['contractTabooInfo']) > 0: + self.print_taboos( + info['contractTabooInfo'], + show_taboo_filters=True + ) + + def print_epg_bridge_domain(self, info): + self.print_bridge_domain_properties( + info['fvBD'] + ) + + self.print_bridge_domain_subnets( + info['fvBD']['fvSubnet'] + ) + + def print_epg_vrf(self, info): + self.print_vrf_properties( + info['fvBD']['fvCtxInfo'] + ) + + def print_epg_l3out(self, info): + if len(info['fvBD']['fvRsBDToOut']) > 0: + self.my_output.default( + 'Associated L3 Out', + underline=True, + before_newline=True + ) + + self.print_l3outs( + info['fvBD']['l3extOutInfo'] + ) + + def print_epg_fabric(self, info): + if len(info['fabricNode']) > 0: + self.my_output.default( + 'Deployed Nodes', + underline=True, + before_newline=True + ) + self.print_nodes( + info['fabricNode'] + ) + + def print_epg_endpoints(self, info): + if info['endpointCount'] > 0: + self.my_output.default( + 'EPG Endpoints', + underline=True, + before_newline=True + ) + self.print_endpoints( + info['fvCEp'], + bridge_domain_name=False, + title=True + ) + + def print_epg(self, info): + self.print_epg_properties( + info + ) + + self.print_epg_contracts( + info + ) + + self.print_epg_bridge_domain( + info + ) + + self.print_epg_vrf( + info + ) + + self.print_epg_l3out( + info + ) + + self.print_epg_fabric( + info + ) + + self.print_epg_endpoints( + info + ) + + def print_epgs_properties(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Properties [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'health', + 'faults', + 'nameApTenant', + 'prefGrMemb', + 'floodOnEncap', + 'pcTagT', + 'prio', + 'pcEnfPref', + 'matchT' + ] + + headers = [ + 'Health', + 'Faults', + 'EPG', + 'Preferred Member', + 'Flood', + 'Class ID', + 'QoS Class', + 'Isolation', + 'Label Match' + ] + + self.my_output.my_table( + info, + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + remove_empty_columns=False, + table=True + ) + + def print_epgs_bridge_domain(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Bridge Domain [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + for item in info: + item['fvSubnet'] = None + item['fvRsBDToOut'] = None + if item['fvBD'] is not None: + item['fvSubnet'] = item['fvBD']['fvSubnet'] + item['fvRsBDToOut'] = item['fvBD']['fvRsBDToOut'] + + order = [ + 'adminUpTick', + 'nameApTenant', + 'fvBD.nameTenant', + 'fvSubnet.ip', + 'fvSubnet.usage', + 'fvBD.fvRsCtx.nameTenant', + 'fvRsBDToOut.nameTenant' + ] + + headers = [ + 'Up', + 'EPG', + 'Bridge Domain', + 'BD Subnets', + 'Usage', + 'VRF', + 'L3Out' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['fvSubnet', 'fvRsBDToOut'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_epgs_contract(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Contracts [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'adminUpTick', + 'nameApTenant', + 'pcTagT', + 'contractConsumed.nameTenant', + 'contractProvided.nameTenant', + 'contractTaboo.nameTenant' + ] + + headers = [ + 'Up', + 'EPG', + 'Class ID', + 'Contract Consumed', + 'Contract Provided', + 'Contract Taboo' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['contractConsumed', 'contractProvided', 'contractTaboo'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_epgs_contract_pivot(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Contracts (pivot view) [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + contract_names = [] + contracts = [] + taboo_names = [] + taboos = [] + for epg_info in info: + for contract_info in epg_info['contractConsumed']: + if contract_info['nameTenant'] not in contract_names: + contract_names.append( + contract_info['nameTenant'] + ) + contract_info['type'] = 'Contract' + contract_info['epg'] = [] + contracts.append( + contract_info + ) + + for contract_info in epg_info['contractProvided']: + if contract_info['nameTenant'] not in contract_names: + contract_names.append( + contract_info['nameTenant'] + ) + contract_info['type'] = 'Contract' + contract_info['epg'] = [] + contracts.append( + contract_info + ) + + for contract_info in epg_info['contractTaboo']: + if contract_info['nameTenant'] not in taboo_names: + taboo_names.append( + contract_info['nameTenant'] + ) + contract_info['type'] = 'Taboo' + contract_info['epg'] = [] + taboos.append( + contract_info + ) + + for contract_info in contracts: + for epg_info in info: + for epg_contract_info in epg_info['contractConsumed']: + if epg_contract_info['nameTenant'] == contract_info['nameTenant']: + contract_info['epg'].append( + '%s (Consumed)' % (epg_info['nameApTenant']) + ) + + for epg_contract_info in epg_info['contractProvided']: + if epg_contract_info['nameTenant'] == contract_info['nameTenant']: + contract_info['epg'].append( + '%s (Provided)' % (epg_info['nameApTenant']) + ) + + for taboo_info in taboos: + for epg_info in info: + for epg_contract_info in epg_info['contractTaboo']: + if epg_contract_info['nameTenant'] == taboo_info['nameTenant']: + taboo_info['epg'].append( + epg_info['nameApTenant'] + ) + + all_contracts = contracts + taboos + all_contracts = sorted( + all_contracts, + key=lambda i: i['nameTenant'] + ) + + order = [ + 'nameTenant', + 'type', + 'epg' + ] + + headers = [ + 'Contract', + 'Type', + 'EPG' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + all_contracts, + order, + ['epg'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_epgs_node(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Deployed Nodes [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameApTenant', + 'fabricNode.name', + 'fabricNode.address', + 'fabricNode.adSt', + 'fabricNode.fabricSt', + 'fabricNode.model', + 'fabricNode.serial', + 'fabricNode.version' + + ] + + headers = [ + 'EPG', + 'Node Name', + 'IP Address', + 'Admin', + 'Fabric', + 'Model', + 'Serial', + 'Version' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['fabricNode'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_epgs_node_pivot(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Deployed Nodes (pivot view) [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + names = [] + nodes = [] + for epg_info in info: + for node_info in epg_info['fabricNode']: + if node_info['pod_node_name'] not in names: + names.append( + node_info['pod_node_name'] + ) + node_info['epg'] = [] + nodes.append( + node_info + ) + + for node_info in nodes: + for epg_info in info: + for epg_node_info in epg_info['fabricNode']: + if epg_node_info['pod_node_name'] == node_info['pod_node_name']: + node_info['epg'].append( + epg_info['nameApTenant'] + ) + + order = [ + 'name', + 'address', + 'adSt', + 'fabricSt', + 'model', + 'serial', + 'version', + 'epg', + + ] + + headers = [ + 'Node Name', + 'IP Address', + 'Admin', + 'Fabric', + 'Model', + 'Serial', + 'Version', + 'EPG' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + nodes, + order, + ['epg'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_epgs_static_port(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Static Port [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + order = [ + 'nameApTenant', + 'staticPort.pathNodeT', + 'staticPort.pathType', + 'staticPort.pathEp', + 'staticPort.encap', + 'staticPort.modeT', + 'staticPort.instrImedcy', + 'staticPort.state' + ] + + headers = [ + 'EPG', + 'Path', + 'Type', + 'Ep', + 'Encapsulation', + 'Mode', + 'Deployment Immediacy', + 'State' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['staticPort'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_epgs_domain(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Domain [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameApTenant', + 'domain.name', + 'domain.typeT', + 'domain.instrImedcy', + 'domain.resImedcy', + 'domain.switchingMode', + 'domain.encapMode', + 'domain.epgCos' + ] + + headers = [ + 'EPG', + 'Domain Name', + 'Domain Type', + 'Deployment', + 'Resolution', + 'Switching Mode', + 'Encap Mode', + 'CoS' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['vlan', 'domain', 'domainVlanPool'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_epgs_domain_pivot(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Domain (pivot view) [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + names = [] + domains = [] + for epg_info in info: + for domain_info in epg_info['domain']: + if domain_info['name'] not in names: + names.append( + domain_info['name'] + ) + domain_info['epg'] = [] + domains.append( + domain_info + ) + + for domain_info in domains: + for epg_info in info: + for epg_domain_info in epg_info['domain']: + if epg_domain_info['name'] == domain_info['name']: + domain_info['epg'].append( + epg_info['nameApTenant'] + ) + + order = [ + 'name', + 'typeT', + 'instrImedcy', + 'resImedcy', + 'switchingMode', + 'encapMode', + 'epgCos', + 'epg', + + ] + + headers = [ + 'Domain Name', + 'Domain Type', + 'Deployment', + 'Resolution', + 'Switching Mode', + 'Encap Mode', + 'CoS', + 'EPG' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + domains, + order, + ['epg'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_epgs_member(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Member [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameApTenant', + 'member.memberType', + 'member.nodeName', + 'member.pathType', + 'member.pathName', + 'member.encap' + ] + + headers = [ + 'EPG', + 'Member Type', + 'Node', + 'Type', + 'ID', + 'VLAN' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['member'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_epgs_endpoint(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Endpoints [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'flags', + 'mac', + 'fvIp.addr', + 'epgNameApTenant', + 'encapT', + 'bdNameTenant', + 'vrfNameTenant' + ] + + headers = [ + 'SF', + 'MAC Address', + 'IP Address', + 'EPG', + 'Encap', + 'BD', + 'VRF' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['fvIp'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + remove_empty_columns=False, + table=True + ) + + def print_epgs(self, info, title=False): + if title: + self.my_output.default( + 'EPG [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + for epg in info: + epg['fvSubnet'] = epg['fvBD']['fvSubnet'] + + order = [ + 'health', + 'faults', + 'adminUpTick', + 'nameApTenant', + 'pcTag', + 'fvBD.nameTenant', + 'fvSubnet.ip', + 'endpointCount', + 'fabricNode.pod_node_name', + 'domain.name', + 'contractCount', + 'staticPortCount', + 'ifconnSummary.fv.stpathatt', + 'ifconnSummary.fv.dyatt' + ] + + headers = [ + 'Health', + 'Faults', + 'Up', + 'EPG', + 'Class ID', + 'BD', + 'BD Subnet', + 'Endpoint', + 'Node', + 'Domain', + 'Contract', + 'StPort', + 'StMember', + 'DynMember' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['fvSubnet', 'vlan', 'fabricNode', 'domain'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + underline=True, + row_separator=True, + table=True + ) + + def print_epgs_event_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'EPG - Event Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'EPG - Event Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameApTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'EPG', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) + + def print_epgs_fault_inst(self, info, title=False): + if title: + self.my_output.default( + 'EPG - Faults [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameApTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'EPG', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_epgs_fault_record(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'EPG - Fault Records [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'EPG - Fault Records last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameApTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'EPG', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_epgs_audit_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'EPG - Audit Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'EPG - Audit Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'nameApTenant', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'EPG', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/intf/__init__.py b/lib/aci/intf/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..faddc3a75c9522c465025cd4d4041a7a823debf2 GIT binary patch literal 150 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w#*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{7IC@nELH6}hjGcU6wK3=b&@)n0p TZhlH>PO2Tq$YLfS!NLFl^R^-+}<=NTU*_rh>-)ynE+GhB8zw}@wWb6-` zTz@>Ae2Jg^00l7M8JqHmbM_4b0p2MC?}dm2$S17p|A{`V%UwGw#_@s5N@Y?qU4LE& zypLAJA`T32eanS=P(Fgm*JVEy*W!^*A@}gJpQ5PP zgx4JSOJ1{BfI#U1Ln#~S1H*7$A5R(3DK$i4dKtMJ7z*dS$Hmxrxa!`X7BQ~I2~1*D z#%Y#V8@+SWIMP|Aj9a~7?FuKY%0@9l zv4X$x6QS9OSBtOM^E)Smi&x8CR?C_nGxKiEYq@!8I|^$L@e=*+?Z``$63d~E_rVFs zqX1@Qrhan1&H)FRCsP%*^Q6+p>RFbcLzyMjKHylGX0+A!vm|qYt&(bHqn4f9K5be- z<-6fzA0EF^pE(a$dBj}T8&g81s8Q?~GH;QkdA zKq}Uv_D0?YJMoE(6NXxVBd`5B0Pm$ZY1J)YGiEl4nq#7>Kns?jDNl&L;>@ernXE}? zn+*I-cFxbS36DNPi+>hCKzT-DgVn8b!LgL)5$$`zsuqneIJ6Fh`Ia)!99o;y24R2k zSyhw;QhmNt7SP+WJ9z<$Ml8t=(r`!Tw%XC7-Va;$`J#6;Q)b?)5`(xrOb>JhM&1fA*mAAPO8f2;jB`2ad(+;`!eA+CTsfJa0IR!8UoU- z6aF{LZm0oVkd!4B(`?|x1Y~I?rB351QXx}$cV$T#q#j_8yB1}kX76C}l^G!&XttJQ zS@B~$on@6qF1vNmw$k}{rtJapj2Lb1Qt;b1&tT0u<)yB^#<%zWohT$+vL X8X!%SrVGQ}W%4hmu9iY|*t+)*Q|zq6 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/fault_counts.cpython-310.pyc b/lib/aci/intf/__pycache__/fault_counts.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc3dbb8a74289db4bc839163192283cb6c683cf5 GIT binary patch literal 1664 zcmb6ZO^@3|bY?tuylys?qTN*&30MiXk`e6+iBnZj(N-WNlndfwQdwTlB%NKyPG_7# zBIndz`yaN53%>&KH|ENTzW@^O-k5wWwzYu;D2zaJ4;KmPJ_ey2mouXx#B z9$X&5HtzrsM9_jvXhJFZf(RzOmqd6kSi%JVn#BHZz(ZncqoNw8Ph~NcI!Ds>S}VK@ zR7nyl2#AMH8BILFh5wQyTm+&6r!Ocd-m?c^mbKKQESH~Wv!Xt)W@T*#Ior~VI4VDf z?YynYC2gpnuV_P3CKy0Z5P)0|Q0fi9(*QkHBI%4kDX5Hnje4y2RW-IAe6)v?DjlKC zG;S~C!+V@`2Caf2g9qZP{UlAyc!DmToyxRq<${- zuuvDnELTIddf;%|+WqO=hH0uwRi~+sFAD(lXh0*nc>AWH++T6;1P4XYB^Mlw{1{UC z16?vjmR`dilPBSlH?-l$r12X5kUR?;4}!!7@$H1?TGh!O!q4(6DU!oAnw8?QEaW(= zfxM68&DEP^mq`eq6*^d9J2G9Mu0^arQDvo*$Q`ZN(FWfU>^b^Ilz*4$GC4%(1b3MC zk-X-0S%FN45C_|vWMwv%BCReiWnNo;CFjO+RgNm_0q&SvfSqFB9m^W>@lQ4GmIewT zlR*$t-VbSya<=&R#zg&xq8xL!TIecnmp=`NfYNRl=Bgo=WaJ-_rQeWi+W4>OGH3!p zW<(!ip##p2p-rzm{Q>Z@Yu95d=@CC7uNj5b22OI#fja>14(t&2-Z24vou&h|5DgZ0 z>uOp-SIp0*mAH3m&dN$iJk8vkotk^!o|-3cCQ)70S>d|W(vR$0|Nhj)``?uE`zb_T ziW67)CvBfSI5{=zzYWwxWOb$~JUzMP_}Up@qpYsAx|r1xn-@kHv3)eRn^ui&V|}T0 zrF9?hIBe4&z(ZgF*bcq~CqZwM+j>5gw!66lTVE(st8zS3<|))nnN6gh8bE8OxuCUP=*C`+`Ya9)&Ug;o?U zh^nm7n!-g>kjR*tz*sFevj*Ik+^us{Cn*5z7M$ha1imJ@3{O>3`gvkyU@6uHr^k& zjvtPM6LI!rI06agN^1Tdy=x2V<7~r2fBY2&++!@@VK`Oi0nl(eYe%*8NX#c#dgQq2 zZ0C{K3a<0%KN=4G=Z^al8XM_^esJ96jpl(roX7}#s;ST87iXZi=K3&*4qrHf0T{*m_~J$XF4<95Na@!<=$x2WCXUl5SP*(k6axBW*1@;oN;1l&D4(K2ii(-2QbsGMUX>J8Q&dY)Jw=Tat)!@#>2o!0 zUrSLdMe7;gjf}QA^Ev^N`5oTQZZi$m&p3i@&5PlQ?J=uHi!Rni$X%-UU267S-=&7Q z#i=fy)4X(CFvX^X%%ZyQ#)kjmj2hwCqee6uP-6^1#@KhQPEdqpkBheL4ZO&<1EjG&_?U~H7xG}tgP!o7_Z-*jK}UTQ z33GJ)vtS2eZ^0AZ1W_k=m#6n4PTFR+#8TJK=lS2At&NL|F}rXja7k3w{s{o{^`#!v zC;If?NdB3AtTE%2$;?+dmYbLp($_aM(2chm%SR;AC*(EUE$xK7Bd_wTFv(5w$|v#H z6aQ(y-?C!XXRxYzDyg3If9$CYBO41N7e6s_c|J0D=lU>nt8x@TNotmUp1XMi?pO=< zK>tAQoagq#{qROi9wew66ZkzjH?i3=V)Jz94PrxZ5MdNpg#c-S7JT3td*suS0&Mup zfR+_>hoeCh=YiAxQ55Igp%@0K39!nBL|lTN;tMA{g0!7(xg92KXeaSK@CYx1XcLo| zx=E^fn^Zv-L9dgxju=~t`uWv|vrfAI)}=*`tQ?lgz>(ax#<`Q+o!+wkVQZ9He_mgH8ZVo@{M38g}OLBr23`x q9m5wx(i4)r%I!}TLR|bNsh{tVVZxt4R5d8e|9qDXo&2A>`2KH!nG2Wz literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/ipv4.cpython-310.pyc b/lib/aci/intf/__pycache__/ipv4.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8d64a2b58eb9e5a803dc6b9649ac6b217bde826 GIT binary patch literal 1291 zcmaJ=&2G~`5T5<9)7e8Q>l@2 zf-CRPa^o?0jXlDNSKvUIaVScVV67d`u4g{ae)~giTAwEm3$4M_Z?#(WUiGJqv)N^CfX#lwLJa+-p5@HeWn1@ zgBpzWg_6qq0DY-^)xfu>7y>uldN(h%8ODk3PEH>6621gUKB4a8v^UX|aL6jA*hf}D z#1%&?6d;c1VR1ecmn!F{h}0d1(hz_XuZocq_|0vNizvPPT|`k)lEv1B+)1mmp^+H> z84MBkL{G~oLb|~c z)&^^_*^QMG?p_A1oRl&sp+4zzbSgN6GdyX<&N+h-Udbmm=PArZ#b3bNU@j|G$qrPa zl271x^LMuwlbBVl__l*QMhs?>AJD7p6OO9I2AyLTM-Sc&wdo%eb7{ z+1i4>-83H-AvX=gK!iz}MB^g#Oq13d<2a8;T1Cadp-xICkMyZ^l2V*Nzou|u)+l~! zq|3jlr(goJ+h}~o@sU3RPqqTK!F;}0OK-Nb%HKbb5)#VgpqgpcbiP4{h^$a9hcFa3 zh(sh8sbWZ@R4@f|jbt=}xrb}s0i<|y?pNL!=A4Pjr_2s^Le9n(26P+tV0uLJt zetiTZDK`j>oK_th)fct7O1|wkYbg_-<~oA>P5!kN%4{wCdl+YLqq)K)QY|k6DbZ^) zw5-keg?}Oa+1>w8zrYDuFZ4Qfv8KDqV8?K69z*#)0 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/ipv4_address.cpython-310.pyc b/lib/aci/intf/__pycache__/ipv4_address.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d589f487a209506042d2b1590257a364769f952 GIT binary patch literal 1314 zcmZuw&2H2%5FW=)HVxaBe^@{WB#M*+<-!3Wgn%L;B(#7kaab*~(%8GCWRuiRE49j= z;K~DVYq{|nJch5Fcm)oWnQV);0!JB-o$;5M&)<}bixJ=`zI;z#`2as?F+Vsi9^-4T zqfww(4ih$D44#AX6#oQ@fAj{P66+BAKQRVk=AyhD%lA63v`J}ee*6Wzjk_8KOaUGb zTQD}@N+|ym41@|)2WMX~1YU5bo+xFswJ)ljd;Qd#10#Kx1JD!ts~o*m3;oE=)?9%zh^+N~U>YZR|N=bv`lzqrZV6 z+J4<%docWvLIY+4SL-qHCmv)b%vGt9G%VUlLUtf)uB7U&3dwc2%|lv$D0QX=VK z33G`>Z14PBovX(oC+ekm3UBLuicSNYu#fdN?7(9%#%uY?rd|e9-gwX8T{smDYeWwk z-iU{=wR{xM8&2^JM`lFd5NzCWf>LyzDh6H3cx^OZuajE4pv1deuU#~o-)twj6ZLMT z2c4ZNeXX_GTRdiTH7iDC?3oTix=vDMshpItZx(31G)anNtd%S`Hg#G%@j>reC+LXd z=(oJi%qfb$FxK_S+n`W_vRBXq%)>|g4t)`YY>5TlY%Tn~oAXru7bPX#91qHt-j>(5 z=n$g~s%H~M{35Z5EF)(O`4kGa!JH#ijbZBJ+Uo&wy*v#Xe;?26^CqB^J#3F29Iyjy zn5|ypw_NXCsmrQFrS0CWN_A(&-YrU{XcUz62kY%cO8@`> literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/ipv4_if.cpython-310.pyc b/lib/aci/intf/__pycache__/ipv4_if.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cdf87a3787ed6a838c9d40a47cb78ff6ecf4ea4a GIT binary patch literal 1336 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 VwuNdNFnQ7){*)04K@H%l_y`D1N-_Wd literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/lacp_adj_ep.cpython-310.pyc b/lib/aci/intf/__pycache__/lacp_adj_ep.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51211313cbe3032681e978c23faea6dd2796987b GIT binary patch literal 2003 zcma)7&u`pB6rLH6z25C^fKWoCAXpHow5Ulq0YYg6Dik4A0jW8y7A&u4b~}mJc4o#w zyYfm%&9(mkr-U2-(p))l;Sb=@@}4)F9~Gjt9hzO8^3Ldzng^o ziO%)I1LrHa%==&j5i}(e+NYF!M+6hzDG}aN)@Oo0CO!Wz*h6~MwbFbXJ&|c4b%LSm z$7RA#Au36q3Iey^s*};aC%EuWNuP^AG+^{aTQo)Ml=cHb;Sn9zd=w|e*W&QoVn1Qm z65||mKY+`8491c}T2Vot(TYS&FtDB=V0mqQK_H*E59J0}t`hxbx=h^*H0E>OqkQZ< zSa!E3d4$VREDj@CL`fPO(|_ls=t!kjYPWJT++&U#nT|AvoPQ9Fi2w8XgD(e1ajFK1 zGD$uV@cS{enX*yjLmCr;S)l=(EjnAh#AbWB zDM3t@M*}8!SB=rnFcE-I#YSw6%soWtkid+?NGq@6!h6Q%eg#OCMBhP*$A}+;h`&z0 zAwPBI0qkXGUWFrBCn8uU=g=I-ABYB^8}83GZC>O6;B=?R#nz_T$#NlaG*h#KZ?>Z{ zV`uk{OR1+@Hr8Wl@0)UHwUl=k?$(97RbzgC(*R|Dz5k&L)I`KKcCFZ2t%jwQ=Ag$l zzNlM;RM8~P;;|G_K0K6()d-gh;-Zk5=ruHSJh)I9(C->p8ctS)GFD~dQkf@kYZgzW z?%>WhZe}w;^v(3hY)!Aeh5J83q7;xklb6jCCo)T>5j?-hfnMBa?t)+gs)%3j@y;DkWRDTi4&_%l$}0I|QmN=#G>& zRwI7;Z7{BZWP(UE1rHR2Na%Ob1i0)=t#hrr7Jij|dRvLp zH2)=w)t8O(4+8|IOsL-(~Er_MXnV^lU$T3&f8IRT*m2QMYo}f1t49VVRhFk xzHD5L-(_qegP{-#4})-HWv!0y_dEbj4eOs!9r>>mF5F$zu!me2Ox7l=-oFjo04o3h literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/lacp_if_stats.cpython-310.pyc b/lib/aci/intf/__pycache__/lacp_if_stats.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd674f0cfe9aa65da6e6efecff8f25fd5fbf6450 GIT binary patch literal 1431 zcmaJ>&2HO95Z*shG%dS{6BzIzJrr;N9%P}%7D-XS1&RWJ64X7Z3J8k3lGmb0d3R|* z0(EMxd55;QK16{&$6j;FBP2kQ&QNtKyFr)W>^HkJv%_zOTkY+|1jd`Qzw$o=LSCV= zJvb=e!fQVVA&H~~nbRSqb;*2E0Yp@{+^>I;6({oiUl*w^vdwdM| z5LOi#Qc1u)YJ<@smqG?F$WX{oc3=)9g}^(0_eqv7ewduO%-KQCwgMu?n5XczNjh>t z8!G8b+K`k<29iqxQb+=^_y7_NF+nYdyT!j@lfYms&!1FN&%wYS&Z`s+Qawp6o}A`I zX05+-dp%)ZSXE4nfB=6GgOtAg>h$Z;EGzUV*EX+4QeCNHq^&Yn%8Uv<9%Z>6>C#O` zH_kX&EPa%wy3{UBp(4bFAogiUW4gM(MZ?Lp(G5D#1G8x9K#HeOv)}2OX|m=G`;I)1 z)}o<}I3f*i#3OPUH5_PR17MlSau_RPp3U5k`IQ{T^UTbYY4P4a*e-6VXR379mM!iq zWZl{z*z5xMNzc{O+O^yO)jN=y-=Ak?HdQjM#uqAgUd+_edZEinlYGRvOJ41Ch#{9G5(sPf@P@7a3nj8eU} zOCKLwX!M|U@Ug30R-9IK={)_?hk7nEaH8;?KF*vodR#kY6Jd}Ce}IJDtc^K<4HJP# zI-BB!kTLv2zJntxAqAgBq9D{m{OYhI8Eo3tP8~5G`*~| zVzXnqaOCE@@$%cs6MM~IM;g3&ux%_d6OoukLHAy}I!HL&B6{3jD(%Xr0{H0B=J0Q@ L78XNw$pQZxHR^MI literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/lacp_instance.cpython-310.pyc b/lib/aci/intf/__pycache__/lacp_instance.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a753b7cef880eb96c835fe5124d35f8cfa9e5952 GIT binary patch literal 1329 zcmaJ=&5qPK5Vm6{ooO; zf#LDA1LH#h65^L^C?SC!&M|NVUJ2R#vYOv(oG+V74XS7fk#qvx#J`Kuvu)mT;IDYg ziU=Z<0vJjO48g zRoWK?)`7VM#Trj|pYNSnPX6Yh*AWuv2!+v+@C219mg)`Pk2KpCnzaI=4c10~v#064 zYd26;SODPg9YM^>BA>(nhDB4|Qt zu;64KCT`a~C@V_o;lj@s-mYRyp{JU1Tq_9iU8__R#A5{=ZOHx#IjqgfrkpA$%y?T> zKFA%l>w?tH!~}tQ=X@ZJk^kAL^52U@L?VR~LzQr+QKVd^DNp$t&!UV=nSGMc-sK~7 z{u-g8jyfDakqg*gE%wzmn~1YWaLfMVt$59mTI{g}v!|%jQ17TjVy~e`glnW7Vx%5V zqL!?)*VLnUejCX~a`(=AGdI|MySL^BZd`G<8Uu>vD=zfC@nyYf7L5=5kC5mYl)kha z!wmh>d#lF_uUsx|k4!6+S=YAq9IkDO;*jSA(XstQkKjq^caB9<&Qv&lv2wU zljumKg-{8au0NLpegIZMhLjWNzG?@fLzgq|y&yxzecpn%$Gg1EJ1^+a=PNt}ON&#O zYR$CwQ(k<`kAG7P66e|ksN)=u;jcGAl;oJ!l+%~ACXpivNS6~B!x_L*eO#*KeWtLZ zarg6yalvM~(>zLHiYVsCktq6(VOpeP#USkOM781d`oZIehtK0w9wt&J`5_mlB0ZE^ zs8gX1Q#m?}6L~1Ja(sAgq@7}Jf+&)iEThPSVKffer5#$WU+!sV8Ia&!mQM>5AO3c4 zAtj`SJsp!%qPn$%T1~fX3(sibqiPfPjJ`+YS`=0HCJXx(*ue+qgjs-o&e+)?oV|3; z+#1emM%72PyBr^5aeVGABhMgPXCC;Sn$;d}UG^jDDGy*JE^lv))kKsZ z>e;ANLfmVb+l%IQlEzwpcsV^x=h<$*HNKqkxQtCFE=wgxvr_14^XB4quKKkUX4%|< zsiMVtlQ=mNW*sflIEyEOFFeMNi$Y{vAt+2ME@To-b8|=E>f3Lr03&>u6~Jyd55loZCQ=wL|YxicP#eXA^Kg_!bX9=ZHiOZ^q6OkqJ2-a8RPy|>p zdLP6lWwhgTXxHgd<~RU+|33i(ojTBRpv64Utrqx``rk91Brf8S zOl3JAc9J82n$%DDfpK^?^hEYJE{r4j(4S7GKzouU(bT;!M?Lw940(RB+EJD>5df9U^*M`Y#oEsPP z+hFTqC1AxMH{U`T@ai~!1f%F5f(SO)8v(^%NS!Z3C!ibd2JHdts`sye^IgLoB#4#e zgOzlNn?FILhHN8YT{wCTNQ$029EkJ+hzqZo39-}&v zqTZ{$bFXe84O$CT59$_o5ea~<2Up&c&6=r4wfB^ie(illIRpP5&IHs8*u;ByVBY+e zJyjp<$4Swi8Ngi^V(yrq7Q z)^!kYi;AotG-*XJSR9xTm_Vp8WDWVJ8>eah$7niBOIf7Cw3lR|8zihQ+cvGYaG>tP zsHgDPzW@all>c^5u`cY&CFz ztJVfWPL4*o>g|bBnTV?W`#j~n1348{h;f9{ytVm$lOSu2;HtBg`GykH{8U6@T9orB$-!GnH)-(+~*MUm-5aEtO;ih3ADCqRddN3Gx@ zE$}VQ5rFE~D6Up-HM|oQez_r9bO<6K9U8FUe&=EMj`a-sE|iEI+3!wk`Co&W;8C-b OkB~R*mtsiP-TwkC779NA literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/main.cpython-310.pyc b/lib/aci/intf/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba0e7980b1d848d0be9b8d49b045e9d61685cbad GIT binary patch literal 2074 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 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/management_state.cpython-310.pyc b/lib/aci/intf/__pycache__/management_state.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d47df0fd260c28f51e5a2e010c0f748452f41285 GIT binary patch literal 1756 zcmbVML2uhO6edMVR$M0og0^dRD6(}a;Dej(G@wX}4Jl9rXgsXOcFwdhLH`cNz98_7isJb*KG>0n7HDw6saE7Q<+Ze2;wm$oJm&SgfzN3ACSn{Uuc` zLViQ#Vq>6u37@$Qogji{WJV)O$zvis!Cnx-e()ks@B!)izk?0wQrFIkNqi);xzs66 zU2Jav@4~Dk5fucshcy_DnBc;HK_V^!(Sp$z6oA*Vs&SY)}HnFmw zdKb`9#sl`@t8Z+{F|DYeFKI<$Pk7KXL7?Y?05I#rZ3Dcm5>cpThm)B-7d{uIIRs*;sQx`I+c782kHMW#iaK_X6lPXh7R^`SH7= zbMJh|r6}QcyjmTl??9M9UVo%3PmvWJ+wF{uhqjH|f z=TQsgLt94cC_F7nh$e1ZLv=8hQn;WNZL@7)zbTU}@=ry2ATT~(mv&xSy#Y=+ubeyo zv6eD-?5PxW8X&bHu5C2&6>%{-mZ^1oDi_9am5&R@K(39O4(r3+nMe!4|A&L|)$G91 zxIja59lDV6^^k^igLb?Q<-Bvoz2)9JbMzmeQ%u)+LkFN#oAfO~5J2(DtJs*`BrA?2 zKPDjgFhcSwU$B?nDyRZMN}{)r_#i`4g+FDw2UgxIhV}Lq<+Vql*ujpx;$Rzs?HZ5( za6xKsk=Jz9s#;J$*ZRvHTg(e6lEv=45WO9h@ERE)@n5ZrWqgy#?@`&8J7v7vD%z3wJx;&5ae#y z5Geqs;qh=S^cscETb6*fDU`7)pOnfRNfGDCOzK+*^}%I)<2vJ{%xv6T_A33}@3s6C z5Y1=Md9?Wje|iC@{4dT?56(iL0~Z63fsbb#rmxql%P;;XE4#Gc4Y1(Qqd0c$IGz=v z%uw#c@d;FAv!buTwd#mzeDE(ghOeT=n$h@TBf$+aJ0xuy`kjyJ*?yP71FS~%dtA@_ T8-NSIa18i3aB%~@ugdi#;SfGKMWvkKb*t>BuJ2SC8 z5xbhbqPKmAmOGw;N8sMKT=5D>1deBtCaEYwII(@snRAYh{eAWp>+4+v?d4y8Nq0L4 z{pOU*je_zqbbS*BjyTTH9FH(Y_YfzXK17`UNJfOSeH3}WgAaa^R_z|vAOgMsMWC#`du0qKps$7VrUlcP-!4?tAw8*B4f%#{o z0+{~T-MceBN-{Z4rA~`67bhYcOD)uiP~%Ka#z`v2^1Q(D{Aq=;b|u~}7dD7vnM)JL z9wgLm%^qI9{=7}yKKH(|ITz~6YBqNW!VKW}39pDmD=JYad?1-p7_naqa6uc?-&+PB;j?buCLcSC;U6^r9?JKG>Vi zK1*aK_$TvnbnS}eTRjTT3=Sn>{Q|hKZ)~@nzp0YUvQmkuWoA)|QRk#gzZOEdgZip6 zWo6Vl?9h^`wB9`>M6NbKU%r&d{HR}*{j|t)ks84*y)Sr!Q{*XNFtQsh06Z=xhu~t_ zkyvQUWIin{1-Wr^>wjSUBZ{U!GI0T8Y@RX6| z&U3;159w2f>v?l)xs5b9D-bwPxF$87((7o&I9Yi$Iz%9hR;>ZSa+W&rAKUlthTnV-4n?%9(@1_Sb<4WYWTD`BU zi2+diX_jbx*CpEpYQeqqnlRfng-No#qRNfM@7bIGeuT?6zRSfAWkZLp7WA#u#p*j- z+q(U?zMS&}md9|Qqu_i=+f9s7a#9(gBW8PUp{w*!J_J}#C{-x6333#)H1pwD;0duE zcP>r{FE|8Rk4tT2KC7fY5IoM4xlpgTRM)QN*EXCcRc7M0;%CUIUW1UgpzC*GAh`YW z|71QRPWDd&j{y~ZkVDK)8Dpe}*-921oF!OGn&f(TguQt|UMB&AiljZ?#EdP|i20QKIA35B# JOBJFX{Tunj&szWh literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/output.cpython-310.pyc b/lib/aci/intf/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05701ecb9c2b73613e1ce7a0b66440a5c34fe9d4 GIT binary patch literal 2062 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 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/port_channel_relations.cpython-310.pyc b/lib/aci/intf/__pycache__/port_channel_relations.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c633678acf5f216baa516eacd4f18c3093aa70c7 GIT binary patch literal 1164 zcma)6PjAyO6o1aYrdd}|4;2G#LTE$Eq1zn|gf=9EgenBLlF3SAxAT@Jt({D2m0V!g zeGondUn5seh;P7Q@SL*IN@&87pP!%oe(&e!=cJpP9$@>?{Tj6`fNy%T+Dx3h#IANw zFkmEx2^kOquYnoNyaZ-`HUK7en3$35Va%8S!6J>~I~%SfA6+ZrH;0bzjdP7Ou| zCbO7*2?L7}1Z-5>Z<375Q5f-esmzW~!zAJHdme|GNE6kMj1_3DYxHC6s)HhfGg1&n zu1EpYV1S55AL%)oo?yNywM%8bO~;jqHs7c$#p990M8Fr2E)GABj-LhRVJw13s3;8> zzu<8o6qgrV2C*0hVI%^PWTRk;3~98aNaYR3{pq}NDHVyxD76t$>7X65czWm2_HSGw zP3ER;pyFV!kN61{1|_DdAcawwBeM&o&5Y71;0y}8aF}^zlvZIe$U#2P2@p^=aBgkE zD>!*vx`m75qp~TWXcWyuDBPmC1L5uO*Q1)NgK#{Sy^nk9WU(#Pw5Rf6COPkkB#Lv!pWh}5FUFqbT+S;; zOjwwOl^1526vI5@3Ku(Lp3zB|gk#QVIy~c1=5NRbCZTdLEM92U&~deLZ|yG7&|Y_} zI!vfcB;#DDQ-n*x370y#gYKH=ExD?pFdo+2VB?QM&-uJ+-ZHFn-Bqcb_~Y#xLXAvKL2p7tH?z^hw{hbvfz-Q(AeH zPEwY~T5nN0%fooNBK2QEcD2wXSA;&D)Xz-UrP9Udf=60rZR`6cz9ccMA69Ky@vMRB S{4Nh@FG{b(R$Ayk5*o8LRY z4Uh^FQcmEySA)^e;x>2QkkIBXZ@}zu3cw3haF{D|Q1p*XY;-$eHxQ9W&^;LXGa!Z> z(~@#}MoSVg&VX8+0JUrCZ~~B48{X;SJ5wG8a{Isxp7&nl2Z#Nps}QoXzR&xW1t+S< z!#pZLe?s?-eHr$Tm8E!3${9hr7Jaguh@3=n&9B0BSr*eu4C7e#57nkaGrPJ2L>sSCePCm-H) z+2-}R1l3=Ei@-Es)UNvt7!HmrS!wmGM`UWF>y8O<4$QQ)ONU!$Z0eRSCnKU(G3b4C zECY$NO7_Xi=Cn~ZxVuVtqh7B~z0%{}yY=JgLP^f8a)B>^%!jeKN-pTsFMYtI>KSNa z=XU8|K#HAwb@KVinnCT12Yd;VZTSqtiSJ?%#Cz?@y2*=9E-S#?TbaH2MCM5>^)4{8+kkDo5@RR}OqFT{ z?+oKC?h78}-D8m$g?U#!z>T;lWSYb#%`>c)$_0VQc;#xSAHkc8Y5~u>5G*LXs)4@7 z3T)J=4U!d}YLjODQK|=^0IgI@c;()_PF*d}3&LO)$*7J*xUAkf`|aAp+D)@we%nj6 zJ@bWy-qTNkFgp9)f0=7j`^vU)?OuA0ORr0d zJ{&JA+!mstd4vK@E|a4C|zBXpj>Y*a*>jR48Z}w?mtAS>2?06^J> literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/port_fc_stats.cpython-310.pyc b/lib/aci/intf/__pycache__/port_fc_stats.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03a252ef12a5bcc87ca6a77dbeaffc8c62c6e9cb GIT binary patch literal 1835 zcmaJ>U2oh(6rCB5y&GpY4Jk?+RA51^z#v+90-;hNr3xS+DZa!+_9m8V)KEOJ#_Eur-k$0s^=dAl&xR=QIqRT-vY4x0Le zzKOTIi%_wBUUS8N<~56j5{Qmsh_Z>UVnB34BLH^V#f|BV^d~s*5aaN`ydTevV8$E#l;S8K5TZN1+}~e zz59INtg~Z@9;+!{?g#Ba{6slBY)Aq)wWH()d(6J?9=q7*oXVP7zQL5c!Oq~XgU^%) zd0HgT&4Z~nM{$*yp$7jAy|Xu}Vp2euqX&~heRQvUFfNp)_FlPVy=4f87D)n;$nASr&VeF z1|}XSBW+g}7aL*ELx;d_lRz0Xp6Nvgkpas05hPy~lGD$7w(72ODMZt6yO55jB(H9N^EmRa24U1fKLj0-i_Uf!d1$`Vhs|&&jJjD#g|%&T zsmGOdsfM(b6>y_AMLG+yv0$=E;5I^-TgceTr~0Uj))u@E*AEKoVC6d9>m>4vd*1_6 zN#eG-ywT=sAbIxgJe@B;wm>Ekc}3>e7?9H&Z?BMhPvLhZ&IHHY4%HIX1i5?#R6EK6 z#i*_`Zr-UG9PgY#h6B_YsFtC9?S%wppHhCkLE39BoZf}adKVt-jizPQ+tt1QjG%gh z%z(fR`GIHGDzc?gDWQ{nz+4J)HXjZ+Qp7 zhc^X&@|l!U_{6rR~XuZ?3uObbD!xDvFu6-4x=2u1WKs6SF=QIeawMys`F9X71J&deH! zwUH{7Tckch(wmBx=riCcQen6*{{Bbr z&l+QY(PaLzG5G?wdLKeC!4o#%ZO+*@OjyEx%7p!k)wYDQ&6@7t@L^4^D@nQ=JcyD} zBzt6)ixaTxj`C?@b~~;fua`(dgQ6kpIqq2Nft?c=EO?V(vFIf zzH|`$Ig_U_y!d?UR_9@u#GPKOdTB>QkD{a#t4KbIWG9Kcov;^o;vpjT!(P-`e2MF$ z1MLSvJdCp-a1l=V5H;@MSK*U)<}-GE=GUW4%`OiLZ8Vwt6^dYoHZsS?OxAO2I7Ulher8nQ+(HG5EHBQ+PnBL@3qw$B{e;vQX|uSx{tnav@7cDbP9C7^ULc6}2%; zMMUEj^|kimfe5ouSHdilad(_WYNzSyGVM3e$r8R+QodvvLVMw86b%Kir~1$yVuBaC zL_tY8JqU;4ZX|-VyBGB`r7I>(FboHgt}QMaXbVxLVC#fX43sC)5{-xh>MDf8S1pIr z&--`PUFD8t8Qphbv8n(R_e;l_e7FGW8v`%Y2O&(PGbn!yWfyh*8$YySLfZlg6=245 zAacZxS#IafCfoOOpw+Zm&&%3Eg`Bzf2BD27-duA>b)m- zWICF2TPrLJUT1brMw^-z{8o2PL@O-wUSNo;0Q0En8ua8je4}G?U8d8qxj;g(9qD zi^E1GQj`#YIe+L16eNnvHl^j|E)~v^oqNYrfDQ_W9l5!C%uUhMGcQL!6&@OO38m`f z)TsTIUOV}glh5cg8vS0ww6w;Q#EmJ#8-uaR8r`VzKgmR+A4`=@uD+@C)PdTdPP!5I zul;mI-Pe{F_V_Fb7)ht*x{X^=apa(4K|4b>c>y-UGf5vu5(<1L6>-%Qe8n5f%Oirq~vFVeG0rv4>?quof#RO$-yAv5(j&K}4$*d?8X+Ed6@ zB(Q1(uc@P*nA7O`V^vq61VVk{&gJ3s&LDu znZ><-YG?rt=`Wp^*3Xs)8=8dUPAg-A1Ww3DTvh0tMAxPMTrJ2a zEb0yD5jIAfh+3Sc>x^iK$RPw2-Epo1X$)H%%;-_)bQO@3Y^BJ2T_Po>3W!eS%I+z zYTTtBq08eT7L#}wX*UbINra=iJU9r_aW)!f+J{=0o#JqC2xr;E_e$!fOStN@BZ(7x zsh9i+M|B?JEWq?Fzv@*BzzdiwFD4%>!1=luP2NI3ZZ&;6_37XV0$mA$K`O=x>D3_E zABRb?B3J0u=!u5DhHdf&P3h2?6I6xLh9HWVn)JcOis!%Q*Q=MzN~>w(k5Jq-|BH-e XZodg<&N+Xxc$M2!<%+^p*_!%Qv6xGS|(VB7a9 zZ6+o)^*Hk`IG{QCxQ(ZN6U4B6-f+qP$s3k<(gXD+0~L-2lEI!o#`lVFLRS5 z0j$&!$bg5qJN)G8IWpIuDP@Gnvn#}eRyl;e!9=o^4}{o~>8-{)8`(ZE0&;BM19sk- z2G?&p4U9mNH$ZcrPyHXVmB5TOMEx^;pbU$@lKzCv9NvvD#WuUc{@Py!&=aRYLnGg2 zGT3I1kyM8_Wr%3BC>mRbOQnw!lj@l=$r{mB74vJu>zK3RjLupQsDzLpf0Y97OOdp5Szc zPp<@5xbQqTj{-=%9wLk9J0VVfx{2-!EnX@H`rh+U{|(HHtq`_T)bV4EK>T*)BaHqL z)4wsi@gesfbLnrhhkPY2NDwwif<~;uHfy|7&-hLF5H>h#LMeX4R$&u1!GX}fF8Sf> z&L-ElNVD->U|Wqx9b){1|MCfcM|14uTOuQ2gL+Zq#`?%|y#S8)^S z10Lb_xc9#(>~QaE;hns;!TbewE+I~6Q+>PQ`UfU6VEr$?@^Tbe&QJp0Eg%T&Ba{qp zfNbM8;ubsXNuS=L7{FnMl91tnr?1HtaZUzp89{bKwjo>Vbs+0P_P*?$t?!WTgvtJ8 zel!@5UW+?vmZ`e_5{SmVv?!{tlq9B(d%J0Nu)tK^O*7lwU6!&?pE!K`*>v`&%{pSo zsmYHNt+bvjZJ^35UBp1&Oz+2iG)41iULH)$?Y&tX%$3Yhm*x4IbzJW(7X_j>pul{n z^_{%_e3=%uOZ-PFyNj}mdyc_2ZyR025pj2A{@`pz8g4o1-ccsai`Xqk_x`Y)n7B_1 zzNpX(G<{W@*vUdEX+t+P)@9hlIM43&8jYZ;C(C&pX;mu&-*I=L^LeU|9df>TaG!ec zXG^nK8XNva5t8~11YG|D#EP;im2GELS)x5~PyfC>pIw*u`^#?3>XLiKJkP>>pduSsOC_OzcMDOYM zQ~Nn9mr|S3`aHG&42C+s>+u8X;-@$#&^|m48Iq404c;Ts2RJ)?YAUBVWgc_=vxc1t zY6~mx5a$irf*9KY71qZ4$-DP(#17pNJ3MQw!?UhCoG)uL+*QL(|C7UMuF*B##I67! zHFHhJ9MV$jO52WW7WG%T+0*pjF%s(z-*O&hso$d&1o?B=>fb?D;i+E*>7WgxF>vuz z2;p`3KnUW#Lz56Euh5Ps^iOd8^0$omc;t=8qlglQj*29)og|r8a#_&4mn4Ts`}G^$ zr%h}Vd7TLD)@|a##^}({bf{=L)+r=4aS`^{38Pn|mwWHJH{+3yUzU8={lPfNi;URl R)_N-+P(QB8T#sG#{|}%yrfmQK literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/port_vlan_stats.cpython-310.pyc b/lib/aci/intf/__pycache__/port_vlan_stats.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf308dfb4e3c29c8d232c92321561eb72f40d60a GIT binary patch literal 2657 zcmai0U2hXd6rGu!U2lvXqJ+|fQq?UV!bJtOJQSe_fdZve$k3+Z!7^H{ch+W;^{z9! z4vOVSNbri(pFsN7AJEr6_D9TXpZXVg2t9Y45RwM5tG#pQWABddx#x`YdcDeU{r%@( z(Rh}zf2i~R<)Cv5PjL}OF~w8XrdFhUAlibndrUb>zGO#ah;Ca#Kz7 ze(*F-hp~=m?EULq7_79`RSf%gXzLzr zJyGqMO@v-qFYgYUo~C%ld64&wgK4uk$b%ui9?+VgpzjA!8Wx3FI%cMqq-Ctl{Qsw# z!pI^{ds-s?A55P>^XAsdjm~lLqP(Nx%{c8OMXWbt-AR*fCybI#k|AU-jN;Cb zeOwuC89xY;EGdJ)L%hO=ndKhtDj%Odl(Z}R3nNO_{zY%Ocx>{1gQM8CgXFOh(+d-^ z*RnOF4@qTf0%;X{E4aRFSD;0b`2>kx<2~mz+m`UygzWx$0Dy?!Drc4T2?}R|f?8sC z*pvFUi*?RxIiZ#>G373?9nRUtb>#u53IVmSF^ct8P=>l6m%%j2<1=MG%mLBX)nTr_ zxlmlqaurj1q4>dg$v}l=XsTgZ>ZCg=q1W^K<$MMlxqWR(y zjO24da=N|UId_grA*}Da7!frUx zhgfD40YIvNk52&3Yqo>&iCktIHOxDJMy?BeUb(ayJ!hF^p7IWQ@G2PhvFiG}RTabq z?C;j?^_w%TX5CamHAukfwv0-h8lf`d##s~&(G2@{vbNs~yLV}zUFkhjD_GQ)PoLda zMgS9Olkeq_p4HM+r|r+9Fg3E=8pcG9hof>hD)kb6F(8i0WHUDIJsroHaej%F{(>gN zXowDmI&pVEX}kGG2UsUy4t<9fMqFn1K_MJli3RujU-85p0-IiLG{p4Y@I z9^72Y+O8Dii-&>zP^gGt+`ovw^jKIsaEN)9YqP|r*WjNLJCJY^z5X6E0rDJJ=Mtn7 zXOro36ZzViFyi12x7=GO-HEi~4B)_cIgyr&X5pA^jlZXzH+oUS%41`X42?aeGzO!h zY;@zsL8+=nFVRT%=h$(?VfHWbNuO5n6vT}Zzeqt9UeKWlM>Bh6InARmEpEb@zTf1!iMOE#BoCUBjGELs*Lt1?zNP`Mzz>i2 zMME#p#3`6|{h$aERkTkYbZv@kbsgEdzKj=t!eiy23c?HAa#uqHbLoj#GuivL*E(_Df z;|I4}<9SQ^Vw8qul4sK~@9v{}jXN3XxSMN*bGGs{4$&57AxzW!Szt$lV$>zxnwe3C z$u!A8`7-RLG0xzb!B&u4O)x&(>9Cw?z9f|NceLAUWax;V8mr=;3^l6mD80K_R4l@r z0zSU*eb1jFN9YM&eKS6H7@=dMG)zS)^(~V5&hd$kiw%zZL`=(6#A|uG7Zo zo3;vV;piLGJ=n4JXxp0TMCxzp?yj~zZPlJS?P Q`?*OhEr=05tMPf~KRVo}2mk;8 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/summary.cpython-310.pyc b/lib/aci/intf/__pycache__/summary.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c506409b4fc5a433ef6280f193f2c658188bff1 GIT binary patch literal 4275 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 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/__pycache__/virtual_port_channel_member.cpython-310.pyc b/lib/aci/intf/__pycache__/virtual_port_channel_member.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..487e5a15d49661108b2febfa82ce912f93d1774d GIT binary patch literal 1757 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 b>e8Y6$#a(Hxv}B;Vn;VAuS#;*WUJoq4^_t1 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/__init__.py b/lib/aci/intf/adjacency/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/adjacency/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/adjacency/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..794352d4833bf592d0811326fb56631d09772817 GIT binary patch literal 155 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6wx*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCNU)|F*!9axiTg`J~J<~BtBlR Ypz;=nO>TZlX-=vg$lPKkAi=@_0K7^hmH+?% literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/__pycache__/main.cpython-310.pyc b/lib/aci/intf/adjacency/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d7e9c9317eef62c98eaa139589e0e2d1acbc1f1 GIT binary patch literal 738 zcmZ`$v1%JZ5S_iflN2Gl2u=v3a7d@-KEN2`pdti}8+XgX=Df3lP4-U8?%Cjw&i;_3 z^dFgPQ>9GnB4p--gg|Iu9&dJrnK!eGgM%@U{r&eDp9H{f4z_JT!8v(4B|tzCpcYC9 z=2^&UsbtS($m>EC0zLxfSUdn0PB`g``$7$Ha0S!hAL;;8(Y^ZAv@Xso>ptKY!p7ds za7l^RyNQd+?#l#RTJE@Q83pI$>4?CA5(p|of!PBniIP<0-OJr6mNwrQb4flUPwxp@ z_$hwCFWR}yHcYM=0(BLa(>(I&WTHi<4m2b-BUF7c=k|!o(F&2m7``g`x%C!p8#gdw; zcE)sLW9kLo1m+WCzTH$|mFfHT>bBqojfe#S&q}<>2qvO`xttEwF-a{+YROW|jnvZO zvShjaJ=D8BRe?TsRmOMPUq-*YD&zV6>@9_S&d4&m(dlZjGyc8A?-SBG5pU#ww6C*0 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/__pycache__/output.cpython-310.pyc b/lib/aci/intf/adjacency/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..859c3abdd6af859d39a47bc62bd4d94e625baf27 GIT binary patch literal 566 zcmZ`$u};G<5Ix5!R8`xl0|NuFWyuGi3KexgNT>{KktGviS2DOsv6D(gZ1h85j2E+tyg&`-+!qSo6?dxtI9MG@orb+Xn$7y88i unME`?Lc1~Ajh)^2&u*;oDdNVnABMlsqIGjHj=S!T8#gCzuwI}KBl-gyDuwI- literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/cdp/__init__.py b/lib/aci/intf/adjacency/cdp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/adjacency/cdp/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/adjacency/cdp/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd3611e3fb100fda68545908a8040671348cbfbd GIT binary patch literal 159 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6ws*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCNU)|F*!9axiTg>r649gJ~J<~ cBtBlRpz;=nO>TZlX-=vg$n0V!Ai=@_0AtxEEdT%j literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/cdp/__pycache__/api.cpython-310.pyc b/lib/aci/intf/adjacency/cdp/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81e30ac87035eb1e8342de357d13da3d76964372 GIT binary patch literal 1450 zcmaJ>Uu)zx5SMJ(>vcB05X$uy`p`miun(JXujNuMq@^6Rq4b~+i;Gb_+KqCK?MQZD z7w=Q=wcjCmEPd+N(QCg&;jW$W{%KO~Dx=YiX6C1v(a7cQZp?68eD??Z-ec@f67CNl zg%>#OK9X-4FyL=+{^Cs-c(2&V&v5_2@KAbz(|(FXu?Yt@@qmN(hE06%LEtJNK;O_k zd0EuTOl77{;1X$(%}=2^sdUECc{7M7)Ki?6!qu#0DaL{r{A|SCp4@n+8C2<2iF?AT zeEJ(R0`31gKK(LzEpwe@+Gb?}>PF>>w#wWnljQn5k(o|(QBRXCQi4c{tn^_ucTt+^ zLf2_ZQCK1|Uwr85M6cDDDtvm&6lH33$s}Z|Xf}OTYD7cFAs-*`u}fhnO02 zShN;P_N%uPtpL_=^Q;vsi|3^GZn2!L|CspB>(1j_{uP5@dqM!=GDIuU25ksEMC`Ra zL}cds4kv&J`s7VTovktOj2^^8_BH!?xQyBeydi^~AzSuab{k@B5e)A9whx0Ynl6Id zUfaLpoL&F)Kk*^bCgLtX|9;e?-Lpk-U=I)MB*Htu#`vbf`+QWMU#hH5@mg^y&0=Sx zM9ak&by<~pIh!9TAG=vk8N{a8>ODE#PM1j zXSuZYcmw{_*lMfNMV2?9j;FH8>v2{#MU9aK9jf~nG1G1PtQ&C=pZxIhv#Hd%0vGBl zkhOHNtZSpsn_Ah)PKR|$P_X>|{(FuKWmTyH+@Adp_9!;grY^+7r5aq1Do2d}TFqUsI)5Lut#vVL zw7tMH3wfnXL|%^`hGE@D4>!yXT6J%5MFJB0NQkkQNIXto_%0SP7v74GkPq>TxWIjH zy(myah@T;lGW;#rT6S_I+1(HVWwBQ?6<1 z;uI?nO-}qEO|Ki7uQY}pb(hk;H0h^fx?JhsMbna5#3DZM4axZ1>elx;x#;=otgkvx I>WO{!4>@OfbN~PV literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/cdp/__pycache__/info.cpython-310.pyc b/lib/aci/intf/adjacency/cdp/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0b713796d1565174a48ccb9f1eb61f2a49fd3aa GIT binary patch literal 1554 zcmbVMQES{r5Z+y_bh^u(9gK0g650@GiwaF%`qC0YiwngN96~}KRHZ`Jtc+|~l6R$R zZFCTbe~7P7?PLGWzV^v~!4FMmbhUFXHHEI&*_qjy+0o3mTTLb-hU3Slzr*tZV}Fpa zIvf~yDWl+Kb=eG3Oj%k*R$>YXyHQoa(Nc!6^pr=iSq*0C7V!XSJ%;Nc{>a*tD} z18${JMfMxhl-A{w?XRQ5q{yQ*H)$1tnyDhnjnXrvqaxpnk~EL$`IaD0dQN+3^|E_d4Fm>EF8JG1@v)cFsU9IJl$-4{cYqgI?>eXopK%^co>|r{5pr zK0D_fhsl&JcqA}}m@-)F{d$TOUf&JYLnlpYY@3?xfE7?$58Ap=KU+610T)>&N6L=M zq{(OMRgsjTR~Jcx#$H`%Ttm+^&)cN1xF$_&?7*CuU33bE$UNIS*ny|-*;m%V-caG6 zwN2eN+QWif@<$hh1PTdp4i{8jJ18qqD4ohY`{IX7{`vy7%#N|2OJw1my^|$v(QH?3 z*%<5ff(e9mOIzfo;}QhSM@W1wH+;VQ#$3GFa<=$=E``T8-${A;)$P#wj}u;| zbjH;fB6AJ73;ZFv{DfpeGnLVBb1ei zSLlQVjm5~V!Kl$1?Z%B;XeYV)3yFN-MMcG|@) z#e?7xhOs~vwMF!x$J#G*zY`9LZ$Nwl%Qx8b4Tx_LmAXAgc>T{$nx3w`QoHg1*q+K* T^v1j0@*UZysI2lHQMlxPWagXM literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/cdp/api.py b/lib/aci/intf/adjacency/cdp/api.py new file mode 100644 index 00000000..44433d68 --- /dev/null +++ b/lib/aci/intf/adjacency/cdp/api.py @@ -0,0 +1,66 @@ +class InterfaceAdjacencyCdpApi(): + def __init__(self): + self.adjacency_cdp_mo = {} + + def get_adjacency_cdp_mo(self, pod_id, node_id): + key = '%s.%s' % ( + pod_id, + node_id + ) + if key in self.adjacency_cdp_mo: + return self.adjacency_cdp_mo[key] + + cache = self.get_object_cache( + 'cdpAdjEp', + object_selector=key + ) + if cache is not None: + self.adjacency_cdp_mo[key] = cache + self.log.apic_mo( + 'cdpAdjEp.%s' % (key), + self.adjacency_cdp_mo[key] + ) + return self.adjacency_cdp_mo[key] + + distinguished_name = 'topology/pod-%s/node-%s/sys/cdp/inst' % ( + pod_id, + node_id + ) + + query = 'query-target=subtree&target-subtree-class=cdpAdjEp&rsp-subtree-include=fault-count' + managed_objects = self.get_managed_object( + distinguished_name, + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_adjacency_cdp_mo', + 'API failed' + ) + return None + + self.adjacency_cdp_mo[key] = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['cdpAdjEp']['attributes'] + attributes['faultCounts'] = self.get_mo_child_attributes( + 'cdpAdjEp', + managed_object, + 'faultCounts' + ) + self.adjacency_cdp_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'cdpAdjEp.%s' % (key), + self.adjacency_cdp_mo[key] + ) + + self.set_object_cache( + 'cdpAdjEp', + self.adjacency_cdp_mo[key], + object_selector=key + ) + + return self.adjacency_cdp_mo[key] diff --git a/lib/aci/intf/adjacency/cdp/info.py b/lib/aci/intf/adjacency/cdp/info.py new file mode 100644 index 00000000..28cac119 --- /dev/null +++ b/lib/aci/intf/adjacency/cdp/info.py @@ -0,0 +1,68 @@ +class InterfaceAdjacencyCdpInfo(): + def __init__(self): + self.adjacency_cdp = {} + + def get_cdp_adjacency_endpoint_info(self, managed_object): + keys = [ + 'cap', + 'devId', + 'dn', + 'duplex', + 'index', + 'name', + 'nativeVlan', + 'platId', + 'portId', + 'stQual', + 'status', + 'sysName', + 'sysObjIdL', + 'sysObjIdV', + 'ver' + ] + + info = {} + info['__Output'] = {} + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + # "dn": "topology/pod-1/node-205/sys/cdp/inst/if-[eth1/11]/adj-1" + info['pod_id'] = info['dn'].split('/')[1] + info['node_id'] = info['dn'].split('/')[2] + info['interface_id'] = info['dn'].split('if-[')[1].split(']')[0] + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + return info + + def get_cdp_adjacency_endpoint(self, pod_id, node_id, interface_id, allow_multiple=True): + managed_objects = self.get_adjacency_cdp_mo( + pod_id, + node_id + ) + + if managed_objects is None: + return None + + info = [] + for managed_object in managed_objects: + endpoint_info = self.get_cdp_adjacency_endpoint_info( + managed_object + ) + + if endpoint_info['interface_id'] == interface_id: + info.append( + endpoint_info + ) + + if allow_multiple: + return info + + if len(info) == 0: + return None + + return info[0] diff --git a/lib/aci/intf/adjacency/cdp/main.py b/lib/aci/intf/adjacency/cdp/main.py new file mode 100644 index 00000000..67a5b957 --- /dev/null +++ b/lib/aci/intf/adjacency/cdp/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.adjacency.cdp.api import InterfaceAdjacencyCdpApi +from lib.aci.intf.adjacency.cdp.info import InterfaceAdjacencyCdpInfo + + +class InterfaceAdjacencyCdp(InterfaceAdjacencyCdpApi, InterfaceAdjacencyCdpInfo): + def __init__(self): + InterfaceAdjacencyCdpApi.__init__(self) + InterfaceAdjacencyCdpInfo.__init__(self) diff --git a/lib/aci/intf/adjacency/lacp/__init__.py b/lib/aci/intf/adjacency/lacp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/adjacency/lacp/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/adjacency/lacp/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bbd68dc6f358277fe842a96b96213f091bc5483 GIT binary patch literal 160 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w+*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCNU)|F*!9axiTgvF}WZnK0Y%q dvm`!Vub}c4hfQvNN@-529mw!vCLqDW0056#CYJyJ literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/lacp/__pycache__/api.cpython-310.pyc b/lib/aci/intf/adjacency/lacp/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1366f8fb91d32af7e490c66683ba9183d919d03 GIT binary patch literal 1461 zcmaJ>Uu)b(5Z~3m)5+(?H8kx(A4xV3dBdhIxZvUHfsej{ z9lpvdsb?aU$8d=>PZvLmv^*|V%F%l>h$q++oQC36tYHZTgCP8L#O>!|!{5(NzK>svOvR}(X%U0Gky)&a)HhPcnL3X}s$!K_vv>;?6I3ipbyzNJ zm?SD!RgzE~hDgMh-+nUu!;N`L1>6h@J;2%K@fBtTyy1;Aa~`vm+qez8WH(Ij(b~8} z%nms$T!Ur%-C22!2dw7$yTv-6N=V%Be^%q;)Yn+ryqrvB&K`>90gC<`UL+ z)|Xlr+J4!piX^>I86@}42}D`S9PFO?5B4b1)T=hY+9e8XkBUc(`&urn-<`h?%2X3%Q5; z&U)ALy|r!V2QBA)@Vv+w@B!~M4iDc)KBD~-c%8S0Qb_pkqhLAt^nd%&%R3$U^Z-z{ zNn)b}YY%ls{2)oLYms#tP5*YA)V)OM_0es%^or3mWEQfJ4_r+$K49(oF((^7?aq4E KdQw;Hvwr~}hJMrl literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/lacp/__pycache__/info.cpython-310.pyc b/lib/aci/intf/adjacency/lacp/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12a549c21950ca12837b0ada43a9efeb098b75b8 GIT binary patch literal 1875 zcmbVNO>f*b5G5%}E3dV-5hMmSO`4>sfo_4iw;o#e3ocq1DBJ?hX{$g`M6DrPme!Qk zg%?^NX#7L$p4v-)5U)M?FZdAm4V87Apml+8!QpT?LsD=_zC(8F=R^Yuz{1n{zkisScf@fL$26RD6Yf_8#>BS5~EbE@-Vt; zQTb}&gbzK{#cqMQyH(Vw9>q!et=fYulH(uaWV}_3%7kA#hjf9yiC)nsWUOHk?uT9Y z_JEtEcpe|+*Z>w;rTOSjrX{>DzTW&i+>i4tOtLB|LzNz-d6-qHK1y|%XV1bo$-=Ct zN8!~zA?*X(s9YZ(8$XJ&BCDf_Zc&lw^6BIMzWw^#KOx_FbD_|E>}UJ|Wf$Q7&SxTH zGY6mKD6zpB@f~}*GLs7PMq(}-e#G>>hBvbR%61sQ*XgrUrsNq{F4>g_-|N9LVTe2^MBE_FThN&c*}(s)%J*OSV))p50@h8+yn4k&+`)ZYHQu;X zQKrrbFViVXm0~uP+31sBF8I@PSeXfsqLwaLGmE2mlGmH%q^K+7*-14JIB%S1wOQUx z>!>v%b)$0NYT~L{I*5ySH&s#jY%fh}Bk={5k>sLL5-njYYc!?HJfwYy3(*xdqO?%s z5_hp1lUMaVgwJK*^Y#~T@qE=;0Al<@Adi*z$j8By{z8^Po_-EXtuMWUmn; zu?iM}Gi;B6FDo=Q;KB#mx!%m3$D9gq!fD(ye#SXF zd_1><31WNdu2t)6)j(>St2=c0*VtI74v_wMJO)nsJ}x-$EcSW@x~8YaB5ju6Ohu*d z(h?QOHT)mlfK6o+@F4=Kk01o6pZBsWyMUc^`O=q?cZJVkq18+8vg=JZ-YpgFaZeJ; z_`DHiu1Y$@1i&#$2f%h4*Mc3iV9&h9wJ>*(q>kc!wlDPk#zXOSEX*s7)E_k74y#4u zy}%oa^^YmG@u(yLzO$|G;0%2mV&LdUq(6W#PM#J6|811X7f)lJm%l~_sFiG-r^BT= zd)v>^_sFR?H(EsB&cS;(e#R$bXCd10$=`B>(^b literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/lacp/__pycache__/main.cpython-310.pyc b/lib/aci/intf/adjacency/lacp/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e619aec46606db23529fec73a11bff28c682633 GIT binary patch literal 661 zcmaJ;u};G<5Ix5!L{-a#D(F(yEcpP0pj8J{33XwMEEy9!!r-LANh=kx(GP)XgCm#sFmrHi7g~<@Tj1VM9Vjv?iAujfem(iFK zxCTk3zXItiqUf6+`?7Tl;lVfdKuGG-NnR^dU=eXASM!GPZH^^Af}Qcr(gH>&r5K-t+|+@kI~B$gbLotD}3NymA8o`;5;%7 zsdcn)>Lo_|iQ`>6Y)Hh#vg|Uf7-w literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/lacp/api.py b/lib/aci/intf/adjacency/lacp/api.py new file mode 100644 index 00000000..f96dddec --- /dev/null +++ b/lib/aci/intf/adjacency/lacp/api.py @@ -0,0 +1,66 @@ +class InterfaceAdjacencyLacpApi(): + def __init__(self): + self.adjacency_lacp_mo = {} + + def get_adjacency_lacp_mo(self, pod_id, node_id): + key = '%s.%s' % ( + pod_id, + node_id + ) + if key in self.adjacency_lacp_mo: + return self.adjacency_lacp_mo[key] + + cache = self.get_object_cache( + 'lacpAdjEp', + object_selector=key + ) + if cache is not None: + self.adjacency_lacp_mo[key] = cache + self.log.apic_mo( + 'lacpAdjEp.%s' % (key), + self.adjacency_lacp_mo[key] + ) + return self.adjacency_lacp_mo[key] + + distinguished_name = 'topology/pod-%s/node-%s/sys/lacp/inst' % ( + pod_id, + node_id + ) + + query = 'query-target=subtree&target-subtree-class=lacpAdjEp&rsp-subtree-include=fault-count' + managed_objects = self.get_managed_object( + distinguished_name, + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_adjacency_lacp_mo', + 'API failed' + ) + return None + + self.adjacency_lacp_mo[key] = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['lacpAdjEp']['attributes'] + attributes['faultCounts'] = self.get_mo_child_attributes( + 'lacpAdjEp', + managed_object, + 'faultCounts' + ) + self.adjacency_lacp_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'lacpAdjEp.%s' % (key), + self.adjacency_lacp_mo[key] + ) + + self.set_object_cache( + 'lacpAdjEp', + self.adjacency_lacp_mo[key], + object_selector=key + ) + + return self.adjacency_lacp_mo[key] diff --git a/lib/aci/intf/adjacency/lacp/info.py b/lib/aci/intf/adjacency/lacp/info.py new file mode 100644 index 00000000..6700c986 --- /dev/null +++ b/lib/aci/intf/adjacency/lacp/info.py @@ -0,0 +1,80 @@ +class InterfaceAdjacencyLacpInfo(): + def __init__(self): + self.adjacency_lacp = {} + + def get_lacp_adjacency_endpoint_info(self, managed_object): + keys = [ + 'activityFlags', + 'dn', + 'key', + 'name', + 'port', + 'portPrio', + 'status', + 'sysId', + 'sysPrio' + ] + + info = {} + info['__Output'] = {} + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + # "dn": "topology/pod-1/node-205/sys/lacp/inst/if-[eth1/27]/adj" + info['apic'] = self.apic_name + info['pod_id'] = info['dn'].split('/')[1] + info['node_id'] = info['dn'].split('/')[2] + info['interface_id'] = info['dn'].split('if-[')[1].split(']')[0] + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + return info + + def get_lacp_adjacency_endpoints_info(self, pod_id, node_id): + key = '%s.%s' % ( + pod_id, + node_id + ) + if key in self.adjacency_lacp: + return self.adjacency_lacp[key] + + managed_objects = self.get_adjacency_lacp_mo( + pod_id, + node_id + ) + if managed_objects is None: + return None + + self.adjacency_lacp[key] = [] + for managed_object in managed_objects: + self.adjacency_lacp[key].append( + self.get_lacp_adjacency_endpoint_info( + managed_object + ) + ) + + return self.adjacency_lacp[key] + + def get_lacp_adjacency_endpoint(self, pod_id, node_id, interface_id, allow_multiple=True): + endpoints_info = self.get_lacp_adjacency_endpoints_info(pod_id, node_id) + if endpoints_info is None: + return None + + info = [] + for endpoint_info in endpoints_info: + if interface_id == endpoint_info['interface_id']: + info.append( + endpoint_info + ) + + if allow_multiple: + return info + + if len(info) == 0: + return None + + return info[0] diff --git a/lib/aci/intf/adjacency/lacp/main.py b/lib/aci/intf/adjacency/lacp/main.py new file mode 100644 index 00000000..5c49d10a --- /dev/null +++ b/lib/aci/intf/adjacency/lacp/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.adjacency.lacp.api import InterfaceAdjacencyLacpApi +from lib.aci.intf.adjacency.lacp.info import InterfaceAdjacencyLacpInfo + + +class InterfaceAdjacencyLacp(InterfaceAdjacencyLacpApi, InterfaceAdjacencyLacpInfo): + def __init__(self): + InterfaceAdjacencyLacpApi.__init__(self) + InterfaceAdjacencyLacpInfo.__init__(self) diff --git a/lib/aci/intf/adjacency/lldp/__init__.py b/lib/aci/intf/adjacency/lldp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/adjacency/lldp/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/adjacency/lldp/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8e1b29d2634256b1729b79f879b880aa708a71d GIT binary patch literal 160 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w+*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCNU)|F*!9axiTgvC#4`JK0Y%q dvm`!Vub}c4hfQvNN@-529mw!vCLqDW005B*CZhlV literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/lldp/__pycache__/api.cpython-310.pyc b/lib/aci/intf/adjacency/lldp/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbc48a9a18a398be102c0d81059d9613125c73bc GIT binary patch literal 1508 zcmaJ>Piy2h6qjt-<8datX`ovIJ(PtkOzC9kwQQCRX(@p=6c&1zx){aM%qZ*Fj${XB z(44y0euw1POFxjV{T796`<^{BBxScUlHT9n`y*N9?ruzA*kAq>HX`INWF8J5nAb4P zJ}lo8K?HpV^EYoog!hIF{S4%fh6mhhnC5d>B$-e_CZ3?edq*a|@CAdNi2!^Zn?{C{0zN z>NLeX3@$NUKL2R?M;r4D8@L&mdI+{;M7?(lEw%nLq+72$k8bHVLh>I)+cqm%*VqIy93$o(tTU?W}m@!(8RblGo?q5*F~?i@7ur-?ohq`t5%PF0d0x-In(`*EM_JhvHRKqy=%qm%;74%#sK4R`pGmQ{bAi;l)b6uZRi@cotR2U@ZZXX3%dCGLYZ0>vqqUY#4Pxg)bO?t_w;cZ#yxo~&^ut&{;%B-d&XjKKnJwbcr?0aL5CRK$3TVugsj6s zd4!Sf<8V3t_;3EfBRwAm_+DV$Y3kw>PC+y|(t|X;Zg}2lG(H7wc@Ij)$4a+#EUid)!%2OpiK^`c-Stn^yMDWRTvoo_ZyF0&`^=M|M&G3BH|3j^u zWb98G9DY0uKE-R^22o7$oDF%8bK(Vf(G#3~$&{z$Q>Nq-(esplhjoKzuxDLvX9ihb zr8-(q^D@;COl9TXAR&{(&q1)ukfyB173&Gbm3YeF)`jRv<*NW=Urnni)qcu*fodUO z$1W`w2sDV3^fUDUv`99;&Q-Zw3`Pk*6oz<#_ZD75yU$q7B5Vj=_)3@eX5;<&Q4R-K zvovWw_?_th*1I=vUF$!L^Q@m_CK>fr`Y6r&nMw7dRQL1jem_pKepXb2{(+x9`GIUO zx?FDBFp9DwtD=b98Cpu4Z@u~7tG~Q&pOEeT51+KrE2=dDv0xlg{5MtmiaVx&g_8 z^8>llpE=Nxn2`qxTqd(geQ$ac8?wc$X?if!W*)FL7*k+v@&7Z|R=V@Hoy28)Kg+Xfv)4}6V`DP2tnNa-&#zjcik_bqx8l-@O!b1{ z+OS$yw)ro6(=`5Wq^ob@q!*T8Zl@-(E#k=492YDoG|2{8sw~sfknQp-&!`w|P>xiTsb>T)+bTvX z#b`@rgG)c`@_X9Zbb#olx=80=Fjp>^U4E%ILv!7ffk|~g8^(#I!n5u5G|sE_<-%0fOUBv;jlfP1;&EQx8jXv}*uV`;H?Y1baoBcdEv;U} z)YLZYY-S?(jbf#AYK%QWHjOt_+hEiP8c$Bp^);1{ogKzSyq2nHbpJt`R8~GrH;t8U zjtAZqeM6|+?0Irb^^8z^Z6-_k%-5d2QA=|}d3Tz=^xh<_!+-hSmmKxof^Sv%+kx}jBELrA79wAP z3ZXRzT67v{O{3lTl=jqZuQ(Xr{bHA2(~H=>euKz45F4O{XGyAY|FLe%dU;yti=>bb zkkkfVojrIB<0@I#u24FTk4&YrVy!#XplRj^6ztp!j5PP4ogt7mJf_(x8ahW->T#ax zs}$IO6zAjAw&F5!Ldx4A2)^D#{x1;1*t`pJ3K)|@0)eyqRUnKICxJuaLea?PcmSTL zcr3-%N5`P;*q|$S6RM{DhrmW-2ex%EXsHaBj@S_dC;}e9h8uSckg9zE?Ia*X*8{E_ zz=8o}VeKJ}=Qif*0IfXS!AA#psV~;S9ahOY*aPiV@&gb6o=CK465aLfX)2Ew=kHEy zIMVN6HTouq4dSvyy7c=P?B!1{k@hT+kI7^<&hyca(GbljEA!NzINB_Xo!Za0(U)k} zM?_vq*K5br=})kC-&RNre)8{7Qqn?76qnCC5>yBtpdm=!af#dd;Fu&G6ADLj7x2ct zK&?26Y&(jEBL&cb??llCE|o^3L)yi`LFvzrZpv+sdZCselxFuC6*9CsFI=5H@8m08 iiBih$yJB%g{a^g&?cdDyZt z@d^xxbE;MuDo(mjce&hs-<|V*zYA!ezqjI^0DRe`Z5>QT=w*N)KoAWn2??>Wqn(t7 zl)x1TD%=$aR}x8I-Ov@C8}RqOu?KuoA5XJNnk0(lSUezR@$y=WVq7RJp6o78vm}pg zf7={PM(E`sf`pI=2pvI$vx1Ncikxme*gY@C?Y3rPiatRvj}R(&BQNlddsWUR5`go_ z%%{fE)*k07Qx)gNcA{{%lsfqUvybV|<>ZV#Mq060m2u95Tu9ASDa}F}rqvybV#QQe zB`n&UfN8t|OCyy9#nRYA@1d72LYEwn=i%-}f{l(DE{meFD3zSoUCz^7%(absoIlMY zy{ YMQzVzEPw5tuN7a|=P2#+JrpsZf0-Pg8vpl5Wl_KJD(lLr8Fu+DkV??HHZkQFQ|k+QPR+$)Qyy?560E%e7lY>S>IiD z&ndPp0;zfJJC6x(<-_m+_LZl803JXJV&-gLLJ8f|&CQNyXJ&VQzi~1@U$bER_}yLc z+niW@KiixX)LNShGUZP4wuO{{M%?r?f+ar(?|JKWu|n%+zBx0=Mv z_ad1I#ri^~LV=+grPE1>E*D3c>^4}1)h66(+njLw*n+TCPPuzb+7vX8S3q;Q52jjodwU9mKg0&ETt*+he z><2RHgpm%D4i|?)b|Nj*p->$ebvr>Ab)q=yb%I&ij)c6Oq)5D+j*QP(6h|3j9wxLw zP%>V6UAfD%6&oQQ$86yGD!fJEKZBCn>Pl|yS$l+&%+AR(avg329_P73tciuweOtW? zp6{UN3E}Q(adSIXPS&j_^&=;9PH66M?`?}$PHoWq73<)=U5i(LAx9LxHTb$kol zO&zXdf&>uc%D1$@n`_tGP zlh_olt=Fda6Up0tOGLZ$=0w$RlsQ1CH zZlNeCpepElGljqzLuj)S=}g2tO~9@ZmU;yQB_62}8y@eh?om=Fl=wDUZBqN&cm0Of zK-~treP+9;O`h5x<1gTJ|Chtdudg6PCeH?zQ!?dOnB>mCm}38jDPWm0#kqtjHZbMJ z5iJ<=){$ElP93)UJa7gwTEh2*8PP(lCNPJ3CP04gk+my@B4> zCf?po(Z*E4FlT#h(^Sg~Fzy5NA6JV~kPG9hg<5(nZmt86&H?iQW?fKXkQ@po25B~8 zVIqfvSQju>A7WBZeS`&IZ&yte*x!J$ngKDHI2Z;}eFCOtbpp|9i8XZx-Ivk5QSJ&F zDwva_P@OT#jjZ&I zuRN@>51#)gU5@8V>S#5|2J{d38^LzRn5i)ampPQE*BQe@oBX1DJfqK0e2wCK=Y@tu yR!9?^Y4r6ipVXYjmxZ;}q|i>HZqZJPiz&>PMKS)$q=K)oWozsvb*oO^bp8Q1D>Z2V literal 0 HcmV?d00001 diff --git a/lib/aci/intf/adjacency/lldp/api.py b/lib/aci/intf/adjacency/lldp/api.py new file mode 100644 index 00000000..29e2f4da --- /dev/null +++ b/lib/aci/intf/adjacency/lldp/api.py @@ -0,0 +1,72 @@ +class InterfaceAdjacencyLldpApi(): + def __init__(self): + self.adjacency_lldp_mo = {} + + def get_adjacency_lldp_mo(self, pod_id, node_id): + key = '%s.%s' % ( + pod_id, + node_id + ) + if key in self.adjacency_lldp_mo: + return self.adjacency_lldp_mo[key] + + cache = self.get_object_cache( + 'lldpAdjEp', + object_selector=key + ) + if cache is not None: + self.adjacency_lldp_mo[key] = cache + self.log.apic_mo( + 'lldpAdjEp.%s' % (key), + self.adjacency_lldp_mo[key] + ) + return self.adjacency_lldp_mo[key] + + distinguished_name = 'topology/pod-%s/node-%s/sys/lldp/inst' % ( + pod_id, + node_id + ) + + query = 'query-target=subtree&target-subtree-class=lldpAdjEp&rsp-subtree-include=health,fault-count' + managed_objects = self.get_managed_object( + distinguished_name, + query=query + + ) + + if managed_objects is None: + self.log.error( + 'get_adjacency_lldp_mo', + 'API failed' + ) + return None + + self.adjacency_lldp_mo[key] = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['lldpAdjEp']['attributes'] + attributes['healthInst'] = self.get_mo_child_attributes( + 'lldpAdjEp', + managed_object, + 'healthInst' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'lldpAdjEp', + managed_object, + 'faultCounts' + ) + self.adjacency_lldp_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'lldpAdjEp.%s' % (key), + self.adjacency_lldp_mo[key] + ) + + self.set_object_cache( + 'lldpAdjEp', + self.adjacency_lldp_mo[key], + object_selector=key + ) + + return self.adjacency_lldp_mo[key] diff --git a/lib/aci/intf/adjacency/lldp/info.py b/lib/aci/intf/adjacency/lldp/info.py new file mode 100644 index 00000000..5851608c --- /dev/null +++ b/lib/aci/intf/adjacency/lldp/info.py @@ -0,0 +1,134 @@ +from lib import filter_helper +from lib import ip_helper + + +class InterfaceAdjacencyLldpInfo(): + def __init__(self): + self.adjacency_lldp = {} + + def get_lldp_adjacency_endpoint_info(self, managed_object): + keys = [ + 'capability', + 'chassisIdT', + 'chassisIdV', + 'dn', + 'enCap', + 'id', + 'mgmtId', + 'mgmtIp', + 'mgmtPortMac', + 'portDesc', + 'portIdT', + 'portIdV', + 'portVlan', + 'stQual', + 'status', + 'sysDesc', + 'sysName', + 'ttl' + ] + + info = {} + info['__Output'] = {} + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + if info['portVlan'] == 'unspecified': + info['portVlan'] = '' + + # topology/pod-1/node-201/sys/lldp/inst/if-[mgmt0]/adj-1 + info['apic'] = self.apic_name + info['pod_id'] = info['dn'].split('/')[1] + info['node_id'] = info['dn'].split('/')[2] + info['interface_id'] = info['dn'].split('if-[')[1].split(']')[0] + + info['pod_node_name'] = '%s/%s' % ( + info['pod_id'], + self.get_node_name( + info['node_id'].split('-')[1] + ) + ) + + info['portId'] = '' + if info['portIdT'] in ['local', 'if-name']: + info['portId'] = info['portIdV'] + + info['mac'] = '' + if info['portIdT'] == 'mac': + info['mac'] = info['portIdV'] + + if info['portIdT'] != 'mac' and ip_helper.is_mac_address(info['chassisIdV']): + info['mac'] = info['chassisIdV'] + + (info['__Output']['health'], info['health']) = self.get_health_info( + managed_object['healthInst']['cur'] + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + return info + + def match_lldp_adjacency_endpoint(self, endpoint_info, adjacency_filter): + if adjacency_filter is None or len(adjacency_filter) == 0: + return True + + mac_filtering = False + mac_match = False + for rule in adjacency_filter: + key = rule.split(':')[0] + value = ':'.join(rule.split(':')[1:]) + + if key == 'mac': + mac_filtering = True + if ip_helper.is_mac_match(value, endpoint_info['mac']): + mac_match = True + + if mac_filtering and not mac_match: + return False + + for ap_rule in adjacency_filter: + key = ap_rule.split(':')[0] + value = ':'.join(ap_rule.split(':')[1:]) + + if key == 'interface_id': + if not filter_helper.match_string(value, endpoint_info['interface_id']): + return False + + if key == 'device': + if not filter_helper.match_string(value, endpoint_info['sysName']): + return False + + return True + + def get_lldp_adjacency_endpoint(self, pod_id, node_id, adjacency_filter=None, allow_multiple=True): + managed_objects = self.get_adjacency_lldp_mo( + pod_id, + node_id + ) + if managed_objects is None: + return None + + endpoints = [] + for managed_object in managed_objects: + endpoint_info = self.get_lldp_adjacency_endpoint_info( + managed_object + ) + + if not self.match_lldp_adjacency_endpoint(endpoint_info, adjacency_filter): + continue + + endpoints.append( + endpoint_info + ) + + if allow_multiple: + return endpoints + + if len(endpoints) == 0: + return None + + return endpoints[0] diff --git a/lib/aci/intf/adjacency/lldp/main.py b/lib/aci/intf/adjacency/lldp/main.py new file mode 100644 index 00000000..30b86a8e --- /dev/null +++ b/lib/aci/intf/adjacency/lldp/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.adjacency.lldp.api import InterfaceAdjacencyLldpApi +from lib.aci.intf.adjacency.lldp.info import InterfaceAdjacencyLldpInfo + + +class InterfaceAdjacencyLldp(InterfaceAdjacencyLldpApi, InterfaceAdjacencyLldpInfo): + def __init__(self): + InterfaceAdjacencyLldpApi.__init__(self) + InterfaceAdjacencyLldpInfo.__init__(self) diff --git a/lib/aci/intf/adjacency/lldp/output.py b/lib/aci/intf/adjacency/lldp/output.py new file mode 100644 index 00000000..303ddd1c --- /dev/null +++ b/lib/aci/intf/adjacency/lldp/output.py @@ -0,0 +1,117 @@ +from lib import filter_helper +from lib import ip_helper + + +class InterfaceAdjacencyLldpOutput(): + def __init__(self): + pass + + def print_lldp_adjacency_endpoints(self, info, title=False): + if title: + self.my_output.default( + 'LLDP Adjacency [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + for item in info: + item['portDescT'] = filter_helper.get_string_chunks( + item['portDesc'], + 30 + ) + + order = [ + 'pod_node_name', + 'health', + 'faults', + 'interface_id', + 'ttl', + 'sysName', + 'mac', + 'portId', + 'portVlan', + 'portDescT', + 'capability' + ] + + headers = [ + 'Node', + 'Health', + 'Faults', + 'Intf', + 'Hold', + 'Neighbor', + 'MAC', + 'Port', + 'VLAN', + 'Description', + 'Cap' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['portDescT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + row_separator=True, + underline=True, + table=True + ) + + def print_lldp_adjacency_interface_endpoints(self, adjacency, interface, title=False): + if title: + self.my_output.default( + 'LLDP Adjacency - Endpoints [#%s]' % (len(interface)), + underline=True, + before_newline=True + ) + + if len(interface) == 0: + if title: + self.my_output.default('None') + return + + for interface_info in interface: + for adjacency_info in adjacency: + if ip_helper.is_mac_equal(interface_info['mac'], adjacency_info['mac']): + for key in adjacency_info: + interface_info[key] = adjacency_info[key] + + order = [ + 'host', + 'mac', + 'pci', + 'interface', + 'model', + 'pod_node_name', + 'interface_id' + ] + + headers = [ + 'Server', + 'MAC', + 'PCI', + 'Interface', + 'Model', + 'LLDP Node', + 'LLDP Interface ID' + ] + + self.my_output.my_table( + interface, + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) diff --git a/lib/aci/intf/adjacency/main.py b/lib/aci/intf/adjacency/main.py new file mode 100644 index 00000000..96aa1efa --- /dev/null +++ b/lib/aci/intf/adjacency/main.py @@ -0,0 +1,10 @@ +from lib.aci.intf.adjacency.cdp.main import InterfaceAdjacencyCdp +from lib.aci.intf.adjacency.lacp.main import InterfaceAdjacencyLacp +from lib.aci.intf.adjacency.lldp.main import InterfaceAdjacencyLldp + + +class InterfaceAdjacency(InterfaceAdjacencyCdp, InterfaceAdjacencyLacp, InterfaceAdjacencyLldp): + def __init__(self): + InterfaceAdjacencyCdp.__init__(self) + InterfaceAdjacencyLacp.__init__(self) + InterfaceAdjacencyLldp.__init__(self) diff --git a/lib/aci/intf/adjacency/output.py b/lib/aci/intf/adjacency/output.py new file mode 100644 index 00000000..3c4390b2 --- /dev/null +++ b/lib/aci/intf/adjacency/output.py @@ -0,0 +1,6 @@ +from lib.aci.intf.adjacency.lldp.output import InterfaceAdjacencyLldpOutput + + +class InterfaceAdjecencyOutput(InterfaceAdjacencyLldpOutput): + def __init__(self): + InterfaceAdjacencyLldpOutput.__init__(self) diff --git a/lib/aci/intf/cloudsec/__init__.py b/lib/aci/intf/cloudsec/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/cloudsec/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/cloudsec/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67b324f7b544280488c6aea1b2c3c822064a59a7 GIT binary patch literal 154 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w(*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCOId+G^IE-IVL_nGcU6wK3=b& X@)n0pZhlH>PO2Tq*kUFi!NLFlmi8n? literal 0 HcmV?d00001 diff --git a/lib/aci/intf/cloudsec/__pycache__/api.cpython-310.pyc b/lib/aci/intf/cloudsec/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aaa55620c59da02e2b9679df909e2b9b3344ec4c GIT binary patch literal 1492 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 xEO*6~_->2u&|k~+^}eibY8v0DTSy4vM literal 0 HcmV?d00001 diff --git a/lib/aci/intf/cloudsec/__pycache__/main.cpython-310.pyc b/lib/aci/intf/cloudsec/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..846c9651ff38227c303a6be88e10babcd160d7b1 GIT binary patch literal 929 zcmZ`%O>fjN5FO`ZlTEiEq!vNBaNSFeNFan-tpN41mtK$+$qKO}SvbiOXICoX*8Y%k z??dj13Pca{4EQ% zEF75xyofF5la}=Ku@Jh}oe(Y6Z3BXkV1j^c2UeN#JGAtye_k$LWuJ1RvqIaV$)wsS zlWD8kjcPNaKW2HMGhKIOR*>CR6W5Y~*kBu|_`wyreBSyr5smeTU8)Fp)0Ktc;s3jIYphCpXJW`^Vx%xDztI#DW1W>-#$ z$33-2dgH`_X?ycO!kz10IdLu==uBsLZxzc zZ|ue!hVchJj2{*}T!Tv<0r<*b1|#?2x@)c(%v>>QRtWYzM=@d<%-mQb%vduSVdgz! z&0>cbW%fO?M%hcO#9V0EU@J2ZS`OG|SOr=oXw9-YXt~URSq`h?HM55xJIeL_D2X!P$9NKfl3sO6j!Q%5VMs8vBmMKnx=Lz(DK$!iI5dEGT#vKc6 zmN?Cv4FYXz!(gRHI$G9A&2h=2j($0(Yri z4&pey?Q5$qyX&|3j#NhlZ>QVb=j~3m`F&D?cB90>zEEC8=b+RLXNWhp~3QK=TDPQ6` zA`|2%0F*eyBPN{A(~3h$g-}9G2dov7mh!t(!v4|e{nNWpEXS}u`Q})9&b*Bf(;FTR zG*AqXkB=V#^er*pH<{5j#8J(XiM&jPoTYs;=V;5Ez*`%5dk&)jXPpsek)d~xjV|16 zJqxnfcz}$gC=46sLttj#F1Ts3nfvZ8J1dReLh@Z zyl^u}Huwt9Rw2+~40;r!Su1>7(YhX5$DvOu^?Yb`HG+*X^97ENI$4w^J+H2VR3VCZ zA47ZqFer_&?p3tDhJj}VYyinSfe5lxXqt=H(cKmx@`iX5;RM1-09D~Xc7lZYaU?T2 za5S~WDeR%QH+dr7M$f72p5Mo^5xHS`fc7yI;UkFf_$mM;ZozT)spHHQY)7uUraR-z zIJu3OPfdHobCY;~^)40l`){UC%3-?rZbM=R7T*cN%N!u@uH0&&1sN_#Y@y@=g~#Q! zT*#}}=$$IwX`H~h(v6e%88(V{u`Z_(&LGqf-UCo(9BPh?vrQ~v_lF2)5ze7w`DWDO z;Z6wZg(b>~^$NDmBUBOgiP`jWYsCbWli3!GlQ_#>LEB$qy066E-!D+$(X7v?S@CuK z6;k;>sF^0hxR&kt&Yqc0gzC3Egb&(YF*|zz|0#MVE@5S_AZRTamHYzQ_LY2L>JHBr zU+Cn1fsyhuz`^(U1Oi+sUh1Gbd_0F|C@}n>iFY8e+SJd*^)8DJ{J9u&p0>OTxQdGi zg;a}=@lkK9NozcPTLqY#R?*)v!bN}=*e0VWHL_eY8_Tsa{>9=CnC~mk_uDD!#@Md- z{tw+C&U*y@n}~UY&k#OGxQ1{YVMG+&!ruuo{0o3W9z0 zJG75}13!SDBCkI6D+r1+Nlva0b(fu;ot^p3?96Pwy4nXEZ+3qqp#=Czhvgyg@En)h zMxsHp45ln%3|@fdT3mt_UwFi|Jb=)pL~?PmmDq=O4==pR)BYCN z9n#tY-Pp41L=}mo>W7SpB*;%e5iKBXn2yI`vx8xhZ~2R>*4mHuS>f!UwgA+eIQ7 z$0`2=o@9~-teeQKv4F2J{&|B-?lYPjzomcv^v-7ZzsHb`Lyyuqn@o*TbziAzuFH)0 zfl?>sBx`Rh{cU@n2t~O>=wX&Rjr!eDiv`eU1JTIFp}g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6wm*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCN(cPv7op#C$S_oCB7)X6iCIy g$7kkcmc+;F6;$5hu*uC&Da}c>1KCi_1SD7(0D3hj=>Px# literal 0 HcmV?d00001 diff --git a/lib/aci/intf/encapsulated_routed/__pycache__/api.cpython-310.pyc b/lib/aci/intf/encapsulated_routed/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a7538bd8fe470b744498fa7a75b587673450b4a GIT binary patch literal 1642 zcmah}L2uhO6ecA~mQ_3Pdgx$a8-@YdV5~_o>{cX0i)PFYAM$UI{=&s( z^I`D>y15U-k3Iro72@HyisU%}hQt7=WV_*7`!OUa; zXG8nhQC=xM6^Z&GPef_zOjJrfFKQT{mT5u(V%<_g}VNvEVC92fx-JswdzOxIvs zAsW{XhtCVxWJYDv--%{$@SnrO$CFngOD9Qcl42s&xymM~QTklzNtT{WM3PPbZ8~v4 zD_SeOi73;(^1?=(r+Hd&j-(6@Fv zH{>NbCwhQ$;}0QTkRYE8Wb=);WDS#~ruv(PwHEuh?_ENs8~*{y?$nh>Z{!z51~(o8 z87@PxVolJ5vLmB6{<70_0F&rrhZM-JjPX3?dWC(@VRuk_y21s&9oZX_@5#?!FQX=s z-jK-tkSx0mxeS4CB)6{orYpCQ;YzdZG}{}Rfzu3J6ps02r|Di%O3r>+`F>wq;0<=2 zy~~Tg8SUt!<3+Gz_IAuT&c20GdtS+-DOAOFaq?0n6^G)0snCo5?KW61zNm__$cod8 zM`a;*cg&-_kP7EpvxU^A+%@${rIk8JW@#q1%D>!D?k1Tq=0H`ma=!L`XFtu8td{Cv zrbJfF9!^D_Rl7-1=hZ{4&gxVv`P0a=!C9^Jg^iH|cbN9mQ&m9~uI|vgWxt4@K0Eq+ zD$-2J#o(6m-n@X|Y?#iasDzD0Rq6Bu?wlF-@36FSOX(;#mA&V99U?6=>S`=_J3#-d z93~=}DeFVFYzMAL0{6~#alfS+D6I=^KSs^G;4V@8*0T*oS*l#xfq4gV6l=UJHiTcm zQ)xRceh~au>cR%C+t@kbxtJ>*q4oA$PdPQ|7gD1ab&pL>cINj8W#S!0tK2rqX6G1ObO>U=8$z+XDIhLKdVL7?r3~@T;vIl5ikeL=2W=N>i8W_Qt-ai( zW|neHtcn0}j|O_`S?Z}dw}+yCKrcoAfjJfEDc1tMq>bI*n4`Sb16|kN*O~G zJ6g;B3^H0vm-Swp zP`aH?oW^;lW7BeIU7kLE{W<$tpAPEMIZr

Pjw{RKp!9chJL7{|t;S(r>4Y22r6 z#@eBUO6YQ@lP{>I z?ix+q_;}H<3`eK$;un@PzWzMlc>d&bUSrWB@Kav12;#KYHU%Q9%WFBr=jYdGTc4UC6;x6bt<05JB!L6e^Ikw#Il)wKQ z(hH3jCu{ig$r>)HwGnR#zh$iNPwetUdTDNbkW`!(QLjLPc1H9|pqq0$lxJp>>{}BV z?a0LXu3+RUofUAS)bp|$Po;JQo3U5sxK|aIO6|y=axwB%>IcrOwOi+d#;sA3#~)6W*Xj2qM$c${lW|-P<|a?zL)x z-yLzj$@zB5qK^W%CkATofwTAEI#v<*dk=0$A{+58mJyh7h9gNrkz+{4Mc`#fA+E={ zi1MI9G#!sa1gxN#JNeH>VG?*Ero&IdzTgC&V_z+3y%go&rS)2AmPS&O6_%wL-|k80 zmr;^r54P?|Z!Zdyd~Z7yxiqn4>69I^)(hbSDwqiAsD=Qbi65p9w}{hnu=QaA8&&BD zJL6~gN!3y6Dm(mGbi(vuNAl5?wbw1BguJ=1=6tAN2bq`+{6;9xx z^iU)Jc?FJ#)F(RA5jlKjz?KxB_Q=jhIx`Vh zkr5(VnG_)>J+Sa^5j~D|*b^BfM!uDszIf(6Df+c zhS)rj@*ovVq=FNv8sdzvB!d&lIwTL2q`_m%*I3p>JmK1G;XnshyJsIctce(DU&K7{ zuLkX`b-t~#*gK!=*Azf2jNOv9iZs#$C@8>{76BPw#~~?rleU5i{th}?I{yHbTp5IU zcW;)}&Ly?uwGUG<8d6Rgu~jvAwS1?=X@B(~1iW8ch0j*_WtwAy6k7MPIOQr%_@!=< zbBOb8;@VhG#;56UW9EelpqjIGISqMrhmVq|bYfdgdB$D&4ix_pKkz^sL$4vEFXX0cE- zsSoJ&4k&s_S@6pV4S68d{%eKBf2`06m{;mx_OS(uUQjmtRJ(^P=!EAKE~`AY!FRxS z;FZ9#8NaA9_c4v8%(KEjBJVuK^_Zu)HE{hSr)VfVyqH%CpZTngSAXNNf&KdM--Y(r zSQBMt@HS3L)<&rqM%}mqUfHfT zzV$pGnuGLtoLk>WvTm4&cR`ezaX|^VTQ0waD!4?0%U9#nQ#u61qiRKqK6rWjsnB}LaKLZ!)g z2TFKIni^q}%O{0dH^%anb}{T%z0t zu?=rhc)g9hBxcuu=en|C8Cu}r8ec{+$uMV$g{)9ufPX2IoH&f2PX- literal 0 HcmV?d00001 diff --git a/lib/aci/intf/encapsulated_routed/__pycache__/main.cpython-310.pyc b/lib/aci/intf/encapsulated_routed/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26853afdbc0f3a2d19155cdf1da2bfe8947a6320 GIT binary patch literal 1065 zcma)4y^ho{5VrHP$>#Q;p+G_cilbN|rKCUz-Dz3SHCsS~tVouL9m&GUE_SlgAv*3s zpyWk(h_qBlJOMP!IP59~+C5wT^f{UF%zQKJ)6ts&*``WSh{cik{bKR7 zcrT1DO6|&ZA=OryLOW%*$`(eyD@3Ua-LzGqMy=x3_o}FcZt~5Q#re4n$Kjh99ri8y z@$7&K`7X^B$OSn!qE?*u8Rzv{b_V&3^ADXc!yg~SCq04_h-VW3%)nu(DVZhy%W8hY z&Y*%ED#)>d{67`sVxzrk?9owE4RhxuWsi^A3LL;37R_@8};fS57_C9*Tt2_r{6igd|PjQm_1Z{AT9OoA=)L#+wWdIvQNp ze*T^QbV$=);7j>3;N=?JVn4tQjcSxUhWn8|uTgzgYZw8@H(kYyNf0w_o=|OGr-bT{ zwRwZ?qb9W;lX;U4(+aIZ%K}-AI?%E~HbCppsz7Uy4neC*ZCK?!d1NY18E^Xmn}`Fy zE3(K>8J$Toz}s2c&C-CB%)mC@<8TWTfNG$IG*MOCiK-*AIi0RW}ozpzNuEj z6`d!QTx(;X**jT|h?|GREq3jWxU(t5%Kh%>G4cJ}sxE6;Oc{^Dn8~39)=oI{V)g*v z|G>RVvzb7b>374RF(?PS3H9QH!XUrHq`k!aC|#0v+s~p@NIj&o;?qtT&!)Y)z?DXm zF5~bvTz>mD^CM}g_(`YJjl@LkFGQ?2xG`ut&18ipal)tC(xNQ#S7c2EnNRzHG{l-uQEF`GJWUPtTd+Q?)LUi-Er^6 zan@O2oKf^yd)~T^3-=u5NA6CKjj!6$N;tSoR$%k+6!LvPijoJOl6oRrxX)IEJiu8e zS!N#Vbkh|tNTRG03tmB&S}AU}VaZx&#mf^Gw#t+br4g}MRzl&S$7K~psL`ty$8?lt z7`GG95T+61E=c$hgn~XC=_QYLc^IdV|7$E2p7Qk?Nj&9c%xLiifJtoP5FLK@>$+`{ zIx&f<+aRs$=5YSBhp~U-=ltE9D12PbxIE$V8Zf#CE1CfsynflxzzT>gd-)uoZ}6ji zooboJ52)PVmTmDm6V1M!Gq0_0!$u3(cm}lq6YUKqBJUm|$ExtO)GEkL?J4ri#A>*x zKLft?t%7kn9e7e*<6OPjJ6*WKE&F1feIxF~GK*99RRsznjP)nOK5%4+b1WSIr$YxnO z2Z|1&(hpIaG0T>vIj*LTJ< z1|M|d{Mnl-!dcFO-59ZxMLQoo%V6f7kDhIg9cn|8uN^k(n1Ms6NOl7c97y%@;ZiFO z7pK`fRqSwwM9=GQImzEhRel=dbq3)xgtG{r14umzR05S#kzc^>FA**xT*861TVb08 zD*=?i%P3S?cNkk&5l$d%sffGhf-1dGE=AghxdJWRTot#*-`o;^=dX8;{)P>2l*Ho0 z<5w{3|4oje literal 0 HcmV?d00001 diff --git a/lib/aci/intf/encapsulated_routed/__pycache__/summary.cpython-310.pyc b/lib/aci/intf/encapsulated_routed/__pycache__/summary.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5de8075098f6996e4b3ca8956b21cbc5f65cd5ff GIT binary patch literal 1159 zcma(RO>5OaaP}j4>GKszsYq2sikBc1&utN*Ek%$gSiFSDl4keSXkPNVNh&QV2=?lK zXpjB_e}KOtS5N&5g5peGD(R{2l9}1r`JUP2i;F|RHF@$Q-jo18>Cj&S4=?a59wE@6 zSqf7YFa~>|xfbW3#TOoME%(89u22Si)(q49P`x+l%-EP%{dL2jfq-d1b+dL z&LNPRp}|43_A)DtokX$O&EjZQRB2Qi{U)yv?pM=kWKYI1@7X7sTx{c4EF&o41FM;4 zUs(-`Ye2Jnj4`?tW1@XwNu?35^20_T&*zOSOggbx4fqDuL-cEJdn5c9rAZhkMVyD) z9Gf&u3S*Cr4b$WxjN&9rvT_odUYN?ZafZb_(Dm6#<0+M7NvV{BW()GX%ub))p5*$q zUQEedFBb{=+GM{YQNsn)tmc>eOw>X{1$IO!CvYYcsIjVB*fzwX!?MH97Sv(~-rYZQ zYDc@PVAn}%74+a9>7o3bUu@t>{^O(m(c`(~oZm{5HMn4XKGM!AT#Asqdw7qrpp}-w zmMn~^G_R|2R+W}vCV@N4ZTWT_Jr$vxI>q?VY+ml*%N!XC6}@wnZ;&&Iw(Mb4tB zQK}g#HO+OE5%?g2{G()`iWC}{9J7_yOQd1GJT`$-Pk=hSj~ WnysO>Qr_0w>vL*fL54=KEdB!5vLm1X literal 0 HcmV?d00001 diff --git a/lib/aci/intf/encapsulated_routed/api.py b/lib/aci/intf/encapsulated_routed/api.py new file mode 100644 index 00000000..36ccb089 --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/api.py @@ -0,0 +1,80 @@ +class InterfaceEncapsulatedRoutedApi(): + def __init__(self): + self.interface_encap_routed_mo = {} + + def get_interface_encap_routed_mo(self, pod_id, node_id): + key = '%s.%s' % ( + pod_id, + node_id + ) + if key in self.interface_encap_routed_mo: + return self.interface_encap_routed_mo[key] + + cache = self.get_object_cache( + 'l3EncRtdIf', + object_selector=key + ) + if cache is not None: + self.interface_encap_routed_mo[key] = cache + self.log.apic_mo( + 'l3EncRtdIf.%s' % (key), + self.interface_encap_routed_mo[key] + ) + return self.interface_encap_routed_mo[key] + + # https:///api/node/class/topology/pod-1/node-201/l3EncRtdIf.json?rsp-subtree=children&rsp-subtree-class=ethpmEncRtdIf&subscription=yes&order-by=l3EncRtdIf.mplsEnable|asc&page=0&page-size=15&_dc=1683801093405 + + class_name = 'topology/pod-%s/node-%s/l3EncRtdIf' % (pod_id, node_id) + query = 'rsp-subtree=children&rsp-subtree-class=ethpmEncRtdIf&rsp-subtree-include=health,fault-count,required' + managed_objects = self.get_class( + class_name, + query=query, + node_class=True + ) + + if managed_objects is None: + self.log.error( + 'get_interface_encap_routed_mo', + 'API failed' + ) + return None + + self.log.apic_mo( + 'l3EncRtdIf.mo.%s' % (key), + managed_objects + ) + + self.interface_encap_routed_mo[key] = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['l3EncRtdIf']['attributes'] + attributes['ethpmEncRtdIf'] = self.get_mo_child_attributes( + 'l3EncRtdIf', + managed_object, + 'ethpmEncRtdIf' + ) + attributes['healthInst'] = self.get_mo_child_attributes( + 'l3EncRtdIf', + managed_object, + 'healthInst' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'l3EncRtdIf', + managed_object, + 'faultCounts' + ) + self.interface_encap_routed_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'l3EncRtdIf.%s' % (key), + self.interface_encap_routed_mo[key] + ) + + self.set_object_cache( + 'l3EncRtdIf', + self.interface_encap_routed_mo[key], + object_selector=key + ) + + return self.interface_encap_routed_mo[key] diff --git a/lib/aci/intf/encapsulated_routed/audit/__init__.py b/lib/aci/intf/encapsulated_routed/audit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/encapsulated_routed/audit/api.py b/lib/aci/intf/encapsulated_routed/audit/api.py new file mode 100644 index 00000000..9a715a39 --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/audit/api.py @@ -0,0 +1,54 @@ +class InterfaceEncapsulatedRoutedAuditApi(): + def __init__(self): + self.interface_encap_routed_audit_mo = {} + + def get_interface_encap_routed_audit_mo(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_encap_routed_audit_mo: + return self.interface_encap_routed_audit_mo[key] + + cache = self.get_object_cache( + 'l3EncRtdIf.audit', + object_selector=key + ) + if cache is not None: + self.interface_encap_routed_audit_mo[key] = cache + self.log.apic_mo( + 'l3EncRtdIf.audit.%s' % (key), + self.interface_encap_routed_audit_mo[key] + ) + return self.interface_encap_routed_audit_mo[key] + + class_name = 'topology/pod-%s/node-%s/l3EncRtdIf' % (pod_id, node_id) + query = 'rsp-subtree-include=audit-logs,no-scoped,subtree&order-by=aaaModLR.created|desc&page=0&page-size=%s' % (self.api_audit_limit) + managed_objects = self.get_class( + class_name, + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_interface_encap_routed_audit_mo', + 'API failed' + ) + return None + + self.interface_encap_routed_audit_mo[key] = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['aaaModLR']['attributes'] + self.interface_encap_routed_audit_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'l3EncRtdIf.audit.%s' % (key), + self.interface_encap_routed_audit_mo[key] + ) + + self.set_object_cache( + 'l3EncRtdIf.audit', + self.interface_encap_routed_audit_mo[key], + object_selector=key + ) + + return self.interface_encap_routed_audit_mo[key] diff --git a/lib/aci/intf/encapsulated_routed/audit/info.py b/lib/aci/intf/encapsulated_routed/audit/info.py new file mode 100644 index 00000000..12cc1306 --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/audit/info.py @@ -0,0 +1,104 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class InterfaceEncapsulatedRoutedAuditInfo(): + def __init__(self): + self.interface_encap_routed_audit = {} + + def get_interface_encap_routed_audit_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['interfaceId'] = None + if '/encrtd-[' in info['affected']: + info['interfaceId'] = info['affected'].split('/encrtd-[')[1].split(']')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_interface_encap_routed_audit(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_encap_routed_audit: + return self.interface_encap_routed_audit[key] + + managed_objects = self.get_interface_encap_routed_audit_mo( + pod_id, + node_id + ) + if managed_objects is None: + return None + + self.interface_encap_routed_audit[key] = [] + for managed_object in managed_objects: + audit_info = self.get_interface_encap_routed_audit_info( + managed_object + ) + self.interface_encap_routed_audit[key].append( + audit_info + ) + + self.log.apic_mo( + 'l3EncRtdIf.auditRecord.info.%s' % (key), + self.interface_encap_routed_audit[key] + ) + + return self.interface_encap_routed_audit[key] + + def get_interface_encap_routed_id_audit(self, pod_id, node_id, interface_id, audit_filter=None): + audits = [] + + all_audits = self.get_interface_encap_routed_audit( + pod_id, + node_id + ) + if all_audits is None: + return audits + + for audit_info in all_audits: + if audit_info['interfaceId'] is not None: + if audit_info['interfaceId'] == interface_id: + if not self.match_system_fault(audit_info, audit_filter): + continue + + audits.append( + audit_info + ) + + return audits diff --git a/lib/aci/intf/encapsulated_routed/audit/main.py b/lib/aci/intf/encapsulated_routed/audit/main.py new file mode 100644 index 00000000..2064f430 --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/audit/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.encapsulated_routed.audit.api import InterfaceEncapsulatedRoutedAuditApi +from lib.aci.intf.encapsulated_routed.audit.info import InterfaceEncapsulatedRoutedAuditInfo + + +class InterfaceEncapsulatedRoutedAudit(InterfaceEncapsulatedRoutedAuditApi, InterfaceEncapsulatedRoutedAuditInfo): + def __init__(self): + InterfaceEncapsulatedRoutedAuditApi.__init__(self) + InterfaceEncapsulatedRoutedAuditInfo.__init__(self) diff --git a/lib/aci/intf/encapsulated_routed/event/__init__.py b/lib/aci/intf/encapsulated_routed/event/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/encapsulated_routed/event/api.py b/lib/aci/intf/encapsulated_routed/event/api.py new file mode 100644 index 00000000..1a5ffba0 --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/event/api.py @@ -0,0 +1,54 @@ +class InterfaceEncapsulatedRoutedEventApi(): + def __init__(self): + self.interface_encap_routed_event_mo = {} + + def get_interface_encap_routed_event_mo(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_encap_routed_event_mo: + return self.interface_encap_routed_event_mo[key] + + cache = self.get_object_cache( + 'l3EncRtdIf.eventLog', + object_selector=key + ) + if cache is not None: + self.interface_encap_routed_event_mo[key] = cache + self.log.apic_mo( + 'l3EncRtdIf.eventLog.%s' % (key), + self.interface_encap_routed_event_mo[key] + ) + return self.interface_encap_routed_event_mo[key] + + class_name = 'topology/pod-%s/node-%s/l3EncRtdIf' % (pod_id, node_id) + query = 'rsp-subtree-include=event-logs,no-scoped,subtree&order-by=eventRecord.created|desc&page=0&page-size=%s' % (self.api_event_limit) + managed_objects = self.get_class( + class_name, + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_interface_encap_routed_event_mo', + 'API failed' + ) + return None + + self.interface_encap_routed_event_mo[key] = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['eventRecord']['attributes'] + self.interface_encap_routed_event_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'l3EncRtdIf.eventLog.%s' % (key), + self.interface_encap_routed_event_mo[key] + ) + + self.set_object_cache( + 'l3EncRtdIf.eventLog', + self.interface_encap_routed_event_mo[key], + object_selector=key + ) + + return self.interface_encap_routed_event_mo[key] diff --git a/lib/aci/intf/encapsulated_routed/event/info.py b/lib/aci/intf/encapsulated_routed/event/info.py new file mode 100644 index 00000000..b2b81d26 --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/event/info.py @@ -0,0 +1,114 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class InterfaceEncapsulatedRoutedEventInfo(): + def __init__(self): + self.interface_encap_routed_event = {} + + def get_interface_encap_routed_event_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['pod_node_name'] = '%s/%s' % ( + info['dn'].split('/')[1], + self.get_node_name( + info['dn'].split('/')[2].split('-')[1] + ) + ) + + # "affected": "topology/pod-1/node-2208/sys/inst-overlay-1/encrtd-[eth1/36.7]" + info['interfaceId'] = None + if '/encrtd-[' in info['affected']: + info['interfaceId'] = info['affected'].split('/encrtd-[')[1].split(']')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_interface_encap_routed_event(self, pod_id, node_id, deduplicate=True): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_encap_routed_event: + return self.interface_encap_routed_event[key] + + managed_objects = self.get_interface_encap_routed_event_mo(pod_id, node_id) + if managed_objects is None: + return None + + self.interface_encap_routed_event[key] = [] + transaction_ids = [] + for managed_object in managed_objects: + event_info = self.get_interface_encap_routed_event_info( + managed_object + ) + if not deduplicate or event_info['txId'] not in transaction_ids: + self.interface_encap_routed_event[key].append( + event_info + ) + transaction_ids.append( + event_info['txId'] + ) + + self.log.apic_mo( + 'l3EncRtdIf.eventLog.info.%s' % (key), + self.interface_encap_routed_event[key] + ) + + return self.interface_encap_routed_event[key] + + def get_interface_encap_routed_id_event(self, pod_id, node_id, interface_id, event_filter=None): + events = [] + + all_events = self.get_interface_encap_routed_event( + pod_id, + node_id + ) + if all_events is None: + return events + + for event_info in all_events: + if event_info['interfaceId'] is not None: + if event_info['interfaceId'] == interface_id: + if not self.match_system_fault(event_info, event_filter): + continue + + events.append( + event_info + ) + + return events diff --git a/lib/aci/intf/encapsulated_routed/event/main.py b/lib/aci/intf/encapsulated_routed/event/main.py new file mode 100644 index 00000000..827d3e6e --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/event/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.encapsulated_routed.event.api import InterfaceEncapsulatedRoutedEventApi +from lib.aci.intf.encapsulated_routed.event.info import InterfaceEncapsulatedRoutedEventInfo + + +class InterfaceEncapsulatedRoutedEvent(InterfaceEncapsulatedRoutedEventApi, InterfaceEncapsulatedRoutedEventInfo): + def __init__(self): + InterfaceEncapsulatedRoutedEventApi.__init__(self) + InterfaceEncapsulatedRoutedEventInfo.__init__(self) diff --git a/lib/aci/intf/encapsulated_routed/fault/__init__.py b/lib/aci/intf/encapsulated_routed/fault/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/encapsulated_routed/fault/api.py b/lib/aci/intf/encapsulated_routed/fault/api.py new file mode 100644 index 00000000..bcbd65f5 --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/fault/api.py @@ -0,0 +1,124 @@ +class InterfaceEncapsulatedRoutedFaultApi(): + def __init__(self): + self.interface_encap_routed_fault_mo = {} + self.interface_encap_routed_fault_record_mo = {} + + def get_interface_encap_routed_fault_mo(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_encap_routed_fault_mo: + return self.interface_encap_routed_fault_mo[key] + + cache = self.get_object_cache( + 'l3EncRtdIf.fault', + object_selector=key + ) + if cache is not None: + self.interface_encap_routed_fault_mo[key] = cache + self.log.apic_mo( + 'l3EncRtdIf.fault.%s' % (key), + self.interface_encap_routed_fault_mo[key] + ) + return self.interface_encap_routed_fault_mo[key] + + class_name = 'topology/pod-%s/node-%s/l3EncRtdIf' % (pod_id, node_id) + query = 'rsp-subtree-include=faults,no-scoped,subtree' + managed_objects = self.get_class( + class_name, + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_interface_encap_routed_fault_mo', + 'API failed' + ) + return None + + self.interface_encap_routed_fault_mo[key] = [] + for managed_object in managed_objects['imdata']: + if 'faultInst' in managed_object: + attributes = managed_object['faultInst']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = True + + self.interface_encap_routed_fault_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'l3EncRtdIf.fault.%s' % (key), + self.interface_encap_routed_fault_mo[key] + ) + + self.set_object_cache( + 'l3EncRtdIf.fault', + self.interface_encap_routed_fault_mo[key], + object_selector=key + ) + + return self.interface_encap_routed_fault_mo[key] + + def get_interface_encap_routed_fault_record_mo(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_encap_routed_fault_record_mo: + return self.interface_encap_routed_fault_record_mo[key] + + cache = self.get_object_cache( + 'l3EncRtdIf.faultRecord', + object_selector=key + ) + if cache is not None: + self.interface_encap_routed_fault_record_mo[key] = cache + self.log.apic_mo( + 'l3EncRtdIf.faultRecord.%s' % (key), + self.interface_encap_routed_fault_record_mo[key] + ) + return self.interface_encap_routed_fault_record_mo[key] + + class_name = 'topology/pod-%s/node-%s/l3EncRtdIf' % (pod_id, node_id) + query = 'rsp-subtree-include=fault-records,no-scoped,subtree&order-by=faultRecord.created|desc&page=0&page-size=%s' % (self.api_fault_limit) + managed_objects = self.get_class( + class_name, + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_interface_encap_routed_fault_record_mo', + 'API failed' + ) + return None + + self.interface_encap_routed_fault_record_mo[key] = [] + for managed_object in managed_objects['imdata']: + if 'faultRecord' in managed_object: + attributes = managed_object['faultRecord']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = True + + self.interface_encap_routed_fault_record_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'l3EncRtdIf.faultRecord.%s' % (key), + self.interface_encap_routed_fault_record_mo[key] + ) + + self.set_object_cache( + 'l3EncRtdIf.faultRecord', + self.interface_encap_routed_fault_record_mo[key], + object_selector=key + ) + + return self.interface_encap_routed_fault_record_mo[key] diff --git a/lib/aci/intf/encapsulated_routed/fault/info.py b/lib/aci/intf/encapsulated_routed/fault/info.py new file mode 100644 index 00000000..0f1c3bf3 --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/fault/info.py @@ -0,0 +1,149 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class InterfaceEncapsulatedRoutedFaultInfo(): + def __init__(self): + self.interface_encap_routed_fault = {} + self.interface_encap_routed_fault_record = {} + + def get_interface_encap_routed_fault_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['pod_node_name'] = '%s/%s' % ( + info['dn'].split('/')[1], + self.get_node_name( + info['dn'].split('/')[2].split('-')[1] + ) + ) + + # "affected": "topology/pod-1/node-2208/sys/inst-overlay-1/encrtd-[eth1/36.7]" + info['interfaceId'] = None + + if not managed_object['delegated']: + if 'affected' in info: + if '/encrtd-[' in info['affected']: + info['interfaceId'] = info['affected'].split('/encrtd-[')[1].split(']')[0] + + # "dn": "topology/pod-1/node-2208/sys/inst-overlay-1/encrtd-[eth1/36.7]" + if info['interfaceId'] is None: + if '/encrtd-[' in info['dn']: + info['interfaceId'] = info['dn'].split('/encrtd-[')[1].split(']')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_interface_encap_routed_fault(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_encap_routed_fault: + return self.interface_encap_routed_fault[key] + + managed_objects = self.get_interface_encap_routed_fault_mo(pod_id, node_id) + if managed_objects is None: + return None + + self.interface_encap_routed_fault[key] = [] + for managed_object in managed_objects: + fault_info = self.get_interface_encap_routed_fault_info( + managed_object + ) + self.interface_encap_routed_fault[key].append( + fault_info + ) + + self.log.apic_mo( + 'l3EncRtdIf.fault.info.%s' % (key), + self.interface_encap_routed_fault[key] + ) + + return self.interface_encap_routed_fault[key] + + def get_interface_encap_routed_fault_record(self, pod_id, node_id, deduplicate=True): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_encap_routed_fault_record: + return self.interface_encap_routed_fault_record[key] + + managed_objects = self.get_interface_encap_routed_fault_record_mo(pod_id, node_id) + if managed_objects is None: + return None + + self.interface_encap_routed_fault_record[key] = [] + fault_ids = [] + + for managed_object in managed_objects: + fault_info = self.get_interface_encap_routed_fault_info( + managed_object + ) + if not deduplicate or fault_info['id'] not in fault_ids: + self.interface_encap_routed_fault_record[key].append( + fault_info + ) + fault_ids.append( + fault_info['id'] + ) + + self.log.apic_mo( + 'l3EncRtdIf.faultRecord.info.%s' % (key), + self.interface_encap_routed_fault_record[key] + ) + + return self.interface_encap_routed_fault_record[key] + + def get_interface_encap_routed_id_fault(self, pod_id, node_id, interface_id, fault_object, fault_filter=None): + faults = [] + + if fault_object == 'faultInst': + all_faults = self.get_interface_encap_routed_fault(pod_id, node_id) + if all_faults is None: + return faults + + fault_filter = self.remove_system_fault_timestamp_filter( + fault_filter + ) + + if fault_object == 'faultRecord': + all_faults = self.get_interface_encap_routed_fault_record(pod_id, node_id) + if all_faults is None: + return faults + + for fault_info in all_faults: + if fault_info['interfaceId'] is not None: + if fault_info['interfaceId'] == interface_id: + if not self.match_system_fault(fault_info, fault_filter, exclude_cleared=False): + continue + + faults.append( + fault_info + ) + + return faults diff --git a/lib/aci/intf/encapsulated_routed/fault/main.py b/lib/aci/intf/encapsulated_routed/fault/main.py new file mode 100644 index 00000000..7033e5e2 --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/fault/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.encapsulated_routed.fault.api import InterfaceEncapsulatedRoutedFaultApi +from lib.aci.intf.encapsulated_routed.fault.info import InterfaceEncapsulatedRoutedFaultInfo + + +class InterfaceEncapsulatedRoutedFault(InterfaceEncapsulatedRoutedFaultApi, InterfaceEncapsulatedRoutedFaultInfo): + def __init__(self): + InterfaceEncapsulatedRoutedFaultApi.__init__(self) + InterfaceEncapsulatedRoutedFaultInfo.__init__(self) diff --git a/lib/aci/intf/encapsulated_routed/info.py b/lib/aci/intf/encapsulated_routed/info.py new file mode 100644 index 00000000..67cac5f4 --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/info.py @@ -0,0 +1,291 @@ +from lib import filter_helper + + +class InterfaceEncapsulatedRoutedInfo(): + def __init__(self): + self.interface_encap_routed = {} + + def get_interface_encap_routed_summary(self, pod_id, node_id): + ports = self.get_interfaces_encap_routed( + pod_id, + node_id + ) + + if ports is None: + return None + + summary = {} + summary['__Output'] = {} + summary['portUp'] = 0 + summary['portDown'] = 0 + summary['portCount'] = 0 + + for port in ports: + if port['up']: + summary['portUp'] = summary['portUp'] + 1 + + if not port['up']: + summary['portDown'] = summary['portDown'] + 1 + + summary['portCount'] = summary['portUp'] + summary['portDown'] + + (summary['portSummary'], summary['__Output']['portSummary']) = self.get_interface_summary_output( + summary['portUp'], + summary['portDown'], + summary['portCount'] + ) + + return summary + + def get_interface_encap_routed_count(self, pod_id, node_id): + interfaces = self.get_interfaces_encap_routed(pod_id, node_id) + return len(interfaces) + + def get_interface_encap_routed_info(self, managed_object): + keys = [ + 'MultiPodDirect', + 'adminSt', + 'delay', + 'dn', + 'encap', + 'ethpmCfgFailedBmp', + 'ethpmCfgFailedTs', + 'ethpmCfgState', + 'id', + 'mplsEnable', + 'mplsMtu', + 'mtu', + 'mtuInherit', + 'pcTag', + 'qosPrio', + 'routerMac', + 'rtdOutDefDn', + 'serviceEnabled' + ] + + info = {} + info['__Output'] = {} + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + # Dn format + # topology/pod-1/node-201/sys/inst-overlay-1/encrtd-[eth1/108.7] + info['podId'] = info['dn'].split('/')[1].split('-')[1] + info['nodeId'] = info['dn'].split('/')[2].split('-')[1] + + info['apic'] = self.apic_name + info['pod_node_name'] = 'pod-%s/%s' % ( + info['podId'], + self.get_node_name( + info['nodeId'] + ) + ) + + info['__Output']['id'] = 'Blue' + + if info['adminSt'] == 'up': + info['__Output']['adminSt'] = 'Green' + else: + info['__Output']['adminSt'] = 'Red' + + info['state'] = None + if managed_object['ethpmEncRtdIf'] is not None: + info['state'] = {} + + keys = [ + 'currErrIndex', + 'fsmState', + 'hwBdId', + 'hwResourceId', + 'iod', + 'lastErrors', + 'operBitset', + 'operMtu', + 'operSt', + 'operStQual', + 'siCfgFlags' + ] + + for key in keys: + info['state'][key] = None + if key in managed_object['ethpmEncRtdIf']: + info['state'][key] = managed_object['ethpmEncRtdIf'][key] + + if info['state']['operSt'] == 'up': + info['__Output']['state.operSt'] = 'Green' + if info['state']['operStQual'] == 'none': + info['state']['operStQual'] = '' + else: + info['__Output']['state.operSt'] = 'Red' + + info['donorIf'] = '' + info['__Output']['donorIf'] = 'Yellow' + + info['up'] = False + if info['adminSt'] == 'up' and info['state']['operSt'] == 'up': + info['up'] = True + + (info['__Output']['health'], info['health']) = self.get_health_info( + managed_object['healthInst']['cur'] + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_interfaces_encap_routed_info(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_encap_routed: + return self.interface_encap_routed[key] + + interfaces_mo = self.get_interface_encap_routed_mo(pod_id, node_id) + if interfaces_mo is None: + return None + + self.interface_encap_routed[key] = [] + for interface_mo in interfaces_mo: + self.interface_encap_routed[key].append( + self.get_interface_encap_routed_info( + interface_mo + ) + ) + + self.log.apic_mo( + 'l3EncRtdIf.info.%s' % (key), + self.interface_encap_routed[key] + ) + + return self.interface_encap_routed[key] + + def match_interface_encap_routed(self, interface_info, interface_filter): + if interface_filter is None or len(interface_filter) == 0: + return True + + for ap_rule in interface_filter: + key = ap_rule.split(':')[0] + value = ':'.join(ap_rule.split(':')[1:]) + + if key == 'id': + if not filter_helper.match_string(value, interface_info['id']): + return False + + if key == 'admin': + if value != 'any': + if not filter_helper.match_string(value, interface_info['adminSt']): + return False + + if key == 'oper': + if value != 'any': + if not filter_helper.match_string(value, interface_info['state']['operSt']): + return False + + if key == 'fault': + if value == 'any': + if not interface_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_interface_encap_routed', + 'Unsupported fault filtering value: %s' % (value) + ) + + return True + + def get_interfaces_encap_routed( + self, + pod_id, + node_id, + interface_filter=None, + fault_info=False, + hfault_info=False, + event_info=False, + audit_info=False, + hfault_filter=None, + event_filter=None, + audit_filter=None + ): + all_interfaces = self.get_interfaces_encap_routed_info(pod_id, node_id) + if all_interfaces is None: + return None + + interfaces = [] + + ipv4_addresses_info = self.get_node_interface_ipv4( + pod_id, + node_id + ) + + for interface_info in all_interfaces: + if not self.match_interface_encap_routed(interface_info, interface_filter): + continue + + interface_search_pattern = '%s' % (interface_info['id']) + for item in ipv4_addresses_info: + if interface_search_pattern in item['id']: + if item['donorIf'] != 'unspecified': + interface_info['donorIf'] = item['donorIf'] + + if fault_info: + interface_info['faultInst'] = self.get_interface_encap_routed_id_fault( + pod_id, + node_id, + interface_info['id'], + 'faultInst' + ) + + if hfault_info: + interface_info['faultRecord'] = self.get_interface_encap_routed_id_fault( + pod_id, + node_id, + interface_info['id'], + 'faultRecord', + fault_filter=hfault_filter + ) + + if event_info: + interface_info['eventLog'] = self.get_interface_encap_routed_id_event( + pod_id, + node_id, + interface_info['id'], + event_filter=event_filter + ) + + if audit_info: + interface_info['auditLog'] = self.get_interface_encap_routed_id_audit( + pod_id, + node_id, + interface_info['id'], + audit_filter=audit_filter + ) + + interfaces.append( + interface_info + ) + + interfaces = sorted( + interfaces, + key=lambda i: i['id'] + ) + + return interfaces + + def get_interface_encap_routed(self, pod_id, node_id, port_id): + interfaces = self.get_interfaces_encap_routed( + pod_id, + node_id, + interface_filter=['id:%s' % (port_id)] + ) + + if interfaces is None or len(interfaces) != 1: + return None + + return interfaces[0] diff --git a/lib/aci/intf/encapsulated_routed/main.py b/lib/aci/intf/encapsulated_routed/main.py new file mode 100644 index 00000000..3d0de04e --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/main.py @@ -0,0 +1,20 @@ +from lib.aci.intf.encapsulated_routed.api import InterfaceEncapsulatedRoutedApi +from lib.aci.intf.encapsulated_routed.info import InterfaceEncapsulatedRoutedInfo +from lib.aci.intf.encapsulated_routed.audit.main import InterfaceEncapsulatedRoutedAudit +from lib.aci.intf.encapsulated_routed.event.main import InterfaceEncapsulatedRoutedEvent +from lib.aci.intf.encapsulated_routed.fault.main import InterfaceEncapsulatedRoutedFault + + +class InterfaceEncapsulatedRouted( + InterfaceEncapsulatedRoutedApi, + InterfaceEncapsulatedRoutedInfo, + InterfaceEncapsulatedRoutedAudit, + InterfaceEncapsulatedRoutedEvent, + InterfaceEncapsulatedRoutedFault + ): + def __init__(self): + InterfaceEncapsulatedRoutedApi.__init__(self) + InterfaceEncapsulatedRoutedInfo.__init__(self) + InterfaceEncapsulatedRoutedAudit.__init__(self) + InterfaceEncapsulatedRoutedEvent.__init__(self) + InterfaceEncapsulatedRoutedFault.__init__(self) diff --git a/lib/aci/intf/encapsulated_routed/output.py b/lib/aci/intf/encapsulated_routed/output.py new file mode 100644 index 00000000..f5434e44 --- /dev/null +++ b/lib/aci/intf/encapsulated_routed/output.py @@ -0,0 +1,281 @@ +class InterfaceEncapsulatedRoutedOutput(): + def __init__(self): + pass + + def print_interfaces_encap_routed_state(self, info, title=False): + if title: + self.my_output.default( + 'Encapsulated Routed Interface - State [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [] + if self.is_apic: + order = ['apic'] + + order = order + [ + 'pod_node_name', + 'health', + 'faults', + 'id', + 'adminSt', + 'state.operSt', + 'state.operStQual', + 'encap', + 'mplsEnable', + 'state.operMtu', + 'donorIf', + 'delay', + 'routerMac' + ] + + headers = [] + if self.is_apic: + headers = ['Apic'] + + headers = headers + [ + 'Node', + 'Health', + 'Faults', + 'Interface', + 'Admin', + 'Oper', + 'Reason', + 'Encap', + 'SR-MPLS', + 'MTU', + 'IP Unnumbered Intf', + 'Delay', + 'Router MAC' + ] + + self.my_output.my_table( + info, + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_interface_encap_routed_event_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Interface Encapsulated Routed - Event Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Interface Encapsulated Routed - Event Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'pod_node_name', + 'interfaceId', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Node', + 'Interface', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) + + def print_interface_encap_routed_fault_inst(self, info, title=False): + if title: + self.my_output.default( + 'Interface Encapsulated Routed - Faults [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'pod_node_name', + 'interfaceId', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Node', + 'Interface', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_interface_encap_routed_fault_record(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Interface Encapsulated Routed - Fault Records [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Interface Encapsulated Routed - Fault Records last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'pod_node_name', + 'interfaceId', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Node', + 'Interface', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_interface_encap_routed_audit_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Interface Encapsulated Routed - Audit Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Interface Encapsulated Routed - Audit Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'pod_node_name', + 'interfaceId', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Node', + 'Interface', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/intf/fault_counts/__init__.py b/lib/aci/intf/fault_counts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/fault_counts/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/fault_counts/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..561083ddf11e0f08ce39226ad9e6745f71b0e22a GIT binary patch literal 158 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w!*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCM~fvrzAc(zcjC;I3_+mGcU6w bK3=b&@)n0pZhlH>PO2Tq=wc=y!NLFlL=h$q literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fault_counts/__pycache__/api.cpython-310.pyc b/lib/aci/intf/fault_counts/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..068a0b93540cfd76198d6a3fb9c9cc8d9a23cac3 GIT binary patch literal 1382 zcmaJ>Pfy!06t@#64WSIy1E|v`_0mH%LA6P{OlSfjZ9gh6{f-VUfM!I11HaZFYoWqeonfu;1d`>zMb;35+OfPm>o6<8$h}O z(>uZmr>8()trp?dE@{{?e7`j;kT!tyQ?qx!? zqgcF+21&M+4tkm1?8}&f?{pxKLAQW3Rx3$PLMR17(47V~RXL3kwlPc?7jeRF3QDF$ z(*8~q1IOR%Td#woD3L)db({uV9E&87TBu{8f<*2IQ7i+9)(&O^1yNtF^@qj_L)nvA z7-BUVC!daL_dr;i8pjS8PRATDC>K~fK*niKb1P?UdzqX#xs#Jaa!k}?Tyv)i7=eS$ z%N=f?StoApax$RmW$unG)=_Vr!?xzmGV+Djg+;IVUBaCrhYeX6WGUt3oaLnpdgA3C zL?h~b5yRmwFQF&yENHwc;d4i}+Pl{JGunC3mVp+49#tpV9<0U%6qEW2H1=$bjm4dj zSJ!LB+bXr88K4#5{1(&wLlI{o93w2L8u=3)n2w%jX+KTU&al}}`D$G^dnp&V>Y;Ad z_3B<-e`-$b&9jck-~cBLcehnW{^p16T04@7;Kt9=EJ})YH1x%2kz_^~U-%GM44#BxDGFXmXVLaa;Q9lg5mdOdiUI}HbKD`E;md*%I|VfZ6n_+|K#M;fB#mYs@o3prD8oOeSpVl_y!COeH-#r2e1-f2^dn{x literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fault_counts/__pycache__/info.cpython-310.pyc b/lib/aci/intf/fault_counts/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ad4e5f0988c04e8b7f2f6dba7ab5ea3d5f65e9c GIT binary patch literal 1221 zcmbVLQE$^Q5VjMi%c{1Z!Vp6OgoKdtvX{LeG|*5d&|dn|w-97yu~T_Xlg>$pHl(QY>h(6=8S#4aP`I~upi1>+F7?1Fet z1QGNK__Grd;S5ONCg5Kq2dqQj@;L}eLMlk;2r8T_61u__3|1yQ(SX$xTX2SN9vB9&KZlwwJq*qY!;i@nK(@i|wysyN5%lqeXze7330 zy+w3_kqh!b!8UEbFF+Xra$o7pQDo-U&Jp?O&sa@swo7WaW(VZVuU){y=?8a0mS|Ol z+bG{ABPqh2r5fkrNM>>vSKw}=du6)g_%!rE%#-dfw6&ZTc$X>08>_s~Vbd=2vKk+M&$3e7SL0|2Qnc(-zbK1$jBcntUNJGY2Pj z&1PQh2{I+RgKrV`Xzg9o0nzvl0>?c5ORaIC+ZffDW73!uf-7OR@dI;#s;7ZYh( zD_aS@4XJ;^^k{RnClFrxAnsDYh&G+e{r|wHA2jf1v`;1*P0bw*UYD literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fault_counts/__pycache__/main.cpython-310.pyc b/lib/aci/intf/fault_counts/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce9830ba80e4a664e78775c93c0939282e2fbcb8 GIT binary patch literal 647 zcmZ`$u};G<5Ix5!L{-aFL6@>;$p;`nMU_BZx*#zGOIC;-$-+sBom2vKqaOkzzm$Q6 ziC&|fsiyO^P-X_OHz5A)Vi9Lby3-?rNY*DUu#}uW$I?T z=3y~Kw<8P^Vj>{+1QFf_Vk#)&`ORqGwiI>!nae5q4Bd_~RPaXD@Q#WqZeeELAownUE`~nX=NXq+wb;uq0JX6;;ME zC!VLRdX^`uh?dXB9rys<`WX7;h`dbpiHLR_7AO-56-h2RZ~C0)rKq*b2b@3EiQabF zy)D5`2oSg`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w<*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCM`K8K0Y%qvm`!Vub}c4hfQvN RN@-529mv39CLqDW005)nA+`Vj literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fc/__pycache__/api.cpython-310.pyc b/lib/aci/intf/fc/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..385ffd2bb2fbdc387205c40c80c2f8a66225a16c GIT binary patch literal 1502 zcmaJ>Uu)b(5Z~3m)5$v9q>y0fLkT!=H0R(v20J8maWS+eB+!TJ6`|W*-6_#Y@~&ih zhwiC)Y`%m2m@m=~vCyY}i$c=QtnQq12wkzev$ON(H?yNDdcA6TQ{92(2f_)bZ(;s!4GFhik-p7VM_Cr?Ii;w&ApRIy^j#ihtbsS@&1$WfM#M=?uBU?UkNY!sL2K{?lc6s37uMG<;d zxCC@@?>5SVwG6}LtOp|WU>dkb0G`u^HdbQYB}==p8}gc561j_eWA8x_KtWO(NXa{E z=`;=}HI;{r(@GrSy>$iYYV5m68?9@L-q5cIcW*qn+*^7eN@eWw*G##)=0VPxE`I)>7{J>)Dw6|yGqV2f`NG{-2m5LmWQV8h#dNOD5`6Pw{93Ro zf_H|kkc-}@Ymi>tuZptBipl&@S@6NWdXyJj;QmQ$F}bLPoDZs4PDFLgrfJ5d$RD)l zfvU%q6k@=#SgGUe@MU$%zLO_Ko;;AMytz(umepJwPeq(n(}zi1XVriebzVJ`;-XHa z-~iV(uJl*n2TR_yg6A*JzDeRV6I^@gjK@{1gSe_>I<70BbkLeU%T=YfjQtZd zuZH0!s9`9oX*v6G{IcSZp{~T5)w}3$l`0mqsn9kgMR%ae@lVlRyf+bQS4de%eGfUa zA~NZSHeh&hS&E$NUG4c{~#m+6&P;vpA0@ zg0Ijiy?vV@w?NALzwP4Uu?q_l>Ni*{il6r}a02RBE$svC!RJ#4_@U)cXC>vko}rwN zjuTiR4Ocf7^*=anYipAVfam?|Ijt>}@X_0cz+2q^tPOnOQP2A>wh#2+eAD)PU Ax&QzG literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fc/__pycache__/info.cpython-310.pyc b/lib/aci/intf/fc/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1292a7f15b8887b9d5d6c78c5c5f50e6f413390 GIT binary patch literal 4120 zcmai1UvJ#T5#L?@IUbKE%d+f9sT-(i<>r7|X%h6G;JR@XC{WQ}3abVRRV_<%c@k~v zcwX{U=x_p3*nO+NgVZ;FgTD495B&)HnkRpNzPOFt-z@KRy0cT0;O^|s?(FW&Z)TQx zv*|NDJAeC9{$+`=uc&eHvC#M!U-1qK$t2I%0pH=Aea57a))OYJ$6`lFdz-bK=NQ9U zTsJ#uRwgRkPqJR3V(Pv4oXh+pdK0$8C4&Sm#S^w;NlV(OZRtoCwIgfNL+#4C^ikJj zLk6h5db2(^dYhn|@`}79=b!MMy1XnGFv6Ej>}gS7+UjC2ohVK=m6w?4AX8}hM_}i(&9cJEX{0kZ9FI@WsM&f1bt?= z{{S&$Cv3=v;#3@4LrbzgQvvNgWydy7VoQDtWOoDV`m6OFEh19 zqn4Shy+!jdzUnX5(X!9`G5^s@HL~hAqe&V&;TQWsJIn0U+NIS!@Ua(2F%-;FZ<8KA z@0Y!PsmKW0?d7Vx*V7)=pXPt=>N-&ydB0m~(eFJsqZ-t=-9I>p)KN?5%X>))ZI0|) zz(o4`R99G3W5e7m)p8Z-j~0_*Ds`=!%Y+Dr8zWbRN3)iuMR(${bmA62 zL}7D**FN(co7=+UqZiaX_ryFGUn~k+xSZa_uWfhm-mKlfX^ANu*t8TrgM&p77jaPX zq4k(=Geskw33VBjwz8z#vd!Vu6?7f|)!!r7Yz~LhgJh2RQ81z&2b-g70|ATU+qjbiNfx- zTqE$|4#5^QiCb>X9&V<$ic*2zI#Kwp#Q`|+vrIMXEV=l&DrG9wIwYH+Tq=oFh z;P0zTpkMHt1X#HxpOa>_ODNuw+Kzf@Jb>HCo2$k9tA%b7%nii5(Lthv?1Q`IX8eiT z$h#fw6lGKj#hT%NWCcwUQU%IXfquOV_^M)XFF7%tN^mnWT zhlAz|zXbJ|Oa4$Gk;46k0=oa0EO)|9_<=(oBR#?f;~v=TuLw`492P>-!^{s$3yx0C zOes(lA95yL$g*V(+%^)chx!iq^<`Gv8F3xyA98Tn1Lwr0Th7qAhS{+29POmlY@0;+ z+ZTM@L;)>Qxv3rFGTMUoC<1(ot2?Ol!a-EV`;*)V-40gob&GzFGFu{7%)FKAqLy~| zRt}@ApRBI{4mI^QB&eGt#(t2eU1g$7P)RIGh2iRF#B~y-ay3q>bLWo@4lS5;`O*B)R^LaDAom_N zO{5p6HYfp?b<|H_$csE{=t=vj13tO5t2V)>JU5yv|!rg8oG(j5lX#aK3;3hXohP=dDl1x}>v#>6J1S5f?K66Z?NrPgr5$|}^x#kE_G z+S)U%U*&tmiTV_T98tQ2znISTB6#CF)@VkbjH})yOl);_hoeZ zpEQ?X=CQ#?v(}u7OXSdNx3WBrvf?&~YCd33(FfT5IVuC9o#m-{Cb-Bd!@Qnlj{SO; zIk%!*qTRyyPit=GGNnEvu3u@^WU9vgg@#|L*f9J`sfKQj22~nXzoy-PPLk%LEStD* zp}s|&O)BWuqbf+*=6?4WMDaTmL6c%7uAU;Gi>RnBq~t8#f9=|&CAj||+ncogDK53( zUN4aq;biU^TV?CyWuT~Z__Ww3tKuP0#B@!v(AT-lqSn>T1sxtp5Q+5A7rX literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fc/__pycache__/main.cpython-310.pyc b/lib/aci/intf/fc/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d23586393571a78cfc7c0356600dadf845639bad GIT binary patch literal 851 zcmZWny^ho{5FY1elg;k^NNj<4gKg3vQ6Pjkoj7#OHrId^$uhAcSvc9n$*u&V<4Ss3 zDDOphh_qDq3eYg)u&Zd#){H)notf{O$@=6Z16=RE{ZiipfZuc&uM`ij(Au}?6ewn) zW}Gp?feq@AhaQJEs$(8|9N9^o@WkWTruCFh8N2~CQOPZ+L^B=gSSNb=HQ|{`Z(upS z$Lz3V{poenX;;ZoUzHadgORgQ4j9w?@QTi~Gzky+HwM%79-`kHWvc8S(LL)XC%_62@obGqPw!UKv9DBdFlSc0vV z6Gu$?R0z|UP6$VNT|_P>H$jIYqgLDM4jhf_&(q82#Rq9kQJS_~7fSE6EljK3PP@XI z_k}D?VVbTgsz0Ybiy>hJDIDFGeEsJ&P5pM@o&XwGe$KM7>s9OL#8C z$E~!(jZf-1job|Ly96CoY)MH9^TbD1%Nc)!1al;q6T!SHbGb3T2YhjSV{qucANg{86bC|PXXJNqh HJN^3)j(x>t literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fc/__pycache__/output.cpython-310.pyc b/lib/aci/intf/fc/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1d01547a938919a0f62f3b31737fbeb9f345688 GIT binary patch literal 3083 zcmd5;L66f$6!zF-$8oYtp%e-fZ3?9{P!?!KX(^?kZPOy5RO+r&X`9OOdM3MGymmU{ zEZr!a;8<=w^-uw~{E^;!ooi1$Lsb00>X8hhapPkOkcm^Eb z{ro%o=eS|~i4Wt41rImjl7|4kGMK^0L%1H8%LX$Sjk*g;%Y+%rCL_#z zXe?Xo0He%)NR}ykjg^=SEgNiQ=0VE=TZL7jRf5(Gn}wFk9GK;xI(R$DxM&9vje(2T+F%`qZhDI4Ky~1Ch z(Kp3`zOins6Gk$#PacpXkWx6UM;0-13!`^UF$bO}(ep83_7g(%yR91cEwEYQEOS-~ zw5?Txm7bELV23`c`>rq-`e>g*Us?B|-B_o6(zp6l&xSL4k4kyedZjt`Mzuy*yHH!q zf{fR`KYd32urx4LxtlO9;wa&2c7?Z7!Tp5a!{@*7RTXWf&_#nz6xOMl>7>k0QU*@J z23O7+58`Z1IqjeuXHuCFQ}kBu3IiE^SZ6d8(V%}SXE+NFGg80PgE(A zJ}zCk;Gw+-w!ktf8YS%%B1Bot#SyTGqX-471hP&Y>j)qY@MN2;(r<^p#0+Bn-m|9w zeM_9~o6P7M;;`n!L~yy{kXh}_w!6U1 zCom5KS5)DqDn*rUGgX$L0wT(`mJ|(oE*GBY@(PcLEV)snA3gpwtEs^8`A*g>VvK4nS4;Pn{rPejLe64jfHh@iz9*duu!q zr_ggMe^2h>6w((G1C)*-@gKn0XEy*SaSIl^FCAyL;4`w>HQkC+adI0mUz+xa$tLlh z_bwJSo5tmx^G+AiO<2sng>-_5G6(3nEuC64K~f8vS}31D(s8LQ7gFgpdnbzb$SIm@ z);K-)uui;-`9F*B9zq@A9Dp+8P;+6NRbn2yFCtt*xQveFJ5ig5TOsHW79=Oo8`!#n zP(#=yOOwi~RS%R(X6rCQV*H)bw7ZmaS1G-}_gTo%OnY>x_#*xW)BhiINf&%vm3Dj^ zPfaR#?OPtgCupZEoqMI{6lD^hV(mUd(5f&h>Q%JuD(c*Xy_%<5=mq@>W8`&!{qNQZ zCB9s|$gB41_`G|HJpA~GcVIE~3DSP6%c6Zq`T|g*gReXq#dTUI|;-sw+ z;Ci&;{efez0qm3NqmgyesGH43y^Q~j`19lY%Jcn=lyzflSAGA-ZV=}^0{;%gX@pM@ zK1aBTa0_8nc-_K}yBPlQ%2{}F4VQS9cftGEyEJ=M_ciN8-zN=L?)7{fH!zC+l|5wq E2Zd+q6951J literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fc/__pycache__/summary.cpython-310.pyc b/lib/aci/intf/fc/__pycache__/summary.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7557b7e01b6da6082edb8bd0bcc288e431e0795d GIT binary patch literal 1064 zcmZ`&Pixdb6o2z4*>v4PT?%zo#DkY06i*&X5urs9WIYrwOJrCx*&59z+nJ=&l7e8b zeuwtxH}C`aDdy^_H_w9Ndr2x=)EVZ@o0s=~?{A9L)jr_*e(!6%ApyS8V|fXDJjP@1 zAkm;%26HxH44#7KTAYFwANho9xd)+lfjST}*UyT5^(M&{iHS+HysiKyFku?d+;70x zL};nKQiTA4cd}@xyF<-(Xo*;Md*ddY<-m;o$_KDS?xCVsb zV~okCm{J`ILnclJ$wce;PvC-&Q|npnx#>k+PH{xa+qXMY7=vq zm?%qMN7Fcs(!88SvpBMCT$_s{7bunHX{nTlD3%-z+3~HvbJ)Dpiz)WYj?& zHJm}sYJSd7L@hK_Uj?pBD~DXP45yjol|TGvR{^%)y;eLpF&pxp#mHH+QtD{tR>vif*(z|JOOIFD0##QK9e2GpYVILrojN_KS0#7o@1J-Ti z)>y#T82_-&CHEQa^`Fu|zWFZ|x8_AMo1JqO@*lxW(qJ~%k8o*He2Dp&^ A0RR91 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fc/api.py b/lib/aci/intf/fc/api.py new file mode 100644 index 00000000..628d1f31 --- /dev/null +++ b/lib/aci/intf/fc/api.py @@ -0,0 +1,72 @@ +class InterfaceFcApi(): + def __init__(self): + self.interface_fc_mo = {} + + def get_interface_fc_mo(self, pod_id, node_id): + key = '%s.%s' % ( + pod_id, + node_id + ) + if key in self.interface_fc_mo: + return self.interface_fc_mo[key] + + cache = self.get_object_cache( + 'l1FcPhysIf', + object_selector=key + ) + if cache is not None: + self.interface_fc_mo[key] = cache + self.log.apic_mo( + 'l1FcPhysIf.%s' % (key), + self.interface_fc_mo[key] + ) + return self.interface_fc_mo[key] + + class_name = 'topology/pod-%s/node-%s/l1FcPhysIf' % (pod_id, node_id) + query = 'query-target=children&target-subtree-class=l1RtFcBrConf&rsp-subtree-include=health,fault-count,required' + managed_objects = self.get_class( + class_name, + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_interface_fc_mo', + 'API failed' + ) + return None + + self.interface_fc_mo[key] = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['l1FcPhysIf']['attributes'] + attributes['healthInst'] = self.get_mo_child_attributes( + 'l1FcPhysIf', + managed_object, + 'healthInst' + ) + attributes['faultCounts'] = self.get_mo_child_attributes( + 'l1FcPhysIf', + managed_object, + 'faultCounts' + ) + attributes['ethpmLbRtdIf'] = self.get_mo_child_attributes( + 'l1FcPhysIf', + managed_object, + 'l1RtFcBrConf' + ) + self.interface_fc_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'l1FcPhysIf.%s' % (key), + self.interface_fc_mo[key] + ) + + self.set_object_cache( + 'l1FcPhysIf', + self.interface_fc_mo[key], + object_selector=key + ) + + return self.interface_fc_mo[key] diff --git a/lib/aci/intf/fc/audit/__init__.py b/lib/aci/intf/fc/audit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/fc/audit/api.py b/lib/aci/intf/fc/audit/api.py new file mode 100644 index 00000000..ef28ef06 --- /dev/null +++ b/lib/aci/intf/fc/audit/api.py @@ -0,0 +1,54 @@ +class InterfaceFcAuditApi(): + def __init__(self): + self.interface_fc_audit_mo = {} + + def get_interface_fc_audit_mo(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_fc_audit_mo: + return self.interface_fc_audit_mo[key] + + cache = self.get_object_cache( + 'l1FcPhysIf.audit', + object_selector=key + ) + if cache is not None: + self.interface_fc_audit_mo[key] = cache + self.log.apic_mo( + 'l1FcPhysIf.audit.%s' % (key), + self.interface_fc_audit_mo[key] + ) + return self.interface_fc_audit_mo[key] + + class_name = 'topology/pod-%s/node-%s/l1FcPhysIf' % (pod_id, node_id) + query = 'rsp-subtree-include=audit-logs,no-scoped,subtree&order-by=aaaModLR.created|desc&page=0&page-size=%s' % (self.api_audit_limit) + managed_objects = self.get_class( + class_name, + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_interface_fc_audit_mo', + 'API failed' + ) + return None + + self.interface_fc_audit_mo[key] = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['aaaModLR']['attributes'] + self.interface_fc_audit_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'l1FcPhysIf.audit.%s' % (key), + self.interface_fc_audit_mo[key] + ) + + self.set_object_cache( + 'l1FcPhysIf.audit', + self.interface_fc_audit_mo[key], + object_selector=key + ) + + return self.interface_fc_audit_mo[key] diff --git a/lib/aci/intf/fc/audit/info.py b/lib/aci/intf/fc/audit/info.py new file mode 100644 index 00000000..770b4349 --- /dev/null +++ b/lib/aci/intf/fc/audit/info.py @@ -0,0 +1,104 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class InterfaceFcAuditInfo(): + def __init__(self): + self.interface_fc_audit = {} + + def get_interface_fc_audit_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['interfaceId'] = None + if '/cloudsec-[' in info['affected']: + info['interfaceId'] = info['affected'].split('/cloudsec-[')[1].split(']')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_interface_fc_audit(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_fc_audit: + return self.interface_fc_audit[key] + + managed_objects = self.get_interface_fc_audit_mo( + pod_id, + node_id + ) + if managed_objects is None: + return None + + self.interface_fc_audit[key] = [] + for managed_object in managed_objects: + audit_info = self.get_interface_fc_audit_info( + managed_object + ) + self.interface_fc_audit[key].append( + audit_info + ) + + self.log.apic_mo( + 'l1FcPhysIf.auditRecord.info.%s' % (key), + self.interface_fc_audit[key] + ) + + return self.interface_fc_audit[key] + + def get_interface_fc_id_audit(self, pod_id, node_id, interface_id, audit_filter=None): + audits = [] + + all_audits = self.get_interface_fc_audit( + pod_id, + node_id + ) + if all_audits is None: + return audits + + for audit_info in all_audits: + if audit_info['interfaceId'] is not None: + if audit_info['interfaceId'] == interface_id: + if not self.match_system_fault(audit_info, audit_filter): + continue + + audits.append( + audit_info + ) + + return audits diff --git a/lib/aci/intf/fc/audit/main.py b/lib/aci/intf/fc/audit/main.py new file mode 100644 index 00000000..87e404dc --- /dev/null +++ b/lib/aci/intf/fc/audit/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.fc.audit.api import InterfaceFcAuditApi +from lib.aci.intf.fc.audit.info import InterfaceFcAuditInfo + + +class InterfaceFcAudit(InterfaceFcAuditApi, InterfaceFcAuditInfo): + def __init__(self): + InterfaceFcAuditApi.__init__(self) + InterfaceFcAuditInfo.__init__(self) diff --git a/lib/aci/intf/fc/event/__init__.py b/lib/aci/intf/fc/event/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/fc/event/api.py b/lib/aci/intf/fc/event/api.py new file mode 100644 index 00000000..0719976a --- /dev/null +++ b/lib/aci/intf/fc/event/api.py @@ -0,0 +1,54 @@ +class InterfaceFcEventApi(): + def __init__(self): + self.interface_fc_event_mo = {} + + def get_interface_fc_event_mo(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_fc_event_mo: + return self.interface_fc_event_mo[key] + + cache = self.get_object_cache( + 'l1FcPhysIf.eventLog', + object_selector=key + ) + if cache is not None: + self.interface_fc_event_mo[key] = cache + self.log.apic_mo( + 'l1FcPhysIf.eventLog.%s' % (key), + self.interface_fc_event_mo[key] + ) + return self.interface_fc_event_mo[key] + + class_name = 'topology/pod-%s/node-%s/l1FcPhysIf' % (pod_id, node_id) + query = 'rsp-subtree-include=event-logs,no-scoped,subtree&order-by=eventRecord.created|desc&page=0&page-size=%s' % (self.api_event_limit) + managed_objects = self.get_class( + class_name, + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_interface_fc_event_mo', + 'API failed' + ) + return None + + self.interface_fc_event_mo[key] = [] + for managed_object in managed_objects['imdata']: + attributes = managed_object['eventRecord']['attributes'] + self.interface_fc_event_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'l1FcPhysIf.eventLog.%s' % (key), + self.interface_fc_event_mo[key] + ) + + self.set_object_cache( + 'l1FcPhysIf.eventLog', + self.interface_fc_event_mo[key], + object_selector=key + ) + + return self.interface_fc_event_mo[key] diff --git a/lib/aci/intf/fc/event/info.py b/lib/aci/intf/fc/event/info.py new file mode 100644 index 00000000..2e11b001 --- /dev/null +++ b/lib/aci/intf/fc/event/info.py @@ -0,0 +1,114 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class InterfaceFcEventInfo(): + def __init__(self): + self.interface_fc_event = {} + + def get_interface_fc_event_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['pod_node_name'] = '%s/%s' % ( + info['dn'].split('/')[1], + self.get_node_name( + info['dn'].split('/')[2].split('-')[1] + ) + ) + + # "affected": "topology/pod-1/node-2208/sys/inst-overlay-1/fc-[lo0]" + info['interfaceId'] = None + if '/fc-[' in info['affected']: + info['interfaceId'] = info['affected'].split('/fc-[')[1].split(']')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['changeSetT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['changeSet'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_interface_fc_event(self, pod_id, node_id, deduplicate=True): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_fc_event: + return self.interface_fc_event[key] + + managed_objects = self.get_interface_fc_event_mo(pod_id, node_id) + if managed_objects is None: + return None + + self.interface_fc_event[key] = [] + transaction_ids = [] + for managed_object in managed_objects: + event_info = self.get_interface_fc_event_info( + managed_object + ) + if not deduplicate or event_info['txId'] not in transaction_ids: + self.interface_fc_event[key].append( + event_info + ) + transaction_ids.append( + event_info['txId'] + ) + + self.log.apic_mo( + 'l1FcPhysIf.eventLog.info.%s' % (key), + self.interface_fc_event[key] + ) + + return self.interface_fc_event[key] + + def get_interface_fc_id_event(self, pod_id, node_id, interface_id, event_filter=None): + events = [] + + all_events = self.get_interface_fc_event( + pod_id, + node_id + ) + if all_events is None: + return events + + for event_info in all_events: + if event_info['interfaceId'] is not None: + if event_info['interfaceId'] == interface_id: + if not self.match_system_fault(event_info, event_filter): + continue + + events.append( + event_info + ) + + return events diff --git a/lib/aci/intf/fc/event/main.py b/lib/aci/intf/fc/event/main.py new file mode 100644 index 00000000..7d172e7e --- /dev/null +++ b/lib/aci/intf/fc/event/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.fc.event.api import InterfaceFcEventApi +from lib.aci.intf.fc.event.info import InterfaceFcEventInfo + + +class InterfaceFcEvent(InterfaceFcEventApi, InterfaceFcEventInfo): + def __init__(self): + InterfaceFcEventApi.__init__(self) + InterfaceFcEventInfo.__init__(self) diff --git a/lib/aci/intf/fc/fault/__init__.py b/lib/aci/intf/fc/fault/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/fc/fault/api.py b/lib/aci/intf/fc/fault/api.py new file mode 100644 index 00000000..f38a60ff --- /dev/null +++ b/lib/aci/intf/fc/fault/api.py @@ -0,0 +1,124 @@ +class InterfaceFcFaultApi(): + def __init__(self): + self.interface_fc_fault_mo = {} + self.interface_fc_fault_record_mo = {} + + def get_interface_fc_fault_mo(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_fc_fault_mo: + return self.interface_fc_fault_mo[key] + + cache = self.get_object_cache( + 'l1FcPhysIf.fault', + object_selector=key + ) + if cache is not None: + self.interface_fc_fault_mo[key] = cache + self.log.apic_mo( + 'l1FcPhysIf.fault.%s' % (key), + self.interface_fc_fault_mo[key] + ) + return self.interface_fc_fault_mo[key] + + class_name = 'topology/pod-%s/node-%s/l1FcPhysIf' % (pod_id, node_id) + query = 'rsp-subtree-include=faults,no-scoped,subtree' + managed_objects = self.get_class( + class_name, + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_interface_fc_fault_mo', + 'API failed' + ) + return None + + self.interface_fc_fault_mo[key] = [] + for managed_object in managed_objects['imdata']: + if 'faultInst' in managed_object: + attributes = managed_object['faultInst']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultInst' + attributes['delegated'] = True + + self.interface_fc_fault_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'l1FcPhysIf.fault.%s' % (key), + self.interface_fc_fault_mo[key] + ) + + self.set_object_cache( + 'l1FcPhysIf.fault', + self.interface_fc_fault_mo[key], + object_selector=key + ) + + return self.interface_fc_fault_mo[key] + + def get_interface_fc_fault_record_mo(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_fc_fault_record_mo: + return self.interface_fc_fault_record_mo[key] + + cache = self.get_object_cache( + 'l1FcPhysIf.faultRecord', + object_selector=key + ) + if cache is not None: + self.interface_fc_fault_record_mo[key] = cache + self.log.apic_mo( + 'l1FcPhysIf.faultRecord.%s' % (key), + self.interface_fc_fault_record_mo[key] + ) + return self.interface_fc_fault_record_mo[key] + + class_name = 'topology/pod-%s/node-%s/l1FcPhysIf' % (pod_id, node_id) + query = 'rsp-subtree-include=fault-records,no-scoped,subtree&order-by=faultRecord.created|desc&page=0&page-size=%s' % (self.api_fault_limit) + managed_objects = self.get_class( + class_name, + query=query + ) + + if managed_objects is None: + self.log.error( + 'get_interface_fc_fault_record_mo', + 'API failed' + ) + return None + + self.interface_fc_fault_record_mo[key] = [] + for managed_object in managed_objects['imdata']: + if 'faultRecord' in managed_object: + attributes = managed_object['faultRecord']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = False + + if 'faultDelegate' in managed_object: + attributes = managed_object['faultDelegate']['attributes'] + attributes['object'] = 'faultRecord' + attributes['delegated'] = True + + self.interface_fc_fault_record_mo[key].append( + attributes + ) + + self.log.apic_mo( + 'l1FcPhysIf.faultRecord.%s' % (key), + self.interface_fc_fault_record_mo[key] + ) + + self.set_object_cache( + 'l1FcPhysIf.faultRecord', + self.interface_fc_fault_record_mo[key], + object_selector=key + ) + + return self.interface_fc_fault_record_mo[key] diff --git a/lib/aci/intf/fc/fault/info.py b/lib/aci/intf/fc/fault/info.py new file mode 100644 index 00000000..76145133 --- /dev/null +++ b/lib/aci/intf/fc/fault/info.py @@ -0,0 +1,149 @@ +import time +from datetime import datetime + +from lib import filter_helper + + +class InterfaceFcFaultInfo(): + def __init__(self): + self.interface_fc_fault = {} + self.interface_fc_fault_record = {} + + def get_interface_fc_fault_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['pod_node_name'] = '%s/%s' % ( + info['dn'].split('/')[1], + self.get_node_name( + info['dn'].split('/')[2].split('-')[1] + ) + ) + + # "affected": "topology/pod-1/node-2208/sys/inst-overlay-1/fc-[lo0]" + info['interfaceId'] = None + + if not managed_object['delegated']: + if 'affected' in info: + if '/fc-[' in info['affected']: + info['interfaceId'] = info['affected'].split('/fc-[')[1].split(']')[0] + + # "dn": "topology/pod-1/node-2208/sys/inst-overlay-1/fc-[lo0]" + if info['interfaceId'] is None: + if '/fc-[' in info['dn']: + info['interfaceId'] = info['dn'].split('/fc-[')[1].split(']')[0] + + info['descrT'] = filter_helper.get_string_chunks( + filter_helper.sanitize_string( + info['descr'] + ), + 80 + ) + + info['dnT'] = filter_helper.get_string_chunks( + info['dn'], + 40, + separator='/' + ) + + # "2022-04-29T13:32:45.167+02:00" + info['timestamp'] = int( + time.mktime( + datetime.strptime( + info['created'], + '%Y-%m-%dT%H:%M:%S.%f%z' + ).timetuple() + ) + ) + + info['severityT'] = self.system_fault_severity_name[info['severity']] + info['__Output']['severityT'] = self.system_fault_severity_color[info['severity']] + + return info + + def get_interface_fc_fault(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_fc_fault: + return self.interface_fc_fault[key] + + managed_objects = self.get_interface_fc_fault_mo(pod_id, node_id) + if managed_objects is None: + return None + + self.interface_fc_fault[key] = [] + for managed_object in managed_objects: + fault_info = self.get_interface_fc_fault_info( + managed_object + ) + self.interface_fc_fault[key].append( + fault_info + ) + + self.log.apic_mo( + 'l1FcPhysIf.fault.info.%s' % (key), + self.interface_fc_fault[key] + ) + + return self.interface_fc_fault[key] + + def get_interface_fc_fault_record(self, pod_id, node_id, deduplicate=True): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_fc_fault_record: + return self.interface_fc_fault_record[key] + + managed_objects = self.get_interface_fc_fault_record_mo(pod_id, node_id) + if managed_objects is None: + return None + + self.interface_fc_fault_record[key] = [] + fault_ids = [] + + for managed_object in managed_objects: + fault_info = self.get_interface_fc_fault_info( + managed_object + ) + if not deduplicate or fault_info['id'] not in fault_ids: + self.interface_fc_fault_record[key].append( + fault_info + ) + fault_ids.append( + fault_info['id'] + ) + + self.log.apic_mo( + 'l1FcPhysIf.faultRecord.info.%s' % (key), + self.interface_fc_fault_record[key] + ) + + return self.interface_fc_fault_record[key] + + def get_interface_fc_id_fault(self, pod_id, node_id, interface_id, fault_object, fault_filter=None): + faults = [] + + if fault_object == 'faultInst': + all_faults = self.get_interface_fc_fault(pod_id, node_id) + if all_faults is None: + return faults + + fault_filter = self.remove_system_fault_timestamp_filter( + fault_filter + ) + + if fault_object == 'faultRecord': + all_faults = self.get_interface_fc_fault_record(pod_id, node_id) + if all_faults is None: + return faults + + for fault_info in all_faults: + if fault_info['interfaceId'] is not None: + if fault_info['interfaceId'] == interface_id: + if not self.match_system_fault(fault_info, fault_filter, exclude_cleared=False): + continue + + faults.append( + fault_info + ) + + return faults diff --git a/lib/aci/intf/fc/fault/main.py b/lib/aci/intf/fc/fault/main.py new file mode 100644 index 00000000..16631335 --- /dev/null +++ b/lib/aci/intf/fc/fault/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.fc.fault.api import InterfaceFcFaultApi +from lib.aci.intf.fc.fault.info import InterfaceFcFaultInfo + + +class InterfaceFcFault(InterfaceFcFaultApi, InterfaceFcFaultInfo): + def __init__(self): + InterfaceFcFaultApi.__init__(self) + InterfaceFcFaultInfo.__init__(self) diff --git a/lib/aci/intf/fc/info.py b/lib/aci/intf/fc/info.py new file mode 100644 index 00000000..ae1f3156 --- /dev/null +++ b/lib/aci/intf/fc/info.py @@ -0,0 +1,208 @@ +from lib import filter_helper + + +class InterfaceFcInfo(): + def __init__(self): + self.interface_fc = {} + + def get_interface_fc_summary(self, pod_id, node_id): + ports = self.get_interfaces_fc( + pod_id, + node_id + ) + + if ports is None: + return None + + summary = {} + summary['__Output'] = {} + summary['portUp'] = 0 + summary['portDown'] = 0 + summary['portCount'] = 0 + + for port in ports: + if port['up']: + summary['portUp'] = summary['portUp'] + 1 + + if not port['up']: + summary['portDown'] = summary['portDown'] + 1 + + summary['portCount'] = summary['portUp'] + summary['portDown'] + + (summary['portSummary'], summary['__Output']['portSummary']) = self.get_interface_summary_output( + summary['portUp'], + summary['portDown'], + summary['portCount'] + ) + + return summary + + def get_interface_fc_count(self, pod_id, node_id): + interfaces = self.get_interfaces_fc(pod_id, node_id) + return len(interfaces) + + def get_interface_fc_info(self, managed_object): + info = {} + info['__Output'] = {} + for key in managed_object: + info[key] = managed_object[key] + + info['podId'] = info['dn'].split('/')[1].split('-')[1] + info['nodeId'] = info['dn'].split('/')[2].split('-')[1] + + info['apic'] = self.apic_name + info['pod_node_name'] = 'pod-%s/%s' % ( + info['podId'], + self.get_node_name( + info['nodeId'] + ) + ) + + if managed_object['l1RtFcBrConf'] is not None: + info['state'] = {} + for key in managed_object['l1RtFcBrConf']: + info['state'][key] = managed_object['l1RtFcBrConf'][key] + + info['up'] = False + + (info['__Output']['health'], info['health']) = self.get_health_info( + managed_object['healthInst']['cur'] + ) + + (info['__Output']['faults'], info['faults']) = self.get_faults_info( + managed_object['faultCounts'] + ) + + info['isAnyFault'] = self.is_any_fault( + managed_object['faultCounts'] + ) + + return info + + def get_interfaces_fc_info(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.interface_fc: + return self.interface_fc[key] + + interfaces_mo = self.get_interface_fc_mo(pod_id, node_id) + if interfaces_mo is None: + return None + + self.interface_fc[key] = [] + for interface_mo in interfaces_mo: + self.interface_fc[key].append( + self.get_interface_fc_info( + interface_mo + ) + ) + + self.log.apic_mo( + 'l1FcPhysIf.info.%s' % (key), + self.interface_fc[key] + ) + + return self.interface_fc[key] + + def match_interface_fc(self, interface_info, interface_filter): + if interface_filter is None or len(interface_filter) == 0: + return True + + for ap_rule in interface_filter: + key = ap_rule.split(':')[0] + value = ':'.join(ap_rule.split(':')[1:]) + + if key == 'id': + if not filter_helper.match_string(value, interface_info['id']): + return False + + if key == 'fault': + if value == 'any': + if not interface_info['isAnyFault']: + return False + + if value not in ['any']: + self.log.error( + 'match_interface_fc', + 'Unsupported fault filtering value: %s' % (value) + ) + + return True + + def get_interfaces_fc( + self, + pod_id, + node_id, + interface_filter=None, + fault_info=False, + hfault_info=False, + event_info=False, + audit_info=False, + hfault_filter=None, + event_filter=None, + audit_filter=None + ): + all_interfaces = self.get_interfaces_fc_info(pod_id, node_id) + if all_interfaces is None: + return None + + interfaces = [] + + for interface_info in all_interfaces: + if not self.match_interface_fc(interface_info, interface_filter): + continue + + if fault_info: + interface_info['faultInst'] = self.get_interface_fc_id_fault( + pod_id, + node_id, + interface_info['id'], + 'faultInst' + ) + + if hfault_info: + interface_info['faultRecord'] = self.get_interface_fc_id_fault( + pod_id, + node_id, + interface_info['id'], + 'faultRecord', + fault_filter=hfault_filter + ) + + if event_info: + interface_info['eventLog'] = self.get_interface_fc_id_event( + pod_id, + node_id, + interface_info['id'], + event_filter=event_filter + ) + + if audit_info: + interface_info['auditLog'] = self.get_interface_fc_id_audit( + pod_id, + node_id, + interface_info['id'], + audit_filter=audit_filter + ) + + interfaces.append( + interface_info + ) + + interfaces = sorted( + interfaces, + key=lambda i: i['id'] + ) + + return interfaces + + def get_interface_fc(self, pod_id, node_id, port_id): + interfaces = self.get_interfaces_fc( + pod_id, + node_id, + interface_filter=['id:%s' % (port_id)] + ) + + if interfaces is None or len(interfaces) != 1: + return None + + return interfaces[0] diff --git a/lib/aci/intf/fc/main.py b/lib/aci/intf/fc/main.py new file mode 100644 index 00000000..e66374ae --- /dev/null +++ b/lib/aci/intf/fc/main.py @@ -0,0 +1,20 @@ +from lib.aci.intf.fc.api import InterfaceFcApi +from lib.aci.intf.fc.info import InterfaceFcInfo +from lib.aci.intf.fc.audit.main import InterfaceFcAudit +from lib.aci.intf.fc.event.main import InterfaceFcEvent +from lib.aci.intf.fc.fault.main import InterfaceFcFault + + +class InterfaceFc( + InterfaceFcApi, + InterfaceFcInfo, + InterfaceFcAudit, + InterfaceFcEvent, + InterfaceFcFault + ): + def __init__(self): + InterfaceFcApi.__init__(self) + InterfaceFcInfo.__init__(self) + InterfaceFcAudit.__init__(self) + InterfaceFcEvent.__init__(self) + InterfaceFcFault.__init__(self) diff --git a/lib/aci/intf/fc/output.py b/lib/aci/intf/fc/output.py new file mode 100644 index 00000000..9ddb43c1 --- /dev/null +++ b/lib/aci/intf/fc/output.py @@ -0,0 +1,263 @@ +class InterfaceFcOutput(): + def __init__(self): + pass + + def print_interfaces_fc_state(self, info, title=False): + if title: + self.my_output.default( + 'Interface Fc - State [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + if title: + self.my_output.default('None') + return + + order = [] + if self.is_apic: + order = ['apic'] + + order = order + [ + 'pod_node_name', + 'health', + 'faults', + 'id' + ] + + headers = [] + if self.is_apic: + headers = ['Apic'] + + headers = headers + [ + 'Node', + 'Health', + 'Faults', + 'Interface' + ] + + self.my_output.my_table( + info, + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_interface_fc_event_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Interface Fc - Event Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Interface Fc - Event Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'pod_node_name', + 'interfaceId', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Node', + 'Interface', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) + + def print_interface_fc_fault_inst(self, info, title=False): + if title: + self.my_output.default( + 'Interface Fc - Faults [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'pod_node_name', + 'interfaceId', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Node', + 'Interface', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_interface_fc_fault_record(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Interface Fc - Fault Records [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Interface Fc - Fault Records last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'pod_node_name', + 'interfaceId', + 'severityT', + 'code', + 'cause', + 'created', + 'lc', + 'descrT' + ] + + headers = [ + 'Node', + 'Interface', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Lifecycle', + 'Description' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + underline=True, + table=True + ) + + def print_interface_fc_audit_logs(self, info, when=None, title=False): + if title: + if when is None: + self.my_output.default( + 'Interface Fc - Audit Logs [#%s]' % (len(info)), + underline=True, + before_newline=True + ) + else: + self.my_output.default( + 'Interface Fc - Audit Logs last %s [#%s]' % (when, len(info)), + underline=True, + before_newline=True + ) + + if len(info) == 0: + self.my_output.default('None') + return + + order = [ + 'pod_node_name', + 'interfaceId', + 'severityT', + 'code', + 'cause', + 'created', + 'descrT', + 'changeSetT' + ] + + headers = [ + 'Node', + 'Interface', + 'Sev', + 'Code', + 'Cause', + 'Created Time', + 'Description', + 'Change Set' + ] + + self.my_output.my_table( + self.my_output.expand_lists( + info, + order, + ['descrT', 'changeSetT'] + ), + order=order, + headers=headers, + allow_order_subkeys=True, + remove_empty_columns=True, + row_separator=True, + underline=True, + table=True + ) diff --git a/lib/aci/intf/fcpc/__init__.py b/lib/aci/intf/fcpc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/fcpc/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/fcpc/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b197c8237ab8bea125f43b143d30d42681e85d3 GIT binary patch literal 150 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w#*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCM~%jIVL_nGcU6wK3=b&@)n0p TZhlH>PO2Tq$YLfS!NLFl@?;{5 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fcpc/__pycache__/api.cpython-310.pyc b/lib/aci/intf/fcpc/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b35043505cd8bb6b53a7052ffd630fc12991f021 GIT binary patch literal 1435 zcmaJBU27aSP};BCTi@AkASnkelz>Ao#14f#1*gO~r1+sG5a`3PWm#)_^2D$-IKhM zdYTIPQoIsJr4k&K)`MuWc8p*sOvM_OU<|0sPsiMTrPk`nRFoo_7s&LC%%*=Z?V-Zo zPmZ6)Z_`Z0LK#uSATMPWDpDB_FJ z=dm8Fr34jeJt)oqp$+;WrU1O*jWc!bv8CI%4ST~bnck(faYvX6Qdpb@OY^(4^coLX z&GiqB*GU}GxpR$WYutN8w^}z2|3JTH;D7MoL$C}`%4_^4fF4@xH9fS*^v|swA42Gp zHWhKUvVlH&5RKRi_Urv+*o3e(VlWu7Wxrw90c;^>c;hyG7*aGV&UVY$ZsTiXy6!do z8_wCqFaHxU+Fs|-X6$a}G2S^{_{kF>m~m6m|9_!qU*SN85qR@fq|-d#7}B073?^4&C5nFJfC zIiyuOi9SYQqqM5DI;$&bY}7eA$xUUqT5reX%#8b*8qV&Li&f?#73b2rn4|4si&CT8 zKAnp!HOBf<>q6VFi8C*fHoauSRgjjY%)#!O&rFUZO|5GKEL@_%_Na11xNqf^^*gsw z>mR*6`ir$pEC3oO100gLq2W$h=?#bB8Srq-bY@z9;l Pc-Z;+vDKvezr+3ou>x)) literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fcpc/__pycache__/info.cpython-310.pyc b/lib/aci/intf/fcpc/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..647b370f3dc1cf33f8fcfbc302da716afcdc6c6e GIT binary patch literal 4099 zcma)9UvC^q5%2ElnVp^8bsWcciE{y2a6Z`M&WDaakxU4Q5{wMTf-sT5GK?nEv+GI5 zyX&4^Bd^xdNePen4mNN321vXhA@RUBpkH|*AApy@+5D<#m zD%nr6?KDsHexkRt^zn8Sr`r(G+@{%RH9M=_1LKEb+D?06=+e5hfq)NgUfAmDm@Ouy zjUNvU`s|+njK+{1u^}IdV{zyV9mV=gSLp;PJCrz&RQwLih1wa_a#Xu_*wA^%es}ZG z9YWztOs^8x5>ut?G!Oj6c)o_7JR8USz2$OSb$3#8Z< z%u{ZVCVtWHb^AR{rZ8T&qkE6K#;5vW=MQaDrq+W_zuhyU-+g7dDm1p)-`$P$L0y<@ zt)vHij_jOULz!DMgJE89haJ0E-P5E&T26(jGNpD$CDd?9a&Af^b|a~8O7{dY;7^so5fEaZz;jduBUPG-71)tL%Li_GQ@l%(YQ%Sh9jG~=_X<&fXzUKX zdAk;s>_~#+>I`+kQmJG|?wE?1*JzvqR6|qLF+#Op^H1~@v|sa&35IGzy&@eMkFdF+ z*7Y3qWYkUL0h~g8ypn&ilA9Vq*uu9R?ItGJNusQ`v(e6b#)^>2Gg}Q}2_*=7M>_8!_7^tRs7_|>VJ2rxt zncI!pQ7chl=kb#y?ip$4I!}{>^EkVH3C@W5BOHC?R^&)?d|51`4upXFNPOZnIFY4* zFP=&Xhq9%Qa!`LONYWZJJ~b0#pJR2!DZ&ySD8>RcY@g|QstJ{wWM9jH7%UOxC%GmfmQt(&jOSm`2&eymN^TcRR+5y4|F$^mmEJ$vQ1lvUc9>jDq1L66o&`Pi+zo zLd>t8b7%|6dU=WE_eWG$1^XOS_QXB%=-M)L-^FZLdX9Ed zuQhDO`}J$SX5HS1RIMA=I*xJRL;6D;q|Wt^P?^Qus2A@{lAO(PgOx|^yx*l1m8fMq zbGf*CrR~=8ew6i-wPgUKq;Eoo{uT+6PdaH^+rUySWad2$c72{-N$~|e zsDUb3DqV-FNDnm|2ME_M1ceKL2v}!3~ zVHxV?SXRX#ds5o=A_giLLddYx+r#H%?x2YJ!f#^ z-^rrg$11w}7n(~@^V#6`MT^eFslv5a?_`}g%JREt6f)od6peu4AE2^e+Inwhrga6} z-HM#^CZaw5n}}8e`ukYGc)9ha`rNtOk^V7JgF?sF8!9_fouE**B?N_fZM!yNDs-)X zMrZgrNt%nYY~s$jevc>*si6Ogq9C=~3)>+Y`EO8EYZO0mpA=QNixkBzlU&FDpDay! zf(QSV{-htwP^kxJJH-VQF6W)V;a1+tJh8+c#t$VM`mDE+?tpIVZAg_!VJ-a8y>Q0K zFn{x%b7QM`392{+FD(_~r8(>v$TCM!iD6D|9gmLlcC^g9@<^?P?hA z^`oqy=rWelH>kKp1tr`Gc&$D4Z)t3@bKA1kc0eE{=U+qNGhB8Yf7zG#ZiuhYAI0Pi k{!@LRiN8^IkkHe|Hmci^%S6L1i~ZiEU#Q~F&K8{i1CAi`)Bpeg literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fcpc/__pycache__/main.cpython-310.pyc b/lib/aci/intf/fcpc/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..098da753d822c0e09250fb15bdbe0a1a5b7ee351 GIT binary patch literal 877 zcmZuv&5qMB5FY2JNwX~r2v!_;fnIWh144+^ibZ>=khmZ#k`-)6vT)Mkq?JJ2*fY-n zM;?O<50NV;UI8x5IJ8RDwKbzJV`t`@&$F7(Gr)EF<)``)0Q{nl@k;UIIa>P$odU%y z)QmGmIIuw-^3dbZMs>_%k0U#&6P|b++q9nYDT9}wCMvlGm1w3z9qU9-KPNm>>1$X_ ze`9u7u>ST{(`i?gQeVnf@_cPDcIO~=)l@4C-aQDOZstfig+@olZ;vG_e zMc8sNam1xhg)oijgm9GCMdV^~6Li>W)M{IO2S?BM=h4NJ;$3M?Ax$e+h05;Z_tO<8Lp`b>y= zr8buEOo;cJ(hes+t>-mzCs@HH=%{8(-J~!}d}O&e;rEebjwEv;nG?ypTpOeHu#49{o=+6U-n OFk{2c!hr2|`u86drq4J4 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fcpc/__pycache__/output.cpython-310.pyc b/lib/aci/intf/fcpc/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63cce7955bb70c85601a95c249cfc49dc9efa2ef GIT binary patch literal 3135 zcmd5;&2!sC6xT{CS(crYe$WDKr!H+Nh9+(4ghDB$oj{;79m9~Ef*FmXT_;Ku$?VE0 z@wlhvnj0q$Oxv6P5$;^~%87H!fij)py;Uqbsnd@e(&(qv+xPbC{r0C#Cnh`tu79_G zXNQj)#-I2xdRg#s6CQa8;A?{!jBLSk-&{19Id9ah5bV3IB4Q5A+*l;cSTq@7=9aN& zu>*`Udy6bm_69347fLqR%FKh31GWmQLa79$2{s8OmpRbOL3Q|cl5x=rLOvIM7k=Bx z+MO&UBOPNIpILY$1z-jQl13juQOV<$Fu|(f>DAe5&9xwonqefvw8{7ekDHO?VuOoj z94$42Flt6g)@ruGcGygHchl`n<@$bg*w`!P*>JB(i-2C>WJX$=?3@tdOO?n!!+)!CsLGfY<3nb#k_8-^7^KqCs&mi*Mm`3%oA0L zq>n>aE_i6~zAZ43ibhE*g%+YL=He(=#4&_|TLQVKj<*HS2e`6BTInN^e2Hs_9FQLa zP~s4em~cDKstzSpLJ2h;uvSf4%HK{2>xZ}ZPxoT66vM4B{eu1)Ar5J9IZ(hYj|_bL z2%u+)Gd+_T9YY+^yco;GWWZ9|Gjmq9%rQ*0fvK0V6=10|WGQm;9`etHx2=0Y-Wm^( zgA}*_viT6W*s}{Znyj+z?(nhN=$cV48$8KschY6KLrQ^D>(*c77zZ+|o!bcz zxDf@eMc)-wc&SQ}uiH$OC8&akvdslWL!_h~1|7*&DHI&C$dtpl48?--!j&Ld=JPyT zfQAlYqerkcYo2c?I;%rxG4yG5HV>^WM6d}eUt)aJ&Z0Ewdb7Hb8nhxl#3n8P^h+ZQ zdkd{^W5W{y$S!$15J8p-O=3OrN7GoG#u|Ee zg(u=&^xT)pr}i)_Co(Jz&^w03{|KTV-vFS*E%@v{bDYV7*~n|xbSqB9$!)}ZX4*qe zo5Xw4y;9_De^&49dw*%&fC0U-w2qNg<^WN5#8k^Dh-^Vv3k4PEIx3#!LOi`j_hd1b z0a=W-{9?m1Yk5EVW06>{>s5vppE-{VO7ZENYTt>(8ov6jb%@C9c(~=YE zO)SkI)DZRv)%f&kB?R@7*($_H>|wW9?M*4&lTz>R*GTBFx960q_*ec0L-;=^l}`Mq zPVM?@o*kd~+V?z!pVMxky6_U;eY8q^hFSa^LF>dYy;sq;C%vb~?%sUCg&x$e5GAhz zy!!qflkAydGB4Y`qkTV@?!k{qoP`0^$IAY#4vSt%_D3A|Tgr2|Vp9l(I89KBk&v{ z&LDh>@CCw6gj)zhBIptx0mR^pEGOa1HC*CZ-jw%=cWLsfu4~kZevb=Q?)7{eH?S3b I^gU$!2S>mCmjD0& literal 0 HcmV?d00001 diff --git a/lib/aci/intf/fcpc/__pycache__/summary.cpython-310.pyc b/lib/aci/intf/fcpc/__pycache__/summary.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76d62ac6e78bf7e9bf5dd30ca48cd880ffd63a3c GIT binary patch literal 1078 zcmZ`&Uu)Dr5TE^%TzX!i)C0L<#n-&FK1wM?Xi)??h2qN*S+3b!jpmYclT=!AAlO&G zL;L7A@B{cM_SL6;1wnBpN#zQ4mz|xR%>3qWvenf-;JVuW5pGI=pY&K>0w2%t6pxT- z&@6#Dn=l41KyxiFK#MPY!nHgE-?>H|@R{u=*|B;bC3$2*5-qP=fDufX1~hjYFg6id zYUctbQZoeX+2PByjLd8rM$f}H;bAqOPtDml!%MH|^xer7$T;xsOmauBB=SL^J2^R7I$ZZt!R|7N+!&}s7d zj!X@gP_vp}@r9^`h6>DpvWj6LW2muIyVwi7MR&{Yc6Ol_2k>rV;na?HM_{%{YXrLY zfb3Ael@~kslK(ky5s=)I8HwLi|9flWLl@Ukv@f zW<-RdTOyQg`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w<*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCbJ+WK0Y%qvm`!Vub}c4hfQvN RN@-529mv39CLqDW005>1A;tgz literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/__pycache__/main.cpython-310.pyc b/lib/aci/intf/ip/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab76be6c9a873ae8f76636c41f76d4402b3d1bd1 GIT binary patch literal 767 zcmZuvy=ojW5FV}e&*!^Tu7bh!LD(kdiV%W>i(nVmq!R+MS?NGTyLXY+2MOuo2XV^0 zOYj41lOk1KA(dxz_OS^!Vul$>`_1=_c0HR-0PW{}t$#6q-&BmPz~TZuTw~CnnS+)I z#wbr*(sIFL&RyDOB8z$I^0p8KgLj}ao!^4a4Kv(irudeNQWx)GUj9Kmn6u&dt=8Uz zaJAW!F(dgE7hV;(m~=ZpW(7Y%`oEy3afJ)B@LAeaV`Xr_}}5L|O?oDRpM77c3N z8|57R5f2+v36EAHZ*Ig&DJ<+gYjGArL!Mo-B@Y6ekJWjwzci5&1X*!QlbY66GrP9 z`*JeUR6Vs{qFCh8)vZx#m?+h*^^K!^s??{O+U-svWMni7^jG*C1N93ep@b=mJIncz zI750B(yNGGWjEFKysCE(SrOAX2yuGgR{S7dq2U|=TKo${tq%Y#cAX;-%{DR{@uvZM V5;2soce3Bm^9I_Qq7quq`2$pwvFiW; literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/main.py b/lib/aci/intf/ip/main.py new file mode 100644 index 00000000..23959861 --- /dev/null +++ b/lib/aci/intf/ip/main.py @@ -0,0 +1,12 @@ +from lib.aci.intf.ip.v4.address.main import AddressIpv4 +from lib.aci.intf.ip.v4.intf.main import InterfaceIpv4 +from lib.aci.intf.ip.v6.address.main import AddressIpv6 +from lib.aci.intf.ip.v6.intf.main import InterfaceIpv6 + + +class InterfaceIp(AddressIpv4, InterfaceIpv4, AddressIpv6, InterfaceIpv6): + def __init__(self): + AddressIpv4.__init__(self) + InterfaceIpv4.__init__(self) + AddressIpv6.__init__(self) + InterfaceIpv6.__init__(self) diff --git a/lib/aci/intf/ip/v4/__init__.py b/lib/aci/intf/ip/v4/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/ip/v4/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/ip/v4/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59240d4f0ed9d767452337bd86243c8cf5227594 GIT binary patch literal 151 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6wt*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCbJ->%p@j0J~J<~BtBlRpz;=n UO>TZlX-=vg$jo9UAi=@_02Nar&j0`b literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v4/address/__init__.py b/lib/aci/intf/ip/v4/address/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/ip/v4/address/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/ip/v4/address/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efbadfe77356131ddfdc25abe950526af8434487 GIT binary patch literal 159 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6ws*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCbJ->%p@i;C8a2}xHu+0J~J<~ cBtBlRpz;=nO>TZlX-=vg$n0V!Ai=@_0ANQZ82|tP literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v4/address/__pycache__/api.cpython-310.pyc b/lib/aci/intf/ip/v4/address/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c700c0c3bfed7d9e5a8173c22375bcdef1f41202 GIT binary patch literal 1218 zcmaJ>%}(4f5VjpB8`9-RsG?n|2QH}ELqV0ew4xP=N);DWm7Z3qtPp#*hU_NT*_Bvj zPvu&vj{wKMlCOOWq(W!1ECNL9$TMSmzR%+sJNf*4M4&DHJdFiU&L_0T)x|V z8y_c`j#F*ZJeF#tvRGSXM#{vQK8%x8$9hn9V_n3f&G?2cP71wVoVrj5JPv@ z(ebnUQLoQ@QcTvYg<$y5>+mnZkhG!|>#`Lx@hYz(M`T3I66(rp!J)u{Bvp{2A8f)a zF3FIZ*A<_7Y~eaPhxAq63feX5g3(+1fJpy#2frfcyz(#TB&Y&lB4)3~`!bLXL}40x zH(1~fWY{7f$k&BQW5#_RR1L{mM9#Iy1*PQV^M4`$&l#>hfp<5qcCGx(3ufg{$P|a6QcuYn`u* z$&Cw=qEG|rmh1y0P-5|20Kp0^U89Z*4DVQ-I)BO@)m&nb^p#ueCxfJ?}| zZ|_v#Ei!W;(6C=XFp6Jr74e92Hnl^r1NcJ9VZO;Yc<}3x2emK1;yhwa8o?J_2QZ6% z+-IPH=}#1lUp~0i|H|%u+s9{trx3zL0x~6s8QM)DPKHS~T`}-CnTCDmDEK5zeI9(> f*e$w+B&1Ex;20iutseuqaBI5P`x=QgTqb`3VR|fT literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v4/address/__pycache__/info.cpython-310.pyc b/lib/aci/intf/ip/v4/address/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1440290e1d53a1ba2f65f4cabdb9ba5646d2fd4f GIT binary patch literal 2124 zcmah~T~8ZF6rHbKFUEW{N(oNrmm<`N_frrp@*En*WppLb7X71d%Gn{koFqoUGGqh(vpX$Fc`iCZy zO=9vLzWiet%`{KhKJReOo-r-7JY`zG5*?w{7HfGIh+!@6W|Ay?VbaXlm^_p1ZN6{e zHLSxm!)~s{DeFirwL-77r+xIEuIT{1uN%6qXHR*jre|=@oLl%_YisiSc{Y6Xyx$wd zeBulm3w)dSa{B8MReNqeuEtzpCElg-E7y(mq( zagxV_t~NuHc9Y!Lp|RaG+3rSh(oOnBubX7u;iK+#F1UJwwd}|RVVLxjA`Csc16`)h zkC&$|y*3VtDPY`ahr(Cg{!a{c0Qz72L?rA)mf}bD`{IextdynNV5KVgklE#um#TT~ zI|xdt19@^l5(_3vX>4se@`XbIx_W$pAn516d$|S?Uql z!0D36Xt!!k5dco;ey2fjZuWMzil{KoA3y_Jg{zPHUk{_ysp2Rzo!T&qe=){dBFKp( zyX0S85Du2;v$HT46&3v91$i#6&>*aSVQepoO-neLn!fY$EKQ1*XMF^@`TeLL?HC;n zws%cjIJIYva;JzECo!(r9hrdQ@9vl)d`Au7t~a3dd>JO-svdCqHMn@$kV|}tuS+G4 zzntdt=43I+e%$D$^i>R}7-$auL{BUc!?I+%44f`fU&5pLE0km5zqseN3GX!6E7J#=yehs5?)%t~e*q&n{rop|Rp(03 zSiK39;&l;lcxd&?zpDGk5B?AS$@Di9aEdcaL7?V!6pKKKaFj?x3jj~$_BD}$@{uS7 z-ef2~33$gI&_M-p&H+B&E$mz`y%J^CWP8%CbEbXdQM!her-eL2!O|M25&6^6>cKpn z)e72`^nbhLkL_)OZvo~f=jVspeM1VrLrzkpQ@ewtZ>d_`Lh=^GFa{lCo*Gnj9_ZA9i&4wXo+ zWvd`tyc?C2{VS!8SEr$QZ?4h31NukOkM>O%x_TJy4>UN#xDkd2cuGerc7|?9H9GNE zKBOt(IbrBUvl50d$r~^M9=AXS_k!m9t!ky+l6Y2=?MhpfXJUVqj*_@wV|0}#^fKp^ JuEB1}e*u;Y_bUJZ literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v4/address/__pycache__/main.cpython-310.pyc b/lib/aci/intf/ip/v4/address/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c984509a9038c487f81118ee59ca6e1eeff6ef9 GIT binary patch literal 614 zcmaJ;y-ve05I)CgiAr0R3c&(%7EhfJs#Ig-+}ZMQS`-+eA&B&u>XZ`ASBIrA*E5)uF874C^dFYI-OO%DH3/32" + info['ip'] = info['addr'] + if len(info['addr'].split('/')) == 2: + info['ip'] = info['addr'].split('/')[0] + + # topology/pod-1/node-201/sys/ipv4/inst/dom-mgmt:inb/if-[lo18]/addr-[/32] + info['interface'] = info['dn'].split('/')[7].split('-')[1][1:][:-1] + + return info + + def get_node_addresses_ipv4_info(self, pod_id, node_id): + key = '%s.%s' % ( + pod_id, + node_id + ) + if key in self.node_address_ipv4: + return self.node_address_ipv4[key] + + managed_objects = self.get_node_address_ipv4_mo( + pod_id, + node_id + ) + if managed_objects is None: + return None + + self.node_address_ipv4[key] = [] + for managed_object in managed_objects: + self.node_address_ipv4[key].append( + self.get_node_address_ipv4_info( + managed_object + ) + ) + + return self.node_address_ipv4[key] + + def match_node_address_ipv4(self, address_info, address_filter): + if address_filter is None or len(address_filter) == 0: + return True + + for ap_rule in address_filter: + key = ap_rule.split(':')[0] + value = ':'.join(ap_rule.split(':')[1:]) + + if key == 'ip': + if value != address_info['ip']: + return False + + if key == 'subnet': + if not ip_helper.is_ipv4_in_cidr(address_info['ip'], value): + return False + + return True + + def get_node_address_ipv4(self, pod_id, node_id, address_filter=None): + addresses_info = self.get_node_addresses_ipv4_info( + pod_id, + node_id + ) + if addresses_info is None: + return None + + info = [] + for address_info in addresses_info: + if not self.match_node_address_ipv4(address_info, address_filter): + continue + + info.append( + address_info + ) + + return info diff --git a/lib/aci/intf/ip/v4/address/main.py b/lib/aci/intf/ip/v4/address/main.py new file mode 100644 index 00000000..7d6fa50f --- /dev/null +++ b/lib/aci/intf/ip/v4/address/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.ip.v4.address.api import AddressIpv4Api +from lib.aci.intf.ip.v4.address.info import AddressIpv4Info + + +class AddressIpv4(AddressIpv4Api, AddressIpv4Info): + def __init__(self): + AddressIpv4Api.__init__(self) + AddressIpv4Info.__init__(self) diff --git a/lib/aci/intf/ip/v4/intf/__init__.py b/lib/aci/intf/ip/v4/intf/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/ip/v4/intf/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/ip/v4/intf/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0671064c5ce7d376ea33ff335ad0e63edcac9fe GIT binary patch literal 156 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w>*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCbJ->%ml)WkI&4@EQycTE2zB1 VVUwGmQks)$2Qs*r2}rOo007~^B;f!6 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v4/intf/__pycache__/api.cpython-310.pyc b/lib/aci/intf/ip/v4/intf/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e070d587732c06854a67c62034e4e04086652428 GIT binary patch literal 1221 zcmaJ>K~LK-6t*454N-xL15&4H+J!?k4K#@pLKBEdQ!mvtcB(R2A$B`M+5|hTM3tV# zb;sS|xbyyvulpBBgFPn{0b_IY{GRRieSUt=PPV)pB4|IqpNlR-=$9MZZypTxK+GC+ z?~ys>UasvKWGF-dm!dHbQ1NkKz$;xAm^y>2~SYaRQP~pw$&XMQV-%p zcJt}>ey$P>pha`GV>a^>HR7R|^iVfP{}SSfNIygC9s!Kwa$| z>_jJVs-i@hB#VTc$~00&>Z#OGs*a*KQ4z2VB9%we?b?iUwV9vUfCIlOICp^<*M)f2 zejN7Z!Ygt4TC@NRAEb)^3JifuT#^A8(4vLR}JkXCETr-|gU+=z^C1C7!dA0Ta^Q3hxUh8V=?1IK0II zHxoe{y+fZ@=8XmS1uGkZw2@e9qf3m@>Bs*>0G*!<(Y74LZ3s!6e390J4Q&G|pTI4$OKv?$V`Ho@wa&C< zah}Vuur2cl36!qzmO-#w3EQY66V^MCXV$OT!-|WK;QwDGf;zhw!l*2D8qO`UEsE z{SMje)n9k|-x=<8eD^TiNjSG5hir*S>g*=xr;|9XS2X-k>d@~U$Gu2hoyk3KC&sx2 bD8NlmyD_}%N8nu5I$0rEEtZPWav+ju_&O$Q>HWs0;E9U#fvvX1)+$P!N!(sQZ^7nUfMiJ z+%2!fr9;QQL5HSCIZk5)DSE;kkMxmu-*@L?XQv4$KfkBqiwE$-Z5|7r!5OOANAnQ` z2y%`3l@37AK15!M=UYN?cZO=-qLDBl0tQqNL9b!p2~RLwneat`t1lY(MrilCc`0?4 zq_R7iA9eGrND1EFi1VGEqZ)=rKp$>N?-n9rnUSMRyE<$0>;3t0e3^_?oGOzRv5<2) zij|RiE_FOo7jcrRSmk9Ft4TaRx_2>UXL4mj&Q-2T&K(Nl3?qw!C)IT}VW|t*h>wn| zt}gQ(IzwdY8(C5XORu6I;8VC{6{*-8sJx1uz%;Bp#7}!s!!{BzR(Zd)ROGfHioDR> z%u*#R8y7-amM3Fr15+mD%+yFDU%PC!Jx=muC{4DC%M?Pg9{PW|(XK*! zIFu#N@lAw!&pKB~J8rYWMHn{{Az{ssvi@aLtA%>y)SNem(g6@CW(R{=onM literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v4/intf/__pycache__/main.cpython-310.pyc b/lib/aci/intf/ip/v4/intf/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ebf4f640737b79dec557345910cd31eedd12228 GIT binary patch literal 613 zcmZ`$y-ve05I)CgiK-TXgeoLh7_(&R1PB#%KwY}9MV71(JCa5Iu+vB&Hu@kiGVmrm zK~^SSfr)dXqIBS-JAHSy@B8jtOeP~h`}mB+83FjRN#6#T%+XDNL4Y7BWF#cSVkdPn z8d3r`AgFLRAY4f#eQ`rq3~s?6e&ZYPNprBwE2)zxmdmo9U6%@LhdZ@po)odY-8To5 zIl4K*AR#0ILPrqcY#^k9B7@sZcG|=^!k<}8(HH3E7()fGH ztbt*rb(c!DAW6d72NfhvP~*1@P$?E=En|86M!p>`>4vmT}0jJCXu RciAbuvYR({)-jS#=`YM!iVFY$ literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v4/intf/api.py b/lib/aci/intf/ip/v4/intf/api.py new file mode 100644 index 00000000..13d172f1 --- /dev/null +++ b/lib/aci/intf/ip/v4/intf/api.py @@ -0,0 +1,54 @@ +class InterfaceIpv4Api(): + def __init__(self): + self.node_interface_ipv4_mo = {} + + def get_node_interface_ipv4_mo(self, pod_id, node_id): + key = '%s.%s' % ( + pod_id, + node_id + ) + if key in self.node_interface_ipv4_mo: + return self.node_interface_ipv4_mo[key] + + cache = self.get_object_cache( + 'ipv4If', + object_selector=key + ) + if cache is not None: + self.node_interface_ipv4_mo[key] = cache + self.log.apic_mo( + 'ipv4If.%s' % (key), + self.node_interface_ipv4_mo[key] + ) + return self.node_interface_ipv4_mo[key] + + class_name = 'topology/pod-%s/node-%s/ipv4If' % (pod_id, node_id) + managed_objects = self.get_class( + class_name + ) + + if managed_objects is None: + self.log.error( + 'get_node_interface_ipv4_mo', + 'API failed' + ) + return None + + self.node_interface_ipv4_mo[key] = [] + for managed_object in managed_objects['imdata']: + self.node_interface_ipv4_mo[key].append( + managed_object['ipv4If']['attributes'] + ) + + self.log.apic_mo( + 'ipv4If.%s' % (key), + self.node_interface_ipv4_mo[key] + ) + + self.set_object_cache( + 'ipv4If', + self.node_interface_ipv4_mo[key], + object_selector=key + ) + + return self.node_interface_ipv4_mo[key] diff --git a/lib/aci/intf/ip/v4/intf/info.py b/lib/aci/intf/ip/v4/intf/info.py new file mode 100644 index 00000000..cb1034f2 --- /dev/null +++ b/lib/aci/intf/ip/v4/intf/info.py @@ -0,0 +1,38 @@ +class InterfaceIpv4Info(): + def __init__(self): + pass + + def get_node_interface_ipv4_info(self, managed_object): + keys = [ + 'adminSt', + 'dn', + 'donorIf', + 'id', + 'mode', + 'name', + 'status' + ] + + info = {} + for key in keys: + info[key] = managed_object[key] + + return info + + def get_node_interface_ipv4(self, pod_id, node_id): + managed_objects = self.get_node_interface_ipv4_mo( + pod_id, + node_id + ) + if managed_objects is None: + return None + + info = [] + for managed_object in managed_objects: + info.append( + self.get_node_interface_ipv4_info( + managed_object + ) + ) + + return info diff --git a/lib/aci/intf/ip/v4/intf/main.py b/lib/aci/intf/ip/v4/intf/main.py new file mode 100644 index 00000000..1aac1582 --- /dev/null +++ b/lib/aci/intf/ip/v4/intf/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.ip.v4.intf.api import InterfaceIpv4Api +from lib.aci.intf.ip.v4.intf.info import InterfaceIpv4Info + + +class InterfaceIpv4(InterfaceIpv4Api, InterfaceIpv4Info): + def __init__(self): + InterfaceIpv4Api.__init__(self) + InterfaceIpv4Info.__init__(self) diff --git a/lib/aci/intf/ip/v6/__init__.py b/lib/aci/intf/ip/v6/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/ip/v6/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/ip/v6/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..109c5835ac867f7045eea5ee16a87cba6191fb0e GIT binary patch literal 151 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6wt*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCbJ->%q%88J~J<~BtBlRpz;=n UO>TZlX-=vg$jo9UAi=@_02P-a(EtDd literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v6/address/__init__.py b/lib/aci/intf/ip/v6/address/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/ip/v6/address/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/ip/v6/address/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..578463f0c26bdd65f9b7cf72ec5c6381ceb86466 GIT binary patch literal 159 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6ws*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCbJ->%q%7`C8a2}xHu+0J~J<~ cBtBlRpz;=nO>TZlX-=vg$n0V!Ai=@_0AQOY8vp%}(4f5VjM?8`9-RsG>!xR4%C6LqS|PRI~z7sp5jF($gxH6=Lt!klh4(S&3El zRIWYt4yUTGG&I$R6i`&D8#Ws*# zgy|iTMACDhFJ7BS?|`)Y6!dq72dix$`wS*U+EkLZC#m$#N!ypcWWbpW0L$Inj+91O zyH^Z1cM6?SfJ_I<=xZ0qVv?GaL_h|Br28%E9`|#pL{fVY8eE884ti!)*7-pU1I+K& zyRYKoB-3%KZJNhY4OJFvtISZDIMau5lImFZ2c1|K@o+PqxQmlQuN7x56him)KnTpl z;uO)*le<~3O>I&v)^vm*1VB~#zd(?*q@~yKmdMyI{gND!Au$WcOMe*-1rijggc5!A z#;jzLoKmwaj?%8^g%a^Nm9lMNtYUG}F)j&Md`%$#>es86d z=uAn+bx$UPq!k+Mnp;57BygIfpOy0=h-*NfQ@A#62KUn}vDO93nA|v?6ou+bw_xuf z!6i1@aY#^T=^9loAo$1X%muagsPZNHNl&@?UeZsxN>1WiH+NT2-PC%*8)If*LcxB7 z$)ou3tB6IEd9@sZ%;5_u1AWtDV8O0K#w%NP#aQGuX@t0I4qCKhfd?Ekeq RKLm2&Rvqh2g~T2%lE1eFCcFRu literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v6/address/__pycache__/info.cpython-310.pyc b/lib/aci/intf/ip/v6/address/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b51be43da020be7299471d883ed66a49473cb18d GIT binary patch literal 1051 zcma)*!EVz)5I|?w8^?;$mR14^;s{9Q&|?o(RkbP->Lmi@78$Kv?TxMGT*L(fy55;zLgP(F?g)x>WEZsSNP zqpdwDrn@IuKTjC$T?zT5$Ea4IQP71e*13X^Ibrp%Z>Y-J{5&|`i_YR<8YQVs@<{2a z9!9CvW~xmzOi!aYNux9?`%zj%)7>auCdQ?HzEjLxAZ41RrIgf$B_r5;`(AlFtDuAe zR?sTFddnBpy0Z&I;|C(;|7VwW<3K8-`N5^--L~1Fd9!`bj6H6K8s6 zouKZVhyGtuhRSu%2fCD5uC)9ELQ-}_(9h|;rOOd8(F)i)6MX*WK8SyBPv}fm;-f=a zquE2Jf(t+t{E{OYPr(FCn~rq=h{!`!two~}7YyTg)wpDrjKTO(CAwe;dFZ+Ahf|Mo z=f_2%Gi5d@&|h-#i(JW6xn|ufIvaOES+jxBW{u3vWm+P7{9vLd7-?Ui5sc#_eg#4x zA!LOQu3Y=q!k@qTFJ7I{r+b&hBQ2$CNjb{ZWJrEn$}yh!@{J*abyw!;-8$=v>AcM9 kU$Fts0zA6FYj4)8osiYzt@duVxnO^p@__c&w|)zL12W0|PXGV_ literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v6/address/__pycache__/main.cpython-310.pyc b/lib/aci/intf/ip/v6/address/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4bedeae54e7cf3fbc14457e2531b49270e87162 GIT binary patch literal 614 zcmaJ;y-ve05I)CgiAr0R3c&(%7LOees#Ig-+}ZMQS`-+eA&B&u>XZ`ASBIrA*E5)uF874C^dFYI-OO%DH3g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w>*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCbJ->%nZVekI&4@EQycTE2zB1 VVUwGmQks)$2Qs*r2}rOo0080-B;x=8 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v6/intf/__pycache__/api.cpython-310.pyc b/lib/aci/intf/ip/v6/intf/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c6f23c3e299edce650bec19a84fe0fe82d6f05c GIT binary patch literal 1201 zcmaJ>K~LK-6t*454N(~t2PCFx+J!?k4a9{5LKBEdQ!i*5J5`yi5W8I^6up4{nRSU`hotQ#uzs&GnC(Kh&tTA`OBLxdMHRasT~B$6gXGEwtZ=Q)aHLHy zPIRXjZ|xOnLIE^ysH3-i=oV?Fq$CnJ0G1xKsaqN5O3QTaL#E(F4szJxR%gBM#Bf0U z+TP!ePU0+$lGG-7r1V&4QEIgrYZGPZQ4}X>1YUYkT14ZmT8)czy*PJ)1pnzsN+e=& z2_mxl$L}4EL zGc5QPDp)0N$j5NnnESpIW#fuca{B&1ksH8x#-(EJ-R09>IGFfrc74ru1y-ligW@dZ zN5?uDNvIKs+)NhgEwGwAALT`!<^A)GB3G~0>;{$?Wo_b~_Vq|UUiL}2_pbAz7pIw4 zPNV}BkK%Suvyq7PCjYpK@it~DkpGb+yd?=S!}KIwK2JIA}$I&RIX(oAi*UT z*$E&hQ{@^p8|AzceeV3)dsz9B!+48nu5I$0rEEtZPWav+ju_&O$V}>*c0;E9U#fvvX1)+$P!N!(sQZ^7nUfMiJ z+$}HCu@AttZ_%OYQI69XL5iMm$0L2@-S^$O*x6|U%J(0M_~HTlbeqS5XK;pU_R)L< z0fJnkex(Btv=5P&;`x?P+?}DCw`e2`h=2hVM9^y(c)}A5S0;QB;OdJ8z7g8JZeB{A zC8_LA=11K;D^h~DH{yJ!=ctCE5zvQQ(z}I-SZ3rX)2`0i{CaZ`IK#-|;7N6zO<3weHsYh> zs;kRY8A`#6i_bDGExVLg#xjMFtcU(zZnUe= z9u8&6b9@t_-m}gX(vI7#a1q9hL`YaOByGazqVp90zn(~4FE$dO2AgPpdHtdXAhoBJ}zvKOeQiH+D&T| ztoaEhh2Y3zV~ttZ7u$pxy^GPh?aad%t*LtTOsba{YYx#cLh)n2L&lIPCdK3ucm$vWk!yI&9fKKubY4*s10 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v6/intf/__pycache__/main.cpython-310.pyc b/lib/aci/intf/ip/v6/intf/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..090adce9d2688a55f712b9e694472b4f54a410d0 GIT binary patch literal 613 zcmZ`$y-ve05I)CgiK-TXgeoLh7_(&T00H ztbt*rb(c!DAW6d72NfhvP~*1@P$?E=En|86M!p>`>4vmT}0jJCXu RciAbuvYR({)-jS#=`SGAiZ%cM literal 0 HcmV?d00001 diff --git a/lib/aci/intf/ip/v6/intf/api.py b/lib/aci/intf/ip/v6/intf/api.py new file mode 100644 index 00000000..691ccf5c --- /dev/null +++ b/lib/aci/intf/ip/v6/intf/api.py @@ -0,0 +1,54 @@ +class InterfaceIpv6Api(): + def __init__(self): + self.node_interface_ipv6_mo = {} + + def get_node_interface_ipv6_mo(self, pod_id, node_id): + key = '%s.%s' % ( + pod_id, + node_id + ) + if key in self.node_interface_ipv6_mo: + return self.node_interface_ipv6_mo[key] + + cache = self.get_object_cache( + 'ipv6If', + object_selector=key + ) + if cache is not None: + self.node_interface_ipv6_mo[key] = cache + self.log.apic_mo( + 'ipv6If.%s' % (key), + self.node_interface_ipv6_mo[key] + ) + return self.node_interface_ipv6_mo[key] + + class_name = 'topology/pod-%s/node-%s/ipv6If' % (pod_id, node_id) + managed_objects = self.get_class( + class_name + ) + + if managed_objects is None: + self.log.error( + 'get_node_interface_ipv6_mo', + 'API failed' + ) + return None + + self.node_interface_ipv6_mo[key] = [] + for managed_object in managed_objects['imdata']: + self.node_interface_ipv6_mo[key].append( + managed_object + ) + + self.log.apic_mo( + 'ipv6If.%s' % (key), + self.node_interface_ipv6_mo[key] + ) + + self.set_object_cache( + 'ipv6If', + self.node_interface_ipv6_mo[key], + object_selector=key + ) + + return self.node_interface_ipv6_mo[key] diff --git a/lib/aci/intf/ip/v6/intf/info.py b/lib/aci/intf/ip/v6/intf/info.py new file mode 100644 index 00000000..b35c1acd --- /dev/null +++ b/lib/aci/intf/ip/v6/intf/info.py @@ -0,0 +1,38 @@ +class InterfaceIpv6Info(): + def __init__(self): + pass + + def get_node_interface_ipv6_info(self, managed_object): + keys = [ + 'adminSt', + 'dn', + 'donorIf', + 'id', + 'mode', + 'name', + 'status' + ] + + info = {} + for key in keys: + info[key] = managed_object[key] + + return info + + def get_node_interface_ipv6(self, pod_id, node_id): + managed_objects = self.get_node_interface_ipv6_mo( + pod_id, + node_id + ) + if managed_objects is None: + return None + + info = [] + for managed_object in managed_objects: + info.append( + self.get_node_interface_ipv6_info( + managed_object + ) + ) + + return info diff --git a/lib/aci/intf/ip/v6/intf/main.py b/lib/aci/intf/ip/v6/intf/main.py new file mode 100644 index 00000000..9da47335 --- /dev/null +++ b/lib/aci/intf/ip/v6/intf/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.ip.v6.intf.api import InterfaceIpv6Api +from lib.aci.intf.ip.v6.intf.info import InterfaceIpv6Info + + +class InterfaceIpv6(InterfaceIpv6Api, InterfaceIpv6Info): + def __init__(self): + InterfaceIpv6Api.__init__(self) + InterfaceIpv6Info.__init__(self) diff --git a/lib/aci/intf/lacp/__init__.py b/lib/aci/intf/lacp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/lacp/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/lacp/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7a904fdd8ca75fe74fe446178ed7ddd77c75904 GIT binary patch literal 150 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w#*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCMPkuASOOOGcU6wK3=b&@)n0p TZhlH>PO2Tq$YLfS!NLFl^6esz literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/__pycache__/adj_ep.cpython-310.pyc b/lib/aci/intf/lacp/__pycache__/adj_ep.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9c681807e6fc75e0c445cc59b78b9f6f0b7cb7b GIT binary patch literal 1961 zcma)7&2Aev5GJ|YA1RWGI%yg=Kr1A53KjmztwG=vZPOnV2;2hkNl?33Eh&ZeO1mbx zZY8Ww@ip&Y_trP*Gw|9|U!jMjGpk6pgQ6*g9g;)taQJ=mt@3ueNuYhQ{zv*%gOERQ za=Cdh`2rsEAs9gf&B%oIDJ9<#!Gw28g!i2Fncz=J&;JYdkREl-EFZ_uWL8L>qU&;7 z1-uVlN%~X}c>P)(jP^ajg?~!=Tm&M7-WM&=5Y1EC4+MoH+OF{=NsBMV!8gTT$}R=Q zF~)ujkNFskB?q*kg1(>?iJ4$vJwd?o+WLY(JZ}%u4KQ6L`i*QEx)*4S=e#HR*m4eK6OD-f{n_J(gTo|KgH)L` z9|(CYvw<>FA4@&R)NqibYM`ceG{9pAi(|KonTz6BO_hyfAHtXjOos;WYts4J3Y+ca zrW7$*wh#vRR*limFc5%H#YXHVIq?vo0|FxsJ*~Wo3-1Lx@hd>8B>EQOHAegxc=$T` zn*7v031BZf^D6AgIuZUlIfvpn`bY$TZn!t!uz8UKfU}(<7h4-42aiYLi58A}o8!vmRGjcBhfJ@^%UAn#azHTT;v7z6vi(G#YCdqpbXf0tAYSdE|pXax*o z4eXMmR^=^}(s1o0wdz>e*|%9THjas@^A6?AaRkZnBGLJVGW`H!g4Tj{{8EK` z?)HD=K7W8$?5s;$Q=y(?$UM8o#Xu;e?fEJXr)FU7Uh15y1EdM2*l$ljUCS7A$^`<7f-(JpZ z=H8%M--Tly!echUG(iF=3I39UHky><_*KM_Va`A}AP!DjjMIqCH~tsfJqq9c{a%P4 zR4m^(cFj1R_jLdO literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/__pycache__/api.cpython-310.pyc b/lib/aci/intf/lacp/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b507dd873d1c0887869f722ef6caacbd42935eb GIT binary patch literal 1360 zcmaJ>L2Dd06qYoa+1c?rHa@srD5X%`vIje)^c0eikkVpkO~KH^GOdtDT4$Wuov}1) z@S;7{*B*PfkNr!!_Fok0_C3w6*`%QwBt1R7_r32uNmFlcX9U{C?>Fl69wC3?VzWiC zcnRI^!SEeXM9~}Qzp^n=?39e60`%`R2CJ9Q?I$p3GNy`*nWBo_ka46U#bM?u2H(W* z9?x2BCbH1q%c6PJlm!K+bwe4^UPHG?vm}lP-~hh#WJLX5xpudr0st|sLCdYKCVvpa z!Q-#5Uq8*?%BswZ(iU~D^p&pi(rR<1OYU?w>Nbg}S+DALZb6$LNE6N>uz1Ay&yU0W0oem#7{f_FNATiTNSm#41&N z^j6s^IbUHwjGo#Wl5fb*!)5AH#fC%;hGf}yfy3LW&n|S)3OGZUYP0BfTVS>Lw5^-Es?V<< zH?=xEu#ac8(l~b}i?57r4(~MSO19ExvTaRyHgC1{TN`jbwgI(o@Xq*M#9Sp* z$l{Im5zzNNxMc<0Ro}<`z{$tjnA-S{P&2JXU@tbJB(iDrO!-~=9^@!9c>8<;H4&xq zJuC_e(OZ4(<1TC#f{2-%YLlY%&Q#9ixmGK7)<1ezVYa|3yr6D~aoL9f1^WvO1De6d z8KaCQ_bJb40$)n`eZ~ijQx5vD6DL99_nc>JKnJTGM$^Bu1T6kZc<0As(4i0L7hnG8 zv3>Y_PDU}lR?JKYp9v_QnpY?fgt(l`s@pO6B0~ZjN#PH|gv{_ygWaN8N>VzA46flP U6Xp*&`Se*A>qYRy1K%V60yYL&H~;_u literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/__pycache__/info.cpython-310.pyc b/lib/aci/intf/lacp/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45e4af1df65a72211d6aba5922efc9d0fc47fe18 GIT binary patch literal 2718 zcma)8&u`pB6rLH6z0StF*@mh#P*5dOR9AFCMf6aj2q;R4RE5$-9F|3viE{wjB2RnF7MiE8hf_N zOUnuN>ia?X&<}>oNk0wviQPyRc<bwe%c;xmA2U{gXb7yT&)B=ji9@=$iyu;MY>Au@qai`0M zALP+yly5D?{#sVnd^L!YPF@O?lma0(o`zf9dhBQU*Q6Mhb_ymu(otHkOc1(YG+>z-CaS(f~zd0q~3f8DjYwW=IF=lmJ#^$DFL$6If#u=04v?LEHEU z<8sebqA;!;u9;)|f*;8!H^$1gc_VAz$hMor_T_%N;`@!vwKRddymBgDshGzHD(b#0@Y`RYK_i%eU;%6|N z&7*O69Y04PZ@iASj<4Y2we{MvEaXtWs+<4I?-PdKoV0c9RtQQ&R?i_lx!|hDv&5!JUSa!dm;7*tIA(YX)R^ZX4`kqNA45@E26X) z;xzE%Y!SlPgv+Z80v&DG(Rb05@6$rcm3MS>50o7OGr7J+8diqVjiPFwW$fpe?KY2> z5qi*%DCPk6IW(9r!VxfC`ksKB>kC*g$G|CKett=B@L<<=`{ zZqL7s_lWG0J4KgE;txX4E9)MLi2{ltJD#^O^5gN0o}$yuP(yX9Q yUklyn8F^>pHn0s_+Vl3+X0w`GaSfEaXtiQpHFA-e(q0&!Xpty9{-42SjsE~$Oq0z3 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/__pycache__/instance.cpython-310.pyc b/lib/aci/intf/lacp/__pycache__/instance.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9d791198d87acc411901d96e092b49da429b271 GIT binary patch literal 1755 zcmaJ>UuzsU5SLckKet}H`O`Q!lyD^kx)eL~C6E$IjSHdRIH6bia9r8!t#lXJd%G7& zXL`pP3e9W2K%bhv75a(v+NXYm7TR=X&ra_e(_MBnnjMWszxj>o&CQs=^X$i6@oPxP zZ#Y?f7)(Bg&)fzfh@d5z&_1Q)5fPqXFNt73czsXs9!dS*!H1;O#brItp38D7b%CbU z=WW0}uu9UWg23{)4MzJ+aN)lseJ%nK!sv@gbYKhwg$*`ba+nv>FDqm7s*p#8w-On3 z41NG#o2@0sw4s8&q7BJB;elj=faHQeFm?o)2AHW5{ir;ToBA39Id)i&9fQB_+N93# zZ>C_|tSED1T(W9QJ;#kKN1DUJUx-FP|9o)p>EI+U)u2$Os0Tux%5tEL)TdGpN;Mqh zg&L^Jjs_STwB?cZrgIl%u$8h|=Hp2M5L+~$F(uS4fNk0OZ#upkShS` zsK&~eTOcCJqlhlwgnHj6UP3uf{^s7|&Kk&<$0?9!7tb2x-+)yB>l$F&F&VLKfW09< z(T2UIXS@N(XGC8|{(;^C3h;ge9v;jAeBna@U?ph54tb5th4se(IY7L)W$S4ToSfgA z)?)XrxmVRf;&|8eV_Vz2Jg8@tb@US#sENpJt|=ts;@n!ThBGTo$~Ck(aUDEaOJf+WfLsG+K(wWS&y6p}Z3sqQE zSGk@;zHKW+=6n<9*BZjQ@VU%ke5VlCryA~;^)9#%yP0heK>aWXmj$_y@gIxsS_v)* zkkX?x#P&rlWSNVzY*LF^iF%S{FJ^hU{G$`tWl60&s9}v(sDhoSu~jv;5?0foDIzhA l{OD$KqqQHU4DMhxY_H_ja#;u$JzVDS8Is*#u!LM={{V!NxJ>{6 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/__pycache__/interface.cpython-310.pyc b/lib/aci/intf/lacp/__pycache__/interface.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f8de999d66a9b9479ee9147b8f336102ec3b87f GIT binary patch literal 2581 zcmai0-EI>{6rS0gU2hgUqzwf^p}3W3Yf+NYmKGsY@zaJzLM|fQ)N-}jc*g0P^{z9! zMoqMlD#2}~K0?ABkI~nd+g|YsTtL4wPC^_Sb*(*f=I{8N^PTx-^F||NcpAaqyvsoA$?hU#yXx18>^iKEeCa^eB!djB zoRJLw?zR!7PYFq6$4@Exek;@zoC%^R$&xaPw1=)HH#GTU-23^uak0tF4f81JN3<{M zrEyW1_YRHplN5oO@a<5`F``guU)Nyg1=Ab;7`{TqzdV5A4^*wug1@j;N^R3n$Z~TpH!_%B5l{%cY|BQn76OWGLe@Heph92r}n zI!XZX7EJBKXRBr&)5Yfyg3mdE)6aiB=go29I93llj5u{5iua8WTc1s%daUKCV?+=i z9HZyxtb<52e6pqpkI+M?NRp${uQY&V9wN37O$mB8tMmI-zQh>nymIZB05zfBK}hqcP&Vdzx%4XW zbV8DM=zl6)atpS#gr&cMUt8A?qH7XwH}@!_xyK*P;kYQ9YpVJ71j}YW(M73S*sd>= zu=PoG30fkS()8hAJf(H6^;b0T0f}o6t=dt5YIFcVUHV&ELsg}(lAufHEjd|dA7QBY z0wM&_IQWUzLI@`W1wnsv);+bSIe!EKl?e1uiOquu?<2s)cR|-*!(_{8w_5=nJ)+7e zGGP=Ab2&~)uSe0wI8G-s_BPWWl6y9`??|Iu9&*__Po%2p>Z0qfAPx`Uc^C%ggO6v0 zooTmbP`AmNy|FtNpe^DWT|~|H7YPn4qF4?hHL}-z=i)JIlD*F%`vK57f6OX;GL^;T cLxCLoFON-da}xLWglIuf))^h_IzQ|F3ntTdsQ>@~ literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/__pycache__/lacp_adj_ep.cpython-310.pyc b/lib/aci/intf/lacp/__pycache__/lacp_adj_ep.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e73779b18e46aa6308017897ad83b65a07a8be67 GIT binary patch literal 1618 zcma)6L5~|X6t+E{$z+;MrB$g2h|&W~2~sw9lvbb?5K>u?+EYk1nv9*Svy+)w+p|@o z$*Ftoe`paGeg=1bfv=qS3rJAjo3Km50q|&^?dRvu_V+%!I5>z1l%HEarMgAPFWA{F z9&|p1-`oKsh@cr+(lMpvOCp%?E{X77urU+-3F-U4LJa9s7iGmfK9yN1b&9Utat-(q zcqJKAL122j0i$D2aN%E)F&B|&iSUw+eL(^GhHF1g((*I0_`Ezx*$yDK5%VGZ<^wR6 zEND#yeMxH)Gr_=mf`H|X^#uVu?*z6P;5L;Qx3eqgexMQ0d5?>^^I+KBS{5-5$B9_P zvW(L#F=qVMKfE)QS*cxj-`!`98=1{C2h1OdMy7uoJ^W;HmSk#@Dw7ryAunV$QAX+u zsVAA5PLfnjRBmSzT(&WPt$kdsTo}hHS2m7)z%n72E)C#|==$)QpyR8cJ)&?1ZlodV z7#efP=J#~N6xn!+)Sh4?QnN?oS-9aft$7c8H6M}lPVH?eYrBIawdz9I)fZVZH;#$i zd1rFvc%Ce!<7J_(3(aks zc}HgN{);!P6O7VoWlPm&2Aev5GHrIKUzy_^J53jAr+7Y=pJIDKn_7+1T|D3DBw6jRrDaJSge+mLV2~T zkW^3!@~OGz9h%+jV z*d9I@U&3GC0l^8UC7IGbrQ|W;9`|1n?*HiZJ^kx|Fs zUHH3f4Vlmt<@7aOk<8;BNS_msj1vgvpF^f0W-56h?3e z^d!0TC0Y60J0UCYEAoAO$yRj54qa;vkOn%y!sK#>Wn;>G! z;+V#?O`BemGS>W?dCR*yaDF&KfwbC;E8ub<*$T)tAtV0)0A7)w=*oXX0a_s1oTwW} zH_#oF0PJVr;eidX^8lcSlc0r%8fKZiG&mg03dEfnVmht8Rm>Vh|ggLx>JNU?U8V zO5z-|DxV7b(QXm+e?h-?1+q^dwCg{Q;*ZhrFBZc5Hf9WvXY?iw--c{?=l_x4VKlNC zIpG+M566blFnhpk1Z~~z?g8Np3gYwdbwuIKa$o`w$U4dL}nw z*btoOYM3v(xUgPEQyktFiue>D}+7p$&{QrLc{8#f2(m zC2TlTVkCdC(PXZT94*u>xD;xKei_mk-j2p}k=3p*Y{F$>WL@QI0r|Qni1oWmY)~r* zYoq5Phxtk&Zp;)sC%gQA0JrG_5J3AVjMfF&$mEY@XQu=o2$0hAG{VM3E@YWavTR!O zIV7LiW|qB}=jD1wHQ|;uwLV4d7zK9TmcS-e*h*MUjhit^XdJ}*&3(6ip8D|Q%AtFK Z-OAQ!7tHl}e6r5r5t3bFuqL_g{{zM7wiEyW literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/__pycache__/lacp_stats.cpython-310.pyc b/lib/aci/intf/lacp/__pycache__/lacp_stats.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c22f189ef6324608f22885eea1c78ba0e4f5bb74 GIT binary patch literal 1513 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 bkJl@xyv1RYo1apelWGStyO;?`urL4sXn7_{ literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/instance/__pycache__/api.cpython-310.pyc b/lib/aci/intf/lacp/instance/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4540d84adbd36d0be911df5a917d5091d8fa488 GIT binary patch literal 1269 zcmaJBO;6N7bY?p3ma+&T2E};51BX2T;cC!8I2fWKCd7nnnoNeyEEc-$I@2YxDJQvl z^bSY=(p)|H7feLoYj<%q;56^ed-J~EyiPGU7ZF&mzg#L25b_O~>E!{l4PX}my&{Sz zdI|7}b%|mJq~j%U{?}r_Z3Eb+fHdh+MY>E;#V$$LQ=a0mbLE3=;2!Vgr8Yg8=r=MM z?B%wUd7^g)X+ptxvXDlvy8sr`O-V%ruHW&Q@&bZZC?<+AJ^nbkA zeIB36ERB=YCPl3Dna<+WYICMdoTW#xOwu^b%U+D0fNBzn7rd8A<~RnpQ!}KC=s6 zaYcsIY*xI{*g`qGf_7Hk64JHRH8`Ho2SoX|5&Vi=@yfrZ7eN((Ct~($dtU{rg;v;1 zkc7)b&76AX@Kzd4NoPUY24Dbl%i~D@%_M*d#<|s%c+>fH9_)|&RlB}wyCL=+?;mb% zzBoG3Nh#n0VJpmNb|M7L(MnkiimW(3-xw5XZPjk%h0?fBl-$E(T?*u;Ct?)syxm*r z$u!fd8=dC=2|c|2~44zL3xr%Yn`u+DU4gN|5$)4oDvs6H6m56h26)G$N3EyRbR w%o>S-2dF7vswn(_O%px*B?a^Y4J>t$_;x3)-r12PXg)Bpeg literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/instance/__pycache__/info.cpython-310.pyc b/lib/aci/intf/lacp/instance/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4d6347dee60c1ec5fdcea1fdccbec77a340f576 GIT binary patch literal 1096 zcmb7DUu)Dr5Z`~fizO9X{KH9~iZ7v1e3nuQEtCU2#e0j9kY+X|HkVvCxk5`01p6_3 zu)g&R_+j?dZ{dSDlX%tI_Q44|`*_q#F%jM-IhVuE_J2;n&eJA5@K_A<}QLUod zXTX4;324c*7nV|og2()%^RL@Xp7I0vJ01o1u1rj7EoE13G!`Xp8=5Xy`Sk&62 zaiU+w$#hs$bzCHRSfpjbG0Q>-)7ZsPDOAA5?2?Zzna{1NbeXQNdofJ1;*H5l+i&5xwgQU4EvMR$JLpxX)vGw6 zUSH4Z>8v(=tkL#$5g+6ltg~;lF06d3p(WLK40U7gPvRmz)DV>iA9PY%b)-)#tB5)) z5&yXcLk!r*hq{i4W~8*E89`doTJ;o_%a!Z$?(?|#=n0Q2<^5FR?D^e{-<~v~Utl3r z?G^v)Xf*5#Lte#&m`mi0&6x4%FG4?Wt{qNB(zMbV^$Sx(rCqT^YdcPpkx uwNSO@5vi+p(IH~qES^(ajEk4xO7BVQ9r?VSZ`)?wt?tNe+TT8mRrU+Hj0Tqg literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/instance/__pycache__/main.cpython-310.pyc b/lib/aci/intf/lacp/instance/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e82c2af1ee9dc2bc1cc0e07976580e02c9c2e7d7 GIT binary patch literal 654 zcmaJ;u};G<5Ix6fsj8LK@a2tHfPcQFPDk{HNILWswK338fH z0#_iZ3^yP{MHGDrlTdbUAnJZ&4@9IM&5KIeOr+{sq|15XDp92Ba;dR)y0=reRT!cf60d4@M!stUG90*)h# zh+5BD_c+&ut~j^86J>`^nd}|x0j58b**UuxMzd7Av}97Pm0{W`yH=JNeaA$qnJ%h~ z8QdRHdjOUTUBt^r>yO+;cOiy8IV4Zxy=%l<6${)HB^4r9oY#HM^HQ#i#{HKE zW^f~MC-jiRdLqx-F!o?TnlFo}lZ;VsjCy0QH}-lFwR&T*)Xh1Pvwwcl_;k&cnvpxi X{#4ep*S(8Y@5Dca^P3M)!U_EaJbIik literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/instance/api.py b/lib/aci/intf/lacp/instance/api.py new file mode 100644 index 00000000..43f710ca --- /dev/null +++ b/lib/aci/intf/lacp/instance/api.py @@ -0,0 +1,58 @@ +class InterfaceLacpInstanceApi(): + def __init__(self): + self.lacp_instance_mo = {} + + def get_lacp_instance_mo(self, pod_id, node_id): + key = '%s.%s' % (pod_id, node_id) + if key in self.lacp_instance_mo: + return self.lacp_instance_mo[key] + + cache = self.get_object_cache( + 'lacpInst', + object_selector=key + ) + if cache is not None: + self.lacp_instance_mo[key] = cache + self.log.apic_mo( + 'lacpInst.%s' % (key), + self.lacp_instance_mo[key] + ) + return self.lacp_instance_mo[key] + + class_name = 'topology/pod-%s/node-%s/lacpInst' % ( + pod_id, + node_id + ) + + managed_objects = self.get_class( + class_name + ) + + if managed_objects is None: + self.log.error( + 'get_lacp_instance_mo', + 'API failed' + ) + return None + + if managed_objects['totalCount'] != '1': + self.log.error( + 'get_lacp_instance_mo', + 'Unexpected object count' + ) + return None + + self.lacp_instance_mo[key] = managed_objects['imdata'][0]['lacpInst']['attributes'] + + self.log.apic_mo( + 'lacpInst.%s' % (key), + self.lacp_instance_mo[key] + ) + + self.set_object_cache( + 'lacpInst', + self.lacp_instance_mo[key], + object_selector=key + ) + + return self.lacp_instance_mo[key] diff --git a/lib/aci/intf/lacp/instance/info.py b/lib/aci/intf/lacp/instance/info.py new file mode 100644 index 00000000..3bb5b37b --- /dev/null +++ b/lib/aci/intf/lacp/instance/info.py @@ -0,0 +1,33 @@ +class InterfaceLacpInstanceInfo(): + def __init__(self): + pass + + def get_lacp_instance_info(self, managed_object): + keys = [ + 'adminPrio', + 'adminSt', + 'dn', + 'operPrio', + 'sysMac' + ] + + info = {} + info['__Output'] = {} + for key in keys: + info[key] = None + if key in managed_object: + info[key] = managed_object[key] + + if info['adminSt'] == 'enabled': + info['__Output']['adminSt'] = 'Green' + else: + info['__Output']['adminSt'] = 'Red' + + return info + + def get_lacp_instance(self, pod_id, node_id): + managed_object = self.get_lacp_instance_mo(pod_id, node_id) + if managed_object is None: + return None + + return self.get_lacp_instance_info(managed_object) diff --git a/lib/aci/intf/lacp/instance/main.py b/lib/aci/intf/lacp/instance/main.py new file mode 100644 index 00000000..71b05984 --- /dev/null +++ b/lib/aci/intf/lacp/instance/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.lacp.instance.api import InterfaceLacpInstanceApi +from lib.aci.intf.lacp.instance.info import InterfaceLacpInstanceInfo + + +class InterfaceLacpInstance(InterfaceLacpInstanceApi, InterfaceLacpInstanceInfo): + def __init__(self): + InterfaceLacpInstanceApi.__init__(self) + InterfaceLacpInstanceInfo.__init__(self) diff --git a/lib/aci/intf/lacp/main.py b/lib/aci/intf/lacp/main.py new file mode 100644 index 00000000..a631e97c --- /dev/null +++ b/lib/aci/intf/lacp/main.py @@ -0,0 +1,10 @@ +from lib.aci.intf.lacp.stats.main import InterfaceLacpStats +from lib.aci.intf.lacp.api import InterfaceLacpApi +from lib.aci.intf.lacp.info import InterfaceLacpInfo + + +class InterfaceLacp(InterfaceLacpStats, InterfaceLacpApi, InterfaceLacpInfo): + def __init__(self): + InterfaceLacpStats.__init__(self) + InterfaceLacpApi.__init__(self) + InterfaceLacpInfo.__init__(self) diff --git a/lib/aci/intf/lacp/output.py b/lib/aci/intf/lacp/output.py new file mode 100644 index 00000000..ff987573 --- /dev/null +++ b/lib/aci/intf/lacp/output.py @@ -0,0 +1,28 @@ +class InterfaceLacpOutput(): + def __init__(self): + pass + + def print_lacp_instance(self, settings): + order = [ + 'adminSt', + 'adminPrio', + 'operPrio', + 'sysMac' + ] + + headers = [ + 'Admin State', + 'Admin Priority', + 'Oper Priority', + 'Sys MAC' + ] + + self.my_output.dictionary( + settings, + title='LACP Settings', + underline=True, + prefix="- ", + justify=True, + keys=order, + title_keys=headers + ) diff --git a/lib/aci/intf/lacp/stats/__init__.py b/lib/aci/intf/lacp/stats/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/lacp/stats/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/lacp/stats/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d253d149b808fc4632b6870db92310e62fd6e001 GIT binary patch literal 156 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w>*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCMPkuAf~t^v7|UAK0Y%qvm`!V Zub}c4hfQvNN@-529mwEfCLqDW008RxB_IF* literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/stats/__pycache__/api.cpython-310.pyc b/lib/aci/intf/lacp/stats/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..551e0f9c0c006eff01c3274e406e842f407e73f2 GIT binary patch literal 1354 zcmaJ>PfHvz6i+gl*>SWgLM_r#daIuB=6xA<27r@BQ-rP4Wj1A_C*vt1t3rK*$edCWi;iHcYz! z%Nrtzq?a&1vlfx;fHb`n&hHEc+%`=61QtbFRFW2xRI*Fb@}ws@>|FX_8@Pvi-9nkR zNYz`B_6`bB*qxqEDOipN(g?W=)1t4Mlq3O10D$f{se7cy7)b^oiA9v;GzSs4Dr$PO^SGDZ62t}+q^yL5 zePtKC>BE>>8>q?FV6bP3|0zZI;z;R{lmg2^}J?RM(j$O32V0|E&vDo%FsOqGpPHh zL+^IiFxq*)_pB{+rlbq>sT759kthnI5Br6(&Cp<*xOv1F#gmHkNI4H2cMWK)6q?j6 zp!`&HMMuezp7WJ4xp9H$^;B27dHWAUbIM?Exd5V1v~&#&9|`Y74V+(JvmmuCbhp#j z_6VT6;#8Rst>*6DX5H-FgX(Xo7wlLwZe9BkxEUJ3#~GuH1~(y(XaHYG`Ar0e^(p7K zaz6k)22#!=R@(-D0$y8ipMfRd{EmX*`u#uCe=4xw^zpyMz>>s831n0DGo)vdc}%;aAl literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/stats/__pycache__/info.cpython-310.pyc b/lib/aci/intf/lacp/stats/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e1041358705c7bf9ed860268b8fe5e1bd2e6ea7 GIT binary patch literal 1797 zcma)7-EJF26rP!#U2m3kVhXZwff9s@uv*d^xS&K(DM+XiGN|FoxLR#@*3s6#nOR4w zwU&_D3mzlkjw{}Q$Cz8L@(Q_V`OYMEowP+AYtEd%IeYe-Z@iOwJz^Mpdw;0EL&p9k zV|{oq?qQm15I-`-6n}>KRCJjV`>gF{@Lw7N);&yf8zN_2u2@$nuEaCe^^~V1R;hdy zVD(i^g;)c%fm)Gm-XE8_?x$J)Q<_cp%d|B2$NfphQEE9zr)TV88fv~^6-&?=D)3I5 z+xLrQkz|M}iJ>y^OOp@#e=#kw=j_|PyS+g=EP7dCvPnRPjo-E_{b^N!ebDJ>^Ocq`swm+TCKx+hr~m ztYY7+Vgagos@7u1T!klGZBRWGUGcu-yz!d1ex8e6o6uYrYK!6kztL%LSfR!?%C-Jw zP(H|xR5u!>dXQ_U*DrK4y<+a?<8qnl^x9O-Tn;JZu@RJCi&6gbtR(ocOlPGAW7#Pt zv)+ST=?!SQ264vkoDxrLFrBERP^W~wt&Jxthc%Z)|I6Rb_(L1Nq)MUM!g{c+Z>Gbd zZ2OwHZ#PHjI6cT!GI{hk&q^x?`4eL$QNeo99i7ev9jg8KATPm=3mUI65YGODQp`3) z$YmVz^Iy!x?+p=inoY0Cx49JauiikX|1FB@(r}u9qbIOO#fbp0-g7KGipd=N%ADMXiO4gDLJ9%8P- z|2eYF7Z8HeFL)lw2w;;gpNCTNNQ4|7ioOV5M8W*)w>gGao|92q%Ry(by6bmg05e7> zv4(R@I6HJ>pbJD5Z?S>U*DGHzj@aR*`-2l5{T?c`xxPWmD@akWyS1X9aip`GD~GeM zg7(2B(AF^f9@R_(A_h|>55dn6z({X?=WSqFtJG=N=-Q6cQJy3=N|Mn;&4#4MNpd(# zhvyMZSUD27_tV>CzC2>5(G}8kxoNr&K#1EEdf}&W%lYvQaO>+f+Hm*$$=|u%M9gdK EKcwBbZ~y=R literal 0 HcmV?d00001 diff --git a/lib/aci/intf/lacp/stats/__pycache__/main.cpython-310.pyc b/lib/aci/intf/lacp/stats/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d215802b55d497415a193a915459eb6aa2cc98b GIT binary patch literal 633 zcmZ`$!AiqG5S`7YT1x9dRD}8ix#R;>q@o}N>BU=ISk~+Y7B@-VO$Ei9{(^Ts`VIa` zuAck_PtHV?LUCY*nas|-_a^mdGyt^c_e*`s06wT#wjLG}^pIlEpqYb`WsFfCxv1nB zXK)6Z>-Y(DY?$GXaTe>|1te>qI0Ff5x2IKOe4%o4uJZXsqndC$x7gTOZA`18&S`Gh zA}l88VGDzSjA_Us&2;nx8P^=K;&yX&SB{GQjB<{Cf*y7;H1NV6;1#tr(Ql>!cd=Q* zJwdj8DQ#sNDLqXh;W!vqyn$cG^6TJaUtB9^MQ%f03vF(V6E+xsYrJswN~qilTQ!An zC|d;5ElOppbbjaQuxscc#xP(T?0&o|ApOOkp+F>4snST<4x}t=y>OHdrMy`v_tWXN zcI1{q9|1g}5M&3}hau~}%#vO 0: + info['__Output']['errPktRcvd'] = 'Red' + + if int(info['pduTimeOut']) > 0: + info['__Output']['pduTimeOut'] = 'Red' + + # "dn": "topology/pod-1/node-205/sys/lacp/inst/if-[eth1/27]/ifstats" + info['pod_id'] = info['dn'].split('/')[1] + info['node_id'] = info['dn'].split('/')[2] + info['interface_id'] = info['dn'].split('if-[')[1].split(']')[0] + + return info + + def get_interfaces_lacp_stats_info(self, pod_id, node_id): + key = '%s.%s' % ( + pod_id, + node_id + ) + if key in self.interface_lacp_stats: + return self.interface_lacp_stats[key] + + managed_objects = self.get_interface_lacp_stats_mo( + pod_id, + node_id + ) + if managed_objects is None: + return None + + self.interface_lacp_stats[key] = [] + for managed_object in managed_objects: + self.interface_lacp_stats[key].append( + self.get_interface_lacp_stats_info( + managed_object + ) + ) + + return self.interface_lacp_stats[key] + + def get_interface_lacp_stats(self, pod_id, node_id, interface_id): + interfaces_info = self.get_interfaces_lacp_stats_info(pod_id, node_id) + if interfaces_info is None: + return None + + for interface_info in interfaces_info: + if interface_id == interface_info['interface_id']: + return interface_info + + return None diff --git a/lib/aci/intf/lacp/stats/main.py b/lib/aci/intf/lacp/stats/main.py new file mode 100644 index 00000000..092e15aa --- /dev/null +++ b/lib/aci/intf/lacp/stats/main.py @@ -0,0 +1,8 @@ +from lib.aci.intf.lacp.stats.api import InterfaceLacpStatsApi +from lib.aci.intf.lacp.stats.info import InterfaceLacpStatsInfo + + +class InterfaceLacpStats(InterfaceLacpStatsApi, InterfaceLacpStatsInfo): + def __init__(self): + InterfaceLacpStatsApi.__init__(self) + InterfaceLacpStatsInfo.__init__(self) diff --git a/lib/aci/intf/loopback/__init__.py b/lib/aci/intf/loopback/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/aci/intf/loopback/__pycache__/__init__.cpython-310.pyc b/lib/aci/intf/loopback/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3fb0dc25075b649348c67b6065766cf0c163ee8 GIT binary patch literal 154 zcmd1j<>g`k0%qm|$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w(*(xSGF()%7 zIkPx9KPDx$EHx)4vpBV=EVU>mCo?G~F*!3PGp{5qCMQ3?ASp39J0?CpGcU6wK3=b& X@)n0pZhlH>PO2Tq*kUFi!NLFlmKh{I literal 0 HcmV?d00001 diff --git a/lib/aci/intf/loopback/__pycache__/api.cpython-310.pyc b/lib/aci/intf/loopback/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93e96de0dd73deae18da1148e732a13c7cbbe519 GIT binary patch literal 1517 zcmaJ>UvK0z5VsR2n@!U{I-x@=fdmglT5;_O@q(a*I~564Ix56TJggR3+1T6lHJhY% zQqfiRiF@Tcw2wUUb^HpS0_hHBoZYfT1xFr_$20Sr8BbhpZ^s12S6}=l{)hGnnQ*Ad-xzAR|vu;k_m!U-*K-%0vLR zp?&AHsHL8!nS4=})g;X>o>wZPV7MO0qsJ4N218Y(B^=@adwMpcc2})k@O;AOC5V`j z`Se$!8L0pH*~#bQi!@i`Oqr}43wb5;u`*I$Nj=WhWSnMd3_hmgd=NSg!TJXhWDT^dm?_(3ZB|)O$>pe(Sg76}cjM57*WoKtjMl znOZ2)FW!>1Opu1^Pg>S#9O1cl0|jjT$H+UYTaVuHFNp~55CRb{L(pPv(1xN19(!#M zJQDq_^Am_j^wAnidA{-i7(EdW$k*h@kC#y!32#8e)_^SgEx8FHwn!wme%lubMzfM^ zJIVHjWXDN%T*NNQn_k<$rIcL$@IN^K+Bz#&1AjBK;qKWY*f)p!X4KC=eKGmI7N=9Z z{&Mn4W;KT^ho#huN7cmY0pvQb3@=Wh3>q z9h}P=+G^GHeBE=De&AR|He%+{PTLE1Deng!9WL&AStguY}8RBWrxT kv`ZbIK%55EA`;QW*SLq*&#ey`+32Xl`qEiqM?4~b0|?TJrT_o{ literal 0 HcmV?d00001 diff --git a/lib/aci/intf/loopback/__pycache__/info.cpython-310.pyc b/lib/aci/intf/loopback/__pycache__/info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e671da76ced7fd9feb9763592e174c4c129495b GIT binary patch literal 5293 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 literal 0 HcmV?d00001 diff --git a/lib/aci/intf/loopback/__pycache__/summary.cpython-310.pyc b/lib/aci/intf/loopback/__pycache__/summary.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ace2ca8261d05d7d63905c6aeb341453f12965b GIT binary patch literal 1104 zcmaJ=Uu)Dr5TE^%TzX!i9EEzKqHpHG;*$^M5TykX%K1=yIU>t7o7UJ|l5UbpOA3O0 z^*gkWegi*%pJHEq>Q@jHXOf&;AL=eUJ3Bk`o7tJ!Y<0B{IG(=x5k8RsKk2YM1Rh@E zDjp)ypjiTQHf0Q6gXUUXfEHi)lxw*MzH^N_;4|A#vP1PDO7h5rBw8Lf03(<(4QTE* zU~DS1)XoJ=rDh1&vv=R5Wn>O!VYHiN`Ti_C+Nu7HeM^GO=PeJG262KDV-nk^_S|fNx+t+