cli: add api client class
This commit is contained in:
parent
02ea437f6e
commit
83e6f17575
65
services/tools/cli/api.py
Normal file
65
services/tools/cli/api.py
Normal 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}")
|
||||||
@ -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']
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user