Exemple #1
0
def _get_metadata_from_object(conf, instance):
    """Return a metadata dictionary for the instance."""
    instance_type = instance.flavor['name'] if instance.flavor else None
    metadata = {
        'display_name': instance.name,
        'name': getattr(instance, 'OS-EXT-SRV-ATTR:instance_name', u''),
        'instance_id': instance.id,
        'instance_type': instance_type,
        'host': instance.hostId,
        'instance_host': getattr(instance, 'OS-EXT-SRV-ATTR:host', u''),
        'flavor': instance.flavor,
        'status': instance.status.lower(),
        'state': getattr(instance, 'OS-EXT-STS:vm_state', u''),
        'task_state': getattr(instance, 'OS-EXT-STS:task_state', u''),
    }

    # Image properties
    if instance.image:
        metadata['image'] = instance.image
        metadata['image_ref'] = instance.image['id']
        # Images that come through the conductor API in the nova notifier
        # plugin will not have links.
        if instance.image.get('links'):
            metadata['image_ref_url'] = instance.image['links'][0]['href']
        else:
            metadata['image_ref_url'] = None
    else:
        metadata['image'] = None
        metadata['image_ref'] = None
        metadata['image_ref_url'] = None

    for name in INSTANCE_PROPERTIES:
        if hasattr(instance, name):
            metadata[name] = getattr(instance, name)

    metadata['vcpus'] = instance.flavor['vcpus']
    metadata['memory_mb'] = instance.flavor['ram']
    metadata['disk_gb'] = instance.flavor['disk']
    metadata['ephemeral_gb'] = instance.flavor['ephemeral']
    metadata['root_gb'] = (int(metadata['disk_gb']) -
                           int(metadata['ephemeral_gb']))

    return sample.add_reserved_user_metadata(conf, instance.metadata,
                                             metadata)
Exemple #2
0
def _get_metadata_from_object(conf, instance):
    """Return a metadata dictionary for the instance."""
    instance_type = instance.flavor['name'] if instance.flavor else None
    metadata = {
        'display_name': instance.name,
        'name': getattr(instance, 'OS-EXT-SRV-ATTR:instance_name', u''),
        'instance_id': instance.id,
        'instance_type': instance_type,
        'host': instance.hostId,
        'instance_host': getattr(instance, 'OS-EXT-SRV-ATTR:host', u''),
        'flavor': instance.flavor,
        'status': instance.status.lower(),
        'state': getattr(instance, 'OS-EXT-STS:vm_state', u''),
        'task_state': getattr(instance, 'OS-EXT-STS:task_state', u''),
    }

    # Image properties
    if instance.image:
        metadata['image'] = instance.image
        metadata['image_ref'] = instance.image['id']
        # Images that come through the conductor API in the nova notifier
        # plugin will not have links.
        if instance.image.get('links'):
            metadata['image_ref_url'] = instance.image['links'][0]['href']
        else:
            metadata['image_ref_url'] = None
    else:
        metadata['image'] = None
        metadata['image_ref'] = None
        metadata['image_ref_url'] = None

    for name in INSTANCE_PROPERTIES:
        if hasattr(instance, name):
            metadata[name] = getattr(instance, name)

    metadata['vcpus'] = instance.flavor['vcpus']
    metadata['memory_mb'] = instance.flavor['ram']
    metadata['disk_gb'] = instance.flavor['disk']
    metadata['ephemeral_gb'] = instance.flavor['ephemeral']
    metadata['root_gb'] = (int(metadata['disk_gb']) -
                           int(metadata['ephemeral_gb']))

    return sample.add_reserved_user_metadata(conf, instance.metadata, metadata)
