Пример #1
0
    def cfn_to_monasca(self, stack, properties):
        """Apply all relevant compatibility xforms."""

        kwargs = self.actions_to_urls(stack, properties)
        kwargs['type'] = 'threshold'

        prefix = 'metering.'

        rule = {}
        for field in ['period', 'evaluation_periods', 'threshold',
                      'statistic', 'comparison_operator', 'meter_name']:
            if field in kwargs:
                rule[field] = kwargs[field]
                del kwargs[field]
        mmd = properties.get(self.MATCH_BY) or {}
        expression = properties.get(self.EXPRESSION) or []

        if self.MATCH_BY in kwargs:
            del kwargs[self.MATCH_BY]
        if self.EXPRESSION in kwargs:
            del kwargs[self.EXPRESSION]
        if expression:
            rule['expression'] = expression
        kwargs['threshold_rule'] = rule
        return kwargs
Пример #2
0
    def cfn_to_monasca(self, stack, properties):
        """Apply all relevant compatibility xforms."""

        kwargs = self.actions_to_urls(stack, properties)
        kwargs['type'] = 'threshold'

        prefix = 'metering.'

        rule = {}
        for field in [
                'period', 'evaluation_periods', 'threshold', 'statistic',
                'comparison_operator', 'meter_name'
        ]:
            if field in kwargs:
                rule[field] = kwargs[field]
                del kwargs[field]
        mmd = properties.get(self.MATCH_BY) or {}
        expression = properties.get(self.EXPRESSION) or []

        if self.MATCH_BY in kwargs:
            del kwargs[self.MATCH_BY]
        if self.EXPRESSION in kwargs:
            del kwargs[self.EXPRESSION]
        if expression:
            rule['expression'] = expression
        kwargs['threshold_rule'] = rule
        return kwargs
Пример #3
0
 def _validate_depr_subnet_keys(properties, subnet_key, depr_subnet_key):
     subnet_value = properties.get(subnet_key)
     subnet_id_value = properties.get(depr_subnet_key)
     if subnet_value and subnet_id_value:
         raise exception.ResourcePropertyConflict(subnet_key, subnet_key)
     if not subnet_value and not subnet_id_value:
         return False
     return True
Пример #4
0
 def _validate_depr_subnet_keys(properties, subnet_key, depr_subnet_key):
     subnet_value = properties.get(subnet_key)
     subnet_id_value = properties.get(depr_subnet_key)
     if subnet_value and subnet_id_value:
         raise exception.ResourcePropertyConflict(subnet_key,
                                                  depr_subnet_key)
     if not subnet_value and not subnet_id_value:
         return False
     return True
Пример #5
0
    def _get_new_blacklist_entries(self, properties, current_blacklist):
        insp = grouputils.GroupInspector.from_parent_resource(self)

        # Now we iterate over the removal policies, and update the blacklist
        # with any additional names
        for r in properties.get(self.REMOVAL_POLICIES, []):
            if self.REMOVAL_RSRC_LIST in r:
                # Tolerate string or int list values
                for n in r[self.REMOVAL_RSRC_LIST]:
                    str_n = six.text_type(n)
                    if (str_n in current_blacklist or self.resource_id is None
                            or str_n
                            in insp.member_names(include_failed=True)):
                        yield str_n
                    elif isinstance(n, six.string_types):
                        try:
                            refids = self.get_output(self.REFS_MAP)
                        except (exception.NotFound,
                                exception.TemplateOutputError) as op_err:
                            LOG.debug(
                                'Falling back to resource_by_refid() '
                                ' due to %s', op_err)
                            rsrc = self.nested().resource_by_refid(n)
                            if rsrc is not None:
                                yield rsrc.name
                        else:
                            if refids is not None:
                                for name, refid in refids.items():
                                    if refid == n:
                                        yield name
                                        break

        # Clear output cache from prior to stack update, so we don't get
        # outdated values after stack update.
        self._outputs = None
