astara-horizon/akanda_horizon/rug_openstack_dashboard/api/rug.py

140 lines
4.6 KiB
Python

from datetime import datetime
from django.conf import settings
from horizon.utils import functions as utils
import netaddr
import requests as r
from openstack_dashboard.api.nova import novaclient
from openstack_dashboard.api.neutron import neutronclient
def _mgt_url(host, port, path):
if ':' in host:
host = '[%s]' % host
return 'http://%s:%s%s' % (host, port, path)
def _make_request(url):
try:
return r.put(url).ok
except r.RequestException:
return False
def _get_local_service_ip(management_prefix):
mgt_net = netaddr.IPNetwork(management_prefix)
rug_ip = '%s/%s' % (netaddr.IPAddress(mgt_net.first + 1),
mgt_net.prefixlen)
return rug_ip
class Router(object):
id = ''
name = ''
status = ''
latest = ''
image_name = ''
last_fetch = ''
booted = ''
def __init__(self, **kw):
for k, v in kw.items():
setattr(self, k, v)
class RugClient(object):
def __init__(self):
self.host = (
_get_local_service_ip(settings.RUG_MANAGEMENT_PREFIX)
.split('/')[0]
)
self.port = settings.RUG_API_PORT
self.image_uuid = settings.ROUTER_IMAGE_UUID
self.api_limit = getattr(settings, 'API_RESULT_LIMIT', 1000)
def poll(self):
path = '/poll'
return _make_request(_mgt_url(self.host, self.port, path))
def config_reload(self):
path = '/config/reload'
return _make_request(_mgt_url(self.host, self.port, path))
def workers_debug(self):
path = '/workers/debug'
return _make_request(_mgt_url(self.host, self.port, path))
def router_debug(self, router_id):
path = '/router/debug/{router_id}'.format(router_id=router_id)
return _make_request(_mgt_url(self.host, self.port, path))
def router_manage(self, router_id):
path = '/router/manage/{router_id}'.format(router_id=router_id)
return _make_request(_mgt_url(self.host, self.port, path))
def router_update(self, router_id):
path = '/router/update/{router_id}'.format(router_id=router_id)
return _make_request(_mgt_url(self.host, self.port, path))
def router_rebuild(self, router_id, router_image_uuid=None):
if router_image_uuid:
path = ('/router/rebuild/{router_id}/--router_image_uuid/' +
'{router_image_uuid}').format(
router_id=router_id,
router_image_uuid=router_image_uuid
)
else:
path = '/router/rebuild/{router_id}/'.format(router_id=router_id)
return _make_request(_mgt_url(self.host, self.port, path))
def tenant_debug(self, tenant_id):
path = '/tenant/debug/{tenant_id}'.format(tenant_id=tenant_id)
return _make_request(_mgt_url(self.host, self.port, path))
def tenant_manage(self, tenant_id):
path = '/tenant/manage/{tenant_id}'.format(tenant_id=tenant_id)
return _make_request(_mgt_url(self.host, self.port, path))
def get_routers(self, request, **search_opts):
page_size = utils.get_page_size(request)
paginate = False
if 'paginate' in search_opts:
paginate = search_opts.pop('paginate')
search_opts['limit'] = page_size + 1
if 'tenant_id' not in search_opts:
search_opts['all_tenants'] = True
routers_metadata = []
nova_client = novaclient(request)
routers = (
neutronclient(request)
.list_routers(**search_opts)
.get("routers", [])
)
for router in routers:
search_opts = {'name': 'ak-' + router['id'], 'all_tenants': True}
instances = nova_client.servers.list(True, search_opts=search_opts)
instance = instances[0] if instances else None
image = (
nova_client.images.get(instance.image['id'])
if instance else None
)
routers_metadata.append(Router(
id=router['id'],
name=router['name'],
latest=image.id == self.image_uuid if image else '',
image_name=image.name if image else '',
last_fetch=datetime.utcnow(),
booted=instance.created if instance else '',
status=router['status'],
tenant_id=router['tenant_id'],
))
has_more_data = False
if paginate and len(routers_metadata) > page_size:
routers_metadata.pop(-1)
has_more_data = True
elif paginate and len(routers_metadata) == self.api_limit:
has_more_data = True
return routers_metadata, has_more_data