Projet

Général

Profil

0001-matomo-manage-secondary-instances-37576.patch

Nicolas Roche, 12 novembre 2019 19:00

Télécharger (14,9 ko)

Voir les différences:

Subject: [PATCH] matomo: manage secondary instances (#37576)

 hobo/matomo/utils.py       |  24 ++++--
 tests/test_matomo_utils.py | 148 ++++++++++++++++++++++++++++++++++---
 tests/test_matomo_views.py |  10 ++-
 3 files changed, 164 insertions(+), 18 deletions(-)
hobo/matomo/utils.py
89 89
def get_tenant_name_and_public_urls():
90 90
    """get an alias for our matomo's id and urls to monitor"""
91 91
    tenant_name = None
92
    services = [x for x in Combo.objects.all() if 'portal-user' in x.template_name]
92
    services = [x for x in Combo.objects.all()
93
                if 'portal-user' in x.template_name and not x.secondary]
93 94
    if services != [] and services[0] != '':
94 95
        tenant_name = urlparse.urlparse(services[0].base_url).netloc
95
    services += [x for x in Wcs.objects.all()]
96
    services += [x for x in Fargo.objects.all()]
96
    services += [x for x in Wcs.objects.all() if not x.secondary]
97
    services += [x for x in Fargo.objects.all() if not x.secondary]
97 98
    site_urls = [x.base_url for x in services if x.base_url != '']
98 99
    return tenant_name, site_urls
99 100

  
......
177 178
            raise MatomoException('get_site_id_from_site_url fails')
178 179
        return tag.text
179 180

  
180
    def add_site(self, site_name, site_urls):
181
    def add_site(self, site_name):
181 182
        data = {'method': 'SitesManager.addSite',
182 183
                'siteName': site_name}
184
        tree = self.call(data)
185
        try:
186
            tag = tree.xpath('/result')[0]
187
        except IndexError:
188
            raise MatomoException('add_site fails')
189
        return tag.text
190

  
191
    def add_site_alias_urls(self, id_site, site_urls):
192
        data = {'method': 'SitesManager.addSiteAliasUrls',
193
                'idSite': id_site}
183 194
        cpt = 0
184 195
        for url in site_urls:
185 196
            key = 'urls[%i]' % cpt
......
189 200
        try:
190 201
            tag = tree.xpath('/result')[0]
191 202
        except IndexError:
192
            raise MatomoException('add_site fails')
203
            raise MatomoException('add_site_alias_urls fails')
193 204
        return tag.text
194 205

  
195 206
    def add_user(self, user_login, password, initial_id_site):
......
246 257
        id_site = matomo.get_site_id_from_site_url(tenant_name)
247 258
    except MatomoError as exc:
248 259
        if str(exc) == 'url not found':
249
            id_site = matomo.add_site(tenant_name, site_urls)
260
            id_site = matomo.add_site(tenant_name)
250 261
        else:
251 262
            raise exc
263
    matomo.add_site_alias_urls(id_site, site_urls)
252 264
    return id_site
253 265

  
254 266
def upgrade_user(matomo, user_login, id_site):
tests/test_matomo_utils.py
87 87
<not_result>no result tag</not_result>
88 88
"""
89 89

  
90
ADD_SITE_ALIAS_URLS_SUCCESS = """<?xml version="1.0" encoding="utf-8" ?>
91
<result>1</result>
92
"""
93

  
94
ADD_SITE_ALIAS_URLS_ERROR = """<?xml version="1.0" encoding="utf-8" ?>
95
<result>
96
        <error message="Merci de specifier une valeur pour idSite" />
97
</result>
98
"""
99

  
90 100
USER_ALREADY_THERE = """<?xml version="1.0" encoding="utf-8" ?>
91 101
<result>
92 102
    <error message="Username 'hobo.dev.publik.love' already exists." />
......
220 230
                         'https://wcs.dev.publik.love/',
221 231
                         'https://fargo.dev.publik.love/']
