Skip to content

Commit

Permalink
feat: add kubeconfig / context flag (#153)
Browse files Browse the repository at this point in the history
* feat: add kubeconfig / context flag
* refactor: get_client_configuration for only one init
* fix: client config parser for up command
  • Loading branch information
SteinRobert authored Aug 19, 2022
1 parent a7ed918 commit a435f25
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 97 deletions.
21 changes: 20 additions & 1 deletion .github/workflows/python-tester.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,17 @@ jobs:
python-version: '3.x'
- name: Install Poetry
uses: snok/install-poetry@v1
- name: Set Gefyra to no tracking
- name: Set Gefyra tracking config / fake kubeconfig
shell: bash
run: |
mkdir -p ~/.gefyra
mkdir -p ~/.kube
cd ~/.gefyra
touch config.ini
echo "[telemetry]" >> config.ini
echo "track = False" >> config.ini
cd ~/.kube
touch config
- name: Pytest
working-directory: ./client
run: |
Expand All @@ -89,6 +92,22 @@ jobs:
- name: Apply some workload
run: |
kubectl apply -f testing/workloads/hello.yaml
- name: Run gefyra check
working-directory: ./client
run: |
poetry run coverage run -a -m gefyra check
- name: Run gefyra up with invalid kubeconfig path
working-directory: ./client
shell: bash --noprofile --norc -o pipefail {0}
run: |
poetry run coverage run -a -m gefyra --kubeconfig=/there/is/no/config up
test $? -eq 1
- name: Run gefyra up with invalid context
working-directory: ./client
shell: bash --noprofile --norc -o pipefail {0}
run: |
poetry run coverage run -a -m gefyra --context=invalid-context up
test $? -eq 1
- name: Run gefyra up
working-directory: ./client
run: |
Expand Down
92 changes: 47 additions & 45 deletions client/gefyra/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
)
action = parser.add_subparsers(dest="action", help="the action to be performed")
parser.add_argument("-d", "--debug", action="store_true", help="add debug output")
parser.add_argument("--kubeconfig", required=False, help="path to kubeconfig file")
parser.add_argument("--context", required=False, help="context name from kubeconfig")


up_parser = action.add_parser("up")
Expand Down Expand Up @@ -199,35 +201,6 @@ def get_intercept_kwargs(parser_args):
return kwargs


def up_command(args):
from gefyra.api import up

if args.minikube and bool(args.endpoint):
raise RuntimeError("You cannot use --endpoint together with --minikube.")

if args.minikube:
configuration = detect_minikube_config(args)
else:
if not args.endpoint:
# #138: Read in the --endpoint parameter from kubeconf
endpoint = get_connection_from_kubeconfig()
if endpoint:
logger.info(f"Setting --endpoint from kubeconfig {endpoint}")
else:
endpoint = args.endpoint

configuration = ClientConfiguration(
cargo_endpoint=endpoint,
registry_url=args.registry,
operator_image_url=args.operator,
stowaway_image_url=args.stowaway,
cargo_image_url=args.cargo,
carrier_image_url=args.carrier,
wireguard_mtu=args.wireguard_mtu,
)
up(config=configuration)


def version(config, check: bool):
import requests

Expand Down Expand Up @@ -258,16 +231,40 @@ def telemetry_command(on, off):
logger.info("Invalid flags. Please use either --off or --on.")


def get_client_configuration(args) -> ClientConfiguration:
configuration_params = {}

if args.kubeconfig:
configuration_params["kube_config_file"] = args.kubeconfig
if args.context:
configuration_params["kube_context"] = args.context

if args.action == "up":
if args.minikube and bool(args.endpoint):
raise RuntimeError("You cannot use --endpoint together with --minikube.")

if args.minikube:
configuration_params.update(detect_minikube_config())
else:
if not args.endpoint:
# #138: Read in the --endpoint parameter from kubeconf
endpoint = get_connection_from_kubeconfig()
if endpoint:
logger.info(f"Setting --endpoint from kubeconfig {endpoint}")
else:
endpoint = args.endpoint

configuration_params["cargo_endpoint"] = endpoint

configuration = ClientConfiguration(**configuration_params)

return configuration


def main():
try:
from gefyra import configuration
from gefyra.api import (
bridge,
down,
run,
unbridge,
unbridge_all,
)
from gefyra.api import bridge, down, run, unbridge, unbridge_all, up
from gefyra.local.check import probe_kubernetes, probe_docker

args = parser.parse_args()
Expand All @@ -276,8 +273,11 @@ def main():
else:
logger.setLevel(logging.INFO)
logger.addHandler(configuration.console)

