%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /lib/python2.7/site-packages/salt/cloud/clouds/
Upload File :
Create Path :
Current File : //lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyc

�
���^c@@s�dZddlmZmZmZddlZddlZddlZddlZddl	Z	ddl
Z
y ddlmZe
Ze
ZWn�ek
r%eZy*ddlmZddlmZe
ZWq&ek
r!y*ddlmZddlmZe
ZWq"ek
reZq"Xq&XnXddlmZddlmZddlZddlZddlZddl Zddl!Zddl"j#Z#dd	l$m%Z%dd
l&m'Z'm(Z(m)Z)m*Z*ej+e,�Z-dZ.dZ/d
Z0idd6dd6dd6dd6Z1dZ2e
Z3ej4ej5ej6ej7gZ8d�Z9d�Z:d�Z;d�Z<ddd�Z>d�Z?d�Z@dd�ZAdd�ZBdd�ZCdd �ZDddddd!e2d"�ZEd#�ZFdd$�ZGdd%�ZHd&�ZIdd'�ZJd(�ZKdd)�ZLd*�ZMded+�ZNedd,�ZOdd-�ZPdd.�ZQd/�ZRdd0�ZSdd1�ZTddd2�ZUddd3�ZVddd4�ZWddd5�ZXe2e/d6�ZYdddd!ddd7�ZZdS(8uH
Joyent Cloud Module
===================

The Joyent Cloud module is used to interact with the Joyent cloud system.

Set up the cloud configuration at ``/etc/salt/cloud.providers`` or
``/etc/salt/cloud.providers.d/joyent.conf``:

.. code-block:: yaml

    my-joyent-config:
      driver: joyent
      # The Joyent login user
      user: fred
      # The Joyent user's password
      password: saltybacon
      # The location of the ssh private key that can log into the new VM
      private_key: /root/mykey.pem
      # The name of the private key
      keyname: mykey

When creating your profiles for the joyent cloud, add the location attribute to
the profile, this will automatically get picked up when performing tasks
associated with that vm. An example profile might look like:

.. code-block:: yaml

      joyent_512:
        provider: my-joyent-config
        size: g4-highcpu-512M
        image: centos-6
        location: us-east-1

This driver can also be used with the Joyent SmartDataCenter project. More
details can be found at:

.. _`SmartDataCenter`: https://github.com/joyent/sdc

Using SDC requires that an api_host_suffix is set. The default value for this is
`.api.joyentcloud.com`. All characters, including the leading `.`, should be
included:

.. code-block:: yaml

      api_host_suffix: .api.myhostname.com

