
    *                     ^   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ  ej,                  ej.                  j0                        ej2                   G d dej4                                      Z ej,                  ej.                  j8                        ej2                   G d de                    Z ej,                  ej.                  j<                        ej2                   G d de                    Zddde_         y)zCommand for updating networks.    )absolute_import)division)unicode_literals)base_classes)poller)waiter)base)flags)network_utils)log)	resources)
console_io)progress_trackerc                   \    e Zd ZdZdZdZ edddddd	
      Zed        Z	d Z
d Zd Zd Zy)Updateu  Update a Compute Engine Network.

  *{command}* is used to update virtual networks. The updates that
  cabe be performed on a network are changing the BGP routing mode
  and switching from auto subnet mode to custom subnet mode. Switching
  from auto subnet mode to custom subnet mode cannot be undone.

  ## EXAMPLES

  To update regional network with the name 'network-name' to global, run:

    $ {command} network-name \
      --bgp-routing-mode=global

  To update an auto subnet mode network with the name 'network-name' to custom
  subnet mode, run:

    $ {command} network-name \
      --switch-to-custom-subnet-mode

  NTzValidating NetworkzCreating SubnetworkzUpdating InstanceszUpdating Instance GroupszUpdating Forwarding Rulesz!Converting Network to Subnet Mode)VALIDATING_NETWORKCREATING_SUBNETWORKUPDATING_INSTANCESUPDATING_INSTANCE_GROUPSUPDATING_FORWARDING_RULES!CONVERTING_NETWORK_TO_SUBNET_MODEc                     t        j                         | _        | j                  j                  |       t        j
                  j                  |       t        j                  |       y N	r
   NetworkArgumentNETWORK_ARGAddArgumentr	   
ASYNC_FLAGAddToParserr   AddUpdateArgsclsparsers     &lib/surface/compute/networks/update.pyArgszUpdate.ArgsF   D    ++-COOO'OO''    c                 	   t        j                  | j                               }|j                  j                  }|j                  j
                  j                  }g }| j                  j                  ||j                        }|j                  r?dj                  |j                               dz   }t        j                  |dd       |j                  |j!                  |j"                  |j                                     }t        j$                  j'                  |j(                  d|j"                  id      }	|j*                  r8t-        j.                  |	d	j                  |j                               dd
       |S t1        j2                  ||      }
|j4                  dk(  r| j7                  |
|	      S t9        j:                  |
|	d      S |j=                         }d}t?        |dd       -d}t        j                  |dd       |j@                  |_         d}tC        |d      r|jD                  |_#        d}tC        |d      r|jH                  |_%        d}|jL                  rYd}|jO                         |_(        |jN                  jS                  |jL                  jU                               |jP                  _+        t?        |dd       d}t        j                  |dd       d}t?        |dd       |jO                         |_(        |jN                  jY                  |jZ                        |jP                  _.        |jZ                  dk(  r"|j_                  d       |j_                  d       t?        |dd       ?d}t?        |dd       |jO                         |_(        |j`                  |jP                  _1        t?        |dd       Xd}t?        |dd       |jO                         |_(        |jN                  je                  |jf                        |jP                  _4        | jj                  r8|jl                  r,d}|j<                  jo                  |jl                        |_8        |rk|j                  j
                  js                  |      5  |ju                  |jw                  |j"                  |j                         |            }d d d        |S S # 1 sw Y   S xY w)Nz/Network [{0}] will be switched to custom mode. z This operation cannot be undone.T)messagedefaultcancel_on_no)projectnetworkr-   zcompute.globalOperations)params
