diff --git a/hooks/charmhelpers/contrib/openstack/amulet/deployment.py b/hooks/charmhelpers/contrib/openstack/amulet/deployment.py index 5c1ce457..5c041d2c 100644 --- a/hooks/charmhelpers/contrib/openstack/amulet/deployment.py +++ b/hooks/charmhelpers/contrib/openstack/amulet/deployment.py @@ -262,7 +262,8 @@ class OpenStackAmuletDeployment(AmuletDeployment): # Must be ordered by OpenStack release (not by Ubuntu release): (self.trusty_icehouse, self.trusty_kilo, self.trusty_liberty, self.trusty_mitaka, self.xenial_mitaka, self.xenial_newton, - self.yakkety_newton, self.xenial_ocata, self.zesty_ocata) = range(9) + self.yakkety_newton, self.xenial_ocata, self.zesty_ocata, + self.xenial_pike, self.artful_pike) = range(11) releases = { ('trusty', None): self.trusty_icehouse, @@ -272,8 +273,10 @@ class OpenStackAmuletDeployment(AmuletDeployment): ('xenial', None): self.xenial_mitaka, ('xenial', 'cloud:xenial-newton'): self.xenial_newton, ('xenial', 'cloud:xenial-ocata'): self.xenial_ocata, + ('xenial', 'cloud:xenial-pike'): self.xenial_pike, ('yakkety', None): self.yakkety_newton, ('zesty', None): self.zesty_ocata, + ('artful', None): self.artful_pike, } return releases[(self.series, self.openstack)] @@ -287,6 +290,7 @@ class OpenStackAmuletDeployment(AmuletDeployment): ('xenial', 'mitaka'), ('yakkety', 'newton'), ('zesty', 'ocata'), + ('artful', 'pike'), ]) if self.openstack: os_origin = self.openstack.split(':')[1] diff --git a/hooks/charmhelpers/contrib/openstack/context.py b/hooks/charmhelpers/contrib/openstack/context.py index 2adf2cb8..ea93159d 100644 --- a/hooks/charmhelpers/contrib/openstack/context.py +++ b/hooks/charmhelpers/contrib/openstack/context.py @@ -1393,6 +1393,10 @@ class NeutronAPIContext(OSContextGenerator): 'rel_key': 'enable-l3ha', 'default': False, }, + 'dns_domain': { + 'rel_key': 'dns-domain', + 'default': None, + }, } ctxt = self.get_neutron_options({}) for rid in relation_ids('neutron-plugin-api'): diff --git a/hooks/charmhelpers/contrib/openstack/utils.py b/hooks/charmhelpers/contrib/openstack/utils.py index e13450c1..46fe3933 100644 --- a/hooks/charmhelpers/contrib/openstack/utils.py +++ b/hooks/charmhelpers/contrib/openstack/utils.py @@ -111,6 +111,8 @@ OPENSTACK_RELEASES = ( 'newton', 'ocata', 'pike', + 'queens', + 'rocky', ) UBUNTU_OPENSTACK_RELEASE = OrderedDict([ @@ -126,6 +128,7 @@ UBUNTU_OPENSTACK_RELEASE = OrderedDict([ ('xenial', 'mitaka'), ('yakkety', 'newton'), ('zesty', 'ocata'), + ('artful', 'pike'), ]) @@ -142,6 +145,7 @@ OPENSTACK_CODENAMES = OrderedDict([ ('2016.1', 'mitaka'), ('2016.2', 'newton'), ('2017.1', 'ocata'), + ('2017.2', 'pike'), ]) # The ugly duckling - must list releases oldest to newest @@ -179,54 +183,81 @@ PACKAGE_CODENAMES = { ('13', 'mitaka'), ('14', 'newton'), ('15', 'ocata'), + ('16', 'pike'), + ('17', 'queens'), + ('18', 'rocky'), ]), 'neutron-common': OrderedDict([ ('7', 'liberty'), ('8', 'mitaka'), ('9', 'newton'), ('10', 'ocata'), + ('11', 'pike'), + ('12', 'queens'), + ('13', 'rocky'), ]), 'cinder-common': OrderedDict([ ('7', 'liberty'), ('8', 'mitaka'), ('9', 'newton'), ('10', 'ocata'), + ('11', 'pike'), + ('12', 'queens'), + ('13', 'rocky'), ]), 'keystone': OrderedDict([ ('8', 'liberty'), ('9', 'mitaka'), ('10', 'newton'), ('11', 'ocata'), + ('12', 'pike'), + ('13', 'queens'), + ('14', 'rocky'), ]), 'horizon-common': OrderedDict([ ('8', 'liberty'), ('9', 'mitaka'), ('10', 'newton'), ('11', 'ocata'), + ('12', 'pike'), + ('13', 'queens'), + ('14', 'rocky'), ]), 'ceilometer-common': OrderedDict([ ('5', 'liberty'), ('6', 'mitaka'), ('7', 'newton'), ('8', 'ocata'), + ('9', 'pike'), + ('10', 'queens'), + ('11', 'rocky'), ]), 'heat-common': OrderedDict([ ('5', 'liberty'), ('6', 'mitaka'), ('7', 'newton'), ('8', 'ocata'), + ('9', 'pike'), + ('10', 'queens'), + ('11', 'rocky'), ]), 'glance-common': OrderedDict([ ('11', 'liberty'), ('12', 'mitaka'), ('13', 'newton'), ('14', 'ocata'), + ('15', 'pike'), + ('16', 'queens'), + ('17', 'rocky'), ]), 'openstack-dashboard': OrderedDict([ ('8', 'liberty'), ('9', 'mitaka'), ('10', 'newton'), ('11', 'ocata'), + ('12', 'pike'), + ('13', 'queens'), + ('14', 'rocky'), ]), } @@ -579,6 +610,12 @@ def configure_installation_source(rel): 'ocata': 'xenial-updates/ocata', 'ocata/updates': 'xenial-updates/ocata', 'ocata/proposed': 'xenial-proposed/ocata', + 'pike': 'xenial-updates/pike', + 'pike/updates': 'xenial-updates/pike', + 'pike/proposed': 'xenial-proposed/pike', + 'queens': 'xenial-updates/queens', + 'queens/updates': 'xenial-updates/queens', + 'queens/proposed': 'xenial-proposed/queens', } try: diff --git a/hooks/charmhelpers/core/host_factory/ubuntu.py b/hooks/charmhelpers/core/host_factory/ubuntu.py index 0448288c..d8dc378a 100644 --- a/hooks/charmhelpers/core/host_factory/ubuntu.py +++ b/hooks/charmhelpers/core/host_factory/ubuntu.py @@ -19,6 +19,7 @@ UBUNTU_RELEASES = ( 'xenial', 'yakkety', 'zesty', + 'artful', ) diff --git a/hooks/charmhelpers/fetch/ubuntu.py b/hooks/charmhelpers/fetch/ubuntu.py index 82ac80ff..7bc6cc7e 100644 --- a/hooks/charmhelpers/fetch/ubuntu.py +++ b/hooks/charmhelpers/fetch/ubuntu.py @@ -113,6 +113,22 @@ CLOUD_ARCHIVE_POCKETS = { 'ocata/proposed': 'xenial-proposed/ocata', 'xenial-ocata/proposed': 'xenial-proposed/ocata', 'xenial-ocata/newton': 'xenial-proposed/ocata', + # Pike + 'pike': 'xenial-updates/pike', + 'xenial-pike': 'xenial-updates/pike', + 'xenial-pike/updates': 'xenial-updates/pike', + 'xenial-updates/pike': 'xenial-updates/pike', + 'pike/proposed': 'xenial-proposed/pike', + 'xenial-pike/proposed': 'xenial-proposed/pike', + 'xenial-pike/newton': 'xenial-proposed/pike', + # Queens + 'queens': 'xenial-updates/queens', + 'xenial-queens': 'xenial-updates/queens', + 'xenial-queens/updates': 'xenial-updates/queens', + 'xenial-updates/queens': 'xenial-updates/queens', + 'queens/proposed': 'xenial-proposed/queens', + 'xenial-queens/proposed': 'xenial-proposed/queens', + 'xenial-queens/newton': 'xenial-proposed/queens', } APT_NO_LOCK = 100 # The return code for "couldn't acquire lock" in APT. diff --git a/hooks/neutron_api_utils.py b/hooks/neutron_api_utils.py index 016d0fa8..88c1e158 100755 --- a/hooks/neutron_api_utils.py +++ b/hooks/neutron_api_utils.py @@ -320,6 +320,8 @@ def determine_packages(source=None): if CompareOpenStackReleases(release) >= 'kilo': packages.extend(KILO_PACKAGES) + if CompareOpenStackReleases(release) >= 'pike': + packages.remove('python-neutron-vpnaas') if release == 'kilo' or CompareOpenStackReleases(release) >= 'mitaka': packages.append('python-networking-hyperv') diff --git a/templates/pike/neutron.conf b/templates/pike/neutron.conf new file mode 100644 index 00000000..410b556b --- /dev/null +++ b/templates/pike/neutron.conf @@ -0,0 +1,114 @@ +# newton +############################################################################### +# [ WARNING ] +# Configuration file maintained by Juju. Local changes may be overwritten. +# Restart trigger {{ restart_trigger }} +############################################################################### +[DEFAULT] +verbose = {{ verbose }} +debug = {{ debug }} +use_syslog = {{ use_syslog }} +state_path = /var/lib/neutron +bind_host = {{ bind_host }} +auth_strategy = keystone +notification_driver = messaging +notification_topics = notifications,notifications_designate +api_workers = {{ workers }} +rpc_workers = {{ workers }} + +router_distributed = {{ enable_dvr }} + +l3_ha = {{ l3_ha }} +{% if l3_ha -%} +max_l3_agents_per_router = {{ max_l3_agents_per_router }} +min_l3_agents_per_router = {{ min_l3_agents_per_router }} +{% endif -%} + +{% if neutron_bind_port -%} +bind_port = {{ neutron_bind_port }} +{% else -%} +bind_port = 9696 +{% endif -%} + +{% if core_plugin -%} +core_plugin = {{ core_plugin }} +{% if service_plugins -%} +service_plugins = {{ service_plugins }} +{% else -%} +{% if neutron_plugin in ['ovs', 'ml2', 'Calico'] -%} +service_plugins = router,firewall,metering,neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2 +{% endif -%} +{% endif -%} +{% endif -%} + +{% if neutron_security_groups -%} +allow_overlapping_ips = True +{% if neutron_plugin == 'Calico' -%} +neutron_firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver +{% else -%} +neutron_firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver +{% endif -%} +{% endif -%} + +dhcp_agents_per_network = {{ dhcp_agents_per_network }} + +notify_nova_on_port_status_changes = True +notify_nova_on_port_data_changes = True + +{% if sections and 'DEFAULT' in sections -%} +{% for key, value in sections['DEFAULT'] -%} +{{ key }} = {{ value }} +{% endfor -%} +{% endif %} + +{% if user_config_flags -%} +{% for key, value in user_config_flags.iteritems() -%} +{{ key }} = {{ value }} +{% endfor -%} +{% endif -%} + +{% if global_physnet_mtu -%} +global_physnet_mtu = {{ global_physnet_mtu }} +{% endif -%} + +{% include "section-zeromq" %} + +[quotas] +{% if quota_driver -%} +quota_driver = {{ quota_driver }} +{% else -%} +quota_driver = neutron.db.quota_db.DbQuotaDriver +{% endif -%} +{% if neutron_security_groups -%} +quota_items = network,subnet,port,security_group,security_group_rule +quota_security_group = {{ quota_security_group }} +quota_security_group_rule = {{ quota_security_group_rule }} +{% else -%} +quota_items = network,subnet,port +{% endif -%} +quota_network = {{ quota_network }} +quota_subnet = {{ quota_subnet }} +quota_port = {{ quota_port }} +quota_vip = {{ quota_vip }} +quota_pool = {{ quota_pool }} +quota_member = {{ quota_member }} +quota_health_monitors = {{ quota_health_monitors }} +quota_router = {{ quota_router }} +quota_floatingip = {{ quota_floatingip }} + +[agent] +root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf + +{% include "section-keystone-authtoken-mitaka" %} + +{% include "parts/section-database" %} + +{% include "section-rabbitmq-oslo" %} + +[oslo_concurrency] +lock_path = $state_path/lock + +{% include "parts/section-nova" %} + +[service_providers] +service_provider = LOADBALANCERV2:Haproxy:neutron_lbaas.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default diff --git a/tests/charmhelpers/contrib/openstack/amulet/deployment.py b/tests/charmhelpers/contrib/openstack/amulet/deployment.py index 5c1ce457..5c041d2c 100644 --- a/tests/charmhelpers/contrib/openstack/amulet/deployment.py +++ b/tests/charmhelpers/contrib/openstack/amulet/deployment.py @@ -262,7 +262,8 @@ class OpenStackAmuletDeployment(AmuletDeployment): # Must be ordered by OpenStack release (not by Ubuntu release): (self.trusty_icehouse, self.trusty_kilo, self.trusty_liberty, self.trusty_mitaka, self.xenial_mitaka, self.xenial_newton, - self.yakkety_newton, self.xenial_ocata, self.zesty_ocata) = range(9) + self.yakkety_newton, self.xenial_ocata, self.zesty_ocata, + self.xenial_pike, self.artful_pike) = range(11) releases = { ('trusty', None): self.trusty_icehouse, @@ -272,8 +273,10 @@ class OpenStackAmuletDeployment(AmuletDeployment): ('xenial', None): self.xenial_mitaka, ('xenial', 'cloud:xenial-newton'): self.xenial_newton, ('xenial', 'cloud:xenial-ocata'): self.xenial_ocata, + ('xenial', 'cloud:xenial-pike'): self.xenial_pike, ('yakkety', None): self.yakkety_newton, ('zesty', None): self.zesty_ocata, + ('artful', None): self.artful_pike, } return releases[(self.series, self.openstack)] @@ -287,6 +290,7 @@ class OpenStackAmuletDeployment(AmuletDeployment): ('xenial', 'mitaka'), ('yakkety', 'newton'), ('zesty', 'ocata'), + ('artful', 'pike'), ]) if self.openstack: os_origin = self.openstack.split(':')[1] diff --git a/tests/charmhelpers/core/host_factory/ubuntu.py b/tests/charmhelpers/core/host_factory/ubuntu.py index 0448288c..d8dc378a 100644 --- a/tests/charmhelpers/core/host_factory/ubuntu.py +++ b/tests/charmhelpers/core/host_factory/ubuntu.py @@ -19,6 +19,7 @@ UBUNTU_RELEASES = ( 'xenial', 'yakkety', 'zesty', + 'artful', ) diff --git a/tests/gate-basic-artful-pike b/tests/gate-basic-artful-pike new file mode 100644 index 00000000..a79b52a7 --- /dev/null +++ b/tests/gate-basic-artful-pike @@ -0,0 +1,23 @@ +#!/usr/bin/env python +# +# Copyright 2016 Canonical Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Amulet tests on a basic neutron-api deployment on artful-pike.""" + +from basic_deployment import NeutronAPIBasicDeployment + +if __name__ == '__main__': + deployment = NeutronAPIBasicDeployment(series='artful') + deployment.run_tests() diff --git a/tests/gate-basic-xenial-pike b/tests/gate-basic-xenial-pike new file mode 100644 index 00000000..e5f409f0 --- /dev/null +++ b/tests/gate-basic-xenial-pike @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# +# Copyright 2016 Canonical Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Amulet tests on a basic neutron-api deployment on xenial-pike.""" + +from basic_deployment import NeutronAPIBasicDeployment + +if __name__ == '__main__': + deployment = NeutronAPIBasicDeployment(series='xenial', + openstack='cloud:xenial-pike', + source='cloud:xenial-updates/pike') + deployment.run_tests()