osism 0.20250530.0__tar.gz → 0.20250605.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.20250605.0/AUTHORS +1 -0
- osism-0.20250605.0/ChangeLog +7 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/Containerfile +1 -1
- {osism-0.20250530.0 → osism-0.20250605.0}/Dockerfile +1 -1
- {osism-0.20250530.0/osism.egg-info → osism-0.20250605.0}/PKG-INFO +5 -5
- {osism-0.20250530.0 → osism-0.20250605.0}/Pipfile +3 -3
- {osism-0.20250530.0 → osism-0.20250605.0}/Pipfile.lock +35 -40
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/apply.py +1 -1
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/baremetal.py +36 -30
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/reconciler.py +2 -1
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/vault.py +9 -1
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/core/enums.py +1 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/tasks/__init__.py +2 -0
- osism-0.20250605.0/osism/tasks/conductor/__init__.py +54 -0
- osism-0.20250605.0/osism/tasks/conductor/config.py +92 -0
- osism-0.20250530.0/osism/tasks/conductor.py → osism-0.20250605.0/osism/tasks/conductor/ironic.py +66 -215
- osism-0.20250605.0/osism/tasks/conductor/netbox.py +50 -0
- osism-0.20250605.0/osism/tasks/conductor/utils.py +79 -0
- osism-0.20250605.0/osism/tasks/conductor.py +15 -0
- {osism-0.20250530.0 → osism-0.20250605.0/osism.egg-info}/PKG-INFO +5 -5
- {osism-0.20250530.0 → osism-0.20250605.0}/osism.egg-info/SOURCES.txt +5 -0
- osism-0.20250605.0/osism.egg-info/pbr.json +1 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism.egg-info/requires.txt +4 -4
- {osism-0.20250530.0 → osism-0.20250605.0}/requirements.txt +4 -4
- osism-0.20250530.0/AUTHORS +0 -1
- osism-0.20250530.0/ChangeLog +0 -7
- osism-0.20250530.0/osism.egg-info/pbr.json +0 -1
- {osism-0.20250530.0 → osism-0.20250605.0}/.flake8 +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/.github/renovate.json +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/.github/workflows/publish.yml +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/.hadolint.yaml +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/.zuul.yaml +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/LICENSE +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/README.md +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/files/change.sh +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/files/cleanup-ansible-collections.sh +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/files/clustershell/clush.conf +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/files/clustershell/groups.conf +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/files/data/SCS-Spec.MandatoryFlavors.verbose.yaml +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/files/netbox-manager/settings.toml +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/files/run-ansible-console.sh +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/__init__.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/__main__.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/actions/__init__.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/api.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/__init__.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/compose.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/compute.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/configuration.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/console.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/container.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/get.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/log.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/manage.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/netbox.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/noset.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/server.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/service.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/set.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/status.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/sync.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/task.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/validate.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/volume.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/wait.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/commands/worker.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/core/__init__.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/core/playbooks.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/data/__init__.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/main.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/plugins/__init__.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/services/__init__.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/services/listener.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/settings.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/tasks/ansible.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/tasks/ceph.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/tasks/kolla.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/tasks/kubernetes.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/tasks/netbox.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/tasks/openstack.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/tasks/reconciler.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism/utils/__init__.py +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism.egg-info/dependency_links.txt +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism.egg-info/entry_points.txt +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism.egg-info/not-zip-safe +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/osism.egg-info/top_level.txt +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/playbooks/build.yml +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/playbooks/pre.yml +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/playbooks/test-setup.yml +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/requirements.ansible.txt +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/requirements.netbox-manager.txt +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/requirements.openstack-flavor-manager.txt +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/requirements.openstack-image-manager.txt +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/requirements.yml +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/setup.cfg +0 -0
- {osism-0.20250530.0 → osism-0.20250605.0}/setup.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
Christian Berendt <berendt@osism.tech>
|
@@ -7,7 +7,7 @@ FROM ${IMAGE}:${PYTHON_VERSION}-alpine${ALPINE_VERSION}
|
|
7
7
|
ENV PYTHONWARNINGS="ignore::UserWarning"
|
8
8
|
|
9
9
|
COPY . /src
|
10
|
-
COPY --from=ghcr.io/astral-sh/uv:0.7.
|
10
|
+
COPY --from=ghcr.io/astral-sh/uv:0.7.11 /uv /usr/local/bin/uv
|
11
11
|
|
12
12
|
COPY files/data /data
|
13
13
|
COPY files/change.sh /change.sh
|
@@ -7,7 +7,7 @@ FROM ${IMAGE}:${PYTHON_VERSION}-alpine${ALPINE_VERSION}
|
|
7
7
|
ENV PYTHONWARNINGS="ignore::UserWarning"
|
8
8
|
|
9
9
|
COPY . /src
|
10
|
-
COPY --from=ghcr.io/astral-sh/uv:0.7.
|
10
|
+
COPY --from=ghcr.io/astral-sh/uv:0.7.11 /uv /usr/local/bin/uv
|
11
11
|
|
12
12
|
COPY files/data /data
|
13
13
|
COPY files/change.sh /change.sh
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: osism
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.20250605.0
|
4
4
|
Summary: OSISM manager interface
|
5
5
|
Home-page: https://github.com/osism/python-osism
|
6
6
|
Author: OSISM GmbH
|
@@ -26,7 +26,7 @@ Requires-Dist: GitPython==3.1.44
|
|
26
26
|
Requires-Dist: Jinja2==3.1.6
|
27
27
|
Requires-Dist: PyYAML==6.0.2
|
28
28
|
Requires-Dist: ara==1.7.2
|
29
|
-
Requires-Dist: celery[redis]==5.5.
|
29
|
+
Requires-Dist: celery[redis]==5.5.3
|
30
30
|
Requires-Dist: cliff==4.10.0
|
31
31
|
Requires-Dist: deepdiff==8.5.0
|
32
32
|
Requires-Dist: docker==7.1.0
|
@@ -36,12 +36,12 @@ Requires-Dist: flower==2.0.1
|
|
36
36
|
Requires-Dist: hiredis==3.2.1
|
37
37
|
Requires-Dist: jc==1.25.5
|
38
38
|
Requires-Dist: keystoneauth1==5.11.0
|
39
|
-
Requires-Dist: kombu==5.5.
|
39
|
+
Requires-Dist: kombu==5.5.4
|
40
40
|
Requires-Dist: kubernetes==32.0.1
|
41
41
|
Requires-Dist: loguru==0.7.3
|
42
42
|
Requires-Dist: nbcli==0.10.0.dev2
|
43
43
|
Requires-Dist: netmiko==4.5.0
|
44
|
-
Requires-Dist: openstacksdk==4.
|
44
|
+
Requires-Dist: openstacksdk==4.6.0
|
45
45
|
Requires-Dist: pottery==3.0.1
|
46
46
|
Requires-Dist: prompt-toolkit==3.0.51
|
47
47
|
Requires-Dist: pynetbox==7.5.0
|
@@ -52,7 +52,7 @@ Requires-Dist: sqlmodel==0.0.24
|
|
52
52
|
Requires-Dist: sushy==5.6.0
|
53
53
|
Requires-Dist: tabulate==0.9.0
|
54
54
|
Requires-Dist: transitions==0.9.2
|
55
|
-
Requires-Dist: uvicorn[standard]==0.34.
|
55
|
+
Requires-Dist: uvicorn[standard]==0.34.3
|
56
56
|
Requires-Dist: watchdog==6.0.0
|
57
57
|
Provides-Extra: ansible
|
58
58
|
Requires-Dist: ansible-runner==2.4.1; extra == "ansible"
|
@@ -10,7 +10,7 @@ Jinja2 = "==3.1.6"
|
|
10
10
|
PyYAML = "==6.0.2"
|
11
11
|
ansible-runner = "==2.4.1"
|
12
12
|
ara = "==1.7.2"
|
13
|
-
celery = {version = "==5.5.
|
13
|
+
celery = {version = "==5.5.3", extras = ["redis"]}
|
14
14
|
cliff = "==4.10.0"
|
15
15
|
deepdiff = "==8.5.0"
|
16
16
|
docker = "==7.1.0"
|
@@ -20,12 +20,12 @@ hiredis = "==3.2.1"
|
|
20
20
|
huey = "==2.5.3"
|
21
21
|
jc = "==1.25.5"
|
22
22
|
keystoneauth1 = "==5.11.0"
|
23
|
-
kombu = "==5.5.
|
23
|
+
kombu = "==5.5.4"
|
24
24
|
kubernetes = "==32.0.1"
|
25
25
|
loguru = "==0.7.3"
|
26
26
|
nbcli = "0.10.0.dev2"
|
27
27
|
netmiko = "==4.5.0"
|
28
|
-
openstacksdk = "==4.
|
28
|
+
openstacksdk = "==4.6.0"
|
29
29
|
pottery = "==3.0.1"
|
30
30
|
prompt-toolkit = "==3.0.51"
|
31
31
|
pynetbox = "==7.5.0"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"_meta": {
|
3
3
|
"hash": {
|
4
|
-
"sha256": "
|
4
|
+
"sha256": "2c0211f42b6765854a69f4900797638c04652c2852298fb20cf1ec26ae0fdf5e"
|
5
5
|
},
|
6
6
|
"pipfile-spec": 6,
|
7
7
|
"requires": {},
|
@@ -134,11 +134,11 @@
|
|
134
134
|
"redis"
|
135
135
|
],
|
136
136
|
"hashes": [
|
137
|
-
"sha256:
|
138
|
-
"sha256:
|
137
|
+
"sha256:0b5761a07057acee94694464ca482416b959568904c9dfa41ce8413a7d65d525",
|
138
|
+
"sha256:6c972ae7968c2b5281227f01c3a3f984037d21c5129d07bf3550cc2afc6b10a5"
|
139
139
|
],
|
140
140
|
"markers": "python_version >= '3.8'",
|
141
|
-
"version": "==5.5.
|
141
|
+
"version": "==5.5.3"
|
142
142
|
},
|
143
143
|
"certifi": {
|
144
144
|
"hashes": [
|
@@ -368,11 +368,11 @@
|
|
368
368
|
},
|
369
369
|
"cmd2": {
|
370
370
|
"hashes": [
|
371
|
-
"sha256:
|
372
|
-
"sha256:
|
371
|
+
"sha256:832f8121c4f21ebf2af4292051b34579d7d4c9e917dc54f8e322feb911d76da1",
|
372
|
+
"sha256:8cffaba7810526421cab3bfa0101b4907e1298ff2bcd8119615965a2eae5d95f"
|
373
373
|
],
|
374
|
-
"markers": "python_version >= '3.
|
375
|
-
"version": "==2.
|
374
|
+
"markers": "python_version >= '3.9'",
|
375
|
+
"version": "==2.6.0"
|
376
376
|
},
|
377
377
|
"cryptography": {
|
378
378
|
"hashes": [
|
@@ -777,13 +777,16 @@
|
|
777
777
|
"version": "==5.11.0"
|
778
778
|
},
|
779
779
|
"kombu": {
|
780
|
+
"extras": [
|
781
|
+
"redis"
|
782
|
+
],
|
780
783
|
"hashes": [
|
781
|
-
"sha256:
|
782
|
-
"sha256:
|
784
|
+
"sha256:886600168275ebeada93b888e831352fe578168342f0d1d5833d88ba0d847363",
|
785
|
+
"sha256:a12ed0557c238897d8e518f1d1fdf84bd1516c5e305af2dacd85c2015115feb8"
|
783
786
|
],
|
784
787
|
"index": "pypi",
|
785
788
|
"markers": "python_version >= '3.8'",
|
786
|
-
"version": "==5.5.
|
789
|
+
"version": "==5.5.4"
|
787
790
|
},
|
788
791
|
"kubernetes": {
|
789
792
|
"hashes": [
|
@@ -1016,12 +1019,12 @@
|
|
1016
1019
|
},
|
1017
1020
|
"openstacksdk": {
|
1018
1021
|
"hashes": [
|
1019
|
-
"sha256:
|
1020
|
-
"sha256:
|
1022
|
+
"sha256:0ea54ce3005d48c5134f77dce8df7dd6b4c52d2a103472abc99db19cd4382638",
|
1023
|
+
"sha256:e47e166c4732e9aea65228e618d490e4be5df06526a1b95e2d5995d7d0977d3d"
|
1021
1024
|
],
|
1022
1025
|
"index": "pypi",
|
1023
|
-
"markers": "python_version >= '3.
|
1024
|
-
"version": "==4.
|
1026
|
+
"markers": "python_version >= '3.10'",
|
1027
|
+
"version": "==4.6.0"
|
1025
1028
|
},
|
1026
1029
|
"orderly-set": {
|
1027
1030
|
"hashes": [
|
@@ -1110,11 +1113,11 @@
|
|
1110
1113
|
},
|
1111
1114
|
"prometheus-client": {
|
1112
1115
|
"hashes": [
|
1113
|
-
"sha256:
|
1114
|
-
"sha256:
|
1116
|
+
"sha256:190f1331e783cf21eb60bca559354e0a4d4378facecf78f5428c39b675d20d28",
|
1117
|
+
"sha256:cca895342e308174341b2cbf99a56bef291fbc0ef7b9e5412a0f26d653ba7094"
|
1115
1118
|
],
|
1116
1119
|
"markers": "python_version >= '3.9'",
|
1117
|
-
"version": "==0.22.
|
1120
|
+
"version": "==0.22.1"
|
1118
1121
|
},
|
1119
1122
|
"prompt-toolkit": {
|
1120
1123
|
"hashes": [
|
@@ -1293,14 +1296,6 @@
|
|
1293
1296
|
"markers": "python_version >= '3.8'",
|
1294
1297
|
"version": "==2.19.1"
|
1295
1298
|
},
|
1296
|
-
"pyjwt": {
|
1297
|
-
"hashes": [
|
1298
|
-
"sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850",
|
1299
|
-
"sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"
|
1300
|
-
],
|
1301
|
-
"markers": "python_version >= '3.8'",
|
1302
|
-
"version": "==2.9.0"
|
1303
|
-
},
|
1304
1299
|
"pynacl": {
|
1305
1300
|
"hashes": [
|
1306
1301
|
"sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858",
|
@@ -1340,11 +1335,11 @@
|
|
1340
1335
|
},
|
1341
1336
|
"pytest": {
|
1342
1337
|
"hashes": [
|
1343
|
-
"sha256:
|
1344
|
-
"sha256:
|
1338
|
+
"sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6",
|
1339
|
+
"sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e"
|
1345
1340
|
],
|
1346
|
-
"markers": "python_version >= '3.
|
1347
|
-
"version": "==8.
|
1341
|
+
"markers": "python_version >= '3.9'",
|
1342
|
+
"version": "==8.4.0"
|
1348
1343
|
},
|
1349
1344
|
"pytest-testinfra": {
|
1350
1345
|
"hashes": [
|
@@ -1441,11 +1436,11 @@
|
|
1441
1436
|
},
|
1442
1437
|
"redis": {
|
1443
1438
|
"hashes": [
|
1444
|
-
"sha256:
|
1445
|
-
"sha256:
|
1439
|
+
"sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f",
|
1440
|
+
"sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"
|
1446
1441
|
],
|
1447
1442
|
"markers": "python_version >= '3.8'",
|
1448
|
-
"version": "==5.
|
1443
|
+
"version": "==5.2.1"
|
1449
1444
|
},
|
1450
1445
|
"requests": {
|
1451
1446
|
"hashes": [
|
@@ -1488,11 +1483,11 @@
|
|
1488
1483
|
},
|
1489
1484
|
"ruamel.yaml": {
|
1490
1485
|
"hashes": [
|
1491
|
-
"sha256:
|
1492
|
-
"sha256:
|
1486
|
+
"sha256:5a38fd5ce39d223bebb9e3a6779e86b9427a03fb0bf9f270060f8b149cffe5e2",
|
1487
|
+
"sha256:790ba4c48b6a6e6b12b532a7308779eb12d2aaab3a80fdb8389216f28ea2b287"
|
1493
1488
|
],
|
1494
1489
|
"markers": "python_version >= '3.7'",
|
1495
|
-
"version": "==0.18.
|
1490
|
+
"version": "==0.18.12"
|
1496
1491
|
},
|
1497
1492
|
"ruamel.yaml.clib": {
|
1498
1493
|
"hashes": [
|
@@ -1702,11 +1697,11 @@
|
|
1702
1697
|
},
|
1703
1698
|
"typing-extensions": {
|
1704
1699
|
"hashes": [
|
1705
|
-
"sha256:
|
1706
|
-
"sha256:
|
1700
|
+
"sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4",
|
1701
|
+
"sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af"
|
1707
1702
|
],
|
1708
|
-
"markers": "python_version >= '3.
|
1709
|
-
"version": "==4.
|
1703
|
+
"markers": "python_version >= '3.9'",
|
1704
|
+
"version": "==4.14.0"
|
1710
1705
|
},
|
1711
1706
|
"typing-inspection": {
|
1712
1707
|
"hashes": [
|
@@ -70,19 +70,18 @@ class BaremetalDeploy(Command):
|
|
70
70
|
def get_parser(self, prog_name):
|
71
71
|
parser = super(BaremetalDeploy, self).get_parser(prog_name)
|
72
72
|
|
73
|
-
|
74
|
-
|
73
|
+
parser.add_argument(
|
74
|
+
"name",
|
75
|
+
nargs="?",
|
76
|
+
type=str,
|
77
|
+
help="Deploy given baremetal node when in provision state available",
|
78
|
+
)
|
79
|
+
parser.add_argument(
|
75
80
|
"--all",
|
76
81
|
default=False,
|
77
82
|
help="Deploy all baremetal nodes in provision state available",
|
78
83
|
action="store_true",
|
79
84
|
)
|
80
|
-
parser_exc_group.add_argument(
|
81
|
-
"--name",
|
82
|
-
default=[],
|
83
|
-
help="Deploy given baremetal node when in provision state available. May be specified multiple times",
|
84
|
-
action="append",
|
85
|
-
)
|
86
85
|
parser.add_argument(
|
87
86
|
"--rebuild",
|
88
87
|
default=False,
|
@@ -99,10 +98,14 @@ class BaremetalDeploy(Command):
|
|
99
98
|
|
100
99
|
def take_action(self, parsed_args):
|
101
100
|
all_nodes = parsed_args.all
|
102
|
-
|
101
|
+
name = parsed_args.name
|
103
102
|
rebuild = parsed_args.rebuild
|
104
103
|
yes_i_really_really_mean_it = parsed_args.yes_i_really_really_mean_it
|
105
104
|
|
105
|
+
if not all_nodes and not name:
|
106
|
+
logger.error("Please specify a node name or use --all")
|
107
|
+
return
|
108
|
+
|
106
109
|
if all_nodes and rebuild and not yes_i_really_really_mean_it:
|
107
110
|
logger.error(
|
108
111
|
"Please confirm that you wish to rebuild all nodes by specifying '--yes-i-really-really-mean-it'"
|
@@ -114,14 +117,14 @@ class BaremetalDeploy(Command):
|
|
114
117
|
if all_nodes:
|
115
118
|
deploy_nodes = list(conn.baremetal.nodes(details=True))
|
116
119
|
else:
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
120
|
+
node = conn.baremetal.find_node(name, ignore_missing=True, details=True)
|
121
|
+
if not node:
|
122
|
+
logger.warning(f"Could not find node {name}")
|
123
|
+
return
|
124
|
+
deploy_nodes = [node]
|
121
125
|
|
122
|
-
for
|
126
|
+
for node in deploy_nodes:
|
123
127
|
if not node:
|
124
|
-
logger.warning(f"Could not find node {names[node_idx]}")
|
125
128
|
continue
|
126
129
|
|
127
130
|
if node.provision_state in ["available", "deploy failed"]:
|
@@ -176,19 +179,18 @@ class BaremetalUndeploy(Command):
|
|
176
179
|
def get_parser(self, prog_name):
|
177
180
|
parser = super(BaremetalUndeploy, self).get_parser(prog_name)
|
178
181
|
|
179
|
-
|
180
|
-
|
182
|
+
parser.add_argument(
|
183
|
+
"name",
|
184
|
+
nargs="?",
|
185
|
+
type=str,
|
186
|
+
help="Undeploy given baremetal node",
|
187
|
+
)
|
188
|
+
parser.add_argument(
|
181
189
|
"--all",
|
182
190
|
default=False,
|
183
191
|
help="Undeploy all baremetal nodes",
|
184
192
|
action="store_true",
|
185
193
|
)
|
186
|
-
parser_exc_group.add_argument(
|
187
|
-
"--name",
|
188
|
-
default=[],
|
189
|
-
help="Undeploy given baremetal node. May be specified multiple times",
|
190
|
-
action="append",
|
191
|
-
)
|
192
194
|
parser.add_argument(
|
193
195
|
"--yes-i-really-really-mean-it",
|
194
196
|
default=False,
|
@@ -199,9 +201,13 @@ class BaremetalUndeploy(Command):
|
|
199
201
|
|
200
202
|
def take_action(self, parsed_args):
|
201
203
|
all_nodes = parsed_args.all
|
202
|
-
|
204
|
+
name = parsed_args.name
|
203
205
|
yes_i_really_really_mean_it = parsed_args.yes_i_really_really_mean_it
|
204
206
|
|
207
|
+
if not all_nodes and not name:
|
208
|
+
logger.error("Please specify a node name or use --all")
|
209
|
+
return
|
210
|
+
|
205
211
|
if all_nodes and not yes_i_really_really_mean_it:
|
206
212
|
logger.error(
|
207
213
|
"Please confirm that you wish to undeploy all nodes by specifying '--yes-i-really-really-mean-it'"
|
@@ -213,14 +219,14 @@ class BaremetalUndeploy(Command):
|
|
213
219
|
if all_nodes:
|
214
220
|
deploy_nodes = list(conn.baremetal.nodes())
|
215
221
|
else:
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
222
|
+
node = conn.baremetal.find_node(name, ignore_missing=True, details=False)
|
223
|
+
if not node:
|
224
|
+
logger.warning(f"Could not find node {name}")
|
225
|
+
return
|
226
|
+
deploy_nodes = [node]
|
220
227
|
|
221
|
-
for
|
228
|
+
for node in deploy_nodes:
|
222
229
|
if not node:
|
223
|
-
logger.warning(f"Could not find node {names[node_idx]}")
|
224
230
|
continue
|
225
231
|
|
226
232
|
if node.provision_state in ["active", "deploy failed", "error"]:
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# SPDX-License-Identifier: Apache-2.0
|
2
2
|
|
3
|
+
import os
|
3
4
|
import subprocess
|
4
5
|
import time
|
5
6
|
|
@@ -34,7 +35,7 @@ class Sync(Command):
|
|
34
35
|
)
|
35
36
|
parser.add_argument(
|
36
37
|
"--task-timeout",
|
37
|
-
default=
|
38
|
+
default=os.environ.get("OSISM_TASK_TIMEOUT", 300),
|
38
39
|
type=int,
|
39
40
|
help="Timeout for a scheduled task that has not been executed yet",
|
40
41
|
)
|
@@ -5,6 +5,7 @@
|
|
5
5
|
|
6
6
|
import os
|
7
7
|
import subprocess
|
8
|
+
import sys
|
8
9
|
|
9
10
|
from cliff.command import Command
|
10
11
|
from cryptography.fernet import Fernet
|
@@ -31,7 +32,14 @@ class SetPassword(Command):
|
|
31
32
|
|
32
33
|
f = Fernet(key)
|
33
34
|
|
34
|
-
|
35
|
+
# Check if password is being piped from STDIN
|
36
|
+
if not sys.stdin.isatty():
|
37
|
+
ansible_vault_password = sys.stdin.read().strip()
|
38
|
+
else:
|
39
|
+
ansible_vault_password = prompt(
|
40
|
+
"Ansible Vault password: ", is_password=True
|
41
|
+
)
|
42
|
+
|
35
43
|
redis.set(
|
36
44
|
"ansible_vault_password", f.encrypt(ansible_vault_password.encode("utf-8"))
|
37
45
|
)
|
@@ -102,6 +102,7 @@ VALIDATE_PLAYBOOKS = {
|
|
102
102
|
"ceph-osds": {"environment": "ceph", "runtime": "osism-ansible"},
|
103
103
|
"container-status": {"environment": "generic", "runtime": "osism-ansible"},
|
104
104
|
"kernel-version": {"environment": "generic", "runtime": "osism-ansible"},
|
105
|
+
"docker-version": {"environment": "generic", "runtime": "osism-ansible"},
|
105
106
|
"kolla-connectivity": {"environment": "kolla", "runtime": "osism-ansible"},
|
106
107
|
"mysql-open-files-limit": {"environment": "generic", "runtime": "osism-ansible"},
|
107
108
|
"ntp": {"environment": "generic", "runtime": "osism-ansible"},
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# SPDX-License-Identifier: Apache-2.0
|
2
2
|
|
3
|
+
import logging
|
3
4
|
import os
|
4
5
|
import re
|
5
6
|
import subprocess
|
@@ -77,6 +78,7 @@ def run_ansible_in_environment(
|
|
77
78
|
|
78
79
|
# NOTE: Consider arguments in the future
|
79
80
|
if locking:
|
81
|
+
logging.getLogger("redlock").setLevel(logging.WARNING)
|
80
82
|
lock = Redlock(
|
81
83
|
key=f"lock-ansible-{environment}-{role}",
|
82
84
|
masters={utils.redis},
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
2
|
+
|
3
|
+
import copy
|
4
|
+
from celery import Celery
|
5
|
+
from celery.signals import worker_process_init
|
6
|
+
from loguru import logger
|
7
|
+
|
8
|
+
from osism.tasks import Config
|
9
|
+
from osism.tasks.conductor.config import get_configuration
|
10
|
+
from osism.tasks.conductor.ironic import sync_ironic as _sync_ironic
|
11
|
+
|
12
|
+
|
13
|
+
# App configuration
|
14
|
+
app = Celery("conductor")
|
15
|
+
app.config_from_object(Config)
|
16
|
+
|
17
|
+
|
18
|
+
@worker_process_init.connect
|
19
|
+
def celery_init_worker(**kwargs):
|
20
|
+
pass
|
21
|
+
|
22
|
+
|
23
|
+
@app.on_after_configure.connect
|
24
|
+
def setup_periodic_tasks(sender, **kwargs):
|
25
|
+
pass
|
26
|
+
|
27
|
+
|
28
|
+
# Tasks
|
29
|
+
@app.task(bind=True, name="osism.tasks.conductor.get_ironic_parameters")
|
30
|
+
def get_ironic_parameters(self):
|
31
|
+
configuration = get_configuration()
|
32
|
+
if "ironic_parameters" in configuration:
|
33
|
+
# NOTE: Do not pass by reference, everybody gets their own copy to work with
|
34
|
+
return copy.deepcopy(configuration["ironic_parameters"])
|
35
|
+
|
36
|
+
return {}
|
37
|
+
|
38
|
+
|
39
|
+
@app.task(bind=True, name="osism.tasks.conductor.sync_netbox")
|
40
|
+
def sync_netbox(self, force_update=False):
|
41
|
+
logger.info("Not implemented")
|
42
|
+
|
43
|
+
|
44
|
+
@app.task(bind=True, name="osism.tasks.conductor.sync_ironic")
|
45
|
+
def sync_ironic(self, force_update=False):
|
46
|
+
_sync_ironic(get_ironic_parameters, force_update)
|
47
|
+
|
48
|
+
|
49
|
+
__all__ = [
|
50
|
+
"app",
|
51
|
+
"get_ironic_parameters",
|
52
|
+
"sync_netbox",
|
53
|
+
"sync_ironic",
|
54
|
+
]
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
2
|
+
|
3
|
+
import uuid
|
4
|
+
|
5
|
+
from loguru import logger
|
6
|
+
import yaml
|
7
|
+
|
8
|
+
from osism.tasks import Config, openstack
|
9
|
+
|
10
|
+
|
11
|
+
def is_uuid(value):
|
12
|
+
"""Check if a string is a valid UUID."""
|
13
|
+
try:
|
14
|
+
uuid.UUID(value)
|
15
|
+
return True
|
16
|
+
except (ValueError, AttributeError):
|
17
|
+
return False
|
18
|
+
|
19
|
+
|
20
|
+
def get_configuration():
|
21
|
+
with open("/etc/conductor.yml") as fp:
|
22
|
+
configuration = yaml.load(fp, Loader=yaml.SafeLoader)
|
23
|
+
|
24
|
+
if not configuration:
|
25
|
+
logger.warning(
|
26
|
+
"The conductor configuration is empty. That's probably wrong"
|
27
|
+
)
|
28
|
+
return {}
|
29
|
+
|
30
|
+
if Config.enable_ironic.lower() not in ["true", "yes"]:
|
31
|
+
return configuration
|
32
|
+
|
33
|
+
if "ironic_parameters" not in configuration:
|
34
|
+
logger.error("ironic_parameters not found in the conductor configuration")
|
35
|
+
return configuration
|
36
|
+
|
37
|
+
if "instance_info" in configuration["ironic_parameters"]:
|
38
|
+
if "image_source" in configuration["ironic_parameters"]["instance_info"]:
|
39
|
+
image_source = configuration["ironic_parameters"]["instance_info"][
|
40
|
+
"image_source"
|
41
|
+
]
|
42
|
+
if not is_uuid(image_source):
|
43
|
+
result = openstack.image_get(image_source)
|
44
|
+
configuration["ironic_parameters"]["instance_info"][
|
45
|
+
"image_source"
|
46
|
+
] = result.id
|
47
|
+
|
48
|
+
if "driver_info" in configuration["ironic_parameters"]:
|
49
|
+
if "deploy_kernel" in configuration["ironic_parameters"]["driver_info"]:
|
50
|
+
deploy_kernel = configuration["ironic_parameters"]["driver_info"][
|
51
|
+
"deploy_kernel"
|
52
|
+
]
|
53
|
+
if not is_uuid(deploy_kernel):
|
54
|
+
result = openstack.image_get(deploy_kernel)
|
55
|
+
configuration["ironic_parameters"]["driver_info"][
|
56
|
+
"deploy_kernel"
|
57
|
+
] = result.id
|
58
|
+
|
59
|
+
if "deploy_ramdisk" in configuration["ironic_parameters"]["driver_info"]:
|
60
|
+
deploy_ramdisk = configuration["ironic_parameters"]["driver_info"][
|
61
|
+
"deploy_ramdisk"
|
62
|
+
]
|
63
|
+
if not is_uuid(deploy_ramdisk):
|
64
|
+
result = openstack.image_get(deploy_ramdisk)
|
65
|
+
configuration["ironic_parameters"]["driver_info"][
|
66
|
+
"deploy_ramdisk"
|
67
|
+
] = result.id
|
68
|
+
|
69
|
+
if "cleaning_network" in configuration["ironic_parameters"]["driver_info"]:
|
70
|
+
result = openstack.network_get(
|
71
|
+
configuration["ironic_parameters"]["driver_info"][
|
72
|
+
"cleaning_network"
|
73
|
+
]
|
74
|
+
)
|
75
|
+
configuration["ironic_parameters"]["driver_info"][
|
76
|
+
"cleaning_network"
|
77
|
+
] = result.id
|
78
|
+
|
79
|
+
if (
|
80
|
+
"provisioning_network"
|
81
|
+
in configuration["ironic_parameters"]["driver_info"]
|
82
|
+
):
|
83
|
+
result = openstack.network_get(
|
84
|
+
configuration["ironic_parameters"]["driver_info"][
|
85
|
+
"provisioning_network"
|
86
|
+
]
|
87
|
+
)
|
88
|
+
configuration["ironic_parameters"]["driver_info"][
|
89
|
+
"provisioning_network"
|
90
|
+
] = result.id
|
91
|
+
|
92
|
+
return configuration
|