def run(self, rpc): reply = ET.Element('reply') if not self.connect(): reply.text = 'NetConf Session could not be established\n{%s}' % str(self) return reply parser = NetconfParser(rpc) logging.debug("SEND: \n========\n%s\n========\n" % str(parser)) op = parser.get_operation() data = ET.tostring(parser.get_data(), pretty_print=True) datastore = parser.get_datastore() try: if op == 'get': response = self.handle.get(data).xml elif op == 'get-config': response = self.handle.get_config(source=datastore, filter=data).xml elif op == 'edit-config': response = self.handle.edit_config(target=datastore, config=data).xml else: response = self.handle.dispatch(ET.fromstring(data)).xml reply.append(ET.fromstring(response)) except RPCError as e: reply.append(e._raw) self.disconnect() logging.debug("RECEIVE: \n=====\n%s\n=====\n" % reply.text) return reply
def gen_script(username, payload): """ Generate Netconf / Restconf RPC """ payload = payload.replace('<metadata>', '') payload = payload.replace('</metadata>', '') _, device, fmt, rpc = Adapter.parse_request(payload) if fmt == 'xpath' and rpc == '': rpc = Adapter.gen_rpc(username, payload) if rpc is None: logging.error('gen_script: Invalid RPC Generated') return None parser = NetconfParser(rpc) op = parser.get_operation() data = ET.tostring(parser.get_data(), pretty_print=True) datastore = parser.get_datastore() # setup template args args = dict() args['data'] = data.strip() args['datastore'] = datastore args['host'] = device.get('host', '') args['port'] = device.get('port', '830') args['user'] = device.get('user', '') args['passwd'] = device.get('passwd', '') args['platform'] = device.get('platform', '') if not args['host']: args['host'] = '<address>' if not args['user']: args['user'] = '******' if not args['passwd']: args['passwd'] = '<password>' if not args['platform']: args['platform'] = 'csr' if op == 'get': args['nccall'] = 'm.get(payload).xml' elif op == 'get-config': args['nccall'] = "m.get_config(source='%s', filter=payload).xml" % datastore elif op == 'edit-config': args['nccall'] = "m.edit_config(target='%s', config=payload).xml" % datastore else: args['nccall'] = "m.dispatch(ET.fromstring(payload)).xml" # generate script rendered = render_to_string('pyscript.py', args) script = ET.Element('script') script.text = ET.CDATA(rendered) return script
def run(self, rpc, lock=False): reply = ET.Element('reply') if not self.connect(): reply.text = 'NetConf Session could not be established\n{%s}' % str(self) return reply parser = NetconfParser(rpc) logging.debug("SEND: \n========\n%s\n========\n" % str(parser)) op = parser.get_operation() data = ET.tostring(parser.get_data(), pretty_print=True) datastore = parser.get_datastore() try: if op == 'get': response = self.handle.get(data).xml elif op == 'get-config': response = self.handle.get_config(source=datastore, filter=data).xml elif op == 'edit-config': eoption = parser.get_error_option() if lock: with self.handle.locked(datastore): response = self.handle.edit_config(target=datastore, error_option=eoption, config=data).xml else: response = self.handle.edit_config(target=datastore, error_option=eoption, config=data).xml else: response = self.handle.dispatch(ET.fromstring(data)).xml """ reply = 'NETCONF REQUEST:\n' reply += '================\n\n' if op == 'edit-config': reply += 'EDIT-CONFIG LOCK: %s\n\n' % str(lock) reply += str(parser) + '\n\n' reply += 'NETCONF RESPONSE:\n' reply += '================\n\n' reply += ET.tostring(ET.fromstring(response), pretty_print=True) """ reply.append(ET.fromstring(response)) logging.debug("RECEIVE: \n=====\n%s\n=====\n" % response) except RPCError as e: reply.append(e._raw) self.disconnect() return reply
def run(self, rpc, lock=False): reply = ET.Element('reply') if not self.connect(): reply.text = 'NetConf Session could not be established\n{%s}' % str( self) return reply parser = NetconfParser(rpc) logging.debug("SEND: \n========\n%s\n========\n" % str(parser)) op = parser.get_operation() data = ET.tostring(parser.get_data(), pretty_print=True) datastore = parser.get_datastore() try: if op == 'get': response = self.handle.get(data).data_xml elif op == 'get-config': response = self.handle.get_config(source=datastore, filter=data).data_xml elif op == 'edit-config': eoption = parser.get_error_option() if lock: with self.handle.locked(datastore): response = self.handle.edit_config( target=datastore, error_option=eoption, config=data).data_xml else: response = self.handle.edit_config(target=datastore, error_option=eoption, config=data).data_xml else: response = self.handle.dispatch(ET.fromstring(data)).data_xml """ reply = 'NETCONF REQUEST:\n' reply += '================\n\n' if op == 'edit-config': reply += 'EDIT-CONFIG LOCK: %s\n\n' % str(lock) reply += str(parser) + '\n\n' reply += 'NETCONF RESPONSE:\n' reply += '================\n\n' reply += ET.tostring(ET.fromstring(response), pretty_print=True) """ reply.append(ET.fromstring(response)) logging.debug("RECEIVE: \n=====\n%s\n=====\n" % response) except RPCError as e: reply.append(e._raw) self.disconnect() return reply
def gen_ydk_script(username, payload): """ Generate YDK python script that uses Netconf provider and Netconf/CRUD services """ logging.debug('gen_script: payload : \n' + payload) payload = payload.replace('<metadata>', '') payload = payload.replace('</metadata>', '') _, device, fmt, lock, rpc = Adapter.parse_request(payload) if fmt == 'xpath' and rpc == '': request = ET.fromstring(payload) logging.debug('gen_script: request etree string : \n' + ET.tostring(request, pretty_print=True)) rpc = Adapter._gen_rpc(username, request) if rpc is None: logging.error('gen_script: Invalid RPC Generated') return None logging.debug('gen_script: generated rpc : \n' + rpc) # currently we only support Netconf service provider and CRUD services parser = NetconfParser(rpc) op = parser.get_operation() datastore = parser.get_datastore() python_ydk_defs = "" for child in parser.get_data(): logging.debug('gen_script: child element : \n' + ET.tostring(child, pretty_print=True)) # generate ydk script snippet for child element yam = YdkAppMaker(type='xml') python_ydk_defs = python_ydk_defs + yam.payload2python(ET.tostring(child)) # TBD: auto-discover service type, currently hardcoded to 'netconf' # change to 'crud' if you want to use crud service_type = 'netconf' # setup template args args = dict() args['service_type'] = service_type args['ydk_obj_defs'] = python_ydk_defs args['datastore'] = datastore if op == 'edit-config': # TBD: currently hardcoded to 'create' (to handle create or merge operation) # Need to parse xc operations to set to other options such as # 'replace' or 'delete' based on values of xc operations. This would # have to be done on a per-node basis. args['service'] = 'create' elif op == "get": args['service'] = 'get' elif op == "get-config": args['service'] = 'get_config' else: args['service'] = 'unsupported' args['host'] = device.get('host', '') args['port'] = device.get('port', '830') args['user'] = device.get('user', '') args['passwd'] = device.get('passwd', '') if not args['host']: args['host'] = '<address>' if not args['port']: args['port'] = '830' if not args['user']: args['user'] = '******' if not args['passwd']: args['passwd'] = '<password>' args['ydk_obj_names'] = Adapter.get_ydk_def_names(python_ydk_defs) # generate script rendered = render_to_string('ydkscript.py', args) script = ET.Element('script') script.text = ET.CDATA(rendered) return script
def gen_ydk_script(username, payload): """ Generate YDK python script that uses Netconf provider and Netconf/CRUD services """ logging.debug('gen_script: payload : \n' + payload) payload = payload.replace('<metadata>', '') payload = payload.replace('</metadata>', '') _, device, fmt, lock, rpc = Adapter.parse_request(payload) if fmt == 'xpath' and rpc == '': request = ET.fromstring(payload) logging.debug('gen_script: request etree string : \n' + ET.tostring(request, pretty_print=True)) rpc = Adapter._gen_rpc(username, request) if rpc is None: logging.error('gen_script: Invalid RPC Generated') return None logging.debug('gen_script: generated rpc : \n' + rpc) # currently we only support Netconf service provider and CRUD services parser = NetconfParser(rpc) op = parser.get_operation() datastore = parser.get_datastore() python_ydk_defs = "" for child in parser.get_data(): logging.debug('gen_script: child element : \n' + ET.tostring(child, pretty_print=True)) # generate ydk script snippet for child element yam = YdkAppMaker(type='xml') python_ydk_defs = python_ydk_defs + yam.payload2python( ET.tostring(child)) # TBD: auto-discover service type, currently hardcoded to 'netconf' # change to 'crud' if you want to use crud service_type = 'netconf' # setup template args args = dict() args['service_type'] = service_type args['ydk_obj_defs'] = python_ydk_defs args['datastore'] = datastore if op == 'edit-config': # TBD: currently hardcoded to 'create' (to handle create or merge operation) # Need to parse xc operations to set to other options such as # 'replace' or 'delete' based on values of xc operations. This would # have to be done on a per-node basis. args['service'] = 'create' elif op == "get": args['service'] = 'get' elif op == "get-config": args['service'] = 'get_config' else: args['service'] = 'unsupported' args['host'] = device.get('host', '') args['port'] = device.get('port', '830') args['user'] = device.get('user', '') args['passwd'] = device.get('passwd', '') if not args['host']: args['host'] = '<address>' if not args['port']: args['port'] = '830' if not args['user']: args['user'] = '******' if not args['passwd']: args['passwd'] = '<password>' args['ydk_obj_names'] = Adapter.get_ydk_def_names(python_ydk_defs) # generate script rendered = render_to_string('ydkscript.py', args) script = ET.Element('script') script.text = ET.CDATA(rendered) return script