From 8a57e7b14c818c93655819757d99b69747c9b2ca Mon Sep 17 00:00:00 2001
From: John Estabrook <jestabro@vyos.io>
Date: Wed, 19 Jun 2024 20:37:23 -0500
Subject: migration: T6007: use load_as_module_source for files without
 extension

---
 python/vyos/compose_config.py |  4 ++--
 python/vyos/utils/system.py   | 13 ++++++++++++-
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/python/vyos/compose_config.py b/python/vyos/compose_config.py
index b1c277bce..79a8718c5 100644
--- a/python/vyos/compose_config.py
+++ b/python/vyos/compose_config.py
@@ -23,7 +23,7 @@ from typing import TypeAlias, Union, Callable
 
 from vyos.configtree import ConfigTree
 from vyos.configtree import deep_copy as ct_deep_copy
-from vyos.utils.system import load_as_module
+from vyos.utils.system import load_as_module_source
 
 ConfigObj: TypeAlias = Union[str, ConfigTree]
 
@@ -64,7 +64,7 @@ class ComposeConfig:
         """
         try:
             mod_name = Path(func_file).stem.replace('-', '_')
-            mod = load_as_module(mod_name, func_file)
+            mod = load_as_module_source(mod_name, func_file)
             func = getattr(mod, func_name)
         except Exception as e:
             raise ComposeConfigError(f'Error with {func_file}: {e}') from e
diff --git a/python/vyos/utils/system.py b/python/vyos/utils/system.py
index f427032a4..fca93d118 100644
--- a/python/vyos/utils/system.py
+++ b/python/vyos/utils/system.py
@@ -99,6 +99,18 @@ def load_as_module(name: str, path: str):
     spec.loader.exec_module(mod)
     return mod
 
+def load_as_module_source(name: str, path: str):
+    """ Necessary modification of load_as_module for files without *.py
+    extension """
+    import importlib.util
+    from importlib.machinery import SourceFileLoader
+
+    loader = SourceFileLoader(name, path)
+    spec = importlib.util.spec_from_loader(name, loader)
+    mod = importlib.util.module_from_spec(spec)
+    spec.loader.exec_module(mod)
+    return mod
+
 def get_uptime_seconds():
     """ Returns system uptime in seconds """
     from re import search
@@ -127,4 +139,3 @@ def get_load_averages():
     res[15] = float(matches["fifteen"]) / core_count
 
     return res
-
-- 
cgit v1.2.3