Skip to content
Permalink
Branch: master
Commits on Sep 20, 2019
  1. [1/3] Display latest runs in schedule UI

    helloworld committed Sep 10, 2019
    Summary:
    Display a list of runs and their statuses that were created by each schedule in the Schedule UI, as well as the date of the last run. You can click on the status dot to navigate to the log viewer for the run. The list refreshes every 15 seconds, just like the runs history page.
    
    {F39971}
    
    Depends on: D980
    
    Test Plan:
    ```
    cd projects/dagster/examples/dagster_examples/experimental
    dagit -p 3333
    ```
    
    Reviewers: #ft, alangenfeld
    
    Reviewed By: #ft, alangenfeld
    
    Subscribers: alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D999
  2. Fix loading config.yaml

    helloworld committed Sep 20, 2019
    Summary: If we had a `config.yaml` without `compute_logs` defined, then loading an instance would break. Simply changing to `.get()` to fix this.
    
    Test Plan: unit
    
    Reviewers: max
    
    Reviewed By: max
    
    Differential Revision: https://dagster.phacility.com/D1067
  3. Support multiple search terms in run history url

    helloworld committed Sep 20, 2019
    Summary: Previously, we could only specify one search term in the runs history URL, such as `/runs?q=id:10`. Now we can specify multiple comma seperated search terms, such as `/runs?q=id:10,mode:default`.
    
    Test Plan: {F40049}
    
    Reviewers: #ft, bengotow, alangenfeld
    
    Reviewed By: #ft, alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D1066
Commits on Sep 18, 2019
  1. Add dagster/schedule_id tag to PipelineRun

    helloworld committed Sep 18, 2019
    Summary: When a run is created from a schedule, we store schedule_id in the run's tags as "dagster/schedule_id"
    
    Test Plan: unit
    
    Reviewers: #ft, alangenfeld
    
    Reviewed By: #ft, alangenfeld
    
    Subscribers: alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D1053
Commits on Sep 11, 2019
  1. Display natural language representation of cron string

    helloworld committed Sep 11, 2019
    Summary:
    Displays natural string representation of cron string instead of the cron string in the dagit scheduler UI. See #1742
    
    Also, the cron strings in the examples were set incorrectly (daily instead of hourly)  and are fixed in this diff.
    
    Test Plan:
    {F39190}
    
    ```
    cd /dagster/examples/dagster_examples/experimental
    dagit -p 3333
    open http://localhost:3000/scheduler
    ```
    
    Reviewers: #ft, schrockn
    
    Reviewed By: #ft, schrockn
    
    Subscribers: schrockn
    
    Differential Revision: https://dagster.phacility.com/D1008
  2. RFC: Add mutation for executing pipeline with preset

    helloworld committed Aug 31, 2019
    Summary:
    Add mutation and client method for starting a pipeline execution with a preset from `dagster-graphql`. If this is an appropriate solution, can clean up implementation and add tests.
    
    API:
    
    ```
    variables = {
        'pipelineName': 'myPipelineName',
        'presetName': 'myPresetName'
    }
    execute_start_pipeline_execution_query(handle, variables)
    ```
    
    Test Plan: unit
    
    Reviewers: #ft, schrockn
    
    Reviewed By: #ft, schrockn
    
    Subscribers: schrockn, max, alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D918
  3. Rename dagster schedules command to schedule

    helloworld committed Sep 11, 2019
    Summary:
    Simply renames the `dasgster schedules` command to `dagster schedule`
    
    #1739
    
    Test Plan:
    ```
    $ dagster schedules
    ```
    
    Reviewers: #ft, schrockn
    
    Reviewed By: #ft, schrockn
    
    Differential Revision: https://dagster.phacility.com/D1009
  4. Create Scheduler UI in Dagit

    helloworld committed Aug 21, 2019
    Summary:
    This diff introduces a UI for the scheduler. It is hidden behind the `scheduler` feature flag. It displays the list of schedule definitions and a list of currently running schedules. The running schedule rows are pretty empty for now, but we can use the space to add operational info (such as past runs, whether they succeeded, etc.).
    
    {F39053}
    
    Test Plan:
    1. Set `scheduler` feature flag in `$DAGSTER_HOME/dagster.cfg`:
    
    ```
    [FEATURES]
    scheduler=
    ```
    
    Or simply:
    
    ```
    echo "[FEATURES]\nscheduler=" > $DAGSTER_HOME/dagster.cfg
    ```
    
    2. Create a repository with a scheduler:
    
    ```
    # repository.yaml
    
    repository:
      file: repo.py
      fn: define_repo
    ```
    
    ```
    # repo.py
    
    from dagster import solid, pipeline, RepositoryDefinition, ScheduleDefinition
    from dagster_cron import SystemCronScheduler
    
    @solid
    def hello_world(_):
        return "Hello world"
    
    @pipeline
    def hello_world_pipeline():
        return hello_world()
    
    def define_repo():
        hello_world_every_minute_schedule = ScheduleDefinition(
            "hello_world_every_minute",
            cron_schedule="* * * * *",
            execution_params={
                "environmentConfigData": {"storage": {"filesystem": None}},
                "selector": {"name": "hello_world_pipeline", "solidSubset": None},
                "mode": "default",
            },
        )
    
        return RepositoryDefinition(
            name="demo_repository",
            pipeline_defs=[hello_world_pipeline],
            experimental={
                'scheduler': SystemCronScheduler,
                'schedule_defs': [hello_world_every_minute_schedule],
            },
        )
    ```
    
    3. Run `dagster schedules start hello_world_every_minute`
    
    4. Run `dagit -p 3333`
    
    Reviewers: #ft, bengotow, alangenfeld
    
    Reviewed By: #ft, alangenfeld
    
    Subscribers: schrockn, alangenfeld, prha
    
    Differential Revision: https://dagster.phacility.com/D855
