Skip to content
This repository was archived by the owner on May 9, 2020. It is now read-only.
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions chef/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from chef.client import Client
from chef.data_bag import DataBag, DataBagItem
from chef.exceptions import ChefError
from chef.cookbook import Cookbook
from chef.node import Node
from chef.role import Role
from chef.environment import Environment
Expand Down
12 changes: 10 additions & 2 deletions chef/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,20 @@ class ChefObject(object):

api_version = '0.9'

def __init__(self, name, api=None, skip_load=False):
def __init__(self, name, version='_latest', api=None, skip_load=False):
self.name = name
self.api = api or ChefAPI.get_global()
self._check_api_version(self.api)

self.url = self.__class__.url + '/' + self.name
# Cookbooks need some special handling, and we default to the
# latest revision if version goes unspecified.
if type(self).__name__ == 'Cookbook':
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs to get moved to a classmethod.

self.version = version
self.versions = self.versions(name)
self.url = "{0}/{1}/{2}".format(self.__class__.url, self.name, self.version)
else:
self.url = self.__class__.url + '/' + self.name

self.exists = False
data = {}
if not skip_load:
Expand Down
46 changes: 46 additions & 0 deletions chef/cookbook.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from chef.base import ChefObject, ChefAPI
from chef.exceptions import ChefServerNotFoundError

class Cookbook(ChefObject):
"""
A Chef Cookbook object.
"""

url = '/cookbooks'

attributes = {
'definitions': list,
'name': str,
'attributetes': list,
'files': list,
'json_class': str,
'providers': list,
'metadata': dict,
'libraries': list,
'templates': list,
'resources': list,
'cookbook_name': str,
'version': str,
'recipes': list,
'root_files': list,
'chef_type': str
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs trailing comma.

}


@staticmethod
def versions(name, api=None):
"""
Get a list of versions for the named cookbook
"""
api = api or ChefAPI.get_global()
url = "{0}/{1}".format(Cookbook.url, name)
try:
data = api[url]
except ChefServerNotFoundError:
return list()
return list([ rev['version'] for rev in data[name]['versions'] ])


def __getitem__(self, attr):
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is neither a good idea nor particularly helpful.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for reviewing the pull request. It's been awhile since I wrote this, but I recall writing this for use in generating a tabular cookbook report in which the column headers were environments and there was a single row per cookbook, with the fields mapping cookbook versions to each of the environments. Working with several environments, it was a quick way to ascertain what the version differences were and to quickly identify a few version issues (e.g. catching not having tied the "production" environment to a specific version, potentially a bad thing if uploading a newer version of a cookbook...). I might have used the versions method as part of that, but don't recall exactly if it was useful for my purposes or if I just threw it in...

return self.__dict__[attr]