Projet

Général

Profil

0001-hobo-agent-index-the-common-Role.uuid-column-and-use.patch

Pierre Ducroquet, 07 juin 2022 16:34

Télécharger (19,4 ko)

Voir les différences:

Subject: [PATCH] hobo agent: index the common::Role.uuid column and use uuid
 type (#66011)

 .../common/migrations/0004_alter_role_uuid.py | 18 +++++
 hobo/agent/common/models.py                   |  2 +-
 hobo/provisionning/utils.py                   |  4 +-
 tests_multitenant/test_hobo_notify.py         | 81 ++++++++++---------
 4 files changed, 67 insertions(+), 38 deletions(-)
 create mode 100644 hobo/agent/common/migrations/0004_alter_role_uuid.py
hobo/agent/common/migrations/0004_alter_role_uuid.py
1
# Generated by Django 3.2.13 on 2022-06-07 09:01
2

  
3
from django.db import migrations, models
4

  
5

  
6
class Migration(migrations.Migration):
7

  
8
    dependencies = [
9
        ('common', '0003_auto_20200707_1656'),
10
    ]
11

  
12
    operations = [
13
        migrations.AlterField(
14
            model_name='role',
15
            name='uuid',
16
            field=models.UUIDField(db_index=True),
17
        ),
18
    ]
hobo/agent/common/models.py
4 4

  
5 5

  
6 6
class Role(Group):
7
    uuid = models.CharField(max_length=32)
7
    uuid = models.UUIDField(db_index=True)
8 8
    description = models.TextField(default=u'')
9 9
    details = models.TextField(default=u'')
10 10
    emails = ArrayField(models.CharField(max_length=128), default=list)
hobo/provisionning/utils.py
16 16

  
17 17
import hashlib
18 18
import logging
19
from uuid import UUID
19 20

  
20 21
from django.contrib.auth.models import Group
21 22
from django.db import IntegrityError
......
172 173
            target_uuids = set()
173 174
            for o in data:
174 175
                assert 'uuid' in o
175
                target_uuids.add(o['uuid'])
176
                target_uuids.add(UUID(o['uuid']))
176 177
            for role in Role.objects.filter(uuid__in=target_uuids):
177 178
                roles_by_uuid[role.uuid] = role
178 179

  
179 180
        for o in data:
180 181
            assert 'uuid' in o
182
            o['uuid'] = UUID(o['uuid'])
181 183
            uuids.add(o['uuid'])
182 184
            if action == 'provision':
183 185
                created = False
tests_multitenant/test_hobo_notify.py
1 1
# -*- coding: utf-8 -*-
2 2

  
3 3
import logging
4
from uuid import UUID
4 5

  
5 6
import pytest
6 7
from django.db import connection
......
26 27
                    u'@type': 'role',
27 28
                    u'data': [
28 29
                        {
29
                            u'uuid': u'12345',
30
                            u'uuid': u'7b347080-0d38-4ffa-8407-63734610fc45',
30 31
                            u'name': u'Service petite enfance',
31 32
                            u'slug': u'service-petite-enfance',
32 33
                            u'description': u'Role du service petite enfance %s' % tenant.domain_url,
......
48 49
                    u'@type': 'role',
49 50
                    u'data': [
50 51
                        {
51
                            u'uuid': u'12345',
52
                            u'uuid': u'7b347080-0d38-4ffa-8407-63734610fc45',
52 53
                            u'name': u'Service petite enfance',
53 54
                            u'slug': u'service-petite-enfance',
54 55
                            u'description': u'Role du service petite enfance %s' % tenant.domain_url,
......
63 64
            assert Group.objects.count() == 1
64 65
            assert Role.objects.count() == 1
65 66
            role = Role.objects.get()
66
            assert role.uuid == u'12345'
67
            assert role.uuid == UUID('7b347080-0d38-4ffa-8407-63734610fc45')
67 68
            assert role.name == u'Service petite enfance'
68 69
            assert role.description == u'Role du service petite enfance %s' % tenant.domain_url
69 70
            assert role.details == u'Some details'
......
81 82
                    u'@type': 'role',
82 83
                    u'data': [
83 84
                        {
84
                            u'uuid': u'xyz',
85
                            u'uuid': u'10d8ecbd-116a-464f-96c5-f8507daa5c2c',
85 86
                            u'name': u'Service état civil',
86 87
                            u'slug': u'service-etat-civil',
87 88
                            u'description': u'Role du service état civil %s' % tenant.domain_url,
......
93 94
            assert Group.objects.count() == 1
94 95
            assert Role.objects.count() == 1
95 96
            role = Role.objects.get()
96
            assert role.uuid == u'xyz'
97
            assert role.uuid == UUID('10d8ecbd-116a-464f-96c5-f8507daa5c2c')
97 98
            assert role.name == u'Service état civil'
98 99
            assert role.description == u'Role du service état civil %s' % tenant.domain_url
99 100

  
......
107 108
                    u'@type': 'role',
108 109
                    u'data': [
109 110
                        {
110
                            u'uuid': u'xyz',
111
                            u'uuid': u'10d8ecbd-116a-464f-96c5-f8507daa5c2c',
111 112
                            u'name': u'Service état civil',
112 113
                            u'slug': u'service-etat-civil',
113 114
                            u'description': u'Role du service état civil %s' % tenant.domain_url,
......
129 130
                    u'@type': 'role',
130 131
                    u'data': [
131 132
                        {
132
                            u'uuid': u'12345',
133
                            u'uuid': u'7b347080-0d38-4ffa-8407-63734610fc45',
133 134
                            u'name': u'Service petite enfance',
134 135
                            u'slug': u'service-petite-enfance',
135 136
                            u'description': u'Role du service petite enfance %s' % tenant.domain_url,
......
148 149
                    u'@type': 'role',
149 150
                    u'data': [
150 151
                        {
151
                            u'uuid': u'12345',
152
                            u'uuid': u'7b347080-0d38-4ffa-8407-63734610fc45',
152 153
                            u'name': u'Service petite enfance2',
153 154
                            u'slug': u'service-petite-enfance2',
154 155
                            u'description': u'Role du service petite enfance %s' % tenant.domain_url,
......
168 169
                    u'@type': 'role',
169 170
                    u'data': [
170 171
                        {
171
                            u'uuid': u'xyz',
172
                            u'uuid': u'7b347080-0d38-4ffa-8407-63734610fc45',
172 173
                            u'name': u'Service petite enfance2',
173 174
                            u'slug': u'service-petite-enfance2',
174 175
                            u'description': u'Role du service petite enfance %s' % tenant.domain_url,
......
181 182
            assert Role.objects.count() == 1
182 183
            assert Role.objects.get().uuid == notification['objects']['data'][0]['uuid']
183 184
            # test error on collision
184
            Role.objects.create(uuid='12345', name='Foo', description='foo')
185
            Role.objects.create(uuid='1f5beb43-5297-468e-ae79-e32ead8495b4', name='Foo', description='foo')
185 186
            assert Role.objects.count() == 2
186 187
            notification = {
187 188
                u'@type': u'provision',
......
190 191
                    u'@type': 'role',
191 192
                    u'data': [
192 193
                        {
193
                            u'uuid': u'12345',
194
                            u'uuid': u'1f5beb43-5297-468e-ae79-e32ead8495b4',
194 195
                            u'name': u'Service petite enfance2',
195 196
                            u'slug': u'service-petite-enfance2',
196 197
                            u'description': u'Role du service petite enfance %s' % tenant.domain_url,
......
201 202
            Command.process_notification(tenant, notification)
202 203
            assert Group.objects.count() == 2
203 204
            assert Role.objects.count() == 2
204
            assert Role.objects.filter(uuid='12345', name=u'Service petite enfance').count() == 0
205
            assert (
206
                Role.objects.filter(
207
                    uuid='7b347080-0d38-4ffa-8407-63734610fc45', name=u'Service petite enfance'
208
                ).count()
209
                == 0
210
            )
205 211
            assert caplog.records[-1].levelno == logging.ERROR
206 212
            assert caplog.records[-1].msg.startswith('cannot provision')
207
            assert caplog.records[-1].args == (u'Service petite enfance2', u'12345')
213
            assert caplog.records[-1].args == (
214
                u'Service petite enfance2',
215
                UUID('1f5beb43-5297-468e-ae79-e32ead8495b4'),
216
            )
208 217

  
209 218

  
210 219
def test_hobo_notify_roles_db_queries(caplog, tenants):
......
224 233
                    '@type': 'role',
225 234
                    'data': [
226 235
                        {
227
                            'uuid': '12345',
236
                            'uuid': '2e3c6110-34ec-4466-b8da-15ad84e3a141',
228 237
                            'name': 'Service petite enfance',
229 238
                            'slug': 'service-petite-enfance',
230 239
                            'description': 'Role du service petite enfance %s' % tenant.domain_url,
......
233 242
                            'emails_to_members': False,
234 243
                        },
235 244
                        {
236
                            'uuid': '6789',
245
                            'uuid': '60ba0310-12e9-461d-bb7c-ffabf6654a40',
237 246
                            'name': 'Autre service',
238 247
                            'slug': 'autre service',
239 248
                            'description': "Role d'un autre service petite enfance %s" % tenant.domain_url,
......
258 267
                    '@type': 'role',
259 268
                    'data': [
260 269
                        {
261
                            'uuid': '12sed45',
270
                            'uuid': 'dbb108f3-7349-4345-9b59-3d372c035cc9',
262 271
                            'name': 'Le dernier service',
263 272
                            'slug': 'le-dernier-service',
264 273
                            'description': '',
......
282 291
                    '@type': 'role',
283 292
                    'data': [
284 293
                        {
285
                            'uuid': '12345',
294
                            'uuid': '2e3c6110-34ec-4466-b8da-15ad84e3a141',
286 295
                            'name': 'Service petite enfance',
287 296
                            'slug': 'service-petite-enfance',
288 297
                            'description': 'Role du service petite enfance %s' % tenant.domain_url,
......
291 300
                            'emails_to_members': False,
292 301
                        },
293 302
                        {
294
                            'uuid': '6789',
303
                            'uuid': '60ba0310-12e9-461d-bb7c-ffabf6654a40',
295 304
                            'name': 'Autre service',
296 305
                            'slug': 'autre service',
297 306
                            'description': "Role d'un autre service petite enfance %s" % tenant.domain_url,
......
313 322
                    '@type': 'role',
314 323
                    'data': [
315 324
                        {
316
                            'uuid': '12sed45',
325
                            'uuid': 'dbb108f3-7349-4345-9b59-3d372c035cc9',
317 326
                            'name': 'Le dernier service',
318 327
                            'slug': 'le-dernier-service',
319 328
                            'description': '',
320 329
                        },
321 330
                        {
322
                            'uuid': '12345',
331
                            'uuid': '2e3c6110-34ec-4466-b8da-15ad84e3a141',
323 332
                            'name': 'Service petite enfance',
324 333
                            'slug': 'service-petite-enfance',
325 334
                            'description': 'Role du service petite enfance %s' % tenant.domain_url,
......
328 337
                            'emails_to_members': False,
329 338
                        },
330 339
                        {
331
                            'uuid': '6789',
340
                            'uuid': '60ba0310-12e9-461d-bb7c-ffabf6654a40',
332 341
                            'name': 'Autre service',
333 342
                            'slug': 'autre service',
334 343
                            'description': "Role d'un autre service petite enfance %s" % tenant.domain_url,
......
364 373
                    u'@type': 'role',
365 374
                    u'data': [
366 375
                        {
367
                            u'uuid': u'12345',
376
                            u'uuid': u'beb23af6-d7c9-4ce1-b232-d859b0565296',
368 377
                            u'name': u'Service petite enfance',
369 378
                            u'slug': u'service-petite-enfance',
370 379
                            u'description': u'Role du service petite enfance %s' % tenant.domain_url,
......
376 385
            assert Group.objects.count() == 1
377 386
            assert Role.objects.count() == 1
378 387
            role = Role.objects.get()
379
            assert role.uuid == u'12345'
388
            assert role.uuid == UUID('beb23af6-d7c9-4ce1-b232-d859b0565296')
380 389
            assert role.name == u'Service petite enfance'
381 390
            assert role.description == u'Role du service petite enfance %s' % tenant.domain_url
382 391

  
......
391 400
                    u'@type': 'user',
392 401
                    u'data': [
393 402
                        {
394
                            u'uuid': u'a' * 32,
403
                            u'uuid': 'beb23af6-d7c9-4ce1-b232-d859b0565296',
395 404
                            u'first_name': u'John',
396 405
                            u'last_name': u'Doe',
397 406
                            u'email': u'john.doe@example.net',
398 407
                            u'is_superuser': False,
399 408
                            u'roles': [
400 409
                                {
401
                                    u'uuid': u'12345',
410
                                    u'uuid': u'beb23af6-d7c9-4ce1-b232-d859b0565296',
402 411
                                    u'name': u'Service petite enfance',
403 412
                                    u'description': u'etc.',
404 413
                                },
405 414
                                {
406
                                    u'uuid': u'xyz',
415
                                    u'uuid': u'c0647609-c68d-42ac-88fc-efc371163320',
407 416
                                    u'name': u'Service état civil',
408 417
                                    u'description': u'etc.',
409 418
                                },
......
417 426
            assert Role.objects.count() == 1
418 427
            assert Group.objects.count() == 1
419 428
            user = User.objects.get()
420
            assert user.username == 'a' * 32
429
            assert user.username == 'beb23af6-d7c9-4ce1-b232-d859b0565296'
421 430
            assert user.first_name == 'John'
422 431
            assert user.last_name == 'Doe'
423 432
            assert user.email == 'john.doe@example.net'
......
426 435
            assert user.saml_identifiers.count() == 1
427 436
            usi = user.saml_identifiers.get()
428 437
            assert usi.issuer.entity_id == 'http://idp.example.net/idp/saml/metadata'
429
            assert usi.name_id == 'a' * 32
438
            assert usi.name_id == 'beb23af6-d7c9-4ce1-b232-d859b0565296'
430 439
            assert user.groups.count() == 1
431 440
            group = user.groups.get()
432 441
            assert group.name == 'Service petite enfance'
433 442
            role = Role.objects.get(group_ptr=group.pk)
434
            assert role.uuid == '12345'
443
            assert role.uuid == UUID('beb23af6-d7c9-4ce1-b232-d859b0565296')
435 444

  
436 445
    # test nothing change if run a second time
437 446
    for tenant in tenants:
......
444 453
                    u'@type': 'user',
445 454
                    u'data': [
446 455
                        {
447
                            u'uuid': u'a' * 32,
456
                            u'uuid': 'beb23af6-d7c9-4ce1-b232-d859b0565296',
448 457
                            u'first_name': u'John',
449 458
                            u'last_name': u'Doe',
450 459
                            u'email': u'john.doe@example.net',
451 460
                            u'is_superuser': True,
452 461
                            u'roles': [
453 462
                                {
454
                                    u'uuid': u'12345',
463
                                    u'uuid': u'beb23af6-d7c9-4ce1-b232-d859b0565296',
455 464
                                    u'name': u'Service petite enfance',
456 465
                                    u'description': u'etc.',
457 466
                                },
458 467
                                {
459
                                    u'uuid': u'xyz',
468
                                    u'uuid': u'c0647609-c68d-42ac-88fc-efc371163320',
460 469
                                    u'name': u'Service état civil',
461 470
                                    u'description': u'etc.',
462 471
                                },
......
470 479
            assert Role.objects.count() == 1
471 480
            assert Group.objects.count() == 1
472 481
            user = User.objects.get()
473
            assert user.username == 'a' * 32
482
            assert user.username == 'beb23af6-d7c9-4ce1-b232-d859b0565296'
474 483
            assert user.first_name == 'John'
475 484
            assert user.last_name == 'Doe'
476 485
            assert user.email == 'john.doe@example.net'
......
479 488
            assert user.saml_identifiers.count() == 1
480 489
            usi = user.saml_identifiers.get()
481 490
            assert usi.issuer.entity_id == 'http://idp.example.net/idp/saml/metadata'
482
            assert usi.name_id == 'a' * 32
491
            assert usi.name_id == 'beb23af6-d7c9-4ce1-b232-d859b0565296'
483 492
            assert user.groups.count() == 1
484 493
            group = user.groups.get()
485 494
            assert group.name == 'Service petite enfance'
486 495
            role = Role.objects.get(group_ptr=group.pk)
487
            assert role.uuid == '12345'
496
            assert role.uuid == UUID('beb23af6-d7c9-4ce1-b232-d859b0565296')
488 497

  
489 498
    # test deprovision works
490 499
    for tenant in tenants:
......
497 506
                    u'@type': 'user',
498 507
                    u'data': [
499 508
                        {
500
                            u'uuid': u'a' * 32,
509
                            u'uuid': 'beb23af6-d7c9-4ce1-b232-d859b0565296',
501 510
                        }
502 511
                    ],
503 512
                },
504
-