diff --git a/.bzrignore b/.bzrignore
deleted file mode 100644
index 20427f3..0000000
--- a/.bzrignore
+++ /dev/null
@@ -1,6 +0,0 @@
-bin
-.settings
-.testrepository
-.tox
-*.pyc
-.git
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 8c67323..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-bin
-build
-.settings
-.testrepository
-.tox
-*.pyc
-*.sw[nop]
-layers
diff --git a/.project b/.project
deleted file mode 100644
index ea060b5..0000000
--- a/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- openvswitch-odl
-
-
-
-
-
- org.python.pydev.PyDevBuilder
-
-
-
-
-
- org.python.pydev.pythonNature
-
-
diff --git a/.pydevproject b/.pydevproject
deleted file mode 100644
index 6af7172..0000000
--- a/.pydevproject
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-python 2.7
-Default
-
-/openvswitch-odl/hooks
-/openvswitch-odl/unit_tests
-/openvswitch-odl/tests
-
-
diff --git a/.testr.conf b/.testr.conf
deleted file mode 100644
index 801646b..0000000
--- a/.testr.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-[DEFAULT]
-test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \
- OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \
- OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \
- ${PYTHON:-python} -m subunit.run discover -t ./ ./unit_tests $LISTOPT $IDOPTION
-
-test_id_option=--load-list $IDFILE
-test_list_option=--list
diff --git a/.zuul.yaml b/.zuul.yaml
index 7051aee..e7c200a 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -1,3 +1,3 @@
- project:
templates:
- - python35-charm-jobs
+ - noop-jobs
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index d645695..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- 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.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b72ee4f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,6 @@
+This project is no longer maintained.
+
+The contents of this repository are still available in the Git
+source code management system. To see the contents of this
+repository before it reached its end of life, please check out the
+previous commit with "git checkout HEAD^1".
diff --git a/actions/.keep b/actions/.keep
deleted file mode 100644
index f49b91a..0000000
--- a/actions/.keep
+++ /dev/null
@@ -1,3 +0,0 @@
- This file was created by release-tools to ensure that this empty
- directory is preserved in vcs re: lint check definitions in global
- tox.ini files. This file can be removed if/when this dir is actually in use.
diff --git a/lib/.keep b/lib/.keep
deleted file mode 100644
index f49b91a..0000000
--- a/lib/.keep
+++ /dev/null
@@ -1,3 +0,0 @@
- This file was created by release-tools to ensure that this empty
- directory is preserved in vcs re: lint check definitions in global
- tox.ini files. This file can be removed if/when this dir is actually in use.
diff --git a/rebuild b/rebuild
deleted file mode 100644
index 08ac52e..0000000
--- a/rebuild
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file is used to trigger rebuilds
-# when dependencies of the charm change,
-# but nothing in the charm needs to.
-# simply change the uuid to something new
-93e11b9e-86a6-11e8-b3ac-9f8b2e5df0b9
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 20f335d..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file is managed centrally. If you find the need to modify this as a
-# one-off, please don't. Intead, consult #openstack-charms and ask about
-# requirements management in charms via bot-control. Thank you.
-#
-# Build requirements
-charm-tools>=2.4.4
-simplejson
diff --git a/src/README.md b/src/README.md
deleted file mode 100644
index 7b5c0f5..0000000
--- a/src/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Overview
-
-This subordinate charm provides OpenvSwitch integration with an OpenDayLight (ODL) controller.
-
-Its design to support deployment of principle charms as part of an ODL SDN deployment.
-
-It also optionally supports deployment and configuration with OpenStack Compute (Nova).
-
-# Usage
-
-To deploy (partial deployment only - see other charms for full details):
-
- juju deploy openvswitch-odl
- juju deploy odl-controller
- juju add-relation odl-controller openvswitch-odl
-
-
-This charm can be used with any other principle charm:
-
- juju deploy ubuntu
- juju add-relation openvswitch-odl ubuntu
-
-or with the OpenStack nova-compute and neutron-gateway charms:
-
- juju deploy nova-compute
- juju deploy neutron-gateway
- juju add-relation nova-compute openvswitch-odl
- juju add-relation neutron-gateway openvswitch-odl
-
-# Configuration Options
-
-This charm will optionally configure the local ip address of the OVS instance to something other than the 'private-address' provided by Juju:
-
- juju set openvswitch-odl os-data-network=10.20.3.0/21
-
-The charm will scan configured network interfaces, and reconfigure the OVS instance with an alternative IP address if one is found within the configure subnet CIDR.
-
-# Restrictions
-
-This charm can't be deployed under LXC containers; however it will work just fine under KVM or on bare metal.
diff --git a/src/config.yaml b/src/config.yaml
deleted file mode 100644
index a4ad890..0000000
--- a/src/config.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-options:
- os-data-network:
- type: string
- default:
- description: |
- The IP address and netmask of the OpenStack Data network (e.g.,
- 192.168.0.0/24)
- .
- This network will be used for tenant network traffic in overlay
- networks.
- mac-network-map:
- default:
- type: string
- description: |
- Map of physical nic mac address to configured VLAN's.
diff --git a/src/copyright b/src/copyright
deleted file mode 100644
index 92252ff..0000000
--- a/src/copyright
+++ /dev/null
@@ -1,16 +0,0 @@
-Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0
-
-Files: *
-Copyright: 2015, Canonical Ltd.
-License: Apache-2.0
- 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.
diff --git a/src/icon.svg b/src/icon.svg
deleted file mode 100644
index c0f123b..0000000
--- a/src/icon.svg
+++ /dev/null
@@ -1,341 +0,0 @@
-
-
-
-
diff --git a/src/layer.yaml b/src/layer.yaml
deleted file mode 100644
index 6306c88..0000000
--- a/src/layer.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-includes: ['layer:openstack', 'interface:neutron-plugin', 'interface:ovsdb-manager', 'interface:odl-controller-api']
-options:
- basic:
- use_venv: True
- include_system_packages: True
diff --git a/src/lib/charm/openstack/__init__.py b/src/lib/charm/openstack/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/lib/charm/openstack/openvswitch_odl.py b/src/lib/charm/openstack/openvswitch_odl.py
deleted file mode 100644
index 75a2786..0000000
--- a/src/lib/charm/openstack/openvswitch_odl.py
+++ /dev/null
@@ -1,102 +0,0 @@
-import socket
-import subprocess
-
-import charmhelpers.core.hookenv as hookenv
-import charmhelpers.contrib.network.ip as ch_ip
-import charms_openstack.charm
-import charms_openstack.sdn.odl as odl
-import charms_openstack.sdn.ovs as ovs
-import charms_openstack.devices.pci as pci
-
-
-class OVSODLCharm(charms_openstack.charm.OpenStackCharm):
-
- # Internal name of charm + keystone endpoint
- service_name = name = 'openvswitch_odl'
-
- # First release supported
- release = 'liberty'
-
- packages = ['openvswitch-switch']
-
- def configure_openvswitch(self, odl_ovsdb):
- hookenv.log("Configuring OpenvSwitch with ODL OVSDB controller: %s" %
- odl_ovsdb.connection_string())
- local_ip = ch_ip.get_address_in_network(
- self.config.get('os-data-network'),
- hookenv.unit_private_ip())
- ovs.set_config('local_ip', local_ip)
- ovs.set_config('controller-ips', odl_ovsdb.private_address(),
- table='external_ids')
- ovs.set_config('host-id', socket.gethostname(),
- table='external_ids')
- ovs.set_manager(odl_ovsdb.connection_string())
- hookenv.status_set('active', 'Unit is ready')
-
- def unconfigure_openvswitch(self, odl_ovsdb):
- hookenv.log("Unconfiguring OpenvSwitch")
- subprocess.check_call(['ovs-vsctl', 'del-manager'])
- bridges = subprocess.check_output(['ovs-vsctl',
- 'list-br']).split()
- for bridge in bridges:
- subprocess.check_call(['ovs-vsctl',
- 'del-controller', bridge])
- hookenv.status_set(
- 'waiting',
- 'Open vSwitch not configured with an ODL OVSDB controller')
-
- def configure_neutron_plugin(self, neutron_plugin):
- neutron_plugin.configure_plugin(
- plugin='ovs-odl',
- config={
- "nova-compute": {
- "/etc/nova/nova.conf": {
- "sections": {
- 'DEFAULT': [
- ('firewall_driver',
- 'nova.virt.firewall.'
- 'NoopFirewallDriver'),
- ('libvirt_vif_driver',
- 'nova.virt.libvirt.vif.'
- 'LibvirtGenericVIFDriver'),
- ('security_group_api', 'neutron'),
- ],
- }
- }
- }
- })
-
- def odl_node_registration(self, controller):
- """ Register node with ODL if not registered already """
- odl_conn = odl.ODLConfig(**controller.connection())
- device_name = socket.gethostname()
- if odl_conn.is_device_registered(device_name):
- hookenv.log('{} is already registered in odl'.format(device_name))
- else:
- local_ip = ch_ip.get_address_in_network(
- self.config('os-data-network'),
- hookenv.unit_private_ip())
- hookenv.log('Registering {} ({}) in odl'.format(
- device_name, local_ip))
- odl_conn.odl_register_node(device_name, local_ip)
-
- def odl_register_macs(self, controller):
- """ Register local interfaces and their networks with ODL """
- hookenv.log('Looking for macs to register with networks in odl')
- odl_conn = odl.ODLConfig(**controller.connection())
- device_name = socket.gethostname()
- requested_config = pci.PCIInfo()['local_config']
- for mac in requested_config.keys():
- for requested_net in requested_config[mac]:
- net = requested_net['net']
- interface = requested_net['interface']
- if not odl_conn.is_net_device_registered(net, device_name,
- interface, mac,
- device_type='ovs'):
- hookenv.log('Registering {} and {} on '
- '{}'.format(net, interface, mac))
- odl_conn.odl_register_macs(device_name, net, interface,
- mac, device_type='ovs')
- else:
- hookenv.log('{} already registered for {} on '
- '{}'.format(net, interface, device_name))
diff --git a/src/metadata.yaml b/src/metadata.yaml
deleted file mode 100644
index 4cf9605..0000000
--- a/src/metadata.yaml
+++ /dev/null
@@ -1,38 +0,0 @@
-name: openvswitch-odl
-subordinate: true
-maintainer: OpenStack Charmers
-summary: Open vSwitch OpenDayLight subordinate charm
-description:
- Open vSwitch is a production quality, multilayer, software-based,
- Ethernet virtual switch. It is designed to enable massive network
- automation through programmatic extension, while still supporting
- standard management interfaces and protocols (e.g. NetFlow, IPFIX,
- sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag). In addition, it is designed
- to support distribution across multiple physical servers similar to
- VMware's vNetwork distributed vswitch or Cisco's Nexus 1000V.
- .
- OpenDaylight is a network virtualization solution that provides an
- overlay virtual-network to virtual-machines, containers or network
- namespaces.
- .
- This charm integrates Open vSwitch into OpenDayLight as part of an
- OpenStack Cloud.
-tags:
- - openstack
-series:
- - xenial
- - bionic
- - cosmic
- - trusty
-provides:
- neutron-plugin:
- interface: neutron-plugin
- scope: container
-requires:
- ovsdb-manager:
- interface: ovsdb-manager
- controller-api:
- interface: odl-controller-api
- container:
- interface: juju-info
- scope: container
diff --git a/src/reactive/openvswitch_odl_handlers.py b/src/reactive/openvswitch_odl_handlers.py
deleted file mode 100644
index 47c01b7..0000000
--- a/src/reactive/openvswitch_odl_handlers.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# 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.
-
-import charms_openstack.charm as charm
-import charms.reactive as reactive
-
-# This charm's library contains all of the handler code associated with
-# ovs_odl
-import charm.openstack.openvswitch_odl as ovs_odl # noqa
-
-charm.use_defaults(
- 'charm.installed',
- 'config.changed',
- 'update-status')
-
-
-@reactive.when('ovsdb-manager.access.available')
-@reactive.when('charm.installed')
-def configure_openvswitch(odl_ovsdb):
- with charm.provide_charm_instance() as ovs_odl_charm:
- ovs_odl_charm.configure_openvswitch(odl_ovsdb)
- reactive.set_state('ovs.configured')
-
-
-@reactive.when('ovs.configured')
-@reactive.when_not('ovsdb-manager.access.available')
-def unconfigure_openvswitch(odl_ovsdb=None):
- with charm.provide_charm_instance() as ovs_odl_charm:
- ovs_odl_charm.unconfigure_openvswitch(odl_ovsdb)
- reactive.remove_state('ovs.configured')
-
-
-@reactive.when('neutron-plugin.connected')
-def configure_neutron_plugin(neutron_plugin):
- with charm.provide_charm_instance() as ovs_odl_charm:
- ovs_odl_charm.configure_neutron_plugin(neutron_plugin)
-
-
-@reactive.when('controller-api.access.available')
-def odl_node_registration(controller):
- with charm.provide_charm_instance() as ovs_odl_charm:
- ovs_odl_charm.register_node(controller)
-
-
-@reactive.when('controller-api.access.available')
-def odl_mac_registration(controller):
- with charm.provide_charm_instance() as ovs_odl_charm:
- ovs_odl_charm.register_macs(controller)
diff --git a/src/templates/mac_registration b/src/templates/mac_registration
deleted file mode 100644
index 5931b8f..0000000
--- a/src/templates/mac_registration
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "neutron-device-map:physicalNetwork": {
- "name": "{{ network }}",
- "device": [
- {
- "interface": [
- {
- "macAddress": "{{ mac }}",
- "interface-name": "{{ interface }}"
- }
- ],
- "device-name": "{{ vpp_host }}",
- "device-type": "{{ device_type }}"
- }
- ]
- }
-}
diff --git a/src/templates/odl_registration b/src/templates/odl_registration
deleted file mode 100644
index ed49d53..0000000
--- a/src/templates/odl_registration
+++ /dev/null
@@ -1,29 +0,0 @@
-
- prefix:sal-netconf-connector
- {{ vpp_host }}
- {{ vpp_ip }}
- 2022
- {{ vpp_username }}
- {{ vpp_password }}
- false
-
- prefix:netty-event-executor
- global-event-executor
-
-
- prefix:binding-broker-osgi-registry
- binding-osgi-broker
-
-
- prefix:dom-broker-osgi-registry
- dom-broker
-
-
- prefix:netconf-client-dispatcher
- global-netconf-dispatcher
-
-
- prefix:threadpool
- global-netconf-processing-executor
-
-
diff --git a/src/test-requirements.txt b/src/test-requirements.txt
deleted file mode 100644
index f013863..0000000
--- a/src/test-requirements.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-# This file is managed centrally. If you find the need to modify this as a
-# one-off, please don't. Intead, consult #openstack-charms and ask about
-# requirements management in charms via bot-control. Thank you.
-charm-tools>=2.4.4
-coverage>=3.6
-mock>=1.2
-flake8>=2.2.4,<=2.4.1
-os-testr>=0.4.1
-requests>=2.18.4
-# BEGIN: Amulet OpenStack Charm Helper Requirements
-# Liberty client lower constraints
-amulet>=1.14.3,<2.0;python_version=='2.7'
-bundletester>=0.6.1,<1.0;python_version=='2.7'
-aodhclient>=0.1.0
-gnocchiclient>=3.1.0,<3.2.0
-python-barbicanclient>=4.0.1
-python-ceilometerclient>=1.5.0
-python-cinderclient>=1.4.0
-python-designateclient>=1.5
-python-glanceclient>=1.1.0
-python-heatclient>=0.8.0
-python-keystoneclient>=1.7.1
-python-manilaclient>=1.8.1
-python-neutronclient>=3.1.0
-python-novaclient>=2.30.1
-python-openstackclient>=1.7.0
-python-swiftclient>=2.6.0
-pika>=0.10.0,<1.0
-distro-info
-git+https://github.com/juju/charm-helpers.git#egg=charmhelpers
-# END: Amulet OpenStack Charm Helper Requirements
-pytz # workaround for 14.04 pip/tox
-pyudev # for ceph-* charm unit tests (not mocked?)
diff --git a/src/tests/README.md b/src/tests/README.md
deleted file mode 100644
index 046be7f..0000000
--- a/src/tests/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Overview
-
-This directory provides Amulet tests to verify basic deployment functionality
-from the perspective of this charm, its requirements and its features, as
-exercised in a subset of the full OpenStack deployment test bundle topology.
-
-For full details on functional testing of OpenStack charms please refer to
-the [functional testing](http://docs.openstack.org/developer/charm-guide/testing.html#functional-testing)
-section of the OpenStack Charm Guide.
diff --git a/src/tests/basic_deployment.py b/src/tests/basic_deployment.py
deleted file mode 100644
index 7802e83..0000000
--- a/src/tests/basic_deployment.py
+++ /dev/null
@@ -1,279 +0,0 @@
-#!/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.
-
-import amulet
-import os
-from neutronclient.v2_0 import client as neutronclient
-
-from charmhelpers.contrib.openstack.amulet.deployment import (
- OpenStackAmuletDeployment
-)
-
-from charmhelpers.contrib.openstack.amulet.utils import (
- OpenStackAmuletUtils,
- DEBUG,
-)
-
-# Use DEBUG to turn on debug logging
-u = OpenStackAmuletUtils(DEBUG)
-
-ODL_QUERY_PATH = '/restconf/operational/opendaylight-inventory:nodes/'
-ODL_PROFILES = {
- 'helium': {
- 'location': 'AMULET_ODL_LOCATION',
- 'profile': 'openvswitch-odl'
- },
- 'beryllium': {
- 'location': 'AMULET_ODL_BE_LOCATION',
- 'profile': 'openvswitch-odl-beryllium'
- },
-}
-
-
-class OVSODLBasicDeployment(OpenStackAmuletDeployment):
- """Amulet tests on a basic neutron-openvswitch deployment."""
-
- def __init__(self, series, openstack=None, source=None, git=False,
- stable=False, odl_version='helium'):
- """Deploy the entire test environment."""
- super(OVSODLBasicDeployment, self).__init__(series, openstack,
- source, stable)
- self.odl_version = odl_version
- self._add_services()
- self._add_relations()
- self._configure_services()
- self._deploy()
-
- u.log.info('Waiting on extended status checks...')
- # odl-controller: https://bugs.launchpad.net/bugs/1632032
- exclude_services = ['odl-controller']
- self._auto_wait_for_status(exclude_services=exclude_services)
-
- self.d.sentry.wait()
- self._initialize_tests()
-
- def _add_services(self):
- """Add services
-
- Add the services that we're testing, where openvswitch-odl is local,
- and the rest of the service are from lp branches that are
- compatible with the local charm (e.g. stable or next).
- """
- this_service = {'name': 'openvswitch-odl'}
- other_services = [
- {
- 'name': 'nova-compute',
- 'constraints': {'mem': '4G'},
- },
- {
- 'name': 'neutron-api',
- },
- {
- 'name': 'neutron-gateway',
- },
- {
- 'name': 'odl-controller',
- 'constraints': {'mem': '8G'},
- },
- {
- 'name': 'neutron-api-odl',
- },
- {'name': 'percona-cluster', 'constraints': {'mem': '3072M'}},
- {'name': 'rabbitmq-server'},
- {'name': 'keystone'},
- {'name': 'nova-cloud-controller'},
- {'name': 'glance'},
- ]
- super(OVSODLBasicDeployment, self)._add_services(this_service,
- other_services)
-
- def _add_relations(self):
- """Add all of the relations for the services."""
- relations = {
- 'neutron-api:neutron-plugin-api-subordinate':
- 'neutron-api-odl:neutron-plugin-api-subordinate',
- 'nova-compute:neutron-plugin': 'openvswitch-odl:neutron-plugin',
- 'openvswitch-odl:ovsdb-manager': 'odl-controller:ovsdb-manager',
- 'neutron-api-odl:odl-controller': 'odl-controller:controller-api',
- 'keystone:shared-db': 'percona-cluster:shared-db',
- 'nova-cloud-controller:shared-db': 'percona-cluster:shared-db',
- 'nova-cloud-controller:amqp': 'rabbitmq-server:amqp',
- 'nova-cloud-controller:image-service': 'glance:image-service',
- 'nova-cloud-controller:identity-service':
- 'keystone:identity-service',
- 'nova-compute:cloud-compute':
- 'nova-cloud-controller:cloud-compute',
- 'nova-compute:amqp': 'rabbitmq-server:amqp',
- 'nova-compute:image-service': 'glance:image-service',
- 'glance:shared-db': 'percona-cluster:shared-db',
- 'glance:identity-service': 'keystone:identity-service',
- 'glance:amqp': 'rabbitmq-server:amqp',
- 'neutron-api:shared-db': 'percona-cluster:shared-db',
- 'neutron-api:amqp': 'rabbitmq-server:amqp',
- 'neutron-api:neutron-api': 'nova-cloud-controller:neutron-api',
- 'neutron-api:identity-service': 'keystone:identity-service',
- 'neutron-gateway:amqp': 'rabbitmq-server:amqp',
- 'neutron-gateway:neutron-plugin-api':
- 'neutron-api:neutron-plugin-api',
- 'neutron-gateway:quantum-network-service':
- 'nova-cloud-controller:quantum-network-service',
- 'neutron-gateway:juju-info': 'openvswitch-odl:container',
- }
- super(OVSODLBasicDeployment, self)._add_relations(relations)
-
- def _configure_services(self):
- """Configure all of the services."""
- neutron_api = {
- 'neutron-security-groups': False,
- }
- nova_compute = {
- 'enable-live-migration': False,
- }
- keystone = {
- 'admin-password': 'openstack',
- 'admin-token': 'ubuntutesting',
- }
- pxc_config = {
- 'dataset-size': '25%',
- 'max-connections': 1000,
- 'root-password': 'ChangeMe123',
- 'sst-password': 'ChangeMe123',
- }
- odl_controller = {}
- if os.environ.get(ODL_PROFILES[self.odl_version]['location']):
- odl_controller['install-url'] = \
- os.environ.get(ODL_PROFILES[self.odl_version]['location'])
- if os.environ.get('AMULET_HTTP_PROXY'):
- odl_controller['http-proxy'] = \
- os.environ['AMULET_HTTP_PROXY']
- if os.environ.get('AMULET_HTTP_PROXY'):
- odl_controller['https-proxy'] = \
- os.environ['AMULET_HTTP_PROXY']
- odl_controller['profile'] = \
- ODL_PROFILES[self.odl_version]['profile']
- neutron_gateway = {
- 'plugin': 'ovs-odl'
- }
- neutron_api_odl = {
- 'overlay-network-type': 'vxlan gre',
- }
- nova_cc = {
- 'network-manager': 'Neutron',
- }
- configs = {
- 'neutron-api': neutron_api,
- 'nova-compute': nova_compute,
- 'keystone': keystone,
- 'percona-cluster': pxc_config,
- 'odl-controller': odl_controller,
- 'neutron-api-odl': neutron_api_odl,
- 'neutron-gateway': neutron_gateway,
- 'nova-cloud-controller': nova_cc,
- }
- super(OVSODLBasicDeployment, self)._configure_services(configs)
-
- def _initialize_tests(self):
- """Perform final initialization before tests get run."""
- # Access the sentries for inspecting service units
- self.compute_sentry = self.d.sentry['nova-compute'][0]
- self.neutron_api_sentry = self.d.sentry['neutron-api'][0]
- self.ovsodl_sentry = self.d.sentry['openvswitch-odl'][0]
- self.pxc_sentry = self.d.sentry['percona-cluster'][0]
- self.rabbitmq_server_sentry = self.d.sentry['rabbitmq-server'][0]
- self.keystone_sentry = self.d.sentry['keystone'][0]
- self.glance_sentry = self.d.sentry['glance'][0]
- self.nova_cc_sentry = self.d.sentry['nova-cloud-controller'][0]
- self.neutron_api_odl_sentry = self.d.sentry['neutron-api-odl'][0]
- self.odl_controller_sentry = self.d.sentry['odl-controller'][0]
- self.gateway_sentry = self.d.sentry['neutron-gateway'][0]
-
- self.keystone = u.authenticate_keystone_admin(self.keystone_sentry,
- user='admin',
- password='openstack',
- tenant='admin')
- ep = self.keystone.service_catalog.url_for(service_type='identity',
- interface='publicURL')
- self.neutron = neutronclient.Client(auth_url=ep,
- username='admin',
- password='openstack',
- tenant_name='admin',
- region_name='RegionOne')
-
- def test_services(self):
- """Verify the expected services are running on the corresponding
- service units."""
-
- commands = {
- self.compute_sentry: ['nova-compute',
- 'openvswitch-switch'],
- self.gateway_sentry: ['openvswitch-switch',
- 'neutron-dhcp-agent',
- 'neutron-l3-agent',
- 'neutron-metadata-agent',
- 'neutron-metering-agent',
- 'neutron-lbaas-agent',
- 'nova-api-metadata'],
- self.odl_controller_sentry: ['odl-controller'],
- }
-
- if self._get_openstack_release() >= self.xenial_newton:
- commands[self.gateway_sentry].remove('neutron-lbaas-agent')
- commands[self.gateway_sentry].append('neutron-lbaasv2-agent')
-
- ret = u.validate_services_by_name(commands)
- if ret:
- amulet.raise_status(amulet.FAIL, msg=ret)
-
- def test_gateway_bridges(self):
- """Ensure that all bridges are present and configured with the
- ODL controller as their NorthBound controller URL."""
- odl_ip = self.odl_controller_sentry.relation(
- 'ovsdb-manager',
- 'openvswitch-odl:ovsdb-manager'
- )['private-address']
- # NOTE: 6633 is legacy 6653 is IANA assigned
- if self.odl_version == 'helium':
- controller_url = "tcp:{}:6633".format(odl_ip)
- check_bridges = ['br-int', 'br-ex', 'br-data']
- else:
- controller_url = "tcp:{}:6653".format(odl_ip)
- # NOTE: later ODL releases only manage br-int
- check_bridges = ['br-int']
- cmd = 'ovs-vsctl list-br'
- output, _ = self.gateway_sentry.run(cmd)
- bridges = output.split()
- for bridge in check_bridges:
- if bridge not in bridges:
- amulet.raise_status(
- amulet.FAIL,
- msg="Missing bridge {} from gateway unit".format(bridge)
- )
- cmd = 'ovs-vsctl get-controller {}'.format(bridge)
- br_controllers, _ = self.gateway_sentry.run(cmd)
- # Beware of duplicate entries:
- # https://bugs.opendaylight.org/show_bug.cgi?id=960
- br_controllers = list(set(br_controllers.split('\n')))
- if len(br_controllers) != 1 or br_controllers[0] != controller_url:
- status, _ = self.gateway_sentry.run('ovs-vsctl show')
- amulet.raise_status(
- amulet.FAIL,
- msg="Controller configuration on bridge"
- " {} incorrect: {} != {}\n"
- "{}".format(bridge,
- br_controllers,
- controller_url,
- status)
- )
diff --git a/src/tests/dev-basic-bionic-queens b/src/tests/dev-basic-bionic-queens
deleted file mode 100755
index 2ecb8ca..0000000
--- a/src/tests/dev-basic-bionic-queens
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/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 openvswitch ODL deployment on bionic-queens."""
-
-from basic_deployment import OVSODLBasicDeployment
-
-if __name__ == '__main__':
- deployment = OVSODLBasicDeployment(series='bionic',
- odl_version='beryllium')
- deployment.run_tests()
diff --git a/src/tests/dev-basic-xenial-queens b/src/tests/dev-basic-xenial-queens
deleted file mode 100755
index 320b5c3..0000000
--- a/src/tests/dev-basic-xenial-queens
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/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 openvswitch ODL deployment on xenial-queens."""
-
-from basic_deployment import OVSODLBasicDeployment
-
-if __name__ == '__main__':
- deployment = OVSODLBasicDeployment(series='xenial',
- openstack='cloud:xenial-queens',
- source='cloud:xenial-updates/queens',
- odl_version='beryllium')
- deployment.run_tests()
diff --git a/src/tests/gate-basic-trusty-icehouse b/src/tests/gate-basic-trusty-icehouse
deleted file mode 100755
index aa94421..0000000
--- a/src/tests/gate-basic-trusty-icehouse
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/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 openvswitch ODL deployment on trusty-icehouse."""
-
-from basic_deployment import OVSODLBasicDeployment
-
-if __name__ == '__main__':
- deployment = OVSODLBasicDeployment(series='trusty')
- deployment.run_tests()
diff --git a/src/tests/gate-basic-trusty-mitaka b/src/tests/gate-basic-trusty-mitaka
deleted file mode 100755
index d10b822..0000000
--- a/src/tests/gate-basic-trusty-mitaka
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/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 openvswitch ODL deployment on trusty-mitaka."""
-
-from basic_deployment import OVSODLBasicDeployment
-
-if __name__ == '__main__':
- deployment = OVSODLBasicDeployment(series='trusty',
- openstack='cloud:trusty-mitaka',
- source='cloud:trusty-updates/mitaka')
- deployment.run_tests()
diff --git a/src/tests/gate-basic-xenial-mitaka b/src/tests/gate-basic-xenial-mitaka
deleted file mode 100755
index d53c620..0000000
--- a/src/tests/gate-basic-xenial-mitaka
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/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 openvswitch ODL deployment on xenial-mitaka."""
-
-from basic_deployment import OVSODLBasicDeployment
-
-if __name__ == '__main__':
- deployment = OVSODLBasicDeployment(series='xenial',
- odl_version='beryllium')
- deployment.run_tests()
diff --git a/src/tests/gate-basic-xenial-ocata b/src/tests/gate-basic-xenial-ocata
deleted file mode 100755
index 34a2e72..0000000
--- a/src/tests/gate-basic-xenial-ocata
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/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 openvswitch ODL deployment on xenial-ocata."""
-
-from basic_deployment import OVSODLBasicDeployment
-
-if __name__ == '__main__':
- deployment = OVSODLBasicDeployment(series='xenial',
- openstack='cloud:xenial-ocata',
- source='cloud:xenial-updates/ocata',
- odl_version='beryllium')
- deployment.run_tests()
diff --git a/src/tests/gate-basic-xenial-pike b/src/tests/gate-basic-xenial-pike
deleted file mode 100644
index 79787b1..0000000
--- a/src/tests/gate-basic-xenial-pike
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/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 openvswitch ODL deployment on xenial-pike."""
-
-from basic_deployment import OVSODLBasicDeployment
-
-if __name__ == '__main__':
- deployment = OVSODLBasicDeployment(series='xenial',
- openstack='cloud:xenial-pike',
- source='cloud:xenial-updates/pike',
- odl_version='beryllium')
- deployment.run_tests()
diff --git a/src/tests/tests.yaml b/src/tests/tests.yaml
deleted file mode 100644
index a03e7ba..0000000
--- a/src/tests/tests.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-# Bootstrap the model if necessary.
-bootstrap: True
-# Re-use bootstrap node.
-reset: True
-# Use tox/requirements to drive the venv instead of bundletester's venv feature.
-virtualenv: False
-# Leave makefile empty, otherwise unit/lint tests will rerun ahead of amulet.
-makefile: []
-# Do not specify juju PPA sources. Juju is presumed to be pre-installed
-# and configured in all test runner environments.
-#sources:
-# Do not specify or rely on system packages.
-#packages:
-# Do not specify python packages here. Use test-requirements.txt
-# and tox instead. ie. The venv is constructed before bundletester
-# is invoked.
-#python-packages:
-reset_timeout: 600
diff --git a/src/tox.ini b/src/tox.ini
deleted file mode 100644
index f3e386e..0000000
--- a/src/tox.ini
+++ /dev/null
@@ -1,53 +0,0 @@
-# Source charm: ./src/tox.ini
-# This file is managed centrally by release-tools and should not be modified
-# within individual charm repos.
-[tox]
-envlist = pep8
-skipsdist = True
-
-[testenv]
-setenv = VIRTUAL_ENV={envdir}
- PYTHONHASHSEED=0
- AMULET_SETUP_TIMEOUT=5400
-whitelist_externals = juju
-passenv = HOME TERM AMULET_* CS_*
-deps = -r{toxinidir}/test-requirements.txt
-install_command =
- pip install {opts} {packages}
-
-[testenv:pep8]
-basepython = python2.7
-commands = charm-proof
-
-[testenv:func27-noop]
-# DRY RUN - For Debug
-basepython = python2.7
-commands =
- bundletester -vl DEBUG -r json -o func-results.json --test-pattern "gate-*" -n --no-destroy
-
-[testenv:func27]
-# Run all gate tests which are +x (expected to always pass)
-basepython = python2.7
-commands =
- bundletester -vl DEBUG -r json -o func-results.json --test-pattern "gate-*" --no-destroy
-
-[testenv:func27-smoke]
-# Run a specific test as an Amulet smoke test (expected to always pass)
-basepython = python2.7
-commands =
- bundletester -vl DEBUG -r json -o func-results.json gate-basic-xenial-mitaka --no-destroy
-
-[testenv:func27-dfs]
-# Run all deploy-from-source tests which are +x (may not always pass!)
-basepython = python2.7
-commands =
- bundletester -vl DEBUG -r json -o func-results.json --test-pattern "dfs-*" --no-destroy
-
-[testenv:func27-dev]
-# Run all development test targets which are +x (may not always pass!)
-basepython = python2.7
-commands =
- bundletester -vl DEBUG -r json -o func-results.json --test-pattern "dev-*" --no-destroy
-
-[testenv:venv]
-commands = {posargs}
diff --git a/test-requirements.txt b/test-requirements.txt
deleted file mode 100644
index ca62003..0000000
--- a/test-requirements.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is managed centrally. If you find the need to modify this as a
-# one-off, please don't. Intead, consult #openstack-charms and ask about
-# requirements management in charms via bot-control. Thank you.
-#
-# Lint and unit test requirements
-flake8>=2.2.4,<=2.4.1
-os-testr>=0.4.1
-requests>=2.18.4
-charms.reactive
-mock>=1.2
-nose>=1.3.7
-coverage>=3.6
-git+https://github.com/openstack/charms.openstack.git#egg=charms.openstack
diff --git a/tox.ini b/tox.ini
deleted file mode 100644
index 1dabd86..0000000
--- a/tox.ini
+++ /dev/null
@@ -1,56 +0,0 @@
-# Source charm: ./tox.ini
-# This file is managed centrally by release-tools and should not be modified
-# within individual charm repos.
-[tox]
-skipsdist = True
-envlist = pep8,py34,py35
-skip_missing_interpreters = True
-
-[testenv]
-setenv = VIRTUAL_ENV={envdir}
- PYTHONHASHSEED=0
- TERM=linux
- LAYER_PATH={toxinidir}/layers
- INTERFACE_PATH={toxinidir}/interfaces
- JUJU_REPOSITORY={toxinidir}/build
-passenv = http_proxy https_proxy
-install_command =
- pip install {opts} {packages}
-deps =
- -r{toxinidir}/requirements.txt
-
-[testenv:build]
-basepython = python2.7
-commands =
- charm-build --log-level DEBUG -o {toxinidir}/build src {posargs}
-
-[testenv:py27]
-basepython = python2.7
-# Reactive source charms are Python3-only, but a py27 unit test target
-# is required by OpenStack Governance. Remove this shim as soon as
-# permitted. https://governance.openstack.org/tc/reference/cti/python_cti.html
-whitelist_externals = true
-commands = true
-
-[testenv:py34]
-basepython = python3.4
-deps = -r{toxinidir}/test-requirements.txt
-commands = ostestr {posargs}
-
-[testenv:py35]
-basepython = python3.5
-deps = -r{toxinidir}/test-requirements.txt
-commands = ostestr {posargs}
-
-[testenv:pep8]
-basepython = python3.5
-deps = -r{toxinidir}/test-requirements.txt
-commands = flake8 {posargs} src unit_tests
-
-[testenv:venv]
-basepython = python3
-commands = {posargs}
-
-[flake8]
-# E402 ignore necessary for path append before sys module import in actions
-ignore = E402
diff --git a/unit_tests/__init__.py b/unit_tests/__init__.py
deleted file mode 100644
index a95cae2..0000000
--- a/unit_tests/__init__.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# 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.
-
-import sys
-
-sys.path.append('src')
-sys.path.append('src/lib')
-
-# Mock out charmhelpers so that we can test without it.
-import charms_openstack.test_mocks # noqa
-charms_openstack.test_mocks.mock_charmhelpers()
-sys.modules['charmhelpers.core.decorators'] = (
- charms_openstack.test_mocks.charmhelpers.core.decorators)
diff --git a/unit_tests/test_lib_charm_openstack_openvswitch_odl.py b/unit_tests/test_lib_charm_openstack_openvswitch_odl.py
deleted file mode 100644
index 8e2ce4d..0000000
--- a/unit_tests/test_lib_charm_openstack_openvswitch_odl.py
+++ /dev/null
@@ -1,168 +0,0 @@
-# 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.
-
-from __future__ import absolute_import
-from __future__ import print_function
-
-import unittest
-
-import mock
-
-import charm.openstack.openvswitch_odl as openvswitch_odl
-
-CONN_STRING = 'tcp:odl-controller:6640'
-LOCALHOST = '10.1.1.1'
-
-
-class Helper(unittest.TestCase):
-
- def setUp(self):
- self._patches = {}
- self._patches_start = {}
-
- def tearDown(self):
- for k, v in self._patches.items():
- v.stop()
- setattr(self, k, None)
- self._patches = None
- self._patches_start = None
-
- def patch(self, obj, attr, return_value=None, **kwargs):
- mocked = mock.patch.object(obj, attr, **kwargs)
- self._patches[attr] = mocked
- started = mocked.start()
- started.return_value = return_value
- self._patches_start[attr] = started
- setattr(self, attr, started)
-
-
-class TestOpenStackOVSODLCharm(Helper):
-
- def test_configure_openvswitch(self):
- odl_ovsdb = mock.MagicMock()
- self.patch(openvswitch_odl.ch_ip, 'get_address_in_network')
- self.patch(openvswitch_odl.hookenv, 'log')
- self.patch(openvswitch_odl.hookenv, 'status_set')
- self.patch(openvswitch_odl.hookenv, 'unit_private_ip')
- self.patch(openvswitch_odl.ovs, 'set_config')
- self.patch(openvswitch_odl.ovs, 'set_manager')
- self.patch(openvswitch_odl.socket, 'gethostname')
- self.gethostname.return_value = 'ovs-host'
- self.unit_private_ip.return_value = LOCALHOST
- self.get_address_in_network.return_value = LOCALHOST
- odl_ovsdb.connection_string.return_value = CONN_STRING
- odl_ovsdb.private_address.return_value = 'odl-controller'
- a = openvswitch_odl.OVSODLCharm()
- a.configure_openvswitch(odl_ovsdb)
- self.set_manager.assert_called_with(CONN_STRING)
- self.set_config.assert_has_calls([
- mock.call('local_ip', '10.1.1.1'),
- mock.call('controller-ips', 'odl-controller',
- table='external_ids'),
- mock.call('host-id', 'ovs-host',
- table='external_ids'),
- ])
- self.get_address_in_network.assert_called_with(mock.ANY, '10.1.1.1')
- self.status_set.assert_called_with('active',
- 'Unit is ready')
-
- def test_unconfigure_openvswitch(self):
- odl_ovsdb = mock.MagicMock()
- self.patch(openvswitch_odl.hookenv, 'log')
- self.patch(openvswitch_odl.hookenv, 'status_set')
- self.patch(openvswitch_odl.subprocess, 'check_call')
- self.patch(openvswitch_odl.subprocess, 'check_output')
- self.check_output.return_value = "br-data\nbr-ex\nbr-int\n"
- a = openvswitch_odl.OVSODLCharm()
- a.unconfigure_openvswitch(odl_ovsdb)
- check_call_calls = [
- mock.call(['ovs-vsctl', 'del-manager']),
- mock.call(['ovs-vsctl', 'del-controller', 'br-data']),
- mock.call(['ovs-vsctl', 'del-controller', 'br-ex']),
- mock.call(['ovs-vsctl', 'del-controller', 'br-int'])]
- self.check_call.assert_has_calls(check_call_calls)
- self.check_output.assert_called_once_with(['ovs-vsctl', 'list-br'])
- self.status_set.assert_called
-
- def test_configure_neutron_plugin(self):
- neutron_plugin = mock.MagicMock()
- a = openvswitch_odl.OVSODLCharm()
- a.configure_neutron_plugin(neutron_plugin)
- neutron_plugin.configure_plugin.assert_called_with(
- plugin='ovs-odl',
- config={
- "nova-compute": {
- "/etc/nova/nova.conf": {
- "sections": {
- 'DEFAULT': [
- ('firewall_driver',
- 'nova.virt.firewall.NoopFirewallDriver'),
- ('libvirt_vif_driver',
- 'nova.virt.libvirt.vif.'
- 'LibvirtGenericVIFDriver'),
- ('security_group_api', 'neutron'),
- ],
- }
- }
- }
- }
- )
-
- def test_odl_node_registration(self):
- controller = mock.MagicMock()
- odl = mock.MagicMock()
- self.patch(openvswitch_odl.socket, 'gethostname')
- self.patch(openvswitch_odl.odl, 'ODLConfig')
- self.patch(openvswitch_odl.ch_ip, 'get_address_in_network')
- self.patch(openvswitch_odl.hookenv, 'log')
- self.patch(openvswitch_odl.hookenv, 'unit_private_ip')
- self.gethostname.return_value = 'ovs-host'
- self.unit_private_ip.return_value = LOCALHOST
- self.get_address_in_network.return_value = LOCALHOST
- self.ODLConfig.return_value = odl
- odl.is_device_registered.return_value = False
- a = openvswitch_odl.OVSODLCharm()
- a.odl_node_registration(controller)
- self.get_address_in_network.assert_called_once_with(mock.ANY,
- '10.1.1.1')
- odl.odl_register_node.assert_called_once_with('ovs-host', '10.1.1.1')
-
- def test_odl_node_registration_already_registered(self):
- controller = mock.MagicMock()
- odl = mock.MagicMock()
- self.patch(openvswitch_odl.socket, 'gethostname')
- self.patch(openvswitch_odl.odl, 'ODLConfig')
- self.ODLConfig.return_value = odl
- odl.is_device_registered.return_value = True
- a = openvswitch_odl.OVSODLCharm()
- a.odl_node_registration(controller)
- self.assertFalse(odl.odl_register_node.called)
-
- def test_odl_register_macs(self):
- controller = mock.MagicMock()
- odl = mock.MagicMock()
- odl.is_net_device_registered.return_value = False
- self.patch(openvswitch_odl.socket, 'gethostname')
- self.patch(openvswitch_odl.odl, 'ODLConfig')
- self.patch(openvswitch_odl.pci, 'PCIInfo')
- self.ODLConfig.return_value = odl
- self.gethostname.return_value = 'ovs-host'
- self.PCIInfo.return_value = {
- 'local_config': {
- 'mac1': [
- {'net': 'net1', 'interface': 'eth1'}]}}
- a = openvswitch_odl.OVSODLCharm()
- a.odl_register_macs(controller)
- odl.odl_register_macs.assert_called_once_with(
- 'ovs-host', 'net1', 'eth1', 'mac1', device_type='ovs')
diff --git a/unit_tests/test_openvswitch_odl_handlers.py b/unit_tests/test_openvswitch_odl_handlers.py
deleted file mode 100644
index 9cbae8f..0000000
--- a/unit_tests/test_openvswitch_odl_handlers.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# 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.
-
-from __future__ import absolute_import
-from __future__ import print_function
-
-import mock
-
-import reactive.openvswitch_odl_handlers as handlers
-
-import charms_openstack.test_utils as test_utils
-
-
-class TestRegisteredHooks(test_utils.TestRegisteredHooks):
-
- def test_hooks(self):
- defaults = [
- 'charm.installed',
- 'config.changed',
- 'update-status']
- hook_set = {
- 'when': {
- 'configure_openvswitch': (
- 'charm.installed',
- 'ovsdb-manager.access.available',),
- 'unconfigure_openvswitch': (
- 'ovs.configured',),
- 'configure_neutron_plugin': (
- 'neutron-plugin.connected',),
- 'odl_node_registration': (
- 'controller-api.access.available',),
- 'odl_mac_registration': (
- 'controller-api.access.available',),
- },
- 'when_not': {
- 'unconfigure_openvswitch': (
- 'ovsdb-manager.access.available',),
- }
- }
- # test that the hooks were registered via the
- # reactive.barbican_handlers
- self.registered_hooks_test_helper(handlers, hook_set, defaults)
-
-
-class TestConfigureOpenvswitch(test_utils.PatchHelper):
-
- def test_configure_openvswitch(self):
- ovs_odl_charm = mock.MagicMock()
- self.patch_object(handlers.reactive, 'set_state')
- self.patch_object(handlers.charm, 'provide_charm_instance',
- new=mock.MagicMock())
- self.provide_charm_instance().__enter__.return_value = ovs_odl_charm
- self.provide_charm_instance().__exit__.return_value = None
-
- handlers.configure_openvswitch('arg1')
- ovs_odl_charm.configure_openvswitch.assert_called_once_with(('arg1'))
- self.set_state.assert_called_once_with('ovs.configured')
-
- def test_unconfigure_openvswitch(self):
- ovs_odl_charm = mock.MagicMock()
- self.patch_object(handlers.reactive, 'remove_state')
- self.patch_object(handlers.charm, 'provide_charm_instance',
- new=mock.MagicMock())
- self.provide_charm_instance().__enter__.return_value = ovs_odl_charm
- self.provide_charm_instance().__exit__.return_value = None
-
- handlers.unconfigure_openvswitch()
- ovs_odl_charm.unconfigure_openvswitch.assert_called_once_with(None)
- self.remove_state.assert_called_once_with('ovs.configured')
-
- def test_configure_neutron_plugin(self):
- ovs_odl_charm = mock.MagicMock()
- self.patch_object(handlers.charm, 'provide_charm_instance',
- new=mock.MagicMock())
- self.provide_charm_instance().__enter__.return_value = ovs_odl_charm
- self.provide_charm_instance().__exit__.return_value = None
-
- handlers.configure_neutron_plugin('arg1')
- ovs_odl_charm.configure_neutron_plugin.assert_called_once_with(
- ('arg1'))
-
- def test_odl_node_registration(self):
- ovs_odl_charm = mock.MagicMock()
- self.patch_object(handlers.charm, 'provide_charm_instance',
- new=mock.MagicMock())
- self.provide_charm_instance().__enter__.return_value = ovs_odl_charm
- self.provide_charm_instance().__exit__.return_value = None
-
- handlers.odl_node_registration('arg1')
- ovs_odl_charm.register_node.assert_called_once_with(('arg1'))
-
- def test_odl_mac_registration(self):
- ovs_odl_charm = mock.MagicMock()
- self.patch_object(handlers.charm, 'provide_charm_instance',
- new=mock.MagicMock())
- self.provide_charm_instance().__enter__.return_value = ovs_odl_charm
- self.provide_charm_instance().__exit__.return_value = None
-
- handlers.odl_mac_registration('arg1')
- ovs_odl_charm.register_macs.assert_called_once_with(('arg1'))