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.
Files changed (238) hide show
  1. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/PKG-INFO +1 -1
  2. nextmv-1.1.0.dev0/nextmv/__about__.py +1 -0
  3. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/__init__.py +2 -0
  4. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/account/__init__.py +5 -3
  5. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/account/create.py +4 -1
  6. nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/__init__.py +32 -0
  7. nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/create.py +97 -0
  8. nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/delete.py +58 -0
  9. nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/disable.py +56 -0
  10. nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/enable.py +56 -0
  11. nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/get.py +61 -0
  12. nextmv-1.1.0.dev0/nextmv/cli/cloud/sso/update.py +78 -0
  13. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/configuration/config.py +27 -0
  14. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/__init__.py +1 -0
  15. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/account.py +12 -10
  16. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/__init__.py +11 -6
  17. nextmv-1.1.0.dev0/nextmv/cloud/sso.py +248 -0
  18. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/integration/cloud/test_integration_cloud.py +16 -7
  19. nextmv-1.0.0.dev10/nextmv/__about__.py +0 -1
  20. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/.gitignore +0 -0
  21. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/LICENSE +0 -0
  22. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/README.md +0 -0
  23. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/__entrypoint__.py +0 -0
  24. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/__init__.py +0 -0
  25. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/_serialization.py +0 -0
  26. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/base_model.py +0 -0
  27. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/CONTRIBUTING.md +0 -0
  28. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/__init__.py +0 -0
  29. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
  30. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/create.py +0 -0
  31. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/delete.py +0 -0
  32. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/get.py +0 -0
  33. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/list.py +0 -0
  34. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/acceptance/update.py +0 -0
  35. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/account/delete.py +0 -0
  36. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/account/get.py +0 -0
  37. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/account/update.py +0 -0
  38. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/__init__.py +0 -0
  39. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/create.py +0 -0
  40. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/delete.py +0 -0
  41. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/exists.py +0 -0
  42. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/get.py +0 -0
  43. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/list.py +0 -0
  44. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/push.py +0 -0
  45. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/app/update.py +0 -0
  46. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/__init__.py +0 -0
  47. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/create.py +0 -0
  48. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/delete.py +0 -0
  49. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/get.py +0 -0
  50. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/list.py +0 -0
  51. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/metadata.py +0 -0
  52. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/batch/update.py +0 -0
  53. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/data/__init__.py +0 -0
  54. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/data/upload.py +0 -0
  55. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/__init__.py +0 -0
  56. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/create.py +0 -0
  57. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/delete.py +0 -0
  58. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/get.py +0 -0
  59. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/list.py +0 -0
  60. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/ensemble/update.py +0 -0
  61. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/__init__.py +0 -0
  62. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/create.py +0 -0
  63. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/delete.py +0 -0
  64. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/get.py +0 -0
  65. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/list.py +0 -0
  66. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/input_set/update.py +0 -0
  67. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/__init__.py +0 -0
  68. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/create.py +0 -0
  69. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/delete.py +0 -0
  70. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/exists.py +0 -0
  71. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/get.py +0 -0
  72. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/list.py +0 -0
  73. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/instance/update.py +0 -0
  74. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
  75. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/create.py +0 -0
  76. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/delete.py +0 -0
  77. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/get.py +0 -0
  78. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/list.py +0 -0
  79. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/managed_input/update.py +0 -0
  80. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/__init__.py +0 -0
  81. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/cancel.py +0 -0
  82. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/create.py +0 -0
  83. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/get.py +0 -0
  84. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/input.py +0 -0
  85. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/list.py +0 -0
  86. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/logs.py +0 -0
  87. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/metadata.py +0 -0
  88. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/run/track.py +0 -0
  89. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/__init__.py +0 -0
  90. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/create.py +0 -0
  91. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/delete.py +0 -0
  92. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/get.py +0 -0
  93. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/list.py +0 -0
  94. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/metadata.py +0 -0
  95. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/scenario/update.py +0 -0
  96. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/__init__.py +0 -0
  97. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/create.py +0 -0
  98. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/delete.py +0 -0
  99. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/get.py +0 -0
  100. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/list.py +0 -0
  101. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/secrets/update.py +0 -0
  102. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/__init__.py +0 -0
  103. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/create.py +0 -0
  104. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/delete.py +0 -0
  105. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/get.py +0 -0
  106. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/list.py +0 -0
  107. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/metadata.py +0 -0
  108. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/start.py +0 -0
  109. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/stop.py +0 -0
  110. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/shadow/update.py +0 -0
  111. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/__init__.py +0 -0
  112. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/create.py +0 -0
  113. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/delete.py +0 -0
  114. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/get.py +0 -0
  115. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/list.py +0 -0
  116. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/metadata.py +0 -0
  117. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/start.py +0 -0
  118. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/stop.py +0 -0
  119. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/switchback/update.py +0 -0
  120. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/upload/__init__.py +0 -0
  121. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/upload/create.py +0 -0
  122. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/__init__.py +0 -0
  123. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/create.py +0 -0
  124. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/delete.py +0 -0
  125. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/exists.py +0 -0
  126. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/get.py +0 -0
  127. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/list.py +0 -0
  128. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/cloud/version/update.py +0 -0
  129. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/community/__init__.py +1 -1
  130. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/community/clone.py +0 -0
  131. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/community/list.py +0 -0
  132. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/configuration/__init__.py +0 -0
  133. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/configuration/create.py +0 -0
  134. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/configuration/delete.py +0 -0
  135. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/configuration/list.py +0 -0
  136. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/confirm.py +0 -0
  137. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/main.py +0 -0
  138. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/message.py +0 -0
  139. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/options.py +0 -0
  140. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cli/version.py +0 -0
  141. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/acceptance_test.py +0 -0
  142. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_acceptance.py +0 -0
  143. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_batch_scenario.py +0 -0
  144. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_ensemble.py +0 -0
  145. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_input_set.py +0 -0
  146. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_instance.py +0 -0
  147. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_managed_input.py +0 -0
  148. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_run.py +0 -0
  149. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_secrets.py +0 -0
  150. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_shadow.py +0 -0
  151. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_switchback.py +0 -0
  152. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_utils.py +0 -0
  153. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/application/_version.py +0 -0
  154. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/assets.py +0 -0
  155. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/batch_experiment.py +0 -0
  156. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/client.py +0 -0
  157. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/community.py +0 -0
  158. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/ensemble.py +0 -0
  159. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/input_set.py +0 -0
  160. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/instance.py +0 -0
  161. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/integration.py +0 -0
  162. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/package.py +0 -0
  163. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/scenario.py +0 -0
  164. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/secrets.py +0 -0
  165. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/shadow.py +0 -0
  166. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/switchback.py +0 -0
  167. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/url.py +0 -0
  168. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/cloud/version.py +0 -0
  169. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/.gitignore +0 -0
  170. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/README.md +0 -0
  171. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/app.yaml +0 -0
  172. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/input.json +0 -0
  173. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/main.py +0 -0
  174. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/requirements.txt +0 -0
  175. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/src/__init__.py +0 -0
  176. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/default_app/src/visuals.py +0 -0
  177. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/deprecated.py +0 -0
  178. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/input.py +0 -0
  179. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/__init__.py +0 -0
  180. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/application.py +0 -0
  181. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/executor.py +0 -0
  182. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/geojson_handler.py +0 -0
  183. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/local.py +0 -0
  184. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/plotly_handler.py +0 -0
  185. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/local/runner.py +0 -0
  186. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/logger.py +0 -0
  187. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/manifest.py +0 -0
  188. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/model.py +0 -0
  189. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/options.py +0 -0
  190. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/output.py +0 -0
  191. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/polling.py +0 -0
  192. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/run.py +0 -0
  193. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/safe.py +0 -0
  194. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/nextmv/status.py +0 -0
  195. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/pyproject.toml +0 -0
  196. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/README.md +0 -0
  197. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/__init__.py +0 -0
  198. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cli/__init__.py +0 -0
  199. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cli/test_configuration.py +0 -0
  200. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cli/test_main.py +0 -0
  201. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cli/test_version.py +0 -0
  202. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/__init__.py +0 -0
  203. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/app.yaml +0 -0
  204. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/test_client.py +0 -0
  205. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/test_instance.py +0 -0
  206. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/test_package.py +0 -0
  207. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/cloud/test_scenario.py +0 -0
  208. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/integration/__init__.py +0 -0
  209. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/integration/cloud/__init__.py +0 -0
  210. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/local/__init__.py +0 -0
  211. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/local/test_application.py +0 -0
  212. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/local/test_executor.py +0 -0
  213. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/local/test_runner.py +0 -0
  214. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/__init__.py +0 -0
  215. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options1.py +0 -0
  216. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options2.py +0 -0
  217. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options3.py +0 -0
  218. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options4.py +0 -0
  219. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options5.py +0 -0
  220. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options6.py +0 -0
  221. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/scripts/options7.py +0 -0
  222. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_base_model.py +0 -0
  223. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_entrypoint/__init__.py +0 -0
  224. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_entrypoint/test_entrypoint.py +0 -0
  225. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_input.py +0 -0
  226. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_inputs/test_data.csv +0 -0
  227. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_inputs/test_data.json +0 -0
  228. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_inputs/test_data.txt +0 -0
  229. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_logger.py +0 -0
  230. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_manifest.py +0 -0
  231. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_model.py +0 -0
  232. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_options.py +0 -0
  233. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_output.py +0 -0
  234. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_polling.py +0 -0
  235. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_run.py +0 -0
  236. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_safe.py +0 -0
  237. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_serialization.py +0 -0
  238. {nextmv-1.0.0.dev10 → nextmv-1.1.0.dev0}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextmv
3
- Version: 1.0.0.dev10
3
+ Version: 1.1.0.dev0
4
4
  Summary: The all-purpose Python SDK for Nextmv
5
5
  Project-URL: Homepage, https://www.nextmv.io
6
6
  Project-URL: Documentation, https://nextmv-py.docs.nextmv.io/en/latest/nextmv/
@@ -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 SSO for your Nextmv Cloud account (organization).
23
+ Manage your Nextmv Cloud account (organization).
24
24
 
25
- Please contact [link=https://www.nextmv.io/contact][bold]Nextmv support[/bold][/link]
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 support[/bold][/link] for assistance.
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
- instead of direct initialization to ensure proper setup.
196
+ Note: It is recommended to use `Account.get()` or `Account.new()` instead
197
+ of direct initialization to ensure proper setup.
200
198
 
201
- Parameters
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 (SDK-specific).
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 (SDK-specific).
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
- Parameters
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 (SDK-specific).
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 (SDK-specific).
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 (SDK-specific).
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
  --------