
    <                     ,   d Z ddlmZ ddlmZ ddlmZ ddlZddl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 ddlmZ ddlmZ ddlm Z  dZ! G d dejD                        Z#ejH                   ejJ                  ejL                  jN                  ejL                  jP                  ejL                  jR                         G d dejT                                      Z+ddde+_,        y)z2Command for converting a disk to a different type.    )absolute_import)division)unicode_literalsN)base_classes)
disks_util)	kms_utils)name_generator)poller)waiter)base)
exceptions)
completers)flags)resource_args)log)
console_io)progress_trackera>  This command will permanently convert disk {0} to disk type: {1}. Please detach the disk from all instances before continuing. Data written to the original disk during conversion will not appear on the converted disk. Please see https://cloud.google.com/compute/docs/disks/automatically-convert-disks for more details.c                   $    e Zd ZdZdZdZdZdZdZy)_ConvertState                  N)	__name__
__module____qualname__SNAPSHOT_CREATEDDISK_RESTOREDORIGINAL_DISK_DELETEDORIGINAL_DISK_RECREATEDRESTORED_DISK_DELETEDSNAPSHOT_DELETED     $lib/surface/compute/disks/convert.pyr   r   4   s%    -r&   r   c                       e Zd ZdZ ej
                  d      Zed        Zd Z		 ddZ
d Zd	 Z	 dd
Zd Zd Z	 ddZd ZddZd Zd Zd Zd Zd Zy)ConvertzFConvert a Compute Engine Persistent Disk volume to a Hyperdisk volume.F)pluralc                     t         j                  j                  |        | j                  dt        j
                  dd       t        j                  | dd       y )N--target-disk-typeTzSpecifies the type of Hyperdisk to convert to, for example,
        to convert a Hyperdisk Balanced volume, specify `hyperdisk-balanced`. To get a
        list of available disk types, run `gcloud compute disk-types list`.
        )	completerrequiredhelpdisk)region_fallthrough)r)   	_DISK_ARGAddArgumentadd_argumentr   DiskTypesCompleterkms_resource_argsAddKmsKeyResourceArg)parsers    r'   ArgszConvert.ArgsF   sT    !!&)
//	   **4r&   c                    t        j                  | j                               | _        | j                  j                  j
                  | _        | j                  j                  j                  | _        d | _        i | _        d| _	        | j                  j                  || j                  j                  t        j                  | j                  j                              | _        | j                  j!                         dk(  rt#        j$                  dd      |j&                  dk(  rt#        j$                  dd      |j&                  | _        t)        j*                  | j                  | j                  | j                        }|j-                         }|j.                  rt#        j0                  d	      t3        j4                  t7        j8                  t:        j=                  | j                  j?                         | j&                              d
       	 | jA                  | j                  j?                               5  | jC                  | j                  | j&                  |jD                  tG        jH                  || j                  d             }d d d        | jM                          | j                  r{| j                  tN        jP                  tN        jR                  tN        jT                  fv r!tW        jX                  | j                         S tW        jZ                  | j                         S # 1 sw Y   xY w# tJ        $ r}|d }~ww xY w# | jM                          | j                  r{| j                  tN        jP                  tN        jR                  tN        jT                  fv r tW        jX                  | j                         w tW        jZ                  | j                         w w xY w)N )scope_listerzcompute.regionDisksz--regionz2Regional disks are not supported for this command.zhyperdisk-mlr,   z/Hyperdisk ML is not supported for this command.zHDisk is attached to instances. Please detach the disk before converting.T)messagecancel_on_nodisk_encryption_key).r   ComputeApiHolderReleaseTrackholderclientapitools_clientmessagesstatecreated_resourcesuser_messagesr2   ResolveAsResource	resourcesr   GetDefaultScopeListerdisk_ref
Collectionr   InvalidArgumentExceptiontarget_disk_typer   GetDiskInfoGetDiskResourceusersToolExceptionr   PromptContinuetextwrapdedentCONTINUE_WITH_CONVERT_PROMPTformatName_CreateProgressTracker_ConvertDisksizeGbr   MaybeGetKmsKey	Exception_CleanUpr   r"   r#   r$   r   warningerror)selfargs	disk_infooriginal_diskresultes         r'   RunzConvert.RunV   s   //0A0A0CDDK++$$44DKKK&&//DMDJDDNN44001C1CD 5 DM }}!%:://

> 
 .//

;  !11D &&t{{DMM3I--/M$$  (//""$d&;&;

 (&&t}}'9'9';<""MM400-2F2F ) 8 8dmmT! # 
 = mmo			::-??'=='88: : ++d((
) M ))D&&
'M' =<  g mmo			::-??'=='88: : ++d((
)
))D&&
' 
s>   )L? ?AL3L? 3L<8L? ?	MM

MM BO+Nc                    | j                  |      | _        | j                  || j                        }| j                  j                  j                  | j                  d|j                  id      }| j                  t        j                  |       | j                  |      | _
        | j                  j                  j                  | j                  |j                  |j                  dd      }| j                  |||||      xs |}| j                  t        j                  |       | j                  |      xs |}| j                  t        j                         | j!                  |j#                         ||      xs |}| j                  t        j$                         | j                  |      xs |}| j                  t        j&                         | j)                  |      xs |}| j                  t        j*                         |S )Nprojectzcompute.snapshots)params
