Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/SK-1202 | Added log-in functionality #759

Merged
merged 14 commits into from
Dec 2, 2024
1 change: 1 addition & 0 deletions fedn/cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@
from .status_cmd import status_cmd # noqa: F401
from .validation_cmd import validation_cmd # noqa: F401
from .controller_cmd import controller_cmd # noqa: F401
from .login_cmd import login_cmd # noqa: F401
3 changes: 0 additions & 3 deletions fedn/cli/combiner_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ def list_combiners(ctx, protocol: str, host: str, port: str, token: str = None,
if _token:
headers["Authorization"] = _token


try:
response = requests.get(url, headers=headers)
print_response(response, "combiners", None)
Expand All @@ -112,7 +111,6 @@ def get_combiner(ctx, protocol: str, host: str, port: str, token: str = None, id
url = get_api_url(protocol=protocol, host=host, port=port, endpoint="combiners")
headers = {}


_token = get_token(token)

if _token:
Expand All @@ -121,7 +119,6 @@ def get_combiner(ctx, protocol: str, host: str, port: str, token: str = None, id
if id:
url = f"{url}{id}"


try:
response = requests.get(url, headers=headers)
print_response(response, "combiner", id)
Expand Down
61 changes: 61 additions & 0 deletions fedn/cli/login_cmd.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import os
from getpass import getpass

import click
import requests
import yaml

from .main import main

# Replace this with the platform's actual login endpoint
home_dir = os.path.expanduser("~")


@main.group("studio")
@click.pass_context
def login_cmd(ctx):
""":param ctx:"""
pass


@login_cmd.command("login")
@click.option("-p", "--protocol", required=False, default="https", help="Communication protocol")
@click.option("-H", "--host", required=False, default="fedn.scaleoutsystems.com", help="Hostname of controller (api)")
@click.pass_context
def login_cmd(ctx, protocol: str, host: str):
"""Logging into FEDn Studio"""
# Step 1: Display welcome message
click.secho("Welcome to Scaleout FEDn!", fg="green")

url = f"{protocol}://{host}/api/token/"

# Step 3: Prompt for username and password
username = input("Please enter your username: ")
password = getpass("Please enter your password: ")

# Call the authentication API
try:
response = requests.post(url, json={"username": username, "password": password}, headers={"Content-Type": "application/json"})
response.raise_for_status() # Raise an error for HTTP codes 4xx/5xx
except requests.exceptions.RequestException as e:
click.secho("Error connecting to the platform. Please try again.", fg="red")
click.secho(str(e), fg="red")
return

# Handle the response
if response.status_code == 200:
data = response.json()
if data.get("access"):
click.secho("Login successful!", fg="green")
context_path = os.path.join(home_dir, ".fedn")
if not os.path.exists(context_path):
os.makedirs(context_path)
try:
with open(f"{context_path}/context.yaml", "w") as yaml_file:
yaml.dump(data, yaml_file, default_flow_style=False) # Add access and refresh tokens to context yaml file
except Exception as e:
print(f"Error: Failed to write to YAML file. Details: {e}")
else:
click.secho("Login failed. Please check your credentials.", fg="red")
else:
click.secho(f"Unexpected error: {response.text}", fg="red")
2 changes: 1 addition & 1 deletion fedn/utils/dist.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import fedn


def get_version(pacakge):
def get_version(package):
# Dynamically get the version of the package
try:
version = importlib.metadata.version("fedn")
Expand Down
Loading