From 575cef2e79a6f63b9ac3bc8c4b0536968d4fe7a9 Mon Sep 17 00:00:00 2001
From: Liam Young <liam.young@canonical.com>
Date: Tue, 11 Oct 2022 14:57:21 +0000
Subject: [PATCH] Add microk8s + tempest functional tests

Depends-On: https://review.opendev.org/c/openstack/charm-ops-sunbeam/+/861885
Change-Id: Ib6313cc2c3042d26d58d22c215ae53da054957b0
---
 charms/glance-k8s/.gitignore              |  1 +
 charms/glance-k8s/.zuul.yaml              |  3 +
 charms/glance-k8s/osci.yaml               |  2 -
 charms/glance-k8s/test-requirements.txt   |  4 ++
 charms/glance-k8s/tests/bundles/xena.yaml | 71 +++++++++++++++++++++++
 charms/glance-k8s/tests/tests.yaml        | 43 ++++++++++++++
 charms/glance-k8s/tox.ini                 | 28 +++++++++
 7 files changed, 150 insertions(+), 2 deletions(-)
 create mode 100644 charms/glance-k8s/tests/bundles/xena.yaml
 create mode 100644 charms/glance-k8s/tests/tests.yaml

diff --git a/charms/glance-k8s/.gitignore b/charms/glance-k8s/.gitignore
index 844a0b93..2d3a0ccd 100644
--- a/charms/glance-k8s/.gitignore
+++ b/charms/glance-k8s/.gitignore
@@ -6,3 +6,4 @@ build/
 .coverage
 __pycache__/
 *.py[cod]
+tempest.log
diff --git a/charms/glance-k8s/.zuul.yaml b/charms/glance-k8s/.zuul.yaml
index 7ffc71cb..14cbd3c1 100644
--- a/charms/glance-k8s/.zuul.yaml
+++ b/charms/glance-k8s/.zuul.yaml
@@ -2,3 +2,6 @@
     templates:
       - openstack-python3-charm-yoga-jobs
       - openstack-cover-jobs
+      - microk8s-func-test
+    vars:
+      charm_build_name: glance-k8s
diff --git a/charms/glance-k8s/osci.yaml b/charms/glance-k8s/osci.yaml
index 1ffdeb0d..0bdaa471 100644
--- a/charms/glance-k8s/osci.yaml
+++ b/charms/glance-k8s/osci.yaml
@@ -1,7 +1,5 @@
 - project:
     templates:
-      - charm-unit-jobs-py38
-      - charm-unit-jobs-py310
       - charm-publish-jobs
     vars:
       needs_charm_build: true
diff --git a/charms/glance-k8s/test-requirements.txt b/charms/glance-k8s/test-requirements.txt
index 35f58ad6..8febe61e 100644
--- a/charms/glance-k8s/test-requirements.txt
+++ b/charms/glance-k8s/test-requirements.txt
@@ -8,3 +8,7 @@ coverage
 mock
 flake8
 stestr
+git+https://github.com/openstack-charmers/zaza.git#egg=zaza
+git+https://github.com/openstack-charmers/zaza-openstack-tests.git#egg=zaza.openstack
+git+https://opendev.org/openstack/tempest.git#egg=tempest
+ops
diff --git a/charms/glance-k8s/tests/bundles/xena.yaml b/charms/glance-k8s/tests/bundles/xena.yaml
new file mode 100644
index 00000000..011835e3
--- /dev/null
+++ b/charms/glance-k8s/tests/bundles/xena.yaml
@@ -0,0 +1,71 @@
+bundle: kubernetes
+applications:
+
+  mysql:
+    charm: ch:mysql-k8s
+    channel: edge
+    scale: 1
+    trust: false
+
+  # Currently traefik is required for networking things.
+  # If this isn't present, the units will hang at "installing agent".
+  traefik:
+    charm: ch:traefik-k8s
+    channel: edge
+    scale: 1
+    trust: true
+
+  traefik-public:
+    charm: ch:traefik-k8s
+    channel: edge
+    scale: 1
+    trust: true
+    options:
+      kubernetes-service-annotations: metallb.universe.tf/address-pool=public
+
+  # required for glance
+  rabbitmq:
+    charm: ch:sunbeam-rabbitmq-operator
+    channel: edge
+    scale: 1
+    trust: true
+
+  keystone:
+    charm: ch:keystone-k8s
+    channel: edge
+    scale: 1
+    trust: true
+    options:
+      admin-role: admin
+    storage:
+      fernet-keys: 5M
+      credential-keys: 5M
+  glance:
+    charm: ../../glance-k8s.charm
+    scale: 1
+    trust: true
+    resources:
+      glance-api-image: kolla/ubuntu-binary-glance-api:xena
+    storage:
+      local-repository: 5G
+
+relations:
+- - keystone:identity-service
+  - glance:identity-service
+- - rabbitmq:amqp
+  - glance:amqp
+
+- - traefik:ingress
+  - keystone:ingress-internal
+- - traefik-public:ingress
+  - keystone:ingress-public
+- - traefik:ingress
+  - glance:ingress-internal
+- - traefik-public:ingress
+  - glance:ingress-public
+
+- - mysql:database
+  - keystone:database
+
+- - mysql:database
+  - glance:database
diff --git a/charms/glance-k8s/tests/tests.yaml b/charms/glance-k8s/tests/tests.yaml
new file mode 100644
index 00000000..8996a24f
--- /dev/null
+++ b/charms/glance-k8s/tests/tests.yaml
@@ -0,0 +1,43 @@
+gate_bundles:
+  - xena
+smoke_bundles:
+  - xena
+configure:
+  - zaza.openstack.charm_tests.keystone.setup.wait_for_all_endpoints
+  - zaza.openstack.charm_tests.keystone.setup.add_tempest_roles
+  - zaza.openstack.charm_tests.glance.setup.add_lts_image
+  - zaza.openstack.charm_tests.glance.setup.add_cirros_image
+  - zaza.openstack.charm_tests.glance.setup.add_cirros_alt_image
+tests:
+  - zaza.openstack.charm_tests.tempest.tests.TempestTestWithKeystoneV3
+tests_options:
+  trust:
+    - xena
+  ignore_hard_deploy_errors:
+    - xena
+
+  tempest:
+    default:
+      smoke: True
+      exclude-list:
+        - "tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_register_upload_get_image_file"
+
+target_deploy_status:
+  traefik:
+    workload-status: active
+    workload-status-message-regex: '^$'
+  traefik-public:
+    workload-status: active
+    workload-status-message-regex: '^$'
+  rabbitmq:
+    workload-status: active
+    workload-status-message-regex: '^$'
+  glance:
+    workload-status: active
+    workload-status-message-regex: '^$'
+  keystone:
+    workload-status: active
+    workload-status-message-regex: '^$'
+  mysql:
+    workload-status: active
+    workload-status-message-regex: '^$'
diff --git a/charms/glance-k8s/tox.ini b/charms/glance-k8s/tox.ini
index ca8b7454..f120d78e 100644
--- a/charms/glance-k8s/tox.ini
+++ b/charms/glance-k8s/tox.ini
@@ -83,6 +83,34 @@ commands =
     coverage xml -o cover/coverage.xml
     coverage report
 
+[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
+setenv =
+    TEST_MAX_RESOLVE_COUNT = 5
+    TEST_MODEL_SETTINGS = automatically-retry-hooks=true
+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}
+
 [coverage:run]
 branch = True
 concurrency = multiprocessing