Source code for pastry.resources.cookbooks

'''Cookbook provides the methods for chef cookbooks'''

import requests

from .base import Base
from pastry.exceptions import HttpError
from pastry.pastry_client import PastryClient


[docs]class Cookbooks(Base): ''' Provides methods for interacting with chef cookbooks ''' _base_url = '/organizations/%(org)s/cookbooks'
[docs] @classmethod def index(cls): ''' Fetches all of the cookbooks (and versions) on the chef server :return: All the chef cookbooks and versions :rtype: hash '''
return super(Cookbooks, cls).index()
[docs] @classmethod def exists(cls, cookbook): ''' Checks if a cookbook exists on the chef server :param cookbook: The Cookbook's name :type cookbook: string :return: If the cookbook exists :rtype: boolean '''
return super(Cookbooks, cls).exists(cookbook)
[docs] @classmethod def contents(cls, cookbook, version='_latest'): ''' Fetches the cookbooks list of files that chef knows about :param cookbook: The cookbook's name :param version: The cookbook's version :type cookbook: string :type version: string :return: All of the files the cookbook knows about :rtype: hash ''' return PastryClient.call(
'%s/%s/%s' % (cls.base_url(), cookbook, version))
[docs] @classmethod def parse_filename(cls, filename): ''' Splits the file path so that it can be used to call the chef api :param filename: The file's path relative to the cookbook root :type filename: string :return: The type of file, specificity, and filename :rtype: iterable ''' parts = filename.split('/') if len(parts) == 1: return ['root_files', 'default', filename]
return parts
[docs] @classmethod def file_content(cls, cookbook, filename, version='_latest'): ''' Fetches the contents of a specific file in a cookbook :param cookbook: The cookbook's name :param filename: The name (and path) of the file to fetch :param version: The cookbook's version :type cookbook: string :type filename: string :type version: string :return: The raw contents of the specified file :rtype: string ''' file_type, specificity, name = cls.parse_filename(filename) files = cls.contents(cookbook, version=version) for file_info in files[file_type]: if name == file_info['name'] and \ specificity == file_info['specificity']: resp = requests.get( file_info['url'], verify=PastryClient.verify) if not resp.ok: raise HttpError(resp.text, resp.status_code)
return resp.text