05-07-2019 07:18 AM
Hi All,
I am looking for Python/YANG tailf:cli-completion-actionpoint example where custom list can be displayed in CLI mode from a completion action callback.
I tried the below example:
YANG Pseudo code where actionpoint is defined
        leaf interface {
          tailf:info "Endpoint Port";
          type string;
          tailf:cli-completion-actionpoint if-action;
          mandatory true;
        }
Python Code where Application and Callback is implemented
# -*- mode: python; python-indent: 4 -*-
from ncs.dp import Daemon
from ncs.maapi import Maapi
from _ncs.dp import register_action_cbs, action_reply_completion
# ----------------------
# L3VPN ACTION CALLBACKS
# ----------------------
class ActionCallbacks(object):
    def __init__(self, log):
        self.log = log
        self.logPrefix = 'ActionCallbacks:'
        self.daemon = Daemon("l3vpn-cli-completion-daemon", log=log)
        self.maapi = Maapi()
        self.log.info(self.logPrefix, 'register_action_cbs start')
        register_action_cbs(self.daemon.ctx(), 'if-action', self)
        self.daemon.start()
        self.log.info(self.logPrefix, 'register_action_cbs end')
    def cb_init(self, tctx):
        self.log.info(self.logPrefix, 'cb_init')
        self.maapi.attach(tctx)
        trans_set_fd(tctx, self.daemon._wsock)
    def cb_abort(self, uinfo):
        self.log.info(self.logPrefix, 'cb_abort')
        self.maapi.detach(tctx)
    def cb_action(self, uinfo, name, kp, params):
        self.log.info(self.logPrefix, 'cb_action')
    def cb_command(self, uinfo, path, argv):
        self.log.info(self.logPrefix, 'cb_command')
    def cb_completion(self, uinfo, cli_style, token, completion_char,
                      kp, cmdpath, cmdparam_id, simpleType, extra):
        self.log.info(self.logPrefix, 'cb_completion({},{},{},{},{},{},{},{},{})'.format(
            uinfo, cli_style, token, completion_char, kp, cmdpath, cmdparam_id, simpleType, extra))
        if_list = [(0, 'ge-0/1', None), (0, 'fe-0/0', None),
                   (0, 'ge-0/2', None)]
        action_reply_completion(uinfo, if_list)
# ---------------------------------------------
# COMPONENT THREAD THAT WILL BE STARTED BY NCS.
# ---------------------------------------------
class L3VPN(ncs.application.Application):
    def setup(self):
        self.log.info('L3VPN RUNNING')
        self.acb = ActionCallbacks(self.log)
        self.register_service('l3vpn-servicepoint', ServiceCallbacks)
    def teardown(self):
        self.log.info('L3VPN FINISHED')
