def _resource_from_args(self, parsed_args, update=False):
        resource = {}
        if not update:
            resource['id'] = parsed_args.resource_id
        if parsed_args.attribute:
            for attr in parsed_args.attribute:
                attr, __, value = attr.partition(":")
                resource[attr] = value
        if (parsed_args.add_metric or parsed_args.create_metric
                or (update and parsed_args.delete_metric)):
            if update:
                r = self.app.client.resource.get(parsed_args.resource_type,
                                                 parsed_args.resource_id)
                default = r['metrics']
                for metric_name in parsed_args.delete_metric:
                    try:
                        del default[metric_name]
                    except KeyError:
                        raise exceptions.MetricNotFound(
                            message="Metric name %s not found" % metric_name)
            else:
                default = {}
            resource['metrics'] = default
            for metric in parsed_args.add_metric:
                name, _, value = metric.partition(":")
                resource['metrics'][name] = value
            for metric in parsed_args.create_metric:
                name, _, value = metric.partition(":")
                if value is "":
                    resource['metrics'][name] = {}
                else:
                    resource['metrics'][name] = {'archive_policy_name': value}

        return resource
Beispiel #2
0
    def _resource_from_args(self, parsed_args, update=False):
        # Get the resource type to set the correct type
        rt_attrs = utils.get_client(self).resource_type.get(
            name=parsed_args.resource_type)['attributes']
        resource = {}
        if not update:
            resource['id'] = parsed_args.resource_id
        if parsed_args.attribute:
            for attr in parsed_args.attribute:
                attr, __, value = attr.partition(":")
                attr_type = rt_attrs.get(attr, {}).get('type')
                if attr_type == "number":
                    value = float(value)
                elif attr_type == "bool":
                    value = bool(distutils.util.strtobool(value))
                resource[attr] = value
        if (parsed_args.add_metric or
           parsed_args.create_metric or
           (update and parsed_args.delete_metric)):
            if update:
                r = utils.get_client(self).resource.get(
                    parsed_args.resource_type,
                    parsed_args.resource_id)
                default = r['metrics']
                for metric_name in parsed_args.delete_metric:
                    try:
                        del default[metric_name]
                    except KeyError:
                        raise exceptions.MetricNotFound(
                            message="Metric name %s not found" % metric_name)
            else:
                default = {}
            resource['metrics'] = default
            for metric in parsed_args.add_metric:
                name, _, value = metric.partition(":")
                resource['metrics'][name] = value
            for metric in parsed_args.create_metric:
                name, _, value = metric.partition(":")
                if value:
                    resource['metrics'][name] = {'archive_policy_name': value}
                else:
                    resource['metrics'][name] = {}

        return resource
Beispiel #3
0
    def test_workflow(self, fakeclient_cls, logger):
        self.dispatcher = gnocchi.GnocchiDispatcher(self.conf.conf)

        fakeclient = fakeclient_cls.return_value

        # FIXME(sileht): we don't use urlparse.quote here
        # to ensure / is converted in %2F
        # temporary disabled until we find a solution
        # on gnocchi side. Current gnocchiclient doesn't
        # encode the resource_id
        resource_id = self.sample['resource_id']  # .replace("/", "%2F"),
        metric_name = self.sample['counter_name']

        expected_calls = [
            mock.call.capabilities.list(),
            mock.call.metric.add_measures(metric_name,
                                          self.measures_attributes,
                                          resource_id)
        ]

        add_measures_side_effect = []

        if self.measure == 404 and self.post_resource:
            add_measures_side_effect += [gnocchi_exc.ResourceNotFound(404)]
        elif self.measure == 404 and self.metric:
            add_measures_side_effect += [gnocchi_exc.MetricNotFound(404)]
        elif self.measure == 500:
            add_measures_side_effect += [Exception('boom!')]

        if self.post_resource:
            attributes = self.postable_attributes.copy()
            attributes.update(self.patchable_attributes)
            attributes['id'] = self.sample['resource_id']
            attributes['metrics'] = dict(
                (metric_name, {}) for metric_name in self.metric_names)
            expected_calls.append(
                mock.call.resource.create(self.resource_type, attributes))
            if self.post_resource == 409:
                fakeclient.resource.create.side_effect = [
                    gnocchi_exc.ResourceAlreadyExists(409)
                ]
            elif self.post_resource == 500:
                fakeclient.resource.create.side_effect = [Exception('boom!')]

        if self.metric:
            expected_calls.append(
                mock.call.metric.create({
                    'name': self.sample['counter_name'],
                    'resource_id': resource_id
                }))
            if self.metric == 409:
                fakeclient.metric.create.side_effect = [
                    gnocchi_exc.NamedMetricAreadyExists(409)
                ]
            elif self.metric == 500:
                fakeclient.metric.create.side_effect = [Exception('boom!')]

        if self.measure_retry:
            expected_calls.append(
                mock.call.metric.add_measures(metric_name,
                                              self.measures_attributes,
                                              resource_id))
            if self.measure_retry == 204:
                add_measures_side_effect += [None]
            elif self.measure_retry == 500:
                add_measures_side_effect += [Exception('boom!')]
        else:
            add_measures_side_effect += [None]

        if self.patch_resource and self.patchable_attributes:
            expected_calls.append(
                mock.call.resource.update(self.resource_type, resource_id,
                                          self.patchable_attributes))
            if self.patch_resource == 500:
                fakeclient.resource.update.side_effect = [Exception('boom!')]

        fakeclient.metric.add_measures.side_effect = add_measures_side_effect

        self.dispatcher.record_metering_data([self.sample])

        # Check that the last log message is the expected one
        if (self.measure == 500 or self.measure_retry == 500
                or self.metric == 500 or self.post_resource == 500
                or (self.patch_resource == 500 and self.patchable_attributes)):
            logger.error.assert_called_with('boom!', exc_info=True)
        elif self.patch_resource == 204 and self.patchable_attributes:
            logger.debug.assert_called_with('Resource %s updated',
                                            self.sample['resource_id'])
            self.assertEqual(0, logger.error.call_count)
        elif self.measure == 200:
            logger.debug.assert_called_with(
                "Measure posted on metric %s of resource %s",
                self.sample['counter_name'], self.sample['resource_id'])
            self.assertEqual(0, logger.error.call_count)

        self.assertEqual(expected_calls, fakeclient.mock_calls)