Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 11 additions & 15 deletions getdeck/api/get.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import logging
import os
import shutil
from typing import Callable

from getdeck.api import stopwatch, remove
Expand All @@ -23,22 +21,23 @@ def run_deck( # noqa: C901
progress_callback: Callable = None,
) -> bool:
from getdeck.sources.utils import prepare_k8s_workload_for_deck
from getdeck.utils import read_deckfile_from_location, ensure_cluster
from getdeck.utils import ensure_cluster
from getdeck.k8s import k8s_create_or_patch, get_ingress_rules
from getdeck.fetch.fetch import fetch_data

cluster_created = False
if progress_callback:
progress_callback(0)

deckfile, working_dir_path, is_temp_dir = read_deckfile_from_location(
deckfile_location, config
)
data_aux = fetch_data(deckfile_location, deck_name=deck_name)
if progress_callback:
progress_callback(5)
#
# 1. set up a local K8s cluster
#
k8s_provider = ensure_cluster(deckfile, config, ignore_cluster, do_install=True)
k8s_provider = ensure_cluster(
data_aux.deckfile, config, ignore_cluster, do_install=True
)
if progress_callback:
progress_callback(10)
# 1.b check or set up local cluster
Expand All @@ -62,9 +61,7 @@ def run_deck( # noqa: C901
# 2. generate the Deck's workload
#
try:
generated_deck = prepare_k8s_workload_for_deck(
config, deckfile, deck_name, working_dir_path
)
generated_deck = prepare_k8s_workload_for_deck(config, data_aux, deck_name)
except Exception as e:
if cluster_created:
# remove this just created cluster as it probably is in an inconsistent state from the beginning
Expand Down Expand Up @@ -124,17 +121,16 @@ def run_deck( # noqa: C901
if ingress_rules:
for host, path in ingress_rules:
logger.info(f"Ingress: {host} -> {path}")
handle_hosts_resolution(deckfile_location, deckfile, deck_name)
handle_hosts_resolution(deckfile_location, data_aux.deckfile, deck_name)
logger.info(f"Published ports are: {k8s_provider.get_ports()}")
if notes := deckfile.get_deck(deck_name).notes:
if notes := data_aux.deckfile.get_deck(deck_name).notes:
logger.info(notes)

# TODO: refactor/remove?
if is_temp_dir and os.path.isdir(working_dir_path):
shutil.rmtree(working_dir_path)
del data_aux

if wait:
_wait_ready(config, generated_deck, timeout)

return True


Expand Down
17 changes: 4 additions & 13 deletions getdeck/api/hosts.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
import logging
import os
import shutil
import socket

from python_hosts import Hosts, HostsEntry

from getdeck.api import stopwatch
from getdeck.configuration import default_configuration
from getdeck.utils import read_deckfile_from_location
from getdeck.fetch.fetch import fetch_data

logger = logging.getLogger("deck")

Expand All @@ -17,12 +14,9 @@ def run_hosts(
deckfile_location: str,
host_action: str,
deck_name: str = None,
config=default_configuration,
) -> bool:
deckfile, working_dir_path, is_temp_dir = read_deckfile_from_location(
deckfile_location, config
)
deck = deckfile.get_deck(deck_name)
data_aux = fetch_data(deckfile_location, deck_name=deck_name)
deck = data_aux.deckfile.get_deck(deck_name)
deck_hosts = deck.hosts

hosts = Hosts()
Expand Down Expand Up @@ -55,10 +49,7 @@ def run_hosts(
else:
logger.info("No hosts specified in Deckfile")

# TODO: refactor/remove?
if is_temp_dir and os.path.isdir(working_dir_path):
shutil.rmtree(working_dir_path)

del data_aux
return True


Expand Down
19 changes: 5 additions & 14 deletions getdeck/api/list.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,17 @@
import logging
import os
import shutil
from typing import List

from getdeck.api.utils import stopwatch
from getdeck.configuration import default_configuration
from getdeck.fetch.fetch import fetch_data

logger = logging.getLogger("deck")


@stopwatch
def get_available_decks(deckfile_location: str, config=default_configuration) -> List:
from getdeck.utils import read_deckfile_from_location
def get_available_decks(deckfile_location: str) -> List:
data_aux = fetch_data(deckfile_location)
available_decks = data_aux.deckfile.get_decks()
del data_aux

deckfile, working_dir_path, is_temp_dir = read_deckfile_from_location(
deckfile_location, config
)
available_decks = deckfile.get_decks()
logger.debug(available_decks)

# TODO: refactor/remove?
if is_temp_dir and os.path.isdir(working_dir_path):
shutil.rmtree(working_dir_path)

return available_decks
36 changes: 14 additions & 22 deletions getdeck/api/remove.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import logging
import os
import shutil
from typing import Callable

from getdeck.configuration import default_configuration
from getdeck.api import stopwatch
from getdeck.fetch.fetch import fetch_data


logger = logging.getLogger("deck")
Expand All @@ -16,21 +15,18 @@ def remove_cluster(
config=default_configuration,
ignore_cluster: bool = False,
) -> bool:
from getdeck.utils import read_deckfile_from_location, ensure_cluster
from getdeck.utils import ensure_cluster

deckfile, working_dir_path, is_temp_dir = read_deckfile_from_location(
deckfile_location, config
data_aux = fetch_data(deckfile_location, fetch_sources=False)
k8s_provider = ensure_cluster(
data_aux.deckfile, config, ignore_cluster, do_install=False
)
k8s_provider = ensure_cluster(deckfile, config, ignore_cluster, do_install=False)
if k8s_provider.exists():
k8s_provider.delete()
else:
logger.info("Cluster does not exist")

# TODO: refactor/remove?
if is_temp_dir and os.path.isdir(working_dir_path):
shutil.rmtree(working_dir_path)

del data_aux
return True


Expand All @@ -45,24 +41,23 @@ def remove_deck(
if progress_callback:
progress_callback(0)

from getdeck.utils import read_deckfile_from_location, ensure_cluster
from getdeck.utils import ensure_cluster
from getdeck.k8s import k8s_delete_object
from getdeck.sources.utils import prepare_k8s_workload_for_deck

deckfile, working_dir_path, is_temp_dir = read_deckfile_from_location(
deckfile_location, config
)
data_aux = fetch_data(deckfile_location, deck_name=deck_name)

if progress_callback:
progress_callback(10)
k8s_provider = ensure_cluster(deckfile, config, ignore_cluster, do_install=False)
k8s_provider = ensure_cluster(
data_aux.deckfile, config, ignore_cluster, do_install=False
)
if progress_callback:
progress_callback(20)

config.kubeconfig = k8s_provider.get_kubeconfig()
if k8s_provider.exists():
generated_deck = prepare_k8s_workload_for_deck(
config, deckfile, deck_name, working_dir_path
)
generated_deck = prepare_k8s_workload_for_deck(config, data_aux, deck_name)
logger.info(f"Removing Deck {generated_deck.name}")
if progress_callback:
progress_callback(30)
Expand All @@ -87,8 +82,5 @@ def remove_deck(
else:
logger.info("Cluster does not exist")

# TODO: refactor/remove?
if is_temp_dir and os.path.isdir(working_dir_path):
shutil.rmtree(working_dir_path)

del data_aux
return True
18 changes: 6 additions & 12 deletions getdeck/api/stop.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import logging
import os
import shutil
from typing import Callable

from getdeck.api import stopwatch
from getdeck.configuration import default_configuration
from getdeck.fetch.fetch import fetch_data

logger = logging.getLogger("deck")

Expand All @@ -14,18 +12,14 @@ def stop_cluster(
deckfile_location: str,
ignore_cluster: bool = False,
config=default_configuration,
progress_callback: Callable = None,
) -> bool:
from getdeck.utils import read_deckfile_from_location, ensure_cluster
from getdeck.utils import ensure_cluster

deckfile, working_dir_path, is_temp_dir = read_deckfile_from_location(
deckfile_location, config
data_aux = fetch_data(deckfile_location)
k8s_provider = ensure_cluster(
data_aux.deckfile, config, ignore_cluster, do_install=False
)
k8s_provider = ensure_cluster(deckfile, config, ignore_cluster, do_install=False)
logger.info("Stopping cluster")

# TODO: refactor/remove?
if is_temp_dir and os.path.isdir(working_dir_path):
shutil.rmtree(working_dir_path)

del data_aux
k8s_provider.stop()
9 changes: 4 additions & 5 deletions getdeck/deckfile/deckfile_1.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,10 @@ class Deckfile_1_0(Deckfile, BaseModel):
decks: List[DeckfileDeck]

def get_deck(self, name: str = None) -> DeckfileDeck:
if name is None and len(self.decks) > 1:
raise ValueError(
"Name of Deck is missing and there are multiple Decks available"
)
elif name is None and len(self.decks) == 1:
if name is None and len(self.decks) >= 1:
for deck in self.decks:
if deck.name.lower() == "default":
return deck
return self.decks[0]
else:
for deck in self.decks:
Expand Down
39 changes: 26 additions & 13 deletions getdeck/deckfile/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

from pydantic import BaseModel

from getdeck.configuration import ClientConfiguration
from getdeck.deckfile.errors import DeckfileError
from getdeck.provider.abstract import AbstractProvider

Expand All @@ -17,7 +16,7 @@ class DeckfileCluster(BaseModel):
name: str
nativeConfig: dict = None

def get_provider(self, config: ClientConfiguration) -> AbstractProvider:
def get_provider(self, config) -> AbstractProvider:
from getdeck.provider.factory import cluster_factory
from getdeck.provider.types import ProviderType

Expand Down Expand Up @@ -49,10 +48,14 @@ class DeckfileHelmSource(BaseModel):
helmPlugins: List[str] = None


class DeckfileInlineSource(BaseModel):
type: str = "inline"
content: Dict = None


class DeckfileFileSource(BaseModel):
type: str = "file"
ref: str = None
content: Dict = None
targetRevision: str = ""
path: str = ""

Expand All @@ -79,9 +82,10 @@ class DeckfileDeck(BaseModel):
hosts: List[str] = []
sources: List[
Union[
DeckfileHelmSource,
DeckfileDirectorySource,
DeckfileInlineSource,
DeckfileFileSource,
DeckfileDirectorySource,
DeckfileHelmSource,
DeckfileKustomizeSource,
]
]
Expand All @@ -93,14 +97,23 @@ def __init__(self, *args, **data):
if tsources:
try:
for source in tsources:
if source["type"].lower() == "helm":
self.sources.append(DeckfileHelmSource(**source))
elif source["type"].lower() == "file":
self.sources.append(DeckfileFileSource(**source))
elif source["type"].lower() == "directory":
self.sources.append(DeckfileDirectorySource(**source))
elif source["type"].lower() == "kustomize":
self.sources.append(DeckfileKustomizeSource(**source))
# inline deprecated warning
source_type = source["type"].lower()
if source_type == "file" and source.get("content", None):
logger.warning(
"'type: file' is deprecated for inline sources, "
"use 'type: inline' instead",
)
source_type = "inline"

source_class = {
"inline": DeckfileInlineSource,
"file": DeckfileFileSource,
"directory": DeckfileDirectorySource,
"kustomize": DeckfileKustomizeSource,
"helm": DeckfileHelmSource,
}.get(source_type)
self.sources.append(source_class(**source))
except KeyError:
raise DeckfileError(
f"A source from Deck {data.get('name')} did not specify the 'type' argument."
Expand Down
3 changes: 1 addition & 2 deletions getdeck/deckfile/selector.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
DeckfileVersionError,
DeckfileError,
)
from getdeck.deckfile.file import Deckfile
from getdeck.deckfile.deckfile_1 import Deckfile_1_0

logger = logging.getLogger("deck")
Expand All @@ -21,7 +20,7 @@ class DeckfileSelector:
def __init__(self, options: dict):
self.options = options

def get(self, path_deckfile: str = None) -> Union[Deckfile, Deckfile_1_0, None]:
def get(self, path_deckfile: str = None) -> Union[Deckfile_1_0, None]:
# default file path
if not path_deckfile:
path_deckfile = os.path.join(os.getcwd(), configuration.DECKFILE_FILE)
Expand Down
Empty file added getdeck/fetch/__init__.py
Empty file.
Loading