Enable nova-placement-api
This change installs the nova-placement-api, runs it under mod_wsgi with apache2, updates nova.conf accordingly, and registers its endpoints. Change-Id: I4af4afa591cf68964e6146ca0ca0c51d1ddb8a64
This commit is contained in:
parent
ad6fbd48db
commit
2564cf5a5f
@ -156,6 +156,8 @@ class HAProxyContext(context.HAProxyContext):
|
|||||||
singlenode_mode=True)
|
singlenode_mode=True)
|
||||||
s3_api = determine_api_port(api_port('nova-objectstore'),
|
s3_api = determine_api_port(api_port('nova-objectstore'),
|
||||||
singlenode_mode=True)
|
singlenode_mode=True)
|
||||||
|
placement_api = determine_api_port(api_port('nova-placement-api'),
|
||||||
|
singlenode_mode=True)
|
||||||
# Apache ports
|
# Apache ports
|
||||||
a_compute_api = determine_apache_port(api_port('nova-api-os-compute'),
|
a_compute_api = determine_apache_port(api_port('nova-api-os-compute'),
|
||||||
singlenode_mode=True)
|
singlenode_mode=True)
|
||||||
@ -163,11 +165,14 @@ class HAProxyContext(context.HAProxyContext):
|
|||||||
singlenode_mode=True)
|
singlenode_mode=True)
|
||||||
a_s3_api = determine_apache_port(api_port('nova-objectstore'),
|
a_s3_api = determine_apache_port(api_port('nova-objectstore'),
|
||||||
singlenode_mode=True)
|
singlenode_mode=True)
|
||||||
|
a_placement_api = determine_apache_port(api_port('nova-placement-api'),
|
||||||
|
singlenode_mode=True)
|
||||||
# to be set in nova.conf accordingly.
|
# to be set in nova.conf accordingly.
|
||||||
listen_ports = {
|
listen_ports = {
|
||||||
'osapi_compute_listen_port': compute_api,
|
'osapi_compute_listen_port': compute_api,
|
||||||
'ec2_listen_port': ec2_api,
|
'ec2_listen_port': ec2_api,
|
||||||
's3_listen_port': s3_api,
|
's3_listen_port': s3_api,
|
||||||
|
'placement_listen_port': placement_api,
|
||||||
}
|
}
|
||||||
|
|
||||||
port_mapping = {
|
port_mapping = {
|
||||||
@ -177,12 +182,15 @@ class HAProxyContext(context.HAProxyContext):
|
|||||||
api_port('nova-api-ec2'), a_ec2_api],
|
api_port('nova-api-ec2'), a_ec2_api],
|
||||||
'nova-objectstore': [
|
'nova-objectstore': [
|
||||||
api_port('nova-objectstore'), a_s3_api],
|
api_port('nova-objectstore'), a_s3_api],
|
||||||
|
'nova-placement-api': [
|
||||||
|
api_port('nova-placement-api'), a_placement_api],
|
||||||
}
|
}
|
||||||
|
|
||||||
# for haproxy.conf
|
# for haproxy.conf
|
||||||
ctxt['service_ports'] = port_mapping
|
ctxt['service_ports'] = port_mapping
|
||||||
# for nova.conf
|
# for nova.conf
|
||||||
ctxt['listen_ports'] = listen_ports
|
ctxt['listen_ports'] = listen_ports
|
||||||
|
ctxt['port'] = placement_api
|
||||||
return ctxt
|
return ctxt
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,6 +87,7 @@ from nova_cc_utils import (
|
|||||||
determine_endpoints,
|
determine_endpoints,
|
||||||
determine_packages,
|
determine_packages,
|
||||||
determine_ports,
|
determine_ports,
|
||||||
|
disable_package_apache_site,
|
||||||
disable_services,
|
disable_services,
|
||||||
do_openstack_upgrade,
|
do_openstack_upgrade,
|
||||||
enable_services,
|
enable_services,
|
||||||
@ -94,6 +95,7 @@ from nova_cc_utils import (
|
|||||||
is_api_ready,
|
is_api_ready,
|
||||||
keystone_ca_cert_b64,
|
keystone_ca_cert_b64,
|
||||||
migrate_nova_database,
|
migrate_nova_database,
|
||||||
|
placement_api_enabled,
|
||||||
save_script_rc,
|
save_script_rc,
|
||||||
services,
|
services,
|
||||||
ssh_compute_add,
|
ssh_compute_add,
|
||||||
@ -209,6 +211,9 @@ def install():
|
|||||||
apt_update()
|
apt_update()
|
||||||
apt_install(determine_packages(), fatal=True)
|
apt_install(determine_packages(), fatal=True)
|
||||||
|
|
||||||
|
if placement_api_enabled():
|
||||||
|
disable_package_apache_site()
|
||||||
|
|
||||||
git_install(config('openstack-origin-git'))
|
git_install(config('openstack-origin-git'))
|
||||||
|
|
||||||
_files = os.path.join(charm_dir(), 'files')
|
_files = os.path.join(charm_dir(), 'files')
|
||||||
|
@ -130,6 +130,7 @@ REQUIRED_INTERFACES = {
|
|||||||
BASE_PACKAGES = [
|
BASE_PACKAGES = [
|
||||||
'apache2',
|
'apache2',
|
||||||
'haproxy',
|
'haproxy',
|
||||||
|
'libapache2-mod-wsgi',
|
||||||
'python-keystoneclient',
|
'python-keystoneclient',
|
||||||
'python-mysqldb',
|
'python-mysqldb',
|
||||||
'python-psycopg2',
|
'python-psycopg2',
|
||||||
@ -185,6 +186,7 @@ GIT_PACKAGE_BLACKLIST = [
|
|||||||
BASE_SERVICES = [
|
BASE_SERVICES = [
|
||||||
'nova-api-ec2',
|
'nova-api-ec2',
|
||||||
'nova-api-os-compute',
|
'nova-api-os-compute',
|
||||||
|
'nova-placement-api',
|
||||||
'nova-objectstore',
|
'nova-objectstore',
|
||||||
'nova-cert',
|
'nova-cert',
|
||||||
'nova-scheduler',
|
'nova-scheduler',
|
||||||
@ -200,6 +202,7 @@ API_PORTS = {
|
|||||||
'nova-api-ec2': 8773,
|
'nova-api-ec2': 8773,
|
||||||
'nova-api-os-compute': 8774,
|
'nova-api-os-compute': 8774,
|
||||||
'nova-api-os-volume': 8776,
|
'nova-api-os-volume': 8776,
|
||||||
|
'nova-placement-api': 8778,
|
||||||
'nova-objectstore': 3333,
|
'nova-objectstore': 3333,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,6 +215,10 @@ HAPROXY_CONF = '/etc/haproxy/haproxy.cfg'
|
|||||||
APACHE_CONF = '/etc/apache2/sites-available/openstack_https_frontend'
|
APACHE_CONF = '/etc/apache2/sites-available/openstack_https_frontend'
|
||||||
APACHE_24_CONF = '/etc/apache2/sites-available/openstack_https_frontend.conf'
|
APACHE_24_CONF = '/etc/apache2/sites-available/openstack_https_frontend.conf'
|
||||||
MEMCACHED_CONF = '/etc/memcached.conf'
|
MEMCACHED_CONF = '/etc/memcached.conf'
|
||||||
|
WSGI_NOVA_PLACEMENT_API_CONF = \
|
||||||
|
'/etc/apache2/sites-enabled/wsgi-openstack-api.conf'
|
||||||
|
PACKAGE_NOVA_PLACEMENT_API_CONF = \
|
||||||
|
'/etc/apache2/sites-enabled/nova-placement-api.conf'
|
||||||
|
|
||||||
|
|
||||||
def resolve_services():
|
def resolve_services():
|
||||||
@ -313,7 +320,7 @@ SERIAL_CONSOLE = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def resource_map():
|
def resource_map(return_services=True):
|
||||||
'''
|
'''
|
||||||
Dynamically generate a map of resources that will be managed for a single
|
Dynamically generate a map of resources that will be managed for a single
|
||||||
hook execution.
|
hook execution.
|
||||||
@ -358,6 +365,27 @@ def resource_map():
|
|||||||
resource_map[MEMCACHED_CONF] = {
|
resource_map[MEMCACHED_CONF] = {
|
||||||
'contexts': [context.MemcacheContext()],
|
'contexts': [context.MemcacheContext()],
|
||||||
'services': ['memcached']}
|
'services': ['memcached']}
|
||||||
|
|
||||||
|
if return_services and placement_api_enabled():
|
||||||
|
for cfile in resource_map:
|
||||||
|
svcs = resource_map[cfile]['services']
|
||||||
|
if 'nova-placement-api' in svcs:
|
||||||
|
svcs.remove('nova-placement-api')
|
||||||
|
if 'apache2' not in svcs:
|
||||||
|
svcs.append('apache2')
|
||||||
|
wsgi_script = "/usr/bin/nova-placement-api"
|
||||||
|
resource_map[WSGI_NOVA_PLACEMENT_API_CONF] = {
|
||||||
|
'contexts': [context.WSGIWorkerConfigContext(name="nova",
|
||||||
|
script=wsgi_script),
|
||||||
|
nova_cc_context.HAProxyContext()],
|
||||||
|
'services': ['apache2']
|
||||||
|
}
|
||||||
|
elif not placement_api_enabled():
|
||||||
|
for cfile in resource_map:
|
||||||
|
svcs = resource_map[cfile]['services']
|
||||||
|
if 'nova-placement-api' in svcs:
|
||||||
|
svcs.remove('nova-placement-api')
|
||||||
|
|
||||||
return resource_map
|
return resource_map
|
||||||
|
|
||||||
|
|
||||||
@ -424,7 +452,7 @@ def console_attributes(attr, proto=None):
|
|||||||
def determine_packages():
|
def determine_packages():
|
||||||
# currently all packages match service names
|
# currently all packages match service names
|
||||||
packages = deepcopy(BASE_PACKAGES)
|
packages = deepcopy(BASE_PACKAGES)
|
||||||
for v in resource_map().values():
|
for v in resource_map(return_services=False).values():
|
||||||
packages.extend(v['services'])
|
packages.extend(v['services'])
|
||||||
if console_attributes('packages'):
|
if console_attributes('packages'):
|
||||||
packages.extend(console_attributes('packages'))
|
packages.extend(console_attributes('packages'))
|
||||||
@ -866,6 +894,14 @@ def determine_endpoints(public_url, internal_url, admin_url):
|
|||||||
s3_internal_url = '%s:%s' % (internal_url, api_port('nova-objectstore'))
|
s3_internal_url = '%s:%s' % (internal_url, api_port('nova-objectstore'))
|
||||||
s3_admin_url = '%s:%s' % (admin_url, api_port('nova-objectstore'))
|
s3_admin_url = '%s:%s' % (admin_url, api_port('nova-objectstore'))
|
||||||
|
|
||||||
|
if os_rel >= 'ocata':
|
||||||
|
placement_public_url = '%s:%s' % (
|
||||||
|
public_url, api_port('nova-placement-api'))
|
||||||
|
placement_internal_url = '%s:%s' % (
|
||||||
|
internal_url, api_port('nova-placement-api'))
|
||||||
|
placement_admin_url = '%s:%s' % (
|
||||||
|
admin_url, api_port('nova-placement-api'))
|
||||||
|
|
||||||
# the base endpoints
|
# the base endpoints
|
||||||
endpoints = {
|
endpoints = {
|
||||||
'nova_service': 'nova',
|
'nova_service': 'nova',
|
||||||
@ -902,6 +938,15 @@ def determine_endpoints(public_url, internal_url, admin_url):
|
|||||||
's3_internal_url': None,
|
's3_internal_url': None,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if os_rel >= 'ocata':
|
||||||
|
endpoints.update({
|
||||||
|
'placement_service': 'placement',
|
||||||
|
'placement_region': region,
|
||||||
|
'placement_public_url': placement_public_url,
|
||||||
|
'placement_admin_url': placement_admin_url,
|
||||||
|
'placement_internal_url': placement_internal_url,
|
||||||
|
})
|
||||||
|
|
||||||
return endpoints
|
return endpoints
|
||||||
|
|
||||||
|
|
||||||
@ -1422,3 +1467,16 @@ def serial_console_settings():
|
|||||||
for use in cloud-compute relation
|
for use in cloud-compute relation
|
||||||
'''
|
'''
|
||||||
return nova_cc_context.SerialConsoleContext()()
|
return nova_cc_context.SerialConsoleContext()()
|
||||||
|
|
||||||
|
|
||||||
|
def placement_api_enabled():
|
||||||
|
"""Return true if nova-placement-api is enabled in this release"""
|
||||||
|
return os_release('nova-common') >= 'ocata'
|
||||||
|
|
||||||
|
|
||||||
|
def disable_package_apache_site():
|
||||||
|
"""Ensure that the package-provided apache configuration is disabled to
|
||||||
|
prevent it from conflicting with the charm-provided version.
|
||||||
|
"""
|
||||||
|
if os.path.exists(PACKAGE_NOVA_PLACEMENT_API_CONF):
|
||||||
|
subprocess.check_call(['a2dissite', 'nova-placement-api'])
|
||||||
|
167
templates/ocata/nova.conf
Normal file
167
templates/ocata/nova.conf
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
# ocata
|
||||||
|
###############################################################################
|
||||||
|
# [ WARNING ]
|
||||||
|
# Configuration file maintained by Juju. Local changes may be overwritten.
|
||||||
|
###############################################################################
|
||||||
|
[DEFAULT]
|
||||||
|
verbose={{ verbose }}
|
||||||
|
debug={{ debug }}
|
||||||
|
dhcpbridge_flagfile=/etc/nova/nova.conf
|
||||||
|
dhcpbridge=/usr/bin/nova-dhcpbridge
|
||||||
|
logdir=/var/log/nova
|
||||||
|
state_path=/var/lib/nova
|
||||||
|
force_dhcp_release=True
|
||||||
|
iscsi_helper=tgtadm
|
||||||
|
libvirt_use_virtio_for_bridges=True
|
||||||
|
connection_type=libvirt
|
||||||
|
root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf
|
||||||
|
api_paste_config=/etc/nova/api-paste.ini
|
||||||
|
volumes_path=/var/lib/nova/volumes
|
||||||
|
enabled_apis=osapi_compute,metadata
|
||||||
|
auth_strategy=keystone
|
||||||
|
compute_driver=libvirt.LibvirtDriver
|
||||||
|
use_ipv6 = {{ use_ipv6 }}
|
||||||
|
osapi_compute_listen = {{ bind_host }}
|
||||||
|
metadata_host = {{ bind_host }}
|
||||||
|
s3_listen = {{ bind_host }}
|
||||||
|
|
||||||
|
osapi_compute_workers = {{ workers }}
|
||||||
|
|
||||||
|
{% if additional_neutron_filters is defined %}
|
||||||
|
scheduler_default_filters = {{ scheduler_default_filters }},{{ additional_neutron_filters }}
|
||||||
|
{% else %}
|
||||||
|
scheduler_default_filters = {{ scheduler_default_filters }}
|
||||||
|
{% endif %}
|
||||||
|
cpu_allocation_ratio = {{ cpu_allocation_ratio }}
|
||||||
|
ram_allocation_ratio = {{ ram_allocation_ratio }}
|
||||||
|
|
||||||
|
use_syslog={{ use_syslog }}
|
||||||
|
my_ip = {{ host_ip }}
|
||||||
|
|
||||||
|
{% if memcached_servers %}
|
||||||
|
memcached_servers = {{ memcached_servers }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% include "parts/novnc" %}
|
||||||
|
|
||||||
|
{% if rbd_pool -%}
|
||||||
|
rbd_pool = {{ rbd_pool }}
|
||||||
|
rbd_user = {{ rbd_user }}
|
||||||
|
rbd_secret_uuid = {{ rbd_secret_uuid }}
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if neutron_plugin and neutron_plugin in ('ovs', 'midonet') -%}
|
||||||
|
libvirt_vif_driver = nova.virt.libvirt.vif.LibvirtGenericVIFDriver
|
||||||
|
libvirt_user_virtio_for_bridges = True
|
||||||
|
{% if neutron_security_groups -%}
|
||||||
|
security_group_api = {{ network_manager }}
|
||||||
|
nova_firewall_driver = nova.virt.firewall.NoopFirewallDriver
|
||||||
|
{% endif -%}
|
||||||
|
{% if external_network -%}
|
||||||
|
default_floating_pool = {{ external_network }}
|
||||||
|
{% endif -%}
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if neutron_plugin and neutron_plugin == 'vsp' -%}
|
||||||
|
neutron_ovs_bridge = alubr0
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if neutron_plugin and neutron_plugin == 'nvp' -%}
|
||||||
|
security_group_api = neutron
|
||||||
|
nova_firewall_driver = nova.virt.firewall.NoopFirewallDriver
|
||||||
|
{% if external_network -%}
|
||||||
|
default_floating_pool = {{ external_network }}
|
||||||
|
{% endif -%}
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if neutron_plugin and neutron_plugin == 'Calico' -%}
|
||||||
|
security_group_api = neutron
|
||||||
|
nova_firewall_driver = nova.virt.firewall.NoopFirewallDriver
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if neutron_plugin and neutron_plugin == 'plumgrid' -%}
|
||||||
|
security_group_api=neutron
|
||||||
|
firewall_driver = nova.virt.firewall.NoopFirewallDriver
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if network_manager_config -%}
|
||||||
|
{% for key, value in network_manager_config.iteritems() -%}
|
||||||
|
{{ key }} = {{ value }}
|
||||||
|
{% endfor -%}
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if network_manager and network_manager == 'neutron' -%}
|
||||||
|
network_api_class = nova.network.neutronv2.api.API
|
||||||
|
use_neutron = True
|
||||||
|
{% else -%}
|
||||||
|
network_manager = nova.network.manager.FlatDHCPManager
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if default_floating_pool -%}
|
||||||
|
default_floating_pool = {{ default_floating_pool }}
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if volume_service -%}
|
||||||
|
volume_api_class=nova.volume.cinder.API
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if user_config_flags -%}
|
||||||
|
{% for key, value in user_config_flags.iteritems() -%}
|
||||||
|
{{ key }} = {{ value }}
|
||||||
|
{% endfor -%}
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if listen_ports -%}
|
||||||
|
{% for key, value in listen_ports.iteritems() -%}
|
||||||
|
{{ key }} = {{ value }}
|
||||||
|
{% endfor -%}
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if sections and 'DEFAULT' in sections -%}
|
||||||
|
{% for key, value in sections['DEFAULT'] -%}
|
||||||
|
{{ key }} = {{ value }}
|
||||||
|
{% endfor -%}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% include "section-zeromq" %}
|
||||||
|
|
||||||
|
{% include "parts/database-v2" %}
|
||||||
|
|
||||||
|
{% include "parts/database-api" %}
|
||||||
|
|
||||||
|
{% if glance_api_servers -%}
|
||||||
|
[glance]
|
||||||
|
api_servers = {{ glance_api_servers }}
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% if network_manager and network_manager == 'neutron' -%}
|
||||||
|
[neutron]
|
||||||
|
url = {{ neutron_url }}
|
||||||
|
auth_strategy = keystone
|
||||||
|
auth_section = keystone_authtoken
|
||||||
|
auth_plugin = password
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{% include "section-keystone-authtoken-mitaka" %}
|
||||||
|
|
||||||
|
{% include "parts/section-cinder" %}
|
||||||
|
|
||||||
|
[osapi_v3]
|
||||||
|
enabled=True
|
||||||
|
|
||||||
|
{% include "parts/cell" %}
|
||||||
|
|
||||||
|
[conductor]
|
||||||
|
workers = {{ workers }}
|
||||||
|
|
||||||
|
{% include "section-rabbitmq-oslo" %}
|
||||||
|
|
||||||
|
[oslo_concurrency]
|
||||||
|
lock_path=/var/lock/nova
|
||||||
|
|
||||||
|
[spice]
|
||||||
|
{% include "parts/spice" %}
|
||||||
|
|
||||||
|
{% include "parts/section-serial-console" %}
|
||||||
|
|
||||||
|
{% include "parts/section-placement" %}
|
18
templates/parts/section-placement
Normal file
18
templates/parts/section-placement
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
[placement]
|
||||||
|
{% if auth_host -%}
|
||||||
|
auth_url = {{ auth_protocol }}://{{ auth_host }}:{{ auth_port }}
|
||||||
|
auth_type = password
|
||||||
|
{% if api_version == "3" -%}
|
||||||
|
project_domain_name = {{ admin_domain_name }}
|
||||||
|
user_domain_name = {{ admin_domain_name }}
|
||||||
|
{% else -%}
|
||||||
|
project_domain_name = default
|
||||||
|
user_domain_name = default
|
||||||
|
{% endif -%}
|
||||||
|
project_name = {{ admin_tenant_name }}
|
||||||
|
username = {{ admin_user }}
|
||||||
|
password = {{ admin_password }}
|
||||||
|
{% endif -%}
|
||||||
|
{% if region -%}
|
||||||
|
os_region_name = {{ region }}
|
||||||
|
{% endif -%}
|
@ -796,6 +796,10 @@ class NovaCCBasicDeployment(OpenStackAmuletDeployment):
|
|||||||
del services['nova-api-ec2']
|
del services['nova-api-ec2']
|
||||||
del services['nova-objectstore']
|
del services['nova-objectstore']
|
||||||
|
|
||||||
|
if self._get_openstack_release() >= self.xenial_ocata:
|
||||||
|
# nova-placement-api is run under apache2 with mod_wsgi
|
||||||
|
services['apache2'] = conf_file
|
||||||
|
|
||||||
# Expected default and alternate values
|
# Expected default and alternate values
|
||||||
flags_default = 'quota_cores=20,quota_instances=40,quota_ram=102400'
|
flags_default = 'quota_cores=20,quota_instances=40,quota_ram=102400'
|
||||||
flags_alt = 'quota_cores=10,quota_instances=20,quota_ram=51200'
|
flags_alt = 'quota_cores=10,quota_instances=20,quota_ram=51200'
|
||||||
|
@ -68,6 +68,7 @@ TO_PATCH = [
|
|||||||
'relation_get',
|
'relation_get',
|
||||||
'relation_set',
|
'relation_set',
|
||||||
'relation_ids',
|
'relation_ids',
|
||||||
|
'placement_api_enabled',
|
||||||
'ssh_compute_add',
|
'ssh_compute_add',
|
||||||
'ssh_known_hosts_lines',
|
'ssh_known_hosts_lines',
|
||||||
'ssh_authorized_keys_lines',
|
'ssh_authorized_keys_lines',
|
||||||
|
@ -102,8 +102,8 @@ BASE_ENDPOINTS = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Restart map should be constructed such that API services restart
|
# Restart map should be constructed such that API services restart
|
||||||
# before frontends (haproxy/apaceh) to avoid port conflicts.
|
# before frontends (haproxy/apache) to avoid port conflicts.
|
||||||
RESTART_MAP = OrderedDict([
|
RESTART_MAP_ICEHOUSE = OrderedDict([
|
||||||
('/etc/nova/nova.conf', [
|
('/etc/nova/nova.conf', [
|
||||||
'nova-api-ec2', 'nova-api-os-compute', 'nova-objectstore',
|
'nova-api-ec2', 'nova-api-os-compute', 'nova-objectstore',
|
||||||
'nova-cert', 'nova-scheduler', 'nova-conductor'
|
'nova-cert', 'nova-scheduler', 'nova-conductor'
|
||||||
@ -114,6 +114,18 @@ RESTART_MAP = OrderedDict([
|
|||||||
('/etc/haproxy/haproxy.cfg', ['haproxy']),
|
('/etc/haproxy/haproxy.cfg', ['haproxy']),
|
||||||
('/etc/apache2/sites-available/openstack_https_frontend', ['apache2']),
|
('/etc/apache2/sites-available/openstack_https_frontend', ['apache2']),
|
||||||
])
|
])
|
||||||
|
RESTART_MAP_OCATA = OrderedDict([
|
||||||
|
('/etc/nova/nova.conf', [
|
||||||
|
'nova-api-ec2', 'nova-api-os-compute', 'nova-objectstore',
|
||||||
|
'nova-cert', 'nova-scheduler', 'nova-conductor', 'apache2'
|
||||||
|
]),
|
||||||
|
('/etc/nova/api-paste.ini', [
|
||||||
|
'nova-api-ec2', 'nova-api-os-compute', 'apache2'
|
||||||
|
]),
|
||||||
|
('/etc/haproxy/haproxy.cfg', ['haproxy']),
|
||||||
|
('/etc/apache2/sites-available/openstack_https_frontend', ['apache2']),
|
||||||
|
('/etc/apache2/sites-enabled/wsgi-openstack-api.conf', ['apache2']),
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
DPKG_OPTS = [
|
DPKG_OPTS = [
|
||||||
@ -240,15 +252,30 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
@patch('charmhelpers.contrib.openstack.neutron.os_release')
|
@patch('charmhelpers.contrib.openstack.neutron.os_release')
|
||||||
@patch('os.path.exists')
|
@patch('os.path.exists')
|
||||||
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
||||||
def test_restart_map_api_before_frontends(self, subcontext, _exists,
|
def test_restart_map_api_before_frontends_icehouse(self, subcontext,
|
||||||
_os_release):
|
_exists, _os_release):
|
||||||
_os_release.return_value = 'icehouse'
|
_os_release.return_value = 'icehouse'
|
||||||
|
self.os_release.return_value = 'icehouse'
|
||||||
_exists.return_value = False
|
_exists.return_value = False
|
||||||
self.enable_memcache.return_value = False
|
self.enable_memcache.return_value = False
|
||||||
self._resource_map()
|
self._resource_map()
|
||||||
_map = utils.restart_map()
|
_map = utils.restart_map()
|
||||||
self.assertIsInstance(_map, OrderedDict)
|
self.assertIsInstance(_map, OrderedDict)
|
||||||
self.assertEquals(_map, RESTART_MAP)
|
self.assertEquals(_map, RESTART_MAP_ICEHOUSE)
|
||||||
|
|
||||||
|
@patch('charmhelpers.contrib.openstack.neutron.os_release')
|
||||||
|
@patch('os.path.exists')
|
||||||
|
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
||||||
|
def test_restart_map_api_before_frontends_ocata(self, subcontext,
|
||||||
|
_exists, _os_release):
|
||||||
|
_os_release.return_value = 'ocata'
|
||||||
|
self.os_release.return_value = 'ocata'
|
||||||
|
_exists.return_value = False
|
||||||
|
self.enable_memcache.return_value = False
|
||||||
|
self._resource_map()
|
||||||
|
_map = utils.restart_map()
|
||||||
|
self.assertIsInstance(_map, OrderedDict)
|
||||||
|
self.assertEquals(_map, RESTART_MAP_OCATA)
|
||||||
|
|
||||||
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
||||||
@patch('os.path.exists')
|
@patch('os.path.exists')
|
||||||
@ -317,7 +344,7 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
|
|
||||||
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
||||||
@patch.object(utils, 'git_install_requested')
|
@patch.object(utils, 'git_install_requested')
|
||||||
def test_determine_packages_base(self, git_requested, subcontext):
|
def test_determine_packages_base_icehouse(self, git_requested, subcontext):
|
||||||
git_requested.return_value = False
|
git_requested.return_value = False
|
||||||
self.relation_ids.return_value = []
|
self.relation_ids.return_value = []
|
||||||
self.os_release.return_value = 'icehouse'
|
self.os_release.return_value = 'icehouse'
|
||||||
@ -325,6 +352,20 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
self.enable_memcache.return_value = False
|
self.enable_memcache.return_value = False
|
||||||
pkgs = utils.determine_packages()
|
pkgs = utils.determine_packages()
|
||||||
ex = list(set(utils.BASE_PACKAGES + utils.BASE_SERVICES))
|
ex = list(set(utils.BASE_PACKAGES + utils.BASE_SERVICES))
|
||||||
|
# nova-placement-api is purposely dropped unless it's ocata
|
||||||
|
ex.remove('nova-placement-api')
|
||||||
|
self.assertEquals(ex, pkgs)
|
||||||
|
|
||||||
|
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
||||||
|
@patch.object(utils, 'git_install_requested')
|
||||||
|
def test_determine_packages_base_ocata(self, git_requested, subcontext):
|
||||||
|
git_requested.return_value = False
|
||||||
|
self.relation_ids.return_value = []
|
||||||
|
self.os_release.return_value = 'ocata'
|
||||||
|
self.token_cache_pkgs.return_value = []
|
||||||
|
self.enable_memcache.return_value = False
|
||||||
|
pkgs = utils.determine_packages()
|
||||||
|
ex = list(set(utils.BASE_PACKAGES + utils.BASE_SERVICES))
|
||||||
self.assertEquals(ex, pkgs)
|
self.assertEquals(ex, pkgs)
|
||||||
|
|
||||||
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
||||||
@ -715,6 +756,7 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
'nova-cert': ['identity-service', 'amqp', 'shared-db'],
|
'nova-cert': ['identity-service', 'amqp', 'shared-db'],
|
||||||
'nova-conductor': ['identity-service', 'amqp', 'shared-db'],
|
'nova-conductor': ['identity-service', 'amqp', 'shared-db'],
|
||||||
'nova-objectstore': ['identity-service', 'amqp', 'shared-db'],
|
'nova-objectstore': ['identity-service', 'amqp', 'shared-db'],
|
||||||
|
'nova-placement-api': ['identity-service', 'amqp', 'shared-db'],
|
||||||
'nova-scheduler': ['identity-service', 'amqp', 'shared-db']},
|
'nova-scheduler': ['identity-service', 'amqp', 'shared-db']},
|
||||||
utils.guard_map()
|
utils.guard_map()
|
||||||
)
|
)
|
||||||
@ -729,6 +771,7 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
'nova-cert': ['identity-service', 'amqp', 'shared-db'],
|
'nova-cert': ['identity-service', 'amqp', 'shared-db'],
|
||||||
'nova-conductor': ['identity-service', 'amqp', 'shared-db'],
|
'nova-conductor': ['identity-service', 'amqp', 'shared-db'],
|
||||||
'nova-objectstore': ['identity-service', 'amqp', 'shared-db'],
|
'nova-objectstore': ['identity-service', 'amqp', 'shared-db'],
|
||||||
|
'nova-placement-api': ['identity-service', 'amqp', 'shared-db'],
|
||||||
'nova-scheduler': ['identity-service', 'amqp', 'shared-db'], },
|
'nova-scheduler': ['identity-service', 'amqp', 'shared-db'], },
|
||||||
utils.guard_map()
|
utils.guard_map()
|
||||||
)
|
)
|
||||||
@ -738,6 +781,7 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
{'nova-api-os-compute': ['identity-service', 'amqp', 'shared-db'],
|
{'nova-api-os-compute': ['identity-service', 'amqp', 'shared-db'],
|
||||||
'nova-cert': ['identity-service', 'amqp', 'shared-db'],
|
'nova-cert': ['identity-service', 'amqp', 'shared-db'],
|
||||||
'nova-conductor': ['identity-service', 'amqp', 'shared-db'],
|
'nova-conductor': ['identity-service', 'amqp', 'shared-db'],
|
||||||
|
'nova-placement-api': ['identity-service', 'amqp', 'shared-db'],
|
||||||
'nova-scheduler': ['identity-service', 'amqp', 'shared-db'], },
|
'nova-scheduler': ['identity-service', 'amqp', 'shared-db'], },
|
||||||
utils.guard_map()
|
utils.guard_map()
|
||||||
)
|
)
|
||||||
@ -753,6 +797,8 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
'nova-conductor': ['identity-service', 'amqp', 'pgsql-nova-db'],
|
'nova-conductor': ['identity-service', 'amqp', 'pgsql-nova-db'],
|
||||||
'nova-objectstore': ['identity-service', 'amqp',
|
'nova-objectstore': ['identity-service', 'amqp',
|
||||||
'pgsql-nova-db'],
|
'pgsql-nova-db'],
|
||||||
|
'nova-placement-api': ['identity-service', 'amqp',
|
||||||
|
'pgsql-nova-db'],
|
||||||
'nova-scheduler': ['identity-service', 'amqp',
|
'nova-scheduler': ['identity-service', 'amqp',
|
||||||
'pgsql-nova-db'], },
|
'pgsql-nova-db'], },
|
||||||
utils.guard_map()
|
utils.guard_map()
|
||||||
|
Loading…
Reference in New Issue
Block a user