Commits on Sep 10, 2019
  1. Add examples of schedules

    helloworld committed Sep 10, 2019
    Summary: Added two examples of `ScheduleDefinition` in `dagster/examples/experimental`.
    
    Test Plan:
    ```
    cd /dagster/examples/dagster_examples/experimental
    dagster schedules list
    dagster schedules start many_events_every_min
    dagit -p 3333 # a new run will be added every minute
    ```
    
    Reviewers: schrockn
    
    Reviewed By: schrockn
    
    Subscribers: schrockn
    
    Differential Revision: https://dagster.phacility.com/D1001
Commits on Sep 6, 2019
  1. Fix arguments for dagster schedules cli

    helloworld committed Sep 6, 2019
    Summary: Fixes errors with the `--schedules-dir` flag for the `dagster schedules` commands
    
    Test Plan: unit
    
    Reviewers: #ft, schrockn
    
    Reviewed By: #ft, schrockn
    
    Differential Revision: https://dagster.phacility.com/D962
Commits on Sep 4, 2019
  1. Update dagit images in documentation

    helloworld committed Sep 4, 2019
    Summary: Update screenshots of the dagit logviewer in the documentation.
    
    Test Plan: make livehtml
    
    Reviewers: #ft, natekupp
    
    Reviewed By: #ft, natekupp
    
    Differential Revision: https://dagster.phacility.com/D929
Commits on Aug 27, 2019
  1. Fix errors for repositories without scheduler

    helloworld committed Aug 27, 2019
    Summary: If a repository didn't have a scheduler defined and the `SCHEDULER` feature flag was enabled, an error would be thrown because `scheduler_type` would be the abc `Scheduler`. This diff replaces the `get_scheduler_type` method on `RepositoryDefinition` with `build_scheduler`, which checks whether `scheduler_type` is defined and instantiates the `scheduler` if it is.
    
    Test Plan: unit
    
    Reviewers: #ft, natekupp
    
    Reviewed By: #ft, natekupp
    
    Differential Revision: https://dagster.phacility.com/D892
  2. Add --name flag to dagster schedules list command

    helloworld committed Aug 27, 2019
    Summary: Adding a `--name` flag to `dagster schedules list` that only displays the schedule names, so that we can iterate over the output and call `dasgster schedules add` on each schedule
    
    Test Plan: manual
    
    Reviewers: natekupp
    
    Reviewed By: natekupp
    
    Differential Revision: https://dagster.phacility.com/D894
  3. Extract SystemCronScheduler to a library

    helloworld committed Aug 26, 2019
    Summary:
    Currently, `SystemCronScheduler` is defined in dagster core. However, this code and other scheduler implementations should live in their own libraries. This diff moves the `SystemCronScheduler` to a library named `dagster-cron`
    
    This change required adding a `scheduler` argument to `RepositoryDefinition`, but both `experimental` arguments `scheduler` and `scheduler_defs` will be moved out of the repository in a future diff.
    
    Test Plan: unit
    
    Reviewers: #ft, schrockn
    
    Reviewed By: #ft, schrockn
    
    Subscribers: schrockn
    
    Differential Revision: https://dagster.phacility.com/D884
