Because:
* we want to store screenshots associated with branches
This commit:
* adds a new NimbusBranchScreenshot model to store & manage screenshots
associated with an experiment branch
* adds migration to add new NimbusBranchScreenshot model
* adds Pillow dependency required by Django ImageField in model
* adds UPLOADS_GS_CREDENTIALS and UPLOADS_GS_BUCKET_NAME env vars for
Google Cloud credentials file path and bucket name for image storage
* uses FileSystemStorage defaulting to MEDIA_ROOT and MEDIA_URL if
UPLOADS_GS_CREDENTIALS is not supplied, switches to GoogleCloudStorage
if credentials are configured
* adds NimbusBranchAdmin with NimbusBranchScreenshotInlineAdmin to
manage branch screenshots in Django admin
Because:
* we want to try an MVP of experiment rollouts via cloning an experiment
with one branch
This commit:
* tweaks the experiment model clone method and tests to support rollout
branch slug
* adds support for rollout_branch_slug to GQL clone mutation
* promotes CloneDialog to be a top-level shared component
* add support for rolloutBranchSlug parameter in cloning mutation
* adds "promote to rollout" buttons to branches that specify
rolloutBranchSlug for CloneDialog
* integration test for promote to rollout
Because
* We recently found a bug where an experiment with 1 branch keeps inserting a second branch, even if it's not visible in the UI
* This will become extra critical when we start launching more rollouts since they only have a single branch
* We persistently had issues like this in legacy, where we'd try to populate empty defaults in the frontend, especially for branches, and the pattern we ended up landing on was removing all special cases from the frontend and letting the frontend treat everything passed from the backend verbatim and then passing empty default values back from the backend
This commit
* Removes the special "Treatment A" cases from the frontend
* Removes creating an empty control branch at creation time
* Passes an empty reference branch from the API if no reference branch exists
* Passes an empty treatment branch from the API if no branches exist (so we pass no empty treatment if only a reference branch does exist)
Because
* Whenever you filter by a related entity in django you'll always get duplicates in the results set so you have to add a .distinct() to the end of it
This commit
* Adds the necessary distinct filter to the owners queryset
Because
* We'd like to prevent targeting configs with invalid JEXL syntax from landing
This commit
* Uses the PyJEXL validator to validate the syntax of all targeting configs
* Adds an extra test to make sure new targeting configs are added to both constant classes
Because
* We neglected to validate that the clone name can't exceed 80 characters
This commit
* Validates clone name is <= 80 characters
* Noticed we were only validating experiment length on the client side, not the server side, so added it in the serializer too
Because
* Its easier to reason about options in a drop down when they're sorted
This commit
* Sorts the options in all the directory view filter drop downs
* Default sorts the experiment list by latest change before applying column specific sorting
Because
* Some of the config API fields were inconsistently singular or plural
* Some fields names didn't reflect the type of data they contained
This commit
* Renames fields that return a collection to pluralized
* Renames fields to match the type of data they return
Because:
* Results pages were failing to load if a metric was listed as an outcome metric but it had no data
This commit:
* Will gracefully ignore outcome metrics that don't have data.
* fixes#5888 feat(nimbus): added links to the sidebar for experimenter.info and slack
Because
* links to experimenter.info and #ask-experimenter are helpful
This commit
* adds links to experimenter.info and #ask-experimenter to the sidebar
* moved links to SidebarActions, moved URLS to constants, added feedback and removed text weight
* added feedback icon
* add more spacing around links
Co-authored-by: Jared Lockhart <119884+jaredlockhart@users.noreply.github.com>
Because:
* experiments can be ended before enrollment is paused
This commit:
* switches to experiment duration rather than proposed duration if
enrollment wasn't explicitly ended
Because
* The integration test PyPom library provides a handy .open method that opens the page and waits for it to load
* This can clean up a lot of code in the tests
This commit
* Uses .open in all the integration tests
Because:
* the archive button is disabled during loading, but this is not the
same as the archive action being disabled altogether
This commit:
* separates archive disabled state from archive query loading state,
only showing the explanatory tooltip during the former state
Because:
* archived experiments cannot be changed
This commit:
* prevents the display of the alert listing pages with missing details
for an archived experiment
Because:
* resetting sort order on the index page clears query parameters
This commit:
* applies a bugfix to correctly handle reset query parameters, rather
than restoring the previous non-empty stored value
Because:
* Users would like to toggle between relative and absolute branch comparison values - functionality was previously implemented for two tables deemed most important, this change allows the toggle to switch in sets of tabs containing these tables plus, now, the highlights table
This commit:
* Enables the highlights table to toggle between absolute/relative comparison
* Removes the branch comparison button, uses Bootstrap's Tabs component instead for applicable tables since the toggle is not useful for the metric tables
* Contains cosmetic tweaks, including spacing updates, updating heading levels and adding a metrics heading, combining monitoring/analysis sections, and aligning tooltips horizontally
Because
* Now that we have nice clear base classes for the integration tests
* We don't need to override some shared logic in the child page classes
This commit
* Moves all the shared page logic to the respective base classes
Because:
* we want to place cloned experiments in context with the original
This commit:
* adds a line to HeaderExperiment component identifying the experiment as a
clone with a link back to the original parent
* updates GQL query and API to expose full parent experiment data, mainly for
slug & name needed for the link
* updates types & tests as necessary
Because
* We've seen persistent intermittent failures in the remote settings integration tests
* It turns out the remote settings pages can render in stages so it's not sufficient to just wait for the page wait locator for all the UI elements to be available
* Also we were using the old remote settings review page instead of the new simple one that Experimenter links to
This commit
* Adds a wait locator to every UI element in the Remote Settings pages so interactions shouldn't occur until the element is visible
* Adds helpful messages to each of the waits so if one fails the test should clearly say what it was waiting for and couldn't find
* Use the new simple-review page in Remote Settings instead of the old review page
Because
* We should add a simple integration test for each new major feature we add
This commit
* Adds an integration test for archiving
* Splits the integration tests into two groups
* Tests that run for each application (for remote settings integration)
* Tests that only run once (for things constrained just to experimenter UI)
* Adds a random identifier to the end of integration test experiments to allow rerunning tests locally
* Cleans up the page load wait locators
Because:
* we want to enable cloning of experiments
This commit:
* adds the clone experiment GQL mutation in front end
* creates a useCloneDialog hook with CloneDialog display and mutation
logic that can be partially controlled and watched from SidebarActions
* adds display of general submit errors to CloneDialog
* updates types & tests as necessary
Because
* We've had this issue for a little while where creating multiple changelogs in tests with timezone.now() can result in multiple changes having the same change datetime
* Several bits of logic depend on using the 'latest' change to understand the state of the experiment
* Multiple changes with the same change datetime can randomly invert the expected ordering and intermittently fail tests
This commit
* Changes the NimbusExperimentFactory to always use the same starting date and then create each change 1 day later
* For tests that are sensitive to timeouts, provide the ability to set the latest change to the current time
* For tests that require more detailed change date logic, explicitly set those dates in the test
* This should hopefully prevent this kind of intermittency from happening in the future
Because
* We previously used circle docker layer caching to speed up circle runs
* While migrating to the shared build cache, some confusing errors appeared
* We disabled it to see if that cleared up the issue
* Circle builds have been stable lately using the shared layer cache, but each circle run takes a significant amount of time to pull in remote images
* It's worth trying to re enable it to see if we can get both the circle caching and shared layer cache working together properly
This commit
* Re enables circle docker layer caching
Because:
* Experiment analysis can be ran with overrides on the Jetstream side. As of Jetstream metadata schema 4, these overrides are exposed and we want to convey them to users to eliminate confusion. The reference/control branch was taken care of in a prior commit - this covers the rest of the overrides.
This commit:
* Displays start date, end date, and enrollment period overrides in ExternalConfigAlert
* Displays 'analysis was skipped' text in the sidebar if 'skip' is set to true, slightly alters analysis ready text
* Refactors AppLayoutSidebarLaunched stories to new syntax, refactors PageResults stories to new syntax and adds story to better preview the page when the control branch is overridden