CLI and list command for instance
This commit is contained in:
parent
b16a423a9d
commit
1f588d5364
4 changed files with 48 additions and 27 deletions
|
@ -23,7 +23,7 @@ class KiwiCLI(click.MultiCommand):
|
|||
"""import and return a specific command"""
|
||||
|
||||
try:
|
||||
mod = __import__(f"kiwi_scp.commands.cmd_{name}", None, None, ["cmd"])
|
||||
mod = __import__(f"kiwi_scp.commands.cmd_{name}", None, None, ["CMD"])
|
||||
except ImportError:
|
||||
return
|
||||
return mod.CMD
|
||||
|
@ -31,17 +31,17 @@ class KiwiCLI(click.MultiCommand):
|
|||
|
||||
class KiwiCommand:
|
||||
@classmethod
|
||||
def run_for_instance(cls, instance: Instance, **kwargs):
|
||||
def run_for_instance(cls, instance: Instance, **kwargs) -> None:
|
||||
for project in instance.config.projects:
|
||||
cls.run_for_project(instance, project.name, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def run_for_project(cls, instance: Instance, project_name: str, **kwargs):
|
||||
def run_for_project(cls, instance: Instance, project_name: str, **kwargs) -> None:
|
||||
service_names = [service.name for service in instance.get_services(project_name, None).content]
|
||||
cls.run_for_services(instance, project_name, service_names, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def run_for_services(cls, instance: Instance, project_name: str, services: List[str], **kwargs):
|
||||
def run_for_services(cls, instance: Instance, project_name: str, services: List[str], **kwargs) -> None:
|
||||
pass
|
||||
|
||||
|
||||
|
|
|
@ -1,29 +1,43 @@
|
|||
from typing import List
|
||||
|
||||
import click
|
||||
|
||||
from .cli import KiwiCommandType, KiwiCommand
|
||||
from .decorators import kiwi_command
|
||||
from ..config import ProjectConfig
|
||||
from ..instance import Instance, Services
|
||||
from ..instance import Instance
|
||||
|
||||
|
||||
@click.option(
|
||||
"-s/-S",
|
||||
"--show/--no-show",
|
||||
help=f"EXAMPLE",
|
||||
help=f"show actual config contents instead",
|
||||
)
|
||||
@kiwi_command(
|
||||
"list",
|
||||
KiwiCommandType.PROJECT,
|
||||
KiwiCommandType.SERVICE,
|
||||
short_help="Inspect a kiwi-scp instance",
|
||||
)
|
||||
class CMD(KiwiCommand):
|
||||
@classmethod
|
||||
def run_for_instance(cls, instance: Instance, show: bool = None, **kwargs):
|
||||
print(show)
|
||||
print(instance.config.projects)
|
||||
"""List projects in this instance, services inside a project or service(s) inside a project"""
|
||||
|
||||
@classmethod
|
||||
def run_for_services(cls, instance: Instance, project: ProjectConfig, services: Services, show: bool = None,
|
||||
def run_for_instance(cls, instance: Instance, show: bool = None, **kwargs):
|
||||
if show:
|
||||
click.secho(f"Showing config for kiwi-scp instance at '{instance.directory}'.", fg="green", bold=True)
|
||||
click.echo_via_pager(instance.config.kiwi_yml)
|
||||
|
||||
else:
|
||||
click.secho(f"Projects in kiwi-scp instance at '{instance.directory}':", fg="green", bold=True)
|
||||
|
||||
for project in instance.config.projects:
|
||||
click.echo(
|
||||
click.style(" - ", fg="green") +
|
||||
click.style(project.name, fg="blue") +
|
||||
click.style(' (disabled)' if not project.enabled else '', fg="red")
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def run_for_services(cls, instance: Instance, project_name: str, services: List[str], show: bool = None,
|
||||
**kwargs):
|
||||
print(show)
|
||||
print(services)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import logging
|
||||
from typing import Callable, Type, Optional, Tuple
|
||||
|
||||
import click
|
||||
|
@ -9,11 +10,13 @@ _pass_instance = click.make_pass_decorator(
|
|||
Instance,
|
||||
ensure=True,
|
||||
)
|
||||
|
||||
_project_arg = click.argument(
|
||||
"project",
|
||||
required=False,
|
||||
type=str,
|
||||
)
|
||||
|
||||
_services_arg = click.argument(
|
||||
"services",
|
||||
metavar="[SERVICE]...",
|
||||
|
@ -21,33 +24,40 @@ _services_arg = click.argument(
|
|||
type=str,
|
||||
)
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def kiwi_command(
|
||||
name: str,
|
||||
command_type: KiwiCommandType,
|
||||
**kwargs,
|
||||
**decorator_kwargs,
|
||||
) -> Callable:
|
||||
def decorator(command_cls: Type[KiwiCommand]) -> Callable:
|
||||
|
||||
@click.command(name, **kwargs)
|
||||
@click.command(
|
||||
name,
|
||||
help=command_cls.__doc__,
|
||||
**decorator_kwargs,
|
||||
)
|
||||
@_pass_instance
|
||||
def cmd(ctx: Instance, project: Optional[str] = None, services: Optional[Tuple[str]] = None,
|
||||
**cmd_kwargs) -> None:
|
||||
print(f"{ctx.directory!r}: {project!r}, {services!r}")
|
||||
**kwargs) -> None:
|
||||
|
||||
_logger.debug(f"{ctx.directory!r}: {project!r}, {services!r}")
|
||||
if project is None:
|
||||
# run for whole instance
|
||||
print(f"for instance: {cmd_kwargs}")
|
||||
command_cls.run_for_instance(ctx, **cmd_kwargs)
|
||||
_logger.debug(f"running for instance, kwargs={kwargs}")
|
||||
command_cls.run_for_instance(ctx, **kwargs)
|
||||
|
||||
elif not services:
|
||||
# run for one entire project
|
||||
print(f"for project {project}: {cmd_kwargs}")
|
||||
command_cls.run_for_project(ctx, project, **cmd_kwargs)
|
||||
_logger.debug(f"running for project {project}, kwargs={kwargs}")
|
||||
command_cls.run_for_project(ctx, project, **kwargs)
|
||||
|
||||
else:
|
||||
# run for some services
|
||||
print(f"for services {project}.{services}: {cmd_kwargs}")
|
||||
command_cls.run_for_services(ctx, project, list(services), **cmd_kwargs)
|
||||
_logger.debug(f"running for services {services} in project {project}, kwargs={kwargs}")
|
||||
command_cls.run_for_services(ctx, project, list(services), **kwargs)
|
||||
|
||||
if command_type is KiwiCommandType.PROJECT:
|
||||
cmd = _project_arg(cmd)
|
||||
|
|
|
@ -5,10 +5,7 @@ from kiwi_scp.commands.cli import KiwiCLI
|
|||
|
||||
@click.command(cls=KiwiCLI)
|
||||
def main():
|
||||
"""main entry point for command line interface"""
|
||||
|
||||
click.echo("Hello main")
|
||||
pass
|
||||
"""kiwi is the simple tool for managing container servers."""
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
Loading…
Reference in a new issue