~ubuntu-branches/ubuntu/vivid/ceilometer/vivid

« back to all changes in this revision

Viewing changes to ceilometer/storage/sqlalchemy/models.py

  • Committer: Package Import Robot
  • Author(s): Chuck Short
  • Date: 2014-03-06 14:44:28 UTC
  • mto: (28.1.1 utopic-proposed) (1.2.1)
  • mto: This revision was merged to the branch mainline in revision 19.
  • Revision ID: package-import@ubuntu.com-20140306144428-rvphsh4igwyulzf0
Tags: upstream-2014.1~b3
ImportĀ upstreamĀ versionĀ 2014.1~b3

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
"""
20
20
 
21
21
import json
22
 
import urlparse
 
22
import six.moves.urllib.parse as urlparse
23
23
 
24
24
from oslo.config import cfg
25
25
from sqlalchemy import Column, Integer, String, Table, ForeignKey, \
26
 
    Index, UniqueConstraint, BigInteger
27
 
from sqlalchemy import Float, Boolean, Text
 
26
    Index, UniqueConstraint, BigInteger, join
 
27
from sqlalchemy import Float, Boolean, Text, DateTime
28
28
from sqlalchemy.dialects.mysql import DECIMAL
29
29
from sqlalchemy.ext.declarative import declarative_base
30
30
from sqlalchemy.orm import backref
 
31
from sqlalchemy.orm import column_property
31
32
from sqlalchemy.orm import relationship
32
 
from sqlalchemy.types import TypeDecorator, DATETIME
 
33
from sqlalchemy.types import TypeDecorator
33
34
 
34
35
from ceilometer.openstack.common import timeutils
35
36
from ceilometer.storage import models as api_models
38
39
sql_opts = [
39
40
    cfg.StrOpt('mysql_engine',
40
41
               default='InnoDB',
41
 
               help='MySQL engine')
 
42
               help='MySQL engine to use.')
42
43
]
43
44
 
44
45
cfg.CONF.register_opts(sql_opts)
71
72
class PreciseTimestamp(TypeDecorator):
72
73
    """Represents a timestamp precise to the microsecond."""
73
74
 
74
 
    impl = DATETIME
 
75
    impl = DateTime
75
76
 
76
77
    def load_dialect_impl(self, dialect):
77
78
        if dialect.name == 'mysql':
78
79
            return dialect.type_descriptor(DECIMAL(precision=20,
79
80
                                                   scale=6,
80
81
                                                   asdecimal=True))
81
 
        return dialect.type_descriptor(DATETIME())
 
82
        return self.impl
82
83
 
83
84
    def process_bind_param(self, value, dialect):
84
85
        if value is None:
116
117
 
117
118
 
118
119
sourceassoc = Table('sourceassoc', Base.metadata,
119
 
                    Column('meter_id', Integer,
120
 
                           ForeignKey("meter.id")),
 
120
                    Column('sample_id', Integer,
 
121
                           ForeignKey("sample.id")),
121
122
                    Column('project_id', String(255),
122
123
                           ForeignKey("project.id")),
123
124
                    Column('resource_id', String(255),
130
131
Index('idx_su', sourceassoc.c['source_id'], sourceassoc.c['user_id']),
131
132
Index('idx_sp', sourceassoc.c['source_id'], sourceassoc.c['project_id']),
132
133
Index('idx_sr', sourceassoc.c['source_id'], sourceassoc.c['resource_id']),
133
 
Index('idx_sm', sourceassoc.c['source_id'], sourceassoc.c['meter_id']),
 
134
Index('idx_ss', sourceassoc.c['source_id'], sourceassoc.c['sample_id']),
134
135
Index('ix_sourceassoc_source_id', sourceassoc.c['source_id'])
135
 
UniqueConstraint(sourceassoc.c['meter_id'], sourceassoc.c['user_id'],
136
 
                 name='uniq_sourceassoc0meter_id0user_id')
 
136
UniqueConstraint(sourceassoc.c['sample_id'], sourceassoc.c['user_id'],
 
137
                 name='uniq_sourceassoc0sample_id0user_id')
137
138
 
138
139
 
139
140
class Source(Base):
148
149
    __table_args__ = (
149
150
        Index('ix_meta_text_key', 'meta_key'),
150
151
    )
151
 
    id = Column(Integer, ForeignKey('meter.id'), primary_key=True)
 
152
    id = Column(Integer, ForeignKey('sample.id'), primary_key=True)
152
153
    meta_key = Column(String(255), primary_key=True)
153
154
    value = Column(Text)
154
155
 
160
161
    __table_args__ = (
161
162
        Index('ix_meta_bool_key', 'meta_key'),
162
163
    )
163
 
    id = Column(Integer, ForeignKey('meter.id'), primary_key=True)
 
164
    id = Column(Integer, ForeignKey('sample.id'), primary_key=True)
164
165
    meta_key = Column(String(255), primary_key=True)
165
166
    value = Column(Boolean)
166
167
 
172
173
    __table_args__ = (
173
174
        Index('ix_meta_int_key', 'meta_key'),
174
175
    )
175
 
    id = Column(Integer, ForeignKey('meter.id'), primary_key=True)
 
176
    id = Column(Integer, ForeignKey('sample.id'), primary_key=True)
176
177
    meta_key = Column(String(255), primary_key=True)
177
178
    value = Column(BigInteger, default=False)
178
179
 
184
185
    __table_args__ = (
185
186
        Index('ix_meta_float_key', 'meta_key'),
186
187
    )
187
 
    id = Column(Integer, ForeignKey('meter.id'), primary_key=True)
 
188
    id = Column(Integer, ForeignKey('sample.id'), primary_key=True)
188
189
    meta_key = Column(String(255), primary_key=True)
189
 
    value = Column(Float, default=False)
 
190
    value = Column(Float(53), default=False)
190
191
 
191
192
 
192
193
class Meter(Base):
 
194
    """Meter definition data."""
 
195
 
 
196
    __tablename__ = 'meter'
 
197
    __table_args__ = (
 
198
        UniqueConstraint('name', 'type', 'unit', name='def_unique'),
 
199
        Index('ix_meter_name', 'name')
 
200
    )
 
201
    id = Column(Integer, primary_key=True)
 
202
    name = Column(String(255), nullable=False)
 
203
    type = Column(String(255))
 
204
    unit = Column(String(255))
 
205
 
 
206
 
 
207
class Sample(Base):
193
208
    """Metering data."""
194
209
 
195
 
    __tablename__ = 'meter'
 
210
    __tablename__ = 'sample'
196
211
    __table_args__ = (
197
 
        Index('ix_meter_timestamp', 'timestamp'),
198
 
        Index('ix_meter_user_id', 'user_id'),
199
 
        Index('ix_meter_project_id', 'project_id'),
200
 
        Index('idx_meter_rid_cname', 'resource_id', 'counter_name'),
 
212
        Index('ix_sample_timestamp', 'timestamp'),
 
213
        Index('ix_sample_user_id', 'user_id'),
 
214
        Index('ix_sample_project_id', 'project_id'),
201
215
    )
202
216
    id = Column(Integer, primary_key=True)
203
 
    counter_name = Column(String(255))
 
217
    meter_id = Column(Integer, ForeignKey('meter.id'))
204
218
    user_id = Column(String(255), ForeignKey('user.id'))
205
219
    project_id = Column(String(255), ForeignKey('project.id'))
206
220
    resource_id = Column(String(255), ForeignKey('resource.id'))
207
221
    resource_metadata = Column(JSONEncodedDict())
208
 
    counter_type = Column(String(255))
209
 
    counter_unit = Column(String(255))
210
 
    counter_volume = Column(Float(53))
 
222
    volume = Column(Float(53))
211
223
    timestamp = Column(PreciseTimestamp(), default=timeutils.utcnow)
 
224
    recorded_at = Column(PreciseTimestamp(), default=timeutils.utcnow)
212
225
    message_signature = Column(String(1000))
213
226
    message_id = Column(String(1000))
214
227
    sources = relationship("Source", secondary=lambda: sourceassoc)
215
 
    meta_text = relationship("MetaText", backref="meter",
 
228
    meta_text = relationship("MetaText", backref="sample",
216
229
                             cascade="all, delete-orphan")
217
 
    meta_float = relationship("MetaFloat", backref="meter",
 
230
    meta_float = relationship("MetaFloat", backref="sample",
218
231
                              cascade="all, delete-orphan")
219
 
    meta_int = relationship("MetaBigInt", backref="meter",
 
232
    meta_int = relationship("MetaBigInt", backref="sample",
220
233
                            cascade="all, delete-orphan")
221
 
    meta_bool = relationship("MetaBool", backref="meter",
 
234
    meta_bool = relationship("MetaBool", backref="sample",
222
235
                             cascade="all, delete-orphan")
223
236
 
224
237
 
 
238
class MeterSample(Base):
 
239
    """Helper model as many of the filters work against Sample data
 