Commits on Aug 26, 2019
  1. Pass --log argument to dagit in dagit service

    helloworld committed Aug 23, 2019
    Test Plan: manual
    
    Reviewers: natekupp
    
    Reviewed By: natekupp
    
    Differential Revision: https://dagster.phacility.com/D878
Commits on Aug 23, 2019
  1. Fix python3 bug with cron schedule script

    helloworld committed Aug 23, 2019
    Summary: Previously, the dagster-graphql path was resolved by simply replacing /bin/python with /bin/dagster-graphql. However, when the executable is named /bin/python3, the dagster-graphql path was incorrectly resolved as /bin/dagster-graphql3. This diff uses os.path.dirname to support any executable name for python
    
    Test Plan: unit
    
    Reviewers: #ft, natekupp
    
    Reviewed By: #ft, natekupp
    
    Differential Revision: https://dagster.phacility.com/D879
Commits on Aug 22, 2019
  1. Set environment variables on ScheduleDefinition

    helloworld committed Aug 22, 2019
    Test Plan: Tested manually using bigquery credentials env var
    
    Reviewers: #ft, alangenfeld
    
    Reviewed By: #ft, alangenfeld
    
    Subscribers: alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D877
  2. Add repo yaml directory to python path in dagster-graphql cli

    helloworld committed Aug 22, 2019
    Test Plan:
    Run `dagster-graphql` from a different directory targeting a `repository.yaml`
    
    `dagster-graphql -p startPipelineExecution -v ... -y "/Users/sashankthupukari/projects/dagster-playground/repository.yaml"`
    
    Reviewers: #ft, natekupp
    
    Reviewed By: #ft, natekupp
    
    Differential Revision: https://dagster.phacility.com/D873
  3. Fix FilesystemRunStorage instantiations

    helloworld committed Aug 22, 2019
    Summary: The args for `FilesystemRunStorage` were changed, but some instantiations were not updated.
    
    Test Plan: unit
    
    Reviewers: #ft, schrockn
    
    Reviewed By: #ft, schrockn
    
    Differential Revision: https://dagster.phacility.com/D872
  4. Set dagster home in dagit service

    helloworld committed Aug 21, 2019
    Test Plan: `dagster-aws init; dagster-aws up`
    
    Reviewers: natekupp
    
    Reviewed By: natekupp
    
    Differential Revision: https://dagster.phacility.com/D865
