/keystone/backends/sqlalchemy/models.py

https://github.com/ziadsawalha/keystone · Python · 187 lines · 126 code · 34 blank · 27 comment · 6 complexity · 893070755614df37477c7aeb100eba3a MD5 · raw file

  1. # vim: tabstop=4 shiftwidth=4 softtabstop=4
  2. # Copyright (c) 2010-2011 OpenStack, LLC.
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  13. # implied.
  14. # See the License for the specific language governing permissions and
  15. # limitations under the License.
  16. from sqlalchemy import Column, String, Integer, ForeignKey, \
  17. UniqueConstraint, Boolean, DateTime
  18. from sqlalchemy.exc import IntegrityError
  19. from sqlalchemy.ext.declarative import declarative_base
  20. from sqlalchemy.orm import relationship, object_mapper
  21. # pylint: disable=C0103
  22. Base = declarative_base()
  23. class KeystoneBase(object):
  24. """Base class for Keystone Models."""
  25. __api__ = None
  26. # pylint: disable=C0103
  27. _i = None
  28. def save(self, session=None):
  29. """Save this object."""
  30. if not session:
  31. from keystone.backends.sqlalchemy import get_session
  32. session = get_session()
  33. session.add(self)
  34. try:
  35. session.flush()
  36. except IntegrityError:
  37. raise
  38. def delete(self, session=None):
  39. """Delete this object."""
  40. self.save(session=session)
  41. def __setitem__(self, key, value):
  42. setattr(self, key, value)
  43. def __getitem__(self, key):
  44. return getattr(self, key)
  45. def get(self, key, default=None):
  46. return getattr(self, key, default)
  47. def __iter__(self):
  48. self._i = iter(object_mapper(self).columns)
  49. return self
  50. def next(self):
  51. n = self._i.next().name
  52. return n, getattr(self, n)
  53. def update(self, values):
  54. """Make the model object behave like a dict"""
  55. for k, v in values.iteritems():
  56. setattr(self, k, v)
  57. def iteritems(self):
  58. """Make the model object behave like a dict.
  59. Includes attributes from joins."""
  60. local = dict(self)
  61. joined = dict([(k, v) for k, v in self.__dict__.iteritems()
  62. if not k[0] == '_'])
  63. local.update(joined)
  64. return local.iteritems()
  65. def copy(self):
  66. """Make the model object behave like a dict."""
  67. return dict(self).copy()
  68. # Define associations first
  69. class UserRoleAssociation(Base, KeystoneBase):
  70. __tablename__ = 'user_roles'
  71. id = Column(Integer, primary_key=True)
  72. user_id = Column(Integer, ForeignKey('users.id'))
  73. role_id = Column(Integer, ForeignKey('roles.id'))
  74. tenant_id = Column(Integer, ForeignKey('tenants.id'))
  75. __table_args__ = (UniqueConstraint("user_id", "role_id", "tenant_id"), {})
  76. user = relationship('User')
  77. role = relationship('Role')
  78. class Endpoints(Base, KeystoneBase):
  79. __tablename__ = 'endpoints'
  80. id = Column(Integer, primary_key=True)
  81. tenant_id = Column(Integer)
  82. endpoint_template_id = Column(Integer, ForeignKey('endpoint_templates.id'))
  83. __table_args__ = (
  84. UniqueConstraint("endpoint_template_id", "tenant_id"), {})
  85. # Define objects
  86. class Role(Base, KeystoneBase):
  87. __tablename__ = 'roles'
  88. __api__ = 'role'
  89. id = Column(Integer, primary_key=True, autoincrement=True)
  90. name = Column(String(255))
  91. desc = Column(String(255))
  92. service_id = Column(Integer, ForeignKey('services.id'))
  93. __table_args__ = (
  94. UniqueConstraint("name", "service_id"), {})
  95. class Service(Base, KeystoneBase):
  96. __tablename__ = 'services'
  97. __api__ = 'service'
  98. id = Column(Integer, primary_key=True, autoincrement=True)
  99. name = Column(String(255), unique=True)
  100. type = Column(String(255))
  101. desc = Column(String(255))
  102. owner_id = Column(Integer, ForeignKey('users.id'))
  103. class Tenant(Base, KeystoneBase):
  104. __tablename__ = 'tenants'
  105. __api__ = 'tenant'
  106. id = Column(Integer, primary_key=True, autoincrement=True)
  107. uid = Column(String(255), unique=True, nullable=False)
  108. name = Column(String(255), unique=True)
  109. desc = Column(String(255))
  110. enabled = Column(Integer)
  111. class User(Base, KeystoneBase):
  112. __tablename__ = 'users'
  113. __api__ = 'user'
  114. id = Column(Integer, primary_key=True, autoincrement=True)
  115. uid = Column(String(255), unique=True, nullable=False)
  116. name = Column(String(255), unique=True)
  117. password = Column(String(255))
  118. email = Column(String(255))
  119. enabled = Column(Integer)
  120. tenant_id = Column(Integer, ForeignKey('tenants.id'))
  121. roles = relationship(UserRoleAssociation, cascade="all")
  122. credentials = relationship('Credentials', backref='user', cascade="all")
  123. class Credentials(Base, KeystoneBase):
  124. __tablename__ = 'credentials'
  125. __api__ = 'credentials'
  126. id = Column(Integer, primary_key=True, autoincrement=True)
  127. user_id = Column(Integer, ForeignKey('users.id'))
  128. tenant_id = Column(Integer, ForeignKey('tenants.id'), nullable=True)
  129. type = Column(String(20)) # ('Password','APIKey','EC2')
  130. key = Column(String(255))
  131. secret = Column(String(255))
  132. class Token(Base, KeystoneBase):
  133. __tablename__ = 'tokens'
  134. __api__ = 'token'
  135. id = Column(String(255), primary_key=True, unique=True)
  136. user_id = Column(Integer)
  137. tenant_id = Column(Integer)
  138. expires = Column(DateTime)
  139. class EndpointTemplates(Base, KeystoneBase):
  140. __tablename__ = 'endpoint_templates'
  141. __api__ = 'endpoint_template'
  142. id = Column(Integer, primary_key=True)
  143. region = Column(String(255))
  144. service_id = Column(Integer, ForeignKey('services.id'))
  145. public_url = Column(String(2000))
  146. admin_url = Column(String(2000))
  147. internal_url = Column(String(2000))
  148. enabled = Column(Boolean)
  149. is_global = Column(Boolean)
  150. version_id = Column(String(20))
  151. version_list = Column(String(2000))
  152. version_info = Column(String(500))