
    {%                        d Z ddlmZ ddlmZ ddlm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Z G d de
j.                        Z G d de
j2                        Z ej6                  ej8                  j:                  ej8                  j<                         G d dej>                               Z y)6Validate that a terraform plan complies with policies.    )absolute_import)division)unicode_literalsN)base)binary_operations)log)metrics)
properties)progress_tracker)GetFreshAccessToken)encoding)fileszCould not locate terraform-tools executable [{binary}]. Please ensure gcloud terraform-tools component is properly installed. See https://cloud.google.com/sdk/docs/components for more details.c                   ,     e Zd ZdZi Z fdZd Z xZS )"TerraformToolsTfplanToCaiOperationz>Streaming operation for Terraform Tools tfplan-to-cai command.c           	      h    dt         j                  d      i}t        t        |   dddd|dd| y )NMISSING_EXECterraform-toolsbinaryT)r   check_hiddeninstall_if_missingcustom_errorsstructured_output )MISSING_BINARYformatsuperr   __init__selfkwargsr   	__class__s      lib/surface/terraform/vet.pyr   z+TerraformToolsTfplanToCaiOperation.__init__,   sN    --5F-GM 

,d<  #     c           	      t    ||d|d|dt        j                         g}	|r|	d|gz  }	|r|	d|gz  }	|r|	d|gz  }	|	S )Nz--output-path--verbosityz--user-agentz	--project--region--zone)r
   GetUserAgent)
r!   commandterraform_plan_jsonprojectregionzone	verbosityoutput_pathr"   argss
             r$   _ParseArgsForCommandz7TerraformToolsTfplanToCaiOperation._ParseArgsForCommand8   si     		D 
{G$$d
z6""d
xdKr%   __name__
__module____qualname____doc__r   r   r3   __classcell__r#   s   @r$   r   r   '   s    F-
r%   r   c                   ,     e Zd ZdZi Z fdZd Z xZS )TerraformToolsValidateOperationz3operation for Terraform Tools validate-cai command.c                 f    dt         j                  d      i}t        t        |   dddd|d| y )Nr   r   r   TF)r   r   r   r   r   )r   r   r   r<   r   r    s      r$   r   z(TerraformToolsValidateOperation.__init__Q   sK    --5F-GM 

)49   # r%   c                 P    ||d|dt         j                  j                  |      g}|S )Nr'   --policy-library)ospath
expanduser)r!   r+   
input_filepolicy_libraryr0   r"   r2   s          r$   r3   z4TerraformToolsValidateOperation._ParseArgsForCommand]   s3     	
>*D Kr%   r4   r:   s   @r$   r<   r<   M   s    ;-

r%   r<   c                   .    e Zd ZdZddiZed        Zd Zy)Vetr   EXAMPLESz
        To validate that a terraform plan complies with a policy library
        at `/my/policy/library`:

        $ {command} tfplan.json --policy-library=/my/policy/library
        c                     | j                  dd       | j                  ddd       | j                  dd	d
       | j                  dd	d       y )Nr,   ztFile which contains a JSON export of a terraform plan. This file will be validated against the given policy library.)helpr?   Tz)Directory which contains a policy library)requiredrI   r)   Fz:Default zone to use for resources that do not have one setr(   z<Default region to use for resources that do not have one set)add_argument)parsers    r$   ArgszVet.Argsx   sx    
B   8  
 I  
 K  r%   c                 F	   t               }t               }t               }t        t        j                  j
                  j                  j                               dd}g d}g d}g d}g d}	t        j                  j                         D ]  \  }
}|
|v s|||
<    t        j                         5 }t        j                  j                  |d      }t        j                  j
                  j                  j                         }|r%t!        j"                  d	j%                  |             nT|D ]O  }
t'        j(                  t        j                  |
      }|s*t!        j"                  d
j%                  ||
              n d}|j*                  r1|j*                  }t!        j"                  dj%                  |             nT|	D ]O  }
t'        j(                  t        j                  |
      }|s*t!        j"                  dj%                  ||
              n d}|j,                  r1|j,                  }t!        j"                  dj%                  |             nT|D ]O  }
