0006_process.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. # Generated by Django 6.0 on 2025-12-31 22:54
  2. import django.db.models.deletion
  3. import django.utils.timezone
  4. import uuid
  5. from django.db import migrations, models
  6. class Migration(migrations.Migration):
  7. dependencies = [
  8. ('machine', '0005_converge_binary_model'),
  9. ]
  10. operations = [
  11. migrations.CreateModel(
  12. name='Process',
  13. fields=[
  14. ('id', models.UUIDField(default=uuid.uuid7, editable=False, primary_key=True, serialize=False, unique=True)),
  15. ('created_at', models.DateTimeField(db_index=True, default=django.utils.timezone.now)),
  16. ('modified_at', models.DateTimeField(auto_now=True)),
  17. ('pwd', models.CharField(blank=True, default='', help_text='Working directory for process execution', max_length=512)),
  18. ('cmd', models.JSONField(blank=True, default=list, help_text='Command as array of arguments')),
  19. ('env', models.JSONField(blank=True, default=dict, help_text='Environment variables for process')),
  20. ('timeout', models.IntegerField(default=120, help_text='Timeout in seconds')),
  21. ('pid', models.IntegerField(blank=True, default=None, help_text='OS process ID', null=True)),
  22. ('exit_code', models.IntegerField(blank=True, default=None, help_text='Process exit code (0 = success)', null=True)),
  23. ('stdout', models.TextField(blank=True, default='', help_text='Standard output from process')),
  24. ('stderr', models.TextField(blank=True, default='', help_text='Standard error from process')),
  25. ('started_at', models.DateTimeField(blank=True, default=None, help_text='When process was launched', null=True)),
  26. ('ended_at', models.DateTimeField(blank=True, default=None, help_text='When process completed/terminated', null=True)),
  27. ('url', models.URLField(blank=True, default=None, help_text='Connection URL (CDP endpoint, sonic server, etc.)', max_length=2048, null=True)),
  28. ('status', models.CharField(choices=[('queued', 'Queued'), ('running', 'Running'), ('exited', 'Exited')], db_index=True, default='queued', max_length=16)),
  29. ('retry_at', models.DateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, help_text='When to retry this process', null=True)),
  30. ('binary', models.ForeignKey(blank=True, help_text='Binary used by this process', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='process_set', to='machine.binary')),
  31. ('iface', models.ForeignKey(blank=True, help_text='Network interface used by this process', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='process_set', to='machine.networkinterface')),
  32. ('machine', models.ForeignKey(help_text='Machine where this process executed', on_delete=django.db.models.deletion.CASCADE, related_name='process_set', to='machine.machine')),
  33. ],
  34. options={
  35. 'verbose_name': 'Process',
  36. 'verbose_name_plural': 'Processes',
  37. 'indexes': [models.Index(fields=['machine', 'status', 'retry_at'], name='machine_pro_machine_5e3a87_idx'), models.Index(fields=['binary', 'exit_code'], name='machine_pro_binary__7bd19c_idx')],
  38. },
  39. ),
  40. ]