diff --git a/.stestr.conf b/.stestr.conf deleted file mode 100644 index 5fcccac..0000000 --- a/.stestr.conf +++ /dev/null @@ -1,3 +0,0 @@ -[DEFAULT] -test_path=./unit_tests -top_dir=./ diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 075be87..0000000 --- a/.travis.yml +++ /dev/null @@ -1,36 +0,0 @@ -sudo: true -dist: xenial -language: python -install: - - pip install tox-travis -matrix: - include: - - name: "Python 3.6" - python: 3.6 - env: ENV=pep8,py3 - - name: "Python 3.7" - python: 3.7 - env: ENV=pep8,py3 - - name: "Functional test" - env: ENV=func-smoke -script: - - if [ $ENV = 'func-smoke' ]; then - sudo apt update; - sudo apt install -y distro-info; - sudo apt remove -y --purge lxd lxd-client; - sudo snap install lxd; - sudo snap install juju --classic; - sudo sh -c 'echo PATH=/snap/bin:$PATH >> /etc/environment'; - sudo lxd waitready; - sudo lxd init --auto; - sudo usermod -a -G lxd travis; - sudo su travis -c 'juju bootstrap --no-gui localhost'; - echo "export PATH=$PATH;cd $(pwd)" > $HOME/saved_path; - sudo su - travis -c "source $HOME/saved_path; tox -e build"; - sudo su - travis -c "source $HOME/saved_path; tox -c build/builds/ovn-chassis/tox.ini -e $ENV -- --log DEBUG"; - else - tox -c tox.ini -e $ENV; - fi - - if [ $ENV = 'func-smoke' ]; then - sudo su travis -c 'juju status -m $(juju models --format yaml|grep "^- name:.*zaza"|cut -f2 -d/)'; - fi diff --git a/.zuul.yaml b/.zuul.yaml index 671f058..af4b7f3 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -1,9 +1,3 @@ - project: templates: - openstack-python3-charm-jobs - - openstack-cover-jobs - check: - jobs: - - charmbuild - vars: - charm_build_name: ovn-chassis diff --git a/README.md b/README.md deleted file mode 120000 index 351df1d..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -src/README.md \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..c71d1fd --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# Repository archived + +Development of the `ovn-chassis` charm has been moved to GitHub under +[canonical/charm-ovn-chassis](https://github.com/canonical/charm-ovn-chassis). +Content of stable branches will remain preserved here as well, but new development +is expected to happen on GitHub. diff --git a/bindep.txt b/bindep.txt deleted file mode 100644 index 17575d9..0000000 --- a/bindep.txt +++ /dev/null @@ -1,4 +0,0 @@ -libffi-dev [platform:dpkg] -libpq-dev [platform:dpkg] -libxml2-dev [platform:dpkg] -libxslt1-dev [platform:dpkg] diff --git a/charmcraft.yaml b/charmcraft.yaml deleted file mode 100644 index 7e94a77..0000000 --- a/charmcraft.yaml +++ /dev/null @@ -1,44 +0,0 @@ -type: charm - -parts: - charm: - source: src/ - plugin: reactive - reactive-charm-build-arguments: - - --binary-wheels-from-source - - -v - build-packages: - - git - - python3-dev - - libffi-dev - - libssl-dev - - rustc-1.78 - - cargo-1.78 - - pkg-config - override-build: | - # Note(mylesjp): Force build to use rustc-1.78 - ln -s /usr/bin/rustc-1.78 /usr/bin/rustc - ln -s /usr/bin/cargo-1.78 /usr/bin/cargo - craftctl default - build-snaps: - - charm/latest/edge - build-environment: - - CHARM_INTERFACES_DIR: $CRAFT_PROJECT_DIR/interfaces/ - - CHARM_LAYERS_DIR: $CRAFT_PROJECT_DIR/layers/ - - MAKEFLAGS: -j$(nproc) - - CARGO_HTTP_MULTIPLEXING: 'false' - -base: ubuntu@24.04 -platforms: - amd64: - build-on: amd64 - build-for: amd64 - arm64: - build-on: arm64 - build-for: arm64 - ppc64el: - build-on: ppc64el - build-for: ppc64el - s390x: - build-on: s390x - build-for: s390x diff --git a/metadata.yaml b/metadata.yaml deleted file mode 120000 index 0768683..0000000 --- a/metadata.yaml +++ /dev/null @@ -1 +0,0 @@ -src/metadata.yaml \ No newline at end of file diff --git a/osci.yaml b/osci.yaml deleted file mode 100644 index 0fc38fe..0000000 --- a/osci.yaml +++ /dev/null @@ -1,9 +0,0 @@ -- project: - templates: - - charm-unit-jobs-py310 - - charm-functional-jobs - vars: - needs_charm_build: true - charm_build_name: ovn-chassis - build_type: charmcraft - charmcraft_channel: 3.x/beta diff --git a/rebuild b/rebuild deleted file mode 100644 index 73d2d10..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 -03a68f9b-170c-497b-9f22-87a0e90a2d7b diff --git a/rename.sh b/rename.sh deleted file mode 100755 index d0c35c9..0000000 --- a/rename.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -charm=$(grep "charm_build_name" osci.yaml | awk '{print $2}') -echo "renaming ${charm}_*.charm to ${charm}.charm" -echo -n "pwd: " -pwd -ls -al -echo "Removing bad downloaded charm maybe?" -if [[ -e "${charm}.charm" ]]; -then - rm "${charm}.charm" -fi -echo "Renaming charm here." -mv ${charm}_*.charm ${charm}.charm diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 218e4a8..0000000 --- a/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -# This file is managed centrally by release-tools and should not be modified -# within individual charm repos. See the 'global' dir contents for available -# choices of *requirements.txt files for OpenStack Charms: -# https://github.com/openstack-charmers/release-tools -# - -git+https://github.com/juju/charm-tools.git - -simplejson diff --git a/src/README.md b/src/README.md deleted file mode 100644 index 08ad16b..0000000 --- a/src/README.md +++ /dev/null @@ -1,126 +0,0 @@ -# Overview - -The ovn-chassis charm provides the Open Virtual Network (OVN) local controller, -Open vSwitch Database and Switch. It is used in conjunction with the -[ovn-central][ovn-central-charm] charm. - -Open vSwitch bridges for integration, external Layer2 and Layer3 connectivity -is managed by the charm. - -On successful deployment the unit will be enlisted as a Chassis in the OVN -network. - -The ovn-chassis charm is a subordinate charm. Alternatively, the principle -[ovn-dedicated-chassis][ovn-dedicated-chassis-charm] charm can be used, -resulting in a dedicated software gateway. - -> **Note**: The OVN charms are supported starting with OpenStack Train. - -# Usage - -The [OpenStack Base bundle][openstack-base-bundle] gives an example of how you -can deploy OpenStack and OVN with [Vault][vault-charm] to automate certificate -lifecycle management. - -OVN makes use of Public Key Infrastructure (PKI) to authenticate and authorize -control plane communication. The charm therefore requires a Certificate -Authority to be present in the model as represented by the `certificates` -relation. - -Refer to [Open Virtual Network (OVN)][cdg-ovn] in the [OpenStack Charms -Deployment Guide][cdg] for details, including deployment steps. - -## OpenStack support - -When related to the [nova-compute][nova-compute-charm] charm the ovn-chassis -charm will enable services that provide [Nova metadata][nova-metadata] to -instances. - -## DPDK, SR-IOV and hardware offload support - -It is possible to configure chassis to prepare network interface cards (NICs) -for use with DPDK, SR-IOV and hardware offload support. - -Please refer to the [OVN Configuration][cdg-ovn-cfg] in the [OpenStack Charms Deployment -Guide][cdg] for details. - -## Network spaces - -This charm supports the use of Juju network spaces. - -By binding the `ovsdb` endpoint you can influence which interface will be used -for communication with the OVN Southbound DB as well as overlay traffic. - - juju deploy ovn-chassis --bind "ovsdb=internal-space" - -By binding the `data` extra-binding you can influence which interface will be -used for overlay traffic. - - juju deploy ovn-chassis --bind "data=overlay-space" - -## Port configuration - -Chassis port configuration is composed of a mapping between physical network -names to bridge names (`ovn-bridge-mappings`) and individual interface to -bridge names (`bridge-interface-mappings`). There must be a match in both -configuration options before the charm will configure bridge and interfaces on -a unit. - -The physical network name can be referenced when the administrator programs the -OVN logical flows, either by talking directly to the Northbound database, or by -interfacing with a Cloud Management System (CMS). - -Networks for use with external Layer3 connectivity should have mappings on -chassis located in the vicinity of the datacenter border gateways. Having two -or more chassis with mappings for a Layer3 network will have OVN automatically -configure highly available routers with liveness detection provided by the -Bidirectional Forwarding Detection (BFD) protocol. - -Chassis without direct external mapping to a external Layer3 network will -forward traffic through a tunnel to one of the chassis acting as a gateway for -that network. - -> **Note**: It is not necessary, nor recommended, to add mapping for external - Layer3 networks to all chassis. Doing so will create a scaling problem at the - physical network layer that needs to be resolved with globally shared Layer2 - (does not scale) or tunneling at the top-of-rack switch layer (adds - complexity) and is generally not a recommended configuration. - -Networks for use with external Layer2 connectivity should have mappings present -on all chassis with potential to host the consuming payload. - -## Deferred service events - -Operational or maintenance procedures applied to a cloud often lead to the -restarting of various OpenStack services and/or the calling of certain charm -hooks. Although normal, such events can be undesirable due to the service -interruptions they can cause. - -The deferred service events feature provides the operator the choice of -preventing these service restarts and hook calls from occurring, which can then -be resolved at a more opportune time. - -See the [Deferred service events][cdg-deferred-service-events] page in the -[OpenStack Charms Deployment Guide][cdg] for an in-depth treatment of this -feature. - -# Bugs - -Please report bugs on [Launchpad][lp-ovn-chassis]. - -For general questions please refer to the [OpenStack Charm Guide][cg]. - - - -[cg]: https://docs.openstack.org/charm-guide/latest/ -[cdg]: https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/latest/ -[cdg-ovn]: https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/latest/app-ovn.html -[cdg-ovn-cfg]: https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/latest/app-ovn.html#configuration -[nova-compute-charm]: https://jaas.ai/nova-compute -[vault-charm]: https://jaas.ai/vault/ -[ovn-central-charm]: https://jaas.ai/ovn-central -[ovn-dedicated-chassis-charm]: https://jaas.ai/ovn-dedicated-chassis -[lp-ovn-chassis]: https://bugs.launchpad.net/charm-ovn-chassis/+filebug -[openstack-base-bundle]: https://github.com/openstack-charmers/openstack-bundles/blob/master/development/openstack-base-focal-ussuri-ovn/bundle.yaml -[nova-metadata]: https://docs.openstack.org/nova/latest/user/metadata.html -[cdg-deferred-service-events]: https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/latest/deferred-events.html diff --git a/src/actions.yaml b/src/actions.yaml deleted file mode 100644 index 54c58d7..0000000 --- a/src/actions.yaml +++ /dev/null @@ -1,27 +0,0 @@ -restart-services: - description: | - Restarts services this charm manages. - params: - deferred-only: - type: boolean - default: false - description: | - Restart all deferred services. - services: - type: string - default: "" - description: | - List of services to restart. - run-hooks: - type: boolean - default: true - description: | - Run any hooks which have been deferred. -run-deferred-hooks: - description: | - Run deferable hooks and restart services. - . - NOTE: Service will be restarted as needed irrespective of enable-auto-restarts -show-deferred-events: - descrpition: | - Show the outstanding restarts diff --git a/src/actions/restart-services b/src/actions/restart-services deleted file mode 120000 index 463fc1f..0000000 --- a/src/actions/restart-services +++ /dev/null @@ -1 +0,0 @@ -restart_services.py \ No newline at end of file diff --git a/src/actions/restart_services.py b/src/actions/restart_services.py deleted file mode 100755 index d0f0240..0000000 --- a/src/actions/restart_services.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 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 datetime -import sys - - -sys.path.append('actions') -sys.path.append('lib') - -from charms.layer import basic -basic.bootstrap_charm_deps() - -import charmhelpers.contrib.openstack.deferred_events as deferred_events -import charmhelpers.contrib.openstack.utils as os_utils -import charmhelpers.core.hookenv as hookenv -import charms_openstack.charm - -import os_deferred_event_actions - -charms_openstack.bus.discover() - - -def restart_services(args): - """Restart services. - - :param args: Unused - :type args: List[str] - """ - deferred_only = hookenv.action_get("deferred-only") - services = hookenv.action_get("services").split() - os_deferred_event_actions.restart_services(args) - # Clear deferred stops. If the services start time is after the - # requested stop time we can infer the stop has happened. This is - # to work around Bug #2012553 - deferred_stops = [ - e - for e in deferred_events.get_deferred_events() - if e.action == 'stop'] - for event in deferred_stops: - start_time = deferred_events.get_service_start_time(event.service) - deferred_stop_time = datetime.datetime.fromtimestamp( - event.timestamp) - if start_time > deferred_stop_time: - deferred_events.clear_deferred_events([event.service], 'stop') - else: - if deferred_only or event.service in services: - os_utils.restart_services_action([event.service]) - deferred_events.clear_deferred_events([event.service], 'stop') - with charms_openstack.charm.provide_charm_instance() as charm_instance: - charm_instance._assess_status() - - -def main(args): - hookenv._run_atstart() - try: - restart_services(args) - except Exception as e: - hookenv.action_fail(str(e)) - hookenv._run_atexit() - - -if __name__ == "__main__": - sys.exit(main(sys.argv)) diff --git a/src/actions/run-deferred-hooks b/src/actions/run-deferred-hooks deleted file mode 100755 index 09e534c..0000000 --- a/src/actions/run-deferred-hooks +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 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('actions') - - -import os_deferred_event_actions - - -if __name__ == "__main__": - sys.exit(os_deferred_event_actions.main(sys.argv)) diff --git a/src/actions/show-deferred-events b/src/actions/show-deferred-events deleted file mode 100755 index 09e534c..0000000 --- a/src/actions/show-deferred-events +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 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('actions') - - -import os_deferred_event_actions - - -if __name__ == "__main__": - sys.exit(os_deferred_event_actions.main(sys.argv)) diff --git a/src/config.yaml b/src/config.yaml deleted file mode 100644 index 9f2671c..0000000 --- a/src/config.yaml +++ /dev/null @@ -1,23 +0,0 @@ -options: - openstack-metadata-workers: - type: int - default: 2 - description: | - When charm is related to OpenStack through the `nova-compute` relation - endpoint, the Neutron OVN Metadata service will be activated on the host. - . - Use this configuration option to control the number of workers the - Neutron OVN Metadata service should run. - . - Each of the workers will establish a connection to the OVN Southbound - database. Events the worker respond to is for example the first time - a hypervisor hosts an instance in a subnet, so the volume should be - relatively low. If you set this number too high you may put an - unnecessary toll on the OVN Southbound database server. - enable-auto-restarts: - type: boolean - default: True - description: | - Allow the charm and packages to restart services automatically when - required. - diff --git a/src/files/.gitkeep b/src/files/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/files/nagios/nrpe_check_ovn_certs.py b/src/files/nagios/nrpe_check_ovn_certs.py deleted file mode 100755 index d22fb96..0000000 --- a/src/files/nagios/nrpe_check_ovn_certs.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (C) 2023 Canonical -# -# 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 json -import os -import sys -from datetime import datetime, timedelta - -NAGIOS_PLUGIN_DATA = '/usr/local/lib/nagios/juju_charm_plugin_data' - -WARN = 1 -SUCCESS = 0 - - -if __name__ == "__main__": - output_path = os.path.join(NAGIOS_PLUGIN_DATA, 'ovn_cert_status.json') - if os.path.exists(output_path): - with open(output_path) as fd: - try: - status = json.loads(fd.read()) - ts = datetime.strptime(status['last_updated'], - "%Y-%m-%d %H:%M:%S") - if datetime.now() - ts > timedelta(days=1): - print("ovn cert check status is more than 24 hours old " - "(last_updated={})".format(status['last_updated'])) - sys.exit(WARN) - - print(status['message']) - sys.exit(status['exit_code']) - except ValueError: - print("invalid check output") - sys.exit(WARN) - else: - print("no info available") - sys.exit(WARN) - - sys.exit(SUCCESS) diff --git a/src/files/scripts/check_ovn_certs.py b/src/files/scripts/check_ovn_certs.py deleted file mode 100755 index 5258fb7..0000000 --- a/src/files/scripts/check_ovn_certs.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (C) 2023 Canonical -# -# 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 os -import json -from datetime import datetime - -from cryptography.hazmat.backends import default_backend -from cryptography import x509 - -NAGIOS_PLUGIN_DATA = '/usr/local/lib/nagios/juju_charm_plugin_data' -UNKNOWN = 3 -CRITICAL = 2 -WARN = 1 -SUCCESS = 0 - -CERT_EXPIRY_CRITICAL_LIMIT = 30 -CERT_EXPIRY_WARN_LIMIT = 60 - - -class SSLCertificate(object): - def __init__(self, path): - self.path = path - - @property - def cert(self): - with open(self.path, "rb") as fd: - return fd.read() - - @property - def expiry_date(self): - cert = x509.load_pem_x509_certificate(self.cert, default_backend()) - return cert.not_valid_after - - @property - def days_remaining(self): - return int((self.expiry_date - datetime.now()).days) - - -def check_ovn_certs(): - output_path = os.path.join(NAGIOS_PLUGIN_DATA, 'ovn_cert_status.json') - if not os.path.isdir(NAGIOS_PLUGIN_DATA): - os.makedirs(NAGIOS_PLUGIN_DATA) - - exit_code = SUCCESS - for cert in ['/etc/ovn/cert_host', '/etc/ovn/ovn-chassis.crt']: - if not os.path.exists(cert): - message = "cert '{}' does not exist.".format(cert) - exit_code = CRITICAL - break - - if not os.access(cert, os.R_OK): - message = "cert '{}' is not readable.".format(cert) - exit_code = CRITICAL - break - - try: - remaining_days = SSLCertificate(cert).days_remaining - if remaining_days <= 0: - message = "{}: cert has expired.".format(cert) - exit_code = CRITICAL - break - - if remaining_days < CERT_EXPIRY_CRITICAL_LIMIT: - message = ("{}: cert will expire in {} days". - format(cert, remaining_days)) - exit_code = CRITICAL - break - - if remaining_days < CERT_EXPIRY_WARN_LIMIT: - message = ("{}: cert will expire in {} days". - format(cert, remaining_days)) - exit_code = WARN - break - - except Exception as exc: - message = "failed to check cert '{}': {}".format(cert, str(exc)) - exit_code = UNKNOWN - else: - message = "all certs healthy" - exit_code = SUCCESS - - ts = datetime.now() - with open(output_path, 'w') as fd: - fd.write(json.dumps({'message': message, - 'exit_code': exit_code, - 'last_updated': - ts.strftime("%Y-%m-%d %H:%M:%S")})) - - os.chmod(output_path, 644) - - -if __name__ == "__main__": - check_ovn_certs() diff --git a/src/icon.svg b/src/icon.svg deleted file mode 100644 index dcefac0..0000000 --- a/src/icon.svg +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - OVN - - - - - - - - - - - - diff --git a/src/layer.yaml b/src/layer.yaml deleted file mode 100644 index b60e06c..0000000 --- a/src/layer.yaml +++ /dev/null @@ -1,21 +0,0 @@ -includes: - - layer:ovn - - interface:nrpe-external-master - - interface:ovsdb - - interface:ovsdb-subordinate - - interface:neutron-plugin - - interface:juju-info -options: - basic: - use_venv: True - include_system_packages: False -repo: https://opendev.org/x/charm-ovn-chassis -config: - deletes: - - source - - ssl_ca - - ssl_cert - - ssl_key - - use-internal-endpoints - - use-syslog - - verbose diff --git a/src/lib/__init__.py b/src/lib/__init__.py deleted file mode 100644 index 5705e5d..0000000 --- a/src/lib/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2019 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. diff --git a/src/lib/charm/__init__.py b/src/lib/charm/__init__.py deleted file mode 100644 index 5705e5d..0000000 --- a/src/lib/charm/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2019 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. diff --git a/src/lib/charm/openstack/__init__.py b/src/lib/charm/openstack/__init__.py deleted file mode 100644 index 5705e5d..0000000 --- a/src/lib/charm/openstack/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2019 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. diff --git a/src/lib/charm/openstack/ovn_chassis.py b/src/lib/charm/openstack/ovn_chassis.py deleted file mode 100644 index 91b438c..0000000 --- a/src/lib/charm/openstack/ovn_chassis.py +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright 2019 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 os - -from charmhelpers.core.host import rsync, write_file -from charmhelpers.contrib.charmsupport import nrpe -import charmhelpers.fetch as ch_fetch - -import charms_openstack.charm as charm - -import charms.ovn_charm - -NAGIOS_PLUGINS = '/usr/local/lib/nagios/plugins' -SCRIPTS_DIR = '/usr/local/bin' -CERTCHECK_CRONFILE = '/etc/cron.d/ovn-chassis-cert-checks' -CRONJOB_CMD = "{schedule} root {command} 2>&1 | logger -p local0.notice\n" - - -charm.use_defaults('charm.default-select-release') - - -class OVNChassisCharm(charms.ovn_charm.DeferredEventMixin, - charms.ovn_charm.BaseOVNChassisCharm): - # OpenvSwitch and OVN is distributed as part of the Ubuntu Cloud Archive - # Pockets get their name from OpenStack releases. - # - # This defines the earliest version this charm can support, actually - # installed version is selected by the principle charm. - release = 'ussuri' - name = 'ovn-chassis' - - # packages needed by nrpe checks - nrpe_packages = ['python3-cryptography'] - - # Setting an empty source_config_key activates special handling of release - # selection suitable for subordinate charms - source_config_key = '' - - @property - def packages(self): - return super().packages + self.nrpe_packages - - def render_nrpe(self): - hostname = nrpe.get_nagios_hostname() - self.add_nrpe_certs_check(nrpe.NRPE(hostname=hostname)) - super().render_nrpe() - - def add_nrpe_certs_check(self, charm_nrpe): - script = 'nrpe_check_ovn_certs.py' - src = os.path.join(os.getenv('CHARM_DIR'), 'files', 'nagios', script) - dst = os.path.join(NAGIOS_PLUGINS, script) - rsync(src, dst) - charm_nrpe.add_check( - shortname='check_ovn_certs', - description='Check that ovn certs are valid.', - check_cmd=script - ) - # Need to install this as a system package since it is needed by the - # cron script that runs outside of the charm. - ch_fetch.apt_install(['python3-cryptography']) - script = 'check_ovn_certs.py' - src = os.path.join(os.getenv('CHARM_DIR'), 'files', 'scripts', script) - dst = os.path.join(SCRIPTS_DIR, script) - rsync(src, dst) - cronjob = CRONJOB_CMD.format( - schedule='*/15 * * * *', - command=dst) - write_file(CERTCHECK_CRONFILE, cronjob) diff --git a/src/lxd-profile.yaml b/src/lxd-profile.yaml deleted file mode 100644 index 044e653..0000000 --- a/src/lxd-profile.yaml +++ /dev/null @@ -1,2 +0,0 @@ -config: - linux.kernel_modules: openvswitch diff --git a/src/metadata.yaml b/src/metadata.yaml deleted file mode 100644 index 01227ee..0000000 --- a/src/metadata.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: ovn-chassis -summary: Open Virtual Network for Open vSwitch - Chassis -maintainer: OpenStack Charmers -description: | - Subordinate charm that deploys the OVN local controller and Open vSwitch - Database and Switch. -docs: https://discourse.charmhub.io/t/ovn-chassis-docs-index/11011 -tags: -- networking -series: -- jammy -- mantic -subordinate: true -extra-bindings: - data: -provides: - nova-compute: - interface: neutron-plugin - scope: container - ovsdb-subordinate: - interface: ovsdb-subordinate - scope: container - nrpe-external-master: - interface: nrpe-external-master - scope: container -requires: - juju-info: - interface: juju-info - scope: container - ovsdb: - interface: ovsdb diff --git a/src/reactive/ovn_chassis_handlers.py b/src/reactive/ovn_chassis_handlers.py deleted file mode 100644 index 70b643f..0000000 --- a/src/reactive/ovn_chassis_handlers.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2019 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.reactive as reactive -import charms_openstack.charm as charm - -from . import ovn_chassis_charm_handlers - - -@reactive.when_not(ovn_chassis_charm_handlers.OVN_CHASSIS_ENABLE_HANDLERS_FLAG) -def enable_ovn_chassis_handlers(): - reactive.set_flag( - ovn_chassis_charm_handlers.OVN_CHASSIS_ENABLE_HANDLERS_FLAG) - - -@reactive.when_not('is-update-status-hook') -def configure_deferred_restarts(): - with charm.provide_charm_instance() as instance: - instance.configure_deferred_restarts() - - -@reactive.when_none('charm.paused', 'is-update-status-hook') -@reactive.when('config.rendered') -@reactive.when_any('config.changed.nagios_context', - 'config.changed.nagios_servicegroups', - 'endpoint.nrpe-external-master.changed', - 'nrpe-external-master.available') -def configure_nrpe(): - """Handle config-changed for NRPE options.""" - with charm.provide_charm_instance() as charm_instance: - charm_instance.render_nrpe() diff --git a/src/test-requirements.txt b/src/test-requirements.txt deleted file mode 100644 index e771023..0000000 --- a/src/test-requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -# This file is managed centrally by release-tools and should not be modified -# within individual charm repos. See the 'global' dir contents for available -# choices of *requirements.txt files for OpenStack Charms: -# https://github.com/openstack-charmers/release-tools -# - -# Functional Test Requirements (let Zaza's dependencies solve all dependencies here!) -git+https://github.com/openstack-charmers/zaza.git#egg=zaza -git+https://github.com/openstack-charmers/zaza-openstack-tests.git#egg=zaza.openstack diff --git a/src/tests/bundles/noble-caracal.yaml b/src/tests/bundles/noble-caracal.yaml deleted file mode 100644 index 950e0b9..0000000 --- a/src/tests/bundles/noble-caracal.yaml +++ /dev/null @@ -1,52 +0,0 @@ -variables: - openstack-origin: &openstack-origin caracal - -local_overlay_enabled: False - -series: noble - -applications: - - vault: - charm: ch:vault - num_units: 1 - series: noble - channel: latest/edge - - ovn-central: - charm: ch:ovn-central - num_units: 3 - options: - source: *openstack-origin - channel: latest/edge - - magpie: - # By default, when instance NUMA placement is not specified, - # a topology of N sockets, each with one core and one thread, - # is used for an instance, where N corresponds to the number of - # instance vCPUs requested. - # - # Let's use a 8 VCPU 2 socket flavor for low level tests - constraints: "instance-type=twosocketm1.xlarge" - charm: ch:magpie - num_units: 2 - options: - source: *openstack-origin - channel: latest/edge - - ovn-chassis: - charm: ../../../ovn-chassis_amd64.charm - -relations: - - - - 'ovn-central:certificates' - - 'vault:certificates' - - - - 'magpie:juju-info' - - 'ovn-chassis:juju-info' - - - - 'ovn-chassis:ovsdb' - - 'ovn-central:ovsdb' - - - - 'ovn-chassis:certificates' - - 'vault:certificates' diff --git a/src/tests/tests.yaml b/src/tests/tests.yaml deleted file mode 100644 index c057a6c..0000000 --- a/src/tests/tests.yaml +++ /dev/null @@ -1,41 +0,0 @@ -charm_name: ovn-chassis - -gate_bundles: -- noble-caracal - -smoke_bundles: -- noble-caracal - -dev_bundles: -- noble-caracal - -target_deploy_status: - magpie: - workload-status-message: icmp ok - ovn-central: - workload-status: waiting - workload-status-message-prefix: "'ovsdb-peer' incomplete, 'certificates' awaiting server certificate data" - ovn-chassis: - workload-status: waiting - workload-status-message-prefix: "'certificates' awaiting server certificate data" - vault: - workload-status: blocked - workload-status-message-prefix: Vault needs to be initialized - -# Note that full end to end tests are performed with OVN in the -# neutron-api-plugin-ovn and octavia charm gates -configure: -- zaza.openstack.charm_tests.vault.setup.auto_initialize_no_validation -- zaza.openstack.charm_tests.neutron.setup.undercloud_and_charm_setup - -configure_options: - # magpie is obviously not a hypervisor, but for the purpose of this charm - # gate it is the principal charm for ovn-chassis and as such is the target - # unit for preparing hugepages and VFIO configuration. - hypervisor_application: 'magpie' - -tests: -- zaza.openstack.charm_tests.ovn.tests.OVNChassisDeferredRestartTest -- zaza.openstack.charm_tests.ovn.tests.ChassisCharmOperationTest -- zaza.openstack.charm_tests.ovn.tests.DPDKTest - diff --git a/src/tox.ini b/src/tox.ini deleted file mode 100644 index 8ffff0f..0000000 --- a/src/tox.ini +++ /dev/null @@ -1,55 +0,0 @@ -# Source charm (with zaza): ./src/tox.ini -# This file is managed centrally by release-tools and should not be modified -# within individual charm repos. See the 'global' dir contents for available -# choices of tox.ini for OpenStack Charms: -# https://github.com/openstack-charmers/release-tools - -[tox] -envlist = pep8 -# NOTE: Avoid build/test env pollution by not enabling sitepackages. -sitepackages = False -# NOTE: Avoid false positives by not skipping missing interpreters. -skip_missing_interpreters = False - -[testenv] -# We use tox mainly for virtual environment management for test requirements -# and do not install the charm code as a Python package into that environment. -# Ref: https://tox.wiki/en/latest/config.html#skip_install -skip_install = True -setenv = VIRTUAL_ENV={envdir} - PYTHONHASHSEED=0 -allowlist_externals = juju -passenv = - HOME - TERM - CS_* - OS_* - TEST_* -deps = -r{toxinidir}/test-requirements.txt - -[testenv:pep8] -basepython = python3 -commands = charm-proof - -[testenv:func-noop] -basepython = python3 -commands = - functest-run-suite --help - -[testenv:func] -basepython = python3 -commands = - functest-run-suite --keep-model - -[testenv:func-smoke] -basepython = python3 -commands = - functest-run-suite --keep-model --smoke - -[testenv:func-target] -basepython = python3 -commands = - functest-run-suite --keep-model --bundle {posargs} - -[testenv:venv] -commands = {posargs} diff --git a/src/wheelhouse.txt b/src/wheelhouse.txt deleted file mode 100644 index a0c8b27..0000000 --- a/src/wheelhouse.txt +++ /dev/null @@ -1,6 +0,0 @@ - -git+https://github.com/wolsen/charms.reactive.git@fix-entry-points#egg=charms.reactive - -git+https://github.com/openstack/charms.openstack.git#egg=charms.openstack - -git+https://github.com/juju/charm-helpers.git#egg=charmhelpers diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index a9d104f..0000000 --- a/test-requirements.txt +++ /dev/null @@ -1,23 +0,0 @@ -# This file is managed centrally by release-tools and should not be modified -# within individual charm repos. See the 'global' dir contents for available -# choices of *requirements.txt files for OpenStack Charms: -# https://github.com/openstack-charmers/release-tools -# -pyparsing<3.0.0 # aodhclient is pinned in zaza and needs pyparsing < 3.0.0, but cffi also needs it, so pin here. - -stestr>=2.2.0 - -# Dependency of stestr. Workaround for -# https://github.com/mtreinish/stestr/issues/145 -cliff<3.0.0 - -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 - -netifaces diff --git a/tox.ini b/tox.ini index e149c56..d26ac84 100644 --- a/tox.ini +++ b/tox.ini @@ -1,107 +1,35 @@ -# Source charm: ./tox.ini -# This file is managed centrally by release-tools and should not be modified -# within individual charm repos. See the 'global' dir contents for available -# choices of tox.ini for OpenStack Charms: -# https://github.com/openstack-charmers/release-tools - +# Placeholder tox.ini to satisfy CI on final push that +# archives the repository. [tox] -envlist = pep8,py3 +envlist = pep8,pylint,py3 # NOTE: Avoid build/test env pollution by not enabling sitepackages. sitepackages = False # NOTE: Avoid false positives by not skipping missing interpreters. skip_missing_interpreters = False [testenv] -# We use tox mainly for virtual environment management for test requirements -# and do not install the charm code as a Python package into that environment. -# Ref: https://tox.wiki/en/latest/config.html#skip_install -skip_install = True -setenv = VIRTUAL_ENV={envdir} - PYTHONHASHSEED=0 - TERM=linux - CHARM_LAYERS_DIR={toxinidir}/layers - CHARM_INTERFACES_DIR={toxinidir}/interfaces - JUJU_REPOSITORY={toxinidir}/build -passenv = - no_proxy - http_proxy - https_proxy - CHARM_INTERFACES_DIR - CHARM_LAYERS_DIR - JUJU_REPOSITORY -allowlist_externals = - charmcraft - bash - tox -deps = - -r{toxinidir}/requirements.txt - -[testenv:build] -basepython = python3 -commands = - charmcraft clean - charmcraft -v pack - -[testenv:add-build-lock-file] -basepython = python3 -commands = - charm-build --log-level DEBUG --write-lock-file -o {toxinidir}/build/builds src {posargs} +allowlist_externals=true [testenv:py3] basepython = python3 -deps = -r{toxinidir}/test-requirements.txt -commands = stestr run --slowest {posargs} +commands = true [testenv:py310] basepython = python3.10 -deps = -r{toxinidir}/test-requirements.txt -commands = stestr run --slowest {posargs} - -[testenv:py312] -basepython = python3.12 -deps = -r{toxinidir}/test-requirements.txt -commands = stestr run --slowest {posargs} +commands = true [testenv:pep8] basepython = python3 -deps = flake8==7.1.1 - git+https://github.com/juju/charm-tools.git -commands = flake8 {posargs} src unit_tests \ - {toxinidir}/src/files/nagios/nrpe_check_ovn_certs.py \ - {toxinidir}/src/files/scripts/check_ovn_certs.py +commands = true + +[testenv:pylint] +basepython = python3 +commands = true [testenv:cover] -# Technique based heavily upon -# https://github.com/openstack/nova/blob/master/tox.ini basepython = python3 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt -setenv = - {[testenv]setenv} - PYTHON=coverage run -commands = - coverage erase - stestr run --slowest {posargs} - coverage combine - coverage html -d cover - coverage xml -o cover/coverage.xml - coverage report - -[coverage:run] -branch = True -concurrency = multiprocessing -parallel = True -source = - . -omit = - .tox/* - */charmhelpers/* - unit_tests/* +commands = true [testenv:venv] basepython = python3 commands = {posargs} - -[flake8] -# E402 ignore necessary for path append before sys module import in actions -ignore = E402,W503,W504 diff --git a/unit_tests/README.md b/unit_tests/README.md deleted file mode 100644 index 96d169d..0000000 --- a/unit_tests/README.md +++ /dev/null @@ -1 +0,0 @@ -This is not the unit tests you are looking for, take a look at `layer-ovn`. diff --git a/unit_tests/__init__.py b/unit_tests/__init__.py deleted file mode 100644 index 4670b81..0000000 --- a/unit_tests/__init__.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright 2018 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() - -import mock - - -class _fake_decorator(object): - - def __init__(self, *args): - pass - - def __call__(self, f): - return f - - -charms = mock.MagicMock() -sys.modules['charms'] = charms -charms.leadership = mock.MagicMock() -sys.modules['charms.leadership'] = charms.leadership -charms.reactive = mock.MagicMock() -charms.reactive.when = _fake_decorator -charms.reactive.when_all = _fake_decorator -charms.reactive.when_any = _fake_decorator -charms.reactive.when_not = _fake_decorator -charms.reactive.when_none = _fake_decorator -charms.reactive.when_not_all = _fake_decorator -charms.reactive.not_unless = _fake_decorator -charms.reactive.when_file_changed = _fake_decorator -charms.reactive.collect_metrics = _fake_decorator -charms.reactive.meter_status_changed = _fake_decorator -charms.reactive.only_once = _fake_decorator -charms.reactive.hook = _fake_decorator -charms.reactive.bus = mock.MagicMock() -charms.reactive.flags = mock.MagicMock() -charms.reactive.relations = mock.MagicMock() -sys.modules['charms.reactive'] = charms.reactive -sys.modules['charms.reactive.bus'] = charms.reactive.bus -sys.modules['charms.reactive.bus'] = charms.reactive.decorators -sys.modules['charms.reactive.flags'] = charms.reactive.flags -sys.modules['charms.reactive.relations'] = charms.reactive.relations -sys.modules['charms.leadership'] = charms.leadership -netaddr = mock.MagicMock() -sys.modules['netaddr'] = netaddr -import reactive -reactive.ovn_chassis_charm_handlers = mock.MagicMock() -reactive.ovn_chassis_charm_handlers.OVN_CHASSIS_ENABLE_HANDLERS_FLAG = \ - 'MOCKED_FLAG' -sys.modules['reactive.ovn_chassis_charm_handlers'] = \ - reactive.ovn_chassis_charm_handlers diff --git a/unit_tests/test_reactive_ovn_chassis_handlers.py b/unit_tests/test_reactive_ovn_chassis_handlers.py deleted file mode 100644 index 6ec23de..0000000 --- a/unit_tests/test_reactive_ovn_chassis_handlers.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2019 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 reactive.ovn_chassis_handlers as handlers - -import charms_openstack.test_utils as test_utils - - -class TestRegisteredHooks(test_utils.TestRegisteredHooks): - - def setUp(self): - super().setUp() - - def test_hooks(self): - hook_set = { - 'when_none': { - 'configure_nrpe': ('charm.paused', 'is-update-status-hook',), - }, - 'when_not': { - 'enable_ovn_chassis_handlers': ('MOCKED_FLAG',), - 'configure_deferred_restarts': ('is-update-status-hook',), - }, - 'when': { - 'configure_nrpe': ('config.rendered',), - }, - 'when_any': { - 'configure_nrpe': ('config.changed.nagios_context', - 'config.changed.nagios_servicegroups', - 'endpoint.nrpe-external-master.changed', - 'nrpe-external-master.available',), - }, - } - # test that the hooks were registered via the - # reactive.ovn_handlers - self.registered_hooks_test_helper(handlers, hook_set, {}) - - -class TestOvnHandlers(test_utils.PatchHelper): - - def test_enable_ovn_chassis_handlers(self): - self.patch_object(handlers.reactive, 'set_flag') - handlers.enable_ovn_chassis_handlers() - self.set_flag.assert_called_once_with('MOCKED_FLAG')