t'        j(                  t        j                  |
      }|s*t!        j"                  dj%                  ||
              n  |d||||j.                  |j0                  ||      }|j2                  | _        | j2                  dkD  r
	 d d d        y t5        j6                  dd      5   |d|j8                  ||j0                  |      } |d|j8                  |j.                  |j0                  |      }d d d        d d d        j2                  dk(  sj2                  dk(  rd| _        n%|j2                  dk(  s|j2                  dk(  rd| _        g }d|fdffD ]  \  }}|j:                  r1	 t=        j>                  |j:                  d      }||j@                  z  }|jF                  sPt=        jH                  d       }|jF                  jK                  d       D ]
  } ||         |S # 1 sw Y   xY w# 1 sw Y   xY w# t<        jB                  $ r' t!        jD                  dj%                  |             Y w xY w)!N)accounttrue)GOOGLE_OAUTH_ACCESS_TOKENUSE_STRUCTURED_LOGGING)
HTTP_PROXY
http_proxyHTTPS_PROXYhttps_proxyNO_PROXYno_proxy)GOOGLE_PROJECTGOOGLE_CLOUD_PROJECTGCLOUD_PROJECT)GOOGLE_ZONEGCLOUD_ZONECLOUDSDK_COMPUTE_ZONE)GOOGLE_REGIONGCLOUD_REGIONCLOUDSDK_COMPUTE_REGIONzcai_assets.jsonz%Setting project to {} from propertiesz!Setting project to {} from env {} zSetting region to {} from argsz Setting region to {} from env {}zSetting zone to {} from argszSetting zone to {} from env {}ztfplan-to-cai)r+   r-   r.   r/   r,   r0   r1   envr   zValidating resourceszAborted validation.)messageaborted_messagezvalidate-cai)r+   rD   rC   r0   rc   zvalidate-tfplan      CAI	TerraformT)as_jsonz,Could not parse {} policy validation output.
)&r   r<   r   r   VALUEScorerO   Getr@   environitemsr   TemporaryDirectoryrA   joinr-   r	   debugr   r   GetEncodedValuer.   r/   r,   r0   	exit_coder   ProgressTrackerrD   stdoutr   ReadStructuredOutputresource_bodyStructuredOutputErrorwarningstderr!DefaultStreamStructuredErrHandlersplit)r!   r2   tfplan_to_cai_operationvalidate_cai_operationvalidate_tfplan_operationenv_varsproxy_env_namesproject_env_nameszone_env_namesregion_env_namesenv_keyenv_valtempdir
cai_assetsr-   r.   r/   responsecai_responsetfplan_response
violationspolicy_typemsghandlerlines                            r$   RunzVet.Run   s!   @B<> ? A  
(9(9(>(>(F(F(J(J(LM	HON JJ,,.	O	## / 
	!	!	#w77<<):;j !!&&..224g			9@@IJ(G,,RZZA'II9@@" # ) f			299&AB'G++BJJ@&II8??! " ( d	yy		077=>%G))"**g>$II6==dGLM	 & )!"66NN h  ))dn	!	 g 
$	#j ++(/1 ."..!nn 4%..//nn1k 
$P "o&?&?1&Ddn			1	$(A(AQ(Fdn
 J#(,"7+:I:K "LX		*!66oot-# ))
)*	#EEdKOO))$/D
$- 0"L  [1 1k 
$	#p !66 	
++DKK 	sS   2B%QBQ+BQ>A-Q4QAQQ!Q&Q	QQ#&7R R N)r5   r6   r7   r8   detailed_helpstaticmethodrM   r   r   r%   r$   rF   rF   j   s0    > -  .Kr%   rF   )!r8   
__future__r   r   r   os.pathr@   googlecloudsdk.callioper   &googlecloudsdk.command_lib.util.anthosr   googlecloudsdk.corer	   r
   r   googlecloudsdk.core.consoler   %googlecloudsdk.core.credentials.storer   googlecloudsdk.core.utilr   r   r   StreamingBinaryBackedOperationr   BinaryBackedOperationr<   ReleaseTracksReleaseTrackALPHABETACommandrF   r   r%   r$   <module>r      s    = &  '  ( D # ' * 8 E - *"#44#L&7&M&M : D%%++T->->-C-CDp$,, p Epr%   