Skip to content

Commit

Permalink
eks: support app logic
Browse files Browse the repository at this point in the history
  • Loading branch information
karmab committed Dec 25, 2024
1 parent 0fb85e5 commit 9c26859
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 9 deletions.
34 changes: 29 additions & 5 deletions kvirt/baseconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -966,16 +966,22 @@ def info_openshift_sno(self, quiet, web=False):
self.info_plan(inputfile, quiet=quiet, web=web)

def create_app(self, app, overrides={}, outputdir=None):
kubetype = get_kubetype()
kubetype = overrides.get('kubetype') or get_kubetype()
if kubetype == 'openshift':
return self.create_app_openshift(app, overrides, outputdir)
elif kubetype == 'eks':
return self.create_app_eks(app, overrides, outputdir)
else:
return self.create_app_generic(app, overrides, outputdir)

def create_app_generic(self, app, overrides={}, outputdir=None):
appdir = f"{os.path.dirname(kubeadm.create.__code__.co_filename)}/apps"
return common.create_app_generic(self, app, appdir, overrides=overrides, outputdir=outputdir)

def create_app_eks(self, app, overrides={}, outputdir=None):
from kvirt.cluster import eks
return eks.create_app(self, app, overrides)

def create_app_openshift(self, app, overrides={}, outputdir=None):
appdir = f"{os.path.dirname(openshift.create.__code__.co_filename)}/apps"
if app in kdefaults.LOCAL_OPENSHIFT_APPS:
Expand Down Expand Up @@ -1003,16 +1009,22 @@ def create_app_openshift(self, app, overrides={}, outputdir=None):
return common.create_app_openshift(self, app, appdir, app_data, outputdir)

def delete_app(self, app, overrides={}):
kubetype = get_kubetype()
kubetype = overrides.get('kubetype') or get_kubetype()
if kubetype == 'openshift':
return self.delete_app_openshift(app, overrides)
elif kubetype == 'eks':
return self.delete_app_eks(app, overrides)
else:
return self.delete_app_generic(app, overrides)

def delete_app_generic(self, app, overrides={}):
appdir = f"{os.path.dirname(kubeadm.create.__code__.co_filename)}/apps"
return common.delete_app_delete_generic(self, app, appdir, overrides=overrides)

def delete_app_eks(self, app, overrides={}):
from kvirt.cluster import eks
return eks.delete_app(self, app, overrides)

def delete_app_openshift(self, app, overrides={}):
appdir = f"{os.path.dirname(openshift.create.__code__.co_filename)}/apps"
if app in kdefaults.LOCAL_OPENSHIFT_APPS:
Expand All @@ -1030,9 +1042,11 @@ def delete_app_openshift(self, app, overrides={}):
return common.delete_app_openshift(self, app, appdir, app_data)

def info_app(self, app, overrides={}):
kubetype = get_kubetype()
kubetype = overrides.get('kubetype') or get_kubetype()
if kubetype == 'openshift':
return self.info_app_openshift(app, overrides)
elif kubetype == 'eks':
return self.info_app_eks(app)
else:
return self.info_app_generic(app)

Expand All @@ -1048,6 +1062,10 @@ def info_app_generic(self, app):
with open(default_parameter_file, 'r') as f:
print(f.read().strip())

def info_app_eks(self, app):
from kvirt.cluster import eks
return eks.info_app(self, app)

def info_app_openshift(self, app, overrides={}):
plandir = os.path.dirname(openshift.create.__code__.co_filename)
if app not in kdefaults.LOCAL_OPENSHIFT_APPS:
Expand All @@ -1069,10 +1087,12 @@ def info_app_openshift(self, app, overrides={}):
with open(default_parameter_file, 'r') as f:
print(f.read().strip())

def list_apps(self, quiet=True, installed=False):
kubetype = get_kubetype()
def list_apps(self, quiet=True, installed=False, overrides={}):
kubetype = overrides.get('kubetype') or get_kubetype()
if kubetype == 'openshift':
return self.list_apps_openshift(quiet=quiet, installed=installed)
elif kubetype == 'eks':
return self.list_apps_eks(quiet=quiet, installed=installed)
else:
return self.list_apps_generic(quiet=quiet)

Expand All @@ -1081,6 +1101,10 @@ def list_apps_generic(self, quiet=True):
appdir = plandir + '/apps'
return sorted([x for x in os.listdir(appdir) if os.path.isdir(f"{appdir}/{x}") and x != '__pycache__'])

def list_apps_eks(self, quiet=True, installed=False):
from kvirt.cluster import eks
return eks.list_apps(self, quiet=quiet, installed=installed)

def list_apps_openshift(self, quiet=True, installed=False):
if installed:
header = 'subscription.operators.coreos.com/'
Expand Down
7 changes: 4 additions & 3 deletions kvirt/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -1301,6 +1301,7 @@ def delete_app(args):


def list_apps(args):
overrides = handle_parameters(args.param, args.paramfile, cluster=True)
kubectl = which('kubectl') or which('oc')
if kubectl is None:
error("You need kubectl/oc to list apps")
Expand All @@ -1310,7 +1311,7 @@ def list_apps(args):
elif not os.path.isabs(os.environ['KUBECONFIG']):
os.environ['KUBECONFIG'] = f"{os.getcwd()}/{os.environ['KUBECONFIG']}"
baseconfig = Kbaseconfig(client=args.client, debug=args.debug, offline=True)
apps = baseconfig.list_apps(quiet=True, installed=args.installed)
apps = baseconfig.list_apps(quiet=True, installed=args.installed, overrides=overrides)
output = args.global_output or args.output
if output is not None:
_list_output(apps, output)
Expand Down Expand Up @@ -3383,7 +3384,7 @@ def cli():
aliases=['add', 'run', 'install'])
create_subparsers = create_parser.add_subparsers(metavar='', dest='subcommand_create')

