Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
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()
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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])
Ejemplo n.º 5
0
Archivo: zuun.py Proyecto: hudl/Tyr
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)
Ejemplo n.º 6
0
    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]