Ejemplo n.º 1
0
    def netconf_node_topo_info(self, node_id):
        result = Result()
        path = ("operational/network-topology:network-topology/"
                "topology/topology-netconf/node/{}").format(node_id)
        headers = {'accept': 'application/yang.data+json'}
        response = self._restconf_get(path, headers)
        if(response is None):
            result.status = http.SERVICE_UNAVAILABLE
            result.brief = "Connection error."
            msg = ("Connection to the '%s:%s' server has failed." %
                   (self._ip_addr, self._http_port))
            result.details = msg
        elif(response.status_code == http.OK):
            try:
                if(response.headers.get('content-type') !=
                        'application/yang.data+json'):
                    raise ValueError("unexpected response content encoding")
                # Deserialize response JSON content to Python object
                d = json.loads(response.content)
                node = d['node'][0]
                data = NETCONFNodeTopoInfo(**node)
                result.data = data
                result.status = http.OK
            except(Exception) as e:
                if(self._verbose):
                    print("!!!Error: '%s'" % repr(e))
                result.status = http.INTERNAL_SERVER_ERROR
                result.brief = "Failed to parse HTTP response."
                result.details = repr(e)
        else:
            result.status = response.status_code
            result.brief = http.responses[response.status_code]
            result.details = response.content

        return result
Ejemplo n.º 2
0
    def netconf_node_unmount(self, node_id):
        result = Result()
        path = ("config/network-topology:network-topology/"
                "topology/topology-netconf/node/controller-config/"
                "yang-ext:mount/config:modules/"
                "module/odl-sal-netconf-connector-cfg:"
                "sal-netconf-connector/{}").format(node_id)

        response = self._restconf_delete(path)
        if(response is None):
            result.status = http.SERVICE_UNAVAILABLE
            result.brief = "Connection error."
            msg = ("Connection to the '%s:%s' server has failed." %
                   (self._ip_addr, self._http_port))
            result.details = msg
        elif(response.status_code == http.OK or
             response.status_code == http.NO_CONTENT):
            result.status = http.OK
            result.brief = "Success."
        else:
            result.status = response.status_code
            result.brief = http.responses[response.status_code]
            result.details = response.content

        return result
Ejemplo n.º 3
0
    def netconf_node_mount(self, node):
        result = Result()
        assert(isinstance(node, NETCONFDevice))
        mr = NETCONFMountRequest(node.node_id,
                                 node.ip_addr,
                                 node.port,
                                 node.admin_name,
                                 node.admin_password)
        path = mr.path
        payload = mr.payload
        headers = {'content-type': 'application/yang.data+json'}

        response = self._restconf_post(path, payload, headers)
        if(response is None):
            result.status = http.SERVICE_UNAVAILABLE
            result.brief = "Connection error."
            msg = ("Connection to the '%s:%s' server has failed." %
                   (self._ip_addr, self._http_port))
            result.details = msg
        elif(response.status_code == http.OK or
             response.status_code == http.NO_CONTENT):
            result.status = http.OK
            result.brief = "Success."
        else:
            result.status = response.status_code
            result.brief = http.responses[response.status_code]
            result.details = response.content

        return result
Ejemplo n.º 4
0
    def schema_info(self, node_id, shema_id, schema_version):
        """Fetch content of the YANG data model schema from
        the given NETCONF node.

        :param identifier: NETCONF node identifier
        :param identifier: unique identifier of the schema (name of the
            YANG module or submodule)
        :param str version:  version of the schema (value of the revision
            statement in the YANG module or submodule)
        """
        result = Result()
        path = ("operations/opendaylight-inventory:nodes/"
                "node/{}/yang-ext:mount/"
                "ietf-netconf-monitoring:get-schema").format(node_id)
        headers = {'content-type': 'application/yang.data+json',
                   'accept': 'application/xml'}
        payload = {'input': {'identifier': shema_id,
                             'version': schema_version, 'format': 'yang'}}
        response = self._restconf_post(path, json.dumps(payload), headers)
        if(response is None):
            result.status = http.SERVICE_UNAVAILABLE
            result.brief = "Connection error."
            msg = ("Connection to the '%s:%s' server has failed." %
                   (self._ip_addr, self._http_port))
            result.details = msg
        elif(response.status_code == http.OK):
            try:
                if(response.headers.get('content-type') != 'application/xml'):
                    raise ValueError("unexpected response content encoding")
                root = xml.fromstring(response.content)
                result.data = "".join(root.itertext())
                result.status = http.OK
            except(Exception) as e:
                if(self._verbose):
                    print("!!!Error: '%s'" % repr(e))
                result.status = http.INTERNAL_SERVER_ERROR
                result.brief = "Failed to parse HTTP response."
                result.details = repr(e)
        else:
            result.status = response.status_code
            result.brief = http.responses[response.status_code]
            result.details = response.content

        return result
Ejemplo n.º 5
0
    def schemas_list(self, node_id):
        """Return list of all YANG data model schemas supported
        by the given NETCONF node.

        :param identifier: NETCONF node identifier
        """
        result = Result()
        path = ("operational/opendaylight-inventory:nodes/"
                "node/{}/yang-ext:mount/"
                "ietf-netconf-monitoring:netconf-state/"
                "schemas").format(node_id)
        headers = {'accept': 'application/yang.data+json'}
        response = self._restconf_get(path, headers)
        if(response is None):
            result.status = http.SERVICE_UNAVAILABLE
            result.brief = "Connection error."
            msg = ("Connection to the '%s:%s' server has failed." %
                   (self._ip_addr, self._http_port))
            result.details = msg
        elif(response.status_code == http.OK):
            try:
                if(response.headers.get('content-type') !=
                        'application/yang.data+json'):
                    raise ValueError("unexpected response content encoding")
                # Deserialize response JSON content to Python object
                d = json.loads(response.content)
                # Extract the data
                data = d['schemas']['schema']
                result.data = data
                result.status = http.OK
            except(Exception) as e:
                if(self._verbose):
                    print("!!!Error: '%s'" % repr(e))
                result.status = http.INTERNAL_SERVER_ERROR
                result.brief = "Failed to parse HTTP response."
                result.details = repr(e)
        else:
            result.status = response.status_code
            result.brief = http.responses[response.status_code]
            result.details = response.content

        return result
Ejemplo n.º 6
0
    def netconf_nodes_ids(self):
        result = Result()
        path = ("operational/network-topology:network-topology/"
                "topology/topology-netconf")
        headers = {'accept': 'application/yang.data+json'}
        response = self._restconf_get(path, headers)
        if(response is None):
            result.status = http.SERVICE_UNAVAILABLE
            result.brief = "Connection error."
            msg = ("Connection to the '%s:%s' server has failed." %
                   (self._ip_addr, self._http_port))
            result.details = msg
        elif(response.status_code == http.OK):
            try:
                if(response.headers.get('content-type') !=
                        'application/yang.data+json'):
                    raise ValueError("unexpected response content encoding")
                # Deserialize response JSON content to Python object
                d = json.loads(response.content)
                # Extract the data
                nodes_list = d['topology'][0]['node']
                data = []
                for item in nodes_list:
                    node_id = item.get('node-id')
                    if(node_id is not None):
                        data.append(node_id)
                result.data = data
                result.status = http.OK
            except(Exception) as e:
                if(self._verbose):
                    print("!!!Error: '%s'" % repr(e))
                result.status = http.INTERNAL_SERVER_ERROR
                result.brief = "Failed to parse HTTP response."
                result.details = repr(e)
        else:
            result.status = response.status_code
            result.brief = http.responses[response.status_code]
            result.details = response.content

        return result