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.
- osism-0.20250827.0/.github/renovate.json +15 -0
- osism-0.20250827.0/AUTHORS +1 -0
- osism-0.20250827.0/ChangeLog +7 -0
- {osism-0.20250824.1/osism.egg-info → osism-0.20250827.0}/PKG-INFO +5 -5
- {osism-0.20250824.1 → osism-0.20250827.0}/Pipfile +2 -2
- {osism-0.20250824.1 → osism-0.20250827.0}/Pipfile.lock +19 -19
- osism-0.20250827.0/files/data/flavors.yaml +274 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/nodes/page.tsx +4 -4
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/package-lock.json +9 -9
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/apply.py +4 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/configuration.py +4 -0
- osism-0.20250827.0/osism/commands/lock.py +91 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/manage.py +132 -6
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/netbox.py +12 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/noset.py +7 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/reconciler.py +3 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/redfish.py +4 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/service.py +4 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/set.py +7 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/sonic.py +3 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/sync.py +7 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/validate.py +3 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/worker.py +4 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/data/__init__.py +33 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/ansible.py +3 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/ceph.py +4 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/__init__.py +10 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/kolla.py +4 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/kubernetes.py +4 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/netbox.py +12 -0
- osism-0.20250827.0/osism/tasks/openstack.py +454 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/reconciler.py +3 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/utils/__init__.py +81 -0
- {osism-0.20250824.1 → osism-0.20250827.0/osism.egg-info}/PKG-INFO +5 -5
- {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/SOURCES.txt +2 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/entry_points.txt +4 -0
- osism-0.20250827.0/osism.egg-info/pbr.json +1 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/requires.txt +4 -4
- {osism-0.20250824.1 → osism-0.20250827.0}/requirements.ansible.txt +1 -1
- osism-0.20250827.0/requirements.netbox-manager.txt +1 -0
- osism-0.20250827.0/requirements.openstack-flavor-manager.txt +1 -0
- osism-0.20250827.0/requirements.openstack-image-manager.txt +1 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/requirements.txt +2 -2
- {osism-0.20250824.1 → osism-0.20250827.0}/setup.cfg +4 -0
- osism-0.20250824.1/.github/renovate.json +0 -15
- osism-0.20250824.1/AUTHORS +0 -1
- osism-0.20250824.1/ChangeLog +0 -7
- osism-0.20250824.1/osism/tasks/openstack.py +0 -227
- osism-0.20250824.1/osism.egg-info/pbr.json +0 -1
- osism-0.20250824.1/requirements.netbox-manager.txt +0 -1
- osism-0.20250824.1/requirements.openstack-flavor-manager.txt +0 -1
- osism-0.20250824.1/requirements.openstack-image-manager.txt +0 -1
- {osism-0.20250824.1 → osism-0.20250827.0}/.flake8 +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/.github/workflows/publish.yml +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/.hadolint.yaml +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/.zuul.yaml +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/Containerfile +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/Dockerfile +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/LICENSE +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/README.md +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/change.sh +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/cleanup-ansible-collections.sh +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/clustershell/clush.conf +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/clustershell/groups.conf +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/data/SCS-Spec.MandatoryFlavors.verbose.yaml +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/netbox-manager/settings.toml +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/redfishMockupCreate.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/run-ansible-console.sh +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/config_db.json +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS4625-54T.ini +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS5835-54T.ini +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS5835-54X.ini +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS7326-56X.ini +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS7726-32X.ini +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/files/sonic/port_config/Accton-AS9716-32D.ini +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/.dockerignore +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/.gitignore +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/Containerfile +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/Dockerfile +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/api/config/route.ts +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/api/health/route.ts +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/components/ConnectionStatus.tsx +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/components/EventsFilters.tsx +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/components/EventsList.tsx +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/events/page.tsx +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/favicon.ico +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/globals.css +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/layout.tsx +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/page.tsx +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/app/services/page.tsx +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/components.json +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/eslint.config.mjs +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/lib/api.ts +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/lib/hooks/useWebSocket.ts +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/lib/types.ts +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/lib/utils.ts +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/next.config.ts +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/package.json +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/postcss.config.mjs +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/public/file.svg +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/public/globe.svg +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/public/next.svg +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/public/vercel.svg +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/public/window.svg +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/tailwind.config.ts +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/frontend/tsconfig.json +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/__init__.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/__main__.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/api.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/__init__.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/baremetal.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/compose.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/compute.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/console.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/container.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/get.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/log.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/server.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/status.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/task.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/vault.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/volume.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/commands/wait.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/data/enums.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/data/playbooks.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/main.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/services/__init__.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/services/event_bridge.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/services/listener.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/services/websocket_manager.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/settings.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/__init__.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/config.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/ironic.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/netbox.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/redfish.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/__init__.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/bgp.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/cache.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/config_generator.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/connections.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/constants.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/device.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/exporter.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/interface.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/sonic/sync.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor/utils.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/tasks/conductor.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism/utils/ssh.py +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/dependency_links.txt +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/not-zip-safe +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/osism.egg-info/top_level.txt +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/playbooks/build.yml +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/playbooks/pre.yml +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/playbooks/test-setup.yml +0 -0
- {osism-0.20250824.1 → osism-0.20250827.0}/requirements.yml +0 -0
- {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>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: osism
|
3
|
-
Version: 0.
|
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.
|
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.
|
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.
|
61
|
+
Requires-Dist: ansible-core==2.19.1; extra == "ansible"
|
62
62
|
Provides-Extra: openstack-image-manager
|
63
|
-
Requires-Dist: openstack-image-manager==0.
|
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.
|
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.
|
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": "
|
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:
|
45
|
-
"sha256:
|
44
|
+
"sha256:9147813977ea96b6625d0beafb84e5203b8481061f117e5a89bd8246286e18f4",
|
45
|
+
"sha256:f09b08d1f86fb4f622663551463289994a08f08a6aa2b5ca6e6486fbdf0f7041"
|
46
46
|
],
|
47
47
|
"index": "pypi",
|
48
48
|
"markers": "python_version >= '3.8'",
|
49
|
-
"version": "==1.7.
|
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:
|
677
|
-
"sha256:
|
676
|
+
"sha256:78f79e68f76f0b04d711c4e55d32bebef5be387148862cb1ef83d2b58e7935a0",
|
677
|
+
"sha256:b810820b31891813b1673e8fec7f1ed3312061eab2f26e3fa192c393d11ed25f"
|
678
678
|
],
|
679
679
|
"markers": "python_version >= '3.9'",
|
680
|
-
"version": "==4.
|
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:
|
1081
|
-
"sha256:
|
1080
|
+
"sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85",
|
1081
|
+
"sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"
|
1082
1082
|
],
|
1083
1083
|
"markers": "python_version >= '3.9'",
|
1084
|
-
"version": "==4.
|
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:
|
1128
|
-
"sha256:
|
1127
|
+
"sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855",
|
1128
|
+
"sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"
|
1129
1129
|
],
|
1130
1130
|
"index": "pypi",
|
1131
1131
|
"markers": "python_version >= '3.8'",
|
1132
|
-
"version": "==3.0.
|
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:
|
1648
|
-
"sha256:
|
1647
|
+
"sha256:18363d4d268181e8e8452e71a38cd77630f345b2ef6b4a8d5614dac5ee0d18cf",
|
1648
|
+
"sha256:d31496a4f4df9825e1a1e4f1f74d19abb0154aff311c3b376fcc89dae8fccd73"
|
1649
1649
|
],
|
1650
1650
|
"markers": "python_version >= '3.9'",
|
1651
|
-
"version": "==5.
|
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:
|
1691
|
-
"sha256:
|
1690
|
+
"sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466",
|
1691
|
+
"sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"
|
1692
1692
|
],
|
1693
1693
|
"markers": "python_version >= '3.9'",
|
1694
|
-
"version": "==4.
|
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.
|
1307
|
-
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.
|
1308
|
-
"integrity": "sha512-
|
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.
|
1317
|
-
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.
|
1318
|
-
"integrity": "sha512-
|
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.
|
1327
|
-
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.
|
1328
|
-
"integrity": "sha512-
|
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")
|