From 494ef4c91c80467678d890d357cb8ca14980ccb4 Mon Sep 17 00:00:00 2001 From: Gabriel Adrian Samfira Date: Sun, 27 Sep 2020 01:23:26 +0000 Subject: [PATCH] Add functional tests, fixes and pep8 * Add functional tests * Explicitly set python 3 in the ironic API charm class * fix lint errors Change-Id: Ida24b071b2dee3b9205cccfc74a0e654a3c0b13f Func-Test-Pr: https://github.com/openstack-charmers/zaza-openstack-tests/pull/450 Co-authored-by: Aurelien Lourot --- .gitreview | 4 + .zuul.yaml | 4 + src/lib/charm/openstack/ironic/ironic.py | 6 +- src/reactive/ironic_handlers.py | 6 +- src/templates/train/ironic.conf | 2 + src/tests/bundles/bionic-train.yaml | 249 +++++++++++++++ src/tests/bundles/bionic-ussuri.yaml | 249 +++++++++++++++ src/tests/bundles/focal-ussuri.yaml | 283 ++++++++++++++++++ src/tests/bundles/focal-victoria.yaml | 283 ++++++++++++++++++ .../bundles/overlays/bionic-train.yaml.j2 | 1 + .../bundles/overlays/bionic-ussuri.yaml.j2 | 1 + .../bundles/overlays/focal-ussuri.yaml.j2 | 1 + .../bundles/overlays/focal-victoria.yaml.j2 | 1 + src/tests/bundles/overlays/ironic.j2 | 4 + src/tests/tests.yaml | 29 ++ unit_tests/__init__.py | 1 - unit_tests/test_ironic_api_handlers.py | 4 +- unit_tests/test_lib_charm_openstack_ironic.py | 10 +- 18 files changed, 1124 insertions(+), 14 deletions(-) create mode 100644 .gitreview create mode 100644 .zuul.yaml create mode 100644 src/tests/bundles/bionic-train.yaml create mode 100644 src/tests/bundles/bionic-ussuri.yaml create mode 100644 src/tests/bundles/focal-ussuri.yaml create mode 100644 src/tests/bundles/focal-victoria.yaml create mode 120000 src/tests/bundles/overlays/bionic-train.yaml.j2 create mode 120000 src/tests/bundles/overlays/bionic-ussuri.yaml.j2 create mode 120000 src/tests/bundles/overlays/focal-ussuri.yaml.j2 create mode 120000 src/tests/bundles/overlays/focal-victoria.yaml.j2 create mode 100644 src/tests/bundles/overlays/ironic.j2 create mode 100644 src/tests/tests.yaml diff --git a/.gitreview b/.gitreview new file mode 100644 index 0000000..e499547 --- /dev/null +++ b/.gitreview @@ -0,0 +1,4 @@ +[gerrit] +host=review.opendev.org +port=29418 +project=openstack/charm-ironic-api.git diff --git a/.zuul.yaml b/.zuul.yaml new file mode 100644 index 0000000..fd20909 --- /dev/null +++ b/.zuul.yaml @@ -0,0 +1,4 @@ +- project: + templates: + - openstack-python3-charm-jobs + - openstack-cover-jobs diff --git a/src/lib/charm/openstack/ironic/ironic.py b/src/lib/charm/openstack/ironic/ironic.py index 776ffb3..6cde3b6 100644 --- a/src/lib/charm/openstack/ironic/ironic.py +++ b/src/lib/charm/openstack/ironic/ironic.py @@ -31,6 +31,7 @@ charms_openstack.charm.use_defaults('charm.default-select-release') def deployment_interface_ip(cls): return ch_ip.get_relation_ip("deployment") + @adapters.config_property def internal_interface_ip(cls): return ch_ip.get_relation_ip("internal") @@ -41,6 +42,7 @@ class IronicAPICharm(charms_openstack.charm.HAOpenStackCharm): abstract_class = False release = 'train' name = 'ironic' + python_version = 3 packages = PACKAGES api_ports = { 'ironic-api': { @@ -51,7 +53,7 @@ class IronicAPICharm(charms_openstack.charm.HAOpenStackCharm): } service_type = 'ironic' default_service = 'ironic-api' - services = ['ironic-api',] + services = ['ironic-api', ] sync_cmd = ['ironic-dbsync', 'upgrade'] required_relations = [ @@ -99,4 +101,4 @@ class IronicAPICharm(charms_openstack.charm.HAOpenStackCharm): for unit in baremetal.all_joined_units: baremetal.set_baremetal_info( unit.relation.relation_id, - relation_data) \ No newline at end of file + relation_data) diff --git a/src/reactive/ironic_handlers.py b/src/reactive/ironic_handlers.py index 4b70b24..fec010e 100644 --- a/src/reactive/ironic_handlers.py +++ b/src/reactive/ironic_handlers.py @@ -6,8 +6,6 @@ import charmhelpers.core.hookenv as hookenv import charms_openstack.charm as charm import charm.openstack.ironic.ironic as ironic # noqa -from charmhelpers.core.templating import render - # Use the charms.openstack defaults for common states and hooks charm.use_defaults( @@ -18,7 +16,8 @@ charm.use_defaults( 'config.changed', 'update-status', 'upgrade-charm', - 'certificates.available') + 'certificates.available', + 'cluster.available') @reactive.when('shared-db.available') @@ -64,6 +63,7 @@ def run_db_migration(): @reactive.when('ha.connected') +@reactive.when_not('ha.available') def cluster_connected(hacluster): with charm.provide_charm_instance() as ironic_charm: ironic_charm.configure_ha_resources(hacluster) diff --git a/src/templates/train/ironic.conf b/src/templates/train/ironic.conf index 42ca785..f94c996 100644 --- a/src/templates/train/ironic.conf +++ b/src/templates/train/ironic.conf @@ -1,4 +1,6 @@ [DEFAULT] +debug = {{ options.debug }} +verbose = {{ options.verbose }} auth_strategy=keystone my_ip = {{ options.internal_interface_ip }} diff --git a/src/tests/bundles/bionic-train.yaml b/src/tests/bundles/bionic-train.yaml new file mode 100644 index 0000000..2dfde18 --- /dev/null +++ b/src/tests/bundles/bionic-train.yaml @@ -0,0 +1,249 @@ +options: + source: &source cloud:bionic-train/proposed +series: bionic +relations: +- - nova-ironic + - ironic-api +- - ironic-conductor + - ironic-api +- - neutron-ironic-agent:identity-credentials + - keystone +- - neutron-ironic-agent + - neutron-api +- - neutron-openvswitch + - neutron-api +- - ironic-api:amqp + - rabbitmq-server:amqp +- - ironic-api + - keystone +- - ironic-api:shared-db + - mysql:shared-db +- - ironic-conductor:amqp + - rabbitmq-server:amqp +- - ironic-conductor + - keystone +- - ironic-conductor:shared-db + - mysql:shared-db +- - nova-ironic:amqp + - rabbitmq-server:amqp +- - nova-ironic + - glance +- - nova-ironic + - keystone +- - nova-ironic + - nova-cloud-controller +- - neutron-gateway: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-api:shared-db + - mysql:shared-db +- - neutron-api:amqp + - rabbitmq-server:amqp +- - neutron-gateway:neutron-plugin-api + - neutron-api:neutron-plugin-api +- - glance:shared-db + - mysql:shared-db +- - glance:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:image-service + - glance:image-service +- - nova-cloud-controller:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:quantum-network-service + - neutron-gateway:quantum-network-service +- - nova-cloud-controller:shared-db + - mysql:shared-db +- - nova-cloud-controller:neutron-api + - neutron-api:neutron-api +- - cinder:image-service + - glance:image-service +- - cinder:amqp + - rabbitmq-server:amqp +- - cinder:identity-service + - keystone:identity-service +- - cinder:cinder-volume-service + - nova-cloud-controller:cinder-volume-service +- - cinder:shared-db + - mysql:shared-db +- - placement + - mysql +- - placement + - keystone +- - placement + - nova-cloud-controller +- - ceph-mon:client + - nova-ironic:ceph +- - ceph-mon:client + - glance:ceph +- - ceph-radosgw:mon + - ceph-mon:radosgw +- - ceph-radosgw:identity-service + - keystone:identity-service +- - ceph-osd:mon + - ceph-mon:osd +- - ceph-radosgw:object-store + - glance +- - vault:shared-db + - mysql:shared-db +- - vault:certificates + - ceph-radosgw +- - vault:certificates + - cinder +- - vault:certificates + - glance:certificates +- - vault:certificates + - keystone:certificates +- - vault:certificates + - neutron-api:certificates +- - vault:certificates + - nova-cloud-controller:certificates +- - vault:certificates + - placement:certificates +- - vault + - ironic-conductor +- - vault:certificates + - ironic-api:certificates +- - ironic-api + - hacluster-ironic +services: + cinder: + charm: cs:~openstack-charmers-next/cinder + num_units: 1 + constraints: mem=2G + options: + block-device: vdb + glance-api-version: 2 + openstack-origin: *source + worker-multiplier: 0.25 + storage: + block-devices: cinder,50G + ceph-radosgw: + charm: cs:~openstack-charmers-next/ceph-radosgw + num_units: 1 + constraints: mem=2G + options: + source: *source + namespace-tenants: True + ceph-mon: + charm: cs:ceph-mon + num_units: 3 + constraints: mem=2G + options: + expected-osd-count: 3 + source: *source + ceph-osd: + charm: cs:ceph-osd + num_units: 3 + constraints: mem=2G + options: + source: *source + storage: + osd-devices: 'cinder,30G' + glance: + charm: cs:~openstack-charmers-next/glance + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + keystone: + charm: cs:~openstack-charmers-next/keystone + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + mysql: + charm: cs:percona-cluster + num_units: 1 + constraints: mem=4G + options: + innodb-buffer-pool-size: 256M + max-connections: 1000 + performance-schema: true + neutron-api: + charm: cs:~openstack-charmers-next/neutron-api + num_units: 1 + constraints: mem=2G + options: + flat-network-providers: "physnet1" + neutron-security-groups: true + openstack-origin: *source + manage-neutron-plugin-legacy-mode: false + worker-multiplier: 0.25 + neutron-gateway: + charm: cs:~openstack-charmers-next/neutron-gateway + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + enable-isolated-metadata: true + enable-metadata-network: true + bridge-mappings: physnet1:br-ex + nova-cloud-controller: + charm: cs:~openstack-charmers-next/nova-cloud-controller + num_units: 1 + constraints: mem=2G + options: + network-manager: Neutron + openstack-origin: *source + worker-multiplier: 0.25 + nova-ironic: + charm: cs:~openstack-charmers-next/nova-compute + num_units: 1 + constraints: mem=2G + options: + enable-live-migration: false + enable-resize: false + openstack-origin: *source + virt-type: ironic + placement: + charm: cs:placement + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + rabbitmq-server: + charm: cs:rabbitmq-server + num_units: 1 + constraints: mem=2G + hacluster-ironic: + charm: cs:~openstack-charmers-next/hacluster + num_units: 0 + ironic-api: + charm: ../../../ironic-api + num_units: 3 + constraints: mem=2G + options: + openstack-origin: *source + ironic-conductor: + charm: cs:~openstack-charmers-next/ironic-conductor + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + max-tftp-block-size: 1418 + disable-secure-erase: true + use-ipxe: true + enabled-network-interfaces: "flat, noop" + neutron-openvswitch: + charm: cs:~openstack-charmers-next/neutron-openvswitch + num_units: 0 + options: + bridge-mappings: physnet1:br-ex + neutron-ironic-agent: + charm: cs:~openstack-charmers-next/neutron-api-plugin-ironic + num_units: 0 + options: + openstack-origin: *source + vault: + charm: cs:~openstack-charmers-next/vault + num_units: 1 diff --git a/src/tests/bundles/bionic-ussuri.yaml b/src/tests/bundles/bionic-ussuri.yaml new file mode 100644 index 0000000..a50d0f7 --- /dev/null +++ b/src/tests/bundles/bionic-ussuri.yaml @@ -0,0 +1,249 @@ +options: + source: &source cloud:bionic-ussuri/proposed +series: bionic +relations: +- - nova-ironic + - ironic-api +- - ironic-conductor + - ironic-api +- - neutron-ironic-agent:identity-credentials + - keystone +- - neutron-ironic-agent + - neutron-api +- - neutron-openvswitch + - neutron-api +- - ironic-api:amqp + - rabbitmq-server:amqp +- - ironic-api + - keystone +- - ironic-api:shared-db + - mysql:shared-db +- - ironic-conductor:amqp + - rabbitmq-server:amqp +- - ironic-conductor + - keystone +- - ironic-conductor:shared-db + - mysql:shared-db +- - nova-ironic:amqp + - rabbitmq-server:amqp +- - nova-ironic + - glance +- - nova-ironic + - keystone +- - nova-ironic + - nova-cloud-controller +- - neutron-gateway: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-api:shared-db + - mysql:shared-db +- - neutron-api:amqp + - rabbitmq-server:amqp +- - neutron-gateway:neutron-plugin-api + - neutron-api:neutron-plugin-api +- - glance:shared-db + - mysql:shared-db +- - glance:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:image-service + - glance:image-service +- - nova-cloud-controller:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:quantum-network-service + - neutron-gateway:quantum-network-service +- - nova-cloud-controller:shared-db + - mysql:shared-db +- - nova-cloud-controller:neutron-api + - neutron-api:neutron-api +- - cinder:image-service + - glance:image-service +- - cinder:amqp + - rabbitmq-server:amqp +- - cinder:identity-service + - keystone:identity-service +- - cinder:cinder-volume-service + - nova-cloud-controller:cinder-volume-service +- - cinder:shared-db + - mysql:shared-db +- - placement + - mysql +- - placement + - keystone +- - placement + - nova-cloud-controller +- - ceph-mon:client + - nova-ironic:ceph +- - ceph-mon:client + - glance:ceph +- - ceph-radosgw:mon + - ceph-mon:radosgw +- - ceph-radosgw:identity-service + - keystone:identity-service +- - ceph-osd:mon + - ceph-mon:osd +- - ceph-radosgw:object-store + - glance +- - vault:shared-db + - mysql:shared-db +- - vault:certificates + - ceph-radosgw +- - vault:certificates + - cinder +- - vault:certificates + - glance:certificates +- - vault:certificates + - keystone:certificates +- - vault:certificates + - neutron-api:certificates +- - vault:certificates + - nova-cloud-controller:certificates +- - vault:certificates + - placement:certificates +- - vault + - ironic-conductor +- - vault:certificates + - ironic-api:certificates +- - ironic-api + - hacluster-ironic +services: + cinder: + charm: cs:~openstack-charmers-next/cinder + num_units: 1 + constraints: mem=2G + options: + block-device: vdb + glance-api-version: 2 + openstack-origin: *source + worker-multiplier: 0.25 + storage: + block-devices: cinder,50G + ceph-radosgw: + charm: cs:~openstack-charmers-next/ceph-radosgw + num_units: 1 + constraints: mem=2G + options: + source: *source + namespace-tenants: True + ceph-mon: + charm: cs:ceph-mon + num_units: 3 + constraints: mem=2G + options: + expected-osd-count: 3 + source: *source + ceph-osd: + charm: cs:ceph-osd + num_units: 3 + constraints: mem=2G + options: + source: *source + storage: + osd-devices: 'cinder,30G' + glance: + charm: cs:~openstack-charmers-next/glance + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + keystone: + charm: cs:~openstack-charmers-next/keystone + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + mysql: + charm: cs:percona-cluster + num_units: 1 + constraints: mem=4G + options: + innodb-buffer-pool-size: 256M + max-connections: 1000 + performance-schema: true + hacluster-ironic: + charm: cs:~openstack-charmers-next/hacluster + num_units: 0 + neutron-api: + charm: cs:~openstack-charmers-next/neutron-api + num_units: 3 + constraints: mem=2G + options: + flat-network-providers: "physnet1" + neutron-security-groups: true + openstack-origin: *source + manage-neutron-plugin-legacy-mode: false + worker-multiplier: 0.25 + neutron-gateway: + charm: cs:~openstack-charmers-next/neutron-gateway + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + enable-isolated-metadata: true + enable-metadata-network: true + bridge-mappings: physnet1:br-ex + nova-cloud-controller: + charm: cs:~openstack-charmers-next/nova-cloud-controller + num_units: 1 + constraints: mem=2G + options: + network-manager: Neutron + openstack-origin: *source + worker-multiplier: 0.25 + nova-ironic: + charm: cs:~openstack-charmers-next/nova-compute + num_units: 1 + constraints: mem=2G + options: + enable-live-migration: false + enable-resize: false + openstack-origin: *source + virt-type: ironic + placement: + charm: cs:placement + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + rabbitmq-server: + charm: cs:rabbitmq-server + num_units: 1 + constraints: mem=2G + ironic-api: + charm: ../../../ironic-api + num_units: 3 + constraints: mem=2G + options: + openstack-origin: *source + ironic-conductor: + charm: cs:~openstack-charmers-next/ironic-conductor + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + max-tftp-block-size: 1418 + disable-secure-erase: true + use-ipxe: true + enabled-network-interfaces: "flat, noop" + neutron-openvswitch: + charm: cs:~openstack-charmers-next/neutron-openvswitch + num_units: 0 + options: + bridge-mappings: physnet1:br-ex + neutron-ironic-agent: + charm: cs:~openstack-charmers-next/neutron-api-plugin-ironic + num_units: 0 + options: + openstack-origin: *source + vault: + charm: cs:~openstack-charmers-next/vault + num_units: 1 diff --git a/src/tests/bundles/focal-ussuri.yaml b/src/tests/bundles/focal-ussuri.yaml new file mode 100644 index 0000000..dad3e3a --- /dev/null +++ b/src/tests/bundles/focal-ussuri.yaml @@ -0,0 +1,283 @@ +options: + source: &source distro +series: focal +relations: +- - nova-ironic + - ironic-api +- - ironic-conductor + - ironic-api +- - neutron-ironic-agent:identity-credentials + - keystone +- - neutron-ironic-agent + - neutron-api +- - neutron-openvswitch + - neutron-api +- - ironic-api:amqp + - rabbitmq-server:amqp +- - ironic-api + - keystone +- - ironic-api:shared-db + - ironic-api-mysql-router:shared-db +- - ironic-conductor:amqp + - rabbitmq-server:amqp +- - ironic-conductor + - keystone +- - ironic-conductor:shared-db + - ironic-conductor-mysql-router:shared-db +- - nova-ironic:amqp + - rabbitmq-server:amqp +- - nova-ironic + - glance +- - nova-ironic + - keystone +- - nova-ironic + - nova-cloud-controller +- - neutron-gateway:amqp + - rabbitmq-server:amqp +- - keystone:shared-db + - keystone-mysql-router:shared-db +- - nova-cloud-controller:identity-service + - keystone:identity-service +- - glance:identity-service + - keystone:identity-service +- - neutron-api:identity-service + - keystone:identity-service +- - neutron-api:shared-db + - neutron-api-mysql-router:shared-db +- - neutron-api:amqp + - rabbitmq-server:amqp +- - neutron-gateway:neutron-plugin-api + - neutron-api:neutron-plugin-api +- - glance:shared-db + - glance-mysql-router:shared-db +- - glance:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:image-service + - glance:image-service +- - nova-cloud-controller:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:quantum-network-service + - neutron-gateway:quantum-network-service +- - nova-cloud-controller:shared-db + - nova-cloud-controller-mysql-router:shared-db +- - nova-cloud-controller:neutron-api + - neutron-api:neutron-api +- - cinder:image-service + - glance:image-service +- - cinder:amqp + - rabbitmq-server:amqp +- - cinder:identity-service + - keystone:identity-service +- - cinder:cinder-volume-service + - nova-cloud-controller:cinder-volume-service +- - cinder:shared-db + - cinder-mysql-router:shared-db +- - placement:shared-db + - placement-mysql-router:shared-db +- - placement + - keystone +- - placement + - nova-cloud-controller +- - ceph-mon:client + - nova-ironic:ceph +- - ceph-mon:client + - glance:ceph +- - ceph-radosgw:mon + - ceph-mon:radosgw +- - ceph-radosgw:identity-service + - keystone:identity-service +- - ceph-osd:mon + - ceph-mon:osd +- - ceph-radosgw:object-store + - glance +- - mysql-innodb-cluster:db-router + - nova-cloud-controller-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - keystone-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - glance-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - neutron-api-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - placement-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - cinder-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - ironic-api-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - ironic-conductor-mysql-router:db-router +- - vault-mysql-router:db-router + - mysql-innodb-cluster:db-router +- - vault:shared-db + - vault-mysql-router:shared-db +- - vault:certificates + - ceph-radosgw +- - vault:certificates + - cinder +- - vault:certificates + - glance:certificates +- - vault:certificates + - keystone:certificates +- - vault:certificates + - neutron-api:certificates +- - vault:certificates + - nova-cloud-controller:certificates +- - vault:certificates + - placement:certificates +- - vault + - ironic-conductor +- - vault:certificates + - ironic-api:certificates +- - ironic-api + - hacluster-ironic +services: + nova-cloud-controller-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + keystone-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + glance-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + neutron-api-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + placement-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + vault-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + cinder-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + ironic-api-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + ironic-conductor-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + mysql-innodb-cluster: + charm: cs:~openstack-charmers-next/mysql-innodb-cluster + num_units: 3 + constraints: mem=4G + options: + source: *source + cinder: + charm: cs:~openstack-charmers-next/cinder + num_units: 1 + constraints: mem=2G + options: + block-device: vdb + glance-api-version: 2 + openstack-origin: *source + worker-multiplier: 0.25 + storage: + block-devices: cinder,50G + ceph-radosgw: + charm: cs:~openstack-charmers-next/ceph-radosgw + num_units: 1 + constraints: mem=2G + options: + source: *source + namespace-tenants: True + ceph-mon: + charm: cs:ceph-mon + num_units: 3 + constraints: mem=2G + options: + expected-osd-count: 3 + source: *source + ceph-osd: + charm: cs:ceph-osd + num_units: 3 + constraints: mem=2G + options: + source: *source + storage: + osd-devices: 'cinder,30G' + glance: + charm: cs:~openstack-charmers-next/glance + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + keystone: + charm: cs:~openstack-charmers-next/keystone + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + neutron-api: + charm: cs:~openstack-charmers-next/neutron-api + num_units: 1 + constraints: mem=2G + options: + flat-network-providers: "physnet1" + neutron-security-groups: true + openstack-origin: *source + manage-neutron-plugin-legacy-mode: false + worker-multiplier: 0.25 + neutron-gateway: + charm: cs:~openstack-charmers-next/neutron-gateway + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + enable-isolated-metadata: true + enable-metadata-network: true + bridge-mappings: physnet1:br-ex + nova-cloud-controller: + charm: cs:~openstack-charmers-next/nova-cloud-controller + num_units: 1 + constraints: mem=2G + options: + network-manager: Neutron + openstack-origin: *source + worker-multiplier: 0.25 + nova-ironic: + charm: cs:~openstack-charmers-next/nova-compute + num_units: 1 + constraints: mem=2G + options: + enable-live-migration: false + enable-resize: false + openstack-origin: *source + virt-type: ironic + placement: + charm: cs:placement + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + rabbitmq-server: + charm: cs:rabbitmq-server + num_units: 1 + constraints: mem=2G + hacluster-ironic: + charm: cs:~openstack-charmers-next/hacluster + num_units: 0 + ironic-api: + charm: ../../../ironic-api + num_units: 3 + constraints: mem=2G + options: + openstack-origin: *source + ironic-conductor: + charm: cs:~openstack-charmers-next/ironic-conductor + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + max-tftp-block-size: 1418 + disable-secure-erase: true + use-ipxe: true + enabled-network-interfaces: "flat, noop" + neutron-openvswitch: + charm: cs:~openstack-charmers-next/neutron-openvswitch + num_units: 0 + options: + bridge-mappings: physnet1:br-ex + neutron-ironic-agent: + charm: cs:~openstack-charmers-next/neutron-api-plugin-ironic + num_units: 0 + options: + openstack-origin: *source + vault: + charm: cs:~openstack-charmers-next/vault + num_units: 1 diff --git a/src/tests/bundles/focal-victoria.yaml b/src/tests/bundles/focal-victoria.yaml new file mode 100644 index 0000000..0a84e86 --- /dev/null +++ b/src/tests/bundles/focal-victoria.yaml @@ -0,0 +1,283 @@ +options: + source: &source cloud:focal-victoria/proposed +series: focal +relations: +- - nova-ironic + - ironic-api +- - ironic-conductor + - ironic-api +- - neutron-ironic-agent:identity-credentials + - keystone +- - neutron-ironic-agent + - neutron-api +- - neutron-openvswitch + - neutron-api +- - ironic-api:amqp + - rabbitmq-server:amqp +- - ironic-api + - keystone +- - ironic-api:shared-db + - ironic-api-mysql-router:shared-db +- - ironic-conductor:amqp + - rabbitmq-server:amqp +- - ironic-conductor + - keystone +- - ironic-conductor:shared-db + - ironic-conductor-mysql-router:shared-db +- - nova-ironic:amqp + - rabbitmq-server:amqp +- - nova-ironic + - glance +- - nova-ironic + - keystone +- - nova-ironic + - nova-cloud-controller +- - neutron-gateway:amqp + - rabbitmq-server:amqp +- - keystone:shared-db + - keystone-mysql-router:shared-db +- - nova-cloud-controller:identity-service + - keystone:identity-service +- - glance:identity-service + - keystone:identity-service +- - neutron-api:identity-service + - keystone:identity-service +- - neutron-api:shared-db + - neutron-api-mysql-router:shared-db +- - neutron-api:amqp + - rabbitmq-server:amqp +- - neutron-gateway:neutron-plugin-api + - neutron-api:neutron-plugin-api +- - glance:shared-db + - glance-mysql-router:shared-db +- - glance:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:image-service + - glance:image-service +- - nova-cloud-controller:amqp + - rabbitmq-server:amqp +- - nova-cloud-controller:quantum-network-service + - neutron-gateway:quantum-network-service +- - nova-cloud-controller:shared-db + - nova-cloud-controller-mysql-router:shared-db +- - nova-cloud-controller:neutron-api + - neutron-api:neutron-api +- - cinder:image-service + - glance:image-service +- - cinder:amqp + - rabbitmq-server:amqp +- - cinder:identity-service + - keystone:identity-service +- - cinder:cinder-volume-service + - nova-cloud-controller:cinder-volume-service +- - cinder:shared-db + - cinder-mysql-router:shared-db +- - placement:shared-db + - placement-mysql-router:shared-db +- - placement + - keystone +- - placement + - nova-cloud-controller +- - ceph-mon:client + - nova-ironic:ceph +- - ceph-mon:client + - glance:ceph +- - ceph-radosgw:mon + - ceph-mon:radosgw +- - ceph-radosgw:identity-service + - keystone:identity-service +- - ceph-osd:mon + - ceph-mon:osd +- - ceph-radosgw:object-store + - glance +- - mysql-innodb-cluster:db-router + - nova-cloud-controller-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - keystone-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - glance-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - neutron-api-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - placement-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - cinder-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - ironic-api-mysql-router:db-router +- - mysql-innodb-cluster:db-router + - ironic-conductor-mysql-router:db-router +- - vault-mysql-router:db-router + - mysql-innodb-cluster:db-router +- - vault:shared-db + - vault-mysql-router:shared-db +- - vault:certificates + - ceph-radosgw +- - vault:certificates + - cinder +- - vault:certificates + - glance:certificates +- - vault:certificates + - keystone:certificates +- - vault:certificates + - neutron-api:certificates +- - vault:certificates + - nova-cloud-controller:certificates +- - vault:certificates + - placement:certificates +- - vault + - ironic-conductor +- - vault:certificates + - ironic-api:certificates +- - ironic-api + - hacluster-ironic +services: + nova-cloud-controller-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + keystone-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + glance-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + neutron-api-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + placement-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + vault-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + cinder-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + ironic-api-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + ironic-conductor-mysql-router: + charm: cs:~openstack-charmers-next/mysql-router + mysql-innodb-cluster: + charm: cs:~openstack-charmers-next/mysql-innodb-cluster + num_units: 3 + constraints: mem=4G + options: + source: *source + cinder: + charm: cs:~openstack-charmers-next/cinder + num_units: 1 + constraints: mem=2G + options: + block-device: vdb + glance-api-version: 2 + openstack-origin: *source + worker-multiplier: 0.25 + storage: + block-devices: cinder,50G + ceph-radosgw: + charm: cs:~openstack-charmers-next/ceph-radosgw + num_units: 1 + constraints: mem=2G + options: + source: *source + namespace-tenants: True + ceph-mon: + charm: cs:ceph-mon + num_units: 3 + constraints: mem=2G + options: + expected-osd-count: 3 + source: *source + ceph-osd: + charm: cs:ceph-osd + num_units: 3 + constraints: mem=2G + options: + source: *source + storage: + osd-devices: 'cinder,30G' + glance: + charm: cs:~openstack-charmers-next/glance + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + keystone: + charm: cs:~openstack-charmers-next/keystone + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + neutron-api: + charm: cs:~openstack-charmers-next/neutron-api + num_units: 1 + constraints: mem=2G + options: + flat-network-providers: "physnet1" + neutron-security-groups: true + openstack-origin: *source + manage-neutron-plugin-legacy-mode: false + worker-multiplier: 0.25 + neutron-gateway: + charm: cs:~openstack-charmers-next/neutron-gateway + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + enable-isolated-metadata: true + enable-metadata-network: true + bridge-mappings: physnet1:br-ex + nova-cloud-controller: + charm: cs:~openstack-charmers-next/nova-cloud-controller + num_units: 1 + constraints: mem=2G + options: + network-manager: Neutron + openstack-origin: *source + worker-multiplier: 0.25 + nova-ironic: + charm: cs:~openstack-charmers-next/nova-compute + num_units: 1 + constraints: mem=2G + options: + enable-live-migration: false + enable-resize: false + openstack-origin: *source + virt-type: ironic + placement: + charm: cs:placement + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + worker-multiplier: 0.25 + rabbitmq-server: + charm: cs:rabbitmq-server + num_units: 1 + constraints: mem=2G + hacluster-ironic: + charm: cs:~openstack-charmers-next/hacluster + num_units: 0 + ironic-api: + charm: ../../../ironic-api + num_units: 3 + constraints: mem=2G + options: + openstack-origin: *source + ironic-conductor: + charm: cs:~openstack-charmers-next/ironic-conductor + num_units: 1 + constraints: mem=2G + options: + openstack-origin: *source + max-tftp-block-size: 1418 + disable-secure-erase: true + use-ipxe: true + enabled-network-interfaces: "flat, noop" + neutron-openvswitch: + charm: cs:~openstack-charmers-next/neutron-openvswitch + num_units: 0 + options: + bridge-mappings: physnet1:br-ex + neutron-ironic-agent: + charm: cs:~openstack-charmers-next/neutron-api-plugin-ironic + num_units: 0 + options: + openstack-origin: *source + vault: + charm: cs:~openstack-charmers-next/vault + num_units: 1 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..f07f22d --- /dev/null +++ b/src/tests/bundles/overlays/bionic-train.yaml.j2 @@ -0,0 +1 @@ +ironic.j2 \ No newline at end of file diff --git a/src/tests/bundles/overlays/bionic-ussuri.yaml.j2 b/src/tests/bundles/overlays/bionic-ussuri.yaml.j2 new file mode 120000 index 0000000..f07f22d --- /dev/null +++ b/src/tests/bundles/overlays/bionic-ussuri.yaml.j2 @@ -0,0 +1 @@ +ironic.j2 \ No newline at end of file diff --git a/src/tests/bundles/overlays/focal-ussuri.yaml.j2 b/src/tests/bundles/overlays/focal-ussuri.yaml.j2 new file mode 120000 index 0000000..f07f22d --- /dev/null +++ b/src/tests/bundles/overlays/focal-ussuri.yaml.j2 @@ -0,0 +1 @@ +ironic.j2 \ No newline at end of file diff --git a/src/tests/bundles/overlays/focal-victoria.yaml.j2 b/src/tests/bundles/overlays/focal-victoria.yaml.j2 new file mode 120000 index 0000000..f07f22d --- /dev/null +++ b/src/tests/bundles/overlays/focal-victoria.yaml.j2 @@ -0,0 +1 @@ +ironic.j2 \ No newline at end of file diff --git a/src/tests/bundles/overlays/ironic.j2 b/src/tests/bundles/overlays/ironic.j2 new file mode 100644 index 0000000..6e5f5c6 --- /dev/null +++ b/src/tests/bundles/overlays/ironic.j2 @@ -0,0 +1,4 @@ +applications: + ironic-api: + options: + vip: '{{ OS_VIP00 }}' diff --git a/src/tests/tests.yaml b/src/tests/tests.yaml new file mode 100644 index 0000000..25a863f --- /dev/null +++ b/src/tests/tests.yaml @@ -0,0 +1,29 @@ +charm_name: ironic-api +gate_bundles: +- focal-ussuri +- bionic-train +- bionic-ussuri +smoke_bundles: +- bionic-ussuri +dev_bundles: +- focal-victoria +target_deploy_status: + vault: + workload-status: blocked + workload-status-message: Vault needs to be initialized + ironic-conductor: + workload-status: blocked + workload-status-message: invalid enabled-deploy-interfaces config +configure: +- zaza.openstack.charm_tests.vault.setup.auto_initialize +- zaza.openstack.charm_tests.ironic.setup.set_temp_url_secret +- zaza.openstack.charm_tests.ironic.setup.add_ironic_deployment_image +- zaza.openstack.charm_tests.ironic.setup.add_ironic_os_image +- zaza.openstack.charm_tests.ironic.setup.create_bm_flavors +# Ironic will require a flat network to test the flat network type. Once a proper +# testing environment will be available for Ironic, we will need to add the setup +# call to create that flat network +#- zaza.openstack.charm_tests.neutron.setup.basic_overcloud_network +- zaza.openstack.charm_tests.nova.setup.manage_ssh_key +tests: +- zaza.openstack.charm_tests.ironic.tests.IronicTest diff --git a/unit_tests/__init__.py b/unit_tests/__init__.py index 186c1d9..5ec6b9d 100644 --- a/unit_tests/__init__.py +++ b/unit_tests/__init__.py @@ -1,5 +1,4 @@ import sys -import mock sys.path.append('src') sys.path.append('src/lib') diff --git a/unit_tests/test_ironic_api_handlers.py b/unit_tests/test_ironic_api_handlers.py index fba40ba..7a73be8 100644 --- a/unit_tests/test_ironic_api_handlers.py +++ b/unit_tests/test_ironic_api_handlers.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import json import mock from charm.openstack.ironic import ironic @@ -50,6 +49,7 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks): 'when_not': { 'run_db_migration': ( 'db.synced',), + 'cluster_connected': ('ha.available',), }, 'hook': { 'upgrade_charm': ('upgrade-charm',), @@ -82,7 +82,7 @@ class TestIronicHandlers(test_utils.PatchHelper): self.ironic_charm.internal_url, self.ironic_charm.admin_url) self.ironic_charm.assess_status.assert_called_once_with() - + def test_ironic_api_relation_joined(self): ironic_api = mock.MagicMock() handlers.ironic_api_relation_joined(ironic_api) diff --git a/unit_tests/test_lib_charm_openstack_ironic.py b/unit_tests/test_lib_charm_openstack_ironic.py index aa47a57..d85abb4 100644 --- a/unit_tests/test_lib_charm_openstack_ironic.py +++ b/unit_tests/test_lib_charm_openstack_ironic.py @@ -24,7 +24,7 @@ class TestIronicCharmConfigProperties(test_utils.PatchHelper): def setUp(self): super().setUp() self.patch_release(ironic.IronicAPICharm.release) - + def test_deployment_interface_ip(self): cls = mock.MagicMock() self.patch_object(ironic, 'ch_ip') @@ -66,7 +66,7 @@ class TestIronicCharm(test_utils.PatchHelper): [{ "database": cfg_data["database"], "username": cfg_data["database-user"]}]) - + def test_set_ironic_api_info(self): self.patch_object(ironic.reactive.flags, 'is_flag_set') self.is_flag_set.return_value = True @@ -74,17 +74,15 @@ class TestIronicCharm(test_utils.PatchHelper): unit = mock.MagicMock() unit.relation.relation_id = "fake" baremetal.all_joined_units = [unit] - relation_data = {"ready": True} + relation_data = {"ironic-api-ready": True} self.target.set_ironic_api_info(baremetal) baremetal.set_baremetal_info.assert_called_with( "fake", relation_data) self.is_flag_set.return_value = False - relation_data = {"ready": False} + relation_data = {"ironic-api-ready": False} self.target.set_ironic_api_info(baremetal) baremetal.set_baremetal_info.assert_called_with( "fake", relation_data) - - \ No newline at end of file