240
    joined with Meter data.
 
241
    """
 
242
    meter = Meter.__table__
 
243
    sample = Sample.__table__
 
244
    __table__ = join(meter, sample)
 
245
 
 
246
    id = column_property(sample.c.id)
 
247
    meter_id = column_property(meter.c.id, sample.c.meter_id)
 
248
    counter_name = column_property(meter.c.name)
 
249
    counter_type = column_property(meter.c.type)
 
250
    counter_unit = column_property(meter.c.unit)
 
251
    counter_volume = column_property(sample.c.volume)
 
252
    sources = relationship("Source", secondary=lambda: sourceassoc)
 
253
 
 
254
 
225
255
class User(Base):
226
256
    __tablename__ = 'user'
227
257
    id = Column(String(255), primary_key=True)
228
258
    sources = relationship("Source", secondary=lambda: sourceassoc)
229
259
    resources = relationship("Resource", backref='user')
230
 
    meters = relationship("Meter", backref='user')
 
260
    samples = relationship("Sample", backref='user')
231
261
 
232
262
 
233
263
class Project(Base):
235
265
    id = Column(String(255), primary_key=True)
236
266
    sources = relationship("Source", secondary=lambda: sourceassoc)
237
267
    resources = relationship("Resource", backref='project')
238
 
    meters = relationship("Meter", backref='project')
 
268
    samples = relationship("Sample", backref='project')
239
269
 
240
270
 
241
271
class Resource(Base):
250
280
    resource_metadata = Column(JSONEncodedDict())
251
281
    user_id = Column(String(255), ForeignKey('user.id'))
252
282
    project_id = Column(String(255), ForeignKey('project.id'))
253
 
    meters = relationship("Meter", backref='resource')
 
283
    samples = relationship("Sample", backref='resource')
254
284
 
255
285
 
256
286
class Alarm(Base):
267
297
    description = Column(Text)
268
298
    timestamp = Column(PreciseTimestamp, default=timeutils.utcnow)
269
299
 
270
 
    user_id = Column(String(255), ForeignKey('user.id'))
271
 
    project_id = Column(String(255), ForeignKey('project.id'))
 
300
    user_id = Column(String(255))
 
301
    project_id = Column(String(255))
272
302
 
273
303
    state = Column(String(255))
274
304
    state_timestamp = Column(PreciseTimestamp, default=timeutils.utcnow)
279
309
    repeat_actions = Column(Boolean)
280
310
 
281
311
    rule = Column(JSONEncodedDict)
 
312
    time_constraints = Column(JSONEncodedDict)
282
313
 
283
314
 
284
315
class AlarmChange(Base):
377
408
    trait_type = relationship("TraitType", backref=backref('trait_type'))
378
409
 
379
410
    t_string = Column(String(255), nullable=True, default=None)
380
 
    t_float = Column(Float, nullable=True, default=None)
 
411
    t_float = Column(Float(53), nullable=True, default=None)
381
412
    t_int = Column(Integer, nullable=True, default=None)
382
413
    t_datetime = Column(PreciseTimestamp(), nullable=True, default=None)
383
414