-
Bjarke Madsen authoredBjarke Madsen authored
organization.py 3.17 KiB
"""
Grafana Organization management helpers.
"""
import random
import string
import logging
import jinja2
import json
import os
from typing import Dict, List, Union
from datetime import datetime
from brian_dashboard_manager.grafana.utils.request import AdminRequest, \
TokenRequest
from brian_dashboard_manager.grafana.dashboard import create_dashboard
logger = logging.getLogger(__name__)
def switch_active_organization(request: AdminRequest, org_id: int):
assert org_id
logger.debug(f'Switched {str(request)} active organization to #{org_id}')
return request.post(f'api/user/using/{org_id}', {})
def get_organizations(request: AdminRequest) -> List:
return request.get('api/orgs')
def create_organization(request: AdminRequest, name: str) -> Union[Dict, None]:
assert name
result = request.post('api/orgs', json={
'name': name
})
if result.get('message', '').lower() == 'organization created':
id = result.get('orgId')
logger.info(f'Created organization `{name}` with ID #{id}')
return {'id': id, 'name': name}
else:
return None
def delete_organization(request: AdminRequest, id: int) -> bool:
result = request.delete(f'api/orgs/{id}')
return result.get('message', '').lower() == 'organization deleted'
def create_api_token(request: AdminRequest, org_id: int, key_data=None):
characters = string.ascii_uppercase + string.digits
name = ''.join(random.choices(characters, k=16))
data = {
'name': name,
'role': 'Admin',
'secondsToLive': 3600 # 60 minutes
}
if key_data:
data.update(key_data)
switch_active_organization(request, org_id)
result = request.post('api/auth/keys', json=data)
token_id = result.get('id')
logger.debug(f'Created API token #{token_id} for organization #{org_id}')
return result
def delete_api_token(request: AdminRequest, token_id: int, org_id=None):
assert token_id
if org_id:
switch_active_organization(request, org_id)
result = request.delete(f'api/auth/keys/{token_id}')
logger.debug(f'Deleted API token #{token_id}')
return result
def delete_expired_api_tokens(request: AdminRequest) -> bool:
tokens = request.get('api/auth/keys', params={'includeExpired': True})
now = datetime.utcnow()
def is_expired(token):
date = datetime.strptime(token['expiration'], '%Y-%m-%dT%H:%M:%SZ')
return date < now
expired_tokens = [t for t in tokens if 'expiration' in t and is_expired(t)]
for token in expired_tokens:
delete_api_token(request, token['id'])
return True
def set_home_dashboard(request: TokenRequest, is_staff):
file = os.path.abspath(os.path.join(
os.path.dirname(__file__),
'..',
'templating',
'templates',
'homedashboard.json.j2'))
with open(file) as f:
template = jinja2.Template(f.read())
rendered = template.render({'staff': is_staff})
rendered = json.loads(rendered)
dashboard = create_dashboard(request, rendered)
r = request.put('api/org/preferences', json={
'homeDashboardId': dashboard.get('id')
})
return r and r.get('message') == 'Preferences updated'