Some of the code is ommited for simplicity.
From CLI when i hit tab on interface I don't see any custom list of interfaces
For each tab hit i see cb_init is called (printed in the log) but cb_completion callback never called.
Here is the log
<INFO> 07-May-2019::14:07:50.305 l3vpn ComponentThread:l3vpn: - ActionCallbacks:register_action_cbs start <INFO> 07-May-2019::14:07:50.306 l3vpn ComponentThread:l3vpn: - ActionCallbacks:register_action_cbs end <INFO> 07-May-2019::14:09:18.904 l3vpn l3vpn-cli-completion-daemon: - ActionCallbacks:cb_init <INFO> 07-May-2019::14:09:22.950 l3vpn l3vpn-cli-completion-daemon: - ActionCallbacks:cb_init <INFO> 07-May-2019::14:09:23.964 l3vpn l3vpn-cli-completion-daemon: - ActionCallbacks:cb_init <INFO> 07-May-2019::14:09:26.696 l3vpn l3vpn-cli-completion-daemon: - ActionCallbacks:cb_init <INFO> 07-May-2019::14:09:28.917 l3vpn l3vpn-cli-completion-daemon: - ActionCallbacks:cb_init
Any help is highly appreciated.
Thanks
Zahid
Solved! Go to Solution.
05-09-2019 02:30 AM
I solved the problem, Here are the changes in Callback class
class ActionCallbacks(object):
    def __init__(self, log):
        self.log = log
        self.logPrefix = 'ActionCallbacks:'
        self.daemon = Daemon("l3vpn-cli-completion-daemon", log=log)
        self.completion_action = 'if-action'
        register_action_cbs(self.daemon.ctx(), self.completion_action, self)
        self.daemon.start()
    def cb_init(self, uinfo):
        self.log.info(self.logPrefix, 'cb_init')
        self.log.info(self.logPrefix, 'cb_init daemon alive :',
                      self.daemon.isAlive())
        name = 'usid-{0}-{1}'.format(uinfo.usid, self.completion_action)
        key = '{0}-{1}'.format(id(self), uinfo.usid)
        wsock = ncs.dp.take_worker_socket(self.daemon, name, key)
        # dp.action_set_timeout(unifo, 2)
        _tm.dp.action_set_fd(uinfo, wsock)
        self.log.info(self.logPrefix, 'cb_init', ' complete')
    def cb_abort(self, uinfo):
        self.log.info(self.logPrefix, 'cb_abort')
    def cb_action(self, uinfo, name, kp, params):
        self.log.info(self.logPrefix, 'cb_action')
    def cb_command(self, uinfo, path, argv):
        self.log.info(self.logPrefix, 'cb_command')
    def cb_completion(self, uinfo, cli_style, token, completion_char,
                      kp, cmdpath, cmdparam_id, simpleType, extra):
        self.log.info(self.logPrefix, 'cb_completion({},{},{},{},{},{},{},{},{})'.format(
            uinfo, cli_style, token, completion_char, kp, cmdpath, cmdparam_id, simpleType, extra))
        if_list = [(0, 'ge-0/1', None), (0, 'fe-0/0', None),
                   (0, 'ge-0/2', None)]
        action_reply_completion(uinfo, if_list)
05-09-2019 02:30 AM
I solved the problem, Here are the changes in Callback class
class ActionCallbacks(object):
    def __init__(self, log):
        self.log = log
        self.logPrefix = 'ActionCallbacks:'
        self.daemon = Daemon("l3vpn-cli-completion-daemon", log=log)
        self.completion_action = 'if-action'
        register_action_cbs(self.daemon.ctx(), self.completion_action, self)
        self.daemon.start()
    def cb_init(self, uinfo):
        self.log.info(self.logPrefix, 'cb_init')
        self.log.info(self.logPrefix, 'cb_init daemon alive :',
                      self.daemon.isAlive())
        name = 'usid-{0}-{1}'.format(uinfo.usid, self.completion_action)
        key = '{0}-{1}'.format(id(self), uinfo.usid)
        wsock = ncs.dp.take_worker_socket(self.daemon, name, key)
        # dp.action_set_timeout(unifo, 2)
        _tm.dp.action_set_fd(uinfo, wsock)
        self.log.info(self.logPrefix, 'cb_init', ' complete')
    def cb_abort(self, uinfo):
        self.log.info(self.logPrefix, 'cb_abort')
    def cb_action(self, uinfo, name, kp, params):
        self.log.info(self.logPrefix, 'cb_action')
    def cb_command(self, uinfo, path, argv):
        self.log.info(self.logPrefix, 'cb_command')
    def cb_completion(self, uinfo, cli_style, token, completion_char,
                      kp, cmdpath, cmdparam_id, simpleType, extra):
        self.log.info(self.logPrefix, 'cb_completion({},{},{},{},{},{},{},{},{})'.format(
            uinfo, cli_style, token, completion_char, kp, cmdpath, cmdparam_id, simpleType, extra))
        if_list = [(0, 'ge-0/1', None), (0, 'fe-0/0', None),
                   (0, 'ge-0/2', None)]
        action_reply_completion(uinfo, if_list)
 
					
				
				
			
		
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide