diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..41218f1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +build +layers +.tox +interfaces +.testrepository +.stestr +*__pycache__* +*.pyc +*.swp diff --git a/.zuul.yaml b/.zuul.yaml deleted file mode 100644 index b3037e9..0000000 --- a/.zuul.yaml +++ /dev/null @@ -1,5 +0,0 @@ -- project: - templates: - - python35-charm-jobs - - openstack-python3-ussuri-jobs - - openstack-cover-jobs diff --git a/README.md b/README.md deleted file mode 100644 index d44e306..0000000 --- a/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Overview - -This is a "source" charm, which is intended to be strictly the top -layer of a built charm. This structure declares that any included -layer assets are not intended to be consumed as a layer from a -functional or design standpoint. - -# Test and Build - -Building, pushing and publishing to the charm store is automated -by CI to ensure consistent flow. Manually building is useful for -development and testing, however. - -``` -tox -e pep8 -tox -e py35 # or py36 -tox -e build -``` - -# Contact Information - -Freenode IRC: #openstack-charms diff --git a/README.md b/README.md new file mode 120000 index 0000000..351df1d --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +src/README.md \ No newline at end of file diff --git a/copyright b/copyright new file mode 100644 index 0000000..fe11c30 --- /dev/null +++ b/copyright @@ -0,0 +1,16 @@ +Format: http://dep.debian.net/deps/dep5/ + +Files: * +Copyright: Copyright 2021, Canonical Ltd., All Rights Reserved. +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/pip.sh b/pip.sh new file mode 100755 index 0000000..9a7e6b0 --- /dev/null +++ b/pip.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# +# 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 +# +# setuptools 58.0 dropped the support for use_2to3=true which is needed to +# install blessings (an indirect dependency of charm-tools). +# +# More details on the beahvior of tox and virtualenv creation can be found at +# https://github.com/tox-dev/tox/issues/448 +# +# This script is wrapper to force the use of the pinned versions early in the +# process when the virtualenv was created and upgraded before installing the +# depedencies declared in the target. +pip install 'pip<20.3' 'setuptools<50.0.0' +pip "$@" diff --git a/requirements.txt b/requirements.txt index 2316401..b786b42 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,19 +3,20 @@ # choices of *requirements.txt files for OpenStack Charms: # https://github.com/openstack-charmers/release-tools # -# TODO: Distill the func test requirements from the lint/unit test -# requirements. They are intertwined. Also, Zaza itself should specify -# all of its own requirements and if it doesn't, fix it there. -# -pbr>=1.8.0,<1.9.0 -simplejson>=2.2.0 -netifaces>=0.10.4 -netaddr>=0.7.12,!=0.7.16 -Jinja2>=2.6 # BSD License (3 clause) -six>=1.9.0 +# NOTE(lourot): This might look like a duplication of test-requirements.txt but +# some tox targets use only test-requirements.txt whereas charm-build uses only +# requirements.txt +setuptools<50.0.0 # https://github.com/pypa/setuptools/commit/04e3df22df840c6bb244e9b27bc56750c44b7c85 -# dnspython 2.0.0 dropped py3.5 support -dnspython<2.0.0; python_version < '3.6' -dnspython; python_version >= '3.6' +# Build requirements +charm-tools==2.8.3 -psutil>=1.1.1,<2.0.0 +simplejson + +# Newer versions use keywords that didn't exist in python 3.5 yet (e.g. +# "ModuleNotFoundError") +# NOTE(lourot): This might look like a duplication of test-requirements.txt but +# some tox targets use only test-requirements.txt whereas charm-build uses only +# requirements.txt +importlib-metadata<3.0.0; python_version < '3.6' +importlib-resources<3.0.0; python_version < '3.6' diff --git a/src/README.md b/src/README.md index 6a9e395..51d673b 100644 --- a/src/README.md +++ b/src/README.md @@ -1,19 +1,101 @@ -netapp Storage Backend for Cinder -------------------------------- +# Overview -Overview -======== +The cinder charm is the Openstack block storage (i.e: Volume) service, whereas the cinder-netapp charm works as a subordinate of cinder, implementing a backend based on NetApp. -This charm provides a netapp storage backend for use with the Cinder -charm. +> **Note**: The cinder-netapp charm is supported starting with Openstack Queens. -To use: +# Usage - juju deploy cinder - juju deploy cinder-netapp - juju add-relation cinder-netapp cinder +## Configuration -Configuration -============= +This section covers common and/or important configuration options. See file `config.yaml` for the full list of options, along with their descriptions and default values. See the [Juju documentation][juju-docs-config-apps] for details on configuring applications. -See config.yaml for details of configuration options. +### `netapp-storage-family` + +The storage family type that is used for the storage system. Can be `ontap_cluster` for clustering data ONTAP, or `eseries`. + +### `netapp-storage-protocol` + +The SAN protocol to use. Can be either `iscsi` or `NFS`. + +### `netapp-vserver` + +Specifies the virtual storage server name on the storage cluster. + +### `netapp-server-hostname` + +The hostname or IP address for the storage server (can alternatively specify a proxy server). + +### `netapp-server-port` + +The TCP port used to communicate with the storage server or proxy. + +If it's not specified, it will be deduced: For ONTAP drivers, it will be 80 for HTTP and 443 for HTTPS; for E-series, it will be 8080 and 8443, respectively. + +### `netapp-login` + +The username used to access the storage server or proxy. + +### `netapp-password` + +The password used to authenticate the `login` option. + +### `netapp-nfs-shares-config` + +Specifies a file that contains a list of NFS shares, each on its own line, to which the driver will attempt to provision +Cinder volumes. + +### `netapp-controller-ips` + +If the storage family is `eseries`, this option specifies a comma-separated list of controller hostnames or IP addresses +to be used for provisioning. + +### `netapp-array-password` + +The password for the NetApp E-series storage array. + +### `netapp-storage-pools` + +Specifies a comma-separated list of pool names to use. + +### `use-multipath` + +Whether to use multipath for image transfer. + +### `netapp-enable-multiattach` + +Specifies whether the driver should allow operations that involve multiple attachments to a volume. + +### `volume-backend-name` + +The service name to present to Cinder. + +## Deployment + +This charm's primary use is as a backend for the cinder charm. To do so, add a relation betweeen both charms: + + juju add-relation cinder-netapp:storage-backend cinder:storage-backend + +## Actions + +This section lists Juju [actions][juju-docs-actions] supported by the charm. Actions allow specific operations to be performed on a per-unit basis. To display action descriptions run `juju actions --schema cinder-netapp`. If the charm is not deployed then see file `actions.yaml`. + +* `pause` +* `resume` +* `restart-services` + +# Documentation + +The OpenStack Charms project maintains two documentation guides: + +* [OpenStack Charm Guide][cg]: for project information, including development + and support notes +* [OpenStack Charms Deployment Guide][cdg]: for charm usage information + +# Bugs + +Please report bugs on [Launchpad][lp-bugs-charm-cinder-netapp]. + +[cg]: https://docs.openstack.org/charm-guide +[cdg]: https://docs.openstack.org/project-deploy-guide/charm-deployment-guide +[lp-bugs-charm-cinder-netapp]: https://bugs.launchpad.net/charm-cinder-netapp/+filebug diff --git a/src/layer.yaml b/src/layer.yaml index 9eb6acf..3486637 100644 --- a/src/layer.yaml +++ b/src/layer.yaml @@ -1,24 +1,11 @@ -"includes": -- "layer:options" -- "layer:basic" -- "interface:tls-certificates" -- "layer:openstack" -- "interface:cinder-backend" -"exclude": [".travis.yml", "tests", "tox.ini", "test-requirements.txt", "unit_tests", - ".gitignore", ".gitreview", ".zuul.yaml", "README.md", "requirements.txt"] -"options": - "basic": - "use_venv": !!bool "true" - "packages": [] - "python_packages": [] - "include_system_packages": !!bool "false" - "openstack": {} - "cinder-netapp": {} -"repo": "https://github.com/openstack-charmers/cinder-storage-backend-template" -"config": - "deletes": - - "debug" - - "verbose" - - "use-syslog" - - "use-internal-endpoints" -"is": "cinder-netapp" +includes: ['layer:openstack', 'interface:cinder-backend'] +config: + deletes: + - debug + - verbose + - use-syslog + - use-internal-endpoints + - ssl_ca + - ssl_cert + - ssl_key +repo: https://github.com/lmlg/charm-cinder-netapp diff --git a/src/lib/charm/openstack/cinder_netapp.py b/src/lib/charm/openstack/cinder_netapp.py index 1d59a5d..621ee70 100644 --- a/src/lib/charm/openstack/cinder_netapp.py +++ b/src/lib/charm/openstack/cinder_netapp.py @@ -1,3 +1,18 @@ +# 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 charms_openstack.charm charms_openstack.charm.use_defaults('charm.default-select-release') @@ -14,42 +29,45 @@ class CinderNetAppCharm( stateless = True # Specify any config that the user *must* set. mandatory_config = [ - 'netapp-storage-family', 'netapp-storage-protocol', 'netapp-server-hostname', - 'volume-backend-name'] + 'netapp-storage-family', 'netapp-storage-protocol', + 'netapp-server-hostname', 'volume-backend-name'] def cinder_configuration(self): - service = self.config.get('volume-backend-name') + cget = self.config.get + service = cget('volume-backend-name') volumedriver = 'cinder.volume.drivers.netapp.common.NetAppDriver' driver_options_extension = [] driver_transport = [] driver_options_common = [ - ('netapp_storage_family', self.config.get('netapp-storage-family')), - ('netapp_storage_protocol', self.config.get('netapp-storage-protocol')), - ('netapp_vserver', self.config.get('netapp-vserver')), - ('netapp_server_hostname', self.config.get('netapp-server-hostname')), - ('netapp_server_port', self.config.get('netapp-server-port')), - ('use_multipath_for_image_xfer', self.config.get('use-multipath')), - ('netapp_login', self.config.get('netapp-login')), - ('netapp_password', self.config.get('netapp-password')), + ('netapp_storage_family', cget('netapp-storage-family')), + ('netapp_storage_protocol', cget('netapp-storage-protocol')), + ('netapp_vserver', cget('netapp-vserver')), + ('netapp_server_hostname', cget('netapp-server-hostname')), + ('netapp_server_port', cget('netapp-server-port')), + ('use_multipath_for_image_xfer', cget('use-multipath')), + ('netapp_login', cget('netapp-login')), + ('netapp_password', cget('netapp-password')), ('volume_driver', volumedriver), ('volume_backend_name', service)] - if self.config.get('netapp-server-port') == 443: + if cget('netapp-server-port') == 443: driver_transport = [ ('netapp_transport_type', "https")] - if self.config.get('netapp-storage-family') == "eseries": + if cget('netapp-storage-family') == "eseries": driver_options_extension = [ - ('netapp_controller_ips', self.config.get('netapp-controller-ips')), - ('netapp_sa_password', self.config.get('netapp-array-password')), - ('netapp_storage_pools', self.config.get('netapp-storage-pools')), - ('use_multipath_for_image_xfer', self.config.get('use-multipath'))] + ('netapp_controller_ips', cget('netapp-controller-ips')), + ('netapp_sa_password', cget('netapp-array-password')), + ('netapp_storage_pools', cget('netapp-storage-pools')), + ('use_multipath_for_image_xfer', cget('use-multipath'))] - if self.config.get('netapp-storage-protocol') == "nfs": + if cget('netapp-storage-protocol') == "nfs": driver_options_extension = [ - ('nfs_shares_config', self.config.get('netapp-nfs-shares-config'))] + ('nfs_shares_config', cget('netapp-nfs-shares-config'))] + + return driver_options_common + driver_transport + \ + driver_options_extension - return driver_options_common + driver_transport + driver_options_extension class CinderNetAppCharmRocky(CinderNetAppCharm): @@ -57,4 +75,3 @@ class CinderNetAppCharmRocky(CinderNetAppCharm): release = 'rocky' version_package = 'cinder-common' packages = [] - diff --git a/src/metadata.yaml b/src/metadata.yaml index de2907b..2e7e354 100644 --- a/src/metadata.yaml +++ b/src/metadata.yaml @@ -13,6 +13,9 @@ tags: series: - bionic - focal + - groovy + - hirsute + - impish subordinate: true provides: storage-backend: diff --git a/src/test-requirements.txt b/src/test-requirements.txt index f2912ba..e771023 100644 --- a/src/test-requirements.txt +++ b/src/test-requirements.txt @@ -1,3 +1,9 @@ -# zaza +# 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/bionic-queens.yaml b/src/tests/bundles/bionic-queens.yaml new file mode 100644 index 0000000..c10f10e --- /dev/null +++ b/src/tests/bundles/bionic-queens.yaml @@ -0,0 +1,52 @@ +series: bionic +comment: +- 'machines section to decide order of deployment. database sooner = faster' +machines: + '0': + constraints: mem=3072M + '1': + '2': + constraints: mem=4G root-disk=16G + '3': +relations: +- - keystone:shared-db + - mysql:shared-db +- - cinder:shared-db + - mysql:shared-db +- - cinder:identity-service + - keystone:identity-service +- - cinder:amqp + - rabbitmq-server:amqp +- - cinder:storage-backend + - cinder-netapp:storage-backend +applications: + mysql: + charm: cs:~openstack-charmers-next/percona-cluster + num_units: 1 + to: + - '0' + keystone: + charm: cs:~openstack-charmers-next/keystone + num_units: 1 + to: + - '1' + cinder: + charm: cs:~openstack-charmers-next/cinder + num_units: 1 + options: + block-device: /dev/vdb + overwrite: "true" + ephemeral-unmount: /mnt + to: + - '2' + cinder-netapp: + charm: cinder-netapp + options: + netapp-storage-family: ontap_cluster + netapp-storage-protocol: iscsi + volume-backend-name: NETAPP + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + to: + - '3' diff --git a/src/tests/bundles/bionic-rocky.yaml b/src/tests/bundles/bionic-rocky.yaml new file mode 100644 index 0000000..b8088af --- /dev/null +++ b/src/tests/bundles/bionic-rocky.yaml @@ -0,0 +1,55 @@ +series: bionic +comment: +- 'machines section to decide order of deployment. database sooner = faster' +machines: + '0': + constraints: mem=3072M + '1': + '2': + constraints: mem=4G root-disk=16G + '3': +relations: +- - keystone:shared-db + - mysql:shared-db +- - cinder:shared-db + - mysql:shared-db +- - cinder:identity-service + - keystone:identity-service +- - cinder:amqp + - rabbitmq-server:amqp +- - cinder:storage-backend + - cinder-netapp:storage-backend +applications: + mysql: + charm: cs:~openstack-charmers-next/percona-cluster + num_units: 1 + to: + - '0' + keystone: + charm: cs:~openstack-charmers-next/keystone + options: + openstack-origin: cloud:bionic-rocky + num_units: 1 + to: + - '1' + cinder: + charm: cs:~openstack-charmers-next/cinder + num_units: 1 + options: + openstack-origin: cloud:bionic-rocky + block-device: /dev/vdb + overwrite: "true" + ephemeral-unmount: /mnt + to: + - '2' + cinder-netapp: + charm: cinder-netapp + options: + netapp-storage-family: ontap_cluster + netapp-storage-protocol: iscsi + volume-backend-name: NETAPP + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + to: + - '3' diff --git a/src/tests/bundles/bionic-stein.yaml b/src/tests/bundles/bionic-stein.yaml new file mode 100644 index 0000000..ad24f1c --- /dev/null +++ b/src/tests/bundles/bionic-stein.yaml @@ -0,0 +1,55 @@ +series: bionic +comment: +- 'machines section to decide order of deployment. database sooner = faster' +machines: + '0': + constraints: mem=3072M + '1': + '2': + constraints: mem=4G root-disk=16G + '3': +relations: +- - keystone:shared-db + - mysql:shared-db +- - cinder:shared-db + - mysql:shared-db +- - cinder:identity-service + - keystone:identity-service +- - cinder:amqp + - rabbitmq-server:amqp +- - cinder:storage-backend + - cinder-netapp:storage-backend +applications: + mysql: + charm: cs:~openstack-charmers-next/percona-cluster + num_units: 1 + to: + - '0' + keystone: + charm: cs:~openstack-charmers-next/keystone + options: + openstack-origin: cloud:bionic-stein + num_units: 1 + to: + - '1' + cinder: + charm: cs:~openstack-charmers-next/cinder + num_units: 1 + options: + openstack-origin: cloud:bionic-stein + block-device: /dev/vdb + overwrite: "true" + ephemeral-unmount: /mnt + to: + - '2' + cinder-netapp: + charm: cinder-netapp + options: + netapp-storage-family: ontap_cluster + netapp-storage-protocol: iscsi + volume-backend-name: NETAPP + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + to: + - '3' diff --git a/src/tests/bundles/bionic-train.yaml b/src/tests/bundles/bionic-train.yaml new file mode 100644 index 0000000..2de747b --- /dev/null +++ b/src/tests/bundles/bionic-train.yaml @@ -0,0 +1,56 @@ +series: bionic +comment: +- 'machines section to decide order of deployment. database sooner = faster' +machines: + '0': + constraints: mem=3072M + '1': + '2': + constraints: mem=4G root-disk=16G + '3': +relations: +- - keystone:shared-db + - mysql:shared-db +- - cinder:shared-db + - mysql:shared-db +- - cinder:identity-service + - keystone:identity-service +- - cinder:amqp + - rabbitmq-server:amqp +- - cinder:storage-backend + - cinder-netapp:storage-backend +applications: + mysql: + charm: cs:~openstack-charmers-next/percona-cluster + num_units: 1 + to: + - '0' + keystone: + charm: cs:~openstack-charmers-next/keystone + options: + openstack-origin: cloud:bionic-train + num_units: 1 + to: + - '1' + cinder: + charm: cs:~openstack-charmers-next/cinder + num_units: 1 + storage: + block-devices: '40G' + options: + openstack-origin: cloud:bionic-train + block-device: None + overwrite: "true" + to: + - '2' + cinder-netapp: + charm: cinder-netapp + options: + netapp-storage-family: ontap_cluster + netapp-storage-protocol: iscsi + volume-backend-name: NETAPP + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + to: + - '3' diff --git a/src/tests/bundles/bionic-ussuri.yaml b/src/tests/bundles/bionic-ussuri.yaml index 4127416..e4d29d5 100644 --- a/src/tests/bundles/bionic-ussuri.yaml +++ b/src/tests/bundles/bionic-ussuri.yaml @@ -6,6 +6,7 @@ machines: constraints: mem=3072M '1': '2': + constraints: mem=4G root-disk=16G '3': relations: - - keystone:shared-db @@ -26,23 +27,29 @@ applications: - '0' keystone: charm: cs:~openstack-charmers-next/keystone - num_units: 1 options: openstack-origin: cloud:bionic-ussuri + num_units: 1 to: - '1' cinder: charm: cs:~openstack-charmers-next/cinder num_units: 1 + storage: + block-devices: '40G' options: openstack-origin: cloud:bionic-ussuri + block-device: None + overwrite: "true" + ephemeral-unmount: /mnt to: - '2' cinder-netapp: - series: bionic charm: cinder-netapp options: -# Add config options here + netapp-storage-family: ontap_cluster + netapp-storage-protocol: iscsi + volume-backend-name: NETAPP rabbitmq-server: charm: cs:~openstack-charmers-next/rabbitmq-server num_units: 1 diff --git a/src/tests/bundles/focal-ussuri.yaml b/src/tests/bundles/focal-ussuri.yaml index 99feedb..58a8fec 100644 --- a/src/tests/bundles/focal-ussuri.yaml +++ b/src/tests/bundles/focal-ussuri.yaml @@ -1,59 +1,76 @@ series: focal +variables: + openstack-origin: &openstack-origin distro comment: - 'machines section to decide order of deployment. database sooner = faster' machines: '0': constraints: mem=3072M '1': + constraints: mem=3072M '2': + constraints: mem=3072M '3': + '4': + '5': + constraints: mem=4G root-disk=16G relations: -- - keystone:shared-db - - mysql:shared-db -- - cinder:shared-db - - mysql:shared-db -- - cinder:identity-service - - keystone:identity-service -- - cinder:amqp - - rabbitmq-server:amqp -- - cinder:storage-backend - - cinder-netapp:storage-backend + - - keystone:shared-db + - keystone-mysql-router:shared-db + - - keystone-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:shared-db + - cinder-mysql-router:shared-db + - - cinder-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:identity-service + - keystone:identity-service + - - cinder:amqp + - rabbitmq-server:amqp + - - cinder:storage-backend + - cinder-netapp:storage-backend applications: - mysql: - charm: cs:~openstack-charmers-next/percona-cluster - num_units: 1 + mysql-innodb-cluster: + charm: cs:~openstack-charmers-next/mysql-innodb-cluster + num_units: 3 + options: + source: *openstack-origin to: - - '0' - keystone: - charm: cs:~openstack-charmers-next/keystone + - '0' + - '1' + - '2' + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server num_units: 1 options: - openstack-origin: distro + source: *openstack-origin to: - - '1' + - '3' + keystone: + charm: cs:~openstack-charmers/keystone + options: + openstack-origin: *openstack-origin + num_units: 1 + to: + - '4' + keystone-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router cinder: charm: cs:~openstack-charmers-next/cinder num_units: 1 + storage: + block-devices: '40G' options: - openstack-origin: distro + openstack-origin: *openstack-origin + block-device: None + overwrite: "true" to: - - '2' + - '5' cinder-netapp: - series: focal charm: cinder-netapp options: netapp-storage-family: ontap_cluster netapp-storage-protocol: iscsi - netapp-vserver: 'hou-cloud' - netapp-server-hostname: '10.10.10.10' - volume-backend-name: cinder-netapp - netapp-server-port: 80 - netapp-login: admin - netapp-password: Passw0rd - use-multipath: True - - rabbitmq-server: - charm: cs:~openstack-charmers-next/rabbitmq-server - num_units: 1 - to: - - '3' + volume-backend-name: NETAPP + cinder-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router diff --git a/src/tests/bundles/focal-victoria.yaml b/src/tests/bundles/focal-victoria.yaml index d95c659..c92ca56 100644 --- a/src/tests/bundles/focal-victoria.yaml +++ b/src/tests/bundles/focal-victoria.yaml @@ -1,58 +1,76 @@ series: focal +variables: + openstack-origin: &openstack-origin cloud:focal-victoria comment: - 'machines section to decide order of deployment. database sooner = faster' machines: '0': constraints: mem=3072M '1': + constraints: mem=3072M '2': + constraints: mem=3072M '3': + '4': + '5': + constraints: mem=4G root-disk=16G relations: -- - keystone:shared-db - - mysql:shared-db -- - cinder:shared-db - - mysql:shared-db -- - cinder:identity-service - - keystone:identity-service -- - cinder:amqp - - rabbitmq-server:amqp -- - cinder:storage-backend - - cinder-netapp:storage-backend + - - keystone:shared-db + - keystone-mysql-router:shared-db + - - keystone-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:shared-db + - cinder-mysql-router:shared-db + - - cinder-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:identity-service + - keystone:identity-service + - - cinder:amqp + - rabbitmq-server:amqp + - - cinder:storage-backend + - cinder-netapp:storage-backend applications: - mysql: - charm: cs:~openstack-charmers-next/percona-cluster - num_units: 1 + mysql-innodb-cluster: + charm: cs:~openstack-charmers-next/mysql-innodb-cluster + num_units: 3 + options: + source: *openstack-origin to: - - '0' + - '0' + - '1' + - '2' + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + options: + source: *openstack-origin + to: + - '3' keystone: charm: cs:~openstack-charmers-next/keystone - num_units: 1 options: - openstack-origin: distro + openstack-origin: *openstack-origin + num_units: 1 to: - - '1' + - '4' + keystone-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router cinder: charm: cs:~openstack-charmers-next/cinder + storage: + block-devices: '40G' num_units: 1 options: - openstack-origin: distro + openstack-origin: *openstack-origin + block-device: None + overwrite: "true" to: - - '2' + - '5' cinder-netapp: - series: focal charm: cinder-netapp options: netapp-storage-family: ontap_cluster netapp-storage-protocol: iscsi - netapp-vserver: 'hou-cloud' - netapp-server-hostname: '10.10.10.10' - volume-backend-name: cinder-netapp - netapp-server-port: 80 - netapp-login: admin - netapp-password: Passw0rd - use-multipath: True - rabbitmq-server: - charm: cs:~openstack-charmers-next/rabbitmq-server - num_units: 1 - to: - - '3' + volume-backend-name: NETAPP + cinder-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router diff --git a/src/tests/bundles/focal-wallaby.yaml b/src/tests/bundles/focal-wallaby.yaml new file mode 100644 index 0000000..84aaa85 --- /dev/null +++ b/src/tests/bundles/focal-wallaby.yaml @@ -0,0 +1,76 @@ +series: focal +variables: + openstack-origin: &openstack-origin cloud:focal-wallaby +comment: +- 'machines section to decide order of deployment. database sooner = faster' +machines: + '0': + constraints: mem=3072M + '1': + constraints: mem=3072M + '2': + constraints: mem=3072M + '3': + '4': + '5': + constraints: mem=4G root-disk=16G +relations: + - - keystone:shared-db + - keystone-mysql-router:shared-db + - - keystone-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:shared-db + - cinder-mysql-router:shared-db + - - cinder-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:identity-service + - keystone:identity-service + - - cinder:amqp + - rabbitmq-server:amqp + - - cinder:storage-backend + - cinder-netapp:storage-backend +applications: + mysql-innodb-cluster: + charm: cs:~openstack-charmers-next/mysql-innodb-cluster + num_units: 3 + options: + source: *openstack-origin + to: + - '0' + - '1' + - '2' + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + options: + source: *openstack-origin + to: + - '3' + keystone: + charm: cs:~openstack-charmers-next/keystone + options: + openstack-origin: *openstack-origin + num_units: 1 + to: + - '4' + keystone-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + cinder: + charm: cs:~openstack-charmers-next/cinder + storage: + block-devices: '40G' + num_units: 1 + options: + openstack-origin: *openstack-origin + block-device: None + overwrite: "true" + to: + - '5' + cinder-netapp: + charm: cinder-netapp + options: + netapp-storage-family: ontap_cluster + netapp-storage-protocol: iscsi + volume-backend-name: NETAPP + cinder-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router diff --git a/src/tests/bundles/focal-xena.yaml b/src/tests/bundles/focal-xena.yaml new file mode 100644 index 0000000..2b6d7f7 --- /dev/null +++ b/src/tests/bundles/focal-xena.yaml @@ -0,0 +1,76 @@ +series: focal +variables: + openstack-origin: &openstack-origin cloud:focal-xena +comment: +- 'machines section to decide order of deployment. database sooner = faster' +machines: + '0': + constraints: mem=3072M + '1': + constraints: mem=3072M + '2': + constraints: mem=3072M + '3': + '4': + '5': + constraints: mem=4G root-disk=16G +relations: + - - keystone:shared-db + - keystone-mysql-router:shared-db + - - keystone-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:shared-db + - cinder-mysql-router:shared-db + - - cinder-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:identity-service + - keystone:identity-service + - - cinder:amqp + - rabbitmq-server:amqp + - - cinder:storage-backend + - cinder-netapp:storage-backend +applications: + mysql-innodb-cluster: + charm: cs:~openstack-charmers-next/mysql-innodb-cluster + num_units: 3 + options: + source: *openstack-origin + to: + - '0' + - '1' + - '2' + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + options: + source: *openstack-origin + to: + - '3' + keystone: + charm: cs:~openstack-charmers-next/keystone + options: + openstack-origin: *openstack-origin + num_units: 1 + to: + - '4' + keystone-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + cinder: + charm: cs:~openstack-charmers-next/cinder + storage: + block-devices: '40G' + num_units: 1 + options: + openstack-origin: *openstack-origin + block-device: None + overwrite: "true" + to: + - '5' + cinder-netapp: + charm: cinder-netapp + options: + netapp-storage-family: ontap_cluster + netapp-storage-protocol: iscsi + volume-backend-name: NETAPP + cinder-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router diff --git a/src/tests/bundles/groovy-victoria.yaml b/src/tests/bundles/groovy-victoria.yaml new file mode 100644 index 0000000..3780a82 --- /dev/null +++ b/src/tests/bundles/groovy-victoria.yaml @@ -0,0 +1,76 @@ +series: groovy +variables: + openstack-origin: &openstack-origin distro +comment: +- 'machines section to decide order of deployment. database sooner = faster' +machines: + '0': + constraints: mem=3072M + '1': + constraints: mem=3072M + '2': + constraints: mem=3072M + '3': + '4': + '5': + constraints: mem=4G root-disk=16G +relations: + - - keystone:shared-db + - keystone-mysql-router:shared-db + - - keystone-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:shared-db + - cinder-mysql-router:shared-db + - - cinder-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:identity-service + - keystone:identity-service + - - cinder:amqp + - rabbitmq-server:amqp + - - cinder:storage-backend + - cinder-netapp:storage-backend +applications: + mysql-innodb-cluster: + charm: cs:~openstack-charmers-next/mysql-innodb-cluster + num_units: 3 + options: + source: *openstack-origin + to: + - '0' + - '1' + - '2' + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + options: + source: *openstack-origin + to: + - '3' + keystone: + charm: cs:~openstack-charmers-next/keystone + options: + openstack-origin: *openstack-origin + num_units: 1 + to: + - '4' + keystone-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + cinder: + charm: cs:~openstack-charmers-next/cinder + storage: + block-devices: '40G' + num_units: 1 + options: + openstack-origin: *openstack-origin + block-device: None + overwrite: "true" + to: + - '5' + cinder-netapp: + charm: cinder-netapp + options: + netapp-storage-family: ontap_cluster + netapp-storage-protocol: iscsi + volume-backend-name: NETAPP + cinder-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router diff --git a/src/tests/bundles/hirsute-wallaby.yaml b/src/tests/bundles/hirsute-wallaby.yaml new file mode 100644 index 0000000..d304567 --- /dev/null +++ b/src/tests/bundles/hirsute-wallaby.yaml @@ -0,0 +1,76 @@ +series: hirsute +variables: + openstack-origin: &openstack-origin distro +comment: +- 'machines section to decide order of deployment. database sooner = faster' +machines: + '0': + constraints: mem=3072M + '1': + constraints: mem=3072M + '2': + constraints: mem=3072M + '3': + '4': + '5': + constraints: mem=4G root-disk=16G +relations: + - - keystone:shared-db + - keystone-mysql-router:shared-db + - - keystone-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:shared-db + - cinder-mysql-router:shared-db + - - cinder-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:identity-service + - keystone:identity-service + - - cinder:amqp + - rabbitmq-server:amqp + - - cinder:storage-backend + - cinder-netapp:storage-backend +applications: + mysql-innodb-cluster: + charm: cs:~openstack-charmers-next/mysql-innodb-cluster + num_units: 3 + options: + source: *openstack-origin + to: + - '0' + - '1' + - '2' + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + options: + source: *openstack-origin + to: + - '3' + keystone: + charm: cs:~openstack-charmers-next/keystone + options: + openstack-origin: *openstack-origin + num_units: 1 + to: + - '4' + keystone-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + cinder: + charm: cs:~openstack-charmers-next/cinder + storage: + block-devices: '40G' + num_units: 1 + options: + openstack-origin: *openstack-origin + block-device: None + overwrite: "true" + to: + - '5' + cinder-netapp: + charm: cinder-netapp + options: + netapp-storage-family: ontap_cluster + netapp-storage-protocol: iscsi + volume-backend-name: NETAPP + cinder-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router diff --git a/src/tests/bundles/impish-xena.yaml b/src/tests/bundles/impish-xena.yaml new file mode 100644 index 0000000..39bba6c --- /dev/null +++ b/src/tests/bundles/impish-xena.yaml @@ -0,0 +1,76 @@ +series: impish +variables: + openstack-origin: &openstack-origin distro +comment: +- 'machines section to decide order of deployment. database sooner = faster' +machines: + '0': + constraints: mem=3072M + '1': + constraints: mem=3072M + '2': + constraints: mem=3072M + '3': + '4': + '5': + constraints: mem=4G root-disk=16G +relations: + - - keystone:shared-db + - keystone-mysql-router:shared-db + - - keystone-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:shared-db + - cinder-mysql-router:shared-db + - - cinder-mysql-router:db-router + - mysql-innodb-cluster:db-router + - - cinder:identity-service + - keystone:identity-service + - - cinder:amqp + - rabbitmq-server:amqp + - - cinder:storage-backend + - cinder-netapp:storage-backend +applications: + mysql-innodb-cluster: + charm: cs:~openstack-charmers-next/mysql-innodb-cluster + num_units: 3 + options: + source: *openstack-origin + to: + - '0' + - '1' + - '2' + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + options: + source: *openstack-origin + to: + - '3' + keystone: + charm: cs:~openstack-charmers-next/keystone + options: + openstack-origin: *openstack-origin + num_units: 1 + to: + - '4' + keystone-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + cinder: + charm: cs:~openstack-charmers-next/cinder + storage: + block-devices: '40G' + num_units: 1 + options: + openstack-origin: *openstack-origin + block-device: None + overwrite: "true" + to: + - '5' + cinder-netapp: + charm: cinder-netapp + options: + netapp-storage-family: ontap_cluster + netapp-storage-protocol: iscsi + volume-backend-name: NETAPP + cinder-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router diff --git a/src/tests/bundles/overlays/local-charm-overlay.yaml.j2 b/src/tests/bundles/overlays/local-charm-overlay.yaml.j2 new file mode 100644 index 0000000..5a2ceaa --- /dev/null +++ b/src/tests/bundles/overlays/local-charm-overlay.yaml.j2 @@ -0,0 +1,8 @@ +applications: + cinder-netapp: + options: + netapp-vserver: {{ NETAPP_VSERVER }} + netapp-server-hostname: {{ NETAPP_SERVER_HOSTNAME }} + netapp-server-port: {{ NETAPP_SERVER_PORT }} + netapp-login: {{ NETAPP_LOGIN }} + netapp-password: {{ NETAPP_PASSWORD }} diff --git a/src/tests/tests.yaml b/src/tests/tests.yaml index eceaa01..5a5fcbb 100644 --- a/src/tests/tests.yaml +++ b/src/tests/tests.yaml @@ -1,9 +1,24 @@ charm_name: cinder-netapp tests: - - tests.tests_cinder_netapp.CindernetappTest + - zaza.openstack.charm_tests.cinder_netapp.tests.CinderNetAppTest configure: - zaza.openstack.charm_tests.keystone.setup.add_demo_user gate_bundles: - - xenial-stein + - bionic-queens + - bionic-rocky + - bionic-stein + - bionic-train + - bionic-ussuri + - focal-ussuri + - focal-victoria + - focal-wallaby + - focal-xena + - groovy-victoria + - hirsute-wallaby smoke_bundles: - - xenial-stein + - bionic-ussuri +dev_bundles: + - impish-xena +test_options: + force_deploy: + - impish-xena diff --git a/src/tests/tests_cinder_netapp.py b/src/tests/tests_cinder_netapp.py deleted file mode 100644 index d96a860..0000000 --- a/src/tests/tests_cinder_netapp.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 - -# 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. - -"""Encapsulate cinder-netapp testing.""" - -import logging -import uuid - -import zaza.model -import zaza.openstack.charm_tests.test_utils as test_utils -import zaza.openstack.utilities.openstack as openstack_utils - - -class CindernetappTest(test_utils.OpenStackBaseTest): - """Encapsulate netapp tests.""" - - @classmethod - def setUpClass(cls): - """Run class setup for running tests.""" - super(CindernetappTest, cls).setUpClass() - cls.keystone_session = openstack_utils.get_overcloud_keystone_session() - cls.model_name = zaza.model.get_juju_model() - cls.cinder_client = openstack_utils.get_cinder_session_client( - cls.keystone_session) - - def test_cinder_config(self): - logging.info('netapp') - expected_contents = { - 'cinder-netapp': { - 'iscsi_helper': ['tgtadm'], - 'volume_dd_blocksize': ['512']}} - - zaza.model.run_on_leader( - 'cinder', - 'sudo cp /etc/cinder/cinder.conf /tmp/', - model_name=self.model_name) - zaza.model.block_until_oslo_config_entries_match( - 'cinder', - '/tmp/cinder.conf', - expected_contents, - model_name=self.model_name, - timeout=2) - - def test_create_volume(self): - test_vol_name = "zaza{}".format(uuid.uuid1().fields[0]) - vol_new = self.cinder_client.volumes.create( - name=test_vol_name, - size=2) - openstack_utils.resource_reaches_status( - self.cinder_client.volumes, - vol_new.id, - expected_status='available') - test_vol = self.cinder_client.volumes.find(name=test_vol_name) - self.assertEqual( - getattr(test_vol, 'os-vol-host-attr:host').split('#')[0], - 'cinder@cinder-netapp') - self.cinder_client.volumes.delete(vol_new) diff --git a/src/tox.ini b/src/tox.ini index ce45106..b40d295 100644 --- a/src/tox.ini +++ b/src/tox.ini @@ -1,25 +1,46 @@ +# 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 skipsdist = True +# 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 +# NOTES: +# * We avoid the new dependency resolver by pinning pip < 20.3, see +# https://github.com/pypa/pip/issues/9187 +# * Pinning dependencies requires tox >= 3.2.0, see +# https://tox.readthedocs.io/en/latest/config.html#conf-requires +# * It is also necessary to pin virtualenv as a newer virtualenv would still +# lead to fetching the latest pip in the func* tox targets, see +# https://stackoverflow.com/a/38133283 +requires = pip < 20.3 + virtualenv < 20.0 +# NOTE: https://wiki.canonical.com/engineering/OpenStack/InstallLatestToxOnOsci +minversion = 3.18.0 [testenv] setenv = VIRTUAL_ENV={envdir} PYTHONHASHSEED=0 -whitelist_externals = juju -passenv = HOME TERM CS_API_* OS_* AMULET_* +allowlist_externals = juju +passenv = HOME TERM CS_* OS_* TEST_* deps = -r{toxinidir}/test-requirements.txt install_command = pip install {opts} {packages} [testenv:pep8] basepython = python3 -deps=charm-tools commands = charm-proof [testenv:func-noop] basepython = python3 commands = - true + functest-run-suite --help [testenv:func] basepython = python3 @@ -31,5 +52,10 @@ 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 index ebd9154..7ea207d 100644 --- a/src/wheelhouse.txt +++ b/src/wheelhouse.txt @@ -1,2 +1,3 @@ #layer-basic uses wheelhouse to install python dependencies -psutil \ No newline at end of file +psutil +git+https://github.com/juju/charm-helpers.git#egg=charmhelpers diff --git a/test-requirements.txt b/test-requirements.txt index 7d9c258..af069e1 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -3,16 +3,49 @@ # choices of *requirements.txt files for OpenStack Charms: # https://github.com/openstack-charmers/release-tools # -# TODO: Distill the func test requirements from the lint/unit test -# requirements. They are intertwined. Also, Zaza itself should specify -# all of its own requirements and if it doesn't, fix it there. -# -charm-tools>=2.4.4 -requests>=2.18.4 -mock>=1.2 -flake8>=2.2.4,<=2.4.1 +setuptools<50.0.0 # https://github.com/pypa/setuptools/commit/04e3df22df840c6bb244e9b27bc56750c44b7c85 + stestr>=2.2.0 -coverage>=4.5.2 -pyudev # for ceph-* charm unit tests (need to fix the ceph-* charm unit tests/mocking) -git+https://github.com/openstack-charmers/zaza.git#egg=zaza;python_version>='3.0' -git+https://github.com/openstack-charmers/zaza-openstack-tests.git#egg=zaza.openstack + +# Dependency of stestr. Workaround for +# https://github.com/mtreinish/stestr/issues/145 +cliff<3.0.0 + +# Dependencies of stestr. Newer versions use keywords that didn't exist in +# python 3.5 yet (e.g. "ModuleNotFoundError") +importlib-metadata<3.0.0; python_version < '3.6' +importlib-resources<3.0.0; python_version < '3.6' + +# Some Zuul nodes sometimes pull newer versions of these dependencies which +# dropped support for python 3.5: +osprofiler<2.7.0;python_version<'3.6' +stevedore<1.31.0;python_version<'3.6' +debtcollector<1.22.0;python_version<'3.6' +oslo.utils<=3.41.0;python_version<'3.6' + +requests>=2.18.4 +charms.reactive + +# Newer mock seems to have some syntax which is newer than python3.5 (e.g. +# f'{something}' +mock>=1.2,<4.0.0; python_version < '3.6' +mock>=1.2; python_version >= '3.6' + +nose>=1.3.7 +coverage>=3.6 +git+https://github.com/openstack/charms.openstack.git#egg=charms.openstack +# +# Revisit for removal / mock improvement: +# +# NOTE(lourot): newer versions of cryptography require a Rust compiler to build, +# see +# * https://github.com/openstack-charmers/zaza/issues/421 +# * https://mail.python.org/pipermail/cryptography-dev/2021-January/001003.html +# +netifaces # vault +psycopg2-binary # vault +tenacity # vault +pbr==5.6.0 # vault +cryptography<3.4 # vault, keystone-saml-mellon +lxml # keystone-saml-mellon +hvac # vault, barbican-vault diff --git a/tox.ini b/tox.ini index b835733..22159df 100644 --- a/tox.ini +++ b/tox.ini @@ -1,62 +1,85 @@ -# Classic charm (with zaza): ./tox.ini +# 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 -# -# TODO: Distill the func test requirements from the lint/unit test -# requirements. They are intertwined. Also, Zaza itself should specify -# all of its own requirements and if it doesn't, fix it there. + [tox] -envlist = pep8,py3 skipsdist = True +envlist = pep8,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 +# NOTES: +# * We avoid the new dependency resolver by pinning pip < 20.3, see +# https://github.com/pypa/pip/issues/9187 +# * Pinning dependencies requires tox >= 3.2.0, see +# https://tox.readthedocs.io/en/latest/config.html#conf-requires +# * It is also necessary to pin virtualenv as a newer virtualenv would still +# lead to fetching the latest pip in the func* tox targets, see +# https://stackoverflow.com/a/38133283 +requires = + pip < 20.3 + virtualenv < 20.0 + setuptools<50.0.0 + +# NOTE: https://wiki.canonical.com/engineering/OpenStack/InstallLatestToxOnOsci +minversion = 3.18.0 [testenv] setenv = VIRTUAL_ENV={envdir} PYTHONHASHSEED=0 - CHARM_DIR={envdir} + TERM=linux + LAYER_PATH={toxinidir}/layers + INTERFACE_PATH={toxinidir}/interfaces + JUJU_REPOSITORY={toxinidir}/build +passenv = http_proxy https_proxy INTERFACE_PATH LAYER_PATH JUJU_REPOSITORY install_command = - pip install {opts} {packages} -commands = stestr run --slowest {posargs} -whitelist_externals = juju -passenv = HOME TERM CS_* OS_* TEST_* -deps = -r{toxinidir}/test-requirements.txt + {toxinidir}/pip.sh install {opts} {packages} +deps = + -r{toxinidir}/requirements.txt -[testenv:py35] -basepython = python3.5 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt +[testenv:build] +basepython = python3 +commands = + charm-build --log-level DEBUG --use-lock-file-branches -o {toxinidir}/build/builds src {posargs} -[testenv:py36] -basepython = python3.6 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -[testenv:py37] -basepython = python3.7 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -[testenv:py38] -basepython = python3.8 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt +[testenv:add-build-lock-file] +basepython = python3 +commands = + charm-build --log-level DEBUG --write-lock-file -o {toxinidir}/build/builds src {posargs} [testenv:py3] basepython = python3 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt +deps = -r{toxinidir}/test-requirements.txt +commands = stestr run --slowest {posargs} + +[testenv:py35] +basepython = python3.5 +deps = -r{toxinidir}/test-requirements.txt +commands = stestr run --slowest {posargs} + +[testenv:py36] +basepython = python3.6 +deps = -r{toxinidir}/test-requirements.txt +commands = stestr run --slowest {posargs} + +[testenv:py37] +basepython = python3.7 +deps = -r{toxinidir}/test-requirements.txt +commands = stestr run --slowest {posargs} + +[testenv:py38] +basepython = python3.8 +deps = -r{toxinidir}/test-requirements.txt +commands = stestr run --slowest {posargs} [testenv:pep8] basepython = python3 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt -commands = flake8 {posargs} hooks unit_tests tests actions lib files - charm-proof +deps = flake8==3.9.2 + charm-tools==2.8.3 +commands = flake8 {posargs} src unit_tests [testenv:cover] # Technique based heavily upon @@ -90,31 +113,6 @@ omit = basepython = python3 commands = {posargs} -[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-dev] -basepython = python3 -commands = - functest-run-suite --keep-model --dev - -[testenv:func-target] -basepython = python3 -commands = - functest-run-suite --keep-model --bundle {posargs} - [flake8] -ignore = E402,E226 -exclude = */charmhelpers +# E402 ignore necessary for path append before sys module import in actions +ignore = E402,W503,W504 diff --git a/unit_tests/test_lib_charm_openstack_cinder_netapp.py b/unit_tests/test_lib_charm_openstack_cinder_netapp.py index a4f73a7..1b782d3 100644 --- a/unit_tests/test_lib_charm_openstack_cinder_netapp.py +++ b/unit_tests/test_lib_charm_openstack_cinder_netapp.py @@ -1,4 +1,4 @@ -# Copyright 2016 Canonical Ltd +# 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. @@ -36,13 +36,45 @@ class TestCinderNetAppCharm(test_utils.PatchHelper): def test_cinder_base(self): charm = self._patch_config_and_charm({}) self.assertEqual(charm.name, 'cinder_netapp') + self.assertTrue(charm.stateless) + config = {k: v for (k, v) in charm.cinder_configuration()} + self.assertIn('netapp_storage_family', config) + self.assertIsNone(config['netapp_storage_family']) + self.assertIn('netapp_storage_protocol', config) + self.assertIsNone(config['netapp_storage_protocol']) + self.assertIn('netapp_server_hostname', config) + self.assertIsNone(config['netapp_server_hostname']) + self.assertIn('volume_backend_name', config) + self.assertIsNone(config['volume_backend_name']) + self.assertEqual(config.get('volume_driver'), + 'cinder.volume.drivers.netapp.common.NetAppDriver') - def test_cinder_configuration(self): - charm = self._patch_config_and_charm({'a': 'b'}) + def test_cinder_https(self): + charm = self._patch_config_and_charm({'netapp-server-port': 443}) config = charm.cinder_configuration() - # Add check here that configuration is as expected. - self.assertEqual(config, [('netapp_hostname', None), - ('netapp_login', None), - ('netapp_password', None), - ('volume_driver', None), - ('volume_backend_name', None)]) + self.assertIn(('netapp_transport_type', 'https'), config) + + def test_cinder_eseries(self): + econfig = {'netapp-storage-family': 'eseries', + 'netapp-controller-ips': '10.0.0.1', + 'netapp-array-password': 'abc123', + 'netapp-storage-pools': 'somePool', + 'use-multipath': True} + charm = self._patch_config_and_charm(econfig) + config = charm.cinder_configuration() + self.assertIn(('netapp_controller_ips', + econfig['netapp-controller-ips']), config) + self.assertIn(('netapp_sa_password', + econfig['netapp-array-password']), config) + self.assertIn(('netapp_storage_pools', + econfig['netapp-storage-pools']), config) + self.assertIn(('use_multipath_for_image_xfer', + econfig['use-multipath']), config) + self.assertFalse(any(q[0] == 'nfs_shares_config' for q in config)) + + econfig = {'netapp-storage-protocol': 'nfs', + 'netapp-nfs-shares-config': 'NFSCONFIG'} + charm = self._patch_config_and_charm(econfig) + config = charm.cinder_configuration() + self.assertIn(('nfs_shares_config', + econfig['netapp-nfs-shares-config']), config)