createapp_desc = 'Create Kube Apps'
createapp_desc = 'Create Kube App'
createapp_parser = create_subparsers.add_parser('app', description=createapp_desc,
help=createapp_desc, aliases=['apps', 'operator', 'operators'],
parents=[parent_parser])
Expand Down Expand Up @@ -4586,7 +4587,7 @@ def cli():
listapp_desc = 'List Available Kube Apps'
listapp_parser = list_subparsers.add_parser('app', description=listapp_desc,
help=listapp_desc, aliases=['apps', 'operator', 'operators'],
parents=[output_parser])
parents=[parent_parser, output_parser])
listapp_parser.add_argument('-i', '--installed', action='store_true', help='Show installed apps')
listapp_parser.set_defaults(func=list_apps)

Expand Down
72 changes: 71 additions & 1 deletion kvirt/cluster/eks/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import boto3
from kvirt.common import success, info2, pprint, error, fix_typos, warning
from kvirt.common import success, info2, pprint, error, fix_typos, warning, pretty_print
import os
import re
import yaml
from yaml import safe_dump, safe_load

Expand All @@ -12,6 +13,11 @@
AUTOMODE_WORKER_POLICIES = ['AmazonEC2ContainerRegistryPullOnly', 'AmazonEKSWorkerNodeMinimalPolicy']


def get_cluster_name():
kclidir = os.path.expanduser('~/.kcli/clusters')
return re.sub(f'{kclidir}/(.*)/auth/kubeconfig', r'\1', os.environ.get('KUBECONFIG'))


def project_init(config):
access_key_id = config.options.get('access_key_id')
access_key_secret = config.options.get('access_key_secret')
Expand Down Expand Up @@ -59,6 +65,26 @@ def get_kubeconfig(config, cluster, zonal=True):
f.write(config_text)


def process_apps(config, clusterdir, apps, overrides):
if not apps:
return
os.environ['KUBECONFIG'] = f"{clusterdir}/auth/kubeconfig"
for app in apps:
base_data = overrides.copy()
if isinstance(app, str):
app = {'name': app}
app_data = app
appname = app.get('name')
if appname is None:
error(f"Missing name in dict {app}. Skipping")
continue
app_data.update(base_data)
pprint(f"Adding app {appname}")
result = config.create_app_eks(appname, app_data)
if result != 0:
error(f"Issue adding app {appname}")


def scale(config, plandir, cluster, overrides):
data = {'workers': 2,
'network': 'default',
Expand Down Expand Up @@ -104,6 +130,7 @@ def create(config, plandir, cluster, overrides, dnsconfig=None):
fix_typos(data)
k = config.k
version = data['version']
apps = overrides.get('apps', [])
workers = data['workers']
ctlplane_role = data['ctlplane_role']
worker_role = data['worker_role']
Expand Down Expand Up @@ -247,6 +274,8 @@ def create(config, plandir, cluster, overrides, dnsconfig=None):
success(f"Kubernetes cluster {cluster} deployed!!!")
info2(f"export KUBECONFIG=$HOME/.kcli/clusters/{cluster}/auth/kubeconfig")
info2("export PATH=$PWD:$PATH")
os.environ['KUBECONFIG'] = f"{clusterdir}/auth/kubeconfig"
process_apps(config, clusterdir, apps, overrides)
return {'result': 'success'}


Expand Down Expand Up @@ -311,3 +340,44 @@ def info(config, cluster, debug=False):

def info_service(config, zonal=True):
return {}


def list_apps(config, quiet=False, installed=False):
access_key_id, access_key_secret, session_token, region = project_init(config)
eks = boto3.client('eks', aws_access_key_id=access_key_id, aws_secret_access_key=access_key_secret,
region_name=region, aws_session_token=session_token)
if installed:
cluster = get_cluster_name()
return eks.list_addons(clusterName=cluster).get('addons', [])
else:
return [i['addonName'] for i in eks.describe_addon_versions().get('addons', [])]


def create_app(config, app, overrides={}):
access_key_id, access_key_secret, session_token, region = project_init(config)
eks = boto3.client('eks', aws_access_key_id=access_key_id, aws_secret_access_key=access_key_secret,
region_name=region, aws_session_token=session_token)
cluster = get_cluster_name()
data = {'clusterName': cluster, 'addonName': app}
if 'version' in overrides:
data['addonVersion'] = overrides['version']
eks.create_addon(**data)


def delete_app(config, app, overrides={}):
access_key_id, access_key_secret, session_token, region = project_init(config)
eks = boto3.client('eks', aws_access_key_id=access_key_id, aws_secret_access_key=access_key_secret,
region_name=region, aws_session_token=session_token)
cluster = get_cluster_name()
eks.delete_addon(clusterName=cluster, addonName=app)


def info_app(config, app):
access_key_id, access_key_secret, session_token, region = project_init(config)
eks = boto3.client('eks', aws_access_key_id=access_key_id, aws_secret_access_key=access_key_secret,
region_name=region, aws_session_token=session_token)
data = eks.describe_addon_versions(addonName=app).get('addons', [])
if data:
pretty_print(data[0])
else:
error(f"App {app} not found")

0 comments on commit 9c26859

Please sign in to comment.