222 232

  
233
def test_get_tenant_name_and_public_urls_on_primary():
234
    Hobo.objects.create(base_url='https://hobo.ville1.love',
235
                        slug='hobo-ville1')
236
    Hobo.objects.create(base_url='https://hobo.ville2.love',
237
                        slug='hobo-ville2')
238
    Combo.objects.create(base_url='https://combo.agglo.love',
239
                         template_name='...portal-user...',
240
                         slug='portal')
241
    Combo.objects.create(base_url='https://combo.ville1.love',
242
                         template_name='...portal-user...',
243
                         slug='_hobo-ville1_portal',
244
                         secondary=True)
245
    Combo.objects.create(base_url='https://combo.ville2.love',
246
                         template_name='...portal-user...',
247
                         slug='_hobo-ville2_portal',
248
                         secondary=True)
249
    Combo.objects.create(base_url='https://agent-combo.agglo.love',
250
                         template_name='...portal-agent...',
251
                         slug='portal-agent')
252
    Combo.objects.create(base_url='https://agent-combo.ville1.love',
253
                         template_name='...portal-agent...',
254
                         slug='_hobo-ville1_portal-agent',
255
                         secondary=True)
256
    Combo.objects.create(base_url='https://agent-combo.ville2.love',
257
                         template_name='...portal-agent...',
258
                         slug='_hobo-ville2_portal-agent',
259
                         secondary=True)
260
    Wcs.objects.create(base_url='https://wcs.agglo.love',
261
                       slug='eservices')
262
    Wcs.objects.create(base_url='https://wcs.ville1.love',
263
                       slug='_hobo-ville1_eservices',
264
                       secondary=True)
265
    Wcs.objects.create(base_url='https://wcs.ville2.love',
266
                       slug='_hobo-ville2_eservices',
267
                       secondary=True)
268
    Fargo.objects.create(base_url='https://fargo.agglo.love',
269
                         slug='porte-doc')
270
    Fargo.objects.create(base_url='https://fargo.ville1.love',
271
                         slug='_hobo-ville1_porte-doc',
272
                         secondary=True)
273
    Fargo.objects.create(base_url='https://fargo.ville2.love',
274
                         slug='_hobo-ville2_porte-doc',
275
                         secondary=True)
276

  
277
    tenant_name, site_urls = get_tenant_name_and_public_urls()
278
    assert tenant_name == 'combo.agglo.love'
279
    assert site_urls == ['https://combo.agglo.love/',
280
                         'https://wcs.agglo.love/',
281
                         'https://fargo.agglo.love/']
282

  
283
def test_get_tenant_name_and_public_urls_on_secondary():
284
    Hobo.objects.create(base_url='https://hobo.agglo.love',
285
                        slug='_interco_hobo')
286
    Hobo.objects.create(base_url='https://hobo.ville1.love',
287
                        slug='_interco_hobo-ville1')
288
    Hobo.objects.create(base_url='https://hobo.ville2.love',
289
                        slug='_interco_hobo-ville2')
290
    Combo.objects.create(base_url='https://combo.agglo.love',
291
                         template_name='...portal-user...',
292
                         slug='_interco_portal',
293
                         secondary=True)
294
    Combo.objects.create(base_url='https://combo.ville2.love',
295
                         template_name='...portal-user...',
296
                         slug='portal')
297
    Combo.objects.create(base_url='https://agent-combo.agglo.love',
298
                         template_name='...portal-agent...',
299
                         slug='_interco_portal-agent',
300
                         secondary=True)
301
    Combo.objects.create(base_url='https://agent-combo.ville2.love',
302
                         template_name='...portal-agent...',
303
                         slug='portal-agent')
304
    Wcs.objects.create(base_url='https://wcs.agglo.love',
305
                       slug='_interco_eservices',
306
                       secondary=True)
307
    Wcs.objects.create(base_url='https://wcs.ville2.love',
308
                       slug='eservices')