:depends: PyCrypto
i(tabsolute_importtprint_functiontunicode_literalsN(tEVP(tSHA256(t
PKCS1_v1_5(tsix(thttp_client(t
node_state(tSaltCloudSystemExittSaltCloudExecutionFailuretSaltCloudExecutionTimeouttSaltCloudNotFoundujoyentu.api.joyentcloud.comu~7.2uNorth Virginia, USAu	us-east-1uBay Area, California, USAu	us-west-1uLas Vegas, Nevada, USAuus-sw-1uAmsterdam, Netherlandsueu-ams-1cC@s-ttkrtdfSt�tkr)tStS(u"
    Check for Joyent configs
    u4Either PyCrypto or Cryptodome needs to be installed.(tHAS_REQUIRED_CRYPTOtFalsetget_configured_providert__virtualname__(((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyt__virtual__s

cC@stjttptd�S(u/
    Return the first configured instance.
    uuserupassword(uuserupassword(tconfigtis_provider_configuredt__opts__t__active_provider_name__R(((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyR�s	cC@spt�}tjd|t�}|rWtj|�|krW||d||d<||Stdj|���dS(u(
    Return the image object to use
    uimageuidunameu/The specified image, '{0}', could not be found.N(tavail_imagesRtget_cloud_config_valueRRt	text_typeRtformat(tvm_timagestvm_image((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyt	get_image�s	cC@sot�}tjd|t�}|s3td��n|rVtj|�|krV||Stdj|���dS(u%
    Return the VM's size object
    usizeuNo size specified for this VM.u.The specified size, '{0}', could not be found.N(tavail_sizesRRRRRRR(Rtsizestvm_size((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytget_size�s	c@sSt�tj�r5|dkr5i�d6dd6�n|dkrPtd��ntddd	d
j�d�dtdd
td��fd�}yjtjj	j
|dtjd�tdd�dtjd�tdd�dtjd�tdd��}WnNt
tfk
rN}zyWntk
r0nXWdttj|���XnX|S(u=
    Query an instance upon creation from the Joyent API
    uactionunameujoyentuproviderufunctionu=The query_instance action must be called with -a or --action.ucloud.fire_eventueventuquerying instanceusalt/cloud/{0}/queryingtsock_dirusock_dirt	transportu	transportc@s�t�ddd�}|s-tjd�tSt|t�red|kretjd|jd��tStjd|�d|d	kr�|d	d
dkr�|d	dSndS(Nunametcalluactionu8There was an error while querying Joyent. Empty responseuerroru"There was an error in the query %suReturned query data: %su	primaryIpiustateurunning(
t
show_instancetlogterrorRt
isinstancetdicttwarningtgettdebugtNone(tdata(R(s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyt_query_ip_address�sttimeoutuwait_for_ip_timeouttdefaulti
i<tintervaluwait_for_ip_intervaltinterval_multiplieruwait_for_ip_interval_multiplieriNiX(R(Rtstring_typesR	t	__utils__RRtsalttutilstcloudtwait_for_ipRRRR
R(RR$R/R.texc((Rs</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytquery_instance�s:

cC@s�y=|dr<tjttpd|dd|�tkr<tSWntk
rPnXtjd|tdtdd*�}tddd	d
j	|d�dtd
d|ddddg�dtddtd�t
jd|d|jdt
��tjjj|dd�i|dd6t|�d6t|�d6|jdt
�d6}d|krf|jd�|d<ntddddj	|d�ditd
d|t|��d6dtddtd�t|�}|ikr�t
jd|d�tSt|�t|dd d!�}||d"<|d#d$|d%<td&|t�tddd'd(j	|d�dtd
d)|ddddg�dtddtd�|d#S(+u�
    Create a single VM from a data dict

    CLI Example:

    .. code-block:: bash

        salt-cloud -p profile_name vm_name
    uprofileujoyentRuprivate_keyt
search_globalR1ucloud.fire_eventueventustarting createusalt/cloud/{0}/creatingunametargsucloud.filter_eventucreatinguproviderudriverR"usock_dirR#u	transportuCreating Cloud VM %s in %sulocationua-zA-Z0-9-.uimageusizeunetworksurequesting instanceusalt/cloud/{0}/requestingu
requestingukwargsuError creating %s on JOYENTR$uactionukey_filenameiu	primaryIpussh_hostucloud.bootstrapucreated instanceusalt/cloud/{0}/createducreatedN(Rtis_profile_configuredRRRtAttributeErrorRR-R5RR&tinfoR+tDEFAULT_LOCATIONR6R7R8t
check_nameRR!tlisttcreate_nodeR'R;R%(Rtkey_filenametkwargsR.((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytcreate�sj
	

"


 


"
c	K@s�|d}|d}|d}|d}|jd�}|jd�}|jd�}|jd�}|jd	�}	i|d6|dd
6|dd6}
|dk	r�||
d<n|dk	r�||
d<n|dk	r
x3tj|�D]\}}||
dj|�<q�Wn|dk	rLx3tj|�D]\}}||
dj|�<q&Wn|	dk	re|	|
d	<ntjjj|
�}
t	d
dd|
ddd|�}|dt
kr�|dStjd||d�iS(uK
    convenience function to make the rest api call for node creation.
    unameusizeuimageulocationunetworksutagulocalityumetadataufirewall_enabledupackageumetadata.{0}utag.{0}tcommandumy/machinesR.tmethoduPOSTtlocationiiuFailed to create node %s: %sN(
R+R-Rt	iteritemsRR6R7tjsontdumpstquerytVALID_RESPONSE_CODESR&R'(RFtnametsizetimageRJtnetworksttagtlocalitytmetadatatfirewall_enabledtcreate_datatkeytvalueR.tret((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyRDQs@






	cC@s|dkrtd��ntddddj|�di|d6d	td
dtd�t|�}td
dj|d�d|ddd�}tddddj|�di|d6d	td
dtd�tjdt�tkrtd|t	j
d�dt�n|dtkS(u<
    destroy a machine by name

    :param name: name given to the machine
    :param call: call value in this case is 'action'
    :return: array of booleans , true if successfully stopped and true if
             successfully removed

    CLI Example:

    .. code-block:: bash

        salt-cloud -d vm_name

    ufunctionuEThe destroy action must be called with -d, --destroy, -a or --action.ucloud.fire_eventueventudestroying instanceusalt/cloud/{0}/destroyingR=unameR"usock_dirR#u	transportRHumy/machines/{0}uidRJulocationRIuDELETEudestroyed instanceusalt/cloud/{0}/destroyeduupdate_cachedirucloud.delete_minion_cachediru:i(R	R5RRtget_nodeRNR+RtTrueRtsplitRO(RPR$tnodeR[((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytdestroy�s.



$cC@s_t|�}td|d|ddddj|d�d|d	d
idd6�}|d
tkS(u�
    reboot a machine by name
    :param name: name given to the machine
    :param call: call value in this case is 'action'
    :return: true if successful

    CLI Example:

    .. code-block:: bash

        salt-cloud -a reboot vm_name
    RPR$RIuPOSTRHumy/machines/{0}uidRJulocationR.urebootuactioni(R\ttake_actionRRO(RPR$R_R[((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytreboot�s

cC@s_t|�}td|d|ddddj|d�d|d	d
idd6�}|d
tkS(u�
    stop a machine by name
    :param name: name given to the machine
    :param call: call value in this case is 'action'
    :return: true if successful

    CLI Example:

    .. code-block:: bash

        salt-cloud -a stop vm_name
    RPR$RIuPOSTRHumy/machines/{0}uidRJulocationR.ustopuactioni(R\RaRRO(RPR$R_R[((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytstop�s

cC@s_t|�}td|d|ddddj|d�d|d	d
idd6�}|d
tkS(u�
    start a machine by name
    :param name: name given to the machine
    :param call: call value in this case is 'action'
    :return: true if successful


    CLI Example:

    .. code-block:: bash

        salt-cloud -a start vm_name
    RPR$RIuPOSTRHumy/machines/{0}uidRJulocationR.ustartuactioni(R\RaRRO(RPR$R_R[((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytstart�s
uGETc		C@s�tj�dd}|dkr/td��n|rMtjjj|�}ng}y8td|d|d|d|�}tj	d	||�Wnbt
k
r�}d
tj|�kr�dig}q�tj
d|||d
tj�dig}nX|S(ue
    take action call used by start,stop, reboot
    :param name: name given to the machine
    :param call: call value in this case is 'action'
    :command: api path
    :data: any data to be passed to the api, must be in json format
    :method: GET,POST,or DELETE
    :location: data center to execute the command on
    :return: true if successful
    iiuactionu/This action must be called with -a or --action.RHR.RIRJuSuccess %s for node %suInvalidStatei�uFailed to invoke %s node %s: %stexc_info_on_loglevelid(tinspecttstackR	R6R7RLRMRNR&R@t	ExceptionRRR'tloggingtDEBUG(	RPR$RHR.RIRJtcallerR[R:((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyRa�s&
	
cC@stjd|tdddt�S(uj
    Return the ssh_interface type to connect to. Either 'public_ips' (default)
    or 'private_ips'.
    u
ssh_interfaceR1u
public_ipsR<(RRRR(R((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyt
ssh_interfacescC@s4tjdtjd|pt�tdtdt��S(u�
    Return the joyent data center to use, in this order:
        - CLI parameter
        - VM parameter
        - Cloud profile setting
    ulocationR1R<(RR+RRRRAR(R((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytget_location&scC@sR|dkrtd��ni}x*tD]"}i|d6t|d6||<q(W|S(u&
    List all available locations
    uactionufThe avail_locations function must be called with -f or --function, or with the --list-locations optionunameuregion(R	tJOYENT_LOCATIONS(R$R[RY((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytavail_locations9s
cC@s*|t|�krtStjd|�tS(u;
    Find if the provided object has a specific method
    uMethod '%s' not yet supported!(tdirR]R&R'R(tobjtmethod_name((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyt
has_methodZscC@s�|dkrg}ni}|r~t|t�r~xK|D]@}d|kr7d|krf|d|d<n|||d<q7q7Wn|S(u�
    convert list to dictionary using the key as the identifier
    :param items: array to iterate over
    :return: dictionary
    unameuidN(R-R(RC(titemsR[titem((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytkey_listes	
cC@s!t�}||kr||SdS(up
    gets the node from the full node list by name
    :param name: name of the vm
    :return: node object
    N(t
list_nodesR-(RPtnodes((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyR\ys	cC@s<t|�}tddj|d�d|ddd�}|S(u�
    get details about a machine
    :param name: name given to the machine
    :param call: call value in this case is 'action'
    :return: machine information

    CLI Example:

    .. code-block:: bash

        salt-cloud -a show_instance vm_name
    RHumy/machines/{0}uidRJulocationRIuGET(R\RNR(RPR$R_R[((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyR%�s
cC@sSidd6dd6dd6dd6dd6d	d
6}||krEd
}nt||�S(u�
    Convert joyent returned state to state common to other data center return
    values for consistency

    :param id_: joyent state value
    :return: state value
    iurunningiustoppedustoppingiuprovisioningudeletediuunknown(R(tid_tstates((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytjoyent_node_state�s

	cC@s>ddddddddg}g|d<g|d<d	|kr�xO|d	D]@}tjjj|�rx|dj|�qI|dj|�qIWnx'|D]}||kr�d
||<q�q�Wg}|s�x6tj|�D]"}||kr�|j|�q�q�Wnx|D]
}||=qWd|kr:t|d�|d<n|S(u�
    Reformat the returned data from joyent, determine public/private IPs and
    strip out fields if necessary to provide either full or brief content.

    :param item: node dictionary
    :param full: full or brief output
    :return: dict
    uidunameustateu
public_ipsuprivate_ipsusizeuimageulocationuipsN(	R6R7R8tis_public_iptappendR-RtiterkeysR{(Rutfulltdesired_keystipRYtto_del((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyt
reformat_node�s,
	



cC@sG|dkrtd��ni}tr�xtD]�}tddd|dd�}|dtkr�|d	}x[|D]<}d
|krp||d<td|d
|�||d
<qpqpWq.tjd|d	�q.Wnut�}tddd|dd�}|d	}xD|D]<}d
|kr||d<td|d
|�||d
<qqW|S(ux
    list of nodes, keeping only a brief listing

    CLI Example:

    .. code-block:: bash

        salt-cloud -Q
    uactionu=The list_nodes function must be called with -f or --function.RHumy/machinesRJRIuGETiiunameulocationRuRu.Invalid response when listing Joyent nodes: %s(	R	tPOLL_ALL_LOCATIONSRnRNROR�R&R'Rm(RR$R[RJtresultRxR_((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyRw�s0

	


'		


$cC@s(|dkrtd��ntdt�S(u�
    list of nodes, maintaining all content provided from joyent listings

    CLI Example:

    .. code-block:: bash

        salt-cloud -F
    uactionuBThe list_nodes_full function must be called with -f or --function.R(R	RwR](R$((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytlist_nodes_fulls
cC@s#tjjjtd�td|�S(uO
    Return a list of the VMs that are on the provider, with select fields
    ufunctionuquery.selection(R6R7R8tlist_nodes_selectR�R(R$((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyR�scC@s8tjdt�tdtdt�}|tkr4dSdS(u�
    Checks configuration to see whether the user has SSL turned on. Default is:

    .. code-block:: yaml

        use_ssl: True
    uuse_sslR<R1uhttpsuhttp(RRRRRR](tuse_ssl((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyt
_get_protos	cC@s�|dkrtd��ntjdt�tdt�}tjdt�tdtddjtt|��}|j	d�r�|j	d	�r�d
jt
�|�}ntddd
d�\}}tj
|�i}x|D]}|||d<q�W|S(u�
    Get list of available images

    CLI Example:

    .. code-block:: bash

        salt-cloud --list-images

    Can use a custom URL for images. Default is:

    .. code-block:: yaml

        image_url: images.joyent.com/images
    uactionu`The avail_images function must be called with -f or --function, or with the --list-images optionuuserR<u	image_urlR1u{0}{1}/{2}/imagesuhttp://uhttps://u	{0}://{1}RHu	my/imagesRIuGETuname(R	RRRRRRRAtJOYENT_API_HOST_SUFFIXt
startswithR�RNR&R,(R$tusertimg_urltrcodeR.R[RR((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyR1s& 

cC@sM|dkrtd��ntdd�\}}|tkr@iStd|�S(uu
    get list of available packages

    CLI Example:

    .. code-block:: bash

        salt-cloud --list-sizes
    uactionu^The avail_sizes function must be called with -f or --function, or with the --list-sizes optionRHumy/packagesRt(R	RNRORv(R$R�Rt((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyR_s
cC@s{|dkrtjd�tS|s,i}ni}tdddd�\}}x |D]}|d||d<qTWi|d	6S(
u!
    List the keys available
    ufunctionu<The list_keys function must be called with -f or --function.RHumy/keysRIuGETukeyunameukeys(R&R'RRN(RFR$R[R�R.tpair((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyt	list_keysus	
cC@s�|dkrtjd�tS|s,i}nd|krItjd�tStddj|d�dd�\}}ii|d	|d
6d6S(u!
    List the keys available
    ufunctionu<The list_keys function must be called with -f or --function.ukeynameuA keyname is required.RHumy/keys/{0}RIuGETukeyunameukeys(R&R'RRNR(RFR$R�R.((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytshow_key�s	
c	C@sb|dkrtjd�tS|s,i}nd|krItjd�tSd|krftjd�tStjj|d�s�tjd|d�tStjjj	|dd��&}tjj
j|j��|d	<Wd
QXi|dd6|d	d	6}tjj
j|�|d<td
dddd|d�\}}tjtj|��ii|d	|d6d6S(u�
    List the keys available

    CLI Example:

    .. code-block:: bash

        salt-cloud -f import_key joyent keyname=mykey keyfile=/tmp/mykey.pub
    ufunctionu=The import_key function must be called with -f or --function.ukeynameuA keyname is required.ukeyfileu,The location of the SSH keyfile is required.u*The specified keyfile (%s) does not exist.urukeyNunameudataRHumy/keysRIuPOSTR.ukeys(R&R'RtostpathtisfileR6R7tfilestfopentstringutilst
to_unicodetreadRLRMRNR,tpprinttpformat(RFR$tfp_t	send_dataR�R.((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyt
import_key�s2
	

%cC@su|dkrtjd�tS|s,i}nd|krItjd�tStddj|d�dd�\}}|S(	u�
    List the keys available

    CLI Example:

    .. code-block:: bash

        salt-cloud -f delete_key joyent keyname=mykey
    ufunctionu>The delete_keys function must be called with -f or --function.ukeynameuA keyname is required.RHumy/keys/{0}RIuDELETE(R&R'RRNR(RFR$R�R.((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyt
delete_key�s
	
cC@sdjt�||�S(um
    create url from location variable
    :param location: joyent data center location
    :return: url
    u{0}://{1}{2}(RR�(RJtapi_host_suffix((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pytget_location_path�scC@s!tjdt�tdt�}|s4tjd�ntjdt�tdt�}tjdt�tdtdt�}tjdt�tdtdt�}	|	s�tjd�ntjd	t�tdtdt�}
|
s�tjd
�n|s�t�}ntjdt�tdtdt	�}t
d|d
|�}|rH||7}n|rd|dj|�7}ntjd||�|s�|	s�|
s�|r�d0Stjj�}
|
jd�j�}tjj|	d0�}trtjd�}|j|jt��|j�}|j|dd�}n@tj|�}tj�}|j|jt��|j|�}t j!|�}|j"d�}t#|�dkr�dj|d|
�}n?t#|�dkr�dj|d|d|
�}n
tjd�idd6dd6t$d6|d6dj||j%t��d 6}t&|t'�s=i}n|s[tj(j)j*i�}nd0}tj(j+j,||d!|d"|d#|d$td%td&td'td(|d)t�	}tjd*|d+�d,|kr�|d+|d-gSd.|d,kr|d/}tj(j-j.|�}n|d+|gS(1u#
    Make a web call to Joyent
    uuserR<u[username is required for Joyent API requests. Please set one in your provider configurationupasswordu
verify_sslR1uprivate_keyu_ssh_keyfile is required for Joyent API requests.  Please set one in your provider configurationukeynameu_ssh_keyname is required for Joyent API requests.  Please set one in your provider configurationuapi_host_suffixRJR�u/{0}uUser: '%s' on PATH: %su%a, %d %b %Y %H:%M:%S %Zusha256talgou/iu
/{0}/keys/{1}iiu/{0}/users/{1}/keys/{2}uMalformed user stringuapplication/jsonuContent-TypeuAcceptu
X-Api-VersionuDateu0Signature keyId="{0}",algorithm="rsa-sha256" {1}u
Authorizationtparamstheader_dictR.tdecodettexttstatustheaderst
verify_ssltoptsuJoyent Response Status Code: %sustatusuheadersuerroruContent-LengthutextN(/RRRRRR&R'R]RmR�R�RR,R-tdatetimetutcnowtstrftimetstripR6tcrypttget_rsa_keytHAS_M2Rt
MessageDigesttupdatetencodet__salt_system_encoding__tfinaltsignRtnewRtbase64t	b64encodeR^tlentJOYENT_API_VERSIONR�R(R)R7RLRMthttpRNtyamlt	safe_load(tactionRHR=RIRJR.R�tpasswordR�tssh_keyfiletssh_keynameR�R�ttimenowt	timestamptrsa_keytmdtdigesttsignedtrsa_thash_tuser_arrtkeyidR�treturn_contentR�tcontent((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyRN�s�		
 
		
([t__doc__t
__future__RRRR�RiR�R�RfR�tM2CryptoRR]R
R�tImportErrorRtCryptodome.HashRtCryptodome.SignatureRtCrypto.HashtCrypto.Signaturetsalt.extRtsalt.ext.six.movesRtsalt.utils.cloudR6tsalt.utils.filestsalt.utils.httptsalt.utils.jsontsalt.utils.yamltsalt.configRtsalt.cloud.libcloudfuncsRtsalt.exceptionsR	R
RRt	getLoggert__name__R&RR�R�RnRAR�tOKtACCEPTEDtCREATEDt
NO_CONTENTRORRRR!R-R;RGRDR`RbRcRdRaRlRmRoRsRvR\R%R{R�RwR�R�R�RRR�R�R�R�R�RN(((s</usr/lib/python2.7/site-packages/salt/cloud/clouds/joyent.pyt<module>2s�





"
				B	W	02*	!			+)		..	

Zerion Mini Shell 1.0