U
    ]                     @   sZ  d dl mZ d dl mZ d dl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 eeZddddZdhZdddddddheeB ZdZG dd deZG dd deZG dd deZd d! Z d7d#d$Z!d8d%d&Z"d'd( Z#d)d* Z$d+d, Z%d-d. Z&d/d0 Z'd1d2 Z(d3d4 Z)d5d6 Z*dS )9    )absolute_import)unicode_literalsN)split_command
split_port   )	UserError)denormalize_config)get_network_defs_for_service)format_environment)NoSuchImageError)parse_repository_tagZ
WorkingDirZUserZLabels)Zworking_diruserlabelsbuildimageportsexposenetworkscommandenvironment
entrypointz0.1c                   @   s   e Zd Zdd ZdS )	NeedsPushc                 C   s
   || _ d S N)
image_name)selfr    r   0/usr/lib/python3/dist-packages/compose/bundle.py__init__,   s    zNeedsPush.__init__N__name__
__module____qualname__r   r   r   r   r   r   +   s   r   c                   @   s   e Zd Zdd ZdS )	NeedsPullc                 C   s   || _ || _d S r   )r   service_name)r   r   r$   r   r   r   r   1   s    zNeedsPull.__init__Nr   r   r   r   r   r#   0   s   r#   c                   @   s   e Zd Zdd ZdS )MissingDigestsc                 C   s   || _ || _d S r   )
needs_push
needs_pull)r   r&   r'   r   r   r   r   7   s    zMissingDigests.__init__Nr   r   r   r   r   r%   6   s   r%   c                 C   s   t jt| |dddS )N   T)indentZ	sort_keys)jsondumps	to_bundleconfigimage_digestsr   r   r   serialize_bundle<   s    r0   Fc                 C   s   i }t  }t  }| jD ]v}zt||d||j< W q tk
r^ } z||j W 5 d }~X Y q tk
r } z||j W 5 d }~X Y qX q|s|rt	|||S )N)
allow_push)
setservicesget_image_digestnamer   addr   r#   r$   r%   )Zprojectr1   Zdigestsr&   r'   serviceer   r   r   get_image_digests@   s     
 
r9   c                 C   s~   d| j krtdj| dt| j d \}}}|dkr@| j d S t| }|rP|S d| j krht| j| j|svt| jt	| S )Nr   zService '{s.name}' doesn't define an image tag. An image name is required to generate a proper image digest for the bundle. Specify an image repo and tag with the 'image' option.s@r   )
optionsr   formatr   
get_digestr#   r   r5   r   
push_image)r7   r1   _Z	separatordigestr   r   r   r4   V   s"    



r4   c                 C   s   d }z |   }|d r"|d d }W nl tk
r   z0|  }|d d rbdj| j|d d d}W n& tk
r   tdj| jdY nX Y nX |S )	NRepoDigestsr   Z
DescriptorrB   z{image_name}@{digest})r   rB   zaDigest not found for service '{service}'. Repository does not exist or may require 'docker login')r7   )r   r   Zget_image_registry_datar>   r   r   r5   )r7   rB   r   Zdistributionr   r   r   r?   p   s(    

r?   c                 C   s   z|   }W n( tk
r4   tdj| d  Y nX |sHtd| j t| jd \}}}dj||d}| 	 }|d s| j
| td| j |S )	NzmFailed to push image for service '{s.name}'. Please use an image tag that can be pushed to a Docker registry.r:   zFailed to get digest for %sr   z{repo}@{digest})reporB   rC   zStored digest for {})push	Exceptionlogerrorr>   
ValueErrorr5   r   r=   r   ZclientZpullinfor   )r7   rB   rD   rA   Z
identifierr   r   r   r   r@      s$    r@   c                    sH   | j rtd | jr td t| } t fdd| d  D dS )Nz/Unsupported top level key 'networks' - ignoringz.Unsupported top level key 'volumes' - ignoringc                    s"   i | ]\}}|t || | qS r   )convert_service_to_bundle).0r5   service_dictr/   r   r   
<dictcomp>   s    zto_bundle.<locals>.<dictcomp>r3   )ZVersionZServices)r   rG   warningZvolumesr	   VERSIONitemsr-   r   rN   r   r,      s    



r,   c                 C   s   d|i}|  D ]h\}}|tkr"q|tkr>td||  q|dkrbtdd |  D |d< q|tkr||t| < qqt||	dg |	dg  t
| ||d	< t|}|r||d
< |S )NZImagez.Unsupported key '{}' in services.{} - ignoringr   c                 S   s   i | ]\}}|r||qS r   r   )rL   ZenvkeyZenvvaluer   r   r   rO      s    z-convert_service_to_bundle.<locals>.<dictcomp>ZEnvr   r   ZNetworksZPorts)rR   IGNORED_KEYSSUPPORTED_KEYSrG   rP   r>   r   SERVICE_KEYSset_command_and_argsgetmake_service_networksmake_port_specs)r5   rM   Zimage_digestZcontainer_configkeyvaluer   r   r   r   rK      s2    

rK   c                 C   sL   t |tjrt|}t |tjr(t|}|r<|| | d< d S |rH|| d< d S )NZCommandZArgs)
isinstancesixZstring_typesr   )r.   r   r   r   r   r   rV      s    rV   c              	   C   sJ   g }t | D ]4\}}| D ]}td|| | q || q|S )Nz:Unsupported key '{}' in services.{}.networks.{} - ignoring)r
   rR   keysrG   rP   r>   append)r5   rM   r   Znetwork_nameZnetwork_defrZ   r   r   r   rX      s      rX   c                 C   sR   g }dd |  dg D }||  dg 7 }|D ]}t|}||kr.|| q.|S )Nc                 S   s"   g | ]}t |d  D ]}|qqS )r   r   )rL   Zport_definternal_portr   r   r   
<listcomp>   s    z#make_port_specs.<locals>.<listcomp>r   r   )rW   make_port_specr_   )rM   r   Zinternal_portsr`   specr   r   r   rY      s    
rY   c                 C   s*   t | d}|d pdt|d dS )N/r(   Ztcpr   )ZProtocolZPort)r]   Z	text_type	partitionint)r[   Z
componentsr   r   r   rb     s    

rb   )F)F)+Z
__future__r   r   r*   Zloggingr]   Zdocker.utilsr   Zdocker.utils.portsr   Z
cli.errorsr   Zconfig.serializer	   Znetworkr
   r7   r   r   r   Z	getLoggerr    rG   rU   rS   r2   rT   rQ   rF   r   r#   r%   r0   r9   r4   r?   r@   r,   rK   rV   rX   rY   rb   r   r   r   r   <module>   sV   



$