From eac1950d98930735063aa1eaf6b79d3b26dcd7c0 Mon Sep 17 00:00:00 2001
From: Felipe Reyes <felipe.reyes@canonical.com>
Date: Tue, 11 Jan 2022 15:24:18 -0300
Subject: [PATCH] Add 'model_name' configuration option.

model_name can be set in ~/.zaza.yaml to alter the way zaza names models
created, the format of the string is parsed by string.Template(). This
would allow users to force zaza to use a fixed model name (e.g.
'mymodel') which becomes especially useful when the juju provider used
is LXD since model names are mapped to LXD profiles.
---
 unit_tests/test_zaza_charm_lifecycle_utils.py | 8 +++++++-
 zaza/charm_lifecycle/utils.py                 | 9 ++++++++-
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/unit_tests/test_zaza_charm_lifecycle_utils.py b/unit_tests/test_zaza_charm_lifecycle_utils.py
index d1f8e6f68..258463b5d 100644
--- a/unit_tests/test_zaza_charm_lifecycle_utils.py
+++ b/unit_tests/test_zaza_charm_lifecycle_utils.py
@@ -162,12 +162,18 @@ def test_get_environment_deploy_single_aliased(self):
                 {'alias': 'bundle'}),
             expect)
 
-    def test_generate_model_name(self):
+    @mock.patch('zaza.utilities.deployment_env.get_setup_file_contents')
+    def test_generate_model_name(self, get_setup_file_contents):
+        get_setup_file_contents.return_value = {}
         self.patch_object(lc_utils.uuid, "uuid4")
         self.uuid4.return_value = "longer-than-12characters"
         self.assertEqual(lc_utils.generate_model_name(),
                          "zaza-12characters")
 
+        get_setup_file_contents.return_value = {'model_name': 'mymodel-$UUID'}
+        self.assertEqual(lc_utils.generate_model_name(),
+                         "mymodel-12characters")
+
     def test_get_charm_config(self):
         self.patch("builtins.open",
                    new_callable=mock.mock_open(),
diff --git a/zaza/charm_lifecycle/utils.py b/zaza/charm_lifecycle/utils.py
index 88565ad75..ef42541ee 100644
--- a/zaza/charm_lifecycle/utils.py
+++ b/zaza/charm_lifecycle/utils.py
@@ -23,7 +23,10 @@
 import sys
 import yaml
 
+from string import Template
+
 import zaza.global_options
+import zaza.utilities.deployment_env as deployment_env
 
 
 BUNDLE_DIR = "./tests/bundles/"
@@ -31,6 +34,7 @@
 DEFAULT_CONFIG_YAML = "tests.yaml"
 DEFAULT_TEST_CONFIG = "./{}/{}".format(DEFAULT_TEST_DIR, DEFAULT_CONFIG_YAML)
 DEFAULT_MODEL_ALIAS = "default_alias"
+DEFAULT_MODEL_NAME = 'zaza-$UUID'
 DEFAULT_DEPLOY_NAME = 'default{}'
 
 RAW_BUNDLE = "raw-bundle"
@@ -486,7 +490,10 @@ def generate_model_name():
     :returns: Model name
     :rtype: str
     """
-    return 'zaza-{}'.format(str(uuid.uuid4())[-12:])
+    model_name_fmt = deployment_env.get_setup_file_contents().get(
+        "model_name", DEFAULT_MODEL_NAME)
+    tpl = Template(model_name_fmt)
+    return tpl.safe_substitute({"UUID": str(uuid.uuid4())[-12:]})
 
 
 def check_output_logging(cmd):