Files
VPNaaS-Migrator/ipsec_migrator/__pycache__/audit.cpython-311.pyc
T

220 lines
37 KiB
Plaintext
Raw Normal View History

2026-07-21 15:05:52 +03:00
§
í/_j{ãó~dZddlmZddlZddlZddlZddlZddlmZmZddl m
Z
m Z ddl m
Z
ddl mZdd lmZdd
lmZdd lmZejd ¦«ZdPdZdQdZdRdZdSdZdZdTdZdUd!„ZdVd$„ZdWd+„ZdXd.„Z dYd0„Z!dZd6„Z"d[d7„Z#dSd8„Z$dSd9„Z%dSd:„Z&dSd;„Z'dSd<„Z(dSd=„Z)d\d>„Z*d]dC„Z+d^dF„Z,d_dH„Z-d`dK„Z.dadM„Z/dbdO„Z0dS)caSTAGE 1: collecting Neutron VPNaaS configuration into an audit JSON file,
plus the --from-audit path that reconstructs the same in-memory state from a
previously written audit file instead of re-querying OpenStack.
This module owns the audit JSON schema definition (to_audit_dict /
load_from_audit_json), so it's defined exactly once and shared by both the
write path (STEP 10) and the read path (--from-audit).
é)Ú annotationsN)ÚdatetimeÚtimezoneé)Ú
keystone_authÚneutron_client)ÚMigrationState)Ú
NeutronClient)Ú
redact_psk)Ú SprutClient)Úprint_kv_tablez^[0-9a-fA-F-]{36}$ÚreturnÚstrcó.tj|d¬¦«S)©Úindent)ÚjsonÚdumps)Úobjs ú,/root/vkcloud/vpnaas/ipsec_migrator/audit.pyÚ_dumprsÝ Œ:c !Ð ÚNonecó$td¦«dS)NzV**************************************************************************************)Úprint©rrÚ_rulersÝ ˆ(O„O€O€O€OrÚ input_csvú&tuple[dict[str, str], dict[str, dict]]cóòtd|¦«i}i} t|d¬¦«}nL#t$r?}td|d|tj¬¦«tjd¦«Yd}~nd}~wwxYw|5|D]ì}| d¦« d ¦«}d
| d ¦«D¦«}|r|d nd
}t|¦«dkr|dnd
} t|¦«dkr|dnd
}
t|¦«dkr|dnd
} |sŒ¯| ||<| s6i} |
r|
| d<| r| | d<| r| ||<td|dtj¬¦«Œí ddd¦«n #1swxYwYtd¦«t¦«td| 
¦«D¦«dd¦«t¦«td¦«t¦«||fS)Nz&Executing STEP 1: Reading config file úutf-8©Úencodingz"Error: could not open input file 'z': ©Úfilerú
ú
có6g|]}| ¦«ŒSr)Ústrip)Ú.0Úfs rú
<listcomp>z"read_input_csv.<locals>.<listcomp>8s Ð9 Aa—ggi”iÐ9rú,rÚréÚavailability_zoneÚflavorúNeutron router 'uI' has no advanced router — a DC Router will be created for it in Sprut.zReading values from config:cói|]
\}}||pdŒ S)z<to be created>r)r+Úvs rú
<dictcomp>z"read_input_csv.<locals>.<dictcomp>Rs$Ш¨AˆˆQÐ
ArzNeutron routerzAdvanced RouterzSTEP 1 complete (config read)) rÚopenÚOSErrorÚsysÚstderrÚexitÚrstripÚsplitÚlenr
Úitemsr)
rÚmappingÚcreation_hintsÚhandleÚexcÚraw_lineÚlineÚfieldsÚneutron_routerÚadvanced_routerr1r2Úhints
rÚread_input_csvrK*Ý Ð
>°9Ð
 €GØ&(€NðÝi¨'ЈøÝ ðððÝ
ÐF°9ÐÐFÍSÌZÐ Œ Œ ˆ ˆ ˆ ˆ ˆ ˆ øøøøðøøøð
ððØð ð ˆHØ—?’? 4ÑÑ5ˆDدª°C©¬Ð9ˆFØ*0Ð8˜V AœY˜Y°bˆNÝ+.¨v©;¬;¸ª?¨?˜f Qœi˜iÀˆOÝ-0°©[¬[¸1ª_¨_    À"Ð Ý"% f¡+¤+°¢/ /V˜A”YY°rˆ
ØØ&5ˆG 
ØØBØ0Að,Ø%+D˜ð:Ø59N ðC CðCðCåœðñôðøð' ðððñôððððððøøøððððõ4
Ð
 G„G€GÝØ·²±´ÐAÐCSÐUfñôðõ
G„G€Gå Ð
 G„G€GØ  "s'˜*ª
A3´5A.Á.A3Á8C0E5Å5E9Å<E9Ústater Úncr
có`td¦«tj|¦«}d|D¦«|_t |j¦«}|jD]@}||vr'td|d¦«t
jd¦«td|d¦«ŒAtd¦«t¦«dS) Nz*Executing STEP 2: Checking Neutron routerscó i|] }|d|Œ S©Úidr©r+Úentrys rr7z/check_neutron_routers_exist.<locals>.<dictcomp>bsÐ!JÐ!JÐ!J¸ ¤+¨uÐ!JÐ!JÐ!JrzError: Neutron router ID z not found in OpenStack tenant.rzNeutron router ID z exists in OpenStack tenant.z)STEP 2 complete (Neutron routers checked)) rrÚ router_listÚneutron_router_by_idÚsetÚneutron_to_adv_routerr:r<r)rLrMÚlistingÚ existing_idsÚneutron_router_ids rÚcheck_neutron_routers_existr[^Ý Ð
ÔÑ,€GØ!JÐ!JÀ'Ð!JÑ!JÔ!J€EÔÝ2€LàTðTÐØ  LÐ 
Ð`Ð.?Ð ŒHQ‰KŒKˆKÝ
ÐRÐ#4Ð Ð
 G„G€G€G€Gr)ÚbasicÚstandardÚadvancedrZÚ
field_namecó²tj ¦«s8td|d|dtj¬¦«tjd¦«dSdS)Error: router 'z!' needs a DC Router created but 'z…' isn't set in the CSV and stdin is not interactive. Add it as a CSV column (3rd=availability_zone, 4th=flavor) or run interactively.r%r)r:ÚstdinÚisattyrr;r<)rZr_s rÚ_require_interactiverdts}Ý Œ9× Ò Ñ Ô ðÝ
ð
HÐ
Hð
HÐR\ð
Hð
Hð
Hõð 
ñ
ô
ð
õ Œ Œ ˆ ˆ ˆ ððrÚhintsúdict[str, dict]útuple[str, str]cóÞ| |i¦«}| d¦«pd}|s9t|d¦«|s'td|d¦« ¦«}|¯'| d¦«pd}|tvrbt|d¦«|tvrItd|dd t¦«d¦« ¦«}|tv°I||fS) Nr1r/zRouter 'z': enter availability_zone: r2z': enter flavor (ú/z): )ÚgetrdÚinputr*Ú _DC_FLAVORSÚjoin)rZrerJr1r2s rÚ_resolve_az_flavorrnsØ 9Š9ÐÑ +€DàŸšÐ!4ÑÐØ ðjÝÐ.Ð0CÑ jÝ %Ð&`Ð1BÐ&`Ð&`Ð&`Ñ aÔ a× gÒ gÑ iÔ iÐ ð jðXŠX
Ô
Ð
% 2€FØ
•[Ð Ð ÝÐÑÐdÐ&7ÐdÈ#Ï(Ê(ÕS^ÑJ_ÔJ_Ðe×mˆ ˜ $rÚ sprut_clientr có | d¦« dg¦«}d|D¦«}|s/tdtj¬¦«tjd¦«t |¦«dkrHtdt |¦«d|d  d
¦«d tj¬¦«|d d
S) Locates Sprut's public network (name "internet"/"Internet"), for
attaching a DC Router's public interface. Looked up once per run,
lazily, only when at least one router actually needs creation.
Deliberately does not resolve or send a subnet_id: Sprut rejects
dc_interface creation with subnet_id set for an external network
("Specifying subnet_id or ip_address for external network is
restricted", confirmed against the real API) -- it auto-assigns one.
z/networks?limit=10000Únetworkscólg|]1}| d¦«pd ¦«dk¯/|Œ2S)Únamer/Úinternet)rjÚlower)r+Úns rr-z*_find_internet_network.<locals>.<listcomp>œs=ÐRQ q§u¢u¨V¡}¤}Ð':¸×&AÒ&AÑ&CÔ&CÀzÒ&QÐ&QˆqÐ&QÐ&QÐ&QrzQError: no Sprut network named 'Internet' found (needed for the public interface).r%rz Warning: z? Sprut networks named 'Internet' found -- using the first one (rrQz).)rjrr:r;r<r?)rorqÚmatchess rÚ_find_internet_networkrxð×ÒÐ 7Ñ8×<¸ÑL€HØR˜(ÐR€GØ ðÝ
ÐaÕhkÔhrÐ Œ Œ ˆ Ý
ˆ7|„|ÐÝ
ð
=˜G™ œ ð

