charm-openstack-dashboard/unit_tests/test_horizon_contexts.py

1684 lines
84 KiB
Python

# Copyright 2016 Canonical Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from contextlib import contextmanager
import io
from unittest.mock import MagicMock, patch
import hooks.horizon_contexts as horizon_contexts
from unit_tests.test_utils import CharmTestCase
from operator import itemgetter
TO_PATCH = [
'config',
'relation_get',
'relation_ids',
'related_units',
'log',
'https',
'context_complete',
'local_unit',
'get_relation_ip',
'pwgen',
]
@contextmanager
def patch_open():
'''Patch open() to allow mocking both open() itself and the file that is
yielded.
Yields the mock for "open" and "file", respectively.'''
mock_open = MagicMock(spec=open)
mock_file = MagicMock(spec=io.FileIO)
@contextmanager
def stub_open(*args, **kwargs):
mock_open(*args, **kwargs)
yield mock_file
with patch('builtins.open', stub_open):
yield mock_open, mock_file
def with_regions_sorted(identity_service_context, by='title'):
"""Helper method to sort regions in Identity Service Context response.
:param identity_service_context: callable identity service context
:param by: regions sorting field name
:returns: identity service context with sorted regions
"""
value = identity_service_context()
value['regions'] = sorted(value['regions'], key=itemgetter(by))
return value
class TestHorizonContexts(CharmTestCase):
def setUp(self):
super(TestHorizonContexts, self).setUp(horizon_contexts, TO_PATCH)
self.config.side_effect = self.test_config.get
self.pwgen.return_value = "secret"
def test_Apachecontext(self):
self.assertEqual(horizon_contexts.ApacheContext()(),
{'http_port': 70, 'https_port': 433,
'enforce_ssl': False,
'hsts_max_age_seconds': 0,
'custom_theme': False})
def test_Apachecontext_enforce_ssl(self):
self.test_config.set('enforce-ssl', True)
self.https.return_value = True
self.assertEquals(horizon_contexts.ApacheContext()(),
{'http_port': 70, 'https_port': 433,
'enforce_ssl': True,
'hsts_max_age_seconds': 0,
'custom_theme': False})
def test_Apachecontext_enforce_ssl_no_cert(self):
self.test_config.set('enforce-ssl', True)
self.https.return_value = False
self.assertEquals(horizon_contexts.ApacheContext()(),
{'http_port': 70, 'https_port': 433,
'enforce_ssl': False,
'hsts_max_age_seconds': 0,
'custom_theme': False})
def test_Apachecontext_hsts_max_age_seconds(self):
self.test_config.set('enforce-ssl', True)
self.https.return_value = True
self.test_config.set('hsts-max-age-seconds', 15768000)
self.assertEquals(horizon_contexts.ApacheContext()(),
{'http_port': 70, 'https_port': 433,
'enforce_ssl': True,
'hsts_max_age_seconds': 15768000,
'custom_theme': False})
def test_HorizonContext_defaults(self):
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True,
'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_default_domain(self):
self.test_config.set('default-domain', 'example_domain')
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": "example_domain",
"multi_domain": False,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_disable_password_reveal(self):
self.test_config.set('disable-password-reveal', True)
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True,
'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": True,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_create_instance_flavor_sort(self):
self.maxDiff = None
self.test_config.set('create-instance-flavor-sort-key', 'vcpus')
self.test_config.set('create-instance-flavor-sort-reverse', True)
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True,
'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": 'vcpus',
"create_instance_flavor_sort_reverse": True,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_enable_router_panel(self):
self.maxDiff = None
self.test_config.set('enable-router-panel', False)
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True,
'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": False,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_enforce_password_check(self):
self.test_config.set('enforce-password-check', False)
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True,
'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": False,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_debug(self):
self.test_config.set('debug', 'yes')
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': True,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_ubuntu_theme(self):
self.test_config.set('ubuntu-theme', 'False')
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': False,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_default_theme(self):
self.test_config.set('ubuntu-theme', 'False')
self.test_config.set('default-theme', 'material')
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': False,
'default_theme': 'material',
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_default_theme_true(self):
self.test_config.set('ubuntu-theme', 'true')
self.assertTrue(horizon_contexts.HorizonContext()()['ubuntu_theme'])
def test_HorizonContext_compression(self):
self.test_config.set('offline-compression', 'no')
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': False, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_webroot(self):
self.test_config.set('webroot', '/')
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
"hide_create_volume": False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_panels(self):
self.test_config.set('neutron-network-dvr', True)
self.test_config.set('neutron-network-l3ha', True)
self.test_config.set('neutron-network-lb', True)
self.test_config.set('neutron-network-firewall', True)
self.test_config.set('neutron-network-vpn', True)
self.test_config.set('cinder-backup', True)
self.test_config.set(
'retrieve-network-data-when-listing-instances', False)
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": True,
"neutron_network_l3ha": True,
"neutron_network_lb": True,
"neutron_network_firewall": True,
"neutron_network_vpn": True,
"cinder_backup": True,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": (
False),
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_password_retrieve(self):
self.test_config.set('password-retrieve', True)
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": True,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"openstack_keystone_mfa_totp_enabled": False,
"retrieve_network_data_when_listing_instances": True,
}
)
def test_HorizonContext_customization_module(self):
self.test_config.set('customization-module', 'customization.py')
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': 'customization.py',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContex_password_autocompletion(self):
self.maxDiff = 900
self.test_config.set('allow-password-autocompletion', True)
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": True,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_default_create_volume(self):
self.maxDiff = 900
self.test_config.set('default-create-volume', False)
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": False,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_hide_create_volume(self):
self.maxDiff = 900
self.test_config.set('hide-create-volume', True)
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': True,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_image_formats(self):
self.maxDiff = 900
self.test_config.set('image-formats', 'iso qcow2 raw')
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": 'iso qcow2 raw',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_fip_topology_check_disabled(self):
self.maxDiff = 900
self.test_config.set('enable-fip-topology-check', False)
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": False,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": None,
"site_branding_link": None,
"help_url": None,
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_branding(self):
self.maxDiff = 900
self.test_config.set('site-branding', 'My Cloud')
self.test_config.set('site-branding-link',
'https://mycloud.example.com/')
self.test_config.set('help-url', 'https://mycloud.example.com/help')
self.assertEqual(horizon_contexts.HorizonContext()(),
{'compress_offline': True, 'debug': False,
'customization_module': '',
'webroot': '/horizon',
'ubuntu_theme': True,
'default_theme': None,
'custom_theme': False,
'secret': 'secret',
'support_profile': None,
"neutron_network_dvr": False,
"neutron_network_l3ha": False,
"neutron_network_lb": False,
"neutron_network_firewall": False,
"neutron_network_vpn": False,
"cinder_backup": False,
"password_retrieve": False,
"default_domain": None,
"multi_domain": True,
"allow_password_autocompletion": False,
"default_create_volume": True,
'hide_create_volume': False,
"image_formats": '',
"api_result_limit": 1000,
"enable_fip_topology_check": True,
"session_timeout": 3600,
"dropdown_max_items": 30,
"enable_consistency_groups": False,
"disable_instance_snapshot": False,
"disable_password_reveal": False,
"enforce_password_check": True,
"site_branding": "My Cloud",
"site_branding_link":
"https://mycloud.example.com/",
"help_url": "https://mycloud.example.com/help",
"create_instance_flavor_sort_key": None,
"create_instance_flavor_sort_reverse": False,
"enable_router_panel": True,
"retrieve_network_data_when_listing_instances": True,
"openstack_keystone_mfa_totp_enabled": False,
}
)
def test_HorizonContext_can_set_disable_instance_snapshot(self):
self.maxDiff = 900
self.test_config.set('disable-instance-snapshot', True)
self.assertTrue(horizon_contexts
.HorizonContext()()['disable_instance_snapshot'])
def test_HorizonContext_can_set_openstack_keystone_mfa_totp_enabled(self):
self.maxDiff = 900
self.test_config.set('mfa-totp-enabled', True)
self.assertTrue(horizon_contexts
.HorizonContext()()
['openstack_keystone_mfa_totp_enabled'])
def test_IdentityServiceContext_not_related(self):
self.relation_ids.return_value = []
self.context_complete.return_value = False
self.assertEqual(horizon_contexts.IdentityServiceContext()(),
{})
def test_IdentityServiceContext_no_units(self):
self.relation_ids.return_value = ['foo']
self.related_units.return_value = []
self.context_complete.return_value = False
self.assertEqual(horizon_contexts.IdentityServiceContext()(),
{})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_no_data(self, mock_format_ipv6_addr):
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar']
self.relation_get.side_effect = self.test_relation.get
self.context_complete.return_value = False
self.assertEqual(horizon_contexts.IdentityServiceContext()(),
{})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_data(self, mock_format_ipv6_addr):
mock_format_ipv6_addr.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001})
self.test_config.set('use-internal-endpoints', False)
self.context_complete.return_value = True
self.assertEqual(horizon_contexts.IdentityServiceContext()(),
{'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v2.0',
'default_role': 'member',
'api_version': '2', 'service_protocol': 'http'})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_single_region(self, mock_format_ipv6_addr):
mock_format_ipv6_addr.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'region': 'regionOne'})
self.context_complete.return_value = True
self.assertEqual(horizon_contexts.IdentityServiceContext()(),
{'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_endpoint_path': 'v2.0',
'ks_protocol': 'http',
'default_role': 'member',
'api_version': '2', 'service_protocol': 'http'})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_multi_region(self, mock_format_ipv6_addr):
mock_format_ipv6_addr.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'region': 'regionOne regionTwo'})
self.context_complete.return_value = True
self.assertEqual(
with_regions_sorted(horizon_contexts.IdentityServiceContext()),
{'service_host': 'foo', 'service_port': 5000,
'service_protocol': 'http', 'api_version': '2',
'internal_host': 'bar', 'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v2.0',
'default_role': 'member',
'regions': [{'endpoint': 'http://foo:5000/v2.0',
'title': 'regionOne'},
{'endpoint': 'http://foo:5000/v2.0',
'title': 'regionTwo'}]})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_multi_region_with_extra(
self, mock_format_ipv6_addr
):
mock_format_ipv6_addr.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'region': 'regionOne regionTwo'})
self.test_config.set(
'extra-regions', '{"regionThree": "http://example.com/v3"}'
)
self.maxDiff = None
self.context_complete.return_value = True
self.assertEqual(
with_regions_sorted(horizon_contexts.IdentityServiceContext()),
{'service_host': 'foo', 'service_port': 5000,
'service_protocol': 'http', 'api_version': '2',
'internal_host': 'bar', 'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v2.0',
'default_role': 'member',
'regions': [{'endpoint': 'http://foo:5000/v2.0',
'title': 'regionOne'},
{'endpoint': 'http://example.com/v3',
'title': 'regionThree'},
{'endpoint': 'http://foo:5000/v2.0',
'title': 'regionTwo'}]})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_multi_region_with_invalid_extra_regions(
self, mock_format_ipv6_addr
):
mock_format_ipv6_addr.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'region': 'regionOne regionTwo'})
self.test_config.set('extra-regions', '{{{{')
self.maxDiff = None
self.context_complete.return_value = True
self.assertEqual(
with_regions_sorted(horizon_contexts.IdentityServiceContext()),
{'service_host': 'foo', 'service_port': 5000,
'service_protocol': 'http', 'api_version': '2',
'internal_host': 'bar', 'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v2.0',
'default_role': 'member',
'regions': [{'endpoint': 'http://foo:5000/v2.0',
'title': 'regionOne'},
{'endpoint': 'http://foo:5000/v2.0',
'title': 'regionTwo'}]})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_multi_region_v3(self,
mock_format_ipv6_addr):
mock_format_ipv6_addr.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'region': 'regionOne regionTwo',
'api_version': '3',
'admin_domain_id': 'admindomainid'})
self.context_complete.return_value = True
self.assertEqual(
with_regions_sorted(horizon_contexts.IdentityServiceContext()),
{'admin_domain_id': 'admindomainid',
'service_host': 'foo', 'service_port': 5000,
'service_protocol': 'http', 'api_version': '3',
'internal_host': 'bar', 'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v3',
'default_role': 'member',
'regions': [{'endpoint': 'http://foo:5000/v3',
'title': 'regionOne'},
{'endpoint': 'http://foo:5000/v3',
'title': 'regionTwo'}]})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_api3(self, mock_format_ipv6_addr):
mock_format_ipv6_addr.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({
'service_host': 'foo',
'service_port': 5000,
'internal_host': 'bar',
'internal_port': 5001,
'region': 'regionOne',
'api_version': '3',
'admin_domain_id': 'admindomainid'})
self.context_complete.return_value = True
self.assertEqual(horizon_contexts.IdentityServiceContext()(), {
'service_host': 'foo',
'service_port': 5000,
'internal_host': 'bar',
'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'foo',
'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v3',
'api_version': '3',
'default_role': 'member',
'admin_domain_id': 'admindomainid',
'service_protocol': 'http'})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_api3_missing(self, mock_format_ipv6_addr):
mock_format_ipv6_addr.return_value = "foo"
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({
'service_host': 'foo',
'service_port': 5000,
'region': 'regionOne',
'api_version': '3'})
self.context_complete.return_value = False
self.assertEqual(horizon_contexts.IdentityServiceContext()(), {})
def test_IdentityServiceContext_endpoint_type(self):
self.test_config.set('endpoint-type', 'internalURL')
self.assertEqual(horizon_contexts.IdentityServiceContext()(),
{'primary_endpoint': 'internalURL'})
def test_IdentityServiceContext_multi_endpoint_types(self):
self.test_config.set('endpoint-type', 'internalURL,publicURL')
self.assertEqual(horizon_contexts.IdentityServiceContext()(),
{'primary_endpoint': 'internalURL',
'secondary_endpoint': 'publicURL'})
def test_IdentityServiceContext_invalid_endpoint_type(self):
self.test_config.set('endpoint-type', 'this_is_bad')
with self.assertRaises(Exception):
horizon_contexts.IdentityServiceContext()()
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_default_role(self, mock_format_ipv6_addr):
self.test_config.set('default-role', 'member')
mock_format_ipv6_addr.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({
'service_host': 'foo',
'service_port': 5000,
'internal_host': 'bar',
'internal_port': 5001,
'internal_protocol': 'http',
'region': 'regionOne',
'api_version': '3',
'created_roles': 'Member',
'admin_domain_id': 'admindomainid'})
self.context_complete.return_value = True
self.assertEqual(horizon_contexts.IdentityServiceContext()(), {
'service_host': 'foo',
'service_port': 5000,
'internal_host': 'bar',
'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'foo',
'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v3',
'api_version': '3',
'default_role': 'Member',
'admin_domain_id': 'admindomainid',
'service_protocol': 'http'})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_default_role_fallback(self,
mock_ipv6_addr):
self.test_config.set('default-role', 'member')
mock_ipv6_addr.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({
'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'region': 'regionOne',
'api_version': '3',
'admin_domain_id': 'admindomainid'})
self.context_complete.return_value = True
self.assertEqual(horizon_contexts.IdentityServiceContext()(), {
'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v3',
'api_version': '3',
'default_role': 'member',
'admin_domain_id': 'admindomainid',
'service_protocol': 'http'})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_use_internal_endpoints(self,
mock_format_ipv6):
mock_format_ipv6.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'region': 'regionOne', 'api_version': '2'})
self.test_config.set('use-internal-endpoints', True)
self.context_complete.return_value = True
self.maxDiff = None
self.assertEqual(horizon_contexts.IdentityServiceContext()(),
{'service_host': 'foo', 'service_port': 5000,
'service_protocol': 'http',
'internal_host': 'bar', 'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'bar', 'ks_port': 5001,
'ks_endpoint_path': 'v2.0',
'ks_protocol': 'http',
'api_version': '2',
'default_role': 'member'})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_use_internal_endpoints_no_internal_host(
self, mock_format_ipv6):
mock_format_ipv6.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({'service_host': 'foo', 'service_port': 5000,
'region': 'regionOne regionTwo',
'api_version': '2'})
self.test_config.set('use-internal-endpoints', True)
self.context_complete.return_value = True
self.maxDiff = None
self.assertEqual(
with_regions_sorted(horizon_contexts.IdentityServiceContext()),
{'service_host': 'foo', 'service_port': 5000,
'service_protocol': 'http',
'internal_host': None, 'internal_port': None,
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_endpoint_path': 'v2.0',
'ks_protocol': 'http',
'api_version': '2',
'default_role': 'member',
'regions': [{'endpoint': 'http://foo:5000/v2.0',
'title': 'regionOne'},
{'endpoint': 'http://foo:5000/v2.0',
'title': 'regionTwo'}]})
def test_HorizonHAProxyContext_no_cluster(self):
self.relation_ids.return_value = []
self.local_unit.return_value = 'openstack-dashboard/0'
self.get_relation_ip.return_value = "10.5.0.1"
with patch_open() as (_open, _file):
self.assertEqual(horizon_contexts.HorizonHAProxyContext()(),
{'units': {'openstack-dashboard-0': '10.5.0.1'},
'service_ports': {'dash_insecure': [80, 70],
'dash_secure': [443, 433]},
'prefer_ipv6': False,
'haproxy_expose_stats': False})
_open.assert_called_with('/etc/default/haproxy', 'w')
self.assertTrue(_file.write.called)
self.get_relation_ip.assert_called_with('cluster')
def test_HorizonHAProxyContext_clustered(self):
self.relation_ids.return_value = ['cluster:0']
self.related_units.return_value = [
'openstack-dashboard/1', 'openstack-dashboard/2'
]
self.relation_get.side_effect = ['10.5.0.2', '10.5.0.3']
self.local_unit.return_value = 'openstack-dashboard/0'
self.get_relation_ip.return_value = "10.5.0.1"
with patch_open() as (_open, _file):
self.assertEqual(horizon_contexts.HorizonHAProxyContext()(),
{'units': {'openstack-dashboard-0': '10.5.0.1',
'openstack-dashboard-1': '10.5.0.2',
'openstack-dashboard-2': '10.5.0.3'},
'service_ports': {'dash_insecure': [80, 70],
'dash_secure': [443, 433]},
'prefer_ipv6': False,
'haproxy_expose_stats': False})
_open.assert_called_with('/etc/default/haproxy', 'w')
self.assertTrue(_file.write.called)
self.get_relation_ip.assert_called_with('cluster')
def test_HorizonHAProxyContext_expose_stats(self):
self.test_config.set('haproxy-expose-stats', True)
self.relation_ids.return_value = []
self.local_unit.return_value = 'openstack-dashboard/0'
self.get_relation_ip.return_value = "10.5.0.1"
with patch_open() as (_open, _file):
self.assertEquals(horizon_contexts.HorizonHAProxyContext()(),
{'units': {'openstack-dashboard-0': '10.5.0.1'},
'service_ports': {'dash_insecure': [80, 70],
'dash_secure': [443, 433]},
'prefer_ipv6': False,
'haproxy_expose_stats': True})
_open.assert_called_with('/etc/default/haproxy', 'w')
self.assertTrue(_file.write.called)
def test_HorizonHAProxyContext_rate_limiting(self):
limiting = True
max_bytes_in = 100000
limit_period = 42
self.test_config.set('haproxy-rate-limiting-enabled', limiting)
self.test_config.set('haproxy-max-bytes-in-rate', max_bytes_in)
self.test_config.set('haproxy-limit-period', limit_period)
self.relation_ids.return_value = []
self.local_unit.return_value = 'openstack-dashboard/0'
self.get_relation_ip.return_value = "10.5.0.1"
with patch_open() as (_open, _file):
self.assertEquals(horizon_contexts.HorizonHAProxyContext()(),
{'units': {'openstack-dashboard-0': '10.5.0.1'},
'service_ports': {'dash_insecure': [80, 70],
'dash_secure': [443, 433]},
'prefer_ipv6': False,
'haproxy_expose_stats': False,
'haproxy_rate_limiting_enabled': limiting,
'haproxy_max_bytes_in_rate': max_bytes_in,
'haproxy_limit_period': limit_period})
_open.assert_called_with('/etc/default/haproxy', 'w')
self.assertTrue(_file.write.called)
def test_RouterSettingContext(self):
self.test_config.set('profile', 'cisco')
self.assertEqual(horizon_contexts.RouterSettingContext()(),
{'disable_router': False, })
self.test_config.set('profile', None)
self.assertEqual(horizon_contexts.RouterSettingContext()(),
{'disable_router': True, })
def test_LocalSettingsContext(self):
self.relation_ids.return_value = ['plugin:0', 'plugin-too:0']
self.related_units.side_effect = [['horizon-plugin/0'],
['horizon-plugin-too/0']]
self.relation_get.side_effect = [{'priority': 99,
'local-settings': 'FOO = True'},
{'priority': 60,
'local-settings': 'BAR = False'}]
self.assertEqual(horizon_contexts.LocalSettingsContext()(),
{'settings': ['# horizon-plugin-too/0\n'
'BAR = False',
'# horizon-plugin/0\n'
'FOO = True']})
def test_LocalSettingsContextJSON(self):
self.relation_ids.return_value = ['plugin:0', 'plugin-too:0']
self.related_units.side_effect = [['horizon-plugin/0'],
['horizon-plugin-too/0']]
# One JSON and one raw relation
self.relation_get.side_effect = [{'priority': "99",
'local-settings': '"FOO = True"'},
{'priority': 60,
'local-settings': 'BAR = False'}]
self.assertEqual(horizon_contexts.LocalSettingsContext()(),
{'settings': ['# horizon-plugin-too/0\n'
'BAR = False',
'# horizon-plugin/0\n'
'FOO = True']})
def test_LocalSettingsContext_unusual_priority(self):
# First, left priority missing.
self.related_units.side_effect = [['horizon-plugin/0'],
['horizon-plugin-too/0']]
self.relation_get.side_effect = [{'local-settings': 'FOO = True'},
{'priority': 60,
'local-settings': 'BAR = False'}]
self.assertEqual(horizon_contexts.LocalSettingsContext()(),
{'settings': []})
# First, right priority missing.
self.related_units.side_effect = [['horizon-plugin/0'],
['horizon-plugin-too/0']]
self.relation_get.side_effect = [{'priority': 99,
'local-settings': 'FOO = True'},
{'local-settings': 'BAR = False'}]
self.assertEqual(horizon_contexts.LocalSettingsContext()(),
{'settings': []})
# Left priority is None.
self.relation_ids.return_value = ['plugin:0', 'plugin-too:0']
self.related_units.side_effect = [['horizon-plugin/0'],
['horizon-plugin-too/0']]
self.relation_get.side_effect = [{'priority': None,
'local-settings': 'FOO = True'},
{'priority': 60,
'local-settings': 'BAR = False'}]
self.assertEqual(horizon_contexts.LocalSettingsContext()(),
{'settings': ['# horizon-plugin-too/0\n'
'BAR = False',
'# horizon-plugin/0\n'
'FOO = True']})
# Right priority is None.
self.relation_ids.return_value = ['plugin:0', 'plugin-too:0']
self.related_units.side_effect = [['horizon-plugin/0'],
['horizon-plugin-too/0']]
self.relation_get.side_effect = [{'priority': 99,
'local-settings': 'FOO = True'},
{'priority': None,
'local-settings': 'BAR = False'}]
self.assertEqual(horizon_contexts.LocalSettingsContext()(),
{'settings': ['# horizon-plugin/0\n'
'FOO = True',
'# horizon-plugin-too/0\n'
'BAR = False']})
# Left priority is stringy number.
self.relation_ids.return_value = ['plugin:0', 'plugin-too:0']
self.related_units.side_effect = [['horizon-plugin/0'],
['horizon-plugin-too/0']]
self.relation_get.side_effect = [{'priority': "99",
'local-settings': 'FOO = True'},
{'priority': 60,
'local-settings': 'BAR = False'}]
self.assertEqual(horizon_contexts.LocalSettingsContext()(),
{'settings': ['# horizon-plugin-too/0\n'
'BAR = False',
'# horizon-plugin/0\n'
'FOO = True']})
# Right priority is stringy number.
self.relation_ids.return_value = ['plugin:0', 'plugin-too:0']
self.related_units.side_effect = [['horizon-plugin/0'],
['horizon-plugin-too/0']]
self.relation_get.side_effect = [{'priority': 99,
'local-settings': 'FOO = True'},
{'priority': "60",
'local-settings': 'BAR = False'}]
self.assertEqual(horizon_contexts.LocalSettingsContext()(),
{'settings': ['# horizon-plugin-too/0\n'
'BAR = False',
'# horizon-plugin/0\n'
'FOO = True']})
# Both priorities are strings
self.relation_ids.return_value = ['plugin:0', 'plugin-too:0']
self.related_units.side_effect = [['horizon-plugin/0'],
['horizon-plugin-too/0']]
self.relation_get.side_effect = [{'priority': "99",
'local-settings': 'FOO = True'},
{'priority': "60",
'local-settings': 'BAR = False'}]
self.assertEqual(horizon_contexts.LocalSettingsContext()(),
{'settings': ['# horizon-plugin-too/0\n'
'BAR = False',
'# horizon-plugin/0\n'
'FOO = True']})
# Left priority is weired json object
self.relation_ids.return_value = ['plugin:0', 'plugin-too:0']
self.related_units.side_effect = [['horizon-plugin/0'],
['horizon-plugin-too/0']]
self.relation_get.side_effect = [{'priority': "{'a': 1}",
'local-settings': 'FOO = True'},
{'priority': "60",
'local-settings': 'BAR = False'}]
self.assertEqual(horizon_contexts.LocalSettingsContext()(),
{'settings': ['# horizon-plugin-too/0\n'
'BAR = False',
'# horizon-plugin/0\n'
'FOO = True']})
# right priority is weired json object
self.relation_ids.return_value = ['plugin:0', 'plugin-too:0']
self.related_units.side_effect = [['horizon-plugin/0'],
['horizon-plugin-too/0']]
self.relation_get.side_effect = [{'priority': "99",
'local-settings': 'FOO = True'},
{'priority': "[1,2,3]",
'local-settings': 'BAR = False'}]
self.assertEqual(horizon_contexts.LocalSettingsContext()(),
{'settings': ['# horizon-plugin/0\n'
'FOO = True',
'# horizon-plugin-too/0\n'
'BAR = False']})
def test_WebSSOFIDServiceProviderContext(self):
def relation_ids_side_effect(rname):
return {
'websso-fid-service-provider': [
'websso-fid-service-provider:0',
'websso-fid-service-provider:1',
]
}[rname]
self.relation_ids.side_effect = relation_ids_side_effect
def related_units_side_effect(rid):
return {
'websso-fid-service-provider:0': [
'keystone-saml-mellon-red/0',
'keystone-saml-mellon-red/1',
],
'websso-fid-service-provider:1': [
'keystone-saml-mellon-green/0',
'keystone-saml-mellon-green/1',
],
}[rid]
self.related_units.side_effect = related_units_side_effect
def relation_get_side_effect(unit, rid):
return {
'websso-fid-service-provider:0': {
'keystone-saml-mellon-red/0': {
'ingress-address': '10.0.0.10',
'protocol-name': '"saml2"',
'idp-name': '"red"',
'user-facing-name': '"Red IDP"',
},
'keystone-saml-mellon-red/1': {
'ingress-address': '10.0.0.11',
'protocol-name': '"saml2"',
'idp-name': '"red"',
'user-facing-name': '"Red IDP"',
},
},
'websso-fid-service-provider:1': {
'keystone-saml-mellon-green/0': {
'ingress-address': '10.0.0.12',
'protocol-name': '"mapped"',
'idp-name': '"green"',
'user-facing-name': '"Green IDP"',
},
'keystone-saml-mellon-green/1': {
'ingress-address': '10.0.0.13',
'protocol-name': '"mapped"',
'idp-name': '"green"',
'user-facing-name': '"Green IDP"',
},
},
}[rid][unit]
self.relation_get.side_effect = relation_get_side_effect
self.assertEqual(
horizon_contexts.WebSSOFIDServiceProviderContext()(),
{
'websso_data': [
{
'protocol-name': 'saml2',
'idp-name': 'red',
'user-facing-name': "Red IDP",
},
{
'protocol-name': 'mapped',
'idp-name': 'green',
'user-facing-name': "Green IDP",
},
]
})
@patch.object(horizon_contexts.policyd, 'is_policy_success_file_set')
def test_policyd_context(self, mock_is_policy_success_file_set):
self.test_config.set('use-policyd-override', True)
def extract_dirs_func():
return {'a': ['a-dir']}
mock_is_policy_success_file_set.return_value = True
self.assertEqual(
horizon_contexts.PolicydContext(extract_dirs_func)(), {
'policyd_overrides_activated': True,
'policy_dirs': {'a': ['a-dir']},
})
mock_is_policy_success_file_set.return_value = False
self.assertEqual(
horizon_contexts.PolicydContext(extract_dirs_func)(), {
'policyd_overrides_activated': False,
})
mock_is_policy_success_file_set.return_value = True
self.test_config.set('use-policyd-override', False)
self.assertEqual(
horizon_contexts.PolicydContext(extract_dirs_func)(), {
'policyd_overrides_activated': False,
})