dstack icon indicating copy to clipboard operation
dstack copied to clipboard

[Bug]: Exception in CLI if `replicas` in `.dstack.yml` is invalid

Open jvstme opened this issue 1 year ago • 3 comments

Steps to reproduce

  1. Create a service configuration with replicas set to a range without upper bound
    > cat drope.yml 
    type: service
    
    commands:
      - pip install drope
      - drope
    port: 8000
    
    replicas: 2..
    
  2. Try running the service
    dstack run . -f drope.yml
    

Expected behaviour

dstack CLI displays an error message

The maximum number of replicas must be set

Actual behaviour

dstack CLI fails with unhandled exception

Traceback (most recent call last):
  File "/home/jvstme/git/dstack/dstack/venv/bin/dstack", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/home/jvstme/git/dstack/dstack/src/dstack/_internal/cli/main.py", line 67, in main
    args.func(args)
  File "/home/jvstme/git/dstack/dstack/src/dstack/_internal/cli/commands/run.py", line 102, in _command
    configuration_path, conf = load_configuration(
                               ^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/src/dstack/api/utils.py", line 68, in load_configuration
    conf = parse_configuration(yaml.safe_load(f))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/src/dstack/_internal/core/models/configurations.py", line 287, in parse
    conf = RunConfiguration.parse_obj(data).__root__
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/main.py", line 526, in parse_obj
    return cls(**obj)
           ^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/main.py", line 339, in __init__
    values, fields_set, validation_error = validate_model(__pydantic_self__.__class__, data)
                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/main.py", line 1074, in validate_model
    v_, errors_ = field.validate(value, values, loc=field.alias, cls=cls_)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/fields.py", line 881, in validate
    v, errors = self._validate_singleton(v, values, loc, cls)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/fields.py", line 1058, in _validate_singleton
    return self._validate_discriminated_union(v, values, loc, cls)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/fields.py", line 1147, in _validate_discriminated_union
    return sub_field.validate(v, values, loc=(*loc, display_as_type(sub_field.type_)), cls=cls)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/fields.py", line 881, in validate
    v, errors = self._validate_singleton(v, values, loc, cls)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/fields.py", line 1098, in _validate_singleton
    return self._apply_validators(v, values, loc, cls, self.validators)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/fields.py", line 1154, in _apply_validators
    v = validator(cls, v, values, self, self.model_config)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/class_validators.py", line 337, in <lambda>
    return lambda cls, v, values, field, config: validator(v)
                                                 ^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/main.py", line 711, in validate
    return cls(**value)
           ^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/main.py", line 339, in __init__
    values, fields_set, validation_error = validate_model(__pydantic_self__.__class__, data)
                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/venv/lib64/python3.12/site-packages/pydantic/main.py", line 1100, in validate_model
    values = validator(cls_, values)
             ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jvstme/git/dstack/dstack/src/dstack/_internal/core/models/configurations.py", line 265, in validate_scaling
    if replicas.min != replicas.max and not scaling:
       ^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'min'

dstack version

0.17.0rc2

Server logs

No response

Additional information

No response

jvstme avatar Mar 28 '24 12:03 jvstme

This issue is stale because it has been open for 30 days with no activity.

peterschmidt85 avatar Apr 28 '24 01:04 peterschmidt85

This issue was closed because it has been inactive for 14 days since being marked as stale.

peterschmidt85 avatar May 12 '24 01:05 peterschmidt85

Still relevant

jvstme avatar May 14 '24 06:05 jvstme

This issue is stale because it has been open for 30 days with no activity.

peterschmidt85 avatar Jun 14 '24 01:06 peterschmidt85

This issue was closed because it has been inactive for 14 days since being marked as stale. Please reopen the issue if it is still relevant.

peterschmidt85 avatar Jun 28 '24 01:06 peterschmidt85