65
66
self.source = source
66
67
self.target = target
68
self.scale = target.get('scale')
67
69
LOG.debug(_('scaling conversion transformer with source:'
68
70
' %(source)s target: %(target)s:')
69
71
% {'source': source,
71
73
super(ScalingTransformer, self).__init__(**kwargs)
75
76
"""Apply the scaling factor (either a straight multiplicative
76
77
factor or else a string to be eval'd).
78
79
ns = Namespace(s.as_dict())
80
82
return ((eval(scale, {}, ns) if isinstance(scale, basestring)
81
83
else s.volume * scale) if scale else s.volume)
85
def _map(self, s, attr):
86
"""Apply the name or unit mapping if configured.
89
from_ = self.source.get('map_from')
90
to_ = self.target.get('map_to')
92
if from_.get(attr) and to_.get(attr):
94
mapped = re.sub(from_[attr], to_[attr], getattr(s, attr))
97
return mapped or self.target.get(attr, getattr(s, attr))
83
99
def _convert(self, s, growth=1):
84
100
"""Transform the appropriate sample fields.
86
scale = self.target.get('scale')
87
102
return sample.Sample(
88
name=self.target.get('name', s.name),
89
unit=self.target.get('unit', s.unit),
103
name=self._map(s, 'name'),
104
unit=self._map(s, 'unit'),
90
105
type=self.target.get('type', s.type),
91
volume=self._scale(s, scale) * growth,
106
volume=self._scale(s) * growth,
92
107
user_id=s.user_id,
93
108
project_id=s.project_id,
94
109
resource_id=s.resource_id,
115
130
def __init__(self, **kwargs):
116
131
"""Initialize transformer with configured parameters.
133
super(RateOfChangeTransformer, self).__init__(**kwargs)
119
super(RateOfChangeTransformer, self).__init__(**kwargs)
135
self.scale = self.scale or '1'
121
137
def handle_sample(self, context, s):
122
138
"""Handle a sample, converting if necessary."""