=Ø$+¨A¤J§N¢N°4Ñ$8Ô$8ð


ð
ñ
ô
ð
ð
1Œ: ÐrrsÚ descriptionr1r2Úexisting_dc_routers_by_nameúdict[str, str]c óF| |¦«}|rtd|d|d¦«|Std|d|d|d¦«d||d ||d
œi}| d |¦«} |  d¦«pi d ¦«}|jr|sd
|}|S)Nz DC Router 'z' already exists in Sprut (id ú ) -- reusingzCreating DC Router 'z' in Sprut (az=z , flavor=z, enable_snat=true)Ú dc_routerT)r1r2Ú enable_snatrsryú/direct_connect/dc_routersrQzDRY-RUN-)rjrÚpostÚdry_run)
rZrsryr1r2rorzÚsprut_idÚ request_bodyÚresponses
rÚ_find_or_create_dc_routerr†©ð.¨tÑ4€HØðÝ
ÐV˜DÐЈå Ð
m Ð
mÐ6GÐ
mÐRXÐ
Ø!2ØØØØ 
ð
ð€Lð× Ò Ð!=¸|ÑL€HØ ˜[Ñ/¨R×4°TÑ:€HØÔð2 Hð1ˆØ €OrÚ dc_router_idÚ
network_idcóÌ| d¦« dg¦«}tˆˆfd|D¦«d¦«}|r1tdd| d¦«d¦«|dStd¦«d ‰|d
œi}| d|¦«}| d ¦«pi d¦«}|jr|sd }|S) Nz/direct_connect/dc_interfacesÚ
dc_interfacesc3ó€K|]8}| d¦«k¯| d¦«k¯4|VŒ9dS)r‡rˆrj)r+Úir‡rˆs €€rú <genexpr>z/_find_or_create_dc_interface.<locals>.<genexpr>ÍsQøèèÐlˆq §¢ nÑ 5Ô 5¸Ò EÐ EÈ!Ï%Ê%ÐP\ÑJ]ÔJ]ÐakÒJkÐJkˆÐJkÐJkÐJkÐJkÐlrz/Public interface already attached to DC Router z (id rQr}z=Attaching public interface (network 'Internet') to DC Router Ú dc_interface)r‡rˆrszDRY-RUN-iface-)rjÚnextrrr) r‡rˆrsroÚexistingÚmatchr„r…s `` rÚ_find_or_create_dc_interfacer“Ès3øø€ð×ÒÐ ?ÑDÀ_ÐVXÑY€HÝ Øl ñ
ô
€Eð
ðÝ
Ð ÐpÐSX×S\ÒS\Ð]aÑSbÔSbÐTŒ{Ðå Ð
XÈ,Ð
 Øð
ð
ð€Lð× Ò Ð!@À,ÑO€HØ ˜^Ñ×Ñ=€HØÔð3 Hð2 LÐ2ˆØ €OrÚinternet_network_idc ódt|||||||¦«}t|||d|¦«|||<|S)zÉCreates (or reuses, by name) a DC Router and attaches its public
interface. Shared by the fresh-collect path (STEP 3) and the
--from-audit path, which both need identical create-or-reuse logic.z-public)r†r“) rZrsryr1r2rorzr”s rÚ_ensure_dc_routerråsUõ˜4 Ð.?ÀÈÐWrñô€Hõ! Ð+>À4Ð@PÐ@PÐ@PÐR^Ñ_Ø(0Ð Ñ €OrÚtokenÚsprut_base_urlrÚboolÚ
audit_onlyc ó0td¦«t|||¦«}| d¦« dg¦«}d|D¦«}d|D¦«}d} |j ¦«D]û\}
} | r?| |vr'td| d¦«t jd¦«td | d
¦«ŒF|j |
i¦«} |  d ¦«p|
}
|  d ¦«pd
}t|
|j ¦«\}}|r#|
|||dœ|j
|
<td|
d¦«ŒÌ| €t|¦«} t|
|
|||||| ¦«|j|
<Œütd¦«t¦«|S)Nz+Executing STEP 3: Checking Advanced routersr€Ú
dc_routerscóh|]
}|dŒ SrPrrRs rú <setcomp>z/check_advanced_routers_exist.<locals>.<setcomp>
óÐ8 EE˜$”KÐ8rcóVi|]&}| d¦«¯|d|dŒ'S©rsrQrRs rr7z0check_advanced_routers_exist.<locals>.<dictcomp> ó4Ð`°uÈeÏiÊiÐX^ÑN_ÔN_Ð`˜˜
 u¨T¤{Ð`rúError: Advanced router ID z not found in SDN.rúAdvanced router ID ú exists in SDN.rsryr/)rsryr1r2r3zo': no advanced router -- recorded as pending DC Router creation in the audit (no Sprut writes in --audit-only).z*STEP 3 complete (Advanced routers checked))rr rjrWr@r:r<rUrnÚrouter_creation_hintsÚpending_dc_router_by_neutron_idrxrr)rLr—r˜rrorYÚexisting_by_namer”rZÚadvanced_router_idrHrsryr1r2s rÚcheck_advanced_routers_existrªsõ
Ð
˜~¨u°gÑ>€Là×!Ð">Ñ?×CÀLÐRTÑU€JØ8¨ZÐ8€LØ
Ðà&*Ðà16Ô1L×1RÒ1RÑ1TÔ1Tð&
ð&
ÑÐ ð ØÐÐYÐ3EИ Ý ÐKÐ(:Ð àÔ7Ð8IÈ2ÑNˆØ×! >Ð->ˆØ$×Ñ=¸2ˆ Ý$6Ð7HÈ%ÔJeÑ$fÔ$fј ð àØ*Ø%6Ø ð HðHˆ 1Ð2CÑ
ðUÐ#4ðUðUðUñ
ô
ð
ð
à Ð &Ý"8¸Ñ"FÔ"FÐ å9JØ Ø Ø Ø Ø Ø Ø Ø ñ :
ô :
ˆÔ#Ð$5Ñ
Ð
 G„G€GØ Ðrc óÊtd¦«| d¦« dg¦«}d|D¦«}d|D¦«}d}|j ¦«D]ö\}}|rK||vr3td|dtj¬ ¦«t jd
¦«td |d ¦«ŒR|j |¦«}|s3td
|dtj¬ ¦«t jd
¦«|t|¦«}t||d| dd¦«|d|d|||¦«|j|<Œ÷dS)aSRe-verifies advanced routers recorded in a --from-audit file still
exist in Sprut, since the audit may have been generated earlier. Also
creates any DC Router left pending by a prior --audit-only run, using
the name/description/az/flavor cached in that audit's
"pending_dc_router" block -- Neutron is never re-queried here.zBIssuing OpenStack token and re-checking advanced routers in SDN...r€cóh|]
}|dŒ SrPrrRs rz6recheck_advanced_routers_from_audit.<locals>.<setcomp>ErcóVi|]&}| d¦«¯|d|dŒ'SrRs rr7z7recheck_advanced_routers_from_audit.<locals>.<dictcomp>FrNr£z$ (from audit file) not found in SDN.r%rrazq' has no advanced_router_id and no pending_dc_router info in the audit file -- file is incompatible or corrupted.rsryr/r1r2)
rrjrWr@r:r;r<rxr) rLrorYr”rZÚpendings rÚ#recheck_advanced_routers_from_auditr¯<õ 
Ð
×!Ð">Ñ?×CÀLÐRTÑU€JØ8¨ZÐ8€LØ
Ðà&*Ðà16Ô1L×1RÒ1RÑ1TÔ1Tð 
ð 
ÑÐ ð ØÐØiÐ1CМðñôðõ˜ Ý ÐKÐ(:Ð àÔ7×;Ð<MÑNˆØð Ý ðaÐ"3ðaðaðaå”Zð
ñ
ô
ð
õ
ŒHQ‰KŒKˆ Ð &Ý"8¸Ñ"FÔ"FÐ å9JØ Ø FŒOØ KŠK˜
  Ð  Ø Ø Ø ñ :
ô :
ˆÔ#Ð$5Ñ6ð/ 
ð 
rcó†td¦«tj|¦«D]}||j|d<Œtd¦«|j ¦«D]D\}}td|¦«tdt |¦«¦«t¦«ŒEtd¦«t
¦«dS)Nz6Executing STEP 4: Collecting info about IPsec policiesrQzStored IPsec policies:ú Policy ID: ú Details: z1STEP 4 complete: Info about IPsec policies stored)rrÚipsec_policy_listÚneutron_ipsec_policy_by_idr@rr©rLrMÚdetailsÚ policy_ids rÚcollect_ipsec_policiesr¸rÝ Ð
3°BÑBðBˆØ:AˆÔ°¬Ñ Ð
>×ðш 
Ð'˜
Ð*™.œ.Ð
Œˆˆå Ð
 G„G€G€G€Grcó†td¦«tj|¦«D]}||j|d<Œtd¦«|j ¦«D]D\}}td|¦«tdt |¦«¦«t¦«ŒEtd¦«t
¦«dS)Nz4Executing STEP 5: Collecting info about IKE policiesrQzStored IKE policies:r±z/STEP 5 complete: Info about IKE policies stored)rrÚike_policy_listÚneutron_ike_policy_by_idr@rrs rÚcollect_ike_policiesr¼Ý Ð
1°"Ñ@ð@ˆØ8?ˆÔ& w¨t¤}Ñ Ð
Ñ<×ðш 
Ð'˜
Ð*™.œ.Ð
Œˆˆå Ð
 G„G€G€G€Grcó4td¦«tj|¦«D]i}|d}||j|<| d¦«dkr<td|d¦«| d¦«pgD]}t|¦«ŒŒjtd¦«|j ¦«D]D\}}td |¦«td
t
|¦«¦«t¦«ŒEtd ¦«t¦«dS) Nz7Executing STEP 6: Collecting info about Endpoint GroupsrQÚsdnÚsprutzEndpoint Group z6 has sdn 'sprut' with the following network addresses:Ú endpointszStored Endpoint Groups:zEndpoint Group ID: r²z2STEP 6 complete: Info about Endpoint Groups stored)rrÚendpoint_group_listÚneutron_endpoint_group_by_idrjr@rr)rLrMÚeg_idÚaddresss rÚcollect_endpoint_groupsrÅs,Ý Ð
5°bÑðˆØ˜
ˆØ4;ˆÔ*¨5Ñ ;Š; Ô  Ò Ða EÐ "Ÿ;š; 9°rð
ð
Ýg‘øå Ð
Ô<×ðˆˆwÝ
Ð+ 
Ð*™.œ.Ð
Œˆˆå Ð
 G„G€G€G€Grcó˜td¦«tj|¦«D]R}| d¦«pd}| d¦«rŒ/| d¦«|j|d<ŒStd¦«t
|jdd d
d ¬ ¦«t¦«td
¦«t¦«dS)Nz?Executing STEP 7: Creating a map of Subnet ID to Subnet Addressrsr/z
ext-subnetÚcidrrQz+Stored Subnet ID to Subnet Address mapping:z Subnet IDzSubnet Addressé$é)Úwidth1Úwidth2z8STEP 7 complete: Subnet ID to Subnet Address map created)rrÚ subnet_listrjÚ
startswithÚsubnet_id_to_subnet_addressr
r)rLrMrSrss rÚcollect_subnetsrÏ«Ý Ð
Ô+¨BÑKðKˆØyŠy˜Ñ Ô Ð& BˆØ ?Š?˜  Ø Ø9>¿ºÀ6Ñ9JÔ9JˆÔ)¨%°¬+Ñ Ð
4°kÐCSÐ\^ÐgiÐ G„G€Gå Ð
 G„G€G€G€Grcó6td¦«tj|¦«}|D]H}|d}|d}|j ||¦«|j ||¦«ŒItd¦«t
|j¦«D]}||jvr|j|=Œt|jdd¦«td¦«|D]}|d|j |d<Œt|j dd¦«td¦«t¦«dS) Nz4Executing STEP 8: Collecting info about vpn servicesÚ router_idrQz(Remove router_ids that are not in configz Router IDzVPN service IDzbuild backwards dictionaryz7STEP 8 complete (Router ID to VPN Service ID map built)) rrÚvpn_service_listÚrouter_id_to_vpn_service_idÚ
setdefaultÚneutron_vpn_service_by_idÚlistrWr
Úvpn_service_id_to_router_idr)rLrMrXrSÚvpn_ids rÚcollect_vpn_servicesrÙÂs>Ý Ð
Ô-¨bÑ1€GàðBðBˆØ˜+Ô&ˆ Øt”ˆØ
Ô4°YÀÑ
Ô'×2°6¸ Ð