Commits on Aug 20, 2019
  1. Create ScheduleDefinition and dagster CLI scheduler commands

    helloworld committed Aug 19, 2019
    Summary:
    In this v1 implementation, we attach `ScheduleDefinitions` to a `RepositoryDefinition`.
    
    ```
    
        many_events_daily_schedule = ScheduleDefinition(
            name="many_events_midnight_daily",
            cron_schedule="0 0 * * *",
            execution_params={
                "environmentConfigData": {"storage": {"filesystem": None}},
                "selector": {"name": "many_events", "solidSubset": None},
                "mode": "default",
            },
        )
    
        many_events_every_minute_schedule = ScheduleDefinition(
            name="many_events_midnight_every_minute",
            cron_schedule="* * * * *",
            execution_params={
                "environmentConfigData": {"storage": {"filesystem": None}},
                "selector": {"name": "many_events", "solidSubset": None},
                "mode": "default",
            },
        )
    
        return RepositoryDefinition(
            name='toys_repository',
            pipeline_defs=[
                many_events,
            ],
            schedule_defs=[many_events_daily_schedule, many_events_every_minute_schedule],
        )
    ```
    
    We can then interact with the `ScheduleDefinitions` using the `dagster` cli.
    
    ```
    $ dagster schedules list
    Repository toys_repository
    **************************
    Schedule: many_events_midnight_daily
    Cron Schedule: 0 0 * * *
    ********************************************
    Schedule: many_events_midnight_every_minute
    Cron Schedule: * * * * *
    $ dagster schedules list --verbose
    Repository toys_repository
    **************************
    Schedule: many_events_midnight_daily
    Cron Schedule: 0 0 * * *
    Execution Params: {'environmentConfigData': {'storage': {'filesystem': None}}, 'selector': {'name': 'many_events', 'solidSubset': None}, 'mode': 'default'}
    ********************************************
    Schedule: many_events_midnight_every_minute
    Cron Schedule: * * * * *
    Execution Params: {'environmentConfigData': {'storage': {'filesystem': None}}, 'selector': {'name': 'many_events', 'solidSubset': None}, 'mode': 'default'}
    $ dagster schedules start many_events_midnight_daily
    Started schedule many_events_midnight_daily with ID 2a0ebd26-da90-4a71-96df-f249f50a6498
    $ dagster schedules list --running
    Repository toys_repository
    **************************
    Schedule: many_events_midnight_daily [Running]
    Cron Schedule: 0 0 * * *
    $ dagster schedules end many_events_midnight_daily
    Ended schedule many_events_midnight_daily with ID 2a0ebd26-da90-4a71-96df-f249f50a6498
    $ dagster schedules list --running
    Repository toys_repository
    **************************
    ```
    
    Test Plan: unit
    
    Reviewers: #ft, alangenfeld, schrockn, natekupp
    
    Reviewed By: #ft, schrockn, natekupp
    
    Subscribers: schrockn, alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D842
  2. Implement start_schedule and end_schedule for SystemCronTabScheduler

    helloworld committed Aug 14, 2019
    Summary:
    The first implementation of the scheduler is `SystemCronScheduler`. We can interact with the scheduler through `dagster-graphql`, with the following four mutation:
    
    - `createRunSchedule(schedule: $schedule)`
    - `startRunSchedule(scheduleId: $scheduleId)`
    - `endRunSchedule(scheduleId: $scheduleId)`
    - `deleteRunSchedule(scheduleId: $scheduleId)`
    
    When you create a schedule using `SystemCronScheduler`, a file is persisted to disk containing the `schedule_id`, `name`, `cron_schedule`, and `execution_params` of the schedule.
    
    When you _start_ a schedule using `SystemCronScheduler`, a bash script is created that invokes `dagster-graphql`:
    
    ```
    #!/bin/bash
    export DAGSTER_HOME={dagster_home}
    export LANG=en_US.UTF-8
    
    {dagster_graphql_path} -p startPipelineExecution -v '{variables}' --log -y "{repo_path}" >> {log_file} 2>&1
    ```
    
    The `dagster_graphql_path` and the `repo_path` are captured during the `startRunSchedule`. For this v1, the `ExecutionTargetHandle` on the `DagsterGraphQLContext` must point to a repository yaml file. A log is maintained, per schedule, to help debug issues with the `dagster-graphql` invocation.
    
    A job is added to the user's crontab that runs the bash script:
    
    ```
    * * * * * /Users/sashankthupukari/dagster/schedules/experimental/toys_repository/many_events_schedule_b215b131-6083-4b7f-993f-1eaa6e295e6d.sh # b215b131-6083-4b7f-993f-1eaa6e295e6d
    ```
    
    When you _end_ a schedule, the cron job is removed, the bash script is deleted, and the `repo_path` and `python_path` are reset.
    
    Test Plan: `test_scheduler.py`, and manual e2e tests
    
    Reviewers: #ft, alangenfeld, schrockn
    
    Reviewed By: #ft, alangenfeld, schrockn
    
    Subscribers: schrockn, alangenfeld, max
    
    Differential Revision: https://dagster.phacility.com/D826
