initial import
This commit is contained in:
		
							
								
								
									
										101
									
								
								modules/pillar/fulcrm.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								modules/pillar/fulcrm.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,101 @@
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
 | 
			
		||||
import requests
 | 
			
		||||
import requests.exceptions
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
import logging
 | 
			
		||||
log = logging.getLogger(__name__)
 | 
			
		||||
 | 
			
		||||
def __init__(opts):
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
def __virtual__():
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
class TastypieAuth( requests.auth.AuthBase ):
 | 
			
		||||
    def __init__( self, api_username, api_key ):
 | 
			
		||||
        self.api_username = api_username
 | 
			
		||||
        self.api_key = api_key
 | 
			
		||||
 | 
			
		||||
    def __call__( self, r ):
 | 
			
		||||
        r.headers[ 'Authorization' ] = "ApiKey %s:%s" % ( self.api_username, self.api_key )
 | 
			
		||||
        r.headers[ 'Content-Type' ] = "application/json"
 | 
			
		||||
        r.headers[ 'Accept-Encoding' ] = "application/json"
 | 
			
		||||
        return r
 | 
			
		||||
 | 
			
		||||
class API( object ):
 | 
			
		||||
    def __init__( self, api_username, api_key, base = "https://fulcrm.org/api/v2/" ):
 | 
			
		||||
        self.api_username = api_username
 | 
			
		||||
        self.api_key = api_key
 | 
			
		||||
        self.base = base
 | 
			
		||||
        self.auth = TastypieAuth( self.api_username, self.api_key )
 | 
			
		||||
 | 
			
		||||
    def make_request( self, url, data, method, _countdown = 3 ):
 | 
			
		||||
        if not url.startswith( self.base ):
 | 
			
		||||
            url = self.base + url
 | 
			
		||||
 | 
			
		||||
        method = { 'POST': requests.post,
 | 
			
		||||
                   'PATCH': requests.patch,
 | 
			
		||||
                   'GET': requests.get,
 | 
			
		||||
                   'DELETE': requests.delete
 | 
			
		||||
                   }.get( method, requests.get )
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            if data:
 | 
			
		||||
                request = method( url, data = json.dumps( data ), auth = self.auth )
 | 
			
		||||
            else:
 | 
			
		||||
                request = method( url, auth = self.auth )
 | 
			
		||||
        except requests.exceptions.ConnectionError:
 | 
			
		||||
            if _countdown > 0:
 | 
			
		||||
                time.sleep( 5 ** ( 3 - _countdown ) )
 | 
			
		||||
                return self.make_request( url, data, method, _countdown - 1 )
 | 
			
		||||
            else:
 | 
			
		||||
                raise
 | 
			
		||||
        if request.ok:
 | 
			
		||||
            try:
 | 
			
		||||
                return request.json()
 | 
			
		||||
            except:
 | 
			
		||||
                return None
 | 
			
		||||
        else:
 | 
			
		||||
            raise IOError( request.text )
 | 
			
		||||
 | 
			
		||||
    def get_many( self, url, no_d = False ):
 | 
			
		||||
        next = None
 | 
			
		||||
        if no_d:
 | 
			
		||||
            if "?" in url:
 | 
			
		||||
                url = url + "&count=10"
 | 
			
		||||
            else:
 | 
			
		||||
                url = url + "?count=10"
 | 
			
		||||
        else:
 | 
			
		||||
            if "?" in url:
 | 
			
		||||
                url = url + "&expand=d&count=10"
 | 
			
		||||
            else:
 | 
			
		||||
                url = url + "?expand=d&count=10"
 | 
			
		||||
        if not url.startswith( self.base ):
 | 
			
		||||
            url = self.base + url
 | 
			
		||||
        while True:
 | 
			
		||||
            result = self.make_request( url, None, 'GET' )
 | 
			
		||||
            if result:
 | 
			
		||||
                if 'results' in result:
 | 
			
		||||
                    for object in result[ 'results' ]:
 | 
			
		||||
                        yield object
 | 
			
		||||
                if 'next' in result:
 | 
			
		||||
                    next = result.get( 'next', None )
 | 
			
		||||
                    if next:
 | 
			
		||||
                        url = next
 | 
			
		||||
                    else:
 | 
			
		||||
                        return
 | 
			
		||||
            else:
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
def ext_pillar( minion_id, p, **kw ):
 | 
			
		||||
    pillar = {}
 | 
			
		||||
    api = API( api_username = kw.get( 'username' ), api_key = kw.get( 'api_key' ) )
 | 
			
		||||
    for t in api.get_many( 'thing/?name=' + minion_id ):
 | 
			
		||||
        pillar.update( t.get( 'd', {} ) )
 | 
			
		||||
    for t in api.get_many( 'thing/?passport__system=dev.provisioning.faelix.net&passport__passport=' + minion_id ):
 | 
			
		||||
        pillar.update( t.get( 'd', {} ) )
 | 
			
		||||
    for t in api.get_many( 'thing/?passport__system=salt.faelix.net&passport__passport=' + minion_id ):
 | 
			
		||||
        pillar.update( t.get( 'd', {} ) )
 | 
			
		||||
    return { 'fulcrm_thing': pillar }
 | 
			
		||||
		Reference in New Issue
	
	Block a user