Пример #6
0
    def _get_new_blacklist_entries(self, properties, current_blacklist):
        insp = grouputils.GroupInspector.from_parent_resource(self)

        # Now we iterate over the removal policies, and update the blacklist
        # with any additional names
        for r in properties.get(self.REMOVAL_POLICIES, []):
            if self.REMOVAL_RSRC_LIST in r:
                # Tolerate string or int list values
                for n in r[self.REMOVAL_RSRC_LIST]:
                    str_n = six.text_type(n)
                    if (str_n in current_blacklist or
                            self.resource_id is None or
                            str_n in insp.member_names(include_failed=True)):
                        yield str_n
                    elif isinstance(n, six.string_types):
                        try:
                            refids = self.get_output(self.REFS_MAP)
                        except (exception.NotFound,
                                exception.TemplateOutputError) as op_err:
                            LOG.debug('Falling back to resource_by_refid() '
                                      ' due to %s', op_err)
                            rsrc = self.nested().resource_by_refid(n)
                            if rsrc is not None:
                                yield rsrc.name
                        else:
                            if refids is not None:
                                for name, refid in refids.items():
                                    if refid == n:
                                        yield name
                                        break

        # Clear output cache from prior to stack update, so we don't get
        # outdated values after stack update.
        self._outputs = None
Пример #7
0
 def _get_args(self, properties):
     """Get pyrax-style create arguments for scaling policies."""
     args = dict(
         scaling_group=properties[self.GROUP],
         name=properties[self.NAME],
         policy_type=properties[self.TYPE],
         cooldown=properties[self.COOLDOWN],
     )
     if properties.get(self.CHANGE) is not None:
         args['change'] = properties[self.CHANGE]
     elif properties.get(self.CHANGE_PERCENT) is not None:
         args['change'] = properties[self.CHANGE_PERCENT]
         args['is_percent'] = True
     elif properties.get(self.DESIRED_CAPACITY) is not None:
         args['desired_capacity'] = properties[self.DESIRED_CAPACITY]
     if properties.get(self.ARGS) is not None:
         args['args'] = properties[self.ARGS]
     return args
Пример #8
0
 def _get_args(self, properties):
     """Get pyrax-style create arguments for scaling policies."""
     args = dict(
         scaling_group=properties[self.GROUP],
         name=properties[self.NAME],
         policy_type=properties[self.TYPE],
         cooldown=properties[self.COOLDOWN],
     )
     if properties.get(self.CHANGE) is not None:
         args['change'] = properties[self.CHANGE]
     elif properties.get(self.CHANGE_PERCENT) is not None:
         args['change'] = properties[self.CHANGE_PERCENT]
         args['is_percent'] = True
     elif properties.get(self.DESIRED_CAPACITY) is not None:
         args['desired_capacity'] = properties[self.DESIRED_CAPACITY]
     if properties.get(self.ARGS) is not None:
         args['args'] = properties[self.ARGS]
     return args
Пример #9
0
    def cfn_to_ceilometer(self, stack, properties):
        """Apply all relevant compatibility xforms."""

        kwargs = actions_to_urls(stack, properties)
        kwargs['type'] = 'threshold'
        if kwargs.get(self.METER_NAME) in NOVA_METERS:
            prefix = 'user_metadata.'
        else:
            prefix = 'metering.'

        rule = {}
        for field in [
                'period', 'evaluation_periods', 'threshold', 'statistic',
                'comparison_operator', 'meter_name'
        ]:
            if field in kwargs:
                rule[field] = kwargs[field]
                del kwargs[field]
        mmd = properties.get(self.MATCHING_METADATA) or {}
        query = properties.get(self.QUERY) or []

        # make sure the matching_metadata appears in the query like this:
        # {field: metadata.$prefix.x, ...}
        for m_k, m_v in six.iteritems(mmd):
            key = 'metadata.%s' % prefix
            if m_k.startswith('metadata.'):
                m_k = m_k[len('metadata.'):]
            if m_k.startswith('metering.') or m_k.startswith('user_metadata.'):
                # check prefix
                m_k = m_k.split('.', 1)[-1]
            key = '%s%s' % (key, m_k)
            # NOTE(prazumovsky): type of query value must be a string, but
            # matching_metadata value type can not be a string, so we
            # must convert value to a string type.
            query.append(dict(field=key, op='eq', value=six.text_type(m_v)))
        if self.MATCHING_METADATA in kwargs:
            del kwargs[self.MATCHING_METADATA]
        if self.QUERY in kwargs:
            del kwargs[self.QUERY]
        if query:
            rule['query'] = query
        kwargs['threshold_rule'] = rule
        return kwargs