collectionznetwork {0}z[Run the [gcloud compute operations describe] command to check the status of this operation.)kindis_asyncdetailsswitchLegacyToCustomModeBetaz Switching network to custom-mode)r   operation_refr*   FmtuzIThis might cause connectivity issues when there are running VMs attached.enable_ula_internal_ipv6internal_ipv6_rangebgp_best_path_selection_modezUpdating the best path selection mode can cause routing changes for egress traffic. No new routes are learned or deleted, and data plane traffic isn't dropped or interrupted.routingConfigLEGACYz!routingConfig.bgpAlwaysCompareMedz routingConfig.bgpInterRegionCostbgp_bps_always_compare_medbgp_bps_inter_region_cost)r-   r.   networkResource)<r   ComputeApiHolderReleaseTrackclientmessagesapitools_clientnetworksr   ResolveAsResourcer   switch_to_custom_subnet_modeformatNamer   PromptContinueSwitchToCustomMode(ComputeNetworksSwitchToCustomModeRequestr-   REGISTRYParsenameasync_r   UpdatedResourcer   PolleroperationType_WaitForLegacyNetworkMigrationr   WaitForNetworkgetattrr6   hasattrr7   enableUlaInternalIpv6r8   internalIpv6Rangebgp_routing_modeNetworkRoutingConfigr:   RoutingModeValueValuesEnumupperroutingMode'BgpBestPathSelectionModeValueValuesEnumr9   bgpBestPathSelectionModeappendr<   bgpAlwaysCompareMed!BgpInterRegionCostValueValuesEnumr=   bgpInterRegionCost_support_firewall_order)network_firewall_policy_enforcement_order4NetworkFirewallPolicyEnforcementOrderValueValuesEnum%networkFirewallPolicyEnforcementOrderIncludeFieldsPatchComputeNetworksPatchRequest)selfargsholderrB   servicecleared_fieldsnetwork_ref
prompt_msgresultr5   operation_pollernetwork_resourceshould_patchmsgbps_change_warning_messageresources                   r%   Runz
Update.RunM   s   **4+<+<+>?F}}%%Hmm++44GN""44T6;K;KLK((
;
B
B  //  d ))

;
;!));3C3C3E < f  ((..
++[001/ / m 
%%k&6&6&899	
 w<			!?	?22m
 	
 ^^!%4   '')LtUD!-. 
 UN!XXlt/0/3/L/L,lt*++/+C+C(ll'/'D'D'F$

'
'
B
B##))+ $$0 t3T:F9 !
 ,d l	!?D	9	A)1)F)F)H&

'
'
O
O// $$= 
	*	*h	6AB@At148Dl	!?D	9	A)1)F)F)H&

)
) $$8 t0$7Cl	!?D	9	A)1)F)F)H&

'
'
I
I,, $$7 	$$::l



O
O<< < ==((66~F==00#++#((* 0 1 
 G O8O G Os   	<SSc                 d   g }| j                   j                         D ]+  \  }}|j                  t        j                  ||             - t        j
                  d|      }t        | j                   j                               d   }||_        t        j                  |||| j                        S )N)keyz,Migrating Network from Legacy to Custom Mode)r*   stagesr   )r   r5   custom_trackertracker_update_func)MIGRATION_STAGESitemsra   r   StageStagedProgressTrackerlistkeyslast_status_messager   rT   (_LegacyNetworkMigrationTrackerUpdateFunc)rl   rt   r5   progress_stagesr|   labeltrackerfirst_status_messages           r%   rS   z%Update._WaitForLegacyNetworkMigration   s    O++113
U-33EsCD 4 44>G   5 5 : : <=a@"6G>># II	 r(   c                 p    |j                   }| j                  ||       |j                  |       ||_        y r   )statusMessage_MarkStagesCompleted
StartStager   )rl   r   	operationunused_statuslatest_status_messages        r%   r   z/Update._LegacyNetworkMigrationTrackerUpdateFunc   s8     &33g'<=,-"7Gr(   c                    t        | j                  j                               }|j                  |j                        }|j                  |      }t        | j                  j                               || }|D ]  }|j                  |        y r   )r   r   r   indexr   CompleteStage)rl   r   r   ordered_stageslast_status_message_idxlatest_status_message_idxstages_to_updatestage_to_updates           r%   r   zUpdate._MarkStagesCompleted   s    $//4467N,2273N3NO . 4 45J KD116689 9 ,O, ,r(   )__name__
__module____qualname____doc__r   re   dictr   classmethodr&   rz   rS   r   r    r(   r%   r   r   !   s[    , + -/-9 ;(K ( (Sj&8	-r(   r   c                       e Zd ZdZdZy)
UpdateBetar   TN)r   r   r   r   re   r   r(   r%   r   r     s    , !r(   r   c                   $    e Zd ZdZdZed        Zy)UpdateAlphaz Update a Compute Engine Network.Tc                     t        j                         | _        | j                  j                  |       t        j
                  j                  |       t        j                  |       y r   r   r"   s     r%   r&   zUpdateAlpha.Args.  r'   r(   N)r   r   r   r   re   r   r&   r   r(   r%   r   r   '  s     ) ( (r(   r   zUpdate a Compute Engine networkz?
        *{command}* is used to update Compute Engine networks.)briefDESCRIPTIONN)!r   
__future__r   r   r   googlecloudsdk.api_lib.computer   )googlecloudsdk.api_lib.compute.operationsr   googlecloudsdk.api_lib.utilr   googlecloudsdk.callioper	   +googlecloudsdk.command_lib.compute.networksr
   r   googlecloudsdk.corer   r   googlecloudsdk.core.consoler   r   ReleaseTracksr@   GAUniverseCompatibleUpdateCommandr   BETAr   ALPHAr   detailed_helpr   r(   r%   <module>r      s   % &  ' 7 < . ( = E # ) 2 8 D%%(()e-T e-  *e-P D%%**+! !  ,!4 D%%++,
(* 
(  -
( /B r(   