collection)rk   zonezcompute.disksr?   )_GenerateNamesnapshot_name_InsertSnapshotrC   rK   Parserk   _UpdateStater   r   restored_disk_namern   _RestoreDiskFromSnapshotr    _DeleteDiskr!   
_CloneDiskrZ   r"   r#   _DeleteSnapshotr$   )rc   rM   rP   size_gbr@   rg   snapshot_refrestored_disk_refs           r'   r\   zConvert._ConvertDisk   s    ++H5D!!(D,>,>?F;;((..8++,& / L
 	m44lC"00:D--33#++X]]C" 4  	%% 3 	& 	
 	   	m113DEh'16Fm99: 	MMO 3 	 	
 	
   	m;;< /0:FFm99: !!,/96Fm445Mr&   c                 @   | j                   j                  |j                  | j                   j                  ||j	                         | j                   j                  j
                  j                              }| j                  | j                  j                  d|      }| j                  j                  j                  |j                  d      }t        j                  t!        j"                  | j                  j                        || j%                         d       S )N)name
sourceDisksnapshotType)rk   snapshotInsertcompute.globalOperationsrm   custom_trackermax_wait_ms)rF   ComputeSnapshotsInsertRequestrk   SnapshotSelfLinkSnapshotTypeValueValuesEnumSTANDARD_MakeRequestrD   	snapshotsrC   rK   rr   selfLinkr   WaitForr
   Poller_CreateNoOpProgressTracker)rc   rM   rp   request	operationoperation_refs         r'   rq   zConvert._InsertSnapshot   s    mm99  ''((*//KKTT ( 
 : G !!$++"7"77KIKK))//- 0 M >>dkk++,668	 r&   c                    | j                   j                  |j                         |j                        }| j	                  | j
                  j                  d|      }| j                  j                  j                  |j                  d      }t        j                  t        j                  | j
                  j                        || j                         d       S )N)r   rk   Deleter   r   r   )rF   ComputeSnapshotsDeleteRequestrZ   rk   r   rD   r   rC   rK   rr   r   r   r   r
   DeletePollerr   )rc   rz   r   r   r   s        r'   rx   zConvert._DeleteSnapshot   s    mm99""$$$ : G !!$++"7"77KIKK))//- 0 M >>DKK112668	 r&   c           	      |   i }|r||d<    | j                   j                  d|j                         t        j                  ||| j
                        ||j                         d|}| j                   j                  ||j                  |j                        }| j                  | j                  j                  d|      }	| j
                  j                  j                  |	j                  d      }
t!        j"                  t%        j&                  | j                  j                        |
| j)                         d       S )	NdiskEncryptionKey)r}   typer]   sourceSnapshotr0   rk   rn   r   compute.zoneOperationsr   r   r%   )rF   DiskrZ   r   GetDiskTypeUrirC   r   ComputeDisksInsertRequestrk   rn   r   rD   disksrK   rr   r   r   r   r
   r   r   )rc   r{   rz   	disk_typery   r@   kwargsr0   r   r   r   s              r'   ru   z Convert._RestoreDiskFromSnapshot   s)    F$7f !4== ##%&&($++
 #,,. D mm55!))## 6 G
 !!$++"3"3XwGIKK))//+ 0 M >>dkk''(668	 r&   c                 V    t        j                          d|j                          d d S )N-@   )r	   GenerateRandomNamerZ   )rc   resource_refs     r'   ro   zConvert._GenerateName  s.    //12!L4E4E4G3HI#2NNr&   c                    | j                   j                  |j                         |j                  |j                        }| j                  | j                  j                  d|      }| j                  j                  j                  |j                  d      }t        j                  t        j                  | j                  j                        || j!                         d       S )Nr   r   r   r   r   )rF   ComputeDisksDeleteRequestrZ   rk   rn   r   rD   r   rC   rK   rr   r   r   r   r
   r   r   )rc   rM   r   r   r   s        r'   rv   zConvert._DeleteDisk  s    mm55]]_  ]] 6 G
 !!$++"3"3XwGIKK))//+ 0 M >>DKK--.668	 r&   c                 "   i }|r||d<    | j                   j                  d||j                         d|}| j                   j                  ||j                  |j
                        }| j                  | j                  j                  d|      }| j                  j                  j                  |j                  d      }t        j                  | j                  j                        }	t        j                   |	|| j#                         d       S )	Nr   )r}   r~   r   r   r   r   r   r%   )rF   r   r   r   rk   rn   r   rD   r   rC   rK   rr   r   r
   r   r   r   r   )
rc   original_disk_namer{   r@   r   r0   r   r   r   operation_pollers
             r'   rw   zConvert._CloneDisk1  s    F$7f !4== $--/ D
 mm55!))## 6 G
 !!$++"3"3XwGIKK))//+ 0 M }}T[[%6%67>>668	 r&   c                     g }| j                   j                  j                  |||fg|      }|rt        j                  |      |st        j
                  d      |d   S )NzNo response receivedr   )rC   rD   AsyncRequestscore_exceptions
