On Thu,  7 Mar 2013 18:00:48 +0900
Isaku Yamahata <[email protected]> wrote:

> This class implements direct API to ofconfig.
> 
> Signed-off-by: Isaku Yamahata <[email protected]>
> ---
>  ryu/lib/of_config/capable_switch.py |  106 
> +++++++++++++++++++++++++++++++++++
>  1 file changed, 106 insertions(+)
>  create mode 100644 ryu/lib/of_config/capable_switch.py
> 
> diff --git a/ryu/lib/of_config/capable_switch.py 
> b/ryu/lib/of_config/capable_switch.py
> new file mode 100644
> index 0000000..7d3823d
> --- /dev/null
> +++ b/ryu/lib/of_config/capable_switch.py
> @@ -0,0 +1,106 @@
> +# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
> +# Copyright (C) 2013 Isaku Yamahata <yamahata at private email ne jp>
> +#
> +# Licensed under the Apache License, Version 2.0 (the "License");
> +# you may not use this file except in compliance with the License.
> +# You may obtain a copy of the License at
> +#
> +#    http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software
> +# distributed under the License is distributed on an "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> +# implied.
> +# See the License for the specific language governing permissions and
> +# limitations under the License.
> +
> +import ncclient.manager
> +import ncclient.xml_
> +
> +from ryu.lib import of_config
> +from ryu.lib.of_config import constants as ofc_consts
> +
> +
> +def get_ns_tag(tag):
> +    if tag[0] == '{':
> +        return tuple(tag[1:].split('}', 1))
> +    return (None, tag)
> +
> +
> +class CapableSwitch(object):

'OpenFlow Capable Switch' in the spec sounds ok but I'm not sure
if 'CapableSwitch' makes sense...

> +    def __init__(self, connect_method='connect_ssh', *args, **kwargs):
> +        super(CapableSwitch, self).__init__()
> +        self._connect_method = connect_method
> +        self._connect_args = args
> +        self._connect_kwargs = kwargs
> +        self.netconf = None
> +        self.version = None
> +        self.namespace = None
> +
> +    def connect(self):
> +        if self.netconf:
> +            return
> +        connect = getattr(ncclient.manager, self._connect_method)
> +        self.netconf = connect(*self._connect_args, **self._connect_kwargs)

__init__ had better to establish a connection?

sw = CapableSwitch(...)
sw.client_capabilities()

?

> +    def close_session(self):
> +        if self.netconf:
> +            self.netconf.close_session()
> +            self.netconf = None
> +
> +    def __enter__(self):
> +        self.connect()
> +        return self
> +
> +    def __exit__(self):
> +        self.close_session()
> +
> +    def client_capabilities(self):
> +        return self.netconf.client_capabilities
> +
> +    def server_capabilities(self):
> +        return self.netconf.server_capabilities
> +
> +    def _find_capable_switch(self, tree):
> +        capable_switch = None
> +        for element in tree.getchildren():
> +            ns, tag = get_ns_tag(element.tag)
> +            if tag != ofc_consts.CAPABLE_SWITCH:
> +                continue
> +
> +            # assumes that <get> returns only single capable switch
> +            assert capable_switch is None
> +
> +            capable_switch = element
> +            if self.version:
> +                versions = [(version, ns_) for version, ns_ in
> +                            of_config.OFCONFIG_YANG_NAMESPACES.items()
> +                            if ns == ns_]
> +                if versions:
> +                    assert len(versions) == 1
> +                    version = versions[0]
> +                    self.version, self.namespace = version
> +
> +        if not capable_switch:
> +            # TODO:
> +            pass
> +
> +        return capable_switch
> +
> +    def _find_capable_switch_xml(self, tree):
> +        return ncclient.xml_.to_xml(self._find_capable_switch(tree))
> +
> +    def get(self, filter=None):
> +        reply = self.netconf.get(filter)
> +        return self._find_capable_switch_xml(reply.data_ele)
> +
> +    def get_config(self, source, filter=None):
> +        reply = self.netconf.get_config(source, filter)
> +        return self._find_capable_switch_xml(reply.data_ele)
> +
> +    def edit_config(self, target, config, default_operation=None,
> +                    test_option=None, error_option=None):
> +        self.netconf.edit_config(target, config,
> +                                 default_operation, test_option, 
> error_option)
> +
> +    # TODO: more netconf operations
> -- 
> 1.7.10.4
> 
> 
> ------------------------------------------------------------------------------
> Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester  
> Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the  
> endpoint security space. For insight on selecting the right partner to 
> tackle endpoint security challenges, access the full report. 
> http://p.sf.net/sfu/symantec-dev2dev
> _______________________________________________
> Ryu-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/ryu-devel

------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester  
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the  
endpoint security space. For insight on selecting the right partner to 
tackle endpoint security challenges, access the full report. 
http://p.sf.net/sfu/symantec-dev2dev
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to