configuration = get_client_configuration(args)

if args.action == "up":
up_command(args)
up(config=configuration)
elif args.action == "run":
run(
image=args.image,
Expand All @@ -288,6 +288,7 @@ def main():
env=args.env,
ports=args.expose,
volumes=args.volume,
config=configuration,
)
elif args.action == "bridge":
bridge(
Expand All @@ -297,30 +298,31 @@ def main():
namespace=args.namespace,
bridge_name=args.bridge_name,
handle_probes=not args.no_probe_handling,
config=configuration,
**get_intercept_kwargs(args),
)
elif args.action == "unbridge":
if args.name:
unbridge(args.name)
unbridge(args.name, config=configuration)
elif args.all:
unbridge_all()
unbridge_all(config=configuration)
else:
logger.warning(
"Unbridge failed. Please use command with either -N or -A flag."
)
elif args.action == "list":
if args.containers:
get_containers_and_print()
get_containers_and_print(config=configuration)
elif args.bridges:
get_bridges_and_print()
get_bridges_and_print(config=configuration)
else:
get_containers_and_print()
get_bridges_and_print()
get_containers_and_print(config=configuration)
get_bridges_and_print(config=configuration)
elif args.action == "down":
down()
down(config=configuration)
elif args.action == "check":
probe_docker()
probe_kubernetes()
probe_kubernetes(config=configuration)
elif args.action == "version":
check = not args.no_check
version(configuration, check)
Expand Down
8 changes: 4 additions & 4 deletions client/gefyra/api/list.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@
logger = logging.getLogger(__name__)


def get_containers_and_print():
def get_containers_and_print(config: default_configuration):
from gefyra.api import list_containers

containers = list_containers()
containers = list_containers(config=config)
print(
tabulate(
containers, headers=["NAME", "IP ADDRESS", "NAMESPACE"], tablefmt="plain"
)
)


def get_bridges_and_print():
def get_bridges_and_print(config: default_configuration):
from gefyra.api import list_interceptrequests

ireqs = list_interceptrequests()
ireqs = list_interceptrequests(config=config)
if ireqs:
for ireq in ireqs:
print(ireq)
Expand Down
6 changes: 6 additions & 0 deletions client/gefyra/configuration.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from os import path
import struct
import socket
import sys
Expand Down Expand Up @@ -131,6 +132,11 @@ def __init__(
self.CARGO_PROBE_TIMEOUT = 10 # in seconds
self.CONTAINER_RUN_TIMEOUT = 10 # in seconds
self.KUBE_CONFIG_FILE = kube_config_file
if self.KUBE_CONFIG_FILE:
if not path.isfile(path.expanduser(self.KUBE_CONFIG_FILE)):
raise RuntimeError(
f"KUBE_CONFIG_FILE {self.KUBE_CONFIG_FILE} not found."
)
self.KUBE_CONTEXT = kube_context

self.WIREGUARD_MTU = wireguard_mtu or "1340"
Expand Down
22 changes: 7 additions & 15 deletions client/gefyra/local/minikube.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
import logging
from pathlib import Path

from gefyra.configuration import ClientConfiguration

logger = logging.getLogger("gefyra")

MINIKUBE_CONFIG = "~/.minikube/profiles/minikube/config.json"
Expand All @@ -24,10 +22,9 @@ def _get_a_worker_ip(config: dict):
raise RuntimeError("This Minikube cluster does not have a worker node.")


def detect_minikube_config(args) -> ClientConfiguration:
def detect_minikube_config() -> dict:
"""
Read the config for a local Minikube cluster from its configuration file and set Gefyra accordingly
:param args: CLI args
:return: a preped ClientConfiguration object
"""
try:
Expand Down Expand Up @@ -58,14 +55,9 @@ def detect_minikube_config(args) -> ClientConfiguration:
f"Minikube setup with driver '{driver}' network '{network_name}' and endpoint '{endpoint}'"
)

configuration = ClientConfiguration(
network_name=network_name,
cargo_endpoint=f"{endpoint}:31820",
registry_url=args.registry,
operator_image_url=args.operator,
stowaway_image_url=args.stowaway,
cargo_image_url=args.cargo,
carrier_image_url=args.carrier,
kube_context="minikube",
)
return configuration
configuration_parameters = {
"network_name": network_name,
"cargo_endpoint": f"{endpoint}:31820",
"kube_context": "minikube",
}
return configuration_parameters
Loading

0 comments on commit a435f25

Please sign in to comment.