Skip to content

Commit d705b0f

Browse files
authored
Return commit id on successful commit (#408)
Knowing the commit id of changes can be useful for example when wanting to compare to committed changes and knowing which one finished first and other features that we want in the future.
1 parent ba7c0b3 commit d705b0f

File tree

8 files changed

+53
-44
lines changed

8 files changed

+53
-44
lines changed

adminapi/dataset.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ def _fetch_new_object(self, servertype):
271271
)
272272
return _format_obj(response['result'])
273273

274-
def commit(self):
274+
def commit(self) -> int:
275275
commit = self._build_commit_object()
276276
result = send_request(COMMIT_ENDPOINT, post_params=commit)
277277

@@ -282,6 +282,8 @@ def commit(self):
282282
for obj in self:
283283
obj._confirm_changes()
284284

285+
return result['commit_id']
286+
285287
def _fetch_results(self):
286288
request_data = {'filters': self._filters}
287289
if self._restrict is not None:
@@ -480,7 +482,7 @@ def update(self, other, **kwargs):
480482
self[key] = value
481483

482484
# XXX: Deprecated
483-
def commit(self):
485+
def commit(self) -> int:
484486
commit = self._build_commit_object()
485487
result = send_request(COMMIT_ENDPOINT, post_params=commit)
486488

@@ -489,6 +491,8 @@ def commit(self):
489491

490492
self._confirm_changes()
491493

494+
return result['commit_id']
495+
492496

