diff --git a/src/README.md b/src/README.md index 9ba5b3d..be9ac37 100644 --- a/src/README.md +++ b/src/README.md @@ -4,11 +4,8 @@ This subordinate charm provides the [Arista ML2 Plugin][python-networking-arista] support to the [OpenStack Neutron API service][charm-neutron-api]. -> **Notes**: -> * For now the neutron-api-plugin-arista charm is only supported up to -> OpenStack Queens. -> * For upgrading from earlier prototypes of this charm see -> [Upgrading to stable charm][upgrading-to-stable]. +> **Note**: For upgrading from earlier prototypes of this charm see +> [Upgrading to stable charm][upgrading-to-stable]. When this charm is related to the neutron-api charm it will install the Arista Neutron packages on each neutron-api unit in the region and supply the desired diff --git a/src/config.yaml b/src/config.yaml index 9d73c81..1739ce6 100644 --- a/src/config.yaml +++ b/src/config.yaml @@ -4,10 +4,6 @@ options: type: string description: | Repository from which to install. Ex: ppa:canonical-arista/stable - arista-version: - default: '2017.2.2' - type: string - description: Arista Driver version eapi-host: default: type: string diff --git a/src/lib/charm/openstack/neutron_arista.py b/src/lib/charm/openstack/neutron_arista.py index 520242b..052cf44 100644 --- a/src/lib/charm/openstack/neutron_arista.py +++ b/src/lib/charm/openstack/neutron_arista.py @@ -13,16 +13,14 @@ from charmhelpers.fetch import ( ) -class NeutronAristaCharm(charms_openstack.charm.OpenStackCharm): +class BaseNeutronAristaCharm(charms_openstack.charm.OpenStackCharm): + abstract_class = True # Internal name of charm service_name = name = 'neutron-api-plugin-arista' - # First release supported - release = 'queens' - - # List of packages to install for this charm - packages = ['python-networking-arista'] + # Package to be used to determine the OpenStack release: + release_pkg = version_package = 'neutron-common' def install(self): log('Starting arista installation') @@ -31,3 +29,25 @@ class NeutronAristaCharm(charms_openstack.charm.OpenStackCharm): add_source(config('source')) apt_update(fatal=True) apt_install(self.packages[0], fatal=True) + + +class QueensNeutronAristaCharm(BaseNeutronAristaCharm): + """The Queens incarnation of the charm.""" + abstract_class = False + + release = 'queens' + python_version = 2 + + # List of packages to install for this charm + packages = ['python-networking-arista'] + + +class RockyNeutronAristaCharm(BaseNeutronAristaCharm): + """The Rocky incarnation of the charm.""" + abstract_class = False + + release = 'rocky' + python_version = 3 + + # List of packages to install for this charm + packages = ['python3-networking-arista'] diff --git a/src/reactive/neutron_arista_handlers.py b/src/reactive/neutron_arista_handlers.py index c4f1faa..f457853 100644 --- a/src/reactive/neutron_arista_handlers.py +++ b/src/reactive/neutron_arista_handlers.py @@ -25,7 +25,10 @@ from charms_openstack.charm import ( ) -use_defaults('update-status') +use_defaults( + 'charm.default-select-release', + 'update-status', +) @reactive.when_not('arista-package.installed') diff --git a/src/tests/bundles/bionic-queens.yaml b/src/tests/bundles/bionic-queens.yaml index cfd46d8..8d8ba8e 100644 --- a/src/tests/bundles/bionic-queens.yaml +++ b/src/tests/bundles/bionic-queens.yaml @@ -1,14 +1,21 @@ -series: bionic +variables: + openstack-origin: &openstack-origin distro + +series: &series bionic applications: glance: charm: cs:~openstack-charmers-next/glance num_units: 1 + options: + openstack-origin: *openstack-origin keystone: charm: cs:~openstack-charmers-next/keystone num_units: 1 + options: + openstack-origin: *openstack-origin mysql: charm: cs:~openstack-charmers-next/percona-cluster @@ -18,6 +25,7 @@ applications: charm: cs:~openstack-charmers-next/neutron-api num_units: 1 options: + openstack-origin: *openstack-origin enable-ml2-dns: False flat-network-providers: default vlan-ranges: default:1000:3000 @@ -49,6 +57,7 @@ applications: charm: cs:~openstack-charmers-next/nova-cloud-controller num_units: 1 options: + openstack-origin: *openstack-origin network-manager: Neutron neutron-api-plugin-arista: @@ -67,6 +76,7 @@ applications: num_units: 2 constraints: mem=4G cores=4 options: + openstack-origin: *openstack-origin config-flags: default_ephemeral_format=ext4 enable-live-migration: true enable-resize: true @@ -76,10 +86,6 @@ applications: charm: cs:~openstack-charmers-next/rabbitmq-server num_units: 1 - openstack-dashboard: - charm: cs:openstack-dashboard - num_units: 1 - lldpd: charm: cs:lldpd options: @@ -131,9 +137,5 @@ relations: - neutron-api-plugin-arista - - neutron-api:neutron-plugin-api-subordinate - neutron-api-plugin-arista:neutron-plugin-api-subordinate -- - openstack-dashboard - - mysql -- - openstack-dashboard:identity-service - - keystone:identity-service - - lldpd - nova-compute diff --git a/src/tests/bundles/bionic-rocky.yaml b/src/tests/bundles/bionic-rocky.yaml index d82441a..d5a65e5 100644 --- a/src/tests/bundles/bionic-rocky.yaml +++ b/src/tests/bundles/bionic-rocky.yaml @@ -1,4 +1,7 @@ -series: bionic +variables: + openstack-origin: &openstack-origin cloud:bionic-rocky + +series: &series bionic applications: @@ -6,13 +9,13 @@ applications: charm: cs:~openstack-charmers-next/glance num_units: 1 options: - openstack-origin: cloud:bionic-rocky + openstack-origin: *openstack-origin keystone: charm: cs:~openstack-charmers-next/keystone num_units: 1 options: - openstack-origin: cloud:bionic-rocky + openstack-origin: *openstack-origin mysql: charm: cs:~openstack-charmers-next/percona-cluster @@ -22,7 +25,7 @@ applications: charm: cs:~openstack-charmers-next/neutron-api num_units: 1 options: - openstack-origin: cloud:bionic-rocky + openstack-origin: *openstack-origin enable-ml2-dns: False flat-network-providers: default vlan-ranges: default:1000:3000 @@ -54,13 +57,16 @@ applications: charm: cs:~openstack-charmers-next/nova-cloud-controller num_units: 1 options: - openstack-origin: cloud:bionic-rocky + openstack-origin: *openstack-origin network-manager: Neutron neutron-api-plugin-arista: charm: ../../../neutron-api-plugin-arista num_units: 0 options: + # Contains fix https://review.opendev.org/743740 + source: ppa:aurelien-lourot/arista-rocky + # Fake IP, will be set to arista-virt-test-fixture's IP address on test # setup: eapi-host: 192.0.2.42 @@ -73,7 +79,7 @@ applications: num_units: 2 constraints: mem=4G cores=4 options: - openstack-origin: cloud:bionic-rocky + openstack-origin: *openstack-origin config-flags: default_ephemeral_format=ext4 enable-live-migration: true enable-resize: true @@ -83,12 +89,6 @@ applications: charm: cs:~openstack-charmers-next/rabbitmq-server num_units: 1 - openstack-dashboard: - charm: cs:openstack-dashboard - num_units: 1 - options: - openstack-origin: cloud:bionic-rocky - lldpd: charm: cs:lldpd options: @@ -140,9 +140,5 @@ relations: - neutron-api-plugin-arista - - neutron-api:neutron-plugin-api-subordinate - neutron-api-plugin-arista:neutron-plugin-api-subordinate -- - openstack-dashboard - - mysql -- - openstack-dashboard:identity-service - - keystone:identity-service - - lldpd - nova-compute diff --git a/src/tests/bundles/bionic-stein.yaml b/src/tests/bundles/bionic-stein.yaml new file mode 100644 index 0000000..fe74bfb --- /dev/null +++ b/src/tests/bundles/bionic-stein.yaml @@ -0,0 +1,144 @@ +variables: + openstack-origin: &openstack-origin cloud:bionic-stein + +series: &series bionic + +applications: + + glance: + charm: cs:~openstack-charmers-next/glance + num_units: 1 + options: + openstack-origin: *openstack-origin + + keystone: + charm: cs:~openstack-charmers-next/keystone + num_units: 1 + options: + openstack-origin: *openstack-origin + + mysql: + charm: cs:~openstack-charmers-next/percona-cluster + num_units: 1 + + neutron-api: + charm: cs:~openstack-charmers-next/neutron-api + num_units: 1 + options: + openstack-origin: *openstack-origin + enable-ml2-dns: False + flat-network-providers: default + vlan-ranges: default:1000:3000 + vni-ranges: 1001:2000 + neutron-security-groups: True + overlay-network-type: vxlan + use-internal-endpoints: True + enable-l3ha: True + dhcp-agents-per-network: 2 + enable-ml2-port-security: True + default-tenant-network-type: vlan + l2-population: False + ipv4-ptr-zone-prefix-size: + reverse-dns-lookup: False + dns-domain: + manage-neutron-plugin-legacy-mode: False + + neutron-openvswitch: + charm: cs:~openstack-charmers-next/neutron-openvswitch + num_units: 0 + options: + prevent-arp-spoofing: True + firewall-driver: openvswitch + enable-local-dhcp-and-metadata: True + bridge-mappings: default:br-data + data-port: ens7 + + nova-cloud-controller: + charm: cs:~openstack-charmers-next/nova-cloud-controller + num_units: 1 + options: + openstack-origin: *openstack-origin + network-manager: Neutron + + neutron-api-plugin-arista: + charm: ../../../neutron-api-plugin-arista + num_units: 0 + options: + # Contains fix https://review.opendev.org/743740 + source: ppa:aurelien-lourot/arista-stein + + # Fake IP, will be set to arista-virt-test-fixture's IP address on test + # setup: + eapi-host: 192.0.2.42 + eapi-username: admin + eapi-password: password123 + api-type: EAPI + + nova-compute: + charm: cs:~openstack-charmers-next/nova-compute + num_units: 2 + constraints: mem=4G cores=4 + options: + openstack-origin: *openstack-origin + config-flags: default_ephemeral_format=ext4 + enable-live-migration: true + enable-resize: true + migration-auth-type: ssh + + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + + lldpd: + charm: cs:lldpd + options: + interfaces-regex: 'en*' + short-name: true + + arista-virt-test-fixture: + charm: cs:~openstack-charmers-next/arista-virt-test-fixture + num_units: 1 + +relations: +- - nova-compute:amqp + - rabbitmq-server:amqp +- - keystone:shared-db + - mysql:shared-db +- - nova-cloud-controller:identity-service + - keystone:identity-service +- - glance:identity-service + - keystone:identity-service +- - neutron-api:identity-service + - keystone:identity-service +- - neutron-openvswitch:neutron-plugin-api + - neutron-api:neutron-plugin-api +- - neutron-api:shared-db + - mysql:shared-db +- - neutron-api:amqp + - rabbitmq-server:amqp +- - glance:shared-db + - mysql:shared-db +- - glance:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:image-service + - glance:image-service +- - nova-compute:image-service + - glance:image-service +- - nova-cloud-controller:cloud-compute + - nova-compute:cloud-compute +- - nova-cloud-controller:amqp + - rabbitmq-server:amqp +- - nova-compute:neutron-plugin + - neutron-openvswitch:neutron-plugin +- - neutron-openvswitch:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:shared-db + - mysql:shared-db +- - nova-cloud-controller:neutron-api + - neutron-api:neutron-api +- - neutron-api + - neutron-api-plugin-arista +- - neutron-api:neutron-plugin-api-subordinate + - neutron-api-plugin-arista:neutron-plugin-api-subordinate +- - lldpd + - nova-compute diff --git a/src/tests/bundles/bionic-train.yaml b/src/tests/bundles/bionic-train.yaml new file mode 100644 index 0000000..e435925 --- /dev/null +++ b/src/tests/bundles/bionic-train.yaml @@ -0,0 +1,156 @@ +variables: + openstack-origin: &openstack-origin cloud:bionic-train + +series: &series bionic + +applications: + + glance: + charm: cs:~openstack-charmers-next/glance + num_units: 1 + options: + openstack-origin: *openstack-origin + + keystone: + charm: cs:~openstack-charmers-next/keystone + num_units: 1 + options: + openstack-origin: *openstack-origin + + mysql: + charm: cs:~openstack-charmers-next/percona-cluster + num_units: 1 + + neutron-api: + charm: cs:~openstack-charmers-next/neutron-api + num_units: 1 + options: + openstack-origin: *openstack-origin + enable-ml2-dns: False + flat-network-providers: default + vlan-ranges: default:1000:3000 + vni-ranges: 1001:2000 + neutron-security-groups: True + overlay-network-type: vxlan + use-internal-endpoints: True + enable-l3ha: True + dhcp-agents-per-network: 2 + enable-ml2-port-security: True + default-tenant-network-type: vlan + l2-population: False + ipv4-ptr-zone-prefix-size: + reverse-dns-lookup: False + dns-domain: + manage-neutron-plugin-legacy-mode: False + + neutron-openvswitch: + charm: cs:~openstack-charmers-next/neutron-openvswitch + num_units: 0 + options: + prevent-arp-spoofing: True + firewall-driver: openvswitch + enable-local-dhcp-and-metadata: True + bridge-mappings: default:br-data + data-port: ens7 + + nova-cloud-controller: + charm: cs:~openstack-charmers-next/nova-cloud-controller + num_units: 1 + options: + openstack-origin: *openstack-origin + network-manager: Neutron + + neutron-api-plugin-arista: + charm: ../../../neutron-api-plugin-arista + num_units: 0 + options: + # Contains fix https://review.opendev.org/743740 + source: ppa:aurelien-lourot/arista-train + + # Fake IP, will be set to arista-virt-test-fixture's IP address on test + # setup: + eapi-host: 192.0.2.42 + eapi-username: admin + eapi-password: password123 + api-type: EAPI + + placement: + charm: cs:~openstack-charmers-next/placement + num_units: 1 + options: + openstack-origin: *openstack-origin + + nova-compute: + charm: cs:~openstack-charmers-next/nova-compute + num_units: 2 + constraints: mem=4G cores=4 + options: + openstack-origin: *openstack-origin + config-flags: default_ephemeral_format=ext4 + enable-live-migration: true + enable-resize: true + migration-auth-type: ssh + + rabbitmq-server: + charm: cs:~openstack-charmers-next/rabbitmq-server + num_units: 1 + + lldpd: + charm: cs:lldpd + options: + interfaces-regex: 'en*' + short-name: true + + arista-virt-test-fixture: + charm: cs:~openstack-charmers-next/arista-virt-test-fixture + num_units: 1 + +relations: +- - nova-compute:amqp + - rabbitmq-server:amqp +- - keystone:shared-db + - mysql:shared-db +- - nova-cloud-controller:identity-service + - keystone:identity-service +- - glance:identity-service + - keystone:identity-service +- - neutron-api:identity-service + - keystone:identity-service +- - neutron-openvswitch:neutron-plugin-api + - neutron-api:neutron-plugin-api +- - neutron-api:shared-db + - mysql:shared-db +- - neutron-api:amqp + - rabbitmq-server:amqp +- - glance:shared-db + - mysql:shared-db +- - glance:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:image-service + - glance:image-service +- - nova-compute:image-service + - glance:image-service +- - nova-cloud-controller:cloud-compute + - nova-compute:cloud-compute +- - nova-cloud-controller:amqp + - rabbitmq-server:amqp +- - nova-compute:neutron-plugin + - neutron-openvswitch:neutron-plugin +- - neutron-openvswitch:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:shared-db + - mysql:shared-db +- - nova-cloud-controller:neutron-api + - neutron-api:neutron-api +- - neutron-api + - neutron-api-plugin-arista +- - neutron-api:neutron-plugin-api-subordinate + - neutron-api-plugin-arista:neutron-plugin-api-subordinate +- - lldpd + - nova-compute +- - placement:shared-db + - mysql:shared-db +- - placement:identity-service + - keystone:identity-service +- - placement:placement + - nova-cloud-controller:placement diff --git a/src/tests/bundles/overlays/arista-virt-test-fixture-image.yaml.j2 b/src/tests/bundles/overlays/arista-virt-test-fixture-image.yaml.j2 new file mode 100644 index 0000000..91393aa --- /dev/null +++ b/src/tests/bundles/overlays/arista-virt-test-fixture-image.yaml.j2 @@ -0,0 +1,4 @@ +applications: + arista-virt-test-fixture: + resources: + arista-image: '{{ TEST_ARISTA_IMAGE_LOCAL }}' diff --git a/src/tests/bundles/overlays/bionic-queens.yaml.j2 b/src/tests/bundles/overlays/bionic-queens.yaml.j2 deleted file mode 100644 index 91393aa..0000000 --- a/src/tests/bundles/overlays/bionic-queens.yaml.j2 +++ /dev/null @@ -1,4 +0,0 @@ -applications: - arista-virt-test-fixture: - resources: - arista-image: '{{ TEST_ARISTA_IMAGE_LOCAL }}' diff --git a/src/tests/bundles/overlays/bionic-queens.yaml.j2 b/src/tests/bundles/overlays/bionic-queens.yaml.j2 new file mode 120000 index 0000000..4dfadc8 --- /dev/null +++ b/src/tests/bundles/overlays/bionic-queens.yaml.j2 @@ -0,0 +1 @@ +arista-virt-test-fixture-image.yaml.j2 \ No newline at end of file diff --git a/src/tests/bundles/overlays/bionic-rocky.yaml.j2 b/src/tests/bundles/overlays/bionic-rocky.yaml.j2 deleted file mode 100644 index 91393aa..0000000 --- a/src/tests/bundles/overlays/bionic-rocky.yaml.j2 +++ /dev/null @@ -1,4 +0,0 @@ -applications: - arista-virt-test-fixture: - resources: - arista-image: '{{ TEST_ARISTA_IMAGE_LOCAL }}' diff --git a/src/tests/bundles/overlays/bionic-rocky.yaml.j2 b/src/tests/bundles/overlays/bionic-rocky.yaml.j2 new file mode 120000 index 0000000..4dfadc8 --- /dev/null +++ b/src/tests/bundles/overlays/bionic-rocky.yaml.j2 @@ -0,0 +1 @@ +arista-virt-test-fixture-image.yaml.j2 \ No newline at end of file diff --git a/src/tests/bundles/overlays/bionic-stein.yaml.j2 b/src/tests/bundles/overlays/bionic-stein.yaml.j2 new file mode 120000 index 0000000..4dfadc8 --- /dev/null +++ b/src/tests/bundles/overlays/bionic-stein.yaml.j2 @@ -0,0 +1 @@ +arista-virt-test-fixture-image.yaml.j2 \ No newline at end of file diff --git a/src/tests/bundles/overlays/bionic-train.yaml.j2 b/src/tests/bundles/overlays/bionic-train.yaml.j2 new file mode 120000 index 0000000..4dfadc8 --- /dev/null +++ b/src/tests/bundles/overlays/bionic-train.yaml.j2 @@ -0,0 +1 @@ +arista-virt-test-fixture-image.yaml.j2 \ No newline at end of file diff --git a/src/tests/bundles/overlays/xenial-queens.yaml.j2 b/src/tests/bundles/overlays/xenial-queens.yaml.j2 deleted file mode 100644 index 91393aa..0000000 --- a/src/tests/bundles/overlays/xenial-queens.yaml.j2 +++ /dev/null @@ -1,4 +0,0 @@ -applications: - arista-virt-test-fixture: - resources: - arista-image: '{{ TEST_ARISTA_IMAGE_LOCAL }}' diff --git a/src/tests/bundles/overlays/xenial-queens.yaml.j2 b/src/tests/bundles/overlays/xenial-queens.yaml.j2 new file mode 120000 index 0000000..4dfadc8 --- /dev/null +++ b/src/tests/bundles/overlays/xenial-queens.yaml.j2 @@ -0,0 +1 @@ +arista-virt-test-fixture-image.yaml.j2 \ No newline at end of file diff --git a/src/tests/bundles/xenial-queens.yaml b/src/tests/bundles/xenial-queens.yaml index d4bab82..2544a8f 100644 --- a/src/tests/bundles/xenial-queens.yaml +++ b/src/tests/bundles/xenial-queens.yaml @@ -1,4 +1,7 @@ -series: xenial +variables: + openstack-origin: &openstack-origin cloud:xenial-queens + +series: &series xenial applications: @@ -6,13 +9,13 @@ applications: charm: cs:~openstack-charmers-next/glance num_units: 1 options: - openstack-origin: cloud:xenial-queens + openstack-origin: *openstack-origin keystone: charm: cs:~openstack-charmers-next/keystone num_units: 1 options: - openstack-origin: cloud:xenial-queens + openstack-origin: *openstack-origin mysql: charm: cs:~openstack-charmers-next/percona-cluster @@ -22,7 +25,7 @@ applications: charm: cs:~openstack-charmers-next/neutron-api num_units: 1 options: - openstack-origin: cloud:xenial-queens + openstack-origin: *openstack-origin enable-ml2-dns: False flat-network-providers: default vlan-ranges: default:1000:3000 @@ -54,7 +57,7 @@ applications: charm: cs:~openstack-charmers-next/nova-cloud-controller num_units: 1 options: - openstack-origin: cloud:xenial-queens + openstack-origin: *openstack-origin network-manager: Neutron neutron-api-plugin-arista: @@ -73,7 +76,7 @@ applications: num_units: 2 constraints: mem=4G cores=4 options: - openstack-origin: cloud:xenial-queens + openstack-origin: *openstack-origin config-flags: default_ephemeral_format=ext4 enable-live-migration: true enable-resize: true @@ -83,12 +86,6 @@ applications: charm: cs:~openstack-charmers-next/rabbitmq-server num_units: 1 - openstack-dashboard: - charm: cs:openstack-dashboard - num_units: 1 - options: - openstack-origin: cloud:xenial-queens - lldpd: charm: cs:lldpd options: @@ -140,9 +137,5 @@ relations: - neutron-api-plugin-arista - - neutron-api:neutron-plugin-api-subordinate - neutron-api-plugin-arista:neutron-plugin-api-subordinate -- - openstack-dashboard - - mysql -- - openstack-dashboard:identity-service - - keystone:identity-service - - lldpd - nova-compute diff --git a/src/tests/tests.yaml b/src/tests/tests.yaml index 97d8924..70ade99 100644 --- a/src/tests/tests.yaml +++ b/src/tests/tests.yaml @@ -1,14 +1,12 @@ charm_name: neutron-api-plugin-arista smoke_bundles: -- bionic-queens +- bionic-train gate_bundles: - xenial-queens - bionic-queens - -# NOTE(lourot): on bionic-rocky neutron-server fails to start with: -# neutron.plugins.ml2.managers The following mechanism drivers were not found: set(['hyperv']) -# Disabling for now. To be investigated. -#- bionic-rocky +- bionic-rocky +- bionic-stein +- bionic-train before_deploy: - zaza.openstack.charm_tests.neutron_arista.setup.download_arista_image diff --git a/unit_tests/test_lib_charm_openstack_neutron_arista.py b/unit_tests/test_lib_charm_openstack_neutron_arista.py deleted file mode 100644 index eec24eb..0000000 --- a/unit_tests/test_lib_charm_openstack_neutron_arista.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright 2016 Canonical Ltd -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import absolute_import -from __future__ import print_function - -import unittest - -import mock - - -def FakeConfig(init_dict): - - def _config(key=None): - return init_dict[key] if key else init_dict - - return _config - - -class Helper(unittest.TestCase): - - def setUp(self): - self._patches = {} - self._patches_start = {} - self.ch_config_patch = mock.patch('charmhelpers.core.hookenv.config') - self.ch_config = self.ch_config_patch.start() - self.ch_config.side_effect = lambda: {'ssl_param': None} - - def tearDown(self): - for k, v in self._patches.items(): - v.stop() - setattr(self, k, None) - self._patches = None - self._patches_start = None - self.ch_config_patch.stop() - - def patch(self, obj, attr, return_value=None, **kwargs): - mocked = mock.patch.object(obj, attr, **kwargs) - self._patches[attr] = mocked - started = mocked.start() - started.return_value = return_value - self._patches_start[attr] = started - setattr(self, attr, started) - - def patch_object(self, obj, attr, return_value=None, name=None, new=None): - if name is None: - name = attr - if new is not None: - mocked = mock.patch.object(obj, attr, new=new) - else: - mocked = mock.patch.object(obj, attr) - self._patches[name] = mocked - started = mocked.start() - if new is None: - started.return_value = return_value - self._patches_start[name] = started - setattr(self, name, started) - - -class TestNeutronAristaCharm(Helper): - - def test_write_config(self): - pass