diff --git a/hooks/nova_cc_context.py b/hooks/nova_cc_context.py index e2bb2e3..4be275b 100644 --- a/hooks/nova_cc_context.py +++ b/hooks/nova_cc_context.py @@ -149,6 +149,15 @@ class VolumeServiceContext(ch_context.OSContextGenerator): class HAProxyContext(ch_context.HAProxyContext): interfaces = ['ceph'] + external_ports = [] + + def __init__(self, _external_ports_maybe_callable): + super(HAProxyContext, self).__init__() + + if callable(_external_ports_maybe_callable): + self.external_ports = _external_ports_maybe_callable() + else: + self.external_ports = _external_ports_maybe_callable def __call__(self): ''' @@ -158,50 +167,28 @@ class HAProxyContext(ch_context.HAProxyContext): ''' ctxt = super(HAProxyContext, self).__call__() - # determine which port api processes should bind to, depending - # on existence of haproxy + apache frontends - compute_api = ch_cluster.determine_api_port( - common.api_port('nova-api-os-compute'), singlenode_mode=True) - ec2_api = ch_cluster.determine_api_port( - common.api_port('nova-api-ec2'), singlenode_mode=True) - s3_api = ch_cluster.determine_api_port( - common.api_port('nova-objectstore'), singlenode_mode=True) - placement_api = ch_cluster.determine_api_port( - common.api_port('nova-placement-api'), singlenode_mode=True) - metadata_api = ch_cluster.determine_api_port( - common.api_port('nova-api-metadata'), singlenode_mode=True) - # Apache ports - a_compute_api = ch_cluster.determine_apache_port( - common.api_port('nova-api-os-compute'), singlenode_mode=True) - a_ec2_api = ch_cluster.determine_apache_port( - common.api_port('nova-api-ec2'), singlenode_mode=True) - a_s3_api = ch_cluster.determine_apache_port( - common.api_port('nova-objectstore'), singlenode_mode=True) - a_placement_api = ch_cluster.determine_apache_port( - common.api_port('nova-placement-api'), singlenode_mode=True) - a_metadata_api = ch_cluster.determine_apache_port( - common.api_port('nova-api-metadata'), singlenode_mode=True) # to be set in nova.conf accordingly. - listen_ports = { - 'osapi_compute_listen_port': compute_api, - 'ec2_listen_port': ec2_api, - 's3_listen_port': s3_api, - 'placement_listen_port': placement_api, - 'metadata_listen_port': metadata_api, + listen_ports_map = { + 'osapi_compute_listen_port': 'nova-api-os-compute', + 'ec2_listen_port': 'nova-api-ec2', + 's3_listen_port': 'nova-objectstore', + 'placement_listen_port': 'nova-placement-api', + 'metadata_listen_port': 'nova-api-metadata', } - port_mapping = { - 'nova-api-os-compute': [ - common.api_port('nova-api-os-compute'), a_compute_api], - 'nova-api-ec2': [ - common.api_port('nova-api-ec2'), a_ec2_api], - 'nova-objectstore': [ - common.api_port('nova-objectstore'), a_s3_api], - 'nova-placement-api': [ - common.api_port('nova-placement-api'), a_placement_api], - 'nova-api-metadata': [ - common.api_port('nova-api-metadata'), a_metadata_api], - } + listen_ports = {} + port_mapping = {} + for nova_name,common_name in listen_ports_map.items(): + # determine which port api processes should bind to, depending + # on existence of haproxy + apache frontends + listen_ports[nova_name] = ch_cluster.determine_api_port( + common.api_port(common_name), singlenode_mode=True) + if common.api_port(common_name) in external_ports: + port_mapping[common_name] = [ + common.api_port(common_name), + ch_cluster.determine_apache_port( + common.api_port(common_name), singlenode_mode=True) + ] # for haproxy.conf ctxt['service_ports'] = port_mapping diff --git a/hooks/nova_cc_utils.py b/hooks/nova_cc_utils.py index b285e6b..0b61d4a 100644 --- a/hooks/nova_cc_utils.py +++ b/hooks/nova_cc_utils.py @@ -186,7 +186,7 @@ def get_base_resource_map(): (HAPROXY_CONF, { 'contexts': [ ch_context.HAProxyContext(singlenode_mode=True), - nova_cc_context.HAProxyContext()], + nova_cc_context.HAProxyContext(determine_ports)], 'services': ['haproxy'], }), (APACHE_CONF, {