493497
class MultiAttr(set):
494498
"""This class must redefine all mutable methods of the set class

serveradmin/access_control/tests/test_acl.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def test_can_commit_related_via_attribute(self):
2727

2828
vm = Query({"hostname": "vm-1"}, ["hostname", "hv"])
2929
vm.update(hv="hv-2")
30-
self.assertIsNone(vm.commit(app=Application.objects.get(name="test")))
30+
self.assertIsInstance(vm.commit(app=Application.objects.get(name="test")), int)
3131

3232
# See https://github.com/innogames/serveradmin/pull/351
3333
def test_cannot_commit_related_via_attribute_target(self):

serveradmin/api/views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def dataset_commit(request, app, data):
9999
kwargs[key] = value
100100

101101
try:
102-
commit_query(app=app, **kwargs)
102+
_, commit_id = commit_query(app=app, **kwargs)
103103
except ValidationError as error:
104104
return {
105105
'status': 'error',
@@ -109,6 +109,7 @@ def dataset_commit(request, app, data):
109109

110110
return {
111111
'status': 'success',
112+
'commit_id': commit_id,
112113
}
113114

114115

serveradmin/dataset.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,20 @@ class Query(BaseQuery):
1616
def _fetch_new_object(self, servertype):
1717
return DatasetObject(get_default_attribute_values(servertype))
1818

19-
def commit(self, app=None, user=None):
19+
def commit(self, app=None, user=None) -> int:
2020
commit_obj = self._build_commit_object()
21-
commit_query(app=app, user=user, **commit_obj)
21+
_, commit_id = commit_query(app=app, user=user, **commit_obj)
2222
self._confirm_changes()
23+
return commit_id
2324

2425
def _fetch_results(self):
2526
return execute_query(self._filters, self._restrict, self._order_by)
2627

2728

2829
class DatasetObject(ApiDatasetObject):
29-
def commit(self, app=None, user=None):
30+
# XXX: Deprecated use Query().commit().
31+
def commit(self, app=None, user=None) -> int:
3032
commit_obj = self._build_commit_object()
31-
commit_query(app=app, user=user, **commit_obj)
33+
_, commit_id = commit_query(app=app, user=user, **commit_obj)
3234
self._confirm_changes()
35+
return commit_id

serveradmin/serverdb/query_committer.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def commit_query(created=[], changed=[], deleted=[], app=None, user=None):
129129
created_objects, changed_objects, deleted_objects
130130
)
131131

132-
_log_changes(user, app, changed, created_objects, deleted_objects)
132+
commit_id = _log_changes(user, app, changed, created_objects, deleted_objects)
133133

134134
post_commit.send_robust(
135135
commit_query, created=created, changed=changed, deleted=deleted
@@ -139,7 +139,7 @@ def commit_query(created=[], changed=[], deleted=[], app=None, user=None):
139139
list(created_objects.values()),
140140
list(changed_objects.values()),
141141
list(deleted_objects.values()),
142-
)
142+
), commit_id
143143

144144

145145
def _validate(attribute_lookup, changed, changed_objects):
@@ -467,7 +467,7 @@ def _acl_violations(touched_objects, pending_changes, acl):
467467
return violations or None
468468

469469

470-
def _log_changes(user, app, changed, created_objects, deleted_objects):
470+
def _log_changes(user, app, changed, created_objects, deleted_objects) -> int:
471471
changes = list()
472472
commit = ChangeCommit(user=user, app=app)
473473

@@ -504,6 +504,8 @@ def _log_changes(user, app, changed, created_objects, deleted_objects):
504504
commit.save()
505505
Change.objects.bulk_create(changes)
506506

507+
return commit.id
508+
507509

508510
def _fetch_servers(object_ids):
509511
servers = {

serveradmin/serverdb/tests/test_ip_addr_type.py

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class TestIpAddrTypeNullForInternIp(TestIpAddrType):
4949

5050
def test_server_without_intern_ip(self):
5151
server = self._get_server("null")
52-
self.assertIsNone(server.commit(user=User.objects.first()))
52+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
5353

5454
def test_server_with_intern_ip(self):
5555
server = self._get_server("null")
@@ -87,7 +87,7 @@ def test_server_without_value(self):
8787
def test_server_with_value(self):
8888
server = self._get_server("host")
8989
server["intern_ip"] = "10.0.0.1/32"
90-
self.assertIsNone(server.commit(user=User.objects.first()))
90+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
9191

9292
def test_server_with_invalid_value(self):
9393
server = self._get_server("host")
@@ -132,7 +132,7 @@ def test_change_server_hostname(self):
132132

133133
to_rename = Query({"hostname": server["hostname"]}, ["hostname"])
134134
to_rename.update(hostname=self.faker.hostname())
135-
self.assertIsNone(to_rename.commit(user=User.objects.first()))
135+
self.assertIsInstance(to_rename.commit(user=User.objects.first()), int)
136136

137137

138138
class TestIpAddrTypeHostForInetAttributes(TestIpAddrType):
@@ -141,13 +141,13 @@ class TestIpAddrTypeHostForInetAttributes(TestIpAddrType):
141141
def test_server_without_value(self):
142142
server = self._get_server("host")
143143
server["intern_ip"] = "10.0.0.1/32"
144-
self.assertIsNone(server.commit(user=User.objects.first()))
144+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
145145

146146
def test_server_with_value(self):
147147
server = self._get_server("host")
148148
server["intern_ip"] = "10.0.0.1/32"
149149
server["ip_config_ipv4"] = "10.0.0.2/32"
150-
self.assertIsNone(server.commit(user=User.objects.first()))
150+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
151151

152152
def test_server_with_invalid_value(self):
153153
server = self._get_server("host")
@@ -187,7 +187,7 @@ def test_server_overlaps_with_network(self):
187187
server = self._get_server("host")
188188
server["intern_ip"] = "10.0.0.1/32"
189189
server["ip_config_ipv4"] = "10.0.1.5/32"
190-
self.assertIsNone(server.commit(user=User.objects.first()))
190+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
191191

192192
def test_server_with_duplicate_intern_ip(self):
193193
first = self._get_server("host")
@@ -211,7 +211,7 @@ def test_server_with_duplicate_inet_different_attrs(self):
211211
other_attribute = self._get_server("host")
212212
other_attribute["intern_ip"] = "10.0.0.3/32"
213213
other_attribute["ip_config_new"] = "10.0.0.2/32"
214-
self.assertIsNone(other_attribute.commit(user=User.objects.first()))
214+
self.assertIsInstance(other_attribute.commit(user=User.objects.first()), int)
215215

216216
def test_server_with_duplicate_inet_ip(self):
217217
server = self._get_server("host")
@@ -223,7 +223,7 @@ def test_server_with_duplicate_inet_ip(self):
223223
duplicate = self._get_server("loadbalancer")
224224
duplicate["intern_ip"] = "10.0.0.2/32"
225225
duplicate["ip_config_ipv4"] = "10.0.0.1/32"
226-
self.assertIsNone(duplicate.commit(user=User.objects.first()))
226+
self.assertIsInstance(duplicate.commit(user=User.objects.first()), int)
227227

228228
def test_change_server_hostname(self):
229229
server = self._get_server("host")
@@ -233,7 +233,7 @@ def test_change_server_hostname(self):
233233

234234
to_rename = Query({"hostname": server["hostname"]}, ["hostname"])
235235
to_rename.update(hostname=self.faker.hostname())
236-
self.assertIsNone(to_rename.commit(user=User.objects.first()))
236+
self.assertIsInstance(to_rename.commit(user=User.objects.first()), int)
237237

238238

239239
class TestIpAddrTypeLoadbalancerForInternIp(TestIpAddrType):
@@ -247,7 +247,7 @@ def test_server_without_value(self):
247247
def test_server_with_value(self):
248248
server = self._get_server("loadbalancer")
249249
server["intern_ip"] = "10.0.0.1/32"
250-
self.assertIsNone(server.commit(user=User.objects.first()))
250+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
251251

252252
def test_server_with_ip_network(self):
253253
server = self._get_server("loadbalancer")
@@ -262,7 +262,7 @@ def test_server_with_duplicate_intern_ip(self):
262262

263263
second = self._get_server("loadbalancer")
264264
second["intern_ip"] = "10.0.0.1/32"
265-
self.assertIsNone(second.commit(user=User.objects.first()))
265+
self.assertIsInstance(second.commit(user=User.objects.first()), int)
266266

267267
def test_change_server_hostname(self):
268268
server = self._get_server("loadbalancer")
@@ -271,7 +271,7 @@ def test_change_server_hostname(self):
271271

272272
to_rename = Query({"hostname": server["hostname"]}, ["hostname"])
273273
to_rename.update(hostname=self.faker.hostname())
274-
self.assertIsNone(to_rename.commit(user=User.objects.first()))
274+
self.assertIsInstance(to_rename.commit(user=User.objects.first()), int)
275275

276276

277277
class TestIpAddrTypeLoadbalancerForInetAttributes(TestIpAddrType):
@@ -280,13 +280,13 @@ class TestIpAddrTypeLoadbalancerForInetAttributes(TestIpAddrType):
280280
def test_server_without_value(self):
281281
server = self._get_server("loadbalancer")
282282
server["intern_ip"] = "10.0.0.1/32"
283-
self.assertIsNone(server.commit(user=User.objects.first()))
283+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
284284

285285
def test_server_with_value(self):
286286
server = self._get_server("loadbalancer")
287287
server["intern_ip"] = "10.0.0.1/32"
288288
server["ip_config_ipv4"] = "10.0.0.2/32"
289-
self.assertIsNone(server.commit(user=User.objects.first()))
289+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
290290

291291
def test_server_with_ip_network(self):
292292
server = self._get_server("loadbalancer")
@@ -304,7 +304,7 @@ def test_server_with_duplicate_inet_attribute(self):
304304
second = self._get_server("loadbalancer")
305305
second["intern_ip"] = "10.0.0.1/32"
306306
second["ip_config_ipv4"] = "10.0.0.2/32"
307-
self.assertIsNone(second.commit(user=User.objects.first()))
307+
self.assertIsInstance(second.commit(user=User.objects.first()), int)
308308

309309
def test_server_with_duplicate_inet_ip(self):
310310
first = self._get_server("loadbalancer")
@@ -316,7 +316,7 @@ def test_server_with_duplicate_inet_ip(self):
316316
duplicate = self._get_server("host")
317317
duplicate["intern_ip"] = "10.0.0.2/32"
318318
duplicate["ip_config_ipv4"] = "10.0.0.1/32"
319-
self.assertIsNone(duplicate.commit(user=User.objects.first()))
319+
self.assertIsInstance(duplicate.commit(user=User.objects.first()), int)
320320

321321
def test_server_with_duplicate_inet_different_attrs(self):
322322
server = self._get_server("loadbalancer")
@@ -327,7 +327,7 @@ def test_server_with_duplicate_inet_different_attrs(self):
327327
duplicate = self._get_server("loadbalancer")
328328
duplicate["intern_ip"] = "10.0.0.3/32"
329329
duplicate["ip_config_new"] = "10.0.0.2/32"
330-
self.assertIsNone(duplicate.commit(user=User.objects.first()))
330+
self.assertIsInstance(duplicate.commit(user=User.objects.first()), int)
331331

332332
def test_change_server_hostname(self):
333333
server = self._get_server("loadbalancer")
@@ -337,7 +337,7 @@ def test_change_server_hostname(self):
337337

338338
to_rename = Query({"hostname": server["hostname"]}, ["hostname"])
339339
to_rename.update(hostname=self.faker.hostname())
340-
self.assertIsNone(to_rename.commit(user=User.objects.first()))
340+
self.assertIsInstance(to_rename.commit(user=User.objects.first()), int)
341341

342342

343343
class TestIpAddrTypeNetworkForInternIp(TestIpAddrType):
@@ -351,7 +351,7 @@ def test_server_without_value(self):
351351
def test_server_with_value(self):
352352
server = self._get_server("route_network")
353353
server["intern_ip"] = "10.0.0.0/16"
354-
self.assertIsNone(server.commit(user=User.objects.first()))
354+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
355355

356356
def test_server_with_invalid_value(self):
357357
server = self._get_server("host")
@@ -369,7 +369,7 @@ def test_server_with_invalid_network(self):
369369
def test_server_with_ip_address(self):
370370
server = self._get_server("route_network")
371371
server["intern_ip"] = "10.0.0.1/32" # Just a very small network
372-
self.assertIsNone(server.commit(user=User.objects.first()))
372+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
373373

374374
def test_server_network_overlaps(self):
375375
first = self._get_server("route_network")
@@ -389,7 +389,7 @@ def test_change_server_network_overlaps(self):
389389

390390
host = Query({"hostname": first["hostname"]}, ["intern_ip"])
391391
host.update(intern_ip=IPv4Network("10.0.0.0/28"))
392-
self.assertIsNone(host.commit(user=User.objects.first()))
392+
self.assertIsInstance(host.commit(user=User.objects.first()), int)
393393

394394
def test_server_network_overlaps_inet(self):
395395
first = self._get_server("route_network")
@@ -410,7 +410,7 @@ def test_server_network_overlaps_other_servertype(self):
410410
# A network can overlap with networks of other servertypes
411411
overlaps = self._get_server("provider_network")
412412
overlaps["intern_ip"] = "10.0.0.0/28"
413-
self.assertIsNone(overlaps.commit(user=User.objects.first()))
413+
self.assertIsInstance(overlaps.commit(user=User.objects.first()), int)
414414

415415
def test_change_server_hostname(self):
416416
server = self._get_server("route_network")
@@ -419,7 +419,7 @@ def test_change_server_hostname(self):
419419

420420
to_rename = Query({"hostname": server["hostname"]}, ["hostname"])
421421
to_rename.update(hostname=self.faker.hostname())
422-
self.assertIsNone(to_rename.commit(user=User.objects.first()))
422+
self.assertIsInstance(to_rename.commit(user=User.objects.first()), int)
423423

424424

425425
class TestIpAddrTypeNetworkForInetAttributes(TestIpAddrType):
@@ -428,13 +428,13 @@ class TestIpAddrTypeNetworkForInetAttributes(TestIpAddrType):
428428
def test_server_without_value(self):
429429
server = self._get_server("route_network")
430430
server["intern_ip"] = "10.0.0.0/16"
431-
self.assertIsNone(server.commit(user=User.objects.first()))
431+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
432432

433433
def test_server_with_value(self):
434434
server = self._get_server("route_network")
435435
server["intern_ip"] = "10.0.0.0/30"
436436
server["ip_config_ipv4"] = "10.0.1.0/30"
437-
self.assertIsNone(server.commit(user=User.objects.first()))
437+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
438438

439439
def test_server_with_invalid_value(self):
440440
server = self._get_server("host")
@@ -455,7 +455,7 @@ def test_server_with_ip_address(self):
455455
server = self._get_server("route_network")
456456
server["intern_ip"] = "10.0.0.1/32" # Just a very small network
457457
server["ip_config_ipv4"] = "10.0.1.0/32" # Just a very small network
458-
self.assertIsNone(server.commit(user=User.objects.first()))
458+
self.assertIsInstance(server.commit(user=User.objects.first()), int)
459459

460460
def test_server_network_overlaps(self):
461461
first = self._get_server("route_network")
@@ -477,7 +477,7 @@ def test_change_server_network_overlaps(self):
477477

478478
host = Query({"hostname": first["hostname"]}, ["ip_config_ipv4"])
479479
host.update(ip_config_ipv4=IPv4Network("10.0.1.0/28"))
480-
self.assertIsNone(host.commit(user=User.objects.first()))
480+
self.assertIsInstance(host.commit(user=User.objects.first()), int)
481481

482482
def test_server_network_overlaps_intern_ip(self):
483483
first = self._get_server("route_network")
@@ -512,7 +512,7 @@ def test_server_network_overlaps_other_servertype(self):
512512
overlaps = self._get_server("provider_network")
513513
overlaps["intern_ip"] = "10.0.0.0/28"
514514
overlaps["ip_config_ipv4"] = "10.0.1.0/30"
515-
self.assertIsNone(overlaps.commit(user=User.objects.first()))
515+
self.assertIsInstance(overlaps.commit(user=User.objects.first()), int)
516516

517517
def test_change_server_hostname(self):
518518
server = self._get_server("route_network")
@@ -522,7 +522,7 @@ def test_change_server_hostname(self):
522522

523523
to_rename = Query({"hostname": server["hostname"]}, ["hostname"])
524524
to_rename.update(hostname=self.faker.hostname())
525-
self.assertIsNone(to_rename.commit(user=User.objects.first()))
525+
self.assertIsInstance(to_rename.commit(user=User.objects.first()), int)
526526

527527

528528
class TestIpAddrTypeHostForSupernetAttr(TestIpAddrType):

serveradmin/serverdb/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ def recreate(request, change_id):
183183
server_object.pop(attribute_id)
184184

185185
try:
186-
commit = commit_query([server_object], user=request.user)
187-
object_id = str(commit.created[0]['object_id'])
186+
changes_obj, _ = commit_query([server_object], user=request.user)
187+
object_id = str(changes_obj.created[0]['object_id'])
188188
except (CommitError, ValidationError) as error:
189189
messages.error(request, str(error))
190190
return redirect(reverse('serverdb_changes'))

serveradmin/servershell/views.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,7 @@ def _edit(request: HttpRequest, server, edit_mode=False, template='edit'): # NO
315315
messages.info(request, str('Nothing has changed.'))
316316
else:
317317
try:
318-
commit_obj = commit_query(created, changed,
319-
user=request.user)
318+
commit_obj, _ = commit_query(created, changed, user=request.user)
320319
except (PermissionDenied, ValidationError) as err:
321320
messages.error(request, str(err))
322321
else:

0 commit comments

Comments
 (0)