Пример #10
0
    def handle_create(self):
        properties = self.prepare_properties(self.properties, self.physical_resource_name())

        properties["listener_id"] = properties.pop(self.LISTENER)
        session_p = properties.get(self.SESSION_PERSISTENCE)
        if session_p is not None:
            session_props = self.prepare_properties(session_p, None)
            properties[self.SESSION_PERSISTENCE] = session_props

        return properties
Пример #11
0
    def handle_create(self):
        properties = self.prepare_properties(self.properties,
                                             self.physical_resource_name())

        properties['listener_id'] = properties.pop(self.LISTENER)
        session_p = properties.get(self.SESSION_PERSISTENCE)
        if session_p is not None:
            session_props = self.prepare_properties(session_p, None)
            properties[self.SESSION_PERSISTENCE] = session_props

        return properties
Пример #12
0
    def cfn_to_ceilometer(self, stack, properties):
        """Apply all relevant compatibility xforms."""

        kwargs = actions_to_urls(stack, properties)
        kwargs['type'] = 'threshold'
        if kwargs.get(self.METER_NAME) in NOVA_METERS:
            prefix = 'user_metadata.'
        else:
            prefix = 'metering.'

        rule = {}
        for field in ['period', 'evaluation_periods', 'threshold',
                      'statistic', 'comparison_operator', 'meter_name']:
            if field in kwargs:
                rule[field] = kwargs[field]
                del kwargs[field]
        mmd = properties.get(self.MATCHING_METADATA) or {}
        query = properties.get(self.QUERY) or []

        # make sure the matching_metadata appears in the query like this:
        # {field: metadata.$prefix.x, ...}
        for m_k, m_v in six.iteritems(mmd):
            key = 'metadata.%s' % prefix
            if m_k.startswith('metadata.'):
                m_k = m_k[len('metadata.'):]
            if m_k.startswith('metering.') or m_k.startswith('user_metadata.'):
                # check prefix
                m_k = m_k.split('.', 1)[-1]
            key = '%s%s' % (key, m_k)
            # NOTE(prazumovsky): type of query value must be a string, but
            # matching_metadata value type can not be a string, so we
            # must convert value to a string type.
            query.append(dict(field=key, op='eq', value=six.text_type(m_v)))
        if self.MATCHING_METADATA in kwargs:
            del kwargs[self.MATCHING_METADATA]
        if self.QUERY in kwargs:
            del kwargs[self.QUERY]
        if query:
            rule['query'] = query
        kwargs['threshold_rule'] = rule
        return kwargs
Пример #13
0
    def handle_create(self):
        properties = self.prepare_properties(
            self.properties,
            self.physical_resource_name())

        self.client_plugin().resolve_listener(
            properties, self.LISTENER, 'listener_id')

        session_p = properties.get(self.SESSION_PERSISTENCE)
        if session_p is not None:
            session_props = self.prepare_properties(session_p, None)
            properties[self.SESSION_PERSISTENCE] = session_props

        return properties
