Update application_roles table for provisioning.
Adds cloud_id and claimed_until columns to the application_roles table so that rows can be locked when they're being processed and updated with relevant Azure information when processing is finished. Since the claimed_until column is now common to a few different models, I've also moved it to a mixin.
This commit is contained in:
parent
f79af3ad62
commit
4511630787
@ -0,0 +1,29 @@
|
|||||||
|
"""add application_role.cloud_id
|
||||||
|
|
||||||
|
Revision ID: 17da2a475429
|
||||||
|
Revises: 50979d8ef680
|
||||||
|
Create Date: 2020-02-01 10:43:03.073539
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '17da2a475429' # pragma: allowlist secret
|
||||||
|
down_revision = '50979d8ef680' # pragma: allowlist secret
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.add_column('application_roles', sa.Column('cloud_id', sa.String(), nullable=True))
|
||||||
|
op.add_column('application_roles', sa.Column('claimed_until', sa.TIMESTAMP(timezone=True), nullable=True))
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.drop_column('application_roles', 'cloud_id')
|
||||||
|
op.drop_column('application_roles', 'claimed_until')
|
||||||
|
# ### end Alembic commands ###
|
@ -1,4 +1,4 @@
|
|||||||
from sqlalchemy import and_, Column, ForeignKey, String, UniqueConstraint, TIMESTAMP
|
from sqlalchemy import and_, Column, ForeignKey, String, UniqueConstraint
|
||||||
from sqlalchemy.orm import relationship, synonym
|
from sqlalchemy.orm import relationship, synonym
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atst.models.base import Base
|
||||||
@ -9,7 +9,11 @@ from atst.models.types import Id
|
|||||||
|
|
||||||
|
|
||||||
class Application(
|
class Application(
|
||||||
Base, mixins.TimestampsMixin, mixins.AuditableMixin, mixins.DeletableMixin
|
Base,
|
||||||
|
mixins.TimestampsMixin,
|
||||||
|
mixins.AuditableMixin,
|
||||||
|
mixins.DeletableMixin,
|
||||||
|
mixins.ClaimableMixin,
|
||||||
):
|
):
|
||||||
__tablename__ = "applications"
|
__tablename__ = "applications"
|
||||||
|
|
||||||
@ -41,7 +45,6 @@ class Application(
|
|||||||
)
|
)
|
||||||
|
|
||||||
cloud_id = Column(String)
|
cloud_id = Column(String)
|
||||||
claimed_until = Column(TIMESTAMP(timezone=True))
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def users(self):
|
def users(self):
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from enum import Enum
|
from enum import Enum
|
||||||
from sqlalchemy import Index, ForeignKey, Column, Enum as SQLAEnum, Table
|
from sqlalchemy import Index, ForeignKey, Column, Enum as SQLAEnum, Table, String
|
||||||
from sqlalchemy.dialects.postgresql import UUID
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
from sqlalchemy.event import listen
|
from sqlalchemy.event import listen
|
||||||
@ -33,6 +33,7 @@ class ApplicationRole(
|
|||||||
mixins.AuditableMixin,
|
mixins.AuditableMixin,
|
||||||
mixins.PermissionsMixin,
|
mixins.PermissionsMixin,
|
||||||
mixins.DeletableMixin,
|
mixins.DeletableMixin,
|
||||||
|
mixins.ClaimableMixin,
|
||||||
):
|
):
|
||||||
__tablename__ = "application_roles"
|
__tablename__ = "application_roles"
|
||||||
|
|
||||||
@ -59,6 +60,8 @@ class ApplicationRole(
|
|||||||
primaryjoin="and_(EnvironmentRole.application_role_id == ApplicationRole.id, EnvironmentRole.deleted == False)",
|
primaryjoin="and_(EnvironmentRole.application_role_id == ApplicationRole.id, EnvironmentRole.deleted == False)",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cloud_id = Column(String)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def latest_invitation(self):
|
def latest_invitation(self):
|
||||||
if self.invitations:
|
if self.invitations:
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from sqlalchemy import Column, ForeignKey, String, TIMESTAMP, UniqueConstraint
|
from sqlalchemy import Column, ForeignKey, String, UniqueConstraint
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
from sqlalchemy.dialects.postgresql import JSONB
|
from sqlalchemy.dialects.postgresql import JSONB
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
@ -9,7 +9,11 @@ import atst.models.types as types
|
|||||||
|
|
||||||
|
|
||||||
class Environment(
|
class Environment(
|
||||||
Base, mixins.TimestampsMixin, mixins.AuditableMixin, mixins.DeletableMixin
|
Base,
|
||||||
|
mixins.TimestampsMixin,
|
||||||
|
mixins.AuditableMixin,
|
||||||
|
mixins.DeletableMixin,
|
||||||
|
mixins.ClaimableMixin,
|
||||||
):
|
):
|
||||||
__tablename__ = "environments"
|
__tablename__ = "environments"
|
||||||
|
|
||||||
@ -28,8 +32,6 @@ class Environment(
|
|||||||
cloud_id = Column(String)
|
cloud_id = Column(String)
|
||||||
root_user_info = Column(JSONB(none_as_null=True))
|
root_user_info = Column(JSONB(none_as_null=True))
|
||||||
|
|
||||||
claimed_until = Column(TIMESTAMP(timezone=True))
|
|
||||||
|
|
||||||
roles = relationship(
|
roles = relationship(
|
||||||
"EnvironmentRole",
|
"EnvironmentRole",
|
||||||
back_populates="environment",
|
back_populates="environment",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from enum import Enum
|
from enum import Enum
|
||||||
from sqlalchemy import Index, ForeignKey, Column, String, TIMESTAMP, Enum as SQLAEnum
|
from sqlalchemy import Index, ForeignKey, Column, String, Enum as SQLAEnum
|
||||||
from sqlalchemy.dialects.postgresql import UUID
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
@ -15,7 +15,11 @@ class CSPRole(Enum):
|
|||||||
|
|
||||||
|
|
||||||
class EnvironmentRole(
|
class EnvironmentRole(
|
||||||
Base, mixins.TimestampsMixin, mixins.AuditableMixin, mixins.DeletableMixin
|
Base,
|
||||||
|
mixins.TimestampsMixin,
|
||||||
|
mixins.AuditableMixin,
|
||||||
|
mixins.DeletableMixin,
|
||||||
|
mixins.ClaimableMixin,
|
||||||
):
|
):
|
||||||
__tablename__ = "environment_roles"
|
__tablename__ = "environment_roles"
|
||||||
|
|
||||||
@ -33,7 +37,6 @@ class EnvironmentRole(
|
|||||||
application_role = relationship("ApplicationRole")
|
application_role = relationship("ApplicationRole")
|
||||||
|
|
||||||
csp_user_id = Column(String())
|
csp_user_id = Column(String())
|
||||||
claimed_until = Column(TIMESTAMP(timezone=True))
|
|
||||||
|
|
||||||
class Status(Enum):
|
class Status(Enum):
|
||||||
PENDING = "pending"
|
PENDING = "pending"
|
||||||
|
@ -4,3 +4,4 @@ from .permissions import PermissionsMixin
|
|||||||
from .deletable import DeletableMixin
|
from .deletable import DeletableMixin
|
||||||
from .invites import InvitesMixin
|
from .invites import InvitesMixin
|
||||||
from .state_machines import FSMMixin
|
from .state_machines import FSMMixin
|
||||||
|
from .claimable import ClaimableMixin
|
||||||
|
5
atst/models/mixins/claimable.py
Normal file
5
atst/models/mixins/claimable.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from sqlalchemy import Column, TIMESTAMP
|
||||||
|
|
||||||
|
|
||||||
|
class ClaimableMixin(object):
|
||||||
|
claimed_until = Column(TIMESTAMP(timezone=True))
|
Loading…
x
Reference in New Issue
Block a user