<html><body><p><tt>John McDowall <jmcdowall@paloaltonetworks.com> wrote on 05/11/2016 11:30:07 AM:<br><br>> From: John McDowall <jmcdowall@paloaltonetworks.com></tt><br><tt>> To: Ryan Moats/Omaha/IBM@IBMUS</tt><br><tt>> Cc: "discuss@openvswitch.org" <discuss@openvswitch.org>, "OpenStack <br>> Development Mailing List" <openstack-dev@lists.openstack.org></tt><br><tt>> Date: 05/11/2016 11:30 AM</tt><br><tt>> Subject: Re: [OVN] [networking-ovn] [networking-sfc] SFC and OVN</tt><br><tt>> <br>> Ryan,</tt><br><tt>> <br>> Apologies for missing the _init_.py files – removed them and <br>> remerged. When I do a compare from my repo to main I see three files<br>> changed (which I think is correct):</tt><br><tt>> <br>> networking_ovn/ovsdb/commands.py</tt><br><tt>> networking_ovn/ovsdb/impl_idl_ovn.py</tt><br><tt>> networking_ovn/ovsdb/ovn_api.py</tt><br><tt>> <br>> I could be doing something wrong as not an expert at merging repos. <br>> If I am doing something wrong let me know and I will fix it.</tt><br><tt>> <br>> Regards</tt><br><tt>> <br>> John</tt><br><br><tt>So the change I made to common/extensions.py was to avoid a merge</tt><br><tt>conflict, and I double checked and yes, the changes I had to</tt><br><tt>plugin.py are spurious, so here is an updated/corrected patch for</tt><br><tt>you to check against:</tt><br><br><tt>From eb93dc3984145f1b82be15d204c2f0790c1429bd Mon Sep 17 00:00:00 2001<br>From: RYAN D. MOATS <rmoats@us.ibm.com><br>Date: Wed, 11 May 2016 09:10:18 -0500<br>Subject: [PATCH] test</tt><br><br><tt>Signed-off-by: RYAN D. MOATS <rmoats@us.ibm.com><br>---<br> networking_ovn/common/extensions.py | 1 +<br> networking_ovn/ovsdb/commands.py | 78 ++++++++++++++++++++++++++++++++++<br> networking_ovn/ovsdb/impl_idl_ovn.py | 18 ++++++++<br> networking_ovn/ovsdb/ovn_api.py | 49 +++++++++++++++++++++<br> 4 files changed, 146 insertions(+), 0 deletions(-)</tt><br><br><tt>diff --git a/networking_ovn/common/extensions.py b/networking_ovn/common/extensions.py<br>index c171e11..55fc147 100644<br>--- a/networking_ovn/common/extensions.py<br>+++ b/networking_ovn/common/extensions.py<br>@@ -37,4 +37,5 @@ SUPPORTED_API_EXTENSIONS = [<br> 'subnet_allocation',<br> 'port-security',<br> 'allowed-address-pairs',<br>+ 'sfi',<br> ]<br>diff --git a/networking_ovn/ovsdb/commands.py b/networking_ovn/ovsdb/commands.py<br>index 7ea7a6f..68a747f 100644<br>--- a/networking_ovn/ovsdb/commands.py<br>+++ b/networking_ovn/ovsdb/commands.py<br>@@ -164,6 +164,84 @@ class DelLogicalPortCommand(BaseCommand):<br> setattr(lswitch, 'ports', ports)<br> self.api._tables['Logical_Port'].rows[lport.uuid].delete()<br> <br>+class AddLogicalServiceCommand(BaseCommand):<br>+ def __init__(self, api, lservice, lswitch, may_exist, **columns):<br>+ super(AddLogicalServiceCommand, self).__init__(api)<br>+ self.lservice = lservice<br>+ self.lswitch = lswitch<br>+ self.may_exist = may_exist<br>+ self.columns = columns<br>+<br>+ def run_idl(self, txn):</tt><br><tt>+ try:<br>+ lswitch = idlutils.row_by_value(self.api.idl, 'Logical_Switch',<br>+ 'name', self.lswitch)<br>+ services= getattr(lswitch, 'services', [])<br>+ except idlutils.RowNotFound:<br>+ msg = _("Logical Switch %s does not exist") % self.lswitch<br>+ raise RuntimeError(msg)<br>+ if self.may_exist:<br>+ service = idlutils.row_by_value(self.api.idl,<br>+ 'Logical_Service', 'name',<br>+ self.lservice, None)<br>+ if service:<br>+ return<br>+<br>+ lswitch.verify('services')<br>+<br>+ service = txn.insert(self.api._tables['Logical_Service'])<br>+ service.name = self.lservice<br>+ for col, val in self.columns.items():<br>+ setattr(service, col, val)<br>+ # add the newly created service to existing lswitch<br>+ services.append(service.uuid)<br>+ setattr(lswitch, 'services', services)<br>+<br>+class SetLogicalServiceCommand(BaseCommand):</tt><br><tt>+ def __init__(self, api, lservice, if_exists, **columns):<br>+ super(SetLogicalServiceCommand, self).__init__(api)<br>+ self.lservice = lservice<br>+ self.columns = columns<br>+ self.if_exists = if_exists<br>+<br>+ def run_idl(self, txn):<br>+ try:<br>+ service = idlutils.row_by_value(self.api.idl, 'Logical_Service',<br>+ 'name', self.lservice)<br>+ except idlutils.RowNotFound:<br>+ if self.if_exists:<br>+ return<br>+ msg = _("Logical Service %s does not exist") % self.lservice<br>+ raise RuntimeError(msg)<br>+<br>+ for col, val in self.columns.items():<br>+ setattr(service, col, val)<br>+<br>+class DelLogicalServiceCommand(BaseCommand):<br>+ def __init__(self, api, lservice, lswitch, if_exists):<br>+ super(DelLogicalServiceCommand, self).__init__(api)<br>+ self.lservice = lservice<br>+ self.lswitch = lswitch<br>+ self.if_exists = if_exists<br>+<br>+ def run_idl(self, txn):<br>+ try:</tt><br><tt>+ lservice = idlutils.row_by_value(self.api.idl, 'Logical_Service',<br>+ 'name', self.lservice)<br>+ lswitch = idlutils.row_by_value(self.api.idl, 'Logical_Switch',<br>+ 'name', self.lswitch)<br>+ services = getattr(lswitch, 'services', [])<br>+ except idlutils.RowNotFound:<br>+ if self.if_exists:<br>+ return<br>+ msg = _("Service %s does not exist") % self.lservice<br>+ raise RuntimeError(msg)<br>+<br>+ lswitch.verify('services')<br>+<br>+ services.remove(lservice)<br>+ setattr(lswitch, 'services', services)<br>+ self.api._tables['Logical_Service'].rows[lservice.uuid].delete()<br> <br> class AddLRouterCommand(BaseCommand):<br> def __init__(self, api, name, may_exist, **columns):<br>diff --git a/networking_ovn/ovsdb/impl_idl_ovn.py b/networking_ovn/ovsdb/impl_idl_ovn.py<br>index c3411f0..38623ac 100644<br>--- a/networking_ovn/ovsdb/impl_idl_ovn.py<br>+++ b/networking_ovn/ovsdb/impl_idl_ovn.py</tt><br><tt>@@ -77,6 +77,24 @@ class OvsdbOvnIdl(ovn_api.API):<br> ext_id[0], ext_id[1],<br> if_exists)<br> <br>+ def create_lservice(self, lservice_name, lswitch_name, may_exist=True,<br>+ **columns):<br>+ return cmd.AddLogicalServiceCommand(self, lservice_name, lswitch_name,<br>+ may_exist, **columns)<br>+<br>+ def set_lservice(self, lservice_name, if_exists=True, **columns):<br>+ return cmd.SetLogicalServiceCommand(self, lservice_name,<br>+ if_exists, **columns)<br>+<br>+ def delete_lservice(self, lservice_name=None, lswitch=None,<br>+ ext_id=None, if_exists=True):<br>+ if lservice_name is not None:<br>+ return cmd.DelLogicalServiceCommand(self, lservice_name,<br>+ lswitch, if_exists)<br>+ else:<br>+ raise RuntimeError(_("Currently only supports "<br>+ "delete by lservice-name"))</tt><br><tt>+<br> def create_lport(self, lport_name, lswitch_name, may_exist=True,<br> **columns):<br> return cmd.AddLogicalPortCommand(self, lport_name, lswitch_name,<br>diff --git a/networking_ovn/ovsdb/ovn_api.py b/networking_ovn/ovsdb/ovn_api.py<br>index feca916..067488c 100644<br>--- a/networking_ovn/ovsdb/ovn_api.py<br>+++ b/networking_ovn/ovsdb/ovn_api.py<br>@@ -69,6 +69,55 @@ class API(object):<br> :returns: :class:`Command` with no result<br> """<br> <br>+<br>+<br>+<br>+ @abc.abstractmethod<br>+ def create_lservice(self, name, lswitch_name, may_exist=True, **columns):<br>+ """Create a command to add an OVN lservice<br>+<br>+ :param name: The name of the lservice<br>+ :type name: string<br>+ :param lswitch_name: The name of the lswitch the lservice is created on<br>+ :type lswitch_name: string<br>+ :param may_exist: Do not fail if lservice already exists<br>+ :type may_exist: bool<br>+ :param columns: Dictionary of service columns<br>+ Supported columns: app_port, in_port, out_port</tt><br><tt>+ :type columns: dictionary<br>+ :returns: :class:`Command` with no result<br>+ """<br>+<br>+ @abc.abstractmethod<br>+ def set_lservice(self, lservice_name, if_exists=True, **columns):<br>+ """Create a command to set OVN lservice fields<br>+<br>+ :param lservice_name: The name of the lservice<br>+ :type lservice_name: string<br>+ :param columns: Dictionary of service columns<br>+ Supported columns: app_port, in_port, out_port<br>+ :param if_exists: Do not fail if lservice does not exist<br>+ :type if_exists: bool<br>+ :type columns: dictionary<br>+ :returns: :class:`Command` with no result<br>+ """<br>+<br>+ @abc.abstractmethod<br>+ def delete_lservice(self, name=None, lswitch=None, ext_id=None,<br>+ if_exists=True):<br>+ """Create a command to delete an OVN lservice<br>+<br>+ :param name: The name of the lservice<br>+ :type name: string<br>+ :param lswitch: The name of the lswitch</tt><br><tt>+ :type lswitch: string<br>+ :param ext_id: The external id of the lservice<br>+ :type ext_id: pair of <ext_id_key ,ext_id_value><br>+ :param if_exists: Do not fail if the lservice does not exists<br>+ :type if_exists: bool<br>+ :returns: :class:`Command` with no result<br>+ """<br>+<br> @abc.abstractmethod<br> def create_lport(self, name, lswitch_name, may_exist=True, **columns):<br> """Create a command to add an OVN lport<br>-- <br>1.7.1</tt><br><br><br><BR>
</body></html>