15
15
SQLAlchemy models for heat data.
18
from sqlalchemy import *
19
20
from sqlalchemy.orm import relationship, backref, object_mapper
20
21
from sqlalchemy.exc import IntegrityError
21
22
from sqlalchemy.ext.declarative import declarative_base
22
from sqlalchemy import types as types
23
from json import dumps, loads
23
from sqlalchemy import types
24
from json import dumps
25
from json import loads
26
from heat.openstack.common import exception
24
27
from heat.openstack.common import uuidutils
25
28
from heat.openstack.common import timeutils
26
29
from heat.db.sqlalchemy.session import get_session
43
46
"""Base class for Heat Models."""
44
47
__table_args__ = {'mysql_engine': 'InnoDB'}
45
48
__table_initialized__ = False
46
created_at = Column(DateTime, default=timeutils.utcnow)
47
updated_at = Column(DateTime, onupdate=timeutils.utcnow)
49
created_at = sqlalchemy.Column(sqlalchemy.DateTime,
50
default=timeutils.utcnow)
51
updated_at = sqlalchemy.Column(sqlalchemy.DateTime,
52
onupdate=timeutils.utcnow)
49
54
def save(self, session=None):
50
55
"""Save this object."""
58
except IntegrityError, e:
63
except IntegrityError as e:
59
64
if str(e).endswith('is not unique'):
60
65
raise exception.Duplicate(str(e))
106
111
return n, getattr(self, n)
108
113
def update(self, values):
109
"""Make the model object behave like a dict"""
114
"""Make the model object behave like a dict."""
110
115
for k, v in values.iteritems():
111
116
setattr(self, k, v)
123
128
def iteritems(self):
124
129
"""Make the model object behave like a dict.
126
Includes attributes from joins."""
131
Includes attributes from joins.
127
133
local = dict(self)
128
134
joined = dict([(k, v) for k, v in self.__dict__.iteritems()
129
135
if not k[0] == '_'])
135
141
"""Represents an unparsed template which should be in JSON format."""
137
143
__tablename__ = 'raw_template'
138
id = Column(Integer, primary_key=True)
139
template = Column(Json)
144
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
145
template = sqlalchemy.Column(Json)
142
148
class Stack(BASE, HeatBase):
145
151
__tablename__ = 'stack'
147
id = Column(String, primary_key=True, default=uuidutils.generate_uuid)
148
name = Column(String)
149
raw_template_id = Column(
151
ForeignKey('raw_template.id'),
153
id = sqlalchemy.Column(sqlalchemy.String, primary_key=True,
154
default=uuidutils.generate_uuid)
155
name = sqlalchemy.Column(sqlalchemy.String)
156
raw_template_id = sqlalchemy.Column(
158
sqlalchemy.ForeignKey('raw_template.id'),
153
160
raw_template = relationship(RawTemplate, backref=backref('stack'))
154
username = Column(String)
155
tenant = Column(String)
156
status = Column('status', String)
157
status_reason = Column('status_reason', String)
158
parameters = Column('parameters', Json)
159
user_creds_id = Column(
161
ForeignKey('user_creds.id'),
161
username = sqlalchemy.Column(sqlalchemy.String)
162
tenant = sqlalchemy.Column(sqlalchemy.String)
163
action = sqlalchemy.Column('action', sqlalchemy.String)
164
status = sqlalchemy.Column('status', sqlalchemy.String)
165
status_reason = sqlalchemy.Column('status_reason', sqlalchemy.String)
166
parameters = sqlalchemy.Column('parameters', Json)
167
user_creds_id = sqlalchemy.Column(
169
sqlalchemy.ForeignKey('user_creds.id'),
163
owner_id = Column(String, nullable=True)
164
timeout = Column(Integer)
165
disable_rollback = Column(Boolean)
171
owner_id = sqlalchemy.Column(sqlalchemy.String, nullable=True)
172
timeout = sqlalchemy.Column(sqlalchemy.Integer)
173
disable_rollback = sqlalchemy.Column(sqlalchemy.Boolean)
168
176
class UserCreds(BASE, HeatBase):
174
182
__tablename__ = 'user_creds'
176
id = Column(Integer, primary_key=True)
177
username = Column(String)
178
password = Column(String)
179
service_user = Column(String)
180
service_password = Column(String)
181
tenant = Column(String)
182
auth_url = Column(String)
183
aws_auth_url = Column(String)
184
tenant_id = Column(String)
185
aws_creds = Column(String)
184
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
185
username = sqlalchemy.Column(sqlalchemy.String)
186
password = sqlalchemy.Column(sqlalchemy.String)
187
service_user = sqlalchemy.Column(sqlalchemy.String)
188
service_password = sqlalchemy.Column(sqlalchemy.String)
189
tenant = sqlalchemy.Column(sqlalchemy.String)
190
auth_url = sqlalchemy.Column(sqlalchemy.String)
191
aws_auth_url = sqlalchemy.Column(sqlalchemy.String)
192
tenant_id = sqlalchemy.Column(sqlalchemy.String)
193
aws_creds = sqlalchemy.Column(sqlalchemy.String)
186
194
stack = relationship(Stack, backref=backref('user_creds'))
192
200
__tablename__ = 'event'
194
id = Column(Integer, primary_key=True)
195
stack_id = Column(String, ForeignKey('stack.id'), nullable=False)
202
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
203
stack_id = sqlalchemy.Column(sqlalchemy.String,
204
sqlalchemy.ForeignKey('stack.id'),
196
206
stack = relationship(Stack, backref=backref('events'))
198
name = Column(String)
199
logical_resource_id = Column(String)
200
physical_resource_id = Column(String)
201
resource_status_reason = Column(String)
202
resource_type = Column(String)
203
resource_properties = Column(PickleType)
208
resource_action = sqlalchemy.Column(sqlalchemy.String)
209
resource_status = sqlalchemy.Column(sqlalchemy.String)
210
logical_resource_id = sqlalchemy.Column(sqlalchemy.String)
211
physical_resource_id = sqlalchemy.Column(sqlalchemy.String)
212
resource_status_reason = sqlalchemy.Column(sqlalchemy.String)
213
resource_type = sqlalchemy.Column(sqlalchemy.String)
214
resource_properties = sqlalchemy.Column(sqlalchemy.PickleType)
217
class ResourceData(BASE, HeatBase):
218
"""Key/value store of arbitrary, resource-specific data."""
220
__tablename__ = 'resource_data'
222
id = sqlalchemy.Column('id',
226
key = sqlalchemy.Column('key', sqlalchemy.String)
227
value = sqlalchemy.Column('value', sqlalchemy.String)
228
redact = sqlalchemy.Column('redact', sqlalchemy.Boolean)
229
resource_id = sqlalchemy.Column('resource_id',
231
sqlalchemy.ForeignKey('resource.id'),
206
235
class Resource(BASE, HeatBase):
209
238
__tablename__ = 'resource'
211
id = Column(Integer, primary_key=True)
212
state = Column('state', String)
213
name = Column('name', String, nullable=False)
214
nova_instance = Column('nova_instance', String)
215
state_description = Column('state_description', String)
240
id = sqlalchemy.Column(sqlalchemy.String,
242
default=uuidutils.generate_uuid)
243
action = sqlalchemy.Column('action', sqlalchemy.String)
244
status = sqlalchemy.Column('status', sqlalchemy.String)
245
name = sqlalchemy.Column('name', sqlalchemy.String, nullable=False)
246
nova_instance = sqlalchemy.Column('nova_instance', sqlalchemy.String)
247
status_reason = sqlalchemy.Column('status_reason', sqlalchemy.String)
216
248
# odd name as "metadata" is reserved
217
rsrc_metadata = Column('rsrc_metadata', Json)
249
rsrc_metadata = sqlalchemy.Column('rsrc_metadata', Json)
219
stack_id = Column(String, ForeignKey('stack.id'), nullable=False)
251
stack_id = sqlalchemy.Column(sqlalchemy.String,
252
sqlalchemy.ForeignKey('stack.id'),
220
254
stack = relationship(Stack, backref=backref('resources'))
255
data = relationship(ResourceData,
256
cascade="all,delete",
257
backref=backref('resource', lazy='joined'))
223
260
class WatchRule(BASE, HeatBase):
226
263
__tablename__ = 'watch_rule'
228
id = Column(Integer, primary_key=True)
229
name = Column('name', String, nullable=False)
230
rule = Column('rule', Json)
231
state = Column('state', String)
232
last_evaluated = Column(DateTime, default=timeutils.utcnow)
265
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
266
name = sqlalchemy.Column('name', sqlalchemy.String, nullable=False)
267
rule = sqlalchemy.Column('rule', Json)
268
state = sqlalchemy.Column('state', sqlalchemy.String)
269
last_evaluated = sqlalchemy.Column(sqlalchemy.DateTime,
270
default=timeutils.utcnow)
234
stack_id = Column(String, ForeignKey('stack.id'), nullable=False)
272
stack_id = sqlalchemy.Column(sqlalchemy.String,
273
sqlalchemy.ForeignKey('stack.id'),
235
275
stack = relationship(Stack, backref=backref('watch_rule'))
241
281
__tablename__ = 'watch_data'
243
id = Column(Integer, primary_key=True)
244
data = Column('data', Json)
283
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
284
data = sqlalchemy.Column('data', Json)
246
watch_rule_id = Column(
248
ForeignKey('watch_rule.id'),
286
watch_rule_id = sqlalchemy.Column(
288
sqlalchemy.ForeignKey('watch_rule.id'),
250
290
watch_rule = relationship(WatchRule, backref=backref('watch_data'))