Пример #14
0
    def cfn_to_ceilometer(self, stack, properties):
        """Apply all relevant compatibility xforms."""

        kwargs = actions_to_urls(stack, properties)
        kwargs['type'] = 'threshold'
        rule = {}
        for field in ['period', 'evaluation_periods', 'threshold',
                      'statistic', 'comparison_operator', 'meter_name']:
            if field in kwargs:
                rule[field] = kwargs[field]
                del kwargs[field]
        mmd = properties.get(self.MATCHING_METADATA) or {}
        query = properties.get(self.QUERY) or []

        if kwargs.get(self.METER_NAME) in NOVA_METERS:
            prefix = 'user_metadata.'
        else:
            prefix = 'metering.'

        # make sure the matching_metadata appears in the query like this:
        # {field: metadata.$prefix.x, ...}
        for m_k, m_v in six.iteritems(mmd):
            if m_k.startswith('metadata.%s' % prefix):
                key = m_k
            elif m_k.startswith(prefix):
                key = 'metadata.%s' % m_k
            else:
                key = 'metadata.%s%s' % (prefix, m_k)
            query.append(dict(field=key, op='eq', value=m_v))
        if self.MATCHING_METADATA in kwargs:
            del kwargs[self.MATCHING_METADATA]
        if self.QUERY in kwargs:
            del kwargs[self.QUERY]
        if query:
            rule['query'] = query
        kwargs['threshold_rule'] = rule
        return kwargs
Пример #15
0
    def cfn_to_monasca(self, stack, properties):
        """Apply all relevant compatibility xforms."""

        kwargs = self.actions_to_urls(stack, properties)

        prefix = 'metering.'

        rule = {}
        for field in ['name', 'type', 'address']:
            if field in kwargs:
                rule[field] = kwargs[field]
                del kwargs[field]
        mmd = properties.get(self.MATCHING_METADATA) or {}
        query = properties.get(self.QUERY) or []

        # make sure the matching_metadata appears in the query like this:
        # {field: metadata.$prefix.x, ...}
        for m_k, m_v in six.iteritems(mmd):
            if m_k.startswith('metadata.%s' % prefix):
                key = m_k
            elif m_k.startswith(prefix):
                key = 'metadata.%s' % m_k
            else:
                key = 'metadata.%s%s' % (prefix, m_k)
            # NOTE(prazumovsky): type of query value must be a string, but
            # matching_metadata value type can not be a string, so we
            # must convert value to a string type.
            query.append(dict(field=key, op='eq', value=six.text_type(m_v)))
        if self.MATCHING_METADATA in kwargs:
            del kwargs[self.MATCHING_METADATA]
        if self.QUERY in kwargs:
            del kwargs[self.QUERY]
        if query:
            rule['query'] = query
        kwargs['threshold_rule'] = rule
        return kwargs
Пример #16
0
    def cfn_to_monasca(self, stack, properties):
        """Apply all relevant compatibility xforms."""

        kwargs = self.actions_to_urls(stack, properties)

        prefix = 'metering.'

        rule = {}
        for field in ['name', 'type', 'address']:
            if field in kwargs:
                rule[field] = kwargs[field]
                del kwargs[field]
        mmd = properties.get(self.MATCHING_METADATA) or {}
        query = properties.get(self.QUERY) or []

        # make sure the matching_metadata appears in the query like this:
        # {field: metadata.$prefix.x, ...}
        for m_k, m_v in six.iteritems(mmd):
            if m_k.startswith('metadata.%s' % prefix):
                key = m_k
            elif m_k.startswith(prefix):
                key = 'metadata.%s' % m_k
            else:
                key = 'metadata.%s%s' % (prefix, m_k)
            # NOTE(prazumovsky): type of query value must be a string, but
            # matching_metadata value type can not be a string, so we
            # must convert value to a string type.
            query.append(dict(field=key, op='eq', value=six.text_type(m_v)))
        if self.MATCHING_METADATA in kwargs:
            del kwargs[self.MATCHING_METADATA]
        if self.QUERY in kwargs:
            del kwargs[self.QUERY]
        if query:
            rule['query'] = query
        kwargs['threshold_rule'] = rule
        return kwargs
