Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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
Example #5
0
    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
Example #6
0
    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
Example #7
0
    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