309
    Fargo.objects.create(base_url='https://fargo.agglo.love',
310
                         slug='_interco_porte-doc',
311
                         secondary=True)
312
    Fargo.objects.create(base_url='https://fargo.ville2.love',
313
                         slug='porte-doc')
314

  
315
    tenant_name, site_urls = get_tenant_name_and_public_urls()
316
    assert tenant_name == 'combo.ville2.love'
317
    assert site_urls == ['https://combo.ville2.love/',
318
                         'https://wcs.ville2.love/',
319
                         'https://fargo.ville2.love/']
320

  
223 321
def test_matomo_constructor():
224 322
    """build the matomo webservice object"""
225 323
    with override_settings(MATOMO_SERVER=CONFIG):
......
352 450
def test_add_site(mocked_post):
353 451
    """webservice to add a new site"""
354 452
    mocked_post.return_value.status_code = 200
355
    urls = ['https://combo.dev.publik.love',
356
            'https://wcs.dev.publik.love']
357 453
    with override_settings(MATOMO_SERVER=CONFIG):
358 454
        matomo = MatomoWS()
359 455

  
360 456
        # success
361 457
        content = ADD_SITE_SUCCESS
362 458
        mocked_post.return_value.content = content
363
        site_id = matomo.add_site("hobo.dev.publik.love", urls)
459
        site_id = matomo.add_site("hobo.dev.publik.love")
364 460
        assert site_id == '42'
365 461

  
366 462
        # error
......
368 464
        mocked_post.return_value.content = content
369 465
        with pytest.raises(MatomoError,
370 466
                           match="Please specify a value for 'siteName'."):
371
            site_id = matomo.add_site("hobo.dev.publik.love", urls)
467
            site_id = matomo.add_site("hobo.dev.publik.love")
372 468

  
373 469
        # strange message
374 470
        content = ADD_SITE_BAD_RESPONSE
375 471
        mocked_post.return_value.content = content
376 472
        with pytest.raises(MatomoException, match='add_site fails'):
377
            site_id = matomo.add_site("hobo.dev.publik.love", urls)
473
            site_id = matomo.add_site("hobo.dev.publik.love")
474

  
475
@mock.patch('requests.post')
476
def test_add_site_alias_url(mocked_post):
477
    """webservice to add a new site"""
478
    mocked_post.return_value.status_code = 200
479
    urls = ['https://combo.dev.publik.love',
480
            'https://wcs.dev.publik.love']
481
    with override_settings(MATOMO_SERVER=CONFIG):
482
        matomo = MatomoWS()
483

  
484
        # success
485
        content = ADD_SITE_ALIAS_URLS_SUCCESS
486
        mocked_post.return_value.content = content
487
        site_id = matomo.add_site_alias_urls('42', urls)
488
        assert site_id == '1'
489

  
490
        # error
491
        content = ADD_SITE_ALIAS_URLS_ERROR
492
        mocked_post.return_value.content = content
493
        with pytest.raises(MatomoError,
494
                           match="Merci de specifier une valeur pour idSite"):
495
            site_id = matomo.add_site_alias_urls(None, urls)
496

  
497
        # strange message
498
        content = ADD_SITE_BAD_RESPONSE
499
        mocked_post.return_value.content = content
500
        with pytest.raises(MatomoException, match='add_site_alias_urls fails'):
501
            site_id = matomo.add_site_alias_urls('42', urls)
378 502

  
379 503
@mock.patch('requests.post')
380 504
def test_add_user(mocked_post):
......
525 649
        matomo = MatomoWS()
526 650

  
527 651
        # site not already here
528
        contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS]
652
        contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS, ADD_SITE_ALIAS_URLS_SUCCESS]
529 653
        mocked_post.side_effect = requests_post_mocked_replies(contents)
530 654
        site_id = upgrade_site(matomo, "hobo.dev.publik.love", urls)
531 655
        assert site_id == '42'
532 656

  
533 657
        # site already here