Пример #17
0
    def prepare_properties(self, properties, name):
        props = dict((k, v) for k, v in properties.items()
                     if v is not None and k != self.SERVICE_LIST)

        if 'name' in properties.keys():
            props.setdefault('name', name)

        if self.SERVICE_LIST in properties.keys():
            services = properties.get(self.SERVICE_LIST)
            if len(services) > 0:
                prop = dict()
                prop['nuage_services'] = ",".join(str(i) for i in services)
                props.update(prop)

        return props
Пример #18
0
    def _update_name_blacklist(self, properties):
        """Resolve the remove_policies to names for removal."""
        # To avoid reusing names after removal, we store a comma-separated
        # blacklist in the resource data - in cases where you want to
        # overwrite the stored data, removal_policies_mode: update can be used
        curr_bl = set(self._current_blacklist())
        p_mode = properties.get(self.REMOVAL_POLICIES_MODE,
                                self.REMOVAL_POLICY_APPEND)
        if p_mode == self.REMOVAL_POLICY_UPDATE:
            init_bl = set()
        else:
            init_bl = curr_bl
        updated_bl = init_bl | set(
            self._get_new_blacklist_entries(properties, curr_bl))

        # If the blacklist has changed, update the resource data
        if updated_bl != curr_bl:
            self.data_set('name_blacklist', ','.join(sorted(updated_bl)))
Пример #19
0
    def _update_name_blacklist(self, properties):
        """Resolve the remove_policies to names for removal."""
        # To avoid reusing names after removal, we store a comma-separated
        # blacklist in the resource data - in cases where you want to
        # overwrite the stored data, removal_policies_mode: update can be used
        curr_bl = set(self._current_blacklist())
        p_mode = properties.get(self.REMOVAL_POLICIES_MODE,
                                self.REMOVAL_POLICY_APPEND)
        if p_mode == self.REMOVAL_POLICY_UPDATE:
            init_bl = set()
        else:
            init_bl = curr_bl
        updated_bl = init_bl | set(self._get_new_blacklist_entries(properties,
                                                                   curr_bl))

        # If the blacklist has changed, update the resource data
        if updated_bl != curr_bl:
            self.data_set('name_blacklist', ','.join(sorted(updated_bl)))
Пример #20
0
    def cfn_to_ceilometer(self, stack, properties):
        kwargs = actions_to_urls(stack, properties)
        if self.MATCHING_METADATA not in properties:
            return kwargs
        if kwargs.get(self.METER_NAME) in NOVA_METERS:
            prefix = 'user_metadata.'
        else:
            prefix = 'metering.'

        # make sure we have matching_metadata that looks like this:
        # matching_metadata: {metadata.$prefix.x}
        kwargs[self.MATCHING_METADATA] = {}
        for m_k, m_v in six.iteritems(
                properties.get(self.MATCHING_METADATA, {})):
            if m_k.startswith('metadata.%s' % prefix):
                key = m_k
            elif m_k.startswith(prefix):
                key = 'metadata.%s' % m_k
            else:
                key = 'metadata.%s%s' % (prefix, m_k)
            kwargs[self.MATCHING_METADATA][key] = m_v
        return kwargs
Пример #21
0
 def _validate_depr_keys(self, properties, key, depr_key):
     value = properties.get(key)
     depr_value = properties.get(depr_key)
     if value and depr_value:
         raise exception.ResourcePropertyConflict(value, depr_value)
Пример #22
0
    def _get_nova_metadata(self, properties):
        if properties is None or properties.get(self.TAGS) is None:
            return None

        return dict((tm[self.TAG_KEY], tm[self.TAG_VALUE])
                    for tm in properties[self.TAGS])
Пример #23
0
    def _get_nova_metadata(self, properties):
        if properties is None or properties.get(self.TAGS) is None:
            return None

        return dict((tm[self.TAG_KEY], tm[self.TAG_VALUE])
                    for tm in properties[self.TAGS])
Пример #24
0
 def _validate_depr_keys(self, properties, key, depr_key):
     value = properties.get(key)
     depr_value = properties.get(depr_key)
     if value and depr_value:
         raise exception.ResourcePropertyConflict(value, depr_value)