From 7c90b5e3c03df4acac2c758f1b9872aaf68f85a6 Mon Sep 17 00:00:00 2001 From: Subbarayudu Mukkamala Date: Mon, 22 Sep 2014 13:19:46 -0700 Subject: [PATCH 01/10] Nuage Neutron Plugin initial changes (nova-cloud-controller) --- config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/config.yaml b/config.yaml index 3d759281..cd998d08 100644 --- a/config.yaml +++ b/config.yaml @@ -72,6 +72,7 @@ options: 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. From 5e9240f45b591514b0f50815e5894b64a8a13d60 Mon Sep 17 00:00:00 2001 From: Subbarayudu Mukkamala Date: Fri, 3 Oct 2014 20:15:52 -0700 Subject: [PATCH 02/10] update nuage vsp charmhelpers neutron.py context.py --- hooks/charmhelpers/contrib/openstack/context.py | 16 ++++++++++++++++ hooks/charmhelpers/contrib/openstack/neutron.py | 14 ++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/hooks/charmhelpers/contrib/openstack/context.py b/hooks/charmhelpers/contrib/openstack/context.py index 755e1a25..432407ac 100644 --- a/hooks/charmhelpers/contrib/openstack/context.py +++ b/hooks/charmhelpers/contrib/openstack/context.py @@ -642,6 +642,20 @@ class NeutronContext(OSContextGenerator): return ovs_ctxt + def nuage_ctxt(self): + driver = neutron_plugin_attribute(self.plugin, 'driver', + self.network_manager) + config = neutron_plugin_attribute(self.plugin, 'config', + self.network_manager) + nuage_ctxt = { + 'core_plugin': driver, + 'neutron_plugin': 'vsp', + 'neutron_security_groups': self.neutron_security_groups, + 'local_ip': unit_private_ip(), + 'config': config + } + return nuage_ctxt + def nvp_ctxt(self): driver = neutron_plugin_attribute(self.plugin, 'driver', self.network_manager) @@ -706,6 +720,8 @@ class NeutronContext(OSContextGenerator): if self.plugin == 'ovs': ctxt.update(self.ovs_ctxt()) + elif self.plugin == 'vsp': + ctxt.update(self.nuage_ctxt()) elif self.plugin in ['nvp', 'nsx']: ctxt.update(self.nvp_ctxt()) elif self.plugin == 'n1kv': diff --git a/hooks/charmhelpers/contrib/openstack/neutron.py b/hooks/charmhelpers/contrib/openstack/neutron.py index 84d97bca..e9dd488b 100644 --- a/hooks/charmhelpers/contrib/openstack/neutron.py +++ b/hooks/charmhelpers/contrib/openstack/neutron.py @@ -142,6 +142,20 @@ def neutron_plugins(): 'server_packages': ['neutron-server', 'neutron-plugin-cisco'], 'server_services': ['neutron-server'] + }, + 'vsp': { + 'config': '/etc/neutron/plugins/nuage/nuage_plugin.ini', + 'driver': 'neutron.plugins.nuage.plugin.NuagePlugin', + 'contexts': [ + context.SharedDBContext(user=config('neutron-database-user'), + database=config('neutron-database'), + relation_prefix='neutron', + ssl_dir=NEUTRON_CONF_DIR)], + 'services': [], + 'packages': [], + 'server_packages': ['neutron-server', + 'neutron-plugin-nuage'], + 'server_services': ['neutron-server'] } } if release >= 'icehouse': From 00bc64a784cb7e0ab102b514cbaccb7101bbde06 Mon Sep 17 00:00:00 2001 From: Subbarayudu Mukkamala Date: Tue, 4 Nov 2014 06:53:08 -0800 Subject: [PATCH 03/10] nova.conf fixes --- templates/icehouse/nova.conf | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/templates/icehouse/nova.conf b/templates/icehouse/nova.conf index c2b62e42..2bb59127 100644 --- a/templates/icehouse/nova.conf +++ b/templates/icehouse/nova.conf @@ -68,6 +68,14 @@ default_floating_pool = {{ external_network }} {% endif -%} {% endif -%} +{% if neutron_plugin and neutron_plugin == 'vsp' -%} +network_api_class = nova.network.neutronv2.api.API +neutron_ovs_bridge = alubr0 +libvirt_vif_driver = nova.virt.libvirt.vif.LibvirtGenericVIFDriver +security_group_api = nova +firewall_driver=nova.virt.firewall.NoopFirewallDriver +{% endif -%} + {% if neutron_plugin and neutron_plugin == 'nvp' -%} security_group_api = neutron nova_firewall_driver = nova.virt.firewall.NoopFirewallDriver From cde6c5bdc590d65e317829553f50028c5e891b75 Mon Sep 17 00:00:00 2001 From: Aniket Bhat Date: Tue, 4 Nov 2014 11:22:36 -0500 Subject: [PATCH 04/10] Removed un-necessary entries from nova.conf of cloud controller --- templates/icehouse/nova.conf | 4 ---- 1 file changed, 4 deletions(-) diff --git a/templates/icehouse/nova.conf b/templates/icehouse/nova.conf index 2bb59127..b0a04d01 100644 --- a/templates/icehouse/nova.conf +++ b/templates/icehouse/nova.conf @@ -69,11 +69,7 @@ default_floating_pool = {{ external_network }} {% endif -%} {% if neutron_plugin and neutron_plugin == 'vsp' -%} -network_api_class = nova.network.neutronv2.api.API neutron_ovs_bridge = alubr0 -libvirt_vif_driver = nova.virt.libvirt.vif.LibvirtGenericVIFDriver -security_group_api = nova -firewall_driver=nova.virt.firewall.NoopFirewallDriver {% endif -%} {% if neutron_plugin and neutron_plugin == 'nvp' -%} From dba81cd9b23d713a63991c9c92323b095890d665 Mon Sep 17 00:00:00 2001 From: Subbarayudu Mukkamala Date: Wed, 11 Feb 2015 08:03:55 -0800 Subject: [PATCH 05/10] Fix Merge related syntax error: missing }, --- hooks/charmhelpers/contrib/openstack/neutron.py | 1 + 1 file changed, 1 insertion(+) diff --git a/hooks/charmhelpers/contrib/openstack/neutron.py b/hooks/charmhelpers/contrib/openstack/neutron.py index 102a0ad5..6821ed4b 100644 --- a/hooks/charmhelpers/contrib/openstack/neutron.py +++ b/hooks/charmhelpers/contrib/openstack/neutron.py @@ -173,6 +173,7 @@ def neutron_plugins(): 'server_packages': ['neutron-server', 'neutron-plugin-nuage'], 'server_services': ['neutron-server'] + }, 'Calico': { 'config': '/etc/neutron/plugins/ml2/ml2_conf.ini', 'driver': 'neutron.plugins.ml2.plugin.Ml2Plugin', From 8b769f05deef51faca2c795e143ebf9edd4c1401 Mon Sep 17 00:00:00 2001 From: Edward Hope-Morley Date: Wed, 8 Apr 2015 13:10:09 +0100 Subject: [PATCH 06/10] [hopem,r=] Fixes novnc SSL (ha and single unit) Closes-Bug: 1441143 --- hooks/nova_cc_context.py | 20 ++++++++++++++++++++ templates/icehouse/nova.conf | 2 ++ templates/juno/nova.conf | 2 ++ templates/kilo/nova.conf | 2 ++ templates/parts/novnc | 9 +++++++++ unit_tests/test_nova_cc_contexts.py | 6 ++++++ 6 files changed, 41 insertions(+) create mode 100644 templates/parts/novnc diff --git a/hooks/nova_cc_context.py b/hooks/nova_cc_context.py index 0e31839c..2c178447 100644 --- a/hooks/nova_cc_context.py +++ b/hooks/nova_cc_context.py @@ -1,3 +1,5 @@ +import os + from charmhelpers.core.hookenv import ( config, relation_ids, @@ -329,4 +331,22 @@ class InstanceConsoleContext(context.OSContextGenerator): servers = [] ctxt['memcached_servers'] = ','.join(servers) + + # Configure nova-novncproxy https if nova-api is using https. + if https(): + cn = resolve_address(endpoint_type=INTERNAL) + if cn: + cert_filename = 'cert_{}'.format(cn) + key_filename = 'key_{}'.format(cn) + else: + cert_filename = 'cert' + key_filename = 'key' + + ssl_dir = '/etc/apache2/ssl/nova' + cert = os.path.join(ssl_dir, cert_filename) + key = os.path.join(ssl_dir, key_filename) + if os.path.exists(cert) and os.path.exists(key): + ctxt['ssl_cert'] = cert + ctxt['ssl_key'] = key + return ctxt diff --git a/templates/icehouse/nova.conf b/templates/icehouse/nova.conf index 9a43285d..a447e478 100644 --- a/templates/icehouse/nova.conf +++ b/templates/icehouse/nova.conf @@ -42,6 +42,8 @@ my_ip = {{ host_ip }} memcached_servers = {{ memcached_servers }} {% endif %} +{% include "parts/novnc" %} + {% if keystone_ec2_url -%} keystone_ec2_url = {{ keystone_ec2_url }} {% endif -%} diff --git a/templates/juno/nova.conf b/templates/juno/nova.conf index 274d5360..ef27c6d6 100644 --- a/templates/juno/nova.conf +++ b/templates/juno/nova.conf @@ -42,6 +42,8 @@ my_ip = {{ host_ip }} memcached_servers = {{ memcached_servers }} {% endif %} +{% include "parts/novnc" %} + {% if keystone_ec2_url -%} keystone_ec2_url = {{ keystone_ec2_url }} {% endif -%} diff --git a/templates/kilo/nova.conf b/templates/kilo/nova.conf index efa9e1ff..c8979e39 100644 --- a/templates/kilo/nova.conf +++ b/templates/kilo/nova.conf @@ -41,6 +41,8 @@ my_ip = {{ host_ip }} memcached_servers = {{ memcached_servers }} {% endif %} +{% include "parts/novnc" %} + {% if keystone_ec2_url -%} keystone_ec2_url = {{ keystone_ec2_url }} {% endif -%} diff --git a/templates/parts/novnc b/templates/parts/novnc new file mode 100644 index 00000000..fc3d6336 --- /dev/null +++ b/templates/parts/novnc @@ -0,0 +1,9 @@ +{%- if ssl_only -%} +ssl_only=true +{% endif -%} +{% if ssl_cert -%} +cert={{ ssl_cert }} +{% endif -%} +{% if ssl_key -%} +key={{ ssl_key }} +{% endif %} diff --git a/unit_tests/test_nova_cc_contexts.py b/unit_tests/test_nova_cc_contexts.py index fdd63334..3905aa6a 100644 --- a/unit_tests/test_nova_cc_contexts.py +++ b/unit_tests/test_nova_cc_contexts.py @@ -47,6 +47,8 @@ class NovaComputeContextTests(CharmTestCase): self.config.side_effect = self.test_config.get self.log.side_effect = fake_log + @mock.patch.object(context, 'resolve_address', + lambda *args, **kwargs: None) @mock.patch.object(utils, 'os_release') @mock.patch('charmhelpers.contrib.network.ip.log') def test_instance_console_context_without_memcache(self, os_release, log_): @@ -57,6 +59,8 @@ class NovaComputeContextTests(CharmTestCase): self.assertEqual({'memcached_servers': ''}, instance_console()) + @mock.patch.object(context, 'resolve_address', + lambda *args, **kwargs: None) @mock.patch.object(utils, 'os_release') @mock.patch('charmhelpers.contrib.network.ip.log') def test_instance_console_context_with_memcache(self, os_release, log_): @@ -64,6 +68,8 @@ class NovaComputeContextTests(CharmTestCase): '127.0.1.1', '127.0.1.1') + @mock.patch.object(context, 'resolve_address', + lambda *args, **kwargs: None) @mock.patch.object(utils, 'os_release') @mock.patch('charmhelpers.contrib.network.ip.log') def test_instance_console_context_with_memcache_ipv6(self, os_release, From 96caea3fd106e6e4284012d4dbe61934298ca61f Mon Sep 17 00:00:00 2001 From: "james.page@ubuntu.com" <> Date: Mon, 13 Apr 2015 09:51:41 +0100 Subject: [PATCH 07/10] [jamespage] Trivial resync of charm-helpers to pickup Nuage VSP landing. --- .../charmhelpers/contrib/openstack/context.py | 26 +++++++++--------- .../charmhelpers/contrib/openstack/neutron.py | 27 +++++++++---------- hooks/charmhelpers/contrib/openstack/utils.py | 10 ++++++- hooks/charmhelpers/core/hookenv.py | 15 ++++++++++- 4 files changed, 49 insertions(+), 29 deletions(-) diff --git a/hooks/charmhelpers/contrib/openstack/context.py b/hooks/charmhelpers/contrib/openstack/context.py index 8e10c2ae..c9914d0d 100644 --- a/hooks/charmhelpers/contrib/openstack/context.py +++ b/hooks/charmhelpers/contrib/openstack/context.py @@ -320,14 +320,15 @@ def db_ssl(rdata, ctxt, ssl_dir): class IdentityServiceContext(OSContextGenerator): - interfaces = ['identity-service'] - def __init__(self, service=None, service_user=None): + def __init__(self, service=None, service_user=None, rel_name='identity-service'): self.service = service self.service_user = service_user + self.rel_name = rel_name + self.interfaces = [self.rel_name] def __call__(self): - log('Generating template context for identity-service', level=DEBUG) + log('Generating template context for ' + self.rel_name, level=DEBUG) ctxt = {} if self.service and self.service_user: @@ -341,7 +342,7 @@ class IdentityServiceContext(OSContextGenerator): ctxt['signing_dir'] = cachedir - for rid in relation_ids('identity-service'): + for rid in relation_ids(self.rel_name): for unit in related_units(rid): rdata = relation_get(rid=rid, unit=unit) serv_host = rdata.get('service_host') @@ -812,13 +813,12 @@ class NeutronContext(OSContextGenerator): self.network_manager) config = neutron_plugin_attribute(self.plugin, 'config', self.network_manager) - nuage_ctxt = { - 'core_plugin': driver, - 'neutron_plugin': 'vsp', - 'neutron_security_groups': self.neutron_security_groups, - 'local_ip': unit_private_ip(), - 'config': config - } + nuage_ctxt = {'core_plugin': driver, + 'neutron_plugin': 'vsp', + 'neutron_security_groups': self.neutron_security_groups, + 'local_ip': unit_private_ip(), + 'config': config} + return nuage_ctxt def nvp_ctxt(self): @@ -898,14 +898,14 @@ class NeutronContext(OSContextGenerator): if self.plugin == 'ovs': ctxt.update(self.ovs_ctxt()) - elif self.plugin == 'vsp': - ctxt.update(self.nuage_ctxt()) elif self.plugin in ['nvp', 'nsx']: ctxt.update(self.nvp_ctxt()) elif self.plugin == 'n1kv': ctxt.update(self.n1kv_ctxt()) elif self.plugin == 'Calico': ctxt.update(self.calico_ctxt()) + elif self.plugin == 'vsp': + ctxt.update(self.nuage_ctxt()) alchemy_flags = config('neutron-alchemy-flags') if alchemy_flags: diff --git a/hooks/charmhelpers/contrib/openstack/neutron.py b/hooks/charmhelpers/contrib/openstack/neutron.py index 845082b0..02c92e9c 100644 --- a/hooks/charmhelpers/contrib/openstack/neutron.py +++ b/hooks/charmhelpers/contrib/openstack/neutron.py @@ -161,20 +161,6 @@ def neutron_plugins(): 'neutron-plugin-cisco'], 'server_services': ['neutron-server'] }, - 'vsp': { - 'config': '/etc/neutron/plugins/nuage/nuage_plugin.ini', - 'driver': 'neutron.plugins.nuage.plugin.NuagePlugin', - 'contexts': [ - context.SharedDBContext(user=config('neutron-database-user'), - database=config('neutron-database'), - relation_prefix='neutron', - ssl_dir=NEUTRON_CONF_DIR)], - 'services': [], - 'packages': [], - 'server_packages': ['neutron-server', - 'neutron-plugin-nuage'], - 'server_services': ['neutron-server'] - }, 'Calico': { 'config': '/etc/neutron/plugins/ml2/ml2_conf.ini', 'driver': 'neutron.plugins.ml2.plugin.Ml2Plugin', @@ -194,6 +180,19 @@ def neutron_plugins(): 'nova-api-metadata']], 'server_packages': ['neutron-server', 'calico-control'], 'server_services': ['neutron-server'] + }, + 'vsp': { + 'config': '/etc/neutron/plugins/nuage/nuage_plugin.ini', + 'driver': 'neutron.plugins.nuage.plugin.NuagePlugin', + 'contexts': [ + context.SharedDBContext(user=config('neutron-database-user'), + database=config('neutron-database'), + relation_prefix='neutron', + ssl_dir=NEUTRON_CONF_DIR)], + 'services': [], + 'packages': [], + 'server_packages': ['neutron-server', 'neutron-plugin-nuage'], + 'server_services': ['neutron-server'] } } if release >= 'icehouse': diff --git a/hooks/charmhelpers/contrib/openstack/utils.py b/hooks/charmhelpers/contrib/openstack/utils.py index 78c5e2df..5a12c9d6 100644 --- a/hooks/charmhelpers/contrib/openstack/utils.py +++ b/hooks/charmhelpers/contrib/openstack/utils.py @@ -510,8 +510,10 @@ def git_clone_and_install(projects_yaml, core_project): repository: 'git://git.openstack.org/openstack/requirements.git', branch: 'stable/icehouse'} directory: /mnt/openstack-git + http_proxy: http://squid.internal:3128 + https_proxy: https://squid.internal:3128 - The directory key is optional. + The directory, http_proxy, and https_proxy keys are optional. """ global requirements_dir parent_dir = '/mnt/openstack-git' @@ -522,6 +524,12 @@ def git_clone_and_install(projects_yaml, core_project): projects = yaml.load(projects_yaml) _git_validate_projects_yaml(projects, core_project) + if 'http_proxy' in projects.keys(): + os.environ['http_proxy'] = projects['http_proxy'] + + if 'https_proxy' in projects.keys(): + os.environ['https_proxy'] = projects['https_proxy'] + if 'directory' in projects.keys(): parent_dir = projects['directory'] diff --git a/hooks/charmhelpers/core/hookenv.py b/hooks/charmhelpers/core/hookenv.py index 715dd4c5..86f805f1 100644 --- a/hooks/charmhelpers/core/hookenv.py +++ b/hooks/charmhelpers/core/hookenv.py @@ -20,11 +20,13 @@ # Authors: # Charm Helpers Developers +from __future__ import print_function import os import json import yaml import subprocess import sys +import errno from subprocess import CalledProcessError import six @@ -87,7 +89,18 @@ def log(message, level=None): if not isinstance(message, six.string_types): message = repr(message) command += [message] - subprocess.call(command) + # Missing juju-log should not cause failures in unit tests + # Send log output to stderr + try: + subprocess.call(command) + except OSError as e: + if e.errno == errno.ENOENT: + if level: + message = "{}: {}".format(level, message) + message = "juju-log: {}".format(message) + print(message, file=sys.stderr) + else: + raise class Serializable(UserDict): From 733cd6cb63cc6635147179507ceba0d2c327d565 Mon Sep 17 00:00:00 2001 From: Ryan Beisner Date: Tue, 14 Apr 2015 01:14:27 +0000 Subject: [PATCH 08/10] flip to next charms in amulet test --- tests/basic_deployment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/basic_deployment.py b/tests/basic_deployment.py index cfe8a419..839766bc 100644 --- a/tests/basic_deployment.py +++ b/tests/basic_deployment.py @@ -19,7 +19,7 @@ u = OpenStackAmuletUtils(ERROR) class NovaCCBasicDeployment(OpenStackAmuletDeployment): """Amulet tests on a basic nova cloud controller deployment.""" - def __init__(self, series=None, openstack=None, source=None, stable=True): + def __init__(self, series=None, openstack=None, source=None, stable=False): """Deploy the entire test environment.""" super(NovaCCBasicDeployment, self).__init__(series, openstack, source, stable) self._add_services() From 71628071a2a9da7d19d4a59ef9bdf11172099541 Mon Sep 17 00:00:00 2001 From: Ryan Beisner Date: Tue, 14 Apr 2015 01:14:46 +0000 Subject: [PATCH 09/10] flip to debug output in amulet tests --- tests/basic_deployment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/basic_deployment.py b/tests/basic_deployment.py index 839766bc..2e13d210 100644 --- a/tests/basic_deployment.py +++ b/tests/basic_deployment.py @@ -13,7 +13,7 @@ from charmhelpers.contrib.openstack.amulet.utils import ( ) # Use DEBUG to turn on debug logging -u = OpenStackAmuletUtils(ERROR) +u = OpenStackAmuletUtils(DEBUG) class NovaCCBasicDeployment(OpenStackAmuletDeployment): From d73f457d8fb975582163e183aa54aa016c196887 Mon Sep 17 00:00:00 2001 From: Ryan Beisner Date: Tue, 14 Apr 2015 01:15:40 +0000 Subject: [PATCH 10/10] sync charm helpers --- hooks/charmhelpers/contrib/openstack/templates/git.upstart | 4 ++++ hooks/charmhelpers/core/strutils.py | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hooks/charmhelpers/contrib/openstack/templates/git.upstart b/hooks/charmhelpers/contrib/openstack/templates/git.upstart index da94ad12..4bed404b 100644 --- a/hooks/charmhelpers/contrib/openstack/templates/git.upstart +++ b/hooks/charmhelpers/contrib/openstack/templates/git.upstart @@ -9,5 +9,9 @@ respawn exec start-stop-daemon --start --chuid {{ user_name }} \ --chdir {{ start_dir }} --name {{ process_name }} \ --exec {{ executable_name }} -- \ + {% for config_file in config_files -%} --config-file={{ config_file }} \ + {% endfor -%} + {% if log_file -%} --log-file={{ log_file }} + {% endif -%} diff --git a/hooks/charmhelpers/core/strutils.py b/hooks/charmhelpers/core/strutils.py index efc4402e..a2a784aa 100644 --- a/hooks/charmhelpers/core/strutils.py +++ b/hooks/charmhelpers/core/strutils.py @@ -33,9 +33,9 @@ def bool_from_string(value): value = value.strip().lower() - if value in ['y', 'yes', 'true', 't']: + if value in ['y', 'yes', 'true', 't', 'on']: return True - elif value in ['n', 'no', 'false', 'f']: + elif value in ['n', 'no', 'false', 'f', 'off']: return False msg = "Unable to interpret string value '%s' as boolean" % (value)