534
        contents = [GET_SITE_42_FROM_URL]
658
        contents = [GET_SITE_42_FROM_URL, ADD_SITE_ALIAS_URLS_SUCCESS]
535 659
        mocked_post.side_effect = requests_post_mocked_replies(contents)
536 660
        site_id = upgrade_site(matomo, "hobo.dev.publik.love", urls)
537 661
        assert site_id == '42'
538 662

  
663
        # error while updating urls
664
        contents = [GET_SITE_42_FROM_URL, ADD_SITE_ALIAS_URLS_ERROR]
665
        mocked_post.side_effect = requests_post_mocked_replies(contents)
666
        with pytest.raises(MatomoException):
667
            upgrade_site(matomo, "hobo.dev.publik.love", urls)
668

  
539 669
        # error while adding new site
540 670
        contents = [GET_NO_SITE_FROM_URL, MATOMO_ERROR]
541 671
        mocked_post.side_effect = requests_post_mocked_replies(contents)
......
663 793
    Fargo.objects.create(base_url='https://fargo.dev.publik.love')
664 794

  
665 795
    with override_settings(MATOMO_SERVER=CONFIG):
666
        contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS,
796
        contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS, ADD_SITE_ALIAS_URLS_SUCCESS,
667 797
                    DEL_UNKNOWN_USER, MATOMO_SUCCESS,
668 798
                    JAVASCRIPT_TAG, PING_SUCCESS]
669 799
        mocked_post.side_effect = requests_post_mocked_replies(contents)
......
696 826
    Fargo.objects.create(base_url='https://fargo.dev.publik.love')
697 827

  
698 828
    with override_settings(MATOMO_SERVER=CONFIG):
699
        contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS,
829
        contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS, ADD_SITE_ALIAS_URLS_SUCCESS,
700 830
                    DEL_UNKNOWN_USER, MATOMO_SUCCESS,
701 831
                    JAVASCRIPT_TAG_BAD_RESPONSE]
702 832
        mocked_post.side_effect = requests_post_mocked_replies(contents)
tests/test_matomo_views.py
28 28
<result>42</result>
29 29
"""
30 30

  
31
ADD_SITE_ALIAS_URLS_SUCCESS = """<?xml version="1.0" encoding="utf-8" ?>
32
<result>1</result>
33
"""
34

  
31 35
DEL_UNKNOWN_USER = """<?xml version="1.0" encoding="utf-8" ?>
32 36
<result>
33 37
        <error message="User 'hobo.dev.publik.love' doesn't exist." />
......
161 165
    Wcs.objects.create(base_url='https://wcs.dev.publik.love')
162 166
    Fargo.objects.create(base_url='https://fargo.dev.publik.love')
163 167

  
164
    contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS,
168
    contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS, ADD_SITE_ALIAS_URLS_SUCCESS,
165 169
                DEL_UNKNOWN_USER, MATOMO_SUCCESS,
166 170
                JAVASCRIPT_TAG, PING_SUCCESS]
167 171

  
......
185 189
    Wcs.objects.create(base_url='https://wcs.dev.publik.love')
186 190
    Fargo.objects.create(base_url='https://fargo.dev.publik.love')
187 191

  
188
    contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS,
192
    contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS, ADD_SITE_ALIAS_URLS_SUCCESS,
189 193
                DEL_UNKNOWN_USER, MATOMO_SUCCESS,
190 194
                JAVASCRIPT_TAG, PING_ERROR]
191 195

  
......
212 216
    Wcs.objects.create(base_url='https://wcs.dev.publik.love')
213 217
    Fargo.objects.create(base_url='https://fargo.dev.publik.love')
214 218

  
215
    contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS,
219
    contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS, ADD_SITE_ALIAS_URLS_SUCCESS,
216 220
                DEL_UNKNOWN_USER, MATOMO_SUCCESS,
217 221
                JAVASCRIPT_TAG_BAD_RESPONSE]
218 222

  
219
-