def _build_node(node): """Performs the Synchronize step of a Chef run: Uploads needed cookbooks and all roles to a node """ cookbooks = [] # Fetch cookbooks needed for recipes for recipe in lib.get_recipes_in_node(node): recipe = recipe.split('::')[0] if recipe not in cookbooks: cookbooks.append(recipe) # Fetch cookbooks needed for role recipes for role in lib.get_roles_in_node(node): try: with open('roles/' + role + '.json', 'r') as f: try: roles = json.loads(f.read()) except json.decoder.JSONDecodeError as e: msg = 'Little Chef found the following error in your' msg += ' "{0}" role file:\n {1}'.format( role, str(e)) abort(msg) # Reuse _get_recipes_in_node to extract recipes in a role for recipe in lib.get_recipes_in_node(roles): recipe = recipe.split('::')[0] if recipe not in cookbooks: cookbooks.append(recipe) except IOError: abort("Role '{0}' not found".format(role)) # Fetch dependencies warnings = [] for cookbook in cookbooks: for recipe in lib.get_recipes_in_cookbook( cookbook, littlechef.cookbook_paths): for dep in recipe['dependencies']: if dep not in cookbooks: try: lib.get_cookbook_path(dep, littlechef.cookbook_paths) cookbooks.append(dep) except IOError: if dep not in warnings: warnings.append(dep) print "Warning: Possible error because of missing", print "dependency for cookbook {0}".format( recipe['name']) print " Cookbook '{0}' not found".format( dep) time.sleep(1) return cookbooks
def _synchronize_node(configfile, cookbook_paths, node_work_path): """Performs the Synchronize step of a Chef run: Uploads needed cookbooks and all roles to a node """ # Clean up node for path in ['roles'] + cookbook_paths: with hide('stdout'): sudo('rm -rf {0}/{1}'.format(node_work_path, path)) cookbooks = [] with open(configfile, 'r') as f: try: node = json.loads(f.read()) except json.decoder.JSONDecodeError as e: msg = 'Little Chef found the following error in' msg += ' "{0}":\n {1}'.format(configfile, str(e)) abort(msg) # Fetch cookbooks needed for recipes for recipe in lib.get_recipes_in_node(node): recipe = recipe.split('::')[0] if recipe not in cookbooks: cookbooks.append(recipe) # Fetch cookbooks needed for role recipes for role in lib.get_roles_in_node(node): try: with open('roles/' + role + '.json', 'r') as f: try: roles = json.loads(f.read()) except json.decoder.JSONDecodeError as e: msg = 'Little Chef found the following error in your' msg += ' "{0}" role file:\n {1}'.format( role, str(e)) abort(msg) # Reuse _get_recipes_in_node to extract recipes in a role for recipe in lib.get_recipes_in_node(roles): recipe = recipe.split('::')[0] if recipe not in cookbooks: cookbooks.append(recipe) except IOError: abort(colors.red("Role '{0}' not found".format(role))) # Fetch dependencies warnings = [] for cookbook in cookbooks: for recipe in lib.get_recipes_in_cookbook(cookbook, cookbook_paths): for dep in recipe['dependencies']: if dep not in cookbooks: try: lib.get_cookbook_path(dep, cookbook_paths) cookbooks.append(dep) except IOError: if dep not in warnings: warnings.append(dep) print "Warning: Possible error because of missing", print "dependency for cookbook {0}".format(recipe['name']) print " Cookbook '{0}' not found".format(dep) import time time.sleep(1) cookbooks_by_path = {} for cookbook in cookbooks: for cookbook_path in cookbook_paths: path = os.path.join(cookbook_path, cookbook) if os.path.exists(path): cookbooks_by_path[path] = cookbook print "Uploading cookbooks... ({0})".format( ", ".join(c for c in cookbooks)) _upload_and_unpack([p for p in cookbooks_by_path.keys()], node_work_path) print "Uploading roles..." _upload_and_unpack(['roles'], node_work_path)
def _synchronize_node(configfile, cookbook_paths, node_work_path): """Performs the Synchronize step of a Chef run: Uploads needed cookbooks and all roles to a node """ # Clean up node for path in ['roles'] + cookbook_paths: with hide('stdout'): sudo('rm -rf {0}/{1}'.format(node_work_path, path)) cookbooks = [] with open(configfile, 'r') as f: try: node = json.loads(f.read()) except json.decoder.JSONDecodeError as e: msg = 'Little Chef found the following error in' msg += ' "{0}":\n {1}'.format(configfile, str(e)) abort(msg) # Fetch cookbooks needed for recipes for recipe in lib.get_recipes_in_node(node): recipe = recipe.split('::')[0] if recipe not in cookbooks: cookbooks.append(recipe) # Fetch cookbooks needed for role recipes for role in lib.get_roles_in_node(node): try: with open('roles/' + role + '.json', 'r') as f: try: roles = json.loads(f.read()) except json.decoder.JSONDecodeError as e: msg = 'Little Chef found the following error in your' msg += ' "{0}" role file:\n {1}'.format( role, str(e)) abort(msg) # Reuse _get_recipes_in_node to extract recipes in a role for recipe in lib.get_recipes_in_node(roles): recipe = recipe.split('::')[0] if recipe not in cookbooks: cookbooks.append(recipe) except IOError: abort(colors.red("Role '{0}' not found".format(role))) # Fetch dependencies warnings = [] for cookbook in cookbooks: for recipe in lib.get_recipes_in_cookbook(cookbook, cookbook_paths): for dep in recipe['dependencies']: if dep not in cookbooks: try: lib.get_cookbook_path(dep, cookbook_paths) cookbooks.append(dep) except IOError: if dep not in warnings: warnings.append(dep) print "Warning: Possible error because of missing", print "dependency for cookbook {0}".format( recipe['name']) print " Cookbook '{0}' not found".format( dep) import time time.sleep(1) cookbooks_by_path = {} for cookbook in cookbooks: for cookbook_path in cookbook_paths: path = os.path.join(cookbook_path, cookbook) if os.path.exists(path): cookbooks_by_path[path] = cookbook print "Uploading cookbooks... ({0})".format(", ".join(c for c in cookbooks)) _upload_and_unpack([p for p in cookbooks_by_path.keys()], node_work_path) print "Uploading roles..." _upload_and_unpack(['roles'], node_work_path)