Merge "Drop support for Neutron functionality"
This commit is contained in:
commit
1e17fbc64e
@ -2,11 +2,6 @@
|
|||||||
|
|
||||||
Cloud controller node for OpenStack nova. Contains nova-schedule, nova-api, nova-network and nova-objectstore.
|
Cloud controller node for OpenStack nova. Contains nova-schedule, nova-api, nova-network and nova-objectstore.
|
||||||
|
|
||||||
The neutron-api interface can be used join this charm with an external neutron-api server. If this is done
|
|
||||||
then this charm will shutdown its neutron-api service and the external charm will be registered as the
|
|
||||||
neutron-api endpoint in keystone. It will also use the quantum-security-groups setting which is passed to
|
|
||||||
it by the api service rather than its own quantum-security-groups setting.
|
|
||||||
|
|
||||||
If console access is required then console-proxy-ip should be set to a client accessible IP that resolves
|
If console access is required then console-proxy-ip should be set to a client accessible IP that resolves
|
||||||
to the nova-cloud-controller. If running in HA mode then the public vip is used if console-proxy-ip is set
|
to the nova-cloud-controller. If running in HA mode then the public vip is used if console-proxy-ip is set
|
||||||
to local. Note: The console access protocol is baked into a guest when it is created, if you change it then
|
to local. Note: The console access protocol is baked into a guest when it is created, if you change it then
|
||||||
|
65
config.yaml
65
config.yaml
@ -75,20 +75,6 @@ options:
|
|||||||
description: |
|
description: |
|
||||||
Comma-separated list of key=value sqlalchemy related config flags to be
|
Comma-separated list of key=value sqlalchemy related config flags to be
|
||||||
set in nova.conf [database] section.
|
set in nova.conf [database] section.
|
||||||
neutron-database-user:
|
|
||||||
default: neutron
|
|
||||||
type: string
|
|
||||||
description: Username for Neutron database access (if enabled)
|
|
||||||
neutron-database:
|
|
||||||
default: neutron
|
|
||||||
type: string
|
|
||||||
description: Database name for Neutron (if enabled)
|
|
||||||
neutron-alchemy-flags:
|
|
||||||
type: string
|
|
||||||
default:
|
|
||||||
description: |
|
|
||||||
Comma-separated list of key=value sqlalchemy related config flags to be
|
|
||||||
set in neutron.conf [database] section.
|
|
||||||
network-manager:
|
network-manager:
|
||||||
default: FlatDHCPManager
|
default: FlatDHCPManager
|
||||||
type: string
|
type: string
|
||||||
@ -113,27 +99,6 @@ options:
|
|||||||
default: 255.255.255.0
|
default: 255.255.255.0
|
||||||
type: string
|
type: string
|
||||||
description: Netmask to be assigned to bridge interface
|
description: Netmask to be assigned to bridge interface
|
||||||
quantum-plugin:
|
|
||||||
default: ovs
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
Quantum plugin to use for network management; supports:
|
|
||||||
|
|
||||||
ovs - OpenvSwitch Plugin
|
|
||||||
nvp|nsx - Nicira Network Virtualization Platform/
|
|
||||||
VMware NSX Network Virtualization Platform
|
|
||||||
(renamed for Icehouse)
|
|
||||||
vsp - Nuage Networks VSP
|
|
||||||
|
|
||||||
This configuration only has context when used with network-manager
|
|
||||||
Quantum|Neutron.
|
|
||||||
quantum-security-groups:
|
|
||||||
type: string
|
|
||||||
default: "no"
|
|
||||||
description: |
|
|
||||||
Use quantum for security group management.
|
|
||||||
.
|
|
||||||
Only supported for >= grizzly.
|
|
||||||
neutron-external-network:
|
neutron-external-network:
|
||||||
type: string
|
type: string
|
||||||
default: ext_net
|
default: ext_net
|
||||||
@ -232,36 +197,6 @@ options:
|
|||||||
description: |
|
description: |
|
||||||
SSL CA to use with the certificate and key provided - this is only
|
SSL CA to use with the certificate and key provided - this is only
|
||||||
required if you are providing a privately signed ssl_cert and ssl_key.
|
required if you are providing a privately signed ssl_cert and ssl_key.
|
||||||
# Neutron NVP and VMware NSX plugin configuration
|
|
||||||
nvp-controllers:
|
|
||||||
type: string
|
|
||||||
default:
|
|
||||||
description: Space delimited addresses of NVP/NSX controllers
|
|
||||||
nvp-username:
|
|
||||||
type: string
|
|
||||||
default: admin
|
|
||||||
description: Username to connect to NVP/NSX controllers with
|
|
||||||
nvp-password:
|
|
||||||
type: string
|
|
||||||
default: admin
|
|
||||||
description: Password to connect to NVP/NSX controllers with
|
|
||||||
nvp-cluster-name:
|
|
||||||
type: string
|
|
||||||
default: example
|
|
||||||
description: Name of the NVP cluster configuration to create (grizzly only)
|
|
||||||
nvp-tz-uuid:
|
|
||||||
type: string
|
|
||||||
default:
|
|
||||||
description: |
|
|
||||||
This is uuid of the default NVP/NSX Transport zone that will be used for
|
|
||||||
creating tunneled isolated Quantum networks. It needs to be created
|
|
||||||
in NVP before starting Quantum with the nvp plugin.
|
|
||||||
nvp-l3-uuid:
|
|
||||||
type: string
|
|
||||||
default:
|
|
||||||
description: |
|
|
||||||
This is uuid of the default NVP/NSX L3 Gateway Service.
|
|
||||||
# end of NVP/NSX configuration
|
|
||||||
# Network configuration options
|
# Network configuration options
|
||||||
# by default all access is over 'private-address'
|
# by default all access is over 'private-address'
|
||||||
os-admin-network:
|
os-admin-network:
|
||||||
|
@ -10,7 +10,6 @@ from charmhelpers.core.hookenv import (
|
|||||||
related_units,
|
related_units,
|
||||||
relations_for_id,
|
relations_for_id,
|
||||||
relation_get,
|
relation_get,
|
||||||
is_relation_made,
|
|
||||||
unit_get,
|
unit_get,
|
||||||
)
|
)
|
||||||
from charmhelpers.contrib.openstack import (
|
from charmhelpers.contrib.openstack import (
|
||||||
@ -141,9 +140,6 @@ 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)
|
||||||
neutron_api = determine_api_port(api_port('neutron-server'),
|
|
||||||
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)
|
||||||
@ -151,9 +147,6 @@ 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_neutron_api = determine_apache_port(api_port('neutron-server'),
|
|
||||||
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,
|
||||||
@ -170,15 +163,6 @@ class HAProxyContext(context.HAProxyContext):
|
|||||||
api_port('nova-objectstore'), a_s3_api],
|
api_port('nova-objectstore'), a_s3_api],
|
||||||
}
|
}
|
||||||
|
|
||||||
if not is_relation_made('neutron-api'):
|
|
||||||
if neutron.network_manager() == 'neutron':
|
|
||||||
port_mapping.update({
|
|
||||||
'neutron-server': [
|
|
||||||
api_port('neutron-server'), a_neutron_api]
|
|
||||||
})
|
|
||||||
# neutron.conf listening port, set separte from nova's.
|
|
||||||
ctxt['neutron_bind_port'] = neutron_api
|
|
||||||
|
|
||||||
# for haproxy.conf
|
# for haproxy.conf
|
||||||
ctxt['service_ports'] = port_mapping
|
ctxt['service_ports'] = port_mapping
|
||||||
# for nova.conf
|
# for nova.conf
|
||||||
@ -198,38 +182,13 @@ def canonical_url():
|
|||||||
return '%s://%s' % (scheme, format_ipv6_addr(addr) or addr)
|
return '%s://%s' % (scheme, format_ipv6_addr(addr) or addr)
|
||||||
|
|
||||||
|
|
||||||
def use_local_neutron_api():
|
|
||||||
"""If no neutron-api relation exists returns True.
|
|
||||||
|
|
||||||
If no neutron-api relation exists we assume that we are going to use
|
|
||||||
legacy-mode i.e. local neutron server.
|
|
||||||
"""
|
|
||||||
for rid in relation_ids('neutron-api'):
|
|
||||||
for unit in related_units(rid):
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
class NeutronCCContext(context.NeutronContext):
|
class NeutronCCContext(context.NeutronContext):
|
||||||
interfaces = ['quantum-network-service', 'neutron-network-service']
|
interfaces = ['quantum-network-service', 'neutron-network-service']
|
||||||
|
|
||||||
@property
|
|
||||||
def plugin(self):
|
|
||||||
from nova_cc_utils import neutron_plugin
|
|
||||||
return neutron_plugin()
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def network_manager(self):
|
def network_manager(self):
|
||||||
return neutron.network_manager()
|
return neutron.network_manager()
|
||||||
|
|
||||||
@property
|
|
||||||
def neutron_security_groups(self):
|
|
||||||
# TODO: review use of this flag
|
|
||||||
sec_groups = (config('neutron-security-groups') or
|
|
||||||
config('quantum-security-groups'))
|
|
||||||
return sec_groups.lower() == 'yes'
|
|
||||||
|
|
||||||
def _ensure_packages(self):
|
def _ensure_packages(self):
|
||||||
# Only compute nodes need to ensure packages here, to install
|
# Only compute nodes need to ensure packages here, to install
|
||||||
# required agents.
|
# required agents.
|
||||||
@ -238,21 +197,7 @@ class NeutronCCContext(context.NeutronContext):
|
|||||||
def __call__(self):
|
def __call__(self):
|
||||||
ctxt = super(NeutronCCContext, self).__call__()
|
ctxt = super(NeutronCCContext, self).__call__()
|
||||||
ctxt['external_network'] = config('neutron-external-network')
|
ctxt['external_network'] = config('neutron-external-network')
|
||||||
if config('quantum-plugin') in ['nvp', 'nsx']:
|
|
||||||
_config = config()
|
|
||||||
for k, v in _config.iteritems():
|
|
||||||
if k.startswith('nvp'):
|
|
||||||
ctxt[k.replace('-', '_')] = v
|
|
||||||
if 'nvp-controllers' in _config:
|
|
||||||
ctxt['nvp_controllers'] = \
|
|
||||||
','.join(_config['nvp-controllers'].split())
|
|
||||||
ctxt['nvp_controllers_list'] = \
|
|
||||||
_config['nvp-controllers'].split()
|
|
||||||
|
|
||||||
ctxt['nova_url'] = "{}:8774/v2".format(canonical_url())
|
ctxt['nova_url'] = "{}:8774/v2".format(canonical_url())
|
||||||
if use_local_neutron_api():
|
|
||||||
ctxt['neutron_url'] = "{}:9696".format(canonical_url())
|
|
||||||
|
|
||||||
return ctxt
|
return ctxt
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,10 +31,7 @@ from charmhelpers.core.hookenv import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from charmhelpers.core.host import (
|
from charmhelpers.core.host import (
|
||||||
service_running,
|
|
||||||
service_stop,
|
|
||||||
service_reload,
|
service_reload,
|
||||||
service_restart,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
from charmhelpers.fetch import (
|
from charmhelpers.fetch import (
|
||||||
@ -58,7 +55,6 @@ from charmhelpers.contrib.openstack.utils import (
|
|||||||
|
|
||||||
from charmhelpers.contrib.openstack.neutron import (
|
from charmhelpers.contrib.openstack.neutron import (
|
||||||
network_manager,
|
network_manager,
|
||||||
neutron_plugin_attribute,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
from nova_cc_context import (
|
from nova_cc_context import (
|
||||||
@ -72,7 +68,6 @@ from charmhelpers.contrib.peerstorage import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from nova_cc_utils import (
|
from nova_cc_utils import (
|
||||||
api_port,
|
|
||||||
auth_token_config,
|
auth_token_config,
|
||||||
cmd_all_services,
|
cmd_all_services,
|
||||||
determine_endpoints,
|
determine_endpoints,
|
||||||
@ -84,9 +79,7 @@ from nova_cc_utils import (
|
|||||||
git_install,
|
git_install,
|
||||||
is_api_ready,
|
is_api_ready,
|
||||||
keystone_ca_cert_b64,
|
keystone_ca_cert_b64,
|
||||||
migrate_neutron_database,
|
|
||||||
migrate_nova_database,
|
migrate_nova_database,
|
||||||
neutron_plugin,
|
|
||||||
save_script_rc,
|
save_script_rc,
|
||||||
services,
|
services,
|
||||||
ssh_compute_add,
|
ssh_compute_add,
|
||||||
@ -97,7 +90,6 @@ from nova_cc_utils import (
|
|||||||
restart_map,
|
restart_map,
|
||||||
CLUSTER_RES,
|
CLUSTER_RES,
|
||||||
NOVA_CONF,
|
NOVA_CONF,
|
||||||
NEUTRON_CONF,
|
|
||||||
console_attributes,
|
console_attributes,
|
||||||
service_guard,
|
service_guard,
|
||||||
guard_map,
|
guard_map,
|
||||||
@ -180,8 +172,6 @@ def leader_init_db_if_ready(skip_acl_check=False, skip_cells_restarts=False,
|
|||||||
log('Triggering remote cell restarts.')
|
log('Triggering remote cell restarts.')
|
||||||
[nova_cell_relation_joined(rid=rid, remote_restart=True)
|
[nova_cell_relation_joined(rid=rid, remote_restart=True)
|
||||||
for rid in relation_ids('cell')]
|
for rid in relation_ids('cell')]
|
||||||
|
|
||||||
conditional_neutron_migration()
|
|
||||||
else:
|
else:
|
||||||
log('allowed_units either not presented, or local unit '
|
log('allowed_units either not presented, or local unit '
|
||||||
'not in acl list: %s' % repr(allowed_units))
|
'not in acl list: %s' % repr(allowed_units))
|
||||||
@ -298,9 +288,6 @@ def amqp_changed():
|
|||||||
log('amqp relation incomplete. Peer not ready?')
|
log('amqp relation incomplete. Peer not ready?')
|
||||||
return
|
return
|
||||||
CONFIGS.write(NOVA_CONF)
|
CONFIGS.write(NOVA_CONF)
|
||||||
if not is_relation_made('neutron-api'):
|
|
||||||
if network_manager() == 'neutron':
|
|
||||||
CONFIGS.write(NEUTRON_CONF)
|
|
||||||
[nova_cell_relation_joined(rid=rid)
|
[nova_cell_relation_joined(rid=rid)
|
||||||
for rid in relation_ids('cell')]
|
for rid in relation_ids('cell')]
|
||||||
|
|
||||||
@ -308,29 +295,6 @@ def amqp_changed():
|
|||||||
nova_api_relation_joined(rid=r_id)
|
nova_api_relation_joined(rid=r_id)
|
||||||
|
|
||||||
|
|
||||||
def conditional_neutron_migration():
|
|
||||||
if os_release('nova-common') <= 'icehouse':
|
|
||||||
log('Not running neutron database migration as migrations are handled '
|
|
||||||
'by the neutron-server process.')
|
|
||||||
elif os_release('nova-common') >= 'kilo':
|
|
||||||
log('Not running neutron database migration as migrations are by '
|
|
||||||
'the neutron-api charm.')
|
|
||||||
else:
|
|
||||||
if not config('quantum-plugin') == 'vsp':
|
|
||||||
status_set('maintenance', 'Running neutron db migration')
|
|
||||||
migrate_neutron_database()
|
|
||||||
else:
|
|
||||||
log('Not running neutron database migration as migrations are '
|
|
||||||
'handled by the neutron-api charm in case of VSP(juno).')
|
|
||||||
|
|
||||||
# neutron-api service may have appeared while the migration was
|
|
||||||
# running so prod it just in case
|
|
||||||
[neutron_api_relation_joined(rid=rid, remote_restart=True)
|
|
||||||
for rid in relation_ids('neutron-api')]
|
|
||||||
if 'neutron-server' in services() and not is_unit_paused_set():
|
|
||||||
service_restart('neutron-server')
|
|
||||||
|
|
||||||
|
|
||||||
@hooks.hook('shared-db-relation-joined')
|
@hooks.hook('shared-db-relation-joined')
|
||||||
def db_joined(relation_id=None):
|
def db_joined(relation_id=None):
|
||||||
if is_relation_made('pgsql-nova-db') or \
|
if is_relation_made('pgsql-nova-db') or \
|
||||||
@ -341,11 +305,6 @@ def db_joined(relation_id=None):
|
|||||||
log(e, level=ERROR)
|
log(e, level=ERROR)
|
||||||
raise Exception(e)
|
raise Exception(e)
|
||||||
|
|
||||||
if network_manager() == 'neutron':
|
|
||||||
config_neutron = True
|
|
||||||
else:
|
|
||||||
config_neutron = False
|
|
||||||
|
|
||||||
if config('prefer-ipv6'):
|
if config('prefer-ipv6'):
|
||||||
sync_db_with_multi_ipv6_addresses(config('database'),
|
sync_db_with_multi_ipv6_addresses(config('database'),
|
||||||
config('database-user'),
|
config('database-user'),
|
||||||
@ -357,10 +316,6 @@ def db_joined(relation_id=None):
|
|||||||
config('database-user'),
|
config('database-user'),
|
||||||
relation_prefix='novaapi')
|
relation_prefix='novaapi')
|
||||||
|
|
||||||
if config_neutron:
|
|
||||||
sync_db_with_multi_ipv6_addresses(config('neutron-database'),
|
|
||||||
config('neutron-database-user'),
|
|
||||||
relation_prefix='neutron')
|
|
||||||
else:
|
else:
|
||||||
host = unit_get('private-address')
|
host = unit_get('private-address')
|
||||||
relation_set(nova_database=config('database'),
|
relation_set(nova_database=config('database'),
|
||||||
@ -375,12 +330,6 @@ def db_joined(relation_id=None):
|
|||||||
novaapi_hostname=host,
|
novaapi_hostname=host,
|
||||||
relation_id=relation_id)
|
relation_id=relation_id)
|
||||||
|
|
||||||
if config_neutron:
|
|
||||||
relation_set(neutron_database=config('neutron-database'),
|
|
||||||
neutron_username=config('neutron-database-user'),
|
|
||||||
neutron_hostname=host,
|
|
||||||
relation_id=relation_id)
|
|
||||||
|
|
||||||
|
|
||||||
@hooks.hook('pgsql-nova-db-relation-joined')
|
@hooks.hook('pgsql-nova-db-relation-joined')
|
||||||
def pgsql_nova_db_joined():
|
def pgsql_nova_db_joined():
|
||||||
@ -394,18 +343,6 @@ def pgsql_nova_db_joined():
|
|||||||
relation_set(database=config('database'))
|
relation_set(database=config('database'))
|
||||||
|
|
||||||
|
|
||||||
@hooks.hook('pgsql-neutron-db-relation-joined')
|
|
||||||
def pgsql_neutron_db_joined():
|
|
||||||
if is_relation_made('shared-db'):
|
|
||||||
# raise error
|
|
||||||
e = ('Attempting to associate a postgresql database'
|
|
||||||
' when there is already associated a mysql one')
|
|
||||||
log(e, level=ERROR)
|
|
||||||
raise Exception(e)
|
|
||||||
|
|
||||||
relation_set(database=config('neutron-database'))
|
|
||||||
|
|
||||||
|
|
||||||
@hooks.hook('shared-db-relation-changed')
|
@hooks.hook('shared-db-relation-changed')
|
||||||
@service_guard(guard_map(), CONFIGS,
|
@service_guard(guard_map(), CONFIGS,
|
||||||
active=config('service-guard'))
|
active=config('service-guard'))
|
||||||
@ -435,17 +372,6 @@ def postgresql_nova_db_changed():
|
|||||||
nova_api_relation_joined(rid=r_id)
|
nova_api_relation_joined(rid=r_id)
|
||||||
|
|
||||||
|
|
||||||
@hooks.hook('pgsql-neutron-db-relation-changed')
|
|
||||||
@service_guard(guard_map(), CONFIGS,
|
|
||||||
active=config('service-guard'))
|
|
||||||
@restart_on_change(restart_map())
|
|
||||||
def postgresql_neutron_db_changed():
|
|
||||||
if network_manager() == 'neutron':
|
|
||||||
plugin = neutron_plugin()
|
|
||||||
# DB config might have been moved to main neutron.conf in H?
|
|
||||||
CONFIGS.write(neutron_plugin_attribute(plugin, 'config'))
|
|
||||||
|
|
||||||
|
|
||||||
@hooks.hook('image-service-relation-changed')
|
@hooks.hook('image-service-relation-changed')
|
||||||
@service_guard(guard_map(), CONFIGS,
|
@service_guard(guard_map(), CONFIGS,
|
||||||
active=config('service-guard'))
|
active=config('service-guard'))
|
||||||
@ -481,9 +407,6 @@ def identity_changed():
|
|||||||
return
|
return
|
||||||
CONFIGS.write('/etc/nova/api-paste.ini')
|
CONFIGS.write('/etc/nova/api-paste.ini')
|
||||||
CONFIGS.write(NOVA_CONF)
|
CONFIGS.write(NOVA_CONF)
|
||||||
if not is_relation_made('neutron-api'):
|
|
||||||
if network_manager() == 'neutron':
|
|
||||||
CONFIGS.write(NEUTRON_CONF)
|
|
||||||
[compute_joined(rid) for rid in relation_ids('cloud-compute')]
|
[compute_joined(rid) for rid in relation_ids('cloud-compute')]
|
||||||
[quantum_joined(rid) for rid in relation_ids('quantum-network-service')]
|
[quantum_joined(rid) for rid in relation_ids('quantum-network-service')]
|
||||||
[nova_vmware_relation_joined(rid) for rid in relation_ids('nova-vmware')]
|
[nova_vmware_relation_joined(rid) for rid in relation_ids('nova-vmware')]
|
||||||
@ -558,18 +481,9 @@ def neutron_settings():
|
|||||||
neutron_api_info['neutron_security_groups'],
|
neutron_api_info['neutron_security_groups'],
|
||||||
'quantum_url': neutron_api_info['neutron_url'],
|
'quantum_url': neutron_api_info['neutron_url'],
|
||||||
})
|
})
|
||||||
else:
|
neutron_url = urlparse(neutron_settings['quantum_url'])
|
||||||
neutron_settings.update({
|
neutron_settings['quantum_host'] = neutron_url.hostname
|
||||||
# XXX: Rename these relations settings?
|
neutron_settings['quantum_port'] = neutron_url.port
|
||||||
'quantum_plugin': neutron_plugin(),
|
|
||||||
'region': config('region'),
|
|
||||||
'quantum_security_groups': config('quantum-security-groups'),
|
|
||||||
'quantum_url': "{}:{}".format(canonical_url(CONFIGS, INTERNAL),
|
|
||||||
str(api_port('neutron-server'))),
|
|
||||||
})
|
|
||||||
neutron_url = urlparse(neutron_settings['quantum_url'])
|
|
||||||
neutron_settings['quantum_host'] = neutron_url.hostname
|
|
||||||
neutron_settings['quantum_port'] = neutron_url.port
|
|
||||||
return neutron_settings
|
return neutron_settings
|
||||||
|
|
||||||
|
|
||||||
@ -847,9 +761,6 @@ def ha_changed():
|
|||||||
return
|
return
|
||||||
|
|
||||||
CONFIGS.write(NOVA_CONF)
|
CONFIGS.write(NOVA_CONF)
|
||||||
if not is_relation_made('neutron-api'):
|
|
||||||
if network_manager() == 'neutron':
|
|
||||||
CONFIGS.write(NEUTRON_CONF)
|
|
||||||
|
|
||||||
log('Cluster configured, notifying other services and updating '
|
log('Cluster configured, notifying other services and updating '
|
||||||
'keystone endpoint configuration')
|
'keystone endpoint configuration')
|
||||||
@ -917,11 +828,7 @@ def nova_vmware_relation_joined(rid=None):
|
|||||||
ks_auth = _auth_config()
|
ks_auth = _auth_config()
|
||||||
if ks_auth:
|
if ks_auth:
|
||||||
rel_settings.update(ks_auth)
|
rel_settings.update(ks_auth)
|
||||||
rel_settings.update({
|
rel_settings.update(neutron_settings())
|
||||||
'quantum_plugin': neutron_plugin(),
|
|
||||||
'quantum_security_groups': config('quantum-security-groups'),
|
|
||||||
'quantum_url': "{}:{}".format(canonical_url(CONFIGS, INTERNAL),
|
|
||||||
str(api_port('neutron-server')))})
|
|
||||||
|
|
||||||
relation_set(relation_id=rid, **rel_settings)
|
relation_set(relation_id=rid, **rel_settings)
|
||||||
|
|
||||||
@ -992,12 +899,6 @@ def get_cell_type():
|
|||||||
|
|
||||||
@hooks.hook('neutron-api-relation-joined')
|
@hooks.hook('neutron-api-relation-joined')
|
||||||
def neutron_api_relation_joined(rid=None, remote_restart=False):
|
def neutron_api_relation_joined(rid=None, remote_restart=False):
|
||||||
with open('/etc/init/neutron-server.override', 'wb') as out:
|
|
||||||
out.write('manual\n')
|
|
||||||
if os.path.isfile(NEUTRON_CONF):
|
|
||||||
os.rename(NEUTRON_CONF, NEUTRON_CONF + '_unused')
|
|
||||||
if service_running('neutron-server'):
|
|
||||||
service_stop('neutron-server')
|
|
||||||
for id_rid in relation_ids('identity-service'):
|
for id_rid in relation_ids('identity-service'):
|
||||||
identity_joined(rid=id_rid)
|
identity_joined(rid=id_rid)
|
||||||
rel_settings = {
|
rel_settings = {
|
||||||
@ -1027,8 +928,6 @@ def neutron_api_relation_changed():
|
|||||||
active=config('service-guard'))
|
active=config('service-guard'))
|
||||||
@restart_on_change(restart_map())
|
@restart_on_change(restart_map())
|
||||||
def neutron_api_relation_broken():
|
def neutron_api_relation_broken():
|
||||||
if os.path.isfile('/etc/init/neutron-server.override'):
|
|
||||||
os.remove('/etc/init/neutron-server.override')
|
|
||||||
CONFIGS.write_all()
|
CONFIGS.write_all()
|
||||||
for rid in relation_ids('cloud-compute'):
|
for rid in relation_ids('cloud-compute'):
|
||||||
compute_joined(rid=rid)
|
compute_joined(rid=rid)
|
||||||
|
@ -8,8 +8,6 @@ from collections import OrderedDict
|
|||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
|
|
||||||
from charmhelpers.contrib.openstack import context, templating
|
from charmhelpers.contrib.openstack import context, templating
|
||||||
from charmhelpers.contrib.openstack.neutron import (
|
|
||||||
network_manager, neutron_plugin_attribute)
|
|
||||||
|
|
||||||
from charmhelpers.contrib.hahelpers.cluster import (
|
from charmhelpers.contrib.hahelpers.cluster import (
|
||||||
is_elected_leader,
|
is_elected_leader,
|
||||||
@ -60,7 +58,6 @@ from charmhelpers.core.hookenv import (
|
|||||||
relation_get,
|
relation_get,
|
||||||
relation_ids,
|
relation_ids,
|
||||||
remote_unit,
|
remote_unit,
|
||||||
is_relation_made,
|
|
||||||
DEBUG,
|
DEBUG,
|
||||||
INFO,
|
INFO,
|
||||||
ERROR,
|
ERROR,
|
||||||
@ -179,7 +176,6 @@ API_PORTS = {
|
|||||||
'nova-api-os-compute': 8774,
|
'nova-api-os-compute': 8774,
|
||||||
'nova-api-os-volume': 8776,
|
'nova-api-os-volume': 8776,
|
||||||
'nova-objectstore': 3333,
|
'nova-objectstore': 3333,
|
||||||
'neutron-server': 9696,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NOVA_CONF_DIR = "/etc/nova"
|
NOVA_CONF_DIR = "/etc/nova"
|
||||||
@ -187,11 +183,9 @@ NEUTRON_CONF_DIR = "/etc/neutron"
|
|||||||
|
|
||||||
NOVA_CONF = '%s/nova.conf' % NOVA_CONF_DIR
|
NOVA_CONF = '%s/nova.conf' % NOVA_CONF_DIR
|
||||||
NOVA_API_PASTE = '%s/api-paste.ini' % NOVA_CONF_DIR
|
NOVA_API_PASTE = '%s/api-paste.ini' % NOVA_CONF_DIR
|
||||||
NEUTRON_CONF = '%s/neutron.conf' % NEUTRON_CONF_DIR
|
|
||||||
HAPROXY_CONF = '/etc/haproxy/haproxy.cfg'
|
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'
|
||||||
NEUTRON_DEFAULT = '/etc/default/neutron-server'
|
|
||||||
|
|
||||||
|
|
||||||
def resolve_services():
|
def resolve_services():
|
||||||
@ -243,28 +237,6 @@ BASE_RESOURCE_MAP = OrderedDict([
|
|||||||
'contexts': [nova_cc_context.IdentityServiceContext(),
|
'contexts': [nova_cc_context.IdentityServiceContext(),
|
||||||
nova_cc_context.APIRateLimitingContext()],
|
nova_cc_context.APIRateLimitingContext()],
|
||||||
}),
|
}),
|
||||||
(NEUTRON_CONF, {
|
|
||||||
'services': ['neutron-server'],
|
|
||||||
'contexts': [context.AMQPContext(ssl_dir=NEUTRON_CONF_DIR),
|
|
||||||
context.SharedDBContext(
|
|
||||||
user=config('neutron-database-user'),
|
|
||||||
database=config('neutron-database'),
|
|
||||||
relation_prefix='neutron',
|
|
||||||
ssl_dir=NEUTRON_CONF_DIR),
|
|
||||||
nova_cc_context.NeutronPostgresqlDBContext(),
|
|
||||||
nova_cc_context.IdentityServiceContext(
|
|
||||||
service='neutron',
|
|
||||||
service_user='neutron'),
|
|
||||||
nova_cc_context.NeutronCCContext(),
|
|
||||||
nova_cc_context.HAProxyContext(),
|
|
||||||
context.SyslogContext(),
|
|
||||||
nova_cc_context.NovaConfigContext(),
|
|
||||||
context.BindHostContext()],
|
|
||||||
}),
|
|
||||||
(NEUTRON_DEFAULT, {
|
|
||||||
'services': ['neutron-server'],
|
|
||||||
'contexts': [nova_cc_context.NeutronCCContext()],
|
|
||||||
}),
|
|
||||||
(HAPROXY_CONF, {
|
(HAPROXY_CONF, {
|
||||||
'contexts': [context.HAProxyContext(singlenode_mode=True),
|
'contexts': [context.HAProxyContext(singlenode_mode=True),
|
||||||
nova_cc_context.HAProxyContext()],
|
nova_cc_context.HAProxyContext()],
|
||||||
@ -313,8 +285,6 @@ def resource_map():
|
|||||||
'''
|
'''
|
||||||
resource_map = deepcopy(BASE_RESOURCE_MAP)
|
resource_map = deepcopy(BASE_RESOURCE_MAP)
|
||||||
|
|
||||||
net_manager = network_manager()
|
|
||||||
|
|
||||||
if os.path.exists('/etc/apache2/conf-available'):
|
if os.path.exists('/etc/apache2/conf-available'):
|
||||||
resource_map.pop(APACHE_CONF)
|
resource_map.pop(APACHE_CONF)
|
||||||
else:
|
else:
|
||||||
@ -322,38 +292,6 @@ def resource_map():
|
|||||||
|
|
||||||
resource_map[NOVA_CONF]['contexts'].append(
|
resource_map[NOVA_CONF]['contexts'].append(
|
||||||
nova_cc_context.NeutronCCContext())
|
nova_cc_context.NeutronCCContext())
|
||||||
# pop out irrelevant resources from the OrderedDict (easier than adding
|
|
||||||
# them late)
|
|
||||||
if net_manager != 'neutron':
|
|
||||||
[resource_map.pop(k) for k in list(resource_map.iterkeys())
|
|
||||||
if 'neutron' in k]
|
|
||||||
# add neutron plugin requirements. nova-c-c only needs the
|
|
||||||
# neutron-server associated with configs, not the plugin agent.
|
|
||||||
if net_manager == 'neutron':
|
|
||||||
plugin = neutron_plugin()
|
|
||||||
if plugin:
|
|
||||||
conf = neutron_plugin_attribute(plugin, 'config', net_manager)
|
|
||||||
ctxts = (neutron_plugin_attribute(plugin, 'contexts',
|
|
||||||
net_manager) or [])
|
|
||||||
services = neutron_plugin_attribute(plugin, 'server_services',
|
|
||||||
net_manager)
|
|
||||||
resource_map[conf] = {}
|
|
||||||
resource_map[conf]['services'] = services
|
|
||||||
resource_map[conf]['contexts'] = ctxts
|
|
||||||
resource_map[conf]['contexts'].append(
|
|
||||||
nova_cc_context.NeutronCCContext())
|
|
||||||
|
|
||||||
# update for postgres
|
|
||||||
resource_map[conf]['contexts'].append(
|
|
||||||
nova_cc_context.NeutronPostgresqlDBContext())
|
|
||||||
|
|
||||||
if is_relation_made('neutron-api'):
|
|
||||||
for k in list(resource_map.iterkeys()):
|
|
||||||
# neutron-api runs neutron services
|
|
||||||
if 'neutron' in k:
|
|
||||||
resource_map[k]['services'] = []
|
|
||||||
resource_map[NOVA_CONF]['contexts'].append(
|
|
||||||
nova_cc_context.NeutronAPIContext())
|
|
||||||
|
|
||||||
if os_release('nova-common') >= 'mitaka':
|
if os_release('nova-common') >= 'mitaka':
|
||||||
resource_map[NOVA_CONF]['contexts'].append(
|
resource_map[NOVA_CONF]['contexts'].append(
|
||||||
@ -444,10 +382,6 @@ def determine_packages():
|
|||||||
packages = [] + BASE_PACKAGES
|
packages = [] + BASE_PACKAGES
|
||||||
for v in resource_map().values():
|
for v in resource_map().values():
|
||||||
packages.extend(v['services'])
|
packages.extend(v['services'])
|
||||||
if network_manager() == 'neutron':
|
|
||||||
pkgs = neutron_plugin_attribute(neutron_plugin(), 'server_packages',
|
|
||||||
network_manager())
|
|
||||||
packages.extend(pkgs)
|
|
||||||
if console_attributes('packages'):
|
if console_attributes('packages'):
|
||||||
packages.extend(console_attributes('packages'))
|
packages.extend(console_attributes('packages'))
|
||||||
|
|
||||||
@ -474,8 +408,6 @@ def save_script_rc():
|
|||||||
}
|
}
|
||||||
if relation_ids('nova-volume-service'):
|
if relation_ids('nova-volume-service'):
|
||||||
env_vars['OPENSTACK_SERVICE_API_OS_VOL'] = 'nova-api-os-volume'
|
env_vars['OPENSTACK_SERVICE_API_OS_VOL'] = 'nova-api-os-volume'
|
||||||
if network_manager() == 'neutron':
|
|
||||||
env_vars['OPENSTACK_SERVICE_API_NEUTRON'] = 'neutron-server'
|
|
||||||
_save_script_rc(**env_vars)
|
_save_script_rc(**env_vars)
|
||||||
|
|
||||||
|
|
||||||
@ -509,7 +441,7 @@ POLICY_RC_D = """#!/bin/bash
|
|||||||
set -e
|
set -e
|
||||||
|
|
||||||
case $1 in
|
case $1 in
|
||||||
neutron-server|quantum-server|nova-*)
|
nova-*)
|
||||||
[ $2 = "start" ] && exit 101
|
[ $2 = "start" ] && exit 101
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@ -530,36 +462,12 @@ def disable_policy_rcd():
|
|||||||
os.unlink('/usr/sbin/policy-rc.d')
|
os.unlink('/usr/sbin/policy-rc.d')
|
||||||
|
|
||||||
|
|
||||||
NEUTRON_DB_MANAGE = "neutron-db-manage"
|
|
||||||
|
|
||||||
|
|
||||||
def reset_os_release():
|
def reset_os_release():
|
||||||
# Ugly hack to make os_release re-read versions
|
# Ugly hack to make os_release re-read versions
|
||||||
import charmhelpers.contrib.openstack.utils as utils
|
import charmhelpers.contrib.openstack.utils as utils
|
||||||
utils.os_rel = None
|
utils.os_rel = None
|
||||||
|
|
||||||
|
|
||||||
def neutron_db_manage(actions):
|
|
||||||
net_manager = network_manager()
|
|
||||||
if net_manager == 'neutron':
|
|
||||||
plugin = neutron_plugin()
|
|
||||||
conf = neutron_plugin_attribute(plugin, 'config', net_manager)
|
|
||||||
subprocess.check_call([
|
|
||||||
NEUTRON_DB_MANAGE,
|
|
||||||
'--config-file=/etc/{mgr}/{mgr}.conf'.format(mgr=net_manager),
|
|
||||||
'--config-file={}'.format(conf)] + actions
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def get_db_connection():
|
|
||||||
config = ConfigParser.RawConfigParser()
|
|
||||||
config.read(NEUTRON_CONF)
|
|
||||||
try:
|
|
||||||
return config.get('database', 'connection')
|
|
||||||
except:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def is_db_initialised():
|
def is_db_initialised():
|
||||||
if relation_ids('cluster'):
|
if relation_ids('cluster'):
|
||||||
dbsync_state = peer_retrieve('dbsync_state')
|
dbsync_state = peer_retrieve('dbsync_state')
|
||||||
@ -573,7 +481,6 @@ def is_db_initialised():
|
|||||||
|
|
||||||
def _do_openstack_upgrade(new_src):
|
def _do_openstack_upgrade(new_src):
|
||||||
enable_policy_rcd()
|
enable_policy_rcd()
|
||||||
cur_os_rel = os_release('nova-common')
|
|
||||||
new_os_rel = get_os_codename_install_source(new_src)
|
new_os_rel = get_os_codename_install_source(new_src)
|
||||||
log('Performing OpenStack upgrade to %s.' % (new_os_rel))
|
log('Performing OpenStack upgrade to %s.' % (new_os_rel))
|
||||||
|
|
||||||
@ -583,33 +490,18 @@ def _do_openstack_upgrade(new_src):
|
|||||||
'--option', 'Dpkg::Options::=--force-confdef',
|
'--option', 'Dpkg::Options::=--force-confdef',
|
||||||
]
|
]
|
||||||
|
|
||||||
# NOTE(jamespage) pre-stamp neutron database before upgrade from grizzly
|
|
||||||
if cur_os_rel == 'grizzly':
|
|
||||||
neutron_db_manage(['stamp', 'grizzly'])
|
|
||||||
|
|
||||||
apt_update(fatal=True)
|
apt_update(fatal=True)
|
||||||
apt_upgrade(options=dpkg_opts, fatal=True, dist=True)
|
apt_upgrade(options=dpkg_opts, fatal=True, dist=True)
|
||||||
apt_install(determine_packages(), fatal=True)
|
apt_install(determine_packages(), fatal=True)
|
||||||
|
|
||||||
disable_policy_rcd()
|
disable_policy_rcd()
|
||||||
|
|
||||||
if cur_os_rel == 'grizzly':
|
# NOTE(jamespage) upgrade with existing config files as the
|
||||||
# NOTE(jamespage) when upgrading from grizzly->havana, config
|
# havana->icehouse migration enables new service_plugins which
|
||||||
# files need to be generated prior to performing the db upgrade
|
# create issues with db upgrades
|
||||||
reset_os_release()
|
reset_os_release()
|
||||||
configs = register_configs(release=new_os_rel)
|
configs = register_configs(release=new_os_rel)
|
||||||
configs.write_all()
|
configs.write_all()
|
||||||
neutron_db_manage(['upgrade', 'head'])
|
|
||||||
else:
|
|
||||||
if new_os_rel < 'kilo':
|
|
||||||
neutron_db_manage(['stamp', cur_os_rel])
|
|
||||||
migrate_neutron_database()
|
|
||||||
# NOTE(jamespage) upgrade with existing config files as the
|
|
||||||
# havana->icehouse migration enables new service_plugins which
|
|
||||||
# create issues with db upgrades
|
|
||||||
reset_os_release()
|
|
||||||
configs = register_configs(release=new_os_rel)
|
|
||||||
configs.write_all()
|
|
||||||
|
|
||||||
if new_os_rel >= 'mitaka' and not database_setup(prefix='novaapi'):
|
if new_os_rel >= 'mitaka' and not database_setup(prefix='novaapi'):
|
||||||
# NOTE: Defer service restarts and database migrations for now
|
# NOTE: Defer service restarts and database migrations for now
|
||||||
@ -678,15 +570,6 @@ def migrate_nova_database():
|
|||||||
cmd_all_services('start')
|
cmd_all_services('start')
|
||||||
|
|
||||||
|
|
||||||
# NOTE(jamespage): Retry deals with sync issues during one-shot HA deploys.
|
|
||||||
# mysql might be restarting or suchlike.
|
|
||||||
@retry_on_exception(5, base_delay=3, exc_type=subprocess.CalledProcessError)
|
|
||||||
def migrate_neutron_database():
|
|
||||||
'''Runs neutron-db-manage to init a new database or migrate existing'''
|
|
||||||
log('Migrating the neutron database.', level=INFO)
|
|
||||||
neutron_db_manage(['upgrade', 'head'])
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: refactor to use unit storage or related data
|
# TODO: refactor to use unit storage or related data
|
||||||
def auth_token_config(setting):
|
def auth_token_config(setting):
|
||||||
"""
|
"""
|
||||||
@ -891,10 +774,6 @@ def determine_endpoints(public_url, internal_url, admin_url):
|
|||||||
ec2_admin_url = '%s:%s/services/Cloud' % (admin_url,
|
ec2_admin_url = '%s:%s/services/Cloud' % (admin_url,
|
||||||
api_port('nova-api-ec2'))
|
api_port('nova-api-ec2'))
|
||||||
|
|
||||||
neutron_public_url = '%s:%s' % (public_url, api_port('neutron-server'))
|
|
||||||
neutron_internal_url = '%s:%s' % (internal_url, api_port('neutron-server'))
|
|
||||||
neutron_admin_url = '%s:%s' % (admin_url, api_port('neutron-server'))
|
|
||||||
|
|
||||||
s3_public_url = '%s:%s' % (public_url, api_port('nova-objectstore'))
|
s3_public_url = '%s:%s' % (public_url, api_port('nova-objectstore'))
|
||||||
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'))
|
||||||
@ -918,24 +797,6 @@ def determine_endpoints(public_url, internal_url, admin_url):
|
|||||||
's3_internal_url': s3_internal_url,
|
's3_internal_url': s3_internal_url,
|
||||||
}
|
}
|
||||||
|
|
||||||
# XXX: Keep these relations named quantum_*??
|
|
||||||
if relation_ids('neutron-api'):
|
|
||||||
endpoints.update({
|
|
||||||
'quantum_service': None,
|
|
||||||
'quantum_region': None,
|
|
||||||
'quantum_public_url': None,
|
|
||||||
'quantum_admin_url': None,
|
|
||||||
'quantum_internal_url': None,
|
|
||||||
})
|
|
||||||
elif network_manager() == 'neutron':
|
|
||||||
endpoints.update({
|
|
||||||
'quantum_service': 'quantum',
|
|
||||||
'quantum_region': region,
|
|
||||||
'quantum_public_url': neutron_public_url,
|
|
||||||
'quantum_admin_url': neutron_admin_url,
|
|
||||||
'quantum_internal_url': neutron_internal_url,
|
|
||||||
})
|
|
||||||
|
|
||||||
if os_rel >= 'kilo':
|
if os_rel >= 'kilo':
|
||||||
# NOTE(jamespage) drop endpoints for ec2 and s3
|
# NOTE(jamespage) drop endpoints for ec2 and s3
|
||||||
# ec2 is deprecated
|
# ec2 is deprecated
|
||||||
@ -956,13 +817,6 @@ def determine_endpoints(public_url, internal_url, admin_url):
|
|||||||
return endpoints
|
return endpoints
|
||||||
|
|
||||||
|
|
||||||
# TODO: review to see if we can drop quantum-plugin
|
|
||||||
def neutron_plugin():
|
|
||||||
# quantum-plugin config setting can be safely overriden
|
|
||||||
# as we only supported OVS in G/neutron
|
|
||||||
return config('neutron-plugin') or config('quantum-plugin')
|
|
||||||
|
|
||||||
|
|
||||||
def guard_map():
|
def guard_map():
|
||||||
'''Map of services and required interfaces that must be present before
|
'''Map of services and required interfaces that must be present before
|
||||||
the service should be allowed to start'''
|
the service should be allowed to start'''
|
||||||
@ -980,16 +834,6 @@ def guard_map():
|
|||||||
for svc in nova_services:
|
for svc in nova_services:
|
||||||
gmap[svc] = nova_interfaces
|
gmap[svc] = nova_interfaces
|
||||||
|
|
||||||
net_manager = network_manager()
|
|
||||||
if net_manager == 'neutron' and \
|
|
||||||
not is_relation_made('neutron-api'):
|
|
||||||
neutron_interfaces = ['identity-service', 'amqp']
|
|
||||||
if relation_ids('pgsql-neutron-db'):
|
|
||||||
neutron_interfaces.append('pgsql-neutron-db')
|
|
||||||
else:
|
|
||||||
neutron_interfaces.append('shared-db')
|
|
||||||
gmap['neutron-server'] = neutron_interfaces
|
|
||||||
|
|
||||||
return gmap
|
return gmap
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,8 +30,6 @@ requires:
|
|||||||
interface: mysql-shared
|
interface: mysql-shared
|
||||||
pgsql-nova-db:
|
pgsql-nova-db:
|
||||||
interface: pgsql
|
interface: pgsql
|
||||||
pgsql-neutron-db:
|
|
||||||
interface: pgsql
|
|
||||||
amqp:
|
amqp:
|
||||||
interface: rabbitmq
|
interface: rabbitmq
|
||||||
image-service:
|
image-service:
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
# icehouse
|
|
||||||
###############################################################################
|
|
||||||
# [ WARNING ]
|
|
||||||
# Configuration file maintained by Juju. Local changes may be overwritten.
|
|
||||||
###############################################################################
|
|
||||||
[ml2]
|
|
||||||
type_drivers = gre,vxlan
|
|
||||||
tenant_network_types = gre,vxlan
|
|
||||||
mechanism_drivers = openvswitch
|
|
||||||
|
|
||||||
[ml2_type_gre]
|
|
||||||
tunnel_id_ranges = 1:1000
|
|
||||||
|
|
||||||
[ml2_type_vxlan]
|
|
||||||
vni_ranges = 1001:2000
|
|
||||||
|
|
||||||
[ovs]
|
|
||||||
enable_tunneling = True
|
|
||||||
local_ip = {{ local_ip }}
|
|
||||||
|
|
||||||
[agent]
|
|
||||||
tunnel_types = gre
|
|
||||||
|
|
||||||
[securitygroup]
|
|
||||||
{% if neutron_security_groups -%}
|
|
||||||
enable_security_group = True
|
|
||||||
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
|
|
||||||
{% else -%}
|
|
||||||
enable_security_group = False
|
|
||||||
{% endif -%}
|
|
@ -1,6 +0,0 @@
|
|||||||
# havana
|
|
||||||
###############################################################################
|
|
||||||
# [ WARNING ]
|
|
||||||
# Configuration file maintained by Juju. Local changes may be overwritten.
|
|
||||||
###############################################################################
|
|
||||||
NEUTRON_PLUGIN_CONFIG="{{ config }}"
|
|
@ -1,75 +0,0 @@
|
|||||||
###############################################################################
|
|
||||||
# [ WARNING ]
|
|
||||||
# Configuration file maintained by Juju. Local changes may be overwritten.
|
|
||||||
###############################################################################
|
|
||||||
[DEFAULT]
|
|
||||||
state_path = /var/lib/neutron
|
|
||||||
lock_path = $state_path/lock
|
|
||||||
bind_host = {{ bind_host }}
|
|
||||||
auth_strategy = keystone
|
|
||||||
{% if notifications == 'True' -%}
|
|
||||||
notification_driver = neutron.openstack.common.notifier.rpc_notifier
|
|
||||||
{% endif -%}
|
|
||||||
api_workers = {{ workers }}
|
|
||||||
use_syslog = {{ use_syslog }}
|
|
||||||
|
|
||||||
{% if neutron_bind_port -%}
|
|
||||||
bind_port = {{ neutron_bind_port }}
|
|
||||||
{% else -%}
|
|
||||||
bind_port = 9696
|
|
||||||
{% endif -%}
|
|
||||||
|
|
||||||
{% if core_plugin -%}
|
|
||||||
core_plugin = {{ core_plugin }}
|
|
||||||
{% if neutron_plugin in ['ovs', 'ml2'] -%}
|
|
||||||
service_plugins = neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,neutron.services.firewall.fwaas_plugin.FirewallPlugin,neutron.services.loadbalancer.plugin.LoadBalancerPlugin,neutron.services.vpn.plugin.VPNDriverPlugin,neutron.services.metering.metering_plugin.MeteringPlugin
|
|
||||||
{% endif -%}
|
|
||||||
{% endif -%}
|
|
||||||
|
|
||||||
{% if neutron_security_groups -%}
|
|
||||||
allow_overlapping_ips = True
|
|
||||||
neutron_firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
|
|
||||||
{% endif -%}
|
|
||||||
|
|
||||||
{% include "parts/rabbitmq" %}
|
|
||||||
|
|
||||||
notify_nova_on_port_status_changes = True
|
|
||||||
notify_nova_on_port_data_changes = True
|
|
||||||
nova_url = {{ nova_url }}
|
|
||||||
nova_region_name = {{ region }}
|
|
||||||
{% if auth_host -%}
|
|
||||||
nova_admin_username = {{ admin_user }}
|
|
||||||
nova_admin_tenant_id = {{ admin_tenant_id }}
|
|
||||||
nova_admin_password = {{ admin_password }}
|
|
||||||
nova_admin_auth_url = {{ auth_protocol }}://{{ auth_host }}:{{ auth_port }}/v2.0
|
|
||||||
{% endif -%}
|
|
||||||
|
|
||||||
[quotas]
|
|
||||||
quota_driver = neutron.db.quota_db.DbQuotaDriver
|
|
||||||
{% if neutron_security_groups -%}
|
|
||||||
quota_items = network,subnet,port,security_group,security_group_rule
|
|
||||||
{% endif -%}
|
|
||||||
|
|
||||||
[agent]
|
|
||||||
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
|
|
||||||
|
|
||||||
[keystone_authtoken]
|
|
||||||
signing_dir = {{ signing_dir }}
|
|
||||||
{% if service_host -%}
|
|
||||||
service_protocol = {{ service_protocol }}
|
|
||||||
service_host = {{ service_host }}
|
|
||||||
service_port = {{ service_port }}
|
|
||||||
auth_host = {{ auth_host }}
|
|
||||||
auth_port = {{ auth_port }}
|
|
||||||
auth_protocol = {{ auth_protocol }}
|
|
||||||
admin_tenant_name = {{ admin_tenant_name }}
|
|
||||||
admin_user = {{ admin_user }}
|
|
||||||
admin_password = {{ admin_password }}
|
|
||||||
{% endif -%}
|
|
||||||
|
|
||||||
{% include "parts/section-database" %}
|
|
||||||
|
|
||||||
[service_providers]
|
|
||||||
service_provider=LOADBALANCER:Haproxy:neutron.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
|
|
||||||
service_provider=VPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default
|
|
||||||
service_provider=FIREWALL:Iptables:neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver:default
|
|
@ -1,11 +0,0 @@
|
|||||||
# icehouse
|
|
||||||
###############################################################################
|
|
||||||
# [ WARNING ]
|
|
||||||
# Configuration file maintained by Juju. Local changes may be overwritten.
|
|
||||||
###############################################################################
|
|
||||||
[DEFAULT]
|
|
||||||
nsx_user = {{ nvp_username }}
|
|
||||||
nsx_password = {{ nvp_password }}
|
|
||||||
nsx_controllers = {{ nvp_controllers }}
|
|
||||||
default_tz_uuid = {{ nvp_tz_uuid }}
|
|
||||||
default_l3_gw_service_uuid = {{ nvp_l3_uuid }}
|
|
@ -1,13 +0,0 @@
|
|||||||
# icehouse
|
|
||||||
###############################################################################
|
|
||||||
# [ WARNING ]
|
|
||||||
# Configuration file maintained by Juju. Local changes may be overwritten.
|
|
||||||
###############################################################################
|
|
||||||
[restproxy]
|
|
||||||
server = {{ vsd_server }}
|
|
||||||
serverauth = {{ vsd_auth }}
|
|
||||||
auth_resource = {{ vsd_auth_resource }}
|
|
||||||
organization = {{ vsd_organization }}
|
|
||||||
serverssl = {{ vsd_auth_ssl }}
|
|
||||||
base_uri = {{ vsd_base_uri }}
|
|
||||||
default_net_partition_name = {{ vsd_netpart_name }}
|
|
@ -1,11 +0,0 @@
|
|||||||
# havana
|
|
||||||
###############################################################################
|
|
||||||
# [ WARNING ]
|
|
||||||
# Configuration file maintained by Juju. Local changes may be overwritten.
|
|
||||||
###############################################################################
|
|
||||||
[DEFAULT]
|
|
||||||
nvp_user = {{ nvp_username }}
|
|
||||||
nvp_password = {{ nvp_password }}
|
|
||||||
nvp_controllers = {{ nvp_controllers }}
|
|
||||||
default_tz_uuid = {{ nvp_tz_uuid }}
|
|
||||||
default_l3_gw_service_uuid = {{ nvp_l3_uuid }}
|
|
@ -18,7 +18,6 @@ TO_PATCH = [
|
|||||||
'log',
|
'log',
|
||||||
'relations_for_id',
|
'relations_for_id',
|
||||||
'https',
|
'https',
|
||||||
'is_relation_made',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@ -78,13 +77,10 @@ class NovaComputeContextTests(CharmTestCase):
|
|||||||
instance_console())
|
instance_console())
|
||||||
|
|
||||||
@mock.patch('charmhelpers.contrib.openstack.neutron.os_release')
|
@mock.patch('charmhelpers.contrib.openstack.neutron.os_release')
|
||||||
@mock.patch.object(context, 'use_local_neutron_api')
|
|
||||||
@mock.patch('charmhelpers.contrib.openstack.ip.config')
|
@mock.patch('charmhelpers.contrib.openstack.ip.config')
|
||||||
@mock.patch('charmhelpers.contrib.openstack.ip.is_clustered')
|
@mock.patch('charmhelpers.contrib.openstack.ip.is_clustered')
|
||||||
def test_neutron_context_single_vip(self, mock_is_clustered, mock_config,
|
def test_neutron_context_single_vip(self, mock_is_clustered, mock_config,
|
||||||
mock_use_local_neutron_api,
|
|
||||||
_os_release):
|
_os_release):
|
||||||
mock_use_local_neutron_api.return_value = True
|
|
||||||
self.https.return_value = False
|
self.https.return_value = False
|
||||||
mock_is_clustered.return_value = True
|
mock_is_clustered.return_value = True
|
||||||
config = {'vip': '10.0.0.1',
|
config = {'vip': '10.0.0.1',
|
||||||
@ -93,22 +89,14 @@ class NovaComputeContextTests(CharmTestCase):
|
|||||||
'os-public-network': '10.0.2.0/24'}
|
'os-public-network': '10.0.2.0/24'}
|
||||||
mock_config.side_effect = lambda key: config.get(key)
|
mock_config.side_effect = lambda key: config.get(key)
|
||||||
|
|
||||||
mock_use_local_neutron_api.return_value = False
|
|
||||||
ctxt = context.NeutronCCContext()()
|
ctxt = context.NeutronCCContext()()
|
||||||
self.assertEqual(ctxt['nova_url'], 'http://10.0.0.1:8774/v2')
|
self.assertEqual(ctxt['nova_url'], 'http://10.0.0.1:8774/v2')
|
||||||
self.assertFalse('neutron_url' in ctxt)
|
self.assertFalse('neutron_url' in ctxt)
|
||||||
|
|
||||||
mock_use_local_neutron_api.return_value = True
|
|
||||||
ctxt = context.NeutronCCContext()()
|
|
||||||
self.assertEqual(ctxt['nova_url'], 'http://10.0.0.1:8774/v2')
|
|
||||||
self.assertEqual(ctxt['neutron_url'], 'http://10.0.0.1:9696')
|
|
||||||
|
|
||||||
@mock.patch('charmhelpers.contrib.openstack.neutron.os_release')
|
@mock.patch('charmhelpers.contrib.openstack.neutron.os_release')
|
||||||
@mock.patch.object(context, 'use_local_neutron_api')
|
|
||||||
@mock.patch('charmhelpers.contrib.openstack.ip.config')
|
@mock.patch('charmhelpers.contrib.openstack.ip.config')
|
||||||
@mock.patch('charmhelpers.contrib.openstack.ip.is_clustered')
|
@mock.patch('charmhelpers.contrib.openstack.ip.is_clustered')
|
||||||
def test_neutron_context_multi_vip(self, mock_is_clustered, mock_config,
|
def test_neutron_context_multi_vip(self, mock_is_clustered, mock_config,
|
||||||
mock_use_local_neutron_api,
|
|
||||||
_os_release):
|
_os_release):
|
||||||
self.https.return_value = False
|
self.https.return_value = False
|
||||||
mock_is_clustered.return_value = True
|
mock_is_clustered.return_value = True
|
||||||
@ -118,26 +106,10 @@ class NovaComputeContextTests(CharmTestCase):
|
|||||||
'os-public-network': '10.0.2.0/24'}
|
'os-public-network': '10.0.2.0/24'}
|
||||||
mock_config.side_effect = lambda key: config.get(key)
|
mock_config.side_effect = lambda key: config.get(key)
|
||||||
|
|
||||||
mock_use_local_neutron_api.return_value = False
|
|
||||||
ctxt = context.NeutronCCContext()()
|
ctxt = context.NeutronCCContext()()
|
||||||
self.assertEqual(ctxt['nova_url'], 'http://10.0.1.1:8774/v2')
|
self.assertEqual(ctxt['nova_url'], 'http://10.0.1.1:8774/v2')
|
||||||
self.assertFalse('neutron_url' in ctxt)
|
self.assertFalse('neutron_url' in ctxt)
|
||||||
|
|
||||||
mock_use_local_neutron_api.return_value = True
|
|
||||||
ctxt = context.NeutronCCContext()()
|
|
||||||
self.assertEqual(ctxt['nova_url'], 'http://10.0.1.1:8774/v2')
|
|
||||||
self.assertEqual(ctxt['neutron_url'], 'http://10.0.1.1:9696')
|
|
||||||
|
|
||||||
def test_use_local_neutron_api(self):
|
|
||||||
self.relation_ids.return_value = []
|
|
||||||
self.related_units.return_value = []
|
|
||||||
self.assertTrue(context.use_local_neutron_api())
|
|
||||||
self.relation_ids.return_value = ['rel:0']
|
|
||||||
self.related_units.return_value = []
|
|
||||||
self.assertTrue(context.use_local_neutron_api())
|
|
||||||
self.related_units.return_value = ['unit/0']
|
|
||||||
self.assertFalse(context.use_local_neutron_api())
|
|
||||||
|
|
||||||
@mock.patch.object(neutron, 'network_manager')
|
@mock.patch.object(neutron, 'network_manager')
|
||||||
@mock.patch('charmhelpers.contrib.hahelpers.cluster.https')
|
@mock.patch('charmhelpers.contrib.hahelpers.cluster.https')
|
||||||
@mock.patch('charmhelpers.contrib.openstack.context.kv')
|
@mock.patch('charmhelpers.contrib.openstack.context.kv')
|
||||||
@ -154,31 +126,9 @@ class NovaComputeContextTests(CharmTestCase):
|
|||||||
mock_network_manager):
|
mock_network_manager):
|
||||||
mock_network_manager.return_value = 'neutron'
|
mock_network_manager.return_value = 'neutron'
|
||||||
mock_https.return_value = False
|
mock_https.return_value = False
|
||||||
self.is_relation_made.return_value = False
|
|
||||||
ctxt = context.HAProxyContext()()
|
ctxt = context.HAProxyContext()()
|
||||||
self.assertEqual(ctxt['service_ports']['neutron-server'], [9696, 9686])
|
self.assertEqual(ctxt['service_ports']['nova-api-os-compute'],
|
||||||
|
[8774, 8764])
|
||||||
@mock.patch.object(neutron, 'network_manager')
|
|
||||||
@mock.patch('charmhelpers.contrib.hahelpers.cluster.https')
|
|
||||||
@mock.patch('charmhelpers.contrib.openstack.context.kv')
|
|
||||||
@mock.patch('charmhelpers.contrib.openstack.context.'
|
|
||||||
'get_address_in_network')
|
|
||||||
@mock.patch('charmhelpers.contrib.openstack.context.'
|
|
||||||
'get_netmask_for_address')
|
|
||||||
@mock.patch('charmhelpers.contrib.openstack.context.local_unit')
|
|
||||||
@mock.patch('charmhelpers.contrib.openstack.context.get_ipv6_addr')
|
|
||||||
@mock.patch('charmhelpers.contrib.openstack.context.relation_ids')
|
|
||||||
def test_haproxy_context_api_relation(self, mock_relation_ids,
|
|
||||||
mock_get_ipv6_addr, mock_local_unit,
|
|
||||||
mock_get_netmask_for_address,
|
|
||||||
mock_get_address_in_network,
|
|
||||||
mock_kv, mock_https,
|
|
||||||
mock_network_manager):
|
|
||||||
mock_network_manager.return_value = 'neutron'
|
|
||||||
mock_https.return_value = False
|
|
||||||
self.is_relation_made.return_value = True
|
|
||||||
ctxt = context.HAProxyContext()()
|
|
||||||
self.assertEqual(ctxt['service_ports'].get('neutron-server'), None)
|
|
||||||
|
|
||||||
@mock.patch.object(context, 'config')
|
@mock.patch.object(context, 'config')
|
||||||
def test_console_ssl_disabled(self, mock_config):
|
def test_console_ssl_disabled(self, mock_config):
|
||||||
|
@ -4,7 +4,7 @@ import tempfile
|
|||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
from mock import MagicMock, patch, call
|
from mock import MagicMock, patch, call
|
||||||
from test_utils import CharmTestCase, patch_open
|
from test_utils import CharmTestCase
|
||||||
|
|
||||||
with patch('charmhelpers.core.hookenv.config') as config:
|
with patch('charmhelpers.core.hookenv.config') as config:
|
||||||
config.return_value = 'neutron'
|
config.return_value = 'neutron'
|
||||||
@ -29,7 +29,6 @@ utils.register_configs = _reg
|
|||||||
utils.restart_map = _map
|
utils.restart_map = _map
|
||||||
|
|
||||||
TO_PATCH = [
|
TO_PATCH = [
|
||||||
'api_port',
|
|
||||||
'apt_update',
|
'apt_update',
|
||||||
'apt_install',
|
'apt_install',
|
||||||
'configure_installation_source',
|
'configure_installation_source',
|
||||||
@ -59,9 +58,6 @@ TO_PATCH = [
|
|||||||
'ssh_authorized_keys_lines',
|
'ssh_authorized_keys_lines',
|
||||||
'save_script_rc',
|
'save_script_rc',
|
||||||
'service_reload',
|
'service_reload',
|
||||||
'service_restart',
|
|
||||||
'service_running',
|
|
||||||
'service_stop',
|
|
||||||
'services',
|
'services',
|
||||||
'execd_preinstall',
|
'execd_preinstall',
|
||||||
'network_manager',
|
'network_manager',
|
||||||
@ -69,9 +65,7 @@ TO_PATCH = [
|
|||||||
'uuid',
|
'uuid',
|
||||||
'is_elected_leader',
|
'is_elected_leader',
|
||||||
'keystone_ca_cert_b64',
|
'keystone_ca_cert_b64',
|
||||||
'neutron_plugin',
|
|
||||||
'migrate_nova_database',
|
'migrate_nova_database',
|
||||||
'migrate_neutron_database',
|
|
||||||
'uuid',
|
'uuid',
|
||||||
'get_hacluster_config',
|
'get_hacluster_config',
|
||||||
'get_iface_for_address',
|
'get_iface_for_address',
|
||||||
@ -301,22 +295,15 @@ class NovaCCHooksTests(CharmTestCase):
|
|||||||
self.keystone_ca_cert_b64.return_value = 'foocert64'
|
self.keystone_ca_cert_b64.return_value = 'foocert64'
|
||||||
self.unit_get.return_value = 'nova-cc-host1'
|
self.unit_get.return_value = 'nova-cc-host1'
|
||||||
_canonical_url.return_value = 'http://nova-cc-host1'
|
_canonical_url.return_value = 'http://nova-cc-host1'
|
||||||
self.api_port.return_value = '9696'
|
|
||||||
self.neutron_plugin.return_value = 'nvp'
|
|
||||||
auth_config.return_value = FAKE_KS_AUTH_CFG
|
auth_config.return_value = FAKE_KS_AUTH_CFG
|
||||||
hooks.compute_joined()
|
hooks.compute_joined()
|
||||||
|
|
||||||
self.relation_set.assert_called_with(
|
self.relation_set.assert_called_with(
|
||||||
relation_id=None,
|
relation_id=None,
|
||||||
quantum_url='http://nova-cc-host1:9696',
|
|
||||||
ca_cert='foocert64',
|
ca_cert='foocert64',
|
||||||
quantum_port=9696,
|
|
||||||
quantum_host='nova-cc-host1',
|
|
||||||
quantum_security_groups='no',
|
|
||||||
region='RegionOne',
|
region='RegionOne',
|
||||||
volume_service='cinder',
|
volume_service='cinder',
|
||||||
ec2_host='nova-cc-host1',
|
ec2_host='nova-cc-host1',
|
||||||
quantum_plugin='nvp',
|
|
||||||
network_manager='neutron', **FAKE_KS_AUTH_CFG)
|
network_manager='neutron', **FAKE_KS_AUTH_CFG)
|
||||||
|
|
||||||
@patch.object(hooks, 'canonical_url')
|
@patch.object(hooks, 'canonical_url')
|
||||||
@ -339,8 +326,6 @@ class NovaCCHooksTests(CharmTestCase):
|
|||||||
self.keystone_ca_cert_b64.return_value = 'foocert64'
|
self.keystone_ca_cert_b64.return_value = 'foocert64'
|
||||||
self.unit_get.return_value = 'nova-cc-host1'
|
self.unit_get.return_value = 'nova-cc-host1'
|
||||||
_canonical_url.return_value = 'http://nova-cc-host1'
|
_canonical_url.return_value = 'http://nova-cc-host1'
|
||||||
self.api_port.return_value = '9696'
|
|
||||||
self.neutron_plugin.return_value = 'nvp'
|
|
||||||
auth_config.return_value = FAKE_KS_AUTH_CFG
|
auth_config.return_value = FAKE_KS_AUTH_CFG
|
||||||
hooks.compute_joined()
|
hooks.compute_joined()
|
||||||
self.relation_set.assert_called_with(
|
self.relation_set.assert_called_with(
|
||||||
@ -360,15 +345,12 @@ class NovaCCHooksTests(CharmTestCase):
|
|||||||
@patch.object(hooks, '_auth_config')
|
@patch.object(hooks, '_auth_config')
|
||||||
def test_nova_vmware_joined(self, auth_config, _canonical_url):
|
def test_nova_vmware_joined(self, auth_config, _canonical_url):
|
||||||
auth_config.return_value = FAKE_KS_AUTH_CFG
|
auth_config.return_value = FAKE_KS_AUTH_CFG
|
||||||
# quantum-security-groups, plugin
|
self.is_relation_made.return_value = False
|
||||||
self.neutron_plugin.return_value = 'nvp'
|
|
||||||
self.network_manager.return_value = 'neutron'
|
self.network_manager.return_value = 'neutron'
|
||||||
_canonical_url.return_value = 'http://nova-cc-host1'
|
_canonical_url.return_value = 'http://nova-cc-host1'
|
||||||
self.api_port.return_value = '9696'
|
|
||||||
hooks.nova_vmware_relation_joined()
|
hooks.nova_vmware_relation_joined()
|
||||||
self.relation_set.assert_called_with(
|
self.relation_set.assert_called_with(
|
||||||
network_manager='neutron', quantum_security_groups='no',
|
network_manager='neutron',
|
||||||
quantum_url='http://nova-cc-host1:9696', quantum_plugin='nvp',
|
|
||||||
relation_id=None,
|
relation_id=None,
|
||||||
**FAKE_KS_AUTH_CFG)
|
**FAKE_KS_AUTH_CFG)
|
||||||
|
|
||||||
@ -424,11 +406,6 @@ class NovaCCHooksTests(CharmTestCase):
|
|||||||
hooks.pgsql_nova_db_joined()
|
hooks.pgsql_nova_db_joined()
|
||||||
self.relation_set.assert_called_with(database='nova')
|
self.relation_set.assert_called_with(database='nova')
|
||||||
|
|
||||||
def test_postgresql_neutron_db_joined(self):
|
|
||||||
self.is_relation_made.return_value = False
|
|
||||||
hooks.pgsql_neutron_db_joined()
|
|
||||||
self.relation_set.assert_called_with(database='neutron')
|
|
||||||
|
|
||||||
def test_db_joined_with_postgresql(self):
|
def test_db_joined_with_postgresql(self):
|
||||||
self.is_relation_made.return_value = True
|
self.is_relation_made.return_value = True
|
||||||
|
|
||||||
@ -447,15 +424,6 @@ class NovaCCHooksTests(CharmTestCase):
|
|||||||
'Attempting to associate a postgresql database when'
|
'Attempting to associate a postgresql database when'
|
||||||
' there is already associated a mysql one')
|
' there is already associated a mysql one')
|
||||||
|
|
||||||
def test_postgresql_neutron_joined_with_db(self):
|
|
||||||
self.is_relation_made.return_value = True
|
|
||||||
|
|
||||||
with self.assertRaises(Exception) as context:
|
|
||||||
hooks.pgsql_neutron_db_joined()
|
|
||||||
self.assertEqual(context.exception.message,
|
|
||||||
'Attempting to associate a postgresql database when'
|
|
||||||
' there is already associated a mysql one')
|
|
||||||
|
|
||||||
@patch.object(hooks, 'CONFIGS')
|
@patch.object(hooks, 'CONFIGS')
|
||||||
def test_db_changed_missing_relation_data(self, configs):
|
def test_db_changed_missing_relation_data(self, configs):
|
||||||
configs.complete_contexts = MagicMock()
|
configs.complete_contexts = MagicMock()
|
||||||
@ -488,9 +456,8 @@ class NovaCCHooksTests(CharmTestCase):
|
|||||||
|
|
||||||
@patch.object(hooks, 'nova_api_relation_joined')
|
@patch.object(hooks, 'nova_api_relation_joined')
|
||||||
@patch.object(hooks, 'is_db_initialised')
|
@patch.object(hooks, 'is_db_initialised')
|
||||||
@patch.object(hooks, 'conditional_neutron_migration')
|
|
||||||
@patch.object(hooks, 'CONFIGS')
|
@patch.object(hooks, 'CONFIGS')
|
||||||
def test_db_changed(self, configs, cond_neutron_mig,
|
def test_db_changed(self, configs,
|
||||||
mock_is_db_initialised, api_joined):
|
mock_is_db_initialised, api_joined):
|
||||||
self.relation_ids.return_value = ['nova-api/0']
|
self.relation_ids.return_value = ['nova-api/0']
|
||||||
mock_is_db_initialised.return_value = False
|
mock_is_db_initialised.return_value = False
|
||||||
@ -498,7 +465,6 @@ class NovaCCHooksTests(CharmTestCase):
|
|||||||
self._shared_db_test(configs)
|
self._shared_db_test(configs)
|
||||||
self.assertTrue(configs.write_all.called)
|
self.assertTrue(configs.write_all.called)
|
||||||
self.assertFalse(self.migrate_nova_database.called)
|
self.assertFalse(self.migrate_nova_database.called)
|
||||||
self.assertFalse(cond_neutron_mig.called)
|
|
||||||
api_joined.asert_called_with(rid='nova-api/0')
|
api_joined.asert_called_with(rid='nova-api/0')
|
||||||
|
|
||||||
@patch.object(hooks, 'is_db_initialised')
|
@patch.object(hooks, 'is_db_initialised')
|
||||||
@ -607,8 +573,7 @@ class NovaCCHooksTests(CharmTestCase):
|
|||||||
self.network_manager.return_value = 'neutron'
|
self.network_manager.return_value = 'neutron'
|
||||||
hooks.amqp_changed()
|
hooks.amqp_changed()
|
||||||
self.assertEquals(configs.write.call_args_list,
|
self.assertEquals(configs.write.call_args_list,
|
||||||
[call('/etc/nova/nova.conf'),
|
[call('/etc/nova/nova.conf')])
|
||||||
call('/etc/neutron/neutron.conf')])
|
|
||||||
cell_joined.assert_called_with(rid='nova-cell-api/0')
|
cell_joined.assert_called_with(rid='nova-cell-api/0')
|
||||||
api_joined.assert_called_with(rid='nova-api/0')
|
api_joined.assert_called_with(rid='nova-api/0')
|
||||||
|
|
||||||
@ -641,24 +606,19 @@ class NovaCCHooksTests(CharmTestCase):
|
|||||||
@patch.object(hooks, 'get_cell_type')
|
@patch.object(hooks, 'get_cell_type')
|
||||||
def test_neutron_api_relation_joined(self, get_cell_type, configs, isfile,
|
def test_neutron_api_relation_joined(self, get_cell_type, configs, isfile,
|
||||||
rename, _canonical_url):
|
rename, _canonical_url):
|
||||||
neutron_conf = '/etc/neutron/neutron.conf'
|
|
||||||
nova_url = 'http://novaurl:8774/v2'
|
nova_url = 'http://novaurl:8774/v2'
|
||||||
isfile.return_value = True
|
isfile.return_value = True
|
||||||
self.service_running.return_value = True
|
|
||||||
_identity_joined = self.patch('identity_joined')
|
_identity_joined = self.patch('identity_joined')
|
||||||
self.relation_ids.return_value = ['relid']
|
self.relation_ids.return_value = ['relid']
|
||||||
_canonical_url.return_value = 'http://novaurl'
|
_canonical_url.return_value = 'http://novaurl'
|
||||||
get_cell_type.return_value = 'parent'
|
get_cell_type.return_value = 'parent'
|
||||||
self.uuid.uuid4.return_value = 'bob'
|
self.uuid.uuid4.return_value = 'bob'
|
||||||
with patch_open() as (_open, _file):
|
hooks.neutron_api_relation_joined(remote_restart=True)
|
||||||
hooks.neutron_api_relation_joined(remote_restart=True)
|
self.assertTrue(_identity_joined.called)
|
||||||
self.service_stop.assert_called_with('neutron-server')
|
self.relation_set.assert_called_with(relation_id=None,
|
||||||
rename.assert_called_with(neutron_conf, neutron_conf + '_unused')
|
cell_type='parent',
|
||||||
self.assertTrue(_identity_joined.called)
|
nova_url=nova_url,
|
||||||
self.relation_set.assert_called_with(relation_id=None,
|
restart_trigger='bob')
|
||||||
cell_type='parent',
|
|
||||||
nova_url=nova_url,
|
|
||||||
restart_trigger='bob')
|
|
||||||
|
|
||||||
@patch.object(hooks, 'CONFIGS')
|
@patch.object(hooks, 'CONFIGS')
|
||||||
def test_neutron_api_relation_changed(self, configs):
|
def test_neutron_api_relation_changed(self, configs):
|
||||||
@ -679,7 +639,6 @@ class NovaCCHooksTests(CharmTestCase):
|
|||||||
_compute_joined = self.patch('compute_joined')
|
_compute_joined = self.patch('compute_joined')
|
||||||
_quantum_joined = self.patch('quantum_joined')
|
_quantum_joined = self.patch('quantum_joined')
|
||||||
hooks.neutron_api_relation_broken()
|
hooks.neutron_api_relation_broken()
|
||||||
remove.assert_called_with('/etc/init/neutron-server.override')
|
|
||||||
self.assertTrue(configs.write_all.called)
|
self.assertTrue(configs.write_all.called)
|
||||||
self.assertTrue(_compute_joined.called)
|
self.assertTrue(_compute_joined.called)
|
||||||
self.assertTrue(_quantum_joined.called)
|
self.assertTrue(_quantum_joined.called)
|
||||||
@ -793,30 +752,6 @@ class NovaCCHooksTests(CharmTestCase):
|
|||||||
}
|
}
|
||||||
self.assertEqual(_con_sets, console_settings)
|
self.assertEqual(_con_sets, console_settings)
|
||||||
|
|
||||||
def test_conditional_neutron_migration(self):
|
|
||||||
self.os_release.return_value = 'juno'
|
|
||||||
self.services.return_value = ['neutron-server']
|
|
||||||
hooks.conditional_neutron_migration()
|
|
||||||
self.migrate_neutron_database.assert_called_with()
|
|
||||||
self.service_restart.assert_called_with('neutron-server')
|
|
||||||
|
|
||||||
def test_conditional_neutron_migration_juno(self):
|
|
||||||
self.os_release.return_value = 'icehouse'
|
|
||||||
hooks.conditional_neutron_migration()
|
|
||||||
self.log.assert_called_with(
|
|
||||||
'Not running neutron database migration as migrations are handled'
|
|
||||||
' by the neutron-server process.'
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_conditional_neutron_migration_kilo(self):
|
|
||||||
self.os_release.return_value = 'kilo'
|
|
||||||
self.relation_ids.return_value = []
|
|
||||||
hooks.conditional_neutron_migration()
|
|
||||||
self.log.assert_called_with(
|
|
||||||
'Not running neutron database migration as migrations are by the '
|
|
||||||
'neutron-api charm.'
|
|
||||||
)
|
|
||||||
|
|
||||||
@patch('nova_cc_utils.config')
|
@patch('nova_cc_utils.config')
|
||||||
def test_ha_relation_joined_no_bound_ip(self, config):
|
def test_ha_relation_joined_no_bound_ip(self, config):
|
||||||
self.get_hacluster_config.return_value = {
|
self.get_hacluster_config.return_value = {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from mock import patch, MagicMock, call
|
from mock import patch, MagicMock, call
|
||||||
from copy import deepcopy
|
|
||||||
|
|
||||||
with patch('charmhelpers.core.hookenv.config'):
|
with patch('charmhelpers.core.hookenv.config'):
|
||||||
import nova_cc_utils as utils
|
import nova_cc_utils as utils
|
||||||
@ -19,12 +18,7 @@ TO_PATCH = [
|
|||||||
'enable_policy_rcd',
|
'enable_policy_rcd',
|
||||||
'enable_services',
|
'enable_services',
|
||||||
'get_os_codename_install_source',
|
'get_os_codename_install_source',
|
||||||
'is_relation_made',
|
|
||||||
'log',
|
'log',
|
||||||
'network_manager',
|
|
||||||
'neutron_db_manage',
|
|
||||||
'neutron_plugin',
|
|
||||||
'neutron_plugin_attribute',
|
|
||||||
'os_release',
|
'os_release',
|
||||||
'peer_store',
|
'peer_store',
|
||||||
'register_configs',
|
'register_configs',
|
||||||
@ -85,36 +79,11 @@ RESTART_MAP = OrderedDict([
|
|||||||
('/etc/nova/api-paste.ini', [
|
('/etc/nova/api-paste.ini', [
|
||||||
'nova-api-ec2', 'nova-api-os-compute'
|
'nova-api-ec2', 'nova-api-os-compute'
|
||||||
]),
|
]),
|
||||||
('/etc/neutron/neutron.conf', ['neutron-server']),
|
|
||||||
('/etc/default/neutron-server', ['neutron-server']),
|
|
||||||
('/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']),
|
||||||
('/etc/neutron/plugins/ml2/ml2_conf.ini', ['neutron-server']),
|
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
PLUGIN_ATTRIBUTES = {
|
|
||||||
'ovs': {
|
|
||||||
'config': '/etc/neutron/plugins/ml2/ml2_conf.ini',
|
|
||||||
'driver': 'neutron.plugins.ml2.plugin.Ml2Plugin',
|
|
||||||
'contexts': ['FakeDBContext'],
|
|
||||||
'services': ['neutron-plugin-openvswitch-agent'],
|
|
||||||
'packages': ['neutron-plugin-openvswitch-agent'],
|
|
||||||
'server_packages': ['neutron-server', 'neutron-plugin-ml2'],
|
|
||||||
'server_services': ['neutron-server'],
|
|
||||||
},
|
|
||||||
'nvp': {
|
|
||||||
'config': '/etc/quantum/plugins/nicira/nvp.ini',
|
|
||||||
'driver': 'quantum.plugins.nicira.nicira_nvp_plugin.'
|
|
||||||
'QuantumPlugin.NvpPluginV2',
|
|
||||||
'services': [],
|
|
||||||
'packages': [],
|
|
||||||
'server_packages': ['quantum-server', 'quantum-plugin-nicria'],
|
|
||||||
'server_services': ['quantum-server'],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DPKG_OPTS = [
|
DPKG_OPTS = [
|
||||||
'--option', 'Dpkg::Options::=--force-confnew',
|
'--option', 'Dpkg::Options::=--force-confnew',
|
||||||
'--option', 'Dpkg::Options::=--force-confdef',
|
'--option', 'Dpkg::Options::=--force-confdef',
|
||||||
@ -130,14 +99,6 @@ openstack_origin_git = \
|
|||||||
branch: stable/juno}"""
|
branch: stable/juno}"""
|
||||||
|
|
||||||
|
|
||||||
def fake_plugin_attribute(plugin, attr, net_manager):
|
|
||||||
if plugin in PLUGIN_ATTRIBUTES:
|
|
||||||
try:
|
|
||||||
return PLUGIN_ATTRIBUTES[plugin][attr]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class NovaCCUtilsTests(CharmTestCase):
|
class NovaCCUtilsTests(CharmTestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@ -145,38 +106,12 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
self.config.side_effect = self.test_config.get
|
self.config.side_effect = self.test_config.get
|
||||||
self.maxDiff = None
|
self.maxDiff = None
|
||||||
|
|
||||||
def _resource_map(self, network_manager=None):
|
def _resource_map(self):
|
||||||
if network_manager:
|
|
||||||
self.network_manager.return_value = network_manager
|
|
||||||
self.test_config.set('network-manager', network_manager.title())
|
|
||||||
self.neutron_plugin.return_value = 'ovs'
|
|
||||||
self.neutron_plugin_attribute.side_effect = fake_plugin_attribute
|
|
||||||
with patch('charmhelpers.contrib.openstack.context.'
|
with patch('charmhelpers.contrib.openstack.context.'
|
||||||
'SubordinateConfigContext'):
|
'SubordinateConfigContext'):
|
||||||
_map = utils.resource_map()
|
_map = utils.resource_map()
|
||||||
return _map
|
return _map
|
||||||
|
|
||||||
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
|
||||||
def test_resource_map_neutron(self, subcontext):
|
|
||||||
self.is_relation_made.return_value = False
|
|
||||||
self._resource_map(network_manager='neutron')
|
|
||||||
_map = utils.resource_map()
|
|
||||||
confs = [
|
|
||||||
'/etc/neutron/neutron.conf',
|
|
||||||
]
|
|
||||||
[self.assertIn(q_conf, _map.keys()) for q_conf in confs]
|
|
||||||
|
|
||||||
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
|
||||||
def test_resource_map_neutron_api_rel(self, subcontext):
|
|
||||||
self.is_relation_made.return_value = True
|
|
||||||
self._resource_map(network_manager='neutron')
|
|
||||||
_map = utils.resource_map()
|
|
||||||
confs = [
|
|
||||||
'/etc/neutron/neutron.conf',
|
|
||||||
]
|
|
||||||
for q_conf in confs:
|
|
||||||
self.assertEquals(_map[q_conf]['services'], [])
|
|
||||||
|
|
||||||
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
||||||
def test_resource_map_vmware(self, subcontext):
|
def test_resource_map_vmware(self, subcontext):
|
||||||
fake_context = MagicMock()
|
fake_context = MagicMock()
|
||||||
@ -192,7 +127,7 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
|
|
||||||
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
||||||
def test_resource_map_neutron_no_agent_installed(self, subcontext):
|
def test_resource_map_neutron_no_agent_installed(self, subcontext):
|
||||||
self._resource_map(network_manager='neutron')
|
self._resource_map()
|
||||||
_map = utils.resource_map()
|
_map = utils.resource_map()
|
||||||
services = []
|
services = []
|
||||||
[services.extend(_map[c]['services'])for c in _map]
|
[services.extend(_map[c]['services'])for c in _map]
|
||||||
@ -246,10 +181,9 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
@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(self, subcontext, _exists,
|
||||||
_os_release):
|
_os_release):
|
||||||
self.is_relation_made.return_value = False
|
|
||||||
_os_release.return_value = 'icehouse'
|
_os_release.return_value = 'icehouse'
|
||||||
_exists.return_value = False
|
_exists.return_value = False
|
||||||
self._resource_map(network_manager='neutron')
|
self._resource_map()
|
||||||
_map = utils.restart_map()
|
_map = utils.restart_map()
|
||||||
self.assertTrue(isinstance(_map, OrderedDict))
|
self.assertTrue(isinstance(_map, OrderedDict))
|
||||||
self.assertEquals(_map, RESTART_MAP)
|
self.assertEquals(_map, RESTART_MAP)
|
||||||
@ -258,7 +192,7 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
@patch('os.path.exists')
|
@patch('os.path.exists')
|
||||||
def test_restart_map_apache24(self, _exists, subcontext):
|
def test_restart_map_apache24(self, _exists, subcontext):
|
||||||
_exists.return_Value = True
|
_exists.return_Value = True
|
||||||
self._resource_map(network_manager='neutron')
|
self._resource_map()
|
||||||
_map = utils.restart_map()
|
_map = utils.restart_map()
|
||||||
self.assertTrue('/etc/apache2/sites-available/'
|
self.assertTrue('/etc/apache2/sites-available/'
|
||||||
'openstack_https_frontend.conf' in _map)
|
'openstack_https_frontend.conf' in _map)
|
||||||
@ -308,15 +242,6 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
rid='shared-db:12',
|
rid='shared-db:12',
|
||||||
unit='mysql/0')
|
unit='mysql/0')
|
||||||
|
|
||||||
@patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
|
|
||||||
@patch.object(utils, 'git_install_requested')
|
|
||||||
def test_determine_packages_neutron(self, git_requested, subcontext):
|
|
||||||
git_requested.return_value = False
|
|
||||||
self.is_relation_made.return_value = False
|
|
||||||
self._resource_map(network_manager='neutron')
|
|
||||||
pkgs = utils.determine_packages()
|
|
||||||
self.assertIn('neutron-server', pkgs)
|
|
||||||
|
|
||||||
@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_console(self, git_requested, subcontext):
|
def test_determine_packages_console(self, git_requested, subcontext):
|
||||||
@ -343,10 +268,9 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
restart_map.return_value = {
|
restart_map.return_value = {
|
||||||
'/etc/nova/nova.conf': ['nova-api-os-compute', 'nova-api-ec2'],
|
'/etc/nova/nova.conf': ['nova-api-os-compute', 'nova-api-ec2'],
|
||||||
'/etc/nova/api-paste.ini': ['nova-api-os-compute', 'nova-api-ec2'],
|
'/etc/nova/api-paste.ini': ['nova-api-os-compute', 'nova-api-ec2'],
|
||||||
'/etc/neutron/neutron.conf': ['neutron-server'],
|
|
||||||
}
|
}
|
||||||
ports = utils.determine_ports()
|
ports = utils.determine_ports()
|
||||||
ex = [8773, 8774, 9696]
|
ex = [8773, 8774]
|
||||||
self.assertEquals(ex, sorted(ports))
|
self.assertEquals(ex, sorted(ports))
|
||||||
|
|
||||||
def test_save_script_rc_base(self):
|
def test_save_script_rc_base(self):
|
||||||
@ -354,14 +278,6 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
utils.save_script_rc()
|
utils.save_script_rc()
|
||||||
self._save_script_rc.called_with(**SCRIPTRC_ENV_VARS)
|
self._save_script_rc.called_with(**SCRIPTRC_ENV_VARS)
|
||||||
|
|
||||||
def test_save_script_neutron(self):
|
|
||||||
self.relation_ids.return_value = []
|
|
||||||
self.test_config.set('network-manager', 'Neutron')
|
|
||||||
utils.save_script_rc()
|
|
||||||
_ex = deepcopy(SCRIPTRC_ENV_VARS)
|
|
||||||
_ex['OPENSTACK_SERVICE_API_NEUTRON'] = 'neutron-server'
|
|
||||||
self._save_script_rc.called_with(**_ex)
|
|
||||||
|
|
||||||
@patch.object(utils, 'remove_known_host')
|
@patch.object(utils, 'remove_known_host')
|
||||||
@patch.object(utils, 'ssh_known_host_key')
|
@patch.object(utils, 'ssh_known_host_key')
|
||||||
@patch('subprocess.check_output')
|
@patch('subprocess.check_output')
|
||||||
@ -478,45 +394,12 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
_file.write.assert_called_with(keys_removed)
|
_file.write.assert_called_with(keys_removed)
|
||||||
|
|
||||||
def test_determine_endpoints_base(self):
|
def test_determine_endpoints_base(self):
|
||||||
self.is_relation_made.return_value = False
|
|
||||||
self.relation_ids.return_value = []
|
self.relation_ids.return_value = []
|
||||||
self.assertEquals(
|
self.assertEquals(
|
||||||
BASE_ENDPOINTS, utils.determine_endpoints('http://foohost.com',
|
BASE_ENDPOINTS, utils.determine_endpoints('http://foohost.com',
|
||||||
'http://foohost.com',
|
'http://foohost.com',
|
||||||
'http://foohost.com'))
|
'http://foohost.com'))
|
||||||
|
|
||||||
def test_determine_endpoints_quantum_neutron(self):
|
|
||||||
self.is_relation_made.return_value = False
|
|
||||||
self.relation_ids.return_value = []
|
|
||||||
self.network_manager.return_value = 'neutron'
|
|
||||||
endpoints = deepcopy(BASE_ENDPOINTS)
|
|
||||||
endpoints.update({
|
|
||||||
'quantum_admin_url': 'http://foohost.com:9696',
|
|
||||||
'quantum_internal_url': 'http://foohost.com:9696',
|
|
||||||
'quantum_public_url': 'http://foohost.com:9696',
|
|
||||||
'quantum_region': 'RegionOne',
|
|
||||||
'quantum_service': 'quantum'})
|
|
||||||
self.assertEquals(
|
|
||||||
endpoints, utils.determine_endpoints('http://foohost.com',
|
|
||||||
'http://foohost.com',
|
|
||||||
'http://foohost.com'))
|
|
||||||
|
|
||||||
def test_determine_endpoints_neutron_api_rel(self):
|
|
||||||
self.is_relation_made.return_value = True
|
|
||||||
self.relation_ids.side_effect = [['neutron-api:1']]
|
|
||||||
self.network_manager.return_value = 'neutron'
|
|
||||||
endpoints = deepcopy(BASE_ENDPOINTS)
|
|
||||||
endpoints.update({
|
|
||||||
'quantum_admin_url': None,
|
|
||||||
'quantum_internal_url': None,
|
|
||||||
'quantum_public_url': None,
|
|
||||||
'quantum_region': None,
|
|
||||||
'quantum_service': None})
|
|
||||||
self.assertEquals(
|
|
||||||
endpoints, utils.determine_endpoints('http://foohost.com',
|
|
||||||
'http://foohost.com',
|
|
||||||
'http://foohost.com'))
|
|
||||||
|
|
||||||
@patch.object(utils, 'known_hosts')
|
@patch.object(utils, 'known_hosts')
|
||||||
@patch('subprocess.check_output')
|
@patch('subprocess.check_output')
|
||||||
def test_ssh_known_host_key(self, _check_output, _known_hosts):
|
def test_ssh_known_host_key(self, _check_output, _known_hosts):
|
||||||
@ -598,10 +481,6 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
self.is_elected_leader.return_value = True
|
self.is_elected_leader.return_value = True
|
||||||
self.relation_ids.return_value = []
|
self.relation_ids.return_value = []
|
||||||
utils.do_openstack_upgrade(self.register_configs())
|
utils.do_openstack_upgrade(self.register_configs())
|
||||||
neutron_db_calls = [call(['stamp', 'icehouse']),
|
|
||||||
call(['upgrade', 'head'])]
|
|
||||||
self.neutron_db_manage.assert_has_calls(neutron_db_calls,
|
|
||||||
any_order=False)
|
|
||||||
self.apt_update.assert_called_with(fatal=True)
|
self.apt_update.assert_called_with(fatal=True)
|
||||||
self.apt_upgrade.assert_called_with(options=DPKG_OPTS, fatal=True,
|
self.apt_upgrade.assert_called_with(options=DPKG_OPTS, fatal=True,
|
||||||
dist=True)
|
dist=True)
|
||||||
@ -623,7 +502,6 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
self.is_elected_leader.return_value = True
|
self.is_elected_leader.return_value = True
|
||||||
self.relation_ids.return_value = []
|
self.relation_ids.return_value = []
|
||||||
utils.do_openstack_upgrade(self.register_configs())
|
utils.do_openstack_upgrade(self.register_configs())
|
||||||
self.assertEquals(self.neutron_db_manage.call_count, 0)
|
|
||||||
self.apt_update.assert_called_with(fatal=True)
|
self.apt_update.assert_called_with(fatal=True)
|
||||||
self.apt_upgrade.assert_called_with(options=DPKG_OPTS, fatal=True,
|
self.apt_upgrade.assert_called_with(options=DPKG_OPTS, fatal=True,
|
||||||
dist=True)
|
dist=True)
|
||||||
@ -648,7 +526,6 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
self.relation_ids.return_value = []
|
self.relation_ids.return_value = []
|
||||||
database_setup.return_value = False
|
database_setup.return_value = False
|
||||||
utils.do_openstack_upgrade(self.register_configs())
|
utils.do_openstack_upgrade(self.register_configs())
|
||||||
self.assertEquals(self.neutron_db_manage.call_count, 0)
|
|
||||||
self.apt_update.assert_called_with(fatal=True)
|
self.apt_update.assert_called_with(fatal=True)
|
||||||
self.apt_upgrade.assert_called_with(options=DPKG_OPTS, fatal=True,
|
self.apt_upgrade.assert_called_with(options=DPKG_OPTS, fatal=True,
|
||||||
dist=True)
|
dist=True)
|
||||||
@ -672,13 +549,10 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
|
|
||||||
def test_guard_map_neutron(self):
|
def test_guard_map_neutron(self):
|
||||||
self.relation_ids.return_value = []
|
self.relation_ids.return_value = []
|
||||||
self.network_manager.return_value = 'neutron'
|
|
||||||
self.os_release.return_value = 'icehouse'
|
self.os_release.return_value = 'icehouse'
|
||||||
self.get_os_codename_install_source.return_value = 'icehouse'
|
self.get_os_codename_install_source.return_value = 'icehouse'
|
||||||
self.is_relation_made.return_value = False
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
{'neutron-server': ['identity-service', 'amqp', 'shared-db'],
|
{'nova-api-ec2': ['identity-service', 'amqp', 'shared-db'],
|
||||||
'nova-api-ec2': ['identity-service', 'amqp', 'shared-db'],
|
|
||||||
'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'],
|
||||||
@ -686,12 +560,10 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
'nova-scheduler': ['identity-service', 'amqp', 'shared-db'], },
|
'nova-scheduler': ['identity-service', 'amqp', 'shared-db'], },
|
||||||
utils.guard_map()
|
utils.guard_map()
|
||||||
)
|
)
|
||||||
self.network_manager.return_value = 'neutron'
|
|
||||||
self.os_release.return_value = 'mitaka'
|
self.os_release.return_value = 'mitaka'
|
||||||
self.get_os_codename_install_source.return_value = 'mitaka'
|
self.get_os_codename_install_source.return_value = 'mitaka'
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
{'neutron-server': ['identity-service', 'amqp', 'shared-db'],
|
{'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-scheduler': ['identity-service', 'amqp', 'shared-db'], },
|
'nova-scheduler': ['identity-service', 'amqp', 'shared-db'], },
|
||||||
@ -700,13 +572,9 @@ class NovaCCUtilsTests(CharmTestCase):
|
|||||||
|
|
||||||
def test_guard_map_pgsql(self):
|
def test_guard_map_pgsql(self):
|
||||||
self.relation_ids.return_value = ['pgsql:1']
|
self.relation_ids.return_value = ['pgsql:1']
|
||||||
self.network_manager.return_value = 'neutron'
|
|
||||||
self.is_relation_made.return_value = False
|
|
||||||
self.os_release.return_value = 'icehouse'
|
self.os_release.return_value = 'icehouse'
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
{'neutron-server': ['identity-service', 'amqp',
|
{'nova-api-ec2': ['identity-service', 'amqp', 'pgsql-nova-db'],
|
||||||
'pgsql-neutron-db'],
|
|
||||||
'nova-api-ec2': ['identity-service', 'amqp', 'pgsql-nova-db'],
|
|
||||||
'nova-api-os-compute': ['identity-service', 'amqp',
|
'nova-api-os-compute': ['identity-service', 'amqp',
|
||||||
'pgsql-nova-db'],
|
'pgsql-nova-db'],
|
||||||
'nova-cert': ['identity-service', 'amqp', 'pgsql-nova-db'],
|
'nova-cert': ['identity-service', 'amqp', 'pgsql-nova-db'],
|
||||||
|
Loading…
Reference in New Issue
Block a user