nextmv 1.0.0.dev10__tar.gz → 1.1.0.dev0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/PKG-INFO +1 -1
- nextmv-1.1.0.dev0/nextmv/__about__.py +1 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/__init__.py +2 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/account/__init__.py +5 -3
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/account/create.py +4 -1
- nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/__init__.py +32 -0
- nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/create.py +97 -0
- nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/delete.py +58 -0
- nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/disable.py +56 -0
- nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/enable.py +56 -0
- nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/get.py +61 -0
- nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/update.py +78 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/configuration/config.py +27 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/__init__.py +1 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/account.py +12 -10
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/__init__.py +11 -6
- nextmv-1.1.0.dev0/nextmv/cloud/sso.py +248 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/integration/cloud/test_integration_cloud.py +16 -7
- nextmv-1.0.0.dev10/nextmv/__about__.py +0 -1
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/.gitignore +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/LICENSE +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/README.md +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/__entrypoint__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/_serialization.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/base_model.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/CONTRIBUTING.md +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/account/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/account/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/account/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/exists.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/push.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/metadata.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/data/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/data/upload.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/exists.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/cancel.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/input.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/logs.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/metadata.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/track.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/metadata.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/metadata.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/start.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/stop.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/metadata.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/start.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/stop.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/upload/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/upload/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/exists.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/get.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/update.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/community/__init__.py +1 -1
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/community/clone.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/community/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/configuration/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/configuration/create.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/configuration/delete.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/configuration/list.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/confirm.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/main.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/message.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/options.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/version.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/acceptance_test.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_acceptance.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_batch_scenario.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_ensemble.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_input_set.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_instance.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_managed_input.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_run.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_secrets.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_shadow.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_switchback.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_utils.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_version.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/assets.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/batch_experiment.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/client.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/community.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/ensemble.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/input_set.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/instance.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/integration.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/package.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/scenario.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/secrets.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/shadow.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/switchback.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/url.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/version.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/.gitignore +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/README.md +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/app.yaml +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/input.json +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/main.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/requirements.txt +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/src/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/src/visuals.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/deprecated.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/input.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/application.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/executor.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/geojson_handler.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/local.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/plotly_handler.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/runner.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/logger.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/manifest.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/model.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/options.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/output.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/polling.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/run.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/safe.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/status.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/pyproject.toml +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/README.md +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cli/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cli/test_configuration.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cli/test_main.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cli/test_version.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/app.yaml +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/test_client.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/test_instance.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/test_package.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/test_scenario.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/integration/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/integration/cloud/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/local/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/local/test_application.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/local/test_executor.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/local/test_runner.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options1.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options2.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options3.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options4.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options5.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options6.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options7.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_base_model.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_entrypoint/__init__.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_entrypoint/test_entrypoint.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_input.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_inputs/test_data.csv +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_inputs/test_data.json +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_inputs/test_data.txt +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_logger.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_manifest.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_model.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_options.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_output.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_polling.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_run.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_safe.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_serialization.py +0 -0
- {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_version.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "v1.1.0.dev0"
|
|
@@ -17,6 +17,7 @@ from nextmv.cli.cloud.run import app as run_app
|
|
|
17
17
|
from nextmv.cli.cloud.scenario import app as scenario_app
|
|
18
18
|
from nextmv.cli.cloud.secrets import app as secrets_app
|
|
19
19
|
from nextmv.cli.cloud.shadow import app as shadow_app
|
|
20
|
+
from nextmv.cli.cloud.sso import app as sso_app
|
|
20
21
|
from nextmv.cli.cloud.switchback import app as switchback_app
|
|
21
22
|
from nextmv.cli.cloud.upload import app as upload_app
|
|
22
23
|
from nextmv.cli.cloud.version import app as version_app
|
|
@@ -36,6 +37,7 @@ app.add_typer(run_app, name="run")
|
|
|
36
37
|
app.add_typer(scenario_app, name="scenario")
|
|
37
38
|
app.add_typer(secrets_app, name="secrets")
|
|
38
39
|
app.add_typer(shadow_app, name="shadow")
|
|
40
|
+
app.add_typer(sso_app, name="sso")
|
|
39
41
|
app.add_typer(switchback_app, name="switchback")
|
|
40
42
|
app.add_typer(upload_app, name="upload")
|
|
41
43
|
app.add_typer(version_app, name="version")
|
|
@@ -20,9 +20,11 @@ app.add_typer(update_app)
|
|
|
20
20
|
@app.callback()
|
|
21
21
|
def callback() -> None:
|
|
22
22
|
"""
|
|
23
|
-
Manage
|
|
23
|
+
Manage your Nextmv Cloud account (organization).
|
|
24
24
|
|
|
25
|
-
Please contact [link=https://www.nextmv.io/contact][bold]Nextmv
|
|
26
|
-
for assistance configuring SSO for your organization.
|
|
25
|
+
Please contact [link=https://www.nextmv.io/contact][bold]Nextmv
|
|
26
|
+
support[/bold][/link] for assistance configuring SSO for your organization.
|
|
27
|
+
You may use the [code]nextmv cloud sso[/code] command tree to manage the
|
|
28
|
+
SSO configuration for your organization.
|
|
27
29
|
"""
|
|
28
30
|
pass
|
|
@@ -42,7 +42,10 @@ def create(
|
|
|
42
42
|
Create a new Nextmv Cloud account in your organization.
|
|
43
43
|
|
|
44
44
|
To create managed accounts, SSO must be configured for your organization.
|
|
45
|
-
Please contact [link=https://www.nextmv.io/contact][bold]Nextmv
|
|
45
|
+
Please contact [link=https://www.nextmv.io/contact][bold]Nextmv
|
|
46
|
+
support[/bold][/link] for assistance. You may use the [code]nextmv cloud
|
|
47
|
+
sso[/code] command tree to manage the SSO configuration for your
|
|
48
|
+
organization.
|
|
46
49
|
|
|
47
50
|
At least one administrator email address must be provided. Multiple
|
|
48
51
|
administrators can be specified by repeating the --admins flag or by
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module defines the cloud sso command tree for the Nextmv CLI.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from nextmv.cli.cloud.sso.create import app as create_app
|
|
8
|
+
from nextmv.cli.cloud.sso.delete import app as delete_app
|
|
9
|
+
from nextmv.cli.cloud.sso.disable import app as disable_app
|
|
10
|
+
from nextmv.cli.cloud.sso.enable import app as enable_app
|
|
11
|
+
from nextmv.cli.cloud.sso.get import app as get_app
|
|
12
|
+
from nextmv.cli.cloud.sso.update import app as update_app
|
|
13
|
+
|
|
14
|
+
# Set up subcommand application.
|
|
15
|
+
app = typer.Typer()
|
|
16
|
+
app.add_typer(create_app)
|
|
17
|
+
app.add_typer(delete_app)
|
|
18
|
+
app.add_typer(disable_app)
|
|
19
|
+
app.add_typer(enable_app)
|
|
20
|
+
app.add_typer(get_app)
|
|
21
|
+
app.add_typer(update_app)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@app.callback()
|
|
25
|
+
def callback() -> None:
|
|
26
|
+
"""
|
|
27
|
+
Manage SSO for your Nextmv Cloud organization (account).
|
|
28
|
+
|
|
29
|
+
Please contact [link=https://www.nextmv.io/contact][bold]Nextmv support[/bold][/link]
|
|
30
|
+
for assistance configuring SSO for your organization.
|
|
31
|
+
"""
|
|
32
|
+
pass
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module defines the cloud sso create command for the Nextmv CLI.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Annotated
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from nextmv.cli.configuration.config import build_client
|
|
10
|
+
from nextmv.cli.message import in_progress, print_json
|
|
11
|
+
from nextmv.cli.options import ProfileOption
|
|
12
|
+
from nextmv.cloud.sso import SSOConfiguration
|
|
13
|
+
|
|
14
|
+
# Set up subcommand application.
|
|
15
|
+
app = typer.Typer()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@app.command()
|
|
19
|
+
def create(
|
|
20
|
+
allow_non_domain_users: Annotated[
|
|
21
|
+
bool,
|
|
22
|
+
typer.Option(
|
|
23
|
+
"--allow-non-domain-users",
|
|
24
|
+
"-a",
|
|
25
|
+
help="Allow users who are not part of the SSO domain to access the Nextmv Cloud organization (account).",
|
|
26
|
+
),
|
|
27
|
+
] = False,
|
|
28
|
+
enabled: Annotated[
|
|
29
|
+
bool,
|
|
30
|
+
typer.Option(
|
|
31
|
+
"--enabled",
|
|
32
|
+
"-e",
|
|
33
|
+
help="Enable SSO for the Nextmv Cloud organization (account) at the time of creation. "
|
|
34
|
+
"Run [code]nextmv cloud sso enable[/code] to enable SSO after creation.",
|
|
35
|
+
),
|
|
36
|
+
] = False,
|
|
37
|
+
metadata_url: Annotated[
|
|
38
|
+
str | None,
|
|
39
|
+
typer.Option(
|
|
40
|
+
"--metadata-url",
|
|
41
|
+
"-u",
|
|
42
|
+
help="The URL to the SSO metadata document.",
|
|
43
|
+
metavar="METADATA_URL",
|
|
44
|
+
),
|
|
45
|
+
] = None,
|
|
46
|
+
metadata_document: Annotated[
|
|
47
|
+
str | None,
|
|
48
|
+
typer.Option(
|
|
49
|
+
"--metadata-document",
|
|
50
|
+
"-d",
|
|
51
|
+
help="The SSO metadata document as a string.",
|
|
52
|
+
metavar="METADATA_DOCUMENT",
|
|
53
|
+
),
|
|
54
|
+
] = None,
|
|
55
|
+
profile: ProfileOption = None,
|
|
56
|
+
) -> None:
|
|
57
|
+
"""
|
|
58
|
+
Create a new SSO configuration for your Nextmv Cloud organization.
|
|
59
|
+
|
|
60
|
+
SSO must be configured to enable managed accounts in your organization.
|
|
61
|
+
Please contact [link=https://www.nextmv.io/contact][bold]Nextmv support[/bold][/link] for assistance.
|
|
62
|
+
|
|
63
|
+
You must provide either a metadata URL or a metadata document. The metadata
|
|
64
|
+
document contains the SAML configuration details from your identity provider.
|
|
65
|
+
|
|
66
|
+
[bold][underline]Examples[/underline][/bold]
|
|
67
|
+
|
|
68
|
+
- Create an SSO configuration using a metadata URL.
|
|
69
|
+
$ [dim]nextmv cloud sso create --metadata-url "https://sso.carrotexpress.com/saml/metadata"[/dim]
|
|
70
|
+
|
|
71
|
+
- Create and enable SSO configuration immediately.
|
|
72
|
+
$ [dim]nextmv cloud sso create --metadata-url "https://sso.bunnylogistics.io/metadata" \\
|
|
73
|
+
--enabled[/dim]
|
|
74
|
+
|
|
75
|
+
- Create SSO configuration allowing non-domain users.
|
|
76
|
+
$ [dim]nextmv cloud sso create --metadata-url "https://idp.hopmail.com/saml/metadata" \\
|
|
77
|
+
--allow-non-domain-users[/dim]
|
|
78
|
+
|
|
79
|
+
- Create SSO configuration using a metadata document string.
|
|
80
|
+
$ [dim]nextmv cloud sso create --metadata-document "<EntityDescriptor ...</EntityDescriptor>"[/dim]
|
|
81
|
+
|
|
82
|
+
- Create SSO configuration using the profile named [magenta]hare[/magenta].
|
|
83
|
+
$ [dim]nextmv cloud sso create --metadata-url "https://sso.cottontailcouriers.net/metadata" \\
|
|
84
|
+
--profile hare[/dim]
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
cloud_client = build_client(profile)
|
|
88
|
+
in_progress(msg="Creating configuration...")
|
|
89
|
+
|
|
90
|
+
configuration = SSOConfiguration.new(
|
|
91
|
+
client=cloud_client,
|
|
92
|
+
allow_non_domain_users=allow_non_domain_users,
|
|
93
|
+
enabled=enabled,
|
|
94
|
+
metadata_url=metadata_url,
|
|
95
|
+
metadata_document=metadata_document,
|
|
96
|
+
)
|
|
97
|
+
print_json(configuration.to_dict())
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module defines the cloud sso delete command for the Nextmv CLI.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Annotated
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from nextmv.cli.configuration.config import build_sso_config
|
|
10
|
+
from nextmv.cli.confirm import get_confirmation
|
|
11
|
+
from nextmv.cli.message import info, success
|
|
12
|
+
from nextmv.cli.options import ProfileOption
|
|
13
|
+
|
|
14
|
+
# Set up subcommand application.
|
|
15
|
+
app = typer.Typer()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@app.command()
|
|
19
|
+
def delete(
|
|
20
|
+
yes: Annotated[
|
|
21
|
+
bool,
|
|
22
|
+
typer.Option(
|
|
23
|
+
"--yes",
|
|
24
|
+
"-y",
|
|
25
|
+
help="Agree to deletion confirmation prompt. Useful for non-interactive sessions.",
|
|
26
|
+
),
|
|
27
|
+
] = False,
|
|
28
|
+
profile: ProfileOption = None,
|
|
29
|
+
) -> None:
|
|
30
|
+
"""
|
|
31
|
+
Deletes the SSO configuration.
|
|
32
|
+
|
|
33
|
+
You must have the [magenta]administrator[/magenta] role on the organization in order to delete it.
|
|
34
|
+
|
|
35
|
+
This action is permanent and cannot be undone. Use the --yes
|
|
36
|
+
flag to skip the confirmation prompt.
|
|
37
|
+
|
|
38
|
+
[bold][underline]Examples[/underline][/bold]
|
|
39
|
+
|
|
40
|
+
- Delete the SSO configuration.
|
|
41
|
+
$ [dim]nextmv cloud sso delete[/dim]
|
|
42
|
+
|
|
43
|
+
- Delete the SSO configuration without confirmation prompt.
|
|
44
|
+
$ [dim]nextmv cloud sso delete --yes[/dim]
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
if not yes:
|
|
48
|
+
confirm = get_confirmation(
|
|
49
|
+
"Are you sure you want to delete the sso configuration? This action cannot be undone.",
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
if not confirm:
|
|
53
|
+
info("SSO configuration will not be deleted.")
|
|
54
|
+
return
|
|
55
|
+
|
|
56
|
+
sso_config = build_sso_config(profile)
|
|
57
|
+
sso_config.delete()
|
|
58
|
+
success("SSO configuration has been deleted.")
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module defines the cloud sso disable command for the Nextmv CLI.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Annotated
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from nextmv.cli.configuration.config import build_sso_config
|
|
10
|
+
from nextmv.cli.confirm import get_confirmation
|
|
11
|
+
from nextmv.cli.message import info, success
|
|
12
|
+
from nextmv.cli.options import ProfileOption
|
|
13
|
+
|
|
14
|
+
# Set up subcommand application.
|
|
15
|
+
app = typer.Typer()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@app.command()
|
|
19
|
+
def disable(
|
|
20
|
+
yes: Annotated[
|
|
21
|
+
bool,
|
|
22
|
+
typer.Option(
|
|
23
|
+
"--yes",
|
|
24
|
+
"-y",
|
|
25
|
+
help="Agree to disable confirmation prompt. Useful for non-interactive sessions.",
|
|
26
|
+
),
|
|
27
|
+
] = False,
|
|
28
|
+
profile: ProfileOption = None,
|
|
29
|
+
) -> None:
|
|
30
|
+
"""
|
|
31
|
+
Disables the SSO configuration.
|
|
32
|
+
|
|
33
|
+
Use the --yes flag to skip the confirmation prompt. Use the [code]nextmv
|
|
34
|
+
cloud sso enable[/code] command to re-enable SSO.
|
|
35
|
+
|
|
36
|
+
[bold][underline]Examples[/underline][/bold]
|
|
37
|
+
|
|
38
|
+
- Disable the SSO configuration.
|
|
39
|
+
$ [dim]nextmv cloud sso disable[/dim]
|
|
40
|
+
|
|
41
|
+
- Disable the SSO configuration without confirmation prompt.
|
|
42
|
+
$ [dim]nextmv cloud sso disable --yes[/dim]
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
if not yes:
|
|
46
|
+
confirm = get_confirmation(
|
|
47
|
+
"Are you sure you want to disable the sso configuration?.",
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
if not confirm:
|
|
51
|
+
info("SSO configuration will not be disabled.")
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
sso_config = build_sso_config(profile)
|
|
55
|
+
sso_config.disable()
|
|
56
|
+
success("SSO configuration has been disabled.")
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module defines the cloud sso enable command for the Nextmv CLI.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Annotated
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from nextmv.cli.configuration.config import build_sso_config
|
|
10
|
+
from nextmv.cli.confirm import get_confirmation
|
|
11
|
+
from nextmv.cli.message import info, success
|
|
12
|
+
from nextmv.cli.options import ProfileOption
|
|
13
|
+
|
|
14
|
+
# Set up subcommand application.
|
|
15
|
+
app = typer.Typer()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@app.command()
|
|
19
|
+
def enable(
|
|
20
|
+
yes: Annotated[
|
|
21
|
+
bool,
|
|
22
|
+
typer.Option(
|
|
23
|
+
"--yes",
|
|
24
|
+
"-y",
|
|
25
|
+
help="Agree to enable confirmation prompt. Useful for non-interactive sessions.",
|
|
26
|
+
),
|
|
27
|
+
] = False,
|
|
28
|
+
profile: ProfileOption = None,
|
|
29
|
+
) -> None:
|
|
30
|
+
"""
|
|
31
|
+
Enables the SSO configuration.
|
|
32
|
+
|
|
33
|
+
Use the --yes flag to skip the confirmation prompt. Use the [code]nextmv
|
|
34
|
+
cloud sso disable[/code] command to disable SSO.
|
|
35
|
+
|
|
36
|
+
[bold][underline]Examples[/underline][/bold]
|
|
37
|
+
|
|
38
|
+
- Enable the SSO configuration.
|
|
39
|
+
$ [dim]nextmv cloud sso enable[/dim]
|
|
40
|
+
|
|
41
|
+
- Enable the SSO configuration without confirmation prompt.
|
|
42
|
+
$ [dim]nextmv cloud sso enable --yes[/dim]
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
if not yes:
|
|
46
|
+
confirm = get_confirmation(
|
|
47
|
+
"Are you sure you want to enable the sso configuration?.",
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
if not confirm:
|
|
51
|
+
info("SSO configuration will not be enabled.")
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
sso_config = build_sso_config(profile)
|
|
55
|
+
sso_config.enable()
|
|
56
|
+
success("SSO configuration has been enabled.")
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module defines the cloud sso get command for the Nextmv CLI.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from typing import Annotated
|
|
7
|
+
|
|
8
|
+
import typer
|
|
9
|
+
|
|
10
|
+
from nextmv.cli.configuration.config import build_client
|
|
11
|
+
from nextmv.cli.message import in_progress, print_json, success
|
|
12
|
+
from nextmv.cli.options import ProfileOption
|
|
13
|
+
from nextmv.cloud.sso import SSOConfiguration
|
|
14
|
+
|
|
15
|
+
# Set up subcommand application.
|
|
16
|
+
app = typer.Typer()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@app.command()
|
|
20
|
+
def get(
|
|
21
|
+
output: Annotated[
|
|
22
|
+
str | None,
|
|
23
|
+
typer.Option(
|
|
24
|
+
"--output",
|
|
25
|
+
"-o",
|
|
26
|
+
help="Saves the SSO configuration information to this location.",
|
|
27
|
+
metavar="OUTPUT_PATH",
|
|
28
|
+
),
|
|
29
|
+
] = None,
|
|
30
|
+
profile: ProfileOption = None,
|
|
31
|
+
) -> None:
|
|
32
|
+
"""
|
|
33
|
+
Get the information of a Nextmv Cloud SSO configuration.
|
|
34
|
+
|
|
35
|
+
This command is useful to get the attributes of an existing Nextmv Cloud
|
|
36
|
+
SSO configuration.
|
|
37
|
+
|
|
38
|
+
[bold][underline]Examples[/underline][/bold]
|
|
39
|
+
|
|
40
|
+
- Get the SSO configuration.
|
|
41
|
+
$ [dim]nextmv cloud sso get[/dim]
|
|
42
|
+
|
|
43
|
+
- Get the SSO configuration and save the information to an [magenta]sso_config.json[/magenta] file.
|
|
44
|
+
$ [dim]nextmv cloud sso get --output sso_config.json[/dim]
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
client = build_client(profile)
|
|
48
|
+
in_progress(msg="Getting SSO configuration...")
|
|
49
|
+
|
|
50
|
+
sso_config = SSOConfiguration.get(client)
|
|
51
|
+
sso_config_dict = sso_config.to_dict()
|
|
52
|
+
|
|
53
|
+
if output is not None and output != "":
|
|
54
|
+
with open(output, "w") as f:
|
|
55
|
+
json.dump(sso_config_dict, f, indent=2)
|
|
56
|
+
|
|
57
|
+
success(msg=f"SSO configuration information saved to [magenta]{output}[/magenta].")
|
|
58
|
+
|
|
59
|
+
return
|
|
60
|
+
|
|
61
|
+
print_json(sso_config_dict)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module defines the cloud sso update command for the Nextmv CLI.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from typing import Annotated
|
|
7
|
+
|
|
8
|
+
import typer
|
|
9
|
+
|
|
10
|
+
from nextmv.cli.configuration.config import build_sso_config
|
|
11
|
+
from nextmv.cli.message import print_json, success
|
|
12
|
+
from nextmv.cli.options import ProfileOption
|
|
13
|
+
|
|
14
|
+
# Set up subcommand application.
|
|
15
|
+
app = typer.Typer()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@app.command()
|
|
19
|
+
def update(
|
|
20
|
+
metadata_url: Annotated[
|
|
21
|
+
str | None,
|
|
22
|
+
typer.Option(
|
|
23
|
+
"--metadata-url",
|
|
24
|
+
"-u",
|
|
25
|
+
help="The URL to the SSO metadata document to update.",
|
|
26
|
+
metavar="METADATA_URL",
|
|
27
|
+
),
|
|
28
|
+
] = None,
|
|
29
|
+
metadata_document: Annotated[
|
|
30
|
+
str | None,
|
|
31
|
+
typer.Option(
|
|
32
|
+
"--metadata-document",
|
|
33
|
+
"-d",
|
|
34
|
+
help="The SSO metadata document as a string to update.",
|
|
35
|
+
metavar="METADATA_DOCUMENT",
|
|
36
|
+
),
|
|
37
|
+
] = None,
|
|
38
|
+
output: Annotated[
|
|
39
|
+
str | None,
|
|
40
|
+
typer.Option(
|
|
41
|
+
"--output",
|
|
42
|
+
"-o",
|
|
43
|
+
help="Saves the updated SSO configuration information to this location.",
|
|
44
|
+
metavar="OUTPUT_PATH",
|
|
45
|
+
),
|
|
46
|
+
] = None,
|
|
47
|
+
profile: ProfileOption = None,
|
|
48
|
+
) -> None:
|
|
49
|
+
"""
|
|
50
|
+
Updates information of a Nextmv Cloud SSO configuration.
|
|
51
|
+
|
|
52
|
+
This command allows you to update the metadata URL or metadata document of
|
|
53
|
+
an existing SSO configuration.
|
|
54
|
+
|
|
55
|
+
[bold][underline]Examples[/underline][/bold]
|
|
56
|
+
|
|
57
|
+
- Update the SSO configuration with a new metadata URL.
|
|
58
|
+
$ [dim]nextmv cloud sso update --metadata-url "https://example.com/metadata.xml"[/dim]
|
|
59
|
+
|
|
60
|
+
- Update the SSO configuration with a new metadata document and save the updated information to an
|
|
61
|
+
[magenta]updated_sso_config.json[/magenta] file.
|
|
62
|
+
$ [dim]nextmv cloud sso update --metadata-document "<xml>...</xml>" --output updated_sso_config.json[/dim]
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
sso_config = build_sso_config(profile)
|
|
66
|
+
updated_config = sso_config.update(metadata_url=metadata_url, metadata_document=metadata_document)
|
|
67
|
+
success("SSO configuration updated successfully.")
|
|
68
|
+
updated_config_dict = updated_config.to_dict()
|
|
69
|
+
|
|
70
|
+
if output is not None and output != "":
|
|
71
|
+
with open(output, "w") as f:
|
|
72
|
+
json.dump(updated_config_dict, f, indent=2)
|
|
73
|
+
|
|
74
|
+
success(msg=f"Updated SSO configuration information saved to [magenta]{output}[/magenta].")
|
|
75
|
+
|
|
76
|
+
return
|
|
77
|
+
|
|
78
|
+
print_json(updated_config_dict)
|
|
@@ -12,6 +12,7 @@ from nextmv.cli.message import error, success, warning
|
|
|
12
12
|
from nextmv.cloud.account import Account
|
|
13
13
|
from nextmv.cloud.application import Application
|
|
14
14
|
from nextmv.cloud.client import Client
|
|
15
|
+
from nextmv.cloud.sso import SSOConfiguration
|
|
15
16
|
|
|
16
17
|
# Some useful constants.
|
|
17
18
|
CONFIG_DIR = Path.home() / ".nextmv"
|
|
@@ -207,6 +208,32 @@ def build_account(account_id: str | None = None, profile: str | None = None) ->
|
|
|
207
208
|
return Account(account_id=account_id, client=client)
|
|
208
209
|
|
|
209
210
|
|
|
211
|
+
def build_sso_config(profile: str | None = None) -> SSOConfiguration:
|
|
212
|
+
"""
|
|
213
|
+
Builds a `cloud.SSOConfiguration` using the API key and endpoint for the given
|
|
214
|
+
profile. If no profile is given, the default profile is used.
|
|
215
|
+
|
|
216
|
+
Parameters
|
|
217
|
+
----------
|
|
218
|
+
profile : str | None
|
|
219
|
+
The profile name to use. If None, the default profile is used.
|
|
220
|
+
|
|
221
|
+
Returns
|
|
222
|
+
-------
|
|
223
|
+
SSOConfiguration
|
|
224
|
+
An SSOConfiguration object for the configured profile.
|
|
225
|
+
|
|
226
|
+
Raises
|
|
227
|
+
------
|
|
228
|
+
typer.Exit
|
|
229
|
+
If the configuration is invalid or missing.
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
client = build_client(profile)
|
|
233
|
+
|
|
234
|
+
return SSOConfiguration(client=client)
|
|
235
|
+
|
|
236
|
+
|
|
210
237
|
def obscure_api_key(api_key: str) -> str:
|
|
211
238
|
"""
|
|
212
239
|
Obscure an API key for display purposes.
|
|
@@ -61,6 +61,7 @@ from .shadow import StartEvents as StartEvents
|
|
|
61
61
|
from .shadow import StopIntent as StopIntent
|
|
62
62
|
from .shadow import TerminationEvents as TerminationEvents
|
|
63
63
|
from .shadow import TestComparison as TestComparison
|
|
64
|
+
from .sso import SSOConfiguration as SSOConfiguration
|
|
64
65
|
from .switchback import SwitchbackPlan as SwitchbackPlan
|
|
65
66
|
from .switchback import SwitchbackPlanUnit as SwitchbackPlanUnit
|
|
66
67
|
from .switchback import SwitchbackTest as SwitchbackTest
|
|
@@ -188,30 +188,32 @@ class Account(BaseModel):
|
|
|
188
188
|
|
|
189
189
|
You can import the `Account` class directly from `cloud`:
|
|
190
190
|
|
|
191
|
-
```python
|
|
192
|
-
from nextmv.cloud import Account
|
|
193
|
-
```
|
|
191
|
+
```python from nextmv.cloud import Account ```
|
|
194
192
|
|
|
195
193
|
This class provides access to account-level operations in the Nextmv Cloud,
|
|
196
194
|
such as retrieving the queue of runs.
|
|
197
195
|
|
|
198
|
-
Note: It is recommended to use `Account.get()` or `Account.new()`
|
|
199
|
-
|
|
196
|
+
Note: It is recommended to use `Account.get()` or `Account.new()` instead
|
|
197
|
+
of direct initialization to ensure proper setup.
|
|
200
198
|
|
|
201
|
-
|
|
199
|
+
Attributes
|
|
202
200
|
----------
|
|
203
|
-
client : Client
|
|
204
|
-
Client to use for interacting with the Nextmv Cloud API.
|
|
205
201
|
account_id : str, optional
|
|
206
202
|
ID of the account (organization).
|
|
207
203
|
name : str, optional
|
|
208
204
|
Name of the account (organization).
|
|
209
205
|
members : list[AccountMember], optional
|
|
210
206
|
List of members in the account (organization).
|
|
207
|
+
client : Client
|
|
208
|
+
Client to use for interacting with the Nextmv Cloud API. This is an
|
|
209
|
+
SDK-specific attribute and it is not part of the API representation of
|
|
210
|
+
an account.
|
|
211
211
|
account_endpoint : str, default="v1/account"
|
|
212
|
-
Base endpoint for the account
|
|
212
|
+
Base endpoint for the account. This is an SDK-specific attribute and it
|
|
213
|
+
is not part of the API representation of an account.
|
|
213
214
|
organization_endpoint : str, default="v1/organization/{organization_id}"
|
|
214
|
-
Base endpoint for organization operations
|
|
215
|
+
Base endpoint for organization operations. This is an SDK-specific
|
|
216
|
+
attribute and it is not part of the API representation of an account.
|
|
215
217
|
|
|
216
218
|
Examples
|
|
217
219
|
--------
|
|
@@ -121,10 +121,8 @@ class Application(
|
|
|
121
121
|
Note: It is recommended to use `Application.get()` or `Application.new()`
|
|
122
122
|
instead of direct initialization to ensure proper setup.
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
Attributes
|
|
125
125
|
----------
|
|
126
|
-
client : Client
|
|
127
|
-
Client to use for interacting with the Nextmv Cloud API.
|
|
128
126
|
id : str
|
|
129
127
|
ID of the application.
|
|
130
128
|
name : str, optional
|
|
@@ -145,12 +143,19 @@ class Application(
|
|
|
145
143
|
Creation timestamp of the application.
|
|
146
144
|
updated_at : datetime, optional
|
|
147
145
|
Last update timestamp of the application.
|
|
146
|
+
client : Client
|
|
147
|
+
Client to use for interacting with the Nextmv Cloud API. This is an
|
|
148
|
+
SDK-specific attribute and it is not part of the API representation of
|
|
149
|
+
an application.
|
|
148
150
|
endpoint : str, default="v1/applications/{id}"
|
|
149
|
-
Base endpoint for the application
|
|
151
|
+
Base endpoint for the application. This is an SDK-specific attribute
|
|
152
|
+
and it is not part of the API representation of an application.
|
|
150
153
|
experiments_endpoint : str, default="{base}/experiments"
|
|
151
|
-
Base endpoint for experiments
|
|
154
|
+
Base endpoint for experiments. This is an SDK-specific attribute and it
|
|
155
|
+
is not part of the API representation of an application.
|
|
152
156
|
ensembles_endpoint : str, default="{base}/ensembles"
|
|
153
|
-
Base endpoint for ensembles
|
|
157
|
+
Base endpoint for ensembles. This is an SDK-specific attribute and it
|
|
158
|
+
is not part of the API representation of an application.
|
|
154
159
|
|
|
155
160
|
Examples
|
|
156
161
|
--------
|