Change-Id: I6707be5c6f4f88f72ef843ba13947ab54824ca32
This commit is contained in:
Kanagaraj Manickam 2016-04-14 23:00:39 +05:30
parent b4863bfd2b
commit 1f8b1e2f04
5 changed files with 116 additions and 88 deletions

View File

@ -30,6 +30,9 @@ MANAGE_COMMAND_NAME = 'namos-manage'
class HeartBeat(object):
def cleanup(self):
api.cleanup(None)
def report_status(self):
print_format = "%-20s%-15s%-15s%-35s%-10s"
strip = 90 * '-'
@ -40,12 +43,19 @@ class HeartBeat(object):
'Component',
'Status'))
print(strip)
for k, s in api.get_status(None).items():
for k, s in api.get_status(
None,
CONF.command.node,
CONF.command.service,
CONF.command.type,
CONF.command.component
).items():
# if not CONF.command.component and s['is_launcher']:
print(print_format % (s['node'],
s['type'],
s['service'],
s['component'],
s['status']))
s['worker'],
':)' if s['status'] else 'XXX'))
print(strip)
@ -193,8 +203,15 @@ def add_command_parsers(subparsers):
parser.set_defaults(func=OsloConfigSchemaManager().sync)
parser = subparsers.add_parser('status')
parser.add_argument('-n', '--node')
parser.add_argument('-s', '--service')
parser.add_argument('-c', '--component')
parser.add_argument('-t', '--type')
parser.set_defaults(func=HeartBeat().report_status)
parser = subparsers.add_parser('cleanup')
parser.set_defaults(func=HeartBeat().cleanup)
command_opt = cfg.SubCommandOpt('command',
title='Command',
help='Available commands',

View File

@ -69,7 +69,7 @@ class ConductorManager(object):
return db_api.region_delete(context. region_id)
@request_context
def add_service_node(self, context, service_node):
def service_node_create(self, context, service_node):
return db_api.service_node_create(context, service_node)
@request_context
@ -137,12 +137,12 @@ class ConductorManager(object):
# TODO(mrkanag) Move this to periofic task, before deleting each
# sw, make usre its created atleast 5 mins before
# sp.cleanup(service_component_id)
sp.cleanup(service_component_id)
return service_worker_id
def _regisgration_ackw(self, context, identification):
client = messaging.get_rpc_client(
topic=self.os_namos_listener_topic(identification),
topic=self._os_namos_listener_topic(identification),
version=self.RPC_API_VERSION,
exchange=namos_config.PROJECT_NAME)
client.cast(context,
@ -150,12 +150,12 @@ class ConductorManager(object):
identification=identification)
LOG.info("REGISTER [%s] ACK" % identification)
def os_namos_listener_topic(self, identification):
def _os_namos_listener_topic(self, identification):
return 'namos.CONF.%s' % identification
def _ping(self, context, identification):
client = messaging.get_rpc_client(
topic=self.os_namos_listener_topic(identification),
topic=self._os_namos_listener_topic(identification),
version=self.RPC_API_VERSION,
exchange=namos_config.PROJECT_NAME,
timeout=1)
@ -170,9 +170,9 @@ class ConductorManager(object):
LOG.info("PING [%s] FAILED" % identification)
return False
def update_config_file(self, context, identification, name, content):
def _update_config_file(self, context, identification, name, content):
client = messaging.get_rpc_client(
topic=self.os_namos_listener_topic(identification),
topic=self._os_namos_listener_topic(identification),
version=self.RPC_API_VERSION,
exchange=namos_config.PROJECT_NAME,
timeout=2)
@ -304,10 +304,10 @@ class ConductorManager(object):
# TODO(mrkanag) is ping() better option instead?
if utils.find_status(sw):
try:
self.update_config_file(context,
sw.pid,
cf.name,
cf.file)
self._update_config_file(context,
sw.pid,
cf.name,
cf.file)
cf['status'] = 'completed'
return cf
except: # noqa
@ -448,8 +448,8 @@ class ServiceProcessor(object):
service_worker = db_api.service_worker_create(
self.context,
# TODO(mrkanag) Fix the name, device driver proper !
dict(name='%s@%s' % (self.registration_info['pid'],
service_component.name),
dict(name='%s@%s' % (service_component.name,
self.registration_info['pid']),
pid=self.registration_info['identification'],
host=self.registration_info['host'],
service_component_id=service_component.id,
@ -470,37 +470,7 @@ class ServiceProcessor(object):
def cleanup(self, service_component_id):
# clean up the dead service workers
# TODO(mrkanag) Make this into thread
service_workers = \
db_api.service_worker_get_all_by(
self.context,
service_component_id=service_component_id
)
for srv_wkr in service_workers:
# TODO(mrkanag) Move this to db layer and query non deleted entries
if srv_wkr.deleted_at is not None:
continue
# TODO(mrkanag) is this interval ok
if utils.find_status(srv_wkr, report_interval=60):
LOG.info('Service Worker %s is live'
% srv_wkr.id)
continue
else:
confs = db_api.config_get_by_name_for_service_worker(
self.context,
service_worker_id=srv_wkr.id
)
for conf in confs:
db_api.config_delete(self.context, conf.id)
LOG.info('Config %s is deleted'
% conf.id)
db_api.service_worker_delete(self.context, srv_wkr.id)
LOG.info('Service Worker %s is deleted'
% srv_wkr.id)
db_api.cleanup(self.context, service_component_id)
class ConfigProcessor(object):

View File

@ -95,7 +95,7 @@ class ConductorAPI(object):
region_id=region_id)
@wrapper_function
def add_service_node(self, context, service_node):
def service_node_create(self, context, service_node):
return self.client.call(
context,
'service_node_create',
@ -248,6 +248,6 @@ if __name__ == '__main__':
'dcf0f17b-99f6-49e9-8d5f-23b3ad1167dc',
content))
# print_config_schema()
# print_view_360()
sample_config_update()
print_config_schema()
print_view_360()
# sample_config_update()

View File

@ -484,5 +484,9 @@ def view_360(context, include_conf_file=False, include_status=False):
include_status=include_status)
def get_status(context):
return IMPL.get_status(context)
def get_status(context, node=None, service=None, type=None, component=None):
return IMPL.get_status(context, node, service, type, component)
def cleanup(context, service_component_id=None, dead_since=300):
return IMPL.cleanup(context, service_component_id, dead_since)

View File

@ -175,7 +175,7 @@ def device_get_all(context):
return _get_all(context, models.Device)
def _device_get_all_by(context, **kwargs):
def device_get_all_by(context, **kwargs):
return _get_all_by(context, models.Device, **kwargs)
@ -227,7 +227,7 @@ def device_endpoint_get_all(context):
return _get_all(context, models.DeviceEndpoint)
def _device_endpoint_get_all_by(context, **kwargs):
def device_endpoint_get_all_by(context, **kwargs):
return _get_all_by(context, models.DeviceEndpoint, **kwargs)
@ -282,7 +282,7 @@ def device_driver_get_all(context):
return _get_all(context, models.DeviceDriver)
def _device_driver_get_all_by(context, **kwargs):
def device_driver_get_all_by(context, **kwargs):
return _get_all_by(context, models.DeviceDriver, **kwargs)
@ -320,7 +320,7 @@ def device_driver_class_get_all(context):
return _get_all(context, models.DeviceDriverClass)
def _device_driver_classget_all_by(context, **kwargs):
def device_driver_class_get_all_by(context, **kwargs):
return _get_all_by(context, models.DeviceDriverClass, **kwargs)
@ -358,7 +358,7 @@ def service_get_all(context):
return _get_all(context, models.Service)
def _service_get_all_by(context, **kwargs):
def service_get_all_by(context, **kwargs):
return _get_all_by(context, models.Service, **kwargs)
@ -396,7 +396,7 @@ def service_node_get_all(context):
return _get_all(context, models.ServiceNode)
def _service_node_get_all_by(context, **kwargs):
def service_node_get_all_by(context, **kwargs):
return _get_all_by(context, models.ServiceNode, **kwargs)
@ -460,7 +460,7 @@ def service_component_get_all(context):
return _get_all(context, models.ServiceComponent)
def _service_component_get_all_by(context, **kwargs):
def service_component_get_all_by(context, **kwargs):
return _get_all_by(context, models.ServiceComponent, **kwargs)
@ -510,10 +510,6 @@ def service_worker_get_all(context):
def service_worker_get_all_by(context, **kwargs):
return _service_worker_get_all_by(context, **kwargs)
def _service_worker_get_all_by(context, **kwargs):
return _get_all_by(context, models.ServiceWorker, **kwargs)
@ -547,7 +543,6 @@ def config_schema_get_by_name(context, name):
return config
# TODO(mrkanag) fix it to take **kwargs
def config_schema_get_by(context,
namespace=None,
group=None,
@ -622,7 +617,7 @@ def config_get_all(context):
return _get_all(context, models.OsloConfig)
def _config_get_all_by(context, **kwargs):
def config_get_all_by(context, **kwargs):
return _get_all_by(context, models.OsloConfig, **kwargs)
@ -721,7 +716,7 @@ def config_file_get_all(context):
return _get_all(context, models.OsloConfigFile)
def _config_file_get_all_by(context, **kwargs):
def config_file_get_all_by(context, **kwargs):
return _get_all_by(context, models.OsloConfigFile, **kwargs)
@ -743,8 +738,8 @@ def service_perspective_get(context, service_id, include_details=False):
# on include_details, for each of the entity, include complete details
service_perspective = dict()
service_perspective['service'] = service_get(context, service_id).to_dict()
service_components = _service_component_get_all_by(context,
service_id=service_id)
service_components = service_component_get_all_by(context,
service_id=service_id)
service_perspective['service_components'] = dict()
# service_perspective['service_components']['size'] =
# len(service_components)
@ -755,7 +750,7 @@ def service_perspective_get(context, service_id, include_details=False):
= sc.to_dict()
service_perspective['service_components'][sc.id]['service_node']\
= service_node_get(context, sc.node_id).to_dict()
service_workers = _service_worker_get_all_by(
service_workers = service_worker_get_all_by(
context,
service_component_id=sc.id)
service_perspective['service_components'][sc.id]['service_workers'] \
@ -770,7 +765,7 @@ def service_perspective_get(context, service_id, include_details=False):
sc.id]['service_workers'][sw.id][
'service_worker'] = sw.to_dict()
device_drivers = _device_driver_get_all_by(
device_drivers = device_driver_get_all_by(
context,
service_worker_id=sw.id)
service_perspective['service_components'][
@ -819,8 +814,8 @@ def device_perspective_get(context, device_id, include_details=False):
# on include_details, for each of the entity, include complete details
device_perspective = dict()
device_perspective['device'] = device_get(context, device_id).to_dict()
endpoints = _device_endpoint_get_all_by(context,
device_id=device_id)
endpoints = device_endpoint_get_all_by(context,
device_id=device_id)
device_perspective['device_endpoints'] = dict()
# device_perspective['device_endpoints']['size'] = len(endpoints)
@ -829,8 +824,8 @@ def device_perspective_get(context, device_id, include_details=False):
device_perspective['device_endpoints'][
ep.id]['device_endpoint'] = ep.to_dict()
device_drivers = _device_driver_get_all_by(context,
endpoint_id=ep.id)
device_drivers = device_driver_get_all_by(context,
endpoint_id=ep.id)
device_perspective['device_endpoints'][
ep.id]['device_drivers'] = dict()
# device_perspective['device_endpoints'][ep.id] \
@ -881,8 +876,8 @@ def region_perspective_get(context, region_id, include_details=False):
region_perspective = dict()
region_perspective['region'] = region_get(context, region_id).to_dict()
s_nodes = _service_node_get_all_by(context,
region_id=region_id)
s_nodes = service_node_get_all_by(context,
region_id=region_id)
# region_perspective['service_nodes'] = dict()
# region_perspective['service_nodes']['size'] = len(s_nodes)
# for s_node in s_nodes:
@ -906,7 +901,7 @@ def region_perspective_get(context, region_id, include_details=False):
region_perspective['services'] = dict()
for s_node in s_nodes:
s_components = _service_component_get_all_by(
s_components = service_component_get_all_by(
context,
node_id=s_node.id)
srvs = list()
@ -920,7 +915,7 @@ def region_perspective_get(context, region_id, include_details=False):
s = service_get(context, s_id)
region_perspective['services'][s_id] = s.to_dict()
devices = _device_get_all_by(context, region_id=region_id)
devices = device_get_all_by(context, region_id=region_id)
region_perspective['devices'] = dict()
# region_perspective['devices']['size'] = len(devices)
for d in devices:
@ -980,8 +975,8 @@ def view_360(context, include_conf_file=False, include_status=False):
view['region'][rg.id] = region_get(context, rg.id).to_dict()
view['region'][rg.id]['service_node'] = dict()
srv_nd_lst = _service_node_get_all_by(context,
region_id=rg.id)
srv_nd_lst = service_node_get_all_by(context,
region_id=rg.id)
for srv_nd in srv_nd_lst:
# service node
view['service_node'][srv_nd.id] = service_node_get(
@ -1051,7 +1046,7 @@ def view_360(context, include_conf_file=False, include_status=False):
view['region'][rg.id]['service_node'][srv_nd.id][
'service_component'][srv_cmp.id][
'service_worker'][srv_wkr.id]['device_driver'] = dict()
dvc_drv_list = _device_driver_get_all_by(
dvc_drv_list = device_driver_get_all_by(
context,
service_worker_id=srv_wkr.id
)
@ -1111,33 +1106,75 @@ def view_360(context, include_conf_file=False, include_status=False):
return view
def get_status(context):
def get_status(context, node=None, service=None, type=None, component=None):
sr = {}
for sn in service_node_get_all(context):
if node and not node == sn.name:
continue
for sc in service_component_get_all_by_node_for_service(
context,
node_id=sn.id
):
service = service_get(context, sc.service_id)
if sc.deleted_at is not None:
continue
s = service_get(context, sc.service_id)
if service and not s.name == service:
continue
if type and not sc.type == type:
continue
if component and not sc.name == component:
continue
for sw in service_worker_get_by_host_for_service_component(
context,
service_component_id=sc.id
):
# TODO(mrkanag) Move this to db layer and query non deleted
# if sw.deleted_at is not None:
# continue
if sw.deleted_at is not None:
continue
sr[sw.pid] = (
dict(node=sn.name,
type=sc.type,
service=service.name,
component=sw.name,
service=s.name,
component=sc.name,
worker=sw.name,
status=utils.find_status(sw),
is_launcher=sw.is_launcher))
return sr
def cleanup(context, service_component_id=None, dead_since=300):
# clean up the dead service workers
service_workers = \
service_worker_get_all_by(
context,
service_component_id=service_component_id
)
for srv_wkr in service_workers:
if srv_wkr.deleted_at is not None:
continue
if utils.find_status(srv_wkr, report_interval=dead_since):
continue
else:
confs = config_get_by_name_for_service_worker(
context,
service_worker_id=srv_wkr.id
)
for conf in confs:
config_delete(context, conf.id)
service_worker_delete(context, srv_wkr.id)
if __name__ == '__main__':
from namos.common import config