476 lines
21 KiB
Python
476 lines
21 KiB
Python
import json
|
|
import os
|
|
import random
|
|
import shutil
|
|
import tempfile
|
|
|
|
import pytest
|
|
from django.conf import settings
|
|
from tenant_schemas.utils import tenant_context
|
|
|
|
from hobo.agent.hobo.management.commands.hobo_deploy import Command as HoboDeployCommand
|
|
from hobo.deploy.utils import get_hobo_json
|
|
from hobo.environment.models import Combo, Hobo
|
|
from hobo.multitenant.management.commands.create_hobo_tenant import Command as CreateHoboTenant
|
|
from hobo.multitenant.middleware import TenantMiddleware
|
|
|
|
|
|
def get_hobo_json_filename(tenant):
|
|
with tenant_context(tenant):
|
|
hobo_json = get_hobo_json()
|
|
json_filename = os.path.join(settings.TENANT_BASE, 'tmp%s.json' % random.random())
|
|
with open(json_filename, 'w') as fd:
|
|
json.dump(hobo_json, fd, indent=2)
|
|
return json_filename
|
|
|
|
|
|
def count_hobo_services(hobo_json):
|
|
return len([service for service in hobo_json['services'] if service['service-id'] == 'hobo'])
|
|
|
|
|
|
def assert_hobo1_service_in_hobo1(hobo_json):
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == 'hobo':
|
|
assert service['service-id'] == 'hobo'
|
|
assert service['title'] == 'Hobo'
|
|
assert service['backoffice-menu-url'] == 'https://tenant1.example.net/menu.json'
|
|
assert service['base_url'] == 'https://tenant1.example.net/'
|
|
assert service['provisionning-url'] == 'https://tenant1.example.net/__provision__/'
|
|
assert service['saml-sp-metadata-url'] == 'https://tenant1.example.net/accounts/mellon/metadata/'
|
|
assert service['secret_key'] == '7e5e1778ee87fbbcfc9f10f0978bdd9e1b74d300'
|
|
assert 'id' not in service
|
|
return
|
|
assert False, "Can't find hobo1 service"
|
|
|
|
|
|
def assert_hobo1_service_in_hobo2(hobo_json):
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == '_interco_hobo':
|
|
assert service['service-id'] == 'hobo'
|
|
assert service['title'] == 'Hobo'
|
|
assert 'backoffice-menu-url' not in service
|
|
assert service['base_url'] == 'https://tenant1.example.net/'
|
|
assert service['provisionning-url'] == 'https://tenant1.example.net/__provision__/'
|
|
assert service['saml-sp-metadata-url'] == 'https://tenant1.example.net/accounts/mellon/metadata/'
|
|
assert service['secret_key'] == '7e5e1778ee87fbbcfc9f10f0978bdd9e1b74d300'
|
|
assert 'id' in service
|
|
assert service['secondary'] is True
|
|
assert service['template_name'] == ''
|
|
assert service['variables'] == {}
|
|
return
|
|
assert False, "Can't find hobo1 service"
|
|
|
|
|
|
def assert_hobo1_service_in_hobo3(hobo_json):
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == '_interco_hobo':
|
|
assert service['service-id'] == 'hobo'
|
|
assert service['title'] == 'Hobo'
|
|
assert 'backoffice-menu-url' not in service
|
|
assert service['base_url'] == 'https://tenant1.example.net/'
|
|
assert service['provisionning-url'] == 'https://tenant1.example.net/__provision__/'
|
|
assert service['saml-sp-metadata-url'] == 'https://tenant1.example.net/accounts/mellon/metadata/'
|
|
assert service['secret_key'] == '7e5e1778ee87fbbcfc9f10f0978bdd9e1b74d300'
|
|
assert 'id' in service
|
|
assert service['secondary'] is True
|
|
assert service['template_name'] == ''
|
|
assert service['variables'] == {}
|
|
return
|
|
assert False, "Can't find hobo1 service"
|
|
|
|
|
|
def assert_hobo2_service_in_hobo1(hobo_json):
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == 'hobo-coll2':
|
|
assert service['service-id'] == 'hobo'
|
|
assert service['title'] == 'Coll2'
|
|
assert 'backoffice-menu-url' not in service
|
|
assert 'base-url' not in service
|
|
assert service['base_url'] == 'https://hobo2.example.net/'
|
|
assert service['provisionning-url'] == 'https://hobo2.example.net/__provision__/'
|
|
assert service['saml-sp-metadata-url'] == 'https://hobo2.example.net/accounts/mellon/metadata/'
|
|
assert service['secondary'] is False
|
|
assert service['template_name'] == ''
|
|
assert service['variables'] == {}
|
|
assert 'secret_key' in service
|
|
assert 'id' in service
|
|
return
|
|
assert False, "Can't find hobo2 service"
|
|
|
|
|
|
def assert_hobo2_service_in_hobo2(hobo_json):
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == 'hobo':
|
|
assert service['service-id'] == 'hobo'
|
|
assert service['title'] == 'Hobo'
|
|
assert service['backoffice-menu-url'] == 'https://hobo2.example.net/menu.json'
|
|
assert service['base_url'] == 'https://hobo2.example.net/'
|
|
assert service['provisionning-url'] == 'https://hobo2.example.net/__provision__/'
|
|
assert service['saml-sp-metadata-url'] == 'https://hobo2.example.net/accounts/mellon/metadata/'
|
|
assert 'secret_key' in service
|
|
assert 'id' not in service
|
|
return
|
|
assert False, "Can't find hobo2 service"
|
|
|
|
|
|
def assert_hobo2_service_in_hobo3(hobo_json):
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == '_interco_hobo-coll2':
|
|
assert service['service-id'] == 'hobo'
|
|
assert service['title'] == 'Coll2'
|
|
assert 'backoffice-menu-url' not in service
|
|
assert 'base-url' not in service
|
|
assert service['base_url'] == 'https://hobo2.example.net/'
|
|
assert service['provisionning-url'] == 'https://hobo2.example.net/__provision__/'
|
|
assert service['saml-sp-metadata-url'] == 'https://hobo2.example.net/accounts/mellon/metadata/'
|
|
assert service['secondary'] is True
|
|
assert service['template_name'] == ''
|
|
assert service['variables'] == {}
|
|
assert 'secret_key' in service
|
|
assert 'id' in service
|
|
return
|
|
assert False, "Can't find hobo2 service"
|
|
|
|
|
|
def assert_hobo3_service_in_hobo1(hobo_json):
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == 'hobo-coll3':
|
|
assert service['service-id'] == 'hobo'
|
|
assert service['title'] == 'Coll3'
|
|
assert 'backoffice-menu-url' not in service
|
|
assert 'base-url' not in service
|
|
assert service['base_url'] == 'https://hobo3.example.net/'
|
|
assert service['provisionning-url'] == 'https://hobo3.example.net/__provision__/'
|
|
assert service['saml-sp-metadata-url'] == 'https://hobo3.example.net/accounts/mellon/metadata/'
|
|
assert service['secondary'] is False
|
|
assert service['template_name'] == ''
|
|
assert service['variables'] == {}
|
|
assert 'secret_key' in service
|
|
assert 'id' in service
|
|
return
|
|
assert False, "Can't find hobo3 service"
|
|
|
|
|
|
def assert_hobo3_service_in_hobo2(hobo_json):
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == '_interco_hobo-coll3':
|
|
assert service['service-id'] == 'hobo'
|
|
assert service['title'] == 'Coll3'
|
|
assert 'backoffice-menu-url' not in service
|
|
assert 'base-url' not in service
|
|
assert service['base_url'] == 'https://hobo3.example.net/'
|
|
assert service['provisionning-url'] == 'https://hobo3.example.net/__provision__/'
|
|
assert service['saml-sp-metadata-url'] == 'https://hobo3.example.net/accounts/mellon/metadata/'
|
|
assert service['secondary'] is True
|
|
assert service['template_name'] == ''
|
|
assert service['variables'] == {}
|
|
assert 'secret_key' in service
|
|
assert 'id' in service
|
|
return
|
|
assert False, "Can't find hobo3 service"
|
|
|
|
|
|
def assert_hobo3_service_in_hobo3(hobo_json):
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == 'hobo':
|
|
assert service['service-id'] == 'hobo'
|
|
assert service['title'] == 'Hobo'
|
|
assert service['backoffice-menu-url'] == 'https://hobo3.example.net/menu.json'
|
|
assert service['base_url'] == 'https://hobo3.example.net/'
|
|
assert service['provisionning-url'] == 'https://hobo3.example.net/__provision__/'
|
|
assert service['saml-sp-metadata-url'] == 'https://hobo3.example.net/accounts/mellon/metadata/'
|
|
assert 'secret_key' in service
|
|
assert 'id' not in service
|
|
return
|
|
assert False, "Can't find hobo3 service"
|
|
|
|
|
|
def test_multipublik(tenants, mocker):
|
|
hobo1 = tenants[0]
|
|
hobo1.base_url = 'https://tenant1.example.net/'
|
|
with tenant_context(hobo1):
|
|
hobo_json = get_hobo_json()
|
|
assert count_hobo_services(hobo_json) == 1
|
|
assert_hobo1_service_in_hobo1(hobo_json)
|
|
|
|
hobo2 = Hobo(title='Coll2', slug='hobo-coll2', base_url='https://hobo2.example.net')
|
|
hobo2.save()
|
|
hobo_json = get_hobo_json()
|
|
assert count_hobo_services(hobo_json) == 2
|
|
assert_hobo1_service_in_hobo1(hobo_json)
|
|
assert_hobo2_service_in_hobo1(hobo_json)
|
|
|
|
hobo3 = Hobo(title='Coll3', slug='hobo-coll3', base_url='https://hobo3.example.net')
|
|
hobo3.save()
|
|
hobo_json = get_hobo_json()
|
|
assert count_hobo_services(hobo_json) == 3
|
|
assert_hobo1_service_in_hobo1(hobo_json)
|
|
assert_hobo2_service_in_hobo1(hobo_json)
|
|
assert_hobo3_service_in_hobo1(hobo_json)
|
|
|
|
combo = Combo(title='Portail', slug='portal', base_url='https://combo1.example.net')
|
|
combo.save()
|
|
assert count_hobo_services(hobo_json) == 3
|
|
assert_hobo1_service_in_hobo1(hobo_json)
|
|
assert_hobo2_service_in_hobo1(hobo_json)
|
|
assert_hobo3_service_in_hobo1(hobo_json)
|
|
|
|
# inform coll2 about interco environment
|
|
HoboDeployCommand().handle(hobo2.base_url, get_hobo_json_filename(hobo1))
|
|
|
|
hobo2 = TenantMiddleware.get_tenant_by_hostname('hobo2.example.net')
|
|
with tenant_context(hobo2):
|
|
hobo_json = get_hobo_json()
|
|
assert count_hobo_services(hobo_json) == 3
|
|
assert_hobo1_service_in_hobo2(hobo_json)
|
|
assert_hobo2_service_in_hobo2(hobo_json)
|
|
assert_hobo3_service_in_hobo2(hobo_json)
|
|
|
|
# interco combo created
|
|
assert Combo.objects.count() == 1
|
|
combo = Combo.objects.first()
|
|
assert combo.slug == '_interco_portal'
|
|
assert combo.base_url == 'https://combo1.example.net/'
|
|
assert combo.secondary is True
|
|
|
|
assert Hobo.objects.count() == 3
|
|
# interco hobo
|
|
hobo = Hobo.objects.get(slug='_interco_hobo')
|
|
assert hobo.title == 'Hobo'
|
|
assert hobo.base_url == 'https://tenant1.example.net/'
|
|
assert hobo.secondary is True
|
|
|
|
# coll3 Hobo
|
|
hobo = Hobo.objects.get(slug='_interco_hobo-coll3')
|
|
assert hobo.title == 'Coll3'
|
|
assert hobo.base_url == 'https://hobo3.example.net/'
|
|
assert hobo.secondary is True
|
|
|
|
# notify_agents will be called for secondary services: as celery
|
|
# is not running we just block it
|
|
mocker.patch('hobo.agent.hobo.management.commands.hobo_deploy.notify_agents')
|
|
|
|
hobo2 = TenantMiddleware.get_tenant_by_hostname('hobo2.example.net')
|
|
hobo2.base_url = 'https://hobo2.example.net/'
|
|
with tenant_context(hobo2):
|
|
combo = Combo(title='Portail', slug='portal', base_url='https://combo2.example.net')
|
|
combo.save()
|
|
|
|
# inform interco about coll2 environment
|
|
HoboDeployCommand().handle(hobo1.base_url, get_hobo_json_filename(hobo2))
|
|
|
|
with tenant_context(hobo1):
|
|
assert Combo.objects.filter(secondary=True).count() == 1
|
|
assert Combo.objects.filter(secondary=False).count() == 1
|
|
|
|
# coll2 hobo
|
|
combo = Combo.objects.get(secondary=True)
|
|
assert combo.slug == '_hobo-coll2_portal'
|
|
assert combo.title == 'Portail'
|
|
assert combo.base_url == 'https://combo2.example.net/'
|
|
|
|
# interco environment has changed (secondary Combo coming from coll2)
|
|
# inform coll2 about interco environment and check that nothing changes
|
|
# (no service creation recursion)
|
|
HoboDeployCommand().handle(hobo2.base_url, get_hobo_json_filename(hobo1))
|
|
with tenant_context(hobo2):
|
|
assert Hobo.objects.filter().count() == 3
|
|
assert Hobo.objects.filter(secondary=True).count() == 2
|
|
assert Combo.objects.filter().count() == 2
|
|
assert Combo.objects.filter(secondary=True).count() == 1
|
|
|
|
# what are we checking here ?
|
|
with tenant_context(hobo1):
|
|
assert Hobo.objects.filter(secondary=True).count() == 0
|
|
assert Combo.objects.filter(secondary=False).count() == 1
|
|
|
|
# inform coll3 about interco environment
|
|
HoboDeployCommand().handle(hobo3.base_url, get_hobo_json_filename(hobo1))
|
|
hobo3 = TenantMiddleware.get_tenant_by_hostname('hobo3.example.net')
|
|
hobo3.base_url = 'https://hobo3.example.net/'
|
|
with tenant_context(hobo3):
|
|
hobo_json = get_hobo_json()
|
|
assert count_hobo_services(hobo_json) == 3
|
|
assert_hobo1_service_in_hobo3(hobo_json)
|
|
assert_hobo2_service_in_hobo3(hobo_json)
|
|
assert_hobo3_service_in_hobo3(hobo_json)
|
|
|
|
# interco combo created
|
|
assert Combo.objects.count() == 1
|
|
combo = Combo.objects.first()
|
|
assert combo.slug == '_interco_portal'
|
|
assert combo.base_url == 'https://combo1.example.net/'
|
|
assert combo.secondary is True
|
|
|
|
assert Hobo.objects.count() == 3
|
|
# interco hobo
|
|
hobo = Hobo.objects.get(slug='_interco_hobo')
|
|
assert hobo.title == 'Hobo'
|
|
assert hobo.base_url == 'https://tenant1.example.net/'
|
|
assert hobo.secondary is True
|
|
|
|
# coll2 Hobo
|
|
hobo = Hobo.objects.get(slug='_interco_hobo-coll2')
|
|
assert hobo.title == 'Coll2'
|
|
assert hobo.base_url == 'https://hobo2.example.net/'
|
|
assert hobo.secondary is True
|
|
|
|
# Add a portal in coll3
|
|
combo = Combo(title='Portail', slug='portal', base_url='https://combo3.example.net')
|
|
combo.save()
|
|
|
|
# inform interco about coll3 environment
|
|
HoboDeployCommand().handle(hobo1.base_url, get_hobo_json_filename(hobo3))
|
|
|
|
with tenant_context(hobo1):
|
|
assert Combo.objects.filter(secondary=True).count() == 2
|
|
assert Combo.objects.filter(secondary=False).count() == 1
|
|
# coll3 Combo
|
|
combo = Combo.objects.get(slug='_hobo-coll3_portal')
|
|
assert combo.title == 'Portail'
|
|
assert combo.base_url == 'https://combo3.example.net/'
|
|
assert combo.secondary is True
|
|
|
|
# inform coll2 about interco environment
|
|
# nothing changed, coll2 does not care about secondary services in interco
|
|
HoboDeployCommand().handle(hobo2.base_url, get_hobo_json_filename(hobo1))
|
|
with tenant_context(hobo2):
|
|
assert Combo.objects.filter(secondary=True).count() == 1
|
|
assert Combo.objects.filter(secondary=False).count() == 1
|
|
|
|
# inform coll2 about coll3 environment
|
|
# nothing changed, coll2 does not have to know anything about coll3
|
|
# (except its hobo, which is a primary service in interco)
|
|
HoboDeployCommand().handle(hobo2.base_url, get_hobo_json_filename(hobo3))
|
|
with tenant_context(hobo2):
|
|
assert Combo.objects.filter(secondary=True).count() == 1
|
|
assert Combo.objects.filter(secondary=False).count() == 1
|
|
|
|
# check hobo secret keys
|
|
with tenant_context(hobo1):
|
|
hobo_secret_keys = {
|
|
hobo1.base_url: Hobo.objects.filter(base_url=hobo1.base_url)[0].secret_key,
|
|
hobo2.base_url: Hobo.objects.filter(base_url=hobo2.base_url)[0].secret_key,
|
|
hobo3.base_url: Hobo.objects.filter(base_url=hobo3.base_url)[0].secret_key,
|
|
}
|
|
for hobo in (hobo2, hobo3):
|
|
with tenant_context(hobo):
|
|
for hobo_instance in Hobo.objects.all():
|
|
assert hobo_instance.secret_key == hobo_secret_keys.get(hobo_instance.base_url)
|
|
|
|
# URL change in interco portal
|
|
with tenant_context(hobo1):
|
|
combo = Combo.objects.get(slug='portal')
|
|
assert combo.base_url == 'https://combo1.example.net/'
|
|
combo.change_base_url('https://new-combo1.example.net')
|
|
combo.save()
|
|
|
|
# check the interco hobo json
|
|
hobo_json = get_hobo_json()
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == 'portal':
|
|
assert service['base_url'] == 'https://new-combo1.example.net/'
|
|
assert len(service['legacy_urls']) == 1
|
|
assert service['legacy_urls'][0]['base_url'] == 'https://combo1.example.net/'
|
|
break
|
|
else:
|
|
assert False, "no portal found"
|
|
|
|
# inform coll2 about interco environment
|
|
HoboDeployCommand().handle(hobo2.base_url, get_hobo_json_filename(hobo1))
|
|
with tenant_context(hobo2):
|
|
# no extra combo created in coll 2
|
|
assert Combo.objects.filter().count() == 2
|
|
# interco portal url changed
|
|
combo = Combo.objects.get(slug='_interco_portal')
|
|
assert combo.base_url == 'https://new-combo1.example.net/'
|
|
assert len(combo.legacy_urls) == 1
|
|
assert combo.legacy_urls[0]['base_url'] == 'https://combo1.example.net/'
|
|
|
|
# inform coll2 about interco environment a second time, check that nothing changes
|
|
HoboDeployCommand().handle(hobo2.base_url, get_hobo_json_filename(hobo1))
|
|
with tenant_context(hobo2):
|
|
assert Combo.objects.filter().count() == 2
|
|
combo = Combo.objects.get(slug='_interco_portal')
|
|
assert combo.base_url == 'https://new-combo1.example.net/'
|
|
assert len(combo.legacy_urls) == 1
|
|
assert combo.legacy_urls[0]['base_url'] == 'https://combo1.example.net/'
|
|
|
|
# URL change in coll2 portal
|
|
with tenant_context(hobo2):
|
|
combo = Combo.objects.get(slug='portal')
|
|
assert combo.base_url == 'https://combo2.example.net/'
|
|
combo.change_base_url('https://new-combo2.example.net')
|
|
combo.save()
|
|
|
|
# check the coll2 hobo json
|
|
hobo_json = get_hobo_json()
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == 'portal':
|
|
assert service['base_url'] == 'https://new-combo2.example.net/'
|
|
assert len(service['legacy_urls']) == 1
|
|
assert service['legacy_urls'][0]['base_url'] == 'https://combo2.example.net/'
|
|
break
|
|
else:
|
|
assert False, "no portal found"
|
|
|
|
# inform interco about coll2 environment
|
|
HoboDeployCommand().handle(hobo1.base_url, get_hobo_json_filename(hobo2))
|
|
with tenant_context(hobo1):
|
|
# no extra combo created in interco
|
|
assert Combo.objects.filter().count() == 3
|
|
# coll2 portal url changed
|
|
combo = Combo.objects.get(slug='_hobo-coll2_portal')
|
|
assert combo.base_url == 'https://new-combo2.example.net/'
|
|
assert len(combo.legacy_urls) == 1
|
|
assert combo.legacy_urls[0]['base_url'] == 'https://combo2.example.net/'
|
|
|
|
# URL change on the primary hobo
|
|
with tenant_context(hobo1):
|
|
hobo = Hobo.objects.get(slug='hobo')
|
|
assert hobo.base_url == 'https://tenant1.example.net/'
|
|
hobo.change_base_url('https://new-tenant1.example.net')
|
|
hobo.save()
|
|
|
|
# check the interco hobo json
|
|
hobo_json = get_hobo_json()
|
|
for service in hobo_json['services']:
|
|
if service['slug'] == 'hobo':
|
|
assert service['base_url'] == 'https://new-tenant1.example.net/'
|
|
assert len(service['legacy_urls']) == 1
|
|
assert service['legacy_urls'][0]['base_url'] == 'https://tenant1.example.net/'
|
|
break
|
|
else:
|
|
assert False, 'no hobo found'
|
|
|
|
# inform coll2 about interco environment
|
|
HoboDeployCommand().handle(hobo2.base_url, get_hobo_json_filename(hobo1))
|
|
with tenant_context(hobo2):
|
|
# no extra hobo created in coll 2
|
|
assert Hobo.objects.count() == 3
|
|
# interco hobo url changed
|
|
hobo = Hobo.objects.get(slug='_interco_hobo')
|
|
assert hobo.base_url == 'https://new-tenant1.example.net/'
|
|
assert len(hobo.legacy_urls) == 1
|
|
assert hobo.legacy_urls[0]['base_url'] == 'https://tenant1.example.net/'
|
|
|
|
# URL change on coll2 hobo (initiated by the interco tenant)
|
|
with tenant_context(hobo1):
|
|
hobo2 = Hobo.objects.get(slug='hobo-coll2')
|
|
assert hobo2.base_url == 'https://hobo2.example.net/'
|
|
hobo2.change_base_url('https://new-hobo2.example.net')
|
|
hobo2.save()
|
|
|
|
# inform coll2 about interco environment
|
|
HoboDeployCommand().handle(hobo2.base_url, get_hobo_json_filename(hobo1))
|
|
|
|
hobo2 = TenantMiddleware.get_tenant_by_hostname('new-hobo2.example.net')
|
|
with tenant_context(hobo2):
|
|
# no extra hobo created in coll 2
|
|
assert Hobo.objects.count() == 3
|
|
# coll2 hobo url changed
|
|
hobo = Hobo.objects.get(slug='hobo')
|
|
assert hobo.base_url == 'https://new-hobo2.example.net/'
|
|
assert len(hobo.legacy_urls) == 1
|
|
assert hobo.legacy_urls[0]['base_url'] == 'https://hobo2.example.net/'
|