Commits on Aug 15, 2019
  1. Fix state update error in ConfigEditorModePicker

    helloworld committed Aug 15, 2019
    Summary:
    Previously, the `ConfigEditorModePicker` component was throwing the following errors, since `onModeChange` was being called in the `render` method, and `onModeChange` called `setState`.
    
    {F36726}
    
    This diff moves the `onModeChange` call to the `componentDidMount` and `componentDidUpdate` lifecycle methods to fix the error.
    
    Test Plan: Loaded dagit, switched pipelines, error was not thrown and mode picker behaved as expected
    
    Reviewers: #ft, bengotow, prha
    
    Reviewed By: #ft, prha
    
    Subscribers: prha
    
    Differential Revision: https://dagster.phacility.com/D825
Commits on Aug 14, 2019
  1. Create Scheduler GraphQL interface

    helloworld committed Aug 13, 2019
    Test Plan: unit
    
    Reviewers: #ft, alangenfeld
    
    Reviewed By: #ft, alangenfeld
    
    Subscribers: alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D804
Commits on Aug 13, 2019
  1. Add Scheduler to dagit and DagsterGraphQLContext

    helloworld committed Aug 12, 2019
    Summary: Add `Scheduler` to the `DagsterGraphQLContext` and the option to specify the storage directory for schedules in the dagit cli. By default, the storage directory is `$DAGSTER_HOME/schedules`
    
    Test Plan:
    run dagit with `SCHEDULER` feature enabled, unit
    
    dagster.cgf:
    ```
    [FEATURES]
    scheduler=
    ```
    
    Reviewers: #ft, alangenfeld
    
    Reviewed By: #ft, alangenfeld
    
    Subscribers: alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D798
  2. Create Scheduler API

    helloworld committed Aug 9, 2019
    Summary:
    Scheduler API:
    
    `Scheduler` is an abstract class which defines methods such as `create_schedule`, `start_schedule`, etc. Each instance of a `Scheduler` stores a list of `RunSchedule`s
    
    Two implementations of `Scheduler` included are:
    
    - `TestScheduler` - works entirely in memory and does not implement starting and stopping schedules (just creating and removing them)
    - `SystemCronScheduler` - saves schedules to a file, and uses cron to start and stop schedules.
    
    Test Plan: unit
    
    Reviewers: #ft, alangenfeld, schrockn
    
    Reviewed By: #ft, alangenfeld
    
    Subscribers: schrockn, alangenfeld, max
    
    Differential Revision: https://dagster.phacility.com/D791
  3. Create script to generate library

    helloworld committed Aug 3, 2019
    Summary:
    Automate generating a dagster library. Uses a template found in bin/assets and a user-provided name to set up a library correctly, since it's easy to miss all the places you have to include the library name.
    
    The generated library includes a simple "helloworld" resource and solid
    
    Test Plan:
    To use:
    
    ```
    python bin/create_library.py --name="sftp"
    ```
    
    To test:
    ```
    cd python_modules/libraries/dagster-sftp
    pytest
    ```
    
    Reviewers: #ft, max, alangenfeld, schrockn
    
    Reviewed By: #ft, schrockn
    
    Subscribers: schrockn, alangenfeld, max, natekupp
    
    Differential Revision: https://dagster.phacility.com/D759
Commits on Aug 9, 2019
  1. Feature Flag component

    helloworld committed Aug 9, 2019
    Summary:
    Create a config file (`.dagsterrc`) stored in `$DAGSTER_HOME` with feature flags for dagit. These flags can be queries using graphql:
    
    ```
    query {
      enabledFeatures
    }
    ```
    
    Example config:
    
    ```
    [FEATURES]
    ShowSchedule=
    ```
    
    Test Plan: Added feature flag in `TopNav.tsx`
    
    Reviewers: #ft, alangenfeld
    
    Reviewed By: #ft, alangenfeld
    
    Subscribers: alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D790
Commits on Aug 6, 2019
  1. Convert SolidDefinitions and PipelineDefinitions to @solid and @pipeline

    helloworld committed Aug 2, 2019
    
    
    Test Plan: unit
    
    Reviewers: #ft, alangenfeld
    
    Reviewed By: #ft, alangenfeld
    
    Subscribers: alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D758
  2. [cron] Save logs to ~/dagster directory

    helloworld committed Aug 5, 2019
    Summary: Save logs to `$DAGSTER_HOME/logs/v0/repo_name'
    
    Test Plan:
    Run `dagit --log`
    Execute run
    Close dagit
    Check contents of `$DAGSTER_HOME/logs/experimental/repo_name'
    Re-run dagit and confirm run loads properly
    
    Reviewers: #ft, alangenfeld
    
    Reviewed By: #ft, alangenfeld
    
    Subscribers: alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D767
