add CLI command

This commit is contained in:
Max Erenberg 2021-12-18 02:31:35 -05:00
parent 470b442e4c
commit 0153cac644
8 changed files with 74 additions and 2 deletions

View File

@ -8,6 +8,7 @@ from .mysql import mysql
from .postgresql import postgresql
from .mailman import mailman
from .cloud import cloud
from .k8s import k8s
@click.group()
@ -23,3 +24,4 @@ cli.add_command(mysql)
cli.add_command(postgresql)
cli.add_command(mailman)
cli.add_command(cloud)
cli.add_command(k8s)

42
ceo/cli/k8s.py Normal file
View File

@ -0,0 +1,42 @@
import os
import traceback
import click
from ..utils import http_post
from .utils import handle_sync_response
@click.group(short_help='Manage your CSC Kubernetes resources')
def k8s():
pass
@k8s.group(short_help='Manage your CSC Kubernetes account')
def account():
pass
@account.command(short_help='Obtain a kubeconfig')
def activate():
kubedir = os.path.join(os.environ['HOME'], '.kube')
if not os.path.isdir(kubedir):
os.mkdir(kubedir)
kubeconfig = os.path.join(kubedir, 'config')
resp = http_post('/api/cloud/k8s/accounts/create')
result = handle_sync_response(resp)
try:
if os.path.isfile(kubeconfig):
kubeconfig_bak = os.path.join(kubedir, 'config.bak')
os.rename(kubeconfig, kubeconfig_bak)
with open(kubeconfig, 'w') as fo:
fo.write(result['kubeconfig'])
except Exception:
click.echo(traceback.format_exc())
click.echo("We weren't able to write the kubeconfig file, so here it is.")
click.echo("Make sure to paste this into your ~/.kube/config.")
click.echo()
click.echo(result['kubeconfig'])
return
click.echo("Congratulations! You have a new kubeconfig in ~/.kube/config.")
click.echo("Run `kubectl cluster-info` to make sure everything is working.")

View File

@ -25,6 +25,7 @@ class KubernetesService:
self.server_url = cfg.get('k8s_server_url')
self.jinja_env = jinja2.Environment(
loader=jinja2.PackageLoader('ceod.model'),
keep_trailing_newline=True,
)
def _run(self, args: List[str], check=True, **kwargs) -> subprocess.CompletedProcess:

View File

@ -35,6 +35,7 @@ class MailService:
self.base_domain = cfg.get('base_domain')
self.jinja_env = jinja2.Environment(
loader=jinja2.PackageLoader('ceod.model'),
keep_trailing_newline=True,
)
def send(self, _from: str, to: str, headers: Dict[str, str], content: str):

View File

@ -60,6 +60,7 @@ class VHostManager:
self.jinja_env = jinja2.Environment(
loader=jinja2.PackageLoader('ceod.model'),
keep_trailing_newline=True,
)
rate_limit_secs = cfg.get('cloud vhosts_rate_limit_seconds')

View File

@ -9,8 +9,8 @@ contexts:
cluster: kubernetes
namespace: {{ namespace }}
user: {{ username }}
name: {{ namespace }}
current-context: {{ namespace }}
name: {{ username }}
current-context: {{ username }}
kind: Config
preferences: {}
users:

View File

@ -1,3 +1,5 @@
import os
from click.testing import CliRunner
from ...utils import gssapi_token_ctx
@ -55,3 +57,22 @@ def test_cloud_vhosts(cli_setup, new_user, cfg):
expected = 'Done.\n'
assert result.exit_code == 0
assert result.output == expected
def test_k8s_account_activate(cli_setup, new_user):
uid = new_user.uid
runner = CliRunner()
old_home = os.environ['HOME']
os.environ['HOME'] = new_user.home_directory
try:
with gssapi_token_ctx(uid):
result = runner.invoke(cli, ['k8s', 'account', 'activate'])
finally:
os.environ['HOME'] = old_home
expected = (
"Congratulations! You have a new kubeconfig in ~/.kube/config.\n"
"Run `kubectl cluster-info` to make sure everything is working.\n"
)
assert result.exit_code == 0
assert result.output == expected
assert os.path.isfile(os.path.join(new_user.home_directory, '.kube', 'config'))

View File

@ -203,3 +203,7 @@ def test_k8s_create_account(client, new_user, ldap_conn):
assert status == 200
assert data['status'] == 'OK'
assert 'kubeconfig' in data
expire_member(new_user, ldap_conn)
status, _ = client.post('/api/cloud/k8s/accounts/create', principal=uid)
assert status == 403