140 lines
4.6 KiB
Python
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
|