Exemple #3
0
    def to_samples(self, message, all_values=False):
        # Sample defaults
        sample = {
            'name': self.cfg["name"],
            'type': self.cfg["type"],
            'unit': self.cfg["unit"],
            'volume': None,
            'timestamp': None,
            'user_id': self._fallback_user_id.parse(message),
            'project_id': self._fallback_project_id.parse(message),
            'resource_id': None,
            'message': message,
            'metadata': {},
        }
        for name, parser in self._metadata_attributes.items():
            value = parser.parse(message)
            if value:
                sample['metadata'][name] = value

        if self._user_meta:
            meta = self._user_meta.parse(message)
            if meta:
                sample_util.add_reserved_user_metadata(self.conf, meta,
                                                       sample['metadata'])

        # NOTE(sileht): We expect multiple samples in the payload
        # so put each attribute into a list
        if self.lookup:
            for name in sample:
                sample[name] = [sample[name]]

        for name in self.SAMPLE_ATTRIBUTES:
            parser = self._attributes.get(name)
            if parser is not None:
                value = parser.parse(message, bool(self.lookup))
                # NOTE(sileht): If we expect multiple samples
                # some attributes are overridden even we don't get any
                # result. Also note in this case value is always a list
                if ((not self.lookup and value is not None)
                        or (self.lookup and
                            ((name in self.lookup + ["name"]) or value))):
                    sample[name] = value

        if self.lookup:
            nb_samples = len(sample['name'])
            # skip if no meters in payload
            if nb_samples <= 0:
                raise StopIteration

            attributes = self.SAMPLE_ATTRIBUTES + ["message", "metadata"]

            samples_values = []
            for name in attributes:
                values = sample.get(name)
                nb_values = len(values)
                if nb_values == nb_samples:
                    samples_values.append(values)
                elif nb_values == 1 and name not in self.lookup:
                    samples_values.append(itertools.cycle(values))
                else:
                    nb = (0 if nb_values == 1 and values[0] is None else
                          nb_values)
                    LOG.warning('Only %(nb)d fetched meters contain '
                                '"%(name)s" field instead of %(total)d.' %
                                dict(name=name, nb=nb, total=nb_samples))
                    raise StopIteration

            # NOTE(sileht): Transform the sample with multiple values per
            # attribute into multiple samples with one value per attribute.
            for values in zip(*samples_values):
                yield dict((attributes[idx], value)
                           for idx, value in enumerate(values))
        else:
            yield sample
    def to_samples(self, message, all_values=False):
        # Sample defaults
        sample = {
            'name': self.cfg["name"], 'type': self.cfg["type"],
            'unit': self.cfg["unit"], 'volume': None, 'timestamp': None,
            'user_id': self._fallback_user_id.parse(message),
            'project_id': self._fallback_project_id.parse(message),
            'resource_id': None, 'message': message, 'metadata': {},
        }
        for name, parser in self._metadata_attributes.items():
            value = parser.parse(message)
            if value:
                sample['metadata'][name] = value

        if self._user_meta:
            meta = self._user_meta.parse(message)
            if meta:
                sample_util.add_reserved_user_metadata(
                    self.conf, meta, sample['metadata'])

        # NOTE(sileht): We expect multiple samples in the payload
        # so put each attribute into a list
        if self.lookup:
            for name in sample:
                sample[name] = [sample[name]]

        for name in self.SAMPLE_ATTRIBUTES:
            parser = self._attributes.get(name)
            if parser is not None:
                value = parser.parse(message, bool(self.lookup))
                # NOTE(sileht): If we expect multiple samples
                # some attributes are overridden even we don't get any
                # result. Also note in this case value is always a list
                if ((not self.lookup and value is not None) or
                        (self.lookup and ((name in self.lookup + ["name"])
                                          or value))):
                    sample[name] = value

        if self.lookup:
            nb_samples = len(sample['name'])
            # skip if no meters in payload
            if nb_samples <= 0:
                raise StopIteration

            attributes = self.SAMPLE_ATTRIBUTES + ["message", "metadata"]

            samples_values = []
            for name in attributes:
                values = sample.get(name)
                nb_values = len(values)
                if nb_values == nb_samples:
                    samples_values.append(values)
                elif nb_values == 1 and name not in self.lookup:
                    samples_values.append(itertools.cycle(values))
                else:
                    nb = (0 if nb_values == 1 and values[0] is None
                          else nb_values)
                    LOG.warning('Only %(nb)d fetched meters contain '
                                '"%(name)s" field instead of %(total)d.' %
                                dict(name=name, nb=nb,
                                     total=nb_samples))
                    raise StopIteration

            # NOTE(sileht): Transform the sample with multiple values per
            # attribute into multiple samples with one value per attribute.
            for values in zip(*samples_values):
                yield dict((attributes[idx], value)
                           for idx, value in enumerate(values))
        else:
            yield sample