MultiErrorInternalError)rc   resource_clientmethodr   errors_to_collect	responsess         r'   r   zConvert._MakeRequestN  sh    ""00
67	+,.?I &&'899))*@AAQ<r&   c                 6    || _         |r|| j                  |<   y y N)rG   rH   )rc   rG   created_resources      r'   rs   zConvert._UpdateStateY  s!    DJ&6dU# r&   c                 R   | j                   sd| j                         z   | _        y | j                   t        j                  k(  rSd| j
                   d| j                         z   | _        | j                  | j                  t        j                            y | j                   t        j                  k(  rd| j                  j                          d| j                         z   | j                         z   | _        | j                  | j                  t        j                            | j                  | j                  t        j                            y | j                   t        j                  k(  rd| j                  j                          d| j                  j                          d| j                  j                   d| j                   d	| j                    d
| j
                   d| j                    d| j                  j                   d| _        y | j                   t        j"                  k(  r8d| j                    d| j                         z   | j                         z   | _        y | j                   t        j$                  k(  r'd| j
                   d| j                         z   | _        y y )NzCreating snapshot failed.zCreating disk from snapshot z	 failed. zDeleting original disk zRecreating original disk z1 failed. Please run `gcloud compute disks create  --zone=z --type=z --source-disk=zM` to recreate the original disk. Please run `gcloud compute snapshots delete zL` to delete the temporary snapshot. Please run `gcloud compute disks delete z` to delete the temporary disk.z;Conversion completed successfully, Deleting temporary disk z failed.z?Conversion completed successfully. Deleting temporary snapshot )rG   _BuildCleanupSnapshotMessagerI   r   r   rp   rx   rH   r    rM   rZ   _BuildCleanupDiskMessagerv   r!   rn   rP   rt   r"   r#   rc   s    r'   r`   zConvert._CleanUp^  s   ::
%(I(I(K
K  zz]333 )););(<I
F--/0  

 
 !?!?
@ 
}22	2 $DMM$6$6$8#9
C))+,--/0 
 t--m.I.IJK


 
 !?!?
@ 
}::	: &dmm&8&8&:%; <mm  "#8DMM,>,>+?xH]H]G^^mnr  oF  oF  nG G#112 3%%&ht}}/A/A.B C!!  
}<<	<%%&h0))+, --/0  
}::	:  !+--/0  
;r&   c                 8    t        j                  d| dd      S )NzConverting disk z...zConversion aborted.)r=   aborted_message)r   ProgressTracker)rc   	disk_names     r'   r[   zConvert._CreateProgressTracker  s$    ++"9+S1- r&   c                 0    t        j                  dd      S )NTr;   )interruptabler   )r   NoOpProgressTrackerr   s    r'   r   z"Convert._CreateNoOpProgressTracker  s    //B r&   c                 "    d| j                    dS )Nz- Please run `gcloud compute snapshots delete z6` to delete the temporary snapshot if it still exists.)rp   r   s    r'   r   z$Convert._BuildCleanupSnapshotMessage  s     
78J8J7K L= 	=r&   c                 P    d| j                    d| j                  j                   dS )Nz) Please run `gcloud compute disks delete r   z2` to delete the temporary disk if it still exists.)rt   rM   rn   r   s    r'   r   z Convert._BuildCleanupDiskMessage  s4    	##$HT]]-?-?,@ A.	.r&   r   )r   r   r   __doc__disks_flagsMakeDiskArgr2   staticmethodr9   ri   r\   rq   rx   ru   ro   rv   rw   r   rs   r`   r[   r   r   r   r%   r&   r'   r)   r)   =   s    
 O%k%%U3) AH FJ5n*. $LO& HL:	7
3j
r&   r)   a
   Convert Compute Engine Persistent Disk volumes to Hyperdisk volumes.

 *{command}* converts a Compute Engine Persistent Disk volume to a Hyperdisk volume. For a comprehensive guide, refer to: https://cloud.google.com/sdk/gcloud/reference/compute/disks/convert.
    zThe following command converts a Persistent Disk volume to a Hyperdisk Balanced volume:

        $ {command} my-disk-1 --zone=ZONE --target-disk-type=hyperdisk-balanced
        )DESCRIPTIONEXAMPLES)-r   
__future__r   r   r   enumrV   googlecloudsdk.api_lib.computer   r   r   r	   )googlecloudsdk.api_lib.compute.operationsr
   googlecloudsdk.api_lib.utilr   googlecloudsdk.callioper   r   "googlecloudsdk.command_lib.computer   r   (googlecloudsdk.command_lib.compute.disksr   googlecloudsdk.command_lib.kmsr   r6   googlecloudsdk.corer   r   googlecloudsdk.core.consoler   r   rX   Enumr   DefaultUniverseOnlyReleaseTracksrB   ALPHABETAGARestoreCommandr)   detailed_helpr%   r&   r'   <module>r      s    9 &  '   7 5 4 9 < . ( . 9 4 I M = # 2 8 DII  D%%++%%**%%((*hd!! h* hX
 r&   