cli: add api client class

This commit is contained in:
tylen 2025-03-04 21:35:16 +00:00
parent 02ea437f6e
commit 83e6f17575
2 changed files with 79 additions and 14 deletions

65
services/tools/cli/api.py Normal file
View File

@ -0,0 +1,65 @@
import requests
class ApiClient():
def __init__(self, api_url, default_token=None):
super().__init__()
self.api_url = api_url
self.default_token = default_token
def __request(self, endpoint, payload=None, params=None, method='GET', token=None):
if payload is None:
payload = {}
if params is None:
params = {}
request_url = f'{self.api_url}{endpoint}'
headers = {}
if token is None:
token = self.default_token
if token:
headers['Authorization'] = f'Bearer {token}'
try:
if method.upper() == 'POST':
response = requests.post(request_url, json=payload, headers=headers)
elif method.upper() == 'GET':
response = requests.get(request_url, params=params, headers=headers)
elif method.upper() == 'PUT':
response = requests.put(request_url, json=payload, headers=headers)
elif method.upper() == 'DELETE':
response = requests.delete(request_url, json=payload, headers=headers)
else:
raise ValueError("Unsupported HTTP method: {}".format(method))
if response.status_code != 200:
self.warning(f'Return code {response.status_code} from {endpoint} with message {response.text}')
except requests.exceptions.RequestException as e:
self.error("An error occurred:", e)
return None
return response
def get(self, endpoint, params=None, token=None):
return self.__request(endpoint, method='GET', params=params, token=token)
def post(self, endpoint, payload=None, token=None):
return self.__request(endpoint, payload=payload, method='POST', token=token)
def put(self, endpoint, payload=None, token=None):
return self.__request(endpoint, payload=payload, method='PUT', token=token)
def delete(self, endpoint, payload=None, token=None):
return self.__request(endpoint, payload=payload, method='DELETE', token=token)
def reassign_token(self, token):
self.default_token = token
def warning(self, message):
print(f"WARNING: {message}")
def error(self, message, exception=None):
print(f"ERROR: {message}")
if exception:
print(f"Exception: {exception}")

View File

@ -1,4 +1,5 @@
import json import json
from api import ApiClient
from base import BaseCLi from base import BaseCLi
from constants import ( from constants import (
DEFAULT_PORTAINER_JWT_CONFIG_FILE, DEFAULT_PORTAINER_JWT_CONFIG_FILE,
@ -19,7 +20,8 @@ class PortainerHost(BaseCLi):
def __init__(self, host_url): def __init__(self, host_url):
super().__init__() super().__init__()
self.host_url = host_url self.host_url = host_url
self.api_url = f'{host_url}/api' api_url = f'{host_url}/api'
self.api = ApiClient(api_url=api_url)
self.jwt_config = {} self.jwt_config = {}
self.jwt_token = '' self.jwt_token = ''
home_directory = os.path.expanduser("~") home_directory = os.path.expanduser("~")
@ -44,10 +46,11 @@ class PortainerHost(BaseCLi):
raise EmptyConfigException() raise EmptyConfigException()
def __create_config(self, file_path): def __create_config(self, file_path):
self.jwt_token = self.__get_jwt_token() jwt_token = self.__get_jwt_token()
self.jwt_config[self.host_url] = { self.jwt_config[self.host_url] = {
"jwt": self.jwt_token, "jwt": jwt_token,
} }
self.api.reassign_token(jwt_token)
with open(file_path, 'w') as file: with open(file_path, 'w') as file:
json.dump(self.jwt_config, file, indent=4) json.dump(self.jwt_config, file, indent=4)
@ -62,17 +65,14 @@ class PortainerHost(BaseCLi):
"Username": get_env(FUNCTIONAL_USER_USERNAME_ENV), "Username": get_env(FUNCTIONAL_USER_USERNAME_ENV),
"Password": get_env(FUNCTIONAL_USER_PASSWORD_ENV) "Password": get_env(FUNCTIONAL_USER_PASSWORD_ENV)
} }
auth_endpoint = f'{self.api_url}/auth'
response = self.api.post('/auth', payload=payload)
try: try:
response = requests.post( token = response.json()['jwt']
auth_endpoint, except KeyError:
json=payload self.error('No "jwt" key in /auth response found.')
) return token
if response.status_code != 200:
self.error(f'Return code {response.status_code} from {auth_endpoint} with message {response.text}')
except requests.exceptions.RequestException as e:
self.error("An error occurred:", e)
data = response.json()
return data['jwt']