From 108a926dee1809a80bc902d255307a4a6185a720 Mon Sep 17 00:00:00 2001 From: Michael Schilonka Date: Thu, 29 Sep 2022 16:41:00 +0200 Subject: [PATCH 1/2] feat: fix SemVer, add EKS support --- getdeck/api/get.py | 13 +- getdeck/configuration.py | 2 + getdeck/docker.py | 12 - getdeck/k8s.py | 2 +- getdeck/provider/beiboot/__init__.py | 39 +- getdeck/sources/helm.py | 6 +- poetry.lock | 645 --------------------------- pyproject.toml | 2 +- 8 files changed, 48 insertions(+), 673 deletions(-) delete mode 100644 getdeck/docker.py delete mode 100644 poetry.lock diff --git a/getdeck/api/get.py b/getdeck/api/get.py index 3027318..872b466 100644 --- a/getdeck/api/get.py +++ b/getdeck/api/get.py @@ -50,6 +50,13 @@ def run_deck( # noqa: C901 if progress_callback: progress_callback(20) + + # change api for beiboot + if k8s_provider.kubernetes_cluster_type == ProviderType.BEIBOOT: + _old_kubeconfig = config.kubeconfig + config.kubeconfig = k8s_provider.get_kubeconfig() + config._init_kubeapi(context="default") + # # 2. generate the Deck's workload # @@ -71,12 +78,6 @@ def run_deck( # noqa: C901 # logger.info("Installing the workload to the cluster") - # change api for beiboot - if k8s_provider.kubernetes_cluster_type == ProviderType.BEIBOOT: - _old_kubeconfig = config.kubeconfig - config.kubeconfig = k8s_provider.get_kubeconfig() - config._init_kubeapi() - if generated_deck.namespace != "default": create_namespace(config, generated_deck.namespace) diff --git a/getdeck/configuration.py b/getdeck/configuration.py index 1406561..835d64b 100644 --- a/getdeck/configuration.py +++ b/getdeck/configuration.py @@ -65,6 +65,8 @@ def __init__( self.kubeconfig = None self.K8S_OBJECT_RETRY = 30 self.K8S_OBJECT_RETRY_TIMEOUT = 2 # in s + self.BEIBOOT_CLUSTER_CREATION_TIMEOUT = 180 # in s + self.BEIBOOT_API_READY_TIMEOUT = 20 # in s def _init_docker(self): import docker diff --git a/getdeck/docker.py b/getdeck/docker.py deleted file mode 100644 index 5bdc818..0000000 --- a/getdeck/docker.py +++ /dev/null @@ -1,12 +0,0 @@ -from getdeck.utils import CMDWrapper - - -class Docker(CMDWrapper): - base_command = "docker" - - def check_running(self, name) -> bool: - """Checks whether an image or a specific container is running.""" - arguments = ["ps"] - process = self._execute(arguments) - output = process.stdout.read() - return name in output diff --git a/getdeck/k8s.py b/getdeck/k8s.py index 4369edf..e3a40bd 100644 --- a/getdeck/k8s.py +++ b/getdeck/k8s.py @@ -57,7 +57,7 @@ def k8s_create_or_patch( _call_and_log(config, api, "create", obj, namespace, **kwargs) break except ApiException as e: - if e.reason == "Internal Server Error": + if e.reason in ["Internal Server Error", "Unprocessable Entity"]: continue if e.reason == "Not Found": logger.debug(e) diff --git a/getdeck/provider/beiboot/__init__.py b/getdeck/provider/beiboot/__init__.py index 2f9fad5..492789c 100644 --- a/getdeck/provider/beiboot/__init__.py +++ b/getdeck/provider/beiboot/__init__.py @@ -1,12 +1,12 @@ import logging from pathlib import Path +from time import sleep from typing import List, Optional import kubernetes.config from getdeck.configuration import ClientConfiguration from beiboot.configuration import ClientConfiguration as BeibootConfiguration -from getdeck.docker import Docker from getdeck.provider.abstract import AbstractProvider from getdeck.provider.errors import NotSupportedError from getdeck.provider.types import ProviderType @@ -71,6 +71,7 @@ def __init__( self._bbt_conf = BeibootConfiguration( kube_config_file=self.config.kubeconfig or _kubeconf, docker_client=self.config.DOCKER, + cluster_timeout=self.config.BEIBOOT_CLUSTER_CREATION_TIMEOUT, kube_context=context_name, ) except kubernetes.config.ConfigException as e: @@ -101,9 +102,18 @@ def create(self) -> bool: connect=True, configuration=self._bbt_conf, ) - - while not Docker().check_running(DOCKER_IMAGE): - continue + _api_proxy_running = False + _i = 0 + while not _api_proxy_running and _i < self.config.BEIBOOT_API_READY_TIMEOUT: + for container in self.config.DOCKER.containers.list(): + if container.name == f"{self.cluster_name}-6443": + # this is the api proxy; check it is running + if container.status == "running": + _api_proxy_running = True + break + else: + _i = _i + 1 + sleep(1) kubeconfig_location = self.get_kubeconfig() logger.info( @@ -113,13 +123,19 @@ def create(self) -> bool: return True def start(self) -> bool: - if not Docker().check_running(DOCKER_IMAGE): + + if not self._check_api_proxy_running(): api.establish_connection( cluster_name=self.cluster_name, configuration=self._bbt_conf ) - while not Docker().check_running(DOCKER_IMAGE): - continue + _i = 0 + while _i < self.config.BEIBOOT_API_READY_TIMEOUT: + if self._check_api_proxy_running(): + break + else: + _i = _i + 1 + sleep(1) kubeconfig_location = self.get_kubeconfig() logger.info( @@ -167,6 +183,15 @@ def get_ports(self) -> List[str]: except KeyError: return [] + def _check_api_proxy_running(self) -> bool: + for container in self.config.DOCKER.containers.list(): + if container.name == f"getdeck-proxy-{self.cluster_name}-6443": + # this is the api proxy; check it is running + if container.status == "running": + return True + else: + return False + class BeibootBuilder: def __init__(self): diff --git a/getdeck/sources/helm.py b/getdeck/sources/helm.py index d1208f8..f1aeb64 100644 --- a/getdeck/sources/helm.py +++ b/getdeck/sources/helm.py @@ -51,11 +51,15 @@ def collect_workload_files(self): @cached_property def k8s_api_version(self) -> str: + import re + req = self.config.K8S_CORE_API.api_client.request( "GET", f"{self.config.K8S_CORE_API.api_client.configuration.host}/version" ) + logger.debug(self.config.K8S_CORE_API.api_client.configuration.host) data = json.loads(req.data) - return f"{data['major']}.{data['minor']}" + logger.debug("Kube API version: " + str(data)) + return f"{re.sub(r'[^0-9]+', '', data['major'])}.{re.sub(r'[^0-9]+', '', data['minor'])}" def _helm_prep(self) -> List[str]: if self.type in ["git", "local"]: diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 64d88ea..0000000 --- a/poetry.lock +++ /dev/null @@ -1,645 +0,0 @@ -[[package]] -name = "attrs" -version = "22.1.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -tests_no_zope = ["cloudpickle", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] -tests = ["cloudpickle", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] -docs = ["sphinx-notfound-page", "zope.interface", "sphinx", "furo"] -dev = ["cloudpickle", "pre-commit", "sphinx-notfound-page", "sphinx", "furo", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] - -[[package]] -name = "beiboot" -version = "0.8.0" -description = "Getdeck Beiboot client project." -category = "main" -optional = false -python-versions = ">=3.9,<4.0" - -[package.dependencies] -docker = ">=6.0.0,<7.0.0" -kubernetes = ">=23.3.0,<24.0.0" - -[[package]] -name = "black" -version = "22.8.0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.6.2" - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "cachetools" -version = "5.2.0" -description = "Extensible memoizing collections and decorators" -category = "main" -optional = false -python-versions = "~=3.7" - -[[package]] -name = "certifi" -version = "2022.6.15.1" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "charset-normalizer" -version = "2.1.1" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" -optional = false -python-versions = ">=3.6.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - -[[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.5" -description = "Cross-platform colored terminal text." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "coverage" -version = "6.4.4" -description = "Code coverage measurement for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} - -[package.extras] -toml = ["tomli"] - -[[package]] -name = "coveralls" -version = "3.3.1" -description = "Show coverage stats online via coveralls.io" -category = "dev" -optional = false -python-versions = ">= 3.5" - -[package.dependencies] -coverage = ">=4.1,<6.0.0 || >6.1,<6.1.1 || >6.1.1,<7.0" -docopt = ">=0.6.1" -requests = ">=1.0.0" - -[package.extras] -yaml = ["PyYAML (>=3.10)"] - -[[package]] -name = "docker" -version = "6.0.0" -description = "A Python library for the Docker Engine API." -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -packaging = ">=14.0" -pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} -requests = ">=2.26.0" -urllib3 = ">=1.26.0" -websocket-client = ">=0.32.0" - -[package.extras] -ssh = ["paramiko (>=2.4.3)"] - -[[package]] -name = "docopt" -version = "0.6.2" -description = "Pythonic argument parser, that will make you smile" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "flake8" -version = "4.0.1" -description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.8.0,<2.9.0" -pyflakes = ">=2.4.0,<2.5.0" - -[[package]] -name = "flake8-black" -version = "0.2.5" -description = "flake8 plugin to call black as a code style validator" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -black = "*" -flake8 = ">=3.0.0" -toml = "*" - -[[package]] -name = "flake8-bugbear" -version = "22.9.11" -description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -attrs = ">=19.2.0" -flake8 = ">=3.0.0" - -[package.extras] -dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit"] - -[[package]] -name = "gitdb" -version = "4.0.9" -description = "Git Object Database" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -smmap = ">=3.0.1,<6" - -[[package]] -name = "gitpython" -version = "3.1.27" -description = "GitPython is a python library used to interact with Git repositories" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -gitdb = ">=4.0.1,<5" - -[[package]] -name = "google-auth" -version = "2.11.0" -description = "Google Authentication Library" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} -six = ">=1.9.0" - -[package.extras] -aiohttp = ["requests (>=2.20.0,<3.0.0dev)", "aiohttp (>=3.6.2,<4.0.0dev)"] -enterprise_cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "kubernetes" -version = "23.6.0" -description = "Kubernetes python client" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -certifi = ">=14.05.14" -google-auth = ">=1.0.1" -python-dateutil = ">=2.5.3" -pyyaml = ">=5.4.1" -requests = "*" -requests-oauthlib = "*" -six = ">=1.9.0" -urllib3 = ">=1.24.2" -websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.0 || >=0.43.0" - -[package.extras] -adal = ["adal (>=1.0.2)"] - -[[package]] -name = "mccabe" -version = "0.6.1" -description = "McCabe checker, plugin for flake8" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "oauthlib" -version = "3.2.1" -description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -rsa = ["cryptography (>=3.0.0)"] -signals = ["blinker (>=1.4.0)"] -signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] - -[[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - -[[package]] -name = "pathspec" -version = "0.10.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "platformdirs" -version = "2.5.2" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -test = ["pytest (>=6)", "pytest-mock (>=3.6)", "pytest-cov (>=2.7)", "appdirs (==1.4.4)"] -docs = ["sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)", "proselint (>=0.10.2)", "furo (>=2021.7.5b38)"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -testing = ["pytest-benchmark", "pytest"] -dev = ["tox", "pre-commit"] - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" - -[[package]] -name = "pycodestyle" -version = "2.8.0" -description = "Python style guide checker" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pydantic" -version = "1.10.2" -description = "Data validation and settings management using python type hints" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -typing-extensions = ">=4.1.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pyflakes" -version = "2.4.0" -description = "passive checker of Python programs" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" -optional = false -python-versions = ">=3.6.8" - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pytest" -version = "7.1.3" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -tomli = ">=1.0.0" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-hosts" -version = "1.0.3" -description = "A hosts file manager library written in python" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pywin32" -version = "304" -description = "Python for Window Extensions" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "requests" -version = "2.28.1" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=3.7, <4" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] - -[[package]] -name = "requests-oauthlib" -version = "1.3.1" -description = "OAuthlib authentication support for Requests." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -oauthlib = ">=3.0.0" -requests = ">=2.0.0" - -[package.extras] -rsa = ["oauthlib[signedtoken] (>=3.0.0)"] - -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -category = "main" -optional = false -python-versions = ">=3.6,<4" - -[package.dependencies] -pyasn1 = ">=0.1.3" - -[[package]] -name = "semantic-version" -version = "2.10.0" -description = "A library implementing the 'SemVer' scheme." -category = "main" -optional = false -python-versions = ">=2.7" - -[package.extras] -doc = ["sphinx-rtd-theme", "sphinx"] -dev = ["colorama (<=0.4.1)", "readme-renderer (<25.0)", "zest.releaser", "wheel", "flake8", "coverage", "check-manifest", "tox", "nose2", "Django (>=1.11)"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "smmap" -version = "5.0.0" -description = "A pure Python implementation of a sliding window memory map manager" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "typing-extensions" -version = "4.3.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "urllib3" -version = "1.26.12" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" - -[package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "websocket-client" -version = "1.4.1" -description = "WebSocket client for Python with low level API options" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.10.0" -content-hash = "2fbab2ea83070176186c6a76fb170d5fa63206b986044bd1564bb04e66e7626a" - -[metadata.files] -attrs = [] -beiboot = [] -black = [] -cachetools = [] -certifi = [] -charset-normalizer = [] -click = [] -colorama = [] -coverage = [] -coveralls = [] -docker = [] -docopt = [] -flake8 = [] -flake8-black = [] -flake8-bugbear = [] -gitdb = [] -gitpython = [] -google-auth = [] -idna = [] -iniconfig = [] -kubernetes = [] -mccabe = [] -mypy-extensions = [] -oauthlib = [] -packaging = [] -pathspec = [] -platformdirs = [] -pluggy = [] -py = [] -pyasn1 = [] -pyasn1-modules = [] -pycodestyle = [] -pydantic = [] -pyflakes = [] -pyparsing = [] -pytest = [] -python-dateutil = [] -python-hosts = [] -pywin32 = [] -pyyaml = [] -requests = [] -requests-oauthlib = [] -rsa = [] -semantic-version = [] -six = [] -smmap = [] -toml = [] -tomli = [] -typing-extensions = [] -urllib3 = [] -websocket-client = [] diff --git a/pyproject.toml b/pyproject.toml index ecd19ab..98a4552 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,7 @@ semantic-version = "^2.9.0" GitPython = "^3.1.27" PyYAML = "^6.0" python-hosts = "^1.0.3" -beiboot = "^0.8.0" +beiboot = "^0.10.0" [tool.poetry.dev-dependencies] From 5c3a15f7092ec4595522f8427ebdbf151e14a37d Mon Sep 17 00:00:00 2001 From: Michael Schilonka Date: Thu, 29 Sep 2022 17:10:31 +0200 Subject: [PATCH 2/2] feat: fix SemVer, add EKS support --- getdeck/api/get.py | 3 +++ getdeck/provider/beiboot/__init__.py | 16 +++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/getdeck/api/get.py b/getdeck/api/get.py index 872b466..2ed0e70 100644 --- a/getdeck/api/get.py +++ b/getdeck/api/get.py @@ -67,6 +67,9 @@ def run_deck( # noqa: C901 except Exception as e: if cluster_created: # remove this just created cluster as it probably is in an inconsistent state from the beginning + if k8s_provider.kubernetes_cluster_type == ProviderType.BEIBOOT: + config.kubeconfig = _old_kubeconfig + config._init_kubeapi() remove.remove_cluster(deckfile_location, config) raise e diff --git a/getdeck/provider/beiboot/__init__.py b/getdeck/provider/beiboot/__init__.py index 492789c..935cf15 100644 --- a/getdeck/provider/beiboot/__init__.py +++ b/getdeck/provider/beiboot/__init__.py @@ -102,15 +102,10 @@ def create(self) -> bool: connect=True, configuration=self._bbt_conf, ) - _api_proxy_running = False _i = 0 - while not _api_proxy_running and _i < self.config.BEIBOOT_API_READY_TIMEOUT: - for container in self.config.DOCKER.containers.list(): - if container.name == f"{self.cluster_name}-6443": - # this is the api proxy; check it is running - if container.status == "running": - _api_proxy_running = True - break + while _i < self.config.BEIBOOT_API_READY_TIMEOUT: + if self._check_api_proxy_running(): + break else: _i = _i + 1 sleep(1) @@ -188,7 +183,10 @@ def _check_api_proxy_running(self) -> bool: if container.name == f"getdeck-proxy-{self.cluster_name}-6443": # this is the api proxy; check it is running if container.status == "running": - return True + if "Forwarding" in container.logs().decode(): + return True + else: + return False else: return False