Skip to content

Commit 1ab7507

Browse files
committed
feat(nimbus): add state machine for rollouts
1 parent fd50dd3 commit 1ab7507

10 files changed

Lines changed: 850 additions & 14 deletions

File tree

docs/experimenter/openapi-schema.json

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@
177177
"Draft",
178178
"Preview",
179179
"Live",
180-
"Complete"
180+
"Complete",
181+
"Paused"
181182
]
182183
}
183184
},
@@ -273,7 +274,8 @@
273274
"Draft",
274275
"Preview",
275276
"Live",
276-
"Complete"
277+
"Complete",
278+
"Paused"
277279
]
278280
}
279281
},
@@ -621,7 +623,8 @@
621623
"Draft",
622624
"Preview",
623625
"Live",
624-
"Complete"
626+
"Complete",
627+
"Paused"
625628
]
626629
}
627630
},
@@ -699,7 +702,8 @@
699702
"Draft",
700703
"Preview",
701704
"Live",
702-
"Complete"
705+
"Complete",
706+
"Paused"
703707
]
704708
}
705709
},
@@ -783,7 +787,8 @@
783787
"Draft",
784788
"Preview",
785789
"Live",
786-
"Complete"
790+
"Complete",
791+
"Paused"
787792
]
788793
}
789794
},
@@ -888,7 +893,8 @@
888893
"Draft",
889894
"Preview",
890895
"Live",
891-
"Complete"
896+
"Complete",
897+
"Paused"
892898
]
893899
}
894900
},
@@ -1287,7 +1293,8 @@
12871293
"Draft",
12881294
"Preview",
12891295
"Live",
1290-
"Complete"
1296+
"Complete",
1297+
"Paused"
12911298
],
12921299
"type": "string"
12931300
},

docs/experimenter/swagger-ui.html

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@
189189
"Draft",
190190
"Preview",
191191
"Live",
192-
"Complete"
192+
"Complete",
193+
"Paused"
193194
]
194195
}
195196
},
@@ -285,7 +286,8 @@
285286
"Draft",
286287
"Preview",
287288
"Live",
288-
"Complete"
289+
"Complete",
290+
"Paused"
289291
]
290292
}
291293
},
@@ -633,7 +635,8 @@
633635
"Draft",
634636
"Preview",
635637
"Live",
636-
"Complete"
638+
"Complete",
639+
"Paused"
637640
]
638641
}
639642
},
@@ -711,7 +714,8 @@
711714
"Draft",
712715
"Preview",
713716
"Live",
714-
"Complete"
717+
"Complete",
718+
"Paused"
715719
]
716720
}
717721
},
@@ -795,7 +799,8 @@
795799
"Draft",
796800
"Preview",
797801
"Live",
798-
"Complete"
802+
"Complete",
803+
"Paused"
799804
]
800805
}
801806
},
@@ -900,7 +905,8 @@
900905
"Draft",
901906
"Preview",
902907
"Live",
903-
"Complete"
908+
"Complete",
909+
"Paused"
904910
]
905911
}
906912
},
@@ -1299,7 +1305,8 @@
12991305
"Draft",
13001306
"Preview",
13011307
"Live",
1302-
"Complete"
1308+
"Complete",
1309+
"Paused"
13031310
],
13041311
"type": "string"
13051312
},

experimenter/experimenter/experiments/constants.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,10 @@ class Status(models.TextChoices):
330330
LIVE = "Live"
331331
COMPLETE = "Complete"
332332

333+
# This status applies only to rollouts, and indicates that the rollout has been
334+
# paused. It is not a valid status for experiments.
335+
PAUSED = "Paused"
336+
333337
class PublishStatus(models.TextChoices):
334338
IDLE = "Idle"
335339
REVIEW = "Review"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Generated by Django 5.2.14 on 2026-06-24 18:17
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('experiments', '0331_alter_nimbusalert_alert_type'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='nimbuschangelog',
15+
name='new_status',
16+
field=models.CharField(choices=[('Draft', 'Draft'), ('Preview', 'Preview'), ('Live', 'Live'), ('Complete', 'Complete'), ('Paused', 'Paused')], max_length=255),
17+
),
18+
migrations.AlterField(
19+
model_name='nimbuschangelog',
20+
name='new_status_next',
21+
field=models.CharField(blank=True, choices=[('Draft', 'Draft'), ('Preview', 'Preview'), ('Live', 'Live'), ('Complete', 'Complete'), ('Paused', 'Paused')], max_length=255, null=True),
22+
),
23+
migrations.AlterField(
24+
model_name='nimbuschangelog',
25+
name='old_status',
26+
field=models.CharField(blank=True, choices=[('Draft', 'Draft'), ('Preview', 'Preview'), ('Live', 'Live'), ('Complete', 'Complete'), ('Paused', 'Paused')], max_length=255, null=True),
27+
),
28+
migrations.AlterField(
29+
model_name='nimbuschangelog',
30+
name='old_status_next',
31+
field=models.CharField(blank=True, choices=[('Draft', 'Draft'), ('Preview', 'Preview'), ('Live', 'Live'), ('Complete', 'Complete'), ('Paused', 'Paused')], max_length=255, null=True),
32+
),
33+
migrations.AlterField(
34+
model_name='nimbusexperiment',
35+
name='status',
36+
field=models.CharField(choices=[('Draft', 'Draft'), ('Preview', 'Preview'), ('Live', 'Live'), ('Complete', 'Complete'), ('Paused', 'Paused')], default='Draft', max_length=255, verbose_name='Status'),
37+
),
38+
migrations.AlterField(
39+
model_name='nimbusexperiment',
40+
name='status_next',
41+
field=models.CharField(blank=True, choices=[('Draft', 'Draft'), ('Preview', 'Preview'), ('Live', 'Live'), ('Complete', 'Complete'), ('Paused', 'Paused')], max_length=255, null=True),
42+
),
43+
]

experimenter/experimenter/nimbus_ui/constants.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class NimbusUIConstants:
2626
"Cannot perform this action: experiment must be in state {required_state}, "
2727
"but is currently in state {current_state}."
2828
)
29+
ERROR_INVALID_PAUSED_TRANSITION = (
30+
"Cannot perform this action: only rollouts may be paused."
31+
)
2932

3033
RISK_MESSAGE_URL = "https://mozilla-hub.atlassian.net/wiki/spaces/FIREFOX/pages/208308555/Message+Consult+Creation"
3134
REVIEW_URL = "https://experimenter.info/getting-started/for-reviewers"

0 commit comments

Comments
 (0)