def update_databags(self, global_vars_dict): """Update databag item attributes. :param dict vars_dict: The dictionary used to get attributes from templates. """ databag_names = self.get_chef_databag_names() if not databag_names: return import chef databags_dir = os.path.join(self.tmpl_dir, self.DATABAG_TMPL_DIR) for databag_name in databag_names: tmpl_filename = databag_name + ".tmpl" databag_tmpl_filepath = os.path.join(databags_dir, tmpl_filename) databagitem_attrs = self._generate_databagitem_attributes( databag_tmpl_filepath, global_vars_dict ) if not databagitem_attrs: logging.info("Databag template not found or vars_dict is None") logging.info("databag template is %s", databag_tmpl_filepath) continue databag = self.get_create_databag(databag_name) for item, item_values in databagitem_attrs.iteritems(): databagitem = chef.DataBagItem(databag, item, self.chef_api) for key, value in item_values.iteritems(): databagitem[key] = value databagitem.save()
def create_data_bag(chefapi, data_bag_data, force_update=False): #Checking, chef server has this data bag and will we update it if necessary data_bag_list = chef.DataBag.list(api=chefapi) if data_bag_data['id'] in data_bag_list and not force_update: logger.warning("Found data bag with name '%s'. Skipping it" % data_bag_data['id']) else: if not data_bag_data['id'] in data_bag_list: logger.info("Data bag with name '%s' not found on chef server" % data_bag_data['id']) logger.info("Adding data bag '%s' to chef server" % data_bag_data['id']) new_data_bag = chef.DataBag.create(name=data_bag_data['id'], api=chefapi) bag = chef.DataBagItem.create(new_data_bag, data_bag_data['id'], api=chefapi) else: logger.info( "Data bag with name '%s' found on chef server and will be updated" % data_bag_data['id']) logger.info("Updating data bag '%s' on chef server" % data_bag_data['id']) new_data_bag = chef.DataBag(name=data_bag_data['id'], api=chefapi) bag = chef.DataBagItem(new_data_bag, data_bag_data['id'], api=chefapi) bag.clear() bag.update(data_bag_data) bag.save()
def _update_databag_item(self, target_system, bag_item_name, config, save=True): """update databag item.""" import chef databag_items = self.tmp_databag_items_.setdefault(target_system, {}) if bag_item_name not in databag_items: databag = self._get_databag(target_system) databag_items[bag_item_name] = chef.DataBagItem(databag, bag_item_name, api=self.api_) bag_item = databag_items[bag_item_name] for key, value in config.items(): bag_item[key] = value if save: bag_item.save() logging.debug('save databag item %s to target system %s', bag_item_name, target_system) else: logging.debug('ignore saving databag item %s to target system %s', bag_item_name, target_system)
def _get_databag_item(self, target_system, bag_item_name): """get databag item.""" import chef databag_items = self.tmp_databag_items_.setdefault(target_system, {}) if bag_item_name not in databag_items: databag = self._get_databag(target_system) databag_items[bag_item_name] = chef.DataBagItem(databag, bag_item_name, api=self.api_) return dict(databag_items[bag_item_name])
def update_data_bag_item(node): data_bag_item_name = 'deployment_{}'.format( node.CHEF_ATTRIBUTES['zuun']['deployment']) data_bag_item_node_data = { 'version': node.mongodb_version, 'conf': base64.b64encode(generate_mongo_conf(node)) } try: search_key = node.expanded_replica_set except AttributeError: search_key = None if search_key is None: search_key = node.CHEF_MONGODB_TYPE data_bag_item = {'replica-sets': {}} with chef.autoconfigure(node.chef_path): data_bag = chef.DataBag('zuun') data_bag_item_exists = False if data_bag_item_name in data_bag.keys(): node.log.info( 'Data bag item {} already exists; updating (but not overwriting) if required' .format(data_bag_item_name)) data_bag_item = chef.DataBagItem(data_bag, data_bag_item_name) data_bag_item_exists = True else: node.log.info('Data bag item {} does not exist; creating'.format( data_bag_item_name)) if node.CHEF_MONGODB_TYPE == 'data': source = data_bag_item['replica-sets'] source[search_key] = {'data': data_bag_item_node_data} elif node.CHEF_MONGODB_TYPE == 'config' and search_key != 'config': source = data_bag_item['replica-sets'] source[search_key] = {'config': data_bag_item_node_data} else: source = data_bag_item source[search_key] = data_bag_item_node_data if data_bag_item_exists: data_bag_item.save() else: chef.DataBagItem.create('zuun', data_bag_item_name, **data_bag_item)
def _clean_databag_item(self, target_system, bag_item_name): """clean databag item.""" import chef databag_items = self.tmp_databag_items_.setdefault(target_system, {}) if bag_item_name not in databag_items: databag = self._get_databag(target_system) databag_items[bag_item_name] = chef.DataBagItem(databag, bag_item_name, api=self.api_) bag_item = databag_items[bag_item_name] try: bag_item.delete() logging.debug('databag item %s is removed from target_system %s', bag_item_name, target_system) except Exception as error: logging.debug( 'no databag item %s to delete from target_system %s: %s', bag_item_name, target_system, error) del databag_items[bag_item_name]