osism 0.20250326.0__py3-none-any.whl → 0.20250407.0__py3-none-any.whl
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/api.py +5 -10
- osism/commands/manage.py +2 -2
- osism/commands/netbox.py +17 -20
- osism/commands/wait.py +5 -12
- osism/core/enums.py +15 -1
- osism/services/listener.py +28 -67
- osism/tasks/__init__.py +13 -41
- osism/tasks/conductor.py +327 -28
- osism/tasks/netbox.py +88 -105
- osism/tasks/openstack.py +104 -183
- osism/tasks/reconciler.py +11 -26
- osism/utils/__init__.py +11 -0
- {osism-0.20250326.0.dist-info → osism-0.20250407.0.dist-info}/METADATA +5 -5
- {osism-0.20250326.0.dist-info → osism-0.20250407.0.dist-info}/RECORD +20 -22
- osism-0.20250407.0.dist-info/pbr.json +1 -0
- osism/actions/manage_device.py +0 -120
- osism/actions/manage_interface.py +0 -13
- osism-0.20250326.0.dist-info/pbr.json +0 -1
- {osism-0.20250326.0.dist-info → osism-0.20250407.0.dist-info}/WHEEL +0 -0
- {osism-0.20250326.0.dist-info → osism-0.20250407.0.dist-info}/entry_points.txt +0 -0
- {osism-0.20250326.0.dist-info → osism-0.20250407.0.dist-info}/licenses/AUTHORS +0 -0
- {osism-0.20250326.0.dist-info → osism-0.20250407.0.dist-info}/licenses/LICENSE +0 -0
- {osism-0.20250326.0.dist-info → osism-0.20250407.0.dist-info}/top_level.txt +0 -0
osism/tasks/openstack.py
CHANGED
@@ -1,47 +1,14 @@
|
|
1
1
|
# SPDX-License-Identifier: Apache-2.0
|
2
2
|
|
3
|
-
import copy
|
4
|
-
import ipaddress
|
5
|
-
|
6
3
|
from celery import Celery
|
7
|
-
from celery.signals import worker_process_init
|
8
|
-
import jinja2
|
9
|
-
import keystoneauth1
|
10
|
-
import openstack
|
11
|
-
from pottery import Redlock
|
12
|
-
from redis import Redis
|
13
4
|
import tempfile
|
14
5
|
|
15
|
-
from osism import settings
|
16
|
-
from osism.tasks import Config, conductor, netbox, run_command
|
17
6
|
from osism import utils
|
7
|
+
from osism.tasks import Config, run_command
|
18
8
|
|
19
9
|
app = Celery("openstack")
|
20
10
|
app.config_from_object(Config)
|
21
11
|
|
22
|
-
redis = None
|
23
|
-
conn = None
|
24
|
-
|
25
|
-
|
26
|
-
@worker_process_init.connect
|
27
|
-
def celery_init_worker(**kwargs):
|
28
|
-
global conn
|
29
|
-
global redis
|
30
|
-
|
31
|
-
redis = Redis(
|
32
|
-
host=settings.REDIS_HOST,
|
33
|
-
port=settings.REDIS_PORT,
|
34
|
-
db=settings.REDIS_DB,
|
35
|
-
socket_keepalive=True,
|
36
|
-
)
|
37
|
-
redis.ping()
|
38
|
-
|
39
|
-
# Parameters come from the environment, OS_*
|
40
|
-
try:
|
41
|
-
conn = openstack.connect()
|
42
|
-
except keystoneauth1.exceptions.auth_plugins.MissingRequiredOptions:
|
43
|
-
pass
|
44
|
-
|
45
12
|
|
46
13
|
@app.on_after_configure.connect
|
47
14
|
def setup_periodic_tasks(sender, **kwargs):
|
@@ -50,24 +17,54 @@ def setup_periodic_tasks(sender, **kwargs):
|
|
50
17
|
|
51
18
|
@app.task(bind=True, name="osism.tasks.openstack.image_get")
|
52
19
|
def image_get(self, image_name):
|
20
|
+
conn = utils.get_openstack_connection()
|
53
21
|
result = conn.image.find_image(image_name)
|
54
|
-
return result
|
22
|
+
return result
|
55
23
|
|
56
24
|
|
57
25
|
@app.task(bind=True, name="osism.tasks.openstack.network_get")
|
58
26
|
def network_get(self, network_name):
|
27
|
+
conn = utils.get_openstack_connection()
|
59
28
|
result = conn.network.find_network(network_name)
|
60
|
-
return result
|
29
|
+
return result
|
30
|
+
|
31
|
+
|
32
|
+
@app.task(bind=True, name="osism.tasks.openstack.baremetal_node_create")
|
33
|
+
def baremetal_node_create(self, node_name, attributes=None):
|
34
|
+
if attributes is None:
|
35
|
+
attributes = {}
|
36
|
+
attributes.update({"name": node_name})
|
37
|
+
conn = utils.get_openstack_connection()
|
38
|
+
result = conn.baremetal.create_node(**attributes)
|
39
|
+
return result
|
40
|
+
|
41
|
+
|
42
|
+
@app.task(bind=True, name="osism.tasks.openstack.baremetal_node_delete")
|
43
|
+
def baremetal_node_delete(self, node_or_id):
|
44
|
+
conn = utils.get_openstack_connection()
|
45
|
+
result = conn.baremetal.delete_node(node_or_id)
|
46
|
+
return result
|
47
|
+
|
48
|
+
|
49
|
+
@app.task(bind=True, name="osism.tasks.openstack.baremetal_node_update")
|
50
|
+
def baremetal_node_update(self, node_id_or_name, attributes=None):
|
51
|
+
if attributes is None:
|
52
|
+
attributes = {}
|
53
|
+
conn = utils.get_openstack_connection()
|
54
|
+
result = conn.baremetal.update_node(node_id_or_name, **attributes)
|
55
|
+
return result
|
61
56
|
|
62
57
|
|
63
58
|
@app.task(bind=True, name="osism.tasks.openstack.baremetal_node_show")
|
64
|
-
def baremetal_node_show(self, node_id_or_name):
|
65
|
-
|
59
|
+
def baremetal_node_show(self, node_id_or_name, ignore_missing=False):
|
60
|
+
conn = utils.get_openstack_connection()
|
61
|
+
result = conn.baremetal.find_node(node_id_or_name, ignore_missing)
|
66
62
|
return result
|
67
63
|
|
68
64
|
|
69
65
|
@app.task(bind=True, name="osism.tasks.openstack.baremetal_node_list")
|
70
66
|
def baremetal_node_list(self):
|
67
|
+
conn = utils.get_openstack_connection()
|
71
68
|
nodes = conn.baremetal.nodes()
|
72
69
|
result = []
|
73
70
|
|
@@ -87,173 +84,97 @@ def baremetal_node_list(self):
|
|
87
84
|
return result
|
88
85
|
|
89
86
|
|
90
|
-
@app.task(
|
91
|
-
|
92
|
-
)
|
93
|
-
|
94
|
-
pass
|
95
|
-
|
96
|
-
|
97
|
-
@app.task(bind=True, name="osism.tasks.openstack.baremetal_introspection_status")
|
98
|
-
def baremetal_introspection_status(self, node_id_or_name):
|
99
|
-
result = None
|
87
|
+
@app.task(bind=True, name="osism.tasks.openstack.baremetal_node_validate")
|
88
|
+
def baremetal_node_validate(self, node_id_or_name):
|
89
|
+
conn = utils.get_openstack_connection()
|
90
|
+
result = conn.baremetal.validate_node(node_id_or_name, required=())
|
100
91
|
return result
|
101
92
|
|
102
93
|
|
103
|
-
@app.task(
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
)
|
115
|
-
interfaces = introspection_data["inventory"]["interfaces"]
|
94
|
+
@app.task(
|
95
|
+
bind=True,
|
96
|
+
name="osism.tasks.openstack.baremetal_node_wait_for_nodes_provision_state",
|
97
|
+
)
|
98
|
+
def baremetal_node_wait_for_nodes_provision_state(self, node_id_or_name, state):
|
99
|
+
conn = utils.get_openstack_connection()
|
100
|
+
result = conn.baremetal.wait_for_nodes_provision_state([node_id_or_name], state)
|
101
|
+
if len(result) > 0:
|
102
|
+
return result[0]
|
103
|
+
else:
|
104
|
+
return None
|
116
105
|
|
117
|
-
result = None
|
118
|
-
for interface in interfaces:
|
119
|
-
if interface["mac_address"].lower() == mac_address.lower():
|
120
|
-
result = interface["name"]
|
121
106
|
|
107
|
+
@app.task(bind=True, name="osism.tasks.openstack.baremetal_node_set_provision_state")
|
108
|
+
def baremetal_node_set_provision_state(self, node, state):
|
109
|
+
conn = utils.get_openstack_connection()
|
110
|
+
result = conn.baremetal.set_node_provision_state(node, state)
|
122
111
|
return result
|
123
112
|
|
124
113
|
|
125
|
-
@app.task(bind=True, name="osism.tasks.openstack.
|
126
|
-
def
|
127
|
-
|
128
|
-
|
129
|
-
|
114
|
+
@app.task(bind=True, name="osism.tasks.openstack.baremetal_port_list")
|
115
|
+
def baremetal_port_list(self, details=False, attributes=None):
|
116
|
+
if attributes is None:
|
117
|
+
attributes = {}
|
118
|
+
conn = utils.get_openstack_connection()
|
119
|
+
result = conn.baremetal.ports(details=details, **attributes)
|
120
|
+
return list(result)
|
130
121
|
|
131
|
-
@app.task(bind=True, name="osism.tasks.openstack.baremetal_create_allocations")
|
132
|
-
def baremetal_create_allocations(self, nodes):
|
133
|
-
global conn
|
134
|
-
|
135
|
-
for node in nodes:
|
136
|
-
try:
|
137
|
-
allocation_a = conn.baremetal.get_allocation(allocation=node)
|
138
|
-
except openstack.exceptions.ResourceNotFound:
|
139
|
-
allocation_a = None
|
140
|
-
|
141
|
-
if not allocation_a:
|
142
|
-
# Get Ironic parameters from the conductor
|
143
|
-
task = conductor.get_ironic_parameters.delay()
|
144
|
-
task.wait(timeout=None, interval=0.5)
|
145
|
-
ironic_parameters = task.get()
|
146
|
-
|
147
|
-
allocation_a = conn.baremetal.create_allocation(
|
148
|
-
name=node,
|
149
|
-
candidate_nodes=[node],
|
150
|
-
resource_class=ironic_parameters["resource_class"],
|
151
|
-
)
|
152
|
-
conn.baremetal.wait_for_allocation(allocation=node, timeout=30)
|
153
122
|
|
123
|
+
@app.task(bind=True, name="osism.tasks.openstack.baremetal_port_create")
|
124
|
+
def baremetal_port_create(self, attributes=None):
|
125
|
+
if attributes is None:
|
126
|
+
attributes = {}
|
127
|
+
conn = utils.get_openstack_connection()
|
128
|
+
result = conn.baremetal.create_port(**attributes)
|
129
|
+
return result
|
154
130
|
|
155
|
-
@app.task(bind=True, name="osism.tasks.openstack.baremetal_create_nodes")
|
156
|
-
def baremetal_create_nodes(self, nodes, ironic_parameters):
|
157
|
-
global conn
|
158
|
-
|
159
|
-
for node in nodes:
|
160
|
-
# TODO: Filter on mgmt_only
|
161
|
-
address_a = utils.nb.ipam.ip_addresses.get(device=node, interface="Ethernet0")
|
162
|
-
|
163
|
-
node_parameters = copy.deepcopy(ironic_parameters)
|
164
|
-
|
165
|
-
if node_parameters["driver"] == "redfish":
|
166
|
-
remote_board_address = str(ipaddress.ip_interface(address_a["address"]).ip)
|
167
|
-
t = jinja2.Environment(loader=jinja2.BaseLoader()).from_string(
|
168
|
-
node_parameters["driver_info"]["redfish_address"]
|
169
|
-
)
|
170
|
-
node_parameters["driver_info"]["redfish_address"] = t.render(
|
171
|
-
remote_board_address=remote_board_address
|
172
|
-
)
|
173
|
-
|
174
|
-
elif node_parameters["driver"] == "ipmi":
|
175
|
-
remote_board_address = str(ipaddress.ip_interface(address_a["address"]).ip)
|
176
|
-
t = jinja2.Environment(loader=jinja2.BaseLoader()).from_string(
|
177
|
-
node_parameters["driver_info"]["ipmi_address"]
|
178
|
-
)
|
179
|
-
node_parameters["driver_info"]["ipmi_address"] = t.render(
|
180
|
-
remote_board_address=remote_board_address
|
181
|
-
)
|
182
131
|
|
183
|
-
|
184
|
-
|
185
|
-
|
132
|
+
@app.task(bind=True, name="osism.tasks.openstack.baremetal_port_delete")
|
133
|
+
def baremetal_port_delete(self, port_or_id):
|
134
|
+
conn = utils.get_openstack_connection()
|
135
|
+
result = conn.baremetal.delete_port(port_or_id)
|
136
|
+
return result
|
186
137
|
|
187
|
-
# NOTE: Internally used nodes are identified by their unique name via the resource class.
|
188
|
-
# The actual resource class is explicitly overwritten.
|
189
|
-
if "Managed by Ironic" in tags and "Managed by OSISM" in tags:
|
190
|
-
node_parameters["resource_class"] = f"osism-{node}"
|
191
|
-
baremetal_create_internal_flavor(node)
|
192
138
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
139
|
+
@app.task(bind=True, name="osism.tasks.openstack.compute_flavor_get")
|
140
|
+
def compute_flavor_get(self, name_or_id):
|
141
|
+
conn = utils.get_openstack_connection()
|
142
|
+
result = conn.compute.find_flavor(
|
143
|
+
name_or_id, ignore_missing=True, get_extra_specs=True
|
144
|
+
)
|
145
|
+
return result
|
197
146
|
|
198
|
-
if "Managed by Ironic" in tags and "Managed by OSISM" not in tags:
|
199
|
-
conn.baremetal.set_node_traits(node, ["CUSTOM_GENERAL_USE"])
|
200
|
-
elif "Managed by Ironic" in tags and "Managed by OSISM" in tags:
|
201
|
-
conn.baremetal.set_node_traits(node, ["CUSTOM_OSISM_USE"])
|
202
147
|
|
203
|
-
|
148
|
+
@app.task(bind=True, name="osism.tasks.openstack.compute_flavor_create")
|
149
|
+
def compute_flavor_create(self, name, attributes=None):
|
150
|
+
if attributes is None:
|
151
|
+
attributes = {}
|
152
|
+
attributes.update({"name": name})
|
153
|
+
extra_specs = attributes.pop("extra_specs", None)
|
154
|
+
conn = utils.get_openstack_connection()
|
155
|
+
flavor = conn.compute.create_flavor(**attributes)
|
156
|
+
if extra_specs:
|
157
|
+
flavor = conn.compute.create_flavor_extra_specs(flavor, extra_specs)
|
158
|
+
return flavor
|
204
159
|
|
205
|
-
# TODO: Check if the system has been registered correctly
|
206
|
-
device_a.custom_fields = {
|
207
|
-
"ironic_state": "registered",
|
208
|
-
}
|
209
|
-
device_a.save()
|
210
|
-
|
211
|
-
except openstack.exceptions.ResourceFailure:
|
212
|
-
# TODO: Do something useful here
|
213
|
-
pass
|
214
|
-
except openstack.exceptions.ConflictException:
|
215
|
-
# The node already exists and has a wronge state in the Netbox
|
216
|
-
device_a = utils.nb.dcim.devices.get(name=node)
|
217
|
-
device_a.custom_fields = {
|
218
|
-
"ironic_state": "registered",
|
219
|
-
}
|
220
|
-
device_a.save()
|
221
160
|
|
161
|
+
@app.task(bind=True, name="osism.tasks.openstack.compute_flavor_delete")
|
162
|
+
def compute_flavor_delete(self, flavor):
|
163
|
+
conn = utils.get_openstack_connection()
|
164
|
+
conn.compute.delete_flavor(flavor, ignore_missing=True)
|
222
165
|
|
223
|
-
@app.task(bind=True, name="osism.tasks.openstack.baremetal_check_allocations")
|
224
|
-
def baremetal_check_allocations(self):
|
225
|
-
lock = Redlock(
|
226
|
-
key="lock_osism_tasks_openstack_baremetal_check_allocations",
|
227
|
-
masters={redis},
|
228
|
-
auto_release_time=60,
|
229
|
-
)
|
230
166
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
167
|
+
@app.task(bind=True, name="osism.tasks.openstack.compute_flavor_update_extra_specs")
|
168
|
+
def compute_flavor_update_extra_specs(self, flavor, extra_specs={}):
|
169
|
+
conn = utils.get_openstack_connection()
|
170
|
+
for key, value in extra_specs.items():
|
171
|
+
conn.compute.update_flavor_extra_specs_property(flavor, key, value)
|
236
172
|
|
237
173
|
|
238
|
-
@app.task(bind=True, name="osism.tasks.openstack.
|
239
|
-
def
|
240
|
-
|
241
|
-
|
242
|
-
)
|
243
|
-
specs = {
|
244
|
-
f"resources:CUSTOM_RESOURCE_CLASS_OSISM_{node.upper()}": 1,
|
245
|
-
"resources:VCPU": 0,
|
246
|
-
"resources:MEMORY_MB": 0,
|
247
|
-
"resources:DISK_GB": 0,
|
248
|
-
"trait:CUSTOM_OSISM_USE": "required",
|
249
|
-
}
|
250
|
-
conn.compute.create_flavor_extra_specs(flavor_a, specs)
|
251
|
-
|
252
|
-
|
253
|
-
@app.task(bind=True, name="osism.tasks.openstack.baremetal_delete_internal_flavor")
|
254
|
-
def baremetal_delete_internal_flavor(self, node):
|
255
|
-
flavor = conn.compute.get_flavor(f"osism-{node}")
|
256
|
-
conn.compute.delete_flavor(flavor)
|
174
|
+
@app.task(bind=True, name="osism.tasks.openstack.compute_flavor_delete_extra_specs")
|
175
|
+
def compute_flavor_delete_extra_specs_property(self, flavor, prop):
|
176
|
+
conn = utils.get_openstack_connection()
|
177
|
+
conn.compute.delete_flavor_extra_specs_property(flavor, prop)
|
257
178
|
|
258
179
|
|
259
180
|
@app.task(bind=True, name="osism.tasks.openstack.image_manager")
|
osism/tasks/reconciler.py
CHANGED
@@ -4,31 +4,14 @@ import io
|
|
4
4
|
import subprocess
|
5
5
|
|
6
6
|
from celery import Celery
|
7
|
-
from celery.signals import worker_process_init
|
8
7
|
from loguru import logger
|
9
8
|
from pottery import Redlock
|
10
|
-
from
|
11
|
-
from osism import settings
|
9
|
+
from osism import settings, utils
|
12
10
|
from osism.tasks import Config
|
13
11
|
|
14
12
|
app = Celery("reconciler")
|
15
13
|
app.config_from_object(Config)
|
16
14
|
|
17
|
-
redis = None
|
18
|
-
|
19
|
-
|
20
|
-
@worker_process_init.connect
|
21
|
-
def celery_init_worker(**kwargs):
|
22
|
-
global redis
|
23
|
-
|
24
|
-
redis = Redis(
|
25
|
-
host=settings.REDIS_HOST,
|
26
|
-
port=settings.REDIS_PORT,
|
27
|
-
db=settings.REDIS_DB,
|
28
|
-
socket_keepalive=True,
|
29
|
-
)
|
30
|
-
redis.ping()
|
31
|
-
|
32
15
|
|
33
16
|
@app.on_after_configure.connect
|
34
17
|
def setup_periodic_tasks(sender, **kwargs):
|
@@ -40,7 +23,9 @@ def setup_periodic_tasks(sender, **kwargs):
|
|
40
23
|
@app.task(bind=True, name="osism.tasks.reconciler.run")
|
41
24
|
def run(self, publish=True):
|
42
25
|
lock = Redlock(
|
43
|
-
key="lock_osism_tasks_reconciler_run",
|
26
|
+
key="lock_osism_tasks_reconciler_run",
|
27
|
+
masters={utils.redis},
|
28
|
+
auto_release_time=60,
|
44
29
|
)
|
45
30
|
|
46
31
|
if lock.acquire(timeout=20):
|
@@ -51,13 +36,13 @@ def run(self, publish=True):
|
|
51
36
|
|
52
37
|
for line in io.TextIOWrapper(p.stdout, encoding="utf-8"):
|
53
38
|
if publish:
|
54
|
-
redis.xadd(self.request.id, {"type": "stdout", "content": line})
|
39
|
+
utils.redis.xadd(self.request.id, {"type": "stdout", "content": line})
|
55
40
|
|
56
41
|
rc = p.wait(timeout=60)
|
57
42
|
|
58
43
|
if publish:
|
59
|
-
redis.xadd(self.request.id, {"type": "rc", "content": rc})
|
60
|
-
redis.xadd(self.request.id, {"type": "action", "content": "quit"})
|
44
|
+
utils.redis.xadd(self.request.id, {"type": "rc", "content": rc})
|
45
|
+
utils.redis.xadd(self.request.id, {"type": "action", "content": "quit"})
|
61
46
|
|
62
47
|
lock.release()
|
63
48
|
|
@@ -66,7 +51,7 @@ def run(self, publish=True):
|
|
66
51
|
def run_on_change(self):
|
67
52
|
lock = Redlock(
|
68
53
|
key="lock_osism_tasks_reconciler_run_on_change",
|
69
|
-
masters={redis},
|
54
|
+
masters={utils.redis},
|
70
55
|
auto_release_time=60,
|
71
56
|
)
|
72
57
|
|
@@ -84,7 +69,7 @@ def run_on_change(self):
|
|
84
69
|
def sync_inventory_with_netbox(self):
|
85
70
|
lock = Redlock(
|
86
71
|
key="lock_osism_tasks_reconciler_sync_inventory_with_netbox",
|
87
|
-
masters={redis},
|
72
|
+
masters={utils.redis},
|
88
73
|
auto_release_time=60,
|
89
74
|
)
|
90
75
|
|
@@ -98,13 +83,13 @@ def sync_inventory_with_netbox(self):
|
|
98
83
|
|
99
84
|
for line in io.TextIOWrapper(p.stdout, encoding="utf-8"):
|
100
85
|
# NOTE: use task_id or request_id in future
|
101
|
-
redis.publish(
|
86
|
+
utils.redis.publish(
|
102
87
|
"netbox-sync-inventory-with-netbox", {"type": "stdout", "content": line}
|
103
88
|
)
|
104
89
|
|
105
90
|
lock.release()
|
106
91
|
|
107
92
|
# NOTE: use task_id or request_id in future
|
108
|
-
redis.publish(
|
93
|
+
utils.redis.publish(
|
109
94
|
"netbox-sync-inventory-with-netbox", {"type": "action", "content": "quit"}
|
110
95
|
)
|
osism/utils/__init__.py
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# SPDX-License-Identifier: Apache-2.0
|
2
2
|
|
3
|
+
import keystoneauth1
|
4
|
+
import openstack
|
3
5
|
import pynetbox
|
4
6
|
from redis import Redis
|
5
7
|
import urllib3
|
@@ -29,6 +31,15 @@ else:
|
|
29
31
|
nb = None
|
30
32
|
|
31
33
|
|
34
|
+
def get_openstack_connection():
|
35
|
+
try:
|
36
|
+
conn = openstack.connect()
|
37
|
+
except keystoneauth1.exceptions.auth_plugins.MissingRequiredOptions:
|
38
|
+
pass
|
39
|
+
|
40
|
+
return conn
|
41
|
+
|
42
|
+
|
32
43
|
# https://stackoverflow.com/questions/2361426/get-the-first-item-from-an-iterable-that-matches-a-condition
|
33
44
|
def first(iterable, condition=lambda x: True):
|
34
45
|
"""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: osism
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.20250407.0
|
4
4
|
Summary: OSISM manager interface
|
5
5
|
Home-page: https://github.com/osism/python-osism
|
6
6
|
Author: OSISM GmbH
|
@@ -27,7 +27,7 @@ Requires-Dist: GitPython==3.1.44
|
|
27
27
|
Requires-Dist: Jinja2==3.1.6
|
28
28
|
Requires-Dist: PyYAML==6.0.2
|
29
29
|
Requires-Dist: ara==1.7.2
|
30
|
-
Requires-Dist: celery[redis]==5.
|
30
|
+
Requires-Dist: celery[redis]==5.5.0
|
31
31
|
Requires-Dist: cliff==4.9.1
|
32
32
|
Requires-Dist: deepdiff==8.4.2
|
33
33
|
Requires-Dist: docker==7.1.0
|
@@ -37,7 +37,7 @@ Requires-Dist: flower==2.0.1
|
|
37
37
|
Requires-Dist: hiredis==3.1.0
|
38
38
|
Requires-Dist: jc==1.25.4
|
39
39
|
Requires-Dist: keystoneauth1==5.10.0
|
40
|
-
Requires-Dist: kombu==5.5.
|
40
|
+
Requires-Dist: kombu==5.5.2
|
41
41
|
Requires-Dist: kubernetes==32.0.1
|
42
42
|
Requires-Dist: loguru==0.7.3
|
43
43
|
Requires-Dist: netmiko==4.5.0
|
@@ -48,7 +48,7 @@ Requires-Dist: pottery==3.0.1
|
|
48
48
|
Requires-Dist: prompt-toolkit==3.0.50
|
49
49
|
Requires-Dist: pydantic==1.10.21
|
50
50
|
Requires-Dist: pynetbox==7.4.1
|
51
|
-
Requires-Dist: pytest-testinfra==10.
|
51
|
+
Requires-Dist: pytest-testinfra==10.2.2
|
52
52
|
Requires-Dist: python-dateutil==2.9.0.post0
|
53
53
|
Requires-Dist: setuptools==78.1.0
|
54
54
|
Requires-Dist: sqlmodel==0.0.24
|
@@ -61,7 +61,7 @@ Provides-Extra: ansible
|
|
61
61
|
Requires-Dist: ansible-runner==2.4.1; extra == "ansible"
|
62
62
|
Requires-Dist: ansible-core==2.18.4; extra == "ansible"
|
63
63
|
Provides-Extra: openstack-image-manager
|
64
|
-
Requires-Dist: openstack-image-manager==0.
|
64
|
+
Requires-Dist: openstack-image-manager==0.20250407.0; extra == "openstack-image-manager"
|
65
65
|
Dynamic: author
|
66
66
|
Dynamic: author-email
|
67
67
|
Dynamic: classifier
|
@@ -1,11 +1,9 @@
|
|
1
1
|
osism/__init__.py,sha256=1UiNTBus0V0f2AbZQzAtVtu6zkfCCrw0OTq--NwFAqY,341
|
2
2
|
osism/__main__.py,sha256=ILe4gu61xEISiBsxanqTQIdSkV-YhpZXTRlguCYyssk,141
|
3
|
-
osism/api.py,sha256=
|
3
|
+
osism/api.py,sha256=Lvkdd92tvv9RtoMs9RtvqsN3DiSKPdSll24J3wRzbBY,4793
|
4
4
|
osism/main.py,sha256=Dt2-9sLXcS-Ny4DAz7hrha-KRc7zd7BFUTRdfs_X8z4,893
|
5
5
|
osism/settings.py,sha256=m__DltxKQo5D-vDKKwY8RNBVs5bverYdJmtyVyln_6o,1049
|
6
6
|
osism/actions/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
|
7
|
-
osism/actions/manage_device.py,sha256=joQwPnwEUw5V1ZRRbdrM0FjfNlG4vPNc0r8FBRTOJiA,3541
|
8
|
-
osism/actions/manage_interface.py,sha256=iDp7zY16XXtwdLk1sxa-TBAkpdPxmtbVeEvMZuP5h4s,472
|
9
7
|
osism/commands/__init__.py,sha256=Ag4wX_DCgXRdoLn6t069jqb3DdRylsX2nyYkiyCx4uk,456
|
10
8
|
osism/commands/apply.py,sha256=n3lLb1cS3GahQqRT0723di98hg47MjVzDzkAoeZX7qU,16780
|
11
9
|
osism/commands/compose.py,sha256=iqzG7mS9E1VWaLNN6yQowjOqiHn3BMdj-yfXb3Dc4Ok,1200
|
@@ -15,8 +13,8 @@ osism/commands/console.py,sha256=8BPz1hio5Wi6kONVAWFuSqkDRrMcLEYeFIY8dbtN6e4,321
|
|
15
13
|
osism/commands/container.py,sha256=Fku2GaCM3Idq_FxExUtNqjrEM0XYjpVvXmueSVO8S_c,1601
|
16
14
|
osism/commands/get.py,sha256=ryytjtXWmlMV0NucP5tGkMZu0nIlC4xVtjRk4iMZ06c,8967
|
17
15
|
osism/commands/log.py,sha256=2IpYuosC7FZwwLvM8HmKSU1NRNIelVVYzqjjVMCrOJk,4072
|
18
|
-
osism/commands/manage.py,sha256=
|
19
|
-
osism/commands/netbox.py,sha256=
|
16
|
+
osism/commands/manage.py,sha256=E0ZF4Bf91cgttkSVt1dOQ4nQbRUSDAgsgPOjJMDsGBk,11932
|
17
|
+
osism/commands/netbox.py,sha256=_2-j6XM9JvH0DXnbct6rG9T6hT8KEpm3vazQC28Rt7I,4529
|
20
18
|
osism/commands/noset.py,sha256=7zDFuFMyNpo7DUOKcNiYV8nodtdMOYFp5LDPcuJhlZ8,1481
|
21
19
|
osism/commands/reconciler.py,sha256=Ja_b86gX6-_Pr3DmrUUvskmEnnJpHQ-XJNQLycMJeyc,2818
|
22
20
|
osism/commands/server.py,sha256=zFXRdYoj4ZNDJNPSaGddMPEWxt8G2GyMomPOcCOaN3c,4137
|
@@ -28,30 +26,30 @@ osism/commands/task.py,sha256=mwJJ7a71Lw3o_FX7j3rR0-NbPdPwMDOjbOAiiXE4uGc,543
|
|
28
26
|
osism/commands/validate.py,sha256=hIQB0zk4xIBZJORtBp_tWrXTRKKhB2qi6j-mznDxKR4,4191
|
29
27
|
osism/commands/vault.py,sha256=Ip0IMR7zaBkPbLJenXr4ZwxM6FnozZ9wn9rwHmFHo8s,1818
|
30
28
|
osism/commands/volume.py,sha256=SqD9pYgtcYnMu6sB2pG8lfrLHRq6GzOb_-RkWOOVZPo,3156
|
31
|
-
osism/commands/wait.py,sha256=
|
29
|
+
osism/commands/wait.py,sha256=mKFDqEXcaLlKw1T3MuBEZpNh7CeL3lpUXgubD2_f8es,6580
|
32
30
|
osism/commands/worker.py,sha256=iraCOEhCp7WgfjfZ0-12XQYQPUjpi9rSJK5Z9JfNJk4,1651
|
33
31
|
osism/core/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
|
34
|
-
osism/core/enums.py,sha256=
|
32
|
+
osism/core/enums.py,sha256=ldH2wM0mea7oHBSCrxEyCqkjH_R2kc8wmdI2J9eb6sM,9952
|
35
33
|
osism/core/playbooks.py,sha256=M3T3ajV-8Lt-orsRO3jAoukhaoYFr4EZ2dzYXQjt1kg,728
|
36
34
|
osism/data/__init__.py,sha256=izXdh0J3vPLQI7kBhJI7ibJQzPqU_nlONP0L4Cf_k6A,1504
|
37
35
|
osism/plugins/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
|
38
36
|
osism/services/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
|
39
|
-
osism/services/listener.py,sha256=
|
40
|
-
osism/tasks/__init__.py,sha256=
|
37
|
+
osism/services/listener.py,sha256=eEamlQsJqCuU9K2QFmk3yM9LAJZEanVcTLtGMsNCKjs,9783
|
38
|
+
osism/tasks/__init__.py,sha256=lrSkcZtbzhWsLS4hWadKfpP_tCd1pX1IhvrBU3EhKmM,8605
|
41
39
|
osism/tasks/ansible.py,sha256=RcLxLrjzL5_X6OjNHm3H0lZlmKKlYKIANB0M4_d4chE,1109
|
42
40
|
osism/tasks/ceph.py,sha256=eIQkah3Kj4INtOkF9kTjHbXJ3_J2lg48EWJKfHc-UYw,615
|
43
|
-
osism/tasks/conductor.py,sha256=
|
41
|
+
osism/tasks/conductor.py,sha256=Qg4ic9j5khHGumXCRaosrDiphs4-Eqk02BCb78zuTkM,19162
|
44
42
|
osism/tasks/kolla.py,sha256=wJQpWn_01iWLkr7l7T7RNrQGfRgsgmYi4WQlTmNGvew,618
|
45
43
|
osism/tasks/kubernetes.py,sha256=VzXq_VrYU_CLm4cOruqnE3Kq2ydfO9glZ3p0bp3OYoc,625
|
46
|
-
osism/tasks/netbox.py,sha256=
|
47
|
-
osism/tasks/openstack.py,sha256=
|
48
|
-
osism/tasks/reconciler.py,sha256=
|
49
|
-
osism/utils/__init__.py,sha256=
|
50
|
-
osism-0.
|
51
|
-
osism-0.
|
52
|
-
osism-0.
|
53
|
-
osism-0.
|
54
|
-
osism-0.
|
55
|
-
osism-0.
|
56
|
-
osism-0.
|
57
|
-
osism-0.
|
44
|
+
osism/tasks/netbox.py,sha256=qT3-0GWDPCnejLGAhNp7InMSxBTk7qmKwfdNn1in3FM,4857
|
45
|
+
osism/tasks/openstack.py,sha256=ZFdgudp02a9I4AiJae2Pu0_k9REYi4P7wTLA5rzx8is,7825
|
46
|
+
osism/tasks/reconciler.py,sha256=RGUcax2gDuyVLw1nGRQn5izXclnPBo9MRl0ndLDiiYQ,2707
|
47
|
+
osism/utils/__init__.py,sha256=DP2D7xyXnfWuH-c26elIwdwrMSY-oSkVsLFKsQfna9w,1477
|
48
|
+
osism-0.20250407.0.dist-info/licenses/AUTHORS,sha256=EKFIR9F27AvoEXp1cA6FkGbjEOFt4Rcbipr5RJc7jSs,64
|
49
|
+
osism-0.20250407.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
|
50
|
+
osism-0.20250407.0.dist-info/METADATA,sha256=TIDKl4LiJsyH7yJLztBxKbVc3BWnaKMdHxXRZ377Reg,2972
|
51
|
+
osism-0.20250407.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
52
|
+
osism-0.20250407.0.dist-info/entry_points.txt,sha256=DlfrvU14rI55WuTrwNRoce9FY3ric4HeZKZx_Z3NzCw,3015
|
53
|
+
osism-0.20250407.0.dist-info/pbr.json,sha256=7g2xfwKFA8HvM2aPcqC5h0SXZ_VjJYyEL03mJcdLU6A,47
|
54
|
+
osism-0.20250407.0.dist-info/top_level.txt,sha256=8L8dsI9hcaGHsdnR4k_LN9EM78EhwrXRFHyAryPXZtY,6
|
55
|
+
osism-0.20250407.0.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
{"git_version": "976a50a", "is_release": false}
|