Commits on Aug 5, 2019
  1. [cron] Save dagster-graphql runs to filesystem

    helloworld committed Aug 5, 2019
    Summary:
    - Add `--log` and `--log-dir` flags to dagster-graphql to save runs
    - Create `--log-dir` directory if it doesn't exist
    
    Test Plan:
    Run
    
    `dagster-graphql -v "`cat variables.txt`" -y repository.yaml "`cat query.graphql`" --log`
    
    File contents:
    
    `variables.txt`
    ```
    {
      "executionParams": {
        "environmentConfigData": {
          "storage": {
            "filesystem": null
          }
        },
        "selector": {
          "name": "many_events",
          "solidSubset": null
        },
        "mode": "default"
      }
    }
    ```
    
    `query.graphql`
    ```
    mutation StartPipelineExecution($executionParams: ExecutionParams!) {
      startPipelineExecution(executionParams: $executionParams) {
        __typename
        ... on StartPipelineExecutionSuccess {
          run {
            runId
            __typename
          }
          __typename
        }
        ... on PipelineNotFoundError {
          message
          __typename
        }
        ... on PipelineConfigValidationInvalid {
          errors {
            message
            __typename
          }
          __typename
        }
      }
    }
    ```
    
    Shows up in dagit:
    
    {F35434}
    
    Reviewers: #ft, alangenfeld
    
    Reviewed By: #ft, alangenfeld
    
    Subscribers: alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D765
Commits on Aug 1, 2019
  1. Fix bug with config defaults

    helloworld committed Aug 1, 2019
    Summary:
    See #1608
    
    Also included small utility function `print_schema()` to make it easier to debug config_types
    
    Example:
    
    ```
    {
      solids: {
        print_value?: {
          outputs?: {
            result?: {
              |–json: {
              |  path: [Path]
              |}
              |–pickle: {
              |  path: [Path]
              |}
            }
          }
        } default={}
        prefix_id: {
          inputs: {
            id: {
              |–value: [ANY]
              |–json: {
              |  path: [Path]
              |}
              |–pickle: {
              |  path: [Path]
              |}
            }
          }
          outputs?: {
            result?: {
              |–json: {
              |  path: [Path]
              |}
              |–pickle: {
              |  path: [Path]
              |}
            }
          }
          config?: {
            prefix?: [String]  default=_id_
          } default={'prefix': '_id_'}
        }
      }
      expectations?: {
        evaluate?: [Bool]  default=True
      } default={'evaluate': True}
      storage?: {
        |–in_memory?: {
        |
        |} default={}
        |–filesystem?: {
        |  config?: {
        |    base_dir?: [String]
        |  } default={}
        |} default={'config': {}}
      }
      execution?: {
    
      } default={}
      loggers?: {
        console?: {
          config?: {
            log_level?: [String]  default=INFO
            name?: [String]  default=dagster
          } default={'log_level': 'INFO', 'name': 'dagster'}
        }
      } default={}
      resources?: {
    
      } default={}
    }
    ```
    
    Test Plan: unit
    
    Reviewers: #ft, natekupp
    
    Reviewed By: #ft, natekupp
    
    Subscribers: natekupp, alangenfeld
    
    Differential Revision: https://dagster.phacility.com/D753
Commits on Jul 25, 2019
  1. 0.5.4

    helloworld committed Jul 25, 2019
  2. 0.5.4.pre0

    helloworld committed Jul 25, 2019
  3. Format duration in step_success message to be human readable

    helloworld committed Jul 25, 2019
    Summary: In the step_success message, instead of displaying just milliseconds, display a human readable duration string such as 533ms, 2.1s, 4m52s, 34m12s, 1h4m
    
    Test Plan: pytest -k test_format_duration
    
    Reviewers: #ft, schrockn
    
    Reviewed By: #ft, schrockn
    
    Subscribers: schrockn
    
    Differential Revision: https://dagster.phacility.com/D698
Older
You can’t perform that action at this time.