2024_07_24_1113-1dd9fa5b38ff_initialize_tables.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. """initialize tables
  2. Revision ID: 1dd9fa5b38ff
  3. Revises:
  4. Create Date: 2024-07-24 11:13:29.124449
  5. """
  6. from typing import Sequence, Union
  7. from pathlib import Path
  8. from alembic import op, context
  9. import sqlalchemy as sa
  10. import sqlmodel
  11. import gpustack
  12. import logging
  13. from gpustack import __version__
  14. logger = logging.getLogger(__name__)
  15. # revision identifiers, used by Alembic.
  16. revision: str = '1dd9fa5b38ff'
  17. down_revision: Union[str, None] = None
  18. branch_labels: Union[str, Sequence[str], None] = None
  19. depends_on: Union[str, Sequence[str], None] = None
  20. def upgrade() -> None:
  21. # ### commands auto generated by Alembic - please adjust! ###
  22. op.create_table('api_keys',
  23. sa.Column('deleted_at', sa.DateTime(), nullable=True),
  24. sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
  25. sa.Column('description', sa.Text(), nullable=True),
  26. sa.Column('id', sa.Integer(), nullable=False),
  27. sa.Column('access_key', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
  28. sa.Column('hashed_secret_key', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
  29. sa.Column('user_id', sa.Integer(), nullable=False),
  30. sa.Column('expires_at', gpustack.schemas.common.UTCDateTime(), nullable=True),
  31. sa.Column('created_at', gpustack.schemas.common.UTCDateTime(), nullable=False),
  32. sa.Column('updated_at', gpustack.schemas.common.UTCDateTime(), nullable=False),
  33. sa.PrimaryKeyConstraint('id'),
  34. sa.UniqueConstraint('hashed_secret_key'),
  35. sa.UniqueConstraint('name', 'user_id', name='uix_name_user_id')
  36. )
  37. op.create_index(op.f('ix_api_keys_access_key'), 'api_keys', ['access_key'], unique=True)
  38. op.create_table('models',
  39. sa.Column('deleted_at', sa.DateTime(), nullable=True),
  40. sa.Column('source', sa.Enum('HUGGING_FACE', 'OLLAMA_LIBRARY', 'MODEL_SCOPE', 'LOCAL_PATH', name='sourceenum'), nullable=False),
  41. sa.Column('huggingface_repo_id', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
  42. sa.Column('huggingface_filename', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
  43. sa.Column('ollama_library_model_name', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
  44. sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
  45. sa.Column('description', sa.Text(), nullable=True),
  46. sa.Column('replicas', sa.Integer(), nullable=False),
  47. sa.Column('ready_replicas', sa.Integer(), nullable=False),
  48. sa.Column('id', sa.Integer(), nullable=False),
  49. sa.Column('created_at', gpustack.schemas.common.UTCDateTime(), nullable=False),
  50. sa.Column('updated_at', gpustack.schemas.common.UTCDateTime(), nullable=False),
  51. sa.PrimaryKeyConstraint('id')
  52. )
  53. op.create_index(op.f('ix_models_name'), 'models', ['name'], unique=True)
  54. op.create_table('system_loads',
  55. sa.Column('id', sa.Integer(), nullable=False),
  56. sa.Column('timestamp', sa.Integer(), nullable=False),
  57. sa.Column('cpu', sa.Float(), nullable=True),
  58. sa.Column('memory', sa.Float(), nullable=True),
  59. sa.Column('gpu', sa.Float(), nullable=True),
  60. sa.Column('gpu_memory', sa.Float(), nullable=True),
  61. sa.PrimaryKeyConstraint('id')
  62. )
  63. op.create_table('users',
  64. sa.Column('deleted_at', sa.DateTime(), nullable=True),
  65. sa.Column('username', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
  66. sa.Column('is_admin', sa.Boolean(), nullable=False),
  67. sa.Column('full_name', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
  68. sa.Column('require_password_change', sa.Boolean(), nullable=False),
  69. sa.Column('id', sa.Integer(), nullable=False),
  70. sa.Column('hashed_password', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
  71. sa.Column('created_at', gpustack.schemas.common.UTCDateTime(), nullable=False),
  72. sa.Column('updated_at', gpustack.schemas.common.UTCDateTime(), nullable=False),
  73. sa.PrimaryKeyConstraint('id')
  74. )
  75. op.create_table('workers',
  76. sa.Column('deleted_at', sa.DateTime(), nullable=True),
  77. sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
  78. sa.Column('hostname', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
  79. sa.Column('ip', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
  80. sa.Column('labels', sa.JSON(), nullable=True),
  81. sa.Column('system_reserved', gpustack.schemas.common.JSON(), nullable=True),
  82. sa.Column('state', sa.Enum('NOT_READY', 'READY', name='workerstateenum'), nullable=False),
  83. sa.Column('state_message', sa.Text(), nullable=True),
  84. sa.Column('status', gpustack.schemas.common.JSON(), nullable=True),
  85. sa.Column('id', sa.Integer(), nullable=False),
  86. sa.Column('created_at', gpustack.schemas.common.UTCDateTime(), nullable=False),
  87. sa.Column('updated_at', gpustack.schemas.common.UTCDateTime(), nullable=False),
  88. sa.PrimaryKeyConstraint('id')
  89. )
  90. op.create_index(op.f('ix_workers_name'), 'workers', ['name'], unique=True)
  91. op.create_table('model_instances',
  92. sa.Column('deleted_at', sa.DateTime(), nullable=True),
  93. sa.Column('source', sa.Enum('HUGGING_FACE', 'OLLAMA_LIBRARY', 'MODEL_SCOPE', 'LOCAL_PATH', name='sourceenum'), nullable=False),
  94. sa.Column('huggingface_repo_id', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
  95. sa.Column('huggingface_filename', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
  96. sa.Column('ollama_library_model_name', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
  97. sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
  98. sa.Column('worker_id', sa.Integer(), nullable=True),
  99. sa.Column('worker_name', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
  100. sa.Column('worker_ip', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
  101. sa.Column('pid', sa.Integer(), nullable=True),
  102. sa.Column('port', sa.Integer(), nullable=True),
  103. sa.Column('download_progress', sa.Float(), nullable=True),
  104. sa.Column('state', sa.Enum('INITIALIZING', 'PENDING', 'RUNNING', 'SCHEDULED', 'ERROR', 'DOWNLOADING', 'ANALYZING', name='modelinstancestateenum'), nullable=False),
  105. sa.Column('state_message', sa.Text(), nullable=True),
  106. sa.Column('computed_resource_claim', gpustack.schemas.common.JSON(), nullable=True),
  107. sa.Column('gpu_index', sa.Integer(), nullable=True),
  108. sa.Column('model_id', sa.Integer(), nullable=False),
  109. sa.Column('model_name', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
  110. sa.Column('id', sa.Integer(), nullable=False),
  111. sa.Column('created_at', gpustack.schemas.common.UTCDateTime(), nullable=False),
  112. sa.Column('updated_at', gpustack.schemas.common.UTCDateTime(), nullable=False),
  113. sa.ForeignKeyConstraint(['model_id'], ['models.id'], ),
  114. sa.PrimaryKeyConstraint('id')
  115. )
  116. op.create_index(op.f('ix_model_instances_name'), 'model_instances', ['name'], unique=True)
  117. op.create_table('model_usages',
  118. sa.Column('id', sa.Integer(), nullable=False),
  119. sa.Column('user_id', sa.Integer(), nullable=False),
  120. sa.Column('model_id', sa.Integer(), nullable=False),
  121. sa.Column('date', sa.Date(), nullable=False),
  122. sa.Column('prompt_token_count', sa.Integer(), nullable=False),
  123. sa.Column('completion_token_count', sa.Integer(), nullable=False),
  124. sa.Column('request_count', sa.Integer(), nullable=False),
  125. sa.Column('operation', sa.Enum('CHAT_COMPLETION', 'COMPLETION', 'EMBEDDING', 'RERANK','IMAGE_GENERATION', name='operationenum'), nullable=False),
  126. sa.ForeignKeyConstraint(['model_id'], ['models.id'], name='fk_model_usages_model_id_models'),
  127. sa.ForeignKeyConstraint(['user_id'], ['users.id'], name='fk_model_usages_user_id_users'),
  128. sa.PrimaryKeyConstraint('id')
  129. )
  130. if context.get_context().config.get_main_option("called_by_db_migration") != "true":
  131. write_bootstrap_version()
  132. # ### end Alembic commands ###
  133. def write_bootstrap_version():
  134. """Writes the bootstrap_version file to the data directory."""
  135. gpustack_config = gpustack.config.config.get_global_config()
  136. data_dir = gpustack_config.data_dir if gpustack_config else "/var/lib/gpustack"
  137. # As of v2.0.1, writes a bootstrap_version file to the data directory.
  138. # We can make compatibility decisions based on this file in the future.
  139. try:
  140. version_file = Path(data_dir) / "bootstrap_version"
  141. version_file.parent.mkdir(parents=True, exist_ok=True)
  142. version_file.write_text(__version__)
  143. logger.debug(f"Created bootstrap_version file at {version_file}")
  144. except FileExistsError:
  145. pass
  146. except Exception as e:
  147. logger.error(f"Error creating version file: {e}")
  148. def downgrade() -> None:
  149. # ### commands auto generated by Alembic - please adjust! ###
  150. op.drop_table('model_usages')
  151. op.drop_index(op.f('ix_model_instances_name'), table_name='model_instances')
  152. op.drop_table('model_instances')
  153. op.drop_index(op.f('ix_workers_name'), table_name='workers')
  154. op.drop_table('workers')
  155. op.drop_table('users')
  156. op.drop_table('system_loads')
  157. op.drop_index(op.f('ix_models_name'), table_name='models')
  158. op.drop_table('models')
  159. op.drop_index(op.f('ix_api_keys_access_key'), table_name='api_keys')
  160. op.drop_table('api_keys')
  161. # ### end Alembic commands ###