osism 0.20250824.1__tar.gz → 0.20250827.0__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 (157) hide show
  1. osism-0.20250827.0/.github/renovate.json +15 -0
  2. osism-0.20250827.0/AUTHORS +1 -0
  3. osism-0.20250827.0/ChangeLog +7 -0
  4. {osism-0.20250824.1/osism.egg-info → osism-0.20250827.0}/PKG-INFO +5 -5
  5. {osism-0.20250824.1 → osism-0.20250827.0}/Pipfile +2 -2
  6. {osism-0.20250824.1 → osism-0.20250827.0}/Pipfile.lock +19 -19
  7. osism-0.20250827.0/files/data/flavors.yaml +274 -0
  8. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/nodes/page.tsx +4 -4
  9. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/package-lock.json +9 -9
  10. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/apply.py +4 -0
  11. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/configuration.py +4 -0
  12. osism-0.20250827.0/osism/commands/lock.py +91 -0
  13. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/manage.py +132 -6
  14. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/netbox.py +12 -0
  15. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/noset.py +7 -0
  16. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/reconciler.py +3 -0
  17. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/redfish.py +4 -0
  18. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/service.py +4 -0
  19. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/set.py +7 -0
  20. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/sonic.py +3 -0
  21. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/sync.py +7 -0
  22. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/validate.py +3 -0
  23. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/worker.py +4 -0
  24. {osism-0.20250824.1 → osism-0.20250827.0}/osism/data/__init__.py +33 -0
  25. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/ansible.py +3 -0
  26. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/ceph.py +4 -0
  27. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/__init__.py +10 -0
  28. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/kolla.py +4 -0
  29. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/kubernetes.py +4 -0
  30. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/netbox.py +12 -0
  31. osism-0.20250827.0/osism/tasks/openstack.py +454 -0
  32. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/reconciler.py +3 -0
  33. {osism-0.20250824.1 → osism-0.20250827.0}/osism/utils/__init__.py +81 -0
  34. {osism-0.20250824.1 → osism-0.20250827.0/osism.egg-info}/PKG-INFO +5 -5
  35. {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/SOURCES.txt +2 -0
  36. {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/entry_points.txt +4 -0
  37. osism-0.20250827.0/osism.egg-info/pbr.json +1 -0
  38. {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/requires.txt +4 -4
  39. {osism-0.20250824.1 → osism-0.20250827.0}/requirements.ansible.txt +1 -1
  40. osism-0.20250827.0/requirements.netbox-manager.txt +1 -0
  41. osism-0.20250827.0/requirements.openstack-flavor-manager.txt +1 -0
  42. osism-0.20250827.0/requirements.openstack-image-manager.txt +1 -0
  43. {osism-0.20250824.1 → osism-0.20250827.0}/requirements.txt +2 -2
  44. {osism-0.20250824.1 → osism-0.20250827.0}/setup.cfg +4 -0
  45. osism-0.20250824.1/.github/renovate.json +0 -15
  46. osism-0.20250824.1/AUTHORS +0 -1
  47. osism-0.20250824.1/ChangeLog +0 -7
  48. osism-0.20250824.1/osism/tasks/openstack.py +0 -227
  49. osism-0.20250824.1/osism.egg-info/pbr.json +0 -1
  50. osism-0.20250824.1/requirements.netbox-manager.txt +0 -1
  51. osism-0.20250824.1/requirements.openstack-flavor-manager.txt +0 -1
  52. osism-0.20250824.1/requirements.openstack-image-manager.txt +0 -1
  53. {osism-0.20250824.1 → osism-0.20250827.0}/.flake8 +0 -0
  54. {osism-0.20250824.1 → osism-0.20250827.0}/.github/workflows/publish.yml +0 -0
  55. {osism-0.20250824.1 → osism-0.20250827.0}/.hadolint.yaml +0 -0
  56. {osism-0.20250824.1 → osism-0.20250827.0}/.zuul.yaml +0 -0
  57. {osism-0.20250824.1 → osism-0.20250827.0}/Containerfile +0 -0
  58. {osism-0.20250824.1 → osism-0.20250827.0}/Dockerfile +0 -0
  59. {osism-0.20250824.1 → osism-0.20250827.0}/LICENSE +0 -0
  60. {osism-0.20250824.1 → osism-0.20250827.0}/README.md +0 -0
  61. {osism-0.20250824.1 → osism-0.20250827.0}/files/change.sh +0 -0
  62. {osism-0.20250824.1 → osism-0.20250827.0}/files/cleanup-ansible-collections.sh +0 -0
  63. {osism-0.20250824.1 → osism-0.20250827.0}/files/clustershell/clush.conf +0 -0
  64. {osism-0.20250824.1 → osism-0.20250827.0}/files/clustershell/groups.conf +0 -0
  65. {osism-0.20250824.1 → osism-0.20250827.0}/files/data/SCS-Spec.MandatoryFlavors.verbose.yaml +0 -0
  66. {osism-0.20250824.1 → osism-0.20250827.0}/files/netbox-manager/settings.toml +0 -0
  67. {osism-0.20250824.1 → osism-0.20250827.0}/files/redfishMockupCreate.py +0 -0
  68. {osism-0.20250824.1 → osism-0.20250827.0}/files/run-ansible-console.sh +0 -0
  69. {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/config_db.json +0 -0
  70. {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS4625-54T.ini +0 -0
  71. {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS5835-54T.ini +0 -0
  72. {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS5835-54X.ini +0 -0
  73. {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS7326-56X.ini +0 -0
  74. {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS7726-32X.ini +0 -0
  75. {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS9716-32D.ini +0 -0
  76. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/.dockerignore +0 -0
  77. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/.gitignore +0 -0
  78. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/Containerfile +0 -0
  79. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/Dockerfile +0 -0
  80. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/api/config/route.ts +0 -0
  81. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/api/health/route.ts +0 -0
  82. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/components/ConnectionStatus.tsx +0 -0
  83. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/components/EventsFilters.tsx +0 -0
  84. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/components/EventsList.tsx +0 -0
  85. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/events/page.tsx +0 -0
  86. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/favicon.ico +0 -0
  87. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/globals.css +0 -0
  88. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/layout.tsx +0 -0
  89. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/page.tsx +0 -0
  90. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/services/page.tsx +0 -0
  91. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/components.json +0 -0
  92. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/eslint.config.mjs +0 -0
  93. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/lib/api.ts +0 -0
  94. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/lib/hooks/useWebSocket.ts +0 -0
  95. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/lib/types.ts +0 -0
  96. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/lib/utils.ts +0 -0
  97. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/next.config.ts +0 -0
  98. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/package.json +0 -0
  99. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/postcss.config.mjs +0 -0
  100. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/public/file.svg +0 -0
  101. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/public/globe.svg +0 -0
  102. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/public/next.svg +0 -0
  103. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/public/vercel.svg +0 -0
  104. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/public/window.svg +0 -0
  105. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/tailwind.config.ts +0 -0
  106. {osism-0.20250824.1 → osism-0.20250827.0}/frontend/tsconfig.json +0 -0
  107. {osism-0.20250824.1 → osism-0.20250827.0}/osism/__init__.py +0 -0
  108. {osism-0.20250824.1 → osism-0.20250827.0}/osism/__main__.py +0 -0
  109. {osism-0.20250824.1 → osism-0.20250827.0}/osism/api.py +0 -0
  110. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/__init__.py +0 -0
  111. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/baremetal.py +0 -0
  112. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/compose.py +0 -0
  113. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/compute.py +0 -0
  114. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/console.py +0 -0
  115. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/container.py +0 -0
  116. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/get.py +0 -0
  117. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/log.py +0 -0
  118. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/server.py +0 -0
  119. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/status.py +0 -0
  120. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/task.py +0 -0
  121. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/vault.py +0 -0
  122. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/volume.py +0 -0
  123. {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/wait.py +0 -0
  124. {osism-0.20250824.1 → osism-0.20250827.0}/osism/data/enums.py +0 -0
  125. {osism-0.20250824.1 → osism-0.20250827.0}/osism/data/playbooks.py +0 -0
  126. {osism-0.20250824.1 → osism-0.20250827.0}/osism/main.py +0 -0
  127. {osism-0.20250824.1 → osism-0.20250827.0}/osism/services/__init__.py +0 -0
  128. {osism-0.20250824.1 → osism-0.20250827.0}/osism/services/event_bridge.py +0 -0
  129. {osism-0.20250824.1 → osism-0.20250827.0}/osism/services/listener.py +0 -0
  130. {osism-0.20250824.1 → osism-0.20250827.0}/osism/services/websocket_manager.py +0 -0
  131. {osism-0.20250824.1 → osism-0.20250827.0}/osism/settings.py +0 -0
  132. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/__init__.py +0 -0
  133. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/config.py +0 -0
  134. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/ironic.py +0 -0
  135. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/netbox.py +0 -0
  136. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/redfish.py +0 -0
  137. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/__init__.py +0 -0
  138. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/bgp.py +0 -0
  139. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/cache.py +0 -0
  140. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/config_generator.py +0 -0
  141. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/connections.py +0 -0
  142. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/constants.py +0 -0
  143. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/device.py +0 -0
  144. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/exporter.py +0 -0
  145. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/interface.py +0 -0
  146. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/sync.py +0 -0
  147. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/utils.py +0 -0
  148. {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor.py +0 -0
  149. {osism-0.20250824.1 → osism-0.20250827.0}/osism/utils/ssh.py +0 -0
  150. {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/dependency_links.txt +0 -0
  151. {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/not-zip-safe +0 -0
  152. {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/top_level.txt +0 -0
  153. {osism-0.20250824.1 → osism-0.20250827.0}/playbooks/build.yml +0 -0
  154. {osism-0.20250824.1 → osism-0.20250827.0}/playbooks/pre.yml +0 -0
  155. {osism-0.20250824.1 → osism-0.20250827.0}/playbooks/test-setup.yml +0 -0
  156. {osism-0.20250824.1 → osism-0.20250827.0}/requirements.yml +0 -0
  157. {osism-0.20250824.1 → osism-0.20250827.0}/setup.py +0 -0
@@ -0,0 +1,15 @@
1
+ {
2
+ "extends": [
3
+ "github>osism/renovate-config",
4
+ "github>osism/renovate-config:docker"
5
+ ],
6
+ "pip_requirements": {
7
+ "managerFilePatterns": [
8
+ "/requirements.ansible.txt/",
9
+ "/requirements.netbox-manager.txt/",
10
+ "/requirements.openstack-flavor-manager.txt/",
11
+ "/requirements.openstack-image-manager.txt/",
12
+ "/requirements.txt/"
13
+ ]
14
+ }
15
+ }
@@ -0,0 +1 @@
1
+ renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@@ -0,0 +1,7 @@
1
+ CHANGES
2
+ =======
3
+
4
+ v0.20250827.0
5
+ -------------
6
+
7
+ * chore(deps): update react monorepo to v19.1.12 (#1679)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: osism
3
- Version: 0.20250824.1
3
+ Version: 0.20250827.0
4
4
  Summary: OSISM manager interface
5
5
  Home-page: https://github.com/osism/python-osism
6
6
  Author: OSISM GmbH
@@ -25,7 +25,7 @@ Requires-Dist: ClusterShell==1.9.3
25
25
  Requires-Dist: GitPython==3.1.45
26
26
  Requires-Dist: Jinja2==3.1.6
27
27
  Requires-Dist: PyYAML==6.0.2
28
- Requires-Dist: ara==1.7.2
28
+ Requires-Dist: ara==1.7.3
29
29
  Requires-Dist: celery[redis]==5.5.3
30
30
  Requires-Dist: cliff==4.11.0
31
31
  Requires-Dist: deepdiff==8.6.0
@@ -43,7 +43,7 @@ Requires-Dist: nbcli==0.10.0.dev2
43
43
  Requires-Dist: openstacksdk==4.7.0
44
44
  Requires-Dist: paramiko==3.5.1
45
45
  Requires-Dist: pottery==3.0.1
46
- Requires-Dist: prompt-toolkit==3.0.51
46
+ Requires-Dist: prompt-toolkit==3.0.52
47
47
  Requires-Dist: pynetbox==7.5.0
48
48
  Requires-Dist: pytest-testinfra==10.2.2
49
49
  Requires-Dist: python-dateutil==2.9.0.post0
@@ -58,9 +58,9 @@ Requires-Dist: watchdog==6.0.0
58
58
  Requires-Dist: websockets==15.0.1
59
59
  Provides-Extra: ansible
60
60
  Requires-Dist: ansible-runner==2.4.1; extra == "ansible"
61
- Requires-Dist: ansible-core==2.19.0; extra == "ansible"
61
+ Requires-Dist: ansible-core==2.19.1; extra == "ansible"
62
62
  Provides-Extra: openstack-image-manager
63
- Requires-Dist: openstack-image-manager==0.20250508.0; extra == "openstack-image-manager"
63
+ Requires-Dist: openstack-image-manager==0.20250827.0; extra == "openstack-image-manager"
64
64
  Dynamic: author
65
65
  Dynamic: author-email
66
66
  Dynamic: classifier
@@ -9,7 +9,7 @@ GitPython = "==3.1.45"
9
9
  Jinja2 = "==3.1.6"
10
10
  PyYAML = "==6.0.2"
11
11
  ansible-runner = "==2.4.1"
12
- ara = "==1.7.2"
12
+ ara = "==1.7.3"
13
13
  celery = {version = "==5.5.3", extras = ["redis"]}
14
14
  cliff = "==4.11.0"
15
15
  deepdiff = "==8.6.0"
@@ -27,7 +27,7 @@ nbcli = "0.10.0.dev2"
27
27
  openstacksdk = "==4.7.0"
28
28
  paramiko = "==3.5.1"
29
29
  pottery = "==3.0.1"
30
- prompt-toolkit = "==3.0.51"
30
+ prompt-toolkit = "==3.0.52"
31
31
  pynetbox = "==7.5.0"
32
32
  pytest-testinfra = "==10.2.2"
33
33
  python-dateutil = "==2.9.0.post0"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_meta": {
3
3
  "hash": {
4
- "sha256": "4c34cf1f6bf5207a88d018741cd390e32f35b593e6b0916656241df19ab793be"
4
+ "sha256": "c797a785299708bfb3a6fb132a0f452ac0c6f9d41a509b7c888abfe0132ab586"
5
5
  },
6
6
  "pipfile-spec": 6,
7
7
  "requires": {},
@@ -41,12 +41,12 @@
41
41
  },
42
42
  "ara": {
43
43
  "hashes": [
44
- "sha256:16d4f5cee550c23efda83d3e1fa9b48a67af3db37741c14a9e99dc4c2cefc7c8",
45
- "sha256:18f0e98c2d8d0913e5a3df6cd166b7c0a856611ce675ec494bfbb957f78f264f"
44
+ "sha256:9147813977ea96b6625d0beafb84e5203b8481061f117e5a89bd8246286e18f4",
45
+ "sha256:f09b08d1f86fb4f622663551463289994a08f08a6aa2b5ca6e6486fbdf0f7041"
46
46
  ],
47
47
  "index": "pypi",
48
48
  "markers": "python_version >= '3.8'",
49
- "version": "==1.7.2"
49
+ "version": "==1.7.3"
50
50
  },
51
51
  "autopage": {
52
52
  "hashes": [
@@ -673,11 +673,11 @@
673
673
  },
674
674
  "humanize": {
675
675
  "hashes": [
676
- "sha256:2cbf6370af06568fa6d2da77c86edb7886f3160ecd19ee1ffef07979efc597f6",
677
- "sha256:8430be3a615106fdfceb0b2c1b41c4c98c6b0fc5cc59663a5539b111dd325fb0"
676
+ "sha256:78f79e68f76f0b04d711c4e55d32bebef5be387148862cb1ef83d2b58e7935a0",
677
+ "sha256:b810820b31891813b1673e8fec7f1ed3312061eab2f26e3fa192c393d11ed25f"
678
678
  ],
679
679
  "markers": "python_version >= '3.9'",
680
- "version": "==4.12.3"
680
+ "version": "==4.13.0"
681
681
  },
682
682
  "idna": {
683
683
  "hashes": [
@@ -1077,11 +1077,11 @@
1077
1077
  },
1078
1078
  "platformdirs": {
1079
1079
  "hashes": [
1080
- "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc",
1081
- "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"
1080
+ "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85",
1081
+ "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"
1082
1082
  ],
1083
1083
  "markers": "python_version >= '3.9'",
1084
- "version": "==4.3.8"
1084
+ "version": "==4.4.0"
1085
1085
  },
1086
1086
  "pluggy": {
1087
1087
  "hashes": [
@@ -1124,12 +1124,12 @@
1124
1124
  },
1125
1125
  "prompt-toolkit": {
1126
1126
  "hashes": [
1127
- "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07",
1128
- "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"
1127
+ "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855",
1128
+ "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"
1129
1129
  ],
1130
1130
  "index": "pypi",
1131
1131
  "markers": "python_version >= '3.8'",
1132
- "version": "==3.0.51"
1132
+ "version": "==3.0.52"
1133
1133
  },
1134
1134
  "psutil": {
1135
1135
  "hashes": [
@@ -1644,11 +1644,11 @@
1644
1644
  },
1645
1645
  "stevedore": {
1646
1646
  "hashes": [
1647
- "sha256:3135b5ae50fe12816ef291baff420acb727fcd356106e3e9cbfa9e5985cd6f4b",
1648
- "sha256:d10a31c7b86cba16c1f6e8d15416955fc797052351a56af15e608ad20811fcfe"
1647
+ "sha256:18363d4d268181e8e8452e71a38cd77630f345b2ef6b4a8d5614dac5ee0d18cf",
1648
+ "sha256:d31496a4f4df9825e1a1e4f1f74d19abb0154aff311c3b376fcc89dae8fccd73"
1649
1649
  ],
1650
1650
  "markers": "python_version >= '3.9'",
1651
- "version": "==5.4.1"
1651
+ "version": "==5.5.0"
1652
1652
  },
1653
1653
  "sushy": {
1654
1654
  "hashes": [
@@ -1687,11 +1687,11 @@
1687
1687
  },
1688
1688
  "typing-extensions": {
1689
1689
  "hashes": [
1690
- "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36",
1691
- "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"
1690
+ "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466",
1691
+ "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"
1692
1692
  ],
1693
1693
  "markers": "python_version >= '3.9'",
1694
- "version": "==4.14.1"
1694
+ "version": "==4.15.0"
1695
1695
  },
1696
1696
  "typing-inspection": {
1697
1697
  "hashes": [
@@ -0,0 +1,274 @@
1
+ ---
2
+ reference:
3
+ - field: name
4
+ mandatory_prefix: SCS-
5
+ - field: cpus
6
+ - field: ram
7
+ - field: disk
8
+ - field: public
9
+ default: true
10
+ - field: disabled
11
+ default: false
12
+
13
+ mandatory:
14
+ - name: SCS-1L-1
15
+ cpus: 1
16
+ ram: 1024
17
+ disk: 0
18
+ scs:cpu-type: crowded-core
19
+ scs:disk0-type: network
20
+ scs:name-v1: SCS-1L:1
21
+ scs:name-v2: SCS-1L-1
22
+ hw_rng:allowed: "true"
23
+ - name: SCS-1L-1-5
24
+ cpus: 1
25
+ ram: 1024
26
+ disk: 5
27
+ scs:cpu-type: crowded-core
28
+ scs:disk0-type: network
29
+ scs:name-v1: SCS-1L:5
30
+ scs:name-v2: SCS-1L-5
31
+ hw_rng:allowed: "true"
32
+ - name: SCS-1V-2
33
+ cpus: 1
34
+ ram: 2048
35
+ disk: 0
36
+ scs:cpu-type: shared-core
37
+ scs:disk0-type: network
38
+ scs:name-v1: SCS-1V:2
39
+ scs:name-v2: SCS-1V-2
40
+ hw_rng:allowed: "true"
41
+ - name: SCS-1V-2-5
42
+ cpus: 1
43
+ ram: 2048
44
+ disk: 5
45
+ scs:cpu-type: shared-core
46
+ scs:disk0-type: network
47
+ scs:name-v1: SCS-1V:2:5
48
+ scs:name-v2: SCS-1V-2-5
49
+ hw_rng:allowed: "true"
50
+ - name: SCS-1V-4
51
+ cpus: 1
52
+ ram: 4096
53
+ disk: 0
54
+ scs:cpu-type: shared-core
55
+ scs:disk0-type: network
56
+ scs:name-v1: SCS-1V:4
57
+ scs:name-v2: SCS-1V-4
58
+ hw_rng:allowed: "true"
59
+ - name: SCS-1V-4-10
60
+ cpus: 1
61
+ ram: 4096
62
+ disk: 10
63
+ scs:cpu-type: shared-core
64
+ scs:disk0-type: network
65
+ scs:name-v1: SCS-1V:4:10
66
+ scs:name-v2: SCS-1V-4-10
67
+ hw_rng:allowed: "true"
68
+ - name: SCS-1V-8
69
+ cpus: 1
70
+ ram: 8192
71
+ disk: 0
72
+ scs:cpu-type: shared-core
73
+ scs:disk0-type: network
74
+ scs:name-v1: SCS-1V:8
75
+ scs:name-v2: SCS-1V-8
76
+ hw_rng:allowed: "true"
77
+ - name: SCS-1V-8-20
78
+ cpus: 1
79
+ ram: 8192
80
+ disk: 20
81
+ scs:cpu-type: shared-core
82
+ scs:disk0-type: network
83
+ scs:name-v1: SCS-1V:8:20
84
+ scs:name-v2: SCS-1V-8-20
85
+ hw_rng:allowed: "true"
86
+ - name: SCS-2V-4
87
+ cpus: 2
88
+ ram: 4096
89
+ disk: 0
90
+ scs:cpu-type: shared-core
91
+ scs:disk0-type: network
92
+ scs:name-v1: SCS-2V:4
93
+ scs:name-v2: SCS-2V-4
94
+ hw_rng:allowed: "true"
95
+ - name: SCS-2V-4-10
96
+ cpus: 2
97
+ ram: 4096
98
+ disk: 10
99
+ scs:cpu-type: shared-core
100
+ scs:disk0-type: network
101
+ scs:name-v1: SCS-2V:4:10
102
+ scs:name-v2: SCS-2V-4-10
103
+ hw_rng:allowed: "true"
104
+ - name: SCS-2V-8
105
+ cpus: 2
106
+ ram: 8192
107
+ disk: 0
108
+ scs:cpu-type: shared-core
109
+ scs:disk0-type: network
110
+ scs:name-v1: SCS-2V:8
111
+ scs:name-v2: SCS-2V-8
112
+ hw_rng:allowed: "true"
113
+ - name: SCS-2V-8-20
114
+ cpus: 2
115
+ ram: 8192
116
+ disk: 20
117
+ scs:cpu-type: shared-core
118
+ scs:disk0-type: network
119
+ scs:name-v1: SCS-2V:8:20
120
+ scs:name-v2: SCS-2V-8-20
121
+ hw_rng:allowed: "true"
122
+ - name: SCS-2V-16
123
+ cpus: 2
124
+ ram: 16384
125
+ disk: 0
126
+ scs:cpu-type: shared-core
127
+ scs:disk0-type: network
128
+ scs:name-v1: SCS-2V:16
129
+ scs:name-v2: SCS-2V-16
130
+ hw_rng:allowed: "true"
131
+ - name: SCS-2V-16-50
132
+ cpus: 2
133
+ ram: 16384
134
+ disk: 50
135
+ scs:cpu-type: shared-core
136
+ scs:disk0-type: network
137
+ scs:name-v1: SCS-2V:16:50
138
+ scs:name-v2: SCS-2V-16-50
139
+ hw_rng:allowed: "true"
140
+ - name: SCS-4V-8
141
+ cpus: 4
142
+ ram: 8192
143
+ disk: 0
144
+ scs:cpu-type: shared-core
145
+ scs:disk0-type: network
146
+ scs:name-v1: SCS-4V:8
147
+ scs:name-v2: SCS-4V-8
148
+ hw_rng:allowed: "true"
149
+ - name: SCS-4V-8-20
150
+ cpus: 4
151
+ ram: 8192
152
+ disk: 20
153
+ scs:cpu-type: shared-core
154
+ scs:disk0-type: network
155
+ scs:name-v1: SCS-4V:8:20
156
+ scs:name-v2: SCS-4V-8-20
157
+ hw_rng:allowed: "true"
158
+ - name: SCS-4V-16
159
+ cpus: 4
160
+ ram: 16384
161
+ disk: 0
162
+ scs:cpu-type: shared-core
163
+ scs:disk0-type: network
164
+ scs:name-v1: SCS-4V:16
165
+ scs:name-v2: SCS-4V-16
166
+ hw_rng:allowed: "true"
167
+ - name: SCS-4V-16-50
168
+ cpus: 4
169
+ ram: 16384
170
+ disk: 50
171
+ scs:cpu-type: shared-core
172
+ scs:disk0-type: network
173
+ scs:name-v1: SCS-4V:16:50
174
+ scs:name-v2: SCS-4V-16-50
175
+ hw_rng:allowed: "true"
176
+ - name: SCS-4V-32
177
+ cpus: 4
178
+ ram: 32768
179
+ disk: 0
180
+ scs:cpu-type: shared-core
181
+ scs:disk0-type: network
182
+ scs:name-v1: SCS-4V:32
183
+ scs:name-v2: SCS-4V-32
184
+ hw_rng:allowed: "true"
185
+ - name: SCS-4V-32-100
186
+ cpus: 4
187
+ ram: 32768
188
+ disk: 100
189
+ scs:cpu-type: shared-core
190
+ scs:disk0-type: network
191
+ scs:name-v1: SCS-4V:32:100
192
+ scs:name-v2: SCS-4V-32-100
193
+ hw_rng:allowed: "true"
194
+ - name: SCS-8V-16
195
+ cpus: 8
196
+ ram: 16384
197
+ disk: 0
198
+ scs:cpu-type: shared-core
199
+ scs:disk0-type: network
200
+ scs:name-v1: SCS-8V:16
201
+ scs:name-v2: SCS-8V-16
202
+ hw_rng:allowed: "true"
203
+ - name: SCS-8V-16-50
204
+ cpus: 8
205
+ ram: 16384
206
+ disk: 50
207
+ scs:cpu-type: shared-core
208
+ scs:disk0-type: network
209
+ scs:name-v1: SCS-8V:16:50
210
+ scs:name-v2: SCS-8V-16-50
211
+ hw_rng:allowed: "true"
212
+ - name: SCS-8V-32
213
+ cpus: 8
214
+ ram: 32768
215
+ disk: 0
216
+ scs:cpu-type: shared-core
217
+ scs:disk0-type: network
218
+ scs:name-v1: SCS-8V:32
219
+ scs:name-v2: SCS-8V-32
220
+ hw_rng:allowed: "true"
221
+ - name: SCS-8V-32-100
222
+ cpus: 8
223
+ ram: 32768
224
+ disk: 100
225
+ scs:cpu-type: shared-core
226
+ scs:disk0-type: network
227
+ scs:name-v1: SCS-8V:32:100
228
+ scs:name-v2: SCS-8V-32-100
229
+ hw_rng:allowed: "true"
230
+ - name: SCS-16V-32
231
+ cpus: 16
232
+ ram: 32768
233
+ disk: 0
234
+ scs:cpu-type: shared-core
235
+ scs:disk0-type: network
236
+ scs:name-v1: SCS-16V:32
237
+ scs:name-v2: SCS-16V-32
238
+ hw_rng:allowed: "true"
239
+ - name: SCS-16V-32-100
240
+ cpus: 16
241
+ ram: 32768
242
+ disk: 100
243
+ scs:cpu-type: shared-core
244
+ scs:disk0-type: network
245
+ scs:name-v1: SCS-16V:32:100
246
+ scs:name-v2: SCS-16V-32-100
247
+ hw_rng:allowed: "true"
248
+ - name: SCS-2V-4-20s
249
+ cpus: 2
250
+ ram: 4096
251
+ disk: 20
252
+ scs:cpu-type: shared-core
253
+ scs:disk0-type: ssd
254
+ scs:name-v1: SCS-2V:4:20s
255
+ scs:name-v2: SCS-2V-4-20s
256
+ hw_rng:allowed: "true"
257
+ - name: SCS-4V-8-50s
258
+ cpus: 4
259
+ ram: 8192
260
+ disk: 50
261
+ scs:cpu-type: shared-core
262
+ scs:disk0-type: ssd
263
+ scs:name-v1: SCS-4V:8:50s
264
+ scs:name-v2: SCS-4V-8-50s
265
+ hw_rng:allowed: "true"
266
+ - name: SCS-8V-32-100s
267
+ cpus: 8
268
+ ram: 32768
269
+ disk: 100
270
+ scs:cpu-type: shared-core
271
+ scs:disk0-type: ssd
272
+ scs:name-v1: SCS-8V:32:100s
273
+ scs:name-v2: SCS-8V-32-100s
274
+ hw_rng:allowed: "true"
@@ -218,7 +218,7 @@ export default function NodesPage() {
218
218
  </span>
219
219
  )}
220
220
  </div>
221
- <div className="flex items-center gap-2">
221
+ <div className="flex items-center justify-end gap-2">
222
222
  <span className={`px-2 inline-flex text-xs leading-5 font-semibold rounded-full ${
223
223
  node.power_state === "power on"
224
224
  ? "bg-green-100 text-green-800"
@@ -242,7 +242,7 @@ export default function NodesPage() {
242
242
  </div>
243
243
  </div>
244
244
  <div className="mt-2 grid grid-cols-1 gap-x-4 gap-y-2 sm:grid-cols-2 lg:grid-cols-4">
245
- <p className="flex items-center text-sm text-gray-500">
245
+ <p className="flex items-center text-sm text-gray-500 lg:col-span-2">
246
246
  UUID: {node.uuid}
247
247
  </p>
248
248
  {node.driver && (
@@ -251,12 +251,12 @@ export default function NodesPage() {
251
251
  </p>
252
252
  )}
253
253
  {node.created_at && (
254
- <p className="flex items-center text-sm text-gray-500">
254
+ <p className="flex items-center justify-end text-sm text-gray-500">
255
255
  Created: {new Date(node.created_at).toLocaleString()}
256
256
  </p>
257
257
  )}
258
258
  {node.updated_at && (
259
- <p className="flex items-center text-sm text-gray-500">
259
+ <p className="flex items-center justify-end text-sm text-gray-500 lg:col-start-4">
260
260
  Updated: {new Date(node.updated_at).toLocaleString()}
261
261
  </p>
262
262
  )}
@@ -1303,9 +1303,9 @@
1303
1303
  "license": "MIT"
1304
1304
  },
1305
1305
  "node_modules/@types/node": {
1306
- "version": "22.17.2",
1307
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.2.tgz",
1308
- "integrity": "sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==",
1306
+ "version": "22.18.0",
1307
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.0.tgz",
1308
+ "integrity": "sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==",
1309
1309
  "dev": true,
1310
1310
  "license": "MIT",
1311
1311
  "dependencies": {
@@ -1313,9 +1313,9 @@
1313
1313
  }
1314
1314
  },
1315
1315
  "node_modules/@types/react": {
1316
- "version": "19.1.11",
1317
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.11.tgz",
1318
- "integrity": "sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==",
1316
+ "version": "19.1.12",
1317
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz",
1318
+ "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==",
1319
1319
  "dev": true,
1320
1320
  "license": "MIT",
1321
1321
  "dependencies": {
@@ -1323,9 +1323,9 @@
1323
1323
  }
1324
1324
  },
1325
1325
  "node_modules/@types/react-dom": {
1326
- "version": "19.1.7",
1327
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz",
1328
- "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==",
1326
+ "version": "19.1.8",
1327
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.8.tgz",
1328
+ "integrity": "sha512-xG7xaBMJCpcK0RpN8jDbAACQo54ycO6h4dSSmgv8+fu6ZIAdANkx/WsawASUjVXYfy+J9AbUpRMNNEsXCDfDBQ==",
1329
1329
  "dev": true,
1330
1330
  "license": "MIT",
1331
1331
  "peerDependencies": {
@@ -9,6 +9,7 @@ from cliff.command import Command
9
9
  from loguru import logger
10
10
  from tabulate import tabulate
11
11
 
12
+ from osism import utils
12
13
  from osism.data import enums
13
14
  from osism.data.playbooks import MAP_ROLE2ENVIRONMENT, MAP_ROLE2RUNTIME
14
15
  from osism.tasks import ansible, ceph, kolla, kubernetes, handle_task
@@ -451,6 +452,9 @@ class Run(Command):
451
452
  return rc
452
453
 
453
454
  def take_action(self, parsed_args):
455
+ # Check if tasks are locked before proceeding
456
+ utils.check_task_lock_and_exit()
457
+
454
458
  action = parsed_args.action
455
459
  arguments = parsed_args.arguments
456
460
  environment = parsed_args.environment
@@ -5,6 +5,7 @@ import argparse
5
5
  from cliff.command import Command
6
6
  from loguru import logger
7
7
 
8
+ from osism import utils
8
9
  from osism.tasks import ansible, handle_task
9
10
 
10
11
 
@@ -17,6 +18,9 @@ class Sync(Command):
17
18
  return parser
18
19
 
19
20
  def take_action(self, parsed_args):
21
+ # Check if tasks are locked before proceeding
22
+ utils.check_task_lock_and_exit()
23
+
20
24
  arguments = parsed_args.arguments
21
25
 
22
26
  t = ansible.run.delay(
@@ -0,0 +1,91 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ from cliff.command import Command
4
+ from loguru import logger
5
+
6
+ from osism import utils
7
+
8
+
9
+ class Lock(Command):
10
+ """Lock task execution to prevent new tasks from starting"""
11
+
12
+ def get_parser(self, prog_name):
13
+ parser = super(Lock, self).get_parser(prog_name)
14
+ parser.add_argument(
15
+ "--user",
16
+ help="User name to associate with the lock (defaults to dragon)",
17
+ )
18
+ parser.add_argument("--reason", help="Reason for locking tasks")
19
+ return parser
20
+
21
+ def take_action(self, parsed_args):
22
+ user = parsed_args.user or "dragon"
23
+ reason = parsed_args.reason
24
+
25
+ # Check if already locked
26
+ lock_info = utils.is_task_locked()
27
+ if lock_info and lock_info.get("locked"):
28
+ existing_user = lock_info.get("user", "unknown")
29
+ existing_timestamp = lock_info.get("timestamp", "unknown")
30
+ existing_reason = lock_info.get("reason")
31
+ logger.warning(
32
+ f"Tasks are already locked by {existing_user} at {existing_timestamp}"
33
+ )
34
+ if existing_reason:
35
+ logger.warning(f"Existing reason: {existing_reason}")
36
+ return
37
+
38
+ # Set the lock
39
+ if utils.set_task_lock(user, reason):
40
+ logger.info(f"Tasks locked by {user}")
41
+ if reason:
42
+ logger.info(f"Reason: {reason}")
43
+ logger.info("New tasks will be prevented from starting")
44
+ logger.info("Running tasks will continue normally")
45
+ logger.info("Use 'osism unlock' to remove the lock")
46
+ else:
47
+ logger.error("Failed to set task lock")
48
+ return 1
49
+
50
+
51
+ class Unlock(Command):
52
+ """Unlock task execution to allow new tasks to start"""
53
+
54
+ def take_action(self, parsed_args):
55
+ # Check if currently locked
56
+ lock_info = utils.is_task_locked()
57
+ if not lock_info or not lock_info.get("locked"):
58
+ logger.info("Tasks are not currently locked")
59
+ return
60
+
61
+ existing_user = lock_info.get("user", "unknown")
62
+ existing_timestamp = lock_info.get("timestamp", "unknown")
63
+ existing_reason = lock_info.get("reason")
64
+
65
+ # Remove the lock
66
+ if utils.remove_task_lock():
67
+ logger.info(
68
+ f"Task lock removed (was set by {existing_user} at {existing_timestamp})"
69
+ )
70
+ if existing_reason:
71
+ logger.info(f"Previous reason: {existing_reason}")
72
+ logger.info("New tasks can now be started")
73
+ else:
74
+ logger.error("Failed to remove task lock")
75
+ return 1
76
+
77
+
78
+ class LockStatus(Command):
79
+ """Show current task lock status"""
80
+
81
+ def take_action(self, parsed_args):
82
+ lock_info = utils.is_task_locked()
83
+ if lock_info and lock_info.get("locked"):
84
+ user = lock_info.get("user", "unknown")
85
+ timestamp = lock_info.get("timestamp", "unknown")
86
+ reason = lock_info.get("reason")
87
+ logger.info(f"Tasks are LOCKED by {user} at {timestamp}")
88
+ if reason:
89
+ logger.info(f"Reason: {reason}")
90
+ else:
91
+ logger.info("Tasks are UNLOCKED")