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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)))
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)))
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
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)
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])