From 61a9c7546d0c889a74d0d1b7aeea4efd9833148c Mon Sep 17 00:00:00 2001
From: Alex Kavanagh <alex.kavanagh@canonical.com>
Date: Tue, 1 Feb 2022 20:08:40 +0000
Subject: [PATCH] Update to build using charmcraft

Due to a build problem with the reactive plugin, this change falls back
on overriding the steps and doing a manual build, but it also ensures
the CI system builds the charm using charmcraft.  Changes:

- add a build-requirements.txt
- modify charmcraft.yaml
- modify osci.yaml
    -> indicate build with charmcraft
- modify tox.ini
    -> tox -e build does charmcraft build/rename
    -> tox -e build-reactive does the reactive build
- modify bundles to use the <charm>.charm artifact in tests.
  and fix deprecation warning re: prefix
- tox inception to enable tox -e func-test in the CI

Change-Id: I591b32bb14c8a8320f32af6d698c8b3b8c0b9810
---
 build-requirements.txt             |  7 +++++++
 charmcraft.yaml                    | 18 +++++++++++++++---
 osci.yaml                          |  1 +
 rename.sh                          | 13 +++++++++++++
 src/test-requirements.txt          |  3 +++
 src/tests/bundles/focal-xena.yaml  |  4 +++-
 src/tests/bundles/focal-yoga.yaml  |  4 +++-
 src/tests/bundles/impish-xena.yaml |  4 +++-
 src/tests/bundles/jammy-yoga.yaml  |  4 +++-
 src/tests/tests.yaml               |  4 ++--
 test-requirements.txt              |  1 +
 tox.ini                            | 25 +++++++++++++++++++++++++
 12 files changed, 79 insertions(+), 9 deletions(-)
 create mode 100644 build-requirements.txt
 create mode 100755 rename.sh

diff --git a/build-requirements.txt b/build-requirements.txt
new file mode 100644
index 0000000..b6d2452
--- /dev/null
+++ b/build-requirements.txt
@@ -0,0 +1,7 @@
+# NOTES(lourot):
+# * We don't install charmcraft via pip anymore because it anyway spins up a
+#   container and scp the system's charmcraft snap inside it. So the charmcraft
+#   snap is necessary on the system anyway.
+# * `tox -e build` successfully validated with charmcraft 1.2.1
+
+cffi==1.14.6; python_version < '3.6'  # cffi 1.15.0 drops support for py35.
diff --git a/charmcraft.yaml b/charmcraft.yaml
index a850351..4968216 100644
--- a/charmcraft.yaml
+++ b/charmcraft.yaml
@@ -2,9 +2,21 @@ type: charm
 
 parts:
   charm:
-    source: src/
-    plugin: reactive
-    build-snaps: [charm]
+    build-packages:
+      - tox
+      - git
+      - python3-dev
+    override-build: |
+      apt-get install ca-certificates -y
+      tox -e build-reactive
+    override-stage: |
+      echo "Copying charm to staging area: $CHARMCRAFT_STAGE"
+      NAME=$(ls $CHARMCRAFT_PART_BUILD/build/builds)
+      cp -r $CHARMCRAFT_PART_BUILD/build/builds/$NAME/* $CHARMCRAFT_STAGE/
+    override-prime: |
+      # For some reason, the normal priming chokes on the fact that there's a
+      # hooks directory.
+      cp -r $CHARMCRAFT_STAGE/* .
 
 bases:
   - name: ubuntu
diff --git a/osci.yaml b/osci.yaml
index 9a94521..741aaf5 100644
--- a/osci.yaml
+++ b/osci.yaml
@@ -7,3 +7,4 @@
     vars:
       needs_charm_build: true
       charm_build_name: keystone-kerberos
+      build_type: charmcraft
diff --git a/rename.sh b/rename.sh
new file mode 100755
index 0000000..d0c35c9
--- /dev/null
+++ b/rename.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+charm=$(grep "charm_build_name" osci.yaml | awk '{print $2}')
+echo "renaming ${charm}_*.charm to ${charm}.charm"
+echo -n "pwd: "
+pwd
+ls -al
+echo "Removing bad downloaded charm maybe?"
+if [[ -e "${charm}.charm" ]];
+then
+    rm "${charm}.charm"
+fi
+echo "Renaming charm here."
+mv ${charm}_*.charm ${charm}.charm
diff --git a/src/test-requirements.txt b/src/test-requirements.txt
index e771023..9c7afb7 100644
--- a/src/test-requirements.txt
+++ b/src/test-requirements.txt
@@ -4,6 +4,9 @@
 #     https://github.com/openstack-charmers/release-tools
 #
 
+# Need tox to be available from tox... inception yes, but its a workaround for now
+tox
+
 # 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/focal-xena.yaml b/src/tests/bundles/focal-xena.yaml
index d29e0b0..f6b085a 100644
--- a/src/tests/bundles/focal-xena.yaml
+++ b/src/tests/bundles/focal-xena.yaml
@@ -1,6 +1,8 @@
 variables:
   openstack-origin: &openstack-origin cloud:focal-xena
 
+local_overlay_enabled: False
+
 series: focal
 comment:
 - 'machines section to decide order of deployment. database sooner = faster'
@@ -48,7 +50,7 @@ applications:
     - '3'
     channel: latest/edge
   keystone-kerberos:
-    charm: ../../../keystone-kerberos
+    charm: ../../../keystone-kerberos.charm
     options:
       kerberos-realm: 'TESTUBUNTU.COM'
       kerberos-server: 'kerberos.testubuntu.com'
diff --git a/src/tests/bundles/focal-yoga.yaml b/src/tests/bundles/focal-yoga.yaml
index 77fae66..8a4d613 100644
--- a/src/tests/bundles/focal-yoga.yaml
+++ b/src/tests/bundles/focal-yoga.yaml
@@ -1,6 +1,8 @@
 variables:
   openstack-origin: &openstack-origin cloud:focal-yoga
 
+local_overlay_enabled: False
+
 series: focal
 comment:
 - 'machines section to decide order of deployment. database sooner = faster'
@@ -48,7 +50,7 @@ applications:
     - '3'
     channel: latest/edge
   keystone-kerberos:
-    charm: ../../../keystone-kerberos
+    charm: ../../../keystone-kerberos.charm
     options:
       kerberos-realm: 'TESTUBUNTU.COM'
       kerberos-server: 'kerberos.testubuntu.com'
diff --git a/src/tests/bundles/impish-xena.yaml b/src/tests/bundles/impish-xena.yaml
index dd141f7..fdc2387 100644
--- a/src/tests/bundles/impish-xena.yaml
+++ b/src/tests/bundles/impish-xena.yaml
@@ -1,6 +1,8 @@
 variables:
   openstack-origin: &openstack-origin distro
 
+local_overlay_enabled: False
+
 series: impish
 comment:
 - 'machines section to decide order of deployment. database sooner = faster'
@@ -48,7 +50,7 @@ applications:
     - '3'
     channel: latest/edge
   keystone-kerberos:
-    charm: ../../../keystone-kerberos
+    charm: ../../../keystone-kerberos.charm
     options:
       kerberos-realm: 'TESTUBUNTU.COM'
       kerberos-server: 'kerberos.testubuntu.com'
diff --git a/src/tests/bundles/jammy-yoga.yaml b/src/tests/bundles/jammy-yoga.yaml
index 889723c..b95e6d0 100644
--- a/src/tests/bundles/jammy-yoga.yaml
+++ b/src/tests/bundles/jammy-yoga.yaml
@@ -1,6 +1,8 @@
 variables:
   openstack-origin: &openstack-origin distro
 
+local_overlay_enabled: False
+
 series: jammy
 comment:
 - 'machines section to decide order of deployment. database sooner = faster'
@@ -48,7 +50,7 @@ applications:
     - '3'
     channel: latest/edge
   keystone-kerberos:
-    charm: ../../../keystone-kerberos
+    charm: ../../../keystone-kerberos.charm
     options:
       kerberos-realm: 'TESTUBUNTU.COM'
       kerberos-server: 'kerberos.testubuntu.com'
diff --git a/src/tests/tests.yaml b/src/tests/tests.yaml
index de936c5..39266ee 100644
--- a/src/tests/tests.yaml
+++ b/src/tests/tests.yaml
@@ -25,7 +25,7 @@ tests_options:
 target_deploy_status:
   keystone-kerberos:
     workload-status: blocked
-    workload-status-message:  "Kerberos configuration incomplete"
+    workload-status-message-prefix: "Kerberos configuration incomplete"
   ubuntu-test-host:
     workload-status: active
-    workload-status-message: ''
+    workload-status-message-prefix: ''
diff --git a/test-requirements.txt b/test-requirements.txt
index bb1307f..a11a7d0 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -51,3 +51,4 @@ pbr==5.6.0       # vault
 cryptography<3.4 # vault, keystone-saml-mellon
 lxml             # keystone-saml-mellon
 hvac             # vault, barbican-vault
+psutil           # cinder-lvm
diff --git a/tox.ini b/tox.ini
index faf6092..2d60b8a 100644
--- a/tox.ini
+++ b/tox.ini
@@ -37,11 +37,24 @@ setenv = VIRTUAL_ENV={envdir}
 passenv = http_proxy https_proxy INTERFACE_PATH LAYER_PATH JUJU_REPOSITORY
 install_command =
   {toxinidir}/pip.sh install {opts} {packages}
+allowlist_externals =
+    charmcraft
+    bash
+    tox
+    rename.sh
 deps =
     -r{toxinidir}/requirements.txt
 
 [testenv:build]
 basepython = python3
+deps = -r{toxinidir}/build-requirements.txt
+commands =
+    charmcraft clean
+    charmcraft -v build
+    {toxinidir}/rename.sh
+
+[testenv:build-reactive]
+basepython = python3
 commands =
     charm-build --log-level DEBUG --use-lock-file-branches -o {toxinidir}/build/builds src {posargs}
 
@@ -86,6 +99,18 @@ deps = flake8==3.9.2
        charm-tools==2.8.3
 commands = flake8 {posargs} src unit_tests
 
+[testenv:func-target]
+# Hack to get functional tests working in the charmcraft
+# world. We should fix this.
+basepython = python3
+passenv = HOME TERM CS_* OS_* TEST_*
+deps = -r{toxinidir}/src/test-requirements.txt
+changedir = {toxinidir}/src
+commands =
+  bash -c "if [ ! -f ../*.charm ]; then echo 'Charm does not exist. Run tox -e build'; exit 1; fi"
+  tox --version
+  tox -e func-target {posargs}
+
 [testenv:cover]
 # Technique based heavily upon
 # https://github.com/openstack/nova/blob/master/tox.ini