From d9536592985a0575d82c56f21f4315cad888ed8c Mon Sep 17 00:00:00 2001 From: Julio Faerman <356476+faermanj@users.noreply.github.com> Date: Tue, 14 Nov 2023 22:46:07 +0000 Subject: [PATCH] loading plugin files from modules --- .gitpod.yml | 6 +- up_splat/up_splat/__init__.py | 4 +- .../splat/create/cluster/oci-standard/up.yaml | 3 +- up_splat/up_splat/up.yaml | 7 ++- uplib/uplib/__init__.py | 1 - uplib/uplib/config.py | 5 +- uplib/uplib/logging.py | 1 + uplib/uplib/match.py | 6 +- uplib/uplib/plugins.py | 62 +++++++++++++++---- 9 files changed, 66 insertions(+), 29 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index 1039755..eb6115e 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -1,9 +1,9 @@ tasks: - - name: CLI - init: | - ./install_all.sh + - name: UP CLI + init: | echo "Installed at $(date)" command: | + ./install_all.sh alias up='poetry run up' cd upcli echo "Ready at $(date)" diff --git a/up_splat/up_splat/__init__.py b/up_splat/up_splat/__init__.py index 717a065..5993c13 100644 --- a/up_splat/up_splat/__init__.py +++ b/up_splat/up_splat/__init__.py @@ -1,8 +1,8 @@ from uplib import pm from up_splat import containers_for_prompt -print("Loading up_splat...") + pm.register(containers_for_prompt) -print("Loaded up_splat.") + diff --git a/up_splat/up_splat/splat/create/cluster/oci-standard/up.yaml b/up_splat/up_splat/splat/create/cluster/oci-standard/up.yaml index 6d53195..fce0501 100644 --- a/up_splat/up_splat/splat/create/cluster/oci-standard/up.yaml +++ b/up_splat/up_splat/splat/create/cluster/oci-standard/up.yaml @@ -5,5 +5,4 @@ env: - TENANCY_ID - TENANCY_COMPARTMENT_ID - ZONE_ID - - AI_OFFLINETOKEN - - PULL_SECRET + diff --git a/up_splat/up_splat/up.yaml b/up_splat/up_splat/up.yaml index c52008b..a131ed8 100644 --- a/up_splat/up_splat/up.yaml +++ b/up_splat/up_splat/up.yaml @@ -1 +1,6 @@ -# here goes some yaml \ No newline at end of file +# here goes some yaml +prompts: + - prompt: "splat create cluster oci-standard" + env: + - AI_OFFLINETOKEN + - PULL_SECRET diff --git a/uplib/uplib/__init__.py b/uplib/uplib/__init__.py index e4a081c..2e02e7b 100644 --- a/uplib/uplib/__init__.py +++ b/uplib/uplib/__init__.py @@ -10,7 +10,6 @@ hookspec = pluggy.HookspecMarker("up") hookimpl = pluggy.HookimplMarker("up") pm = pluggy.PluginManager("up") -settings_files = [] from .match import does_match, if_prompt_matches from .containers import ContainerRun, ContainerRuns diff --git a/uplib/uplib/config.py b/uplib/uplib/config.py index 2c29875..ab01584 100644 --- a/uplib/uplib/config.py +++ b/uplib/uplib/config.py @@ -1,16 +1,13 @@ from dynaconf import Dynaconf import logging -from . import settings_files _settings = None def settings(): global _settings if not _settings: _settings = Dynaconf( - environments=True, envvar_prefix="UP", - settings_files=settings_files - ) + load_dotenv=True,) return _settings def get_log_level(): diff --git a/uplib/uplib/logging.py b/uplib/uplib/logging.py index dede573..247f213 100644 --- a/uplib/uplib/logging.py +++ b/uplib/uplib/logging.py @@ -2,6 +2,7 @@ import logging from .config import get_log_level +TRACE = 5 def init_logging(): sys.set_int_max_str_digits(999999) diff --git a/uplib/uplib/match.py b/uplib/uplib/match.py index 6907a11..e74cee8 100644 --- a/uplib/uplib/match.py +++ b/uplib/uplib/match.py @@ -1,6 +1,6 @@ from typing import Callable from .containers import ContainerRun -from .logging import log +from .logging import log, TRACE from . import Prompt def does_match(prompt: Prompt, args) -> bool: @@ -16,7 +16,7 @@ def if_prompt_matches(mk_run_config: Callable[[], ContainerRun], if not prompt: return None if does_match(prompt, args): - log.debug(f"MATCH: prompt={prompt}, args={args}") + log.log(TRACE ,f"MATCH: prompt={prompt}, args={args}") return [mk_run_config(prompt)] - log.debug(f"NO MATCH: prompt={prompt}, args={args}") + log.log(TRACE, f"NO MATCH: prompt={prompt}, args={args}") return None diff --git a/uplib/uplib/plugins.py b/uplib/uplib/plugins.py index abc9156..ec66956 100644 --- a/uplib/uplib/plugins.py +++ b/uplib/uplib/plugins.py @@ -2,8 +2,9 @@ import pkgutil import os import pluggy +import json +from dynaconf import Dynaconf -from . import settings_files from .containers import Containers from .hookspecs import containers_for_prompt from .logging import log @@ -12,28 +13,63 @@ def load_plugins(context): log.info("Loading plugins") plugin_names = [] + settings_files = [] for finder, name, ispkg in pkgutil.iter_modules(): if name.startswith('up_'): - plugin_name = importlib.import_module(name) + plugin_mod = importlib.import_module(name) plugin_names.append(name) - plugin_path = os.path.dirname(plugin_name.__file__) - load_plugin(plugin_name, plugin_path) - log.info("Discovered %s plugins: %s", len(plugin_names), str(plugin_names)) - log.info("Discovered %s config files: %s", len(settings_files), str(settings_files)) + plugin_path = os.path.dirname(plugin_mod.__file__) + plugin_ok, settings_ok = load_plugin(plugin_mod, plugin_path) + if plugin_ok: + plugin_names.append(plugin_ok) + if settings_ok: + settings_files.append(settings_ok) + log.debug("Discovered %s plugins: %s", len(plugin_names), str(plugin_names)) + log.debug("Discovered %s config files: %s", len(settings_files), str(settings_files)) # create a manager and add the spec # TODO: Check if this is needed pm.load_setuptools_entrypoints("up") # TODO: Check if this is needed pm.add_hookspecs(hookspec) -def load_plugin(plugin_name, plugin_path): - log.info("Loading plugin %s from %s", plugin_name, plugin_path) +def load_plugin(plugin_name, plugin_dir): + log.debug("Loading plugin %s:%s", plugin_name, plugin_dir) + settings_file = None try: - plugin_file = plugin_path + "/up.yaml" - file_exists = os.path.isfile(plugin_file) + plugin_file = "up.yaml" + settings_path = plugin_dir + "/" + plugin_file + file_exists = os.path.isfile(settings_path) if file_exists: - settings_files.append(plugin_file) - log.info("Found up.yaml in plugin %s: %s", plugin_name, plugin_file) + log.debug("Loading settings from %s:%s", plugin_name, settings_path) + settings = load_settings(plugin_name, settings_path) + settings_file = settings_path else: - log.info("No up.yaml found in plugin %s: %s", plugin_name, plugin_file) + log.debug("No settings file found on %s:%s", plugin_name, plugin_dir) except Exception as e: log.error("Error loading plugin %s: %s", plugin_name, str(e)) + plugin_name = None + return (plugin_name, settings_file) + +def load_settings(plugin_name, settings_path): + env_prefix = prefix_for(plugin_name) + settings = Dynaconf( + load_dotenv=True, + envvar_prefix = env_prefix, + settings_file=settings_path, + ) + # Load Environment Variables + prompts = settings.get("prompts", []) + log.info("Loading %s prompts: %s", len(prompts), prompts) + + # Load Volumes + # Load Ports + # ... + log.info("Settings loaded "+str(type(settings))) + return settings + + + +def prefix_for(plugin_mod): + plugin_name = plugin_mod.__name__ + plugin_name = plugin_name.replace("-", "_") + plugin_name = plugin_name.upper() + return plugin_name \ No newline at end of file