On Wed, Dec 04, 2013 at 10:27:10AM -0800, Gurucharan Shetty wrote:
> On Mon, Dec 2, 2013 at 5:13 PM, Flavio Leitner <f...@redhat.com> wrote:
> > There is a chicken and egg issue where common OVS
> > configuration uses a controller which is only accessible
> > via the network. So starting OVS before network.target
> > would break those configurations.
> >
> > However, the network doesn't come up after boot because
> > OVS isn't started until after the network scripts tries
> > to configure the ovs.
> >
> > This is partially fixed by commits:
> >    commit: 602453000e28ec1076c0482ce13c284765a84409
> >    rhel: Automatically start openvswitch service before bringing an ovs 
> > interfa
> >
> >    commit: 3214851c31538e8690e31f95702f8927a8c0838b
> >    rhel: Add OVSREQUIRES to automatically bring up OpenFlow interface 
> > dependencies
> >
> > But still there is the dependency issue between network.target
> > and openvswitch which this patch fixes it.  It provides two systemd
> > service units. One to run at any time (openvswitch-nonetwork.service)
> > which runs 'ovs-ctl start' and the other one (openvswith.service) to
> > run after network.target which works as a frontend to the admin.
> >
> > The openvswitch-nonetwork.service is used internally by the
> > 'ifup-ovs/ifdown-ovs' scripts when adding or removing ports to
> > the bridge or when the openvswitch.service is enabled by the admin.
> >
> > Signed-off-by: Flavio Leitner <f...@redhat.com>
> > ---
> >  rhel/automake.mk                                          |  3 ++-
> >  rhel/etc_sysconfig_network-scripts_ifdown-ovs             | 10 +++++++++-
> >  rhel/etc_sysconfig_network-scripts_ifup-ovs               | 12 ++++++++++--
> >  rhel/openvswitch-fedora.spec.in                           |  3 +++
> >  rhel/usr_lib_systemd_system_openvswitch-nonetwork.service | 14 
> > ++++++++++++++
> >  rhel/usr_lib_systemd_system_openvswitch.service           | 11 +++++++----
> >  6 files changed, 45 insertions(+), 8 deletions(-)
> >  create mode 100644 
> > rhel/usr_lib_systemd_system_openvswitch-nonetwork.service
> >
> > diff --git a/rhel/automake.mk b/rhel/automake.mk
> > index 2911e71..cd06823 100644
> > --- a/rhel/automake.mk
> > +++ b/rhel/automake.mk
> > @@ -22,7 +22,8 @@ EXTRA_DIST += \
> >         rhel/openvswitch-fedora.spec \
> >         rhel/openvswitch-fedora.spec.in \
> >         rhel/usr_share_openvswitch_scripts_sysconfig.template \
> > -       rhel/usr_lib_systemd_system_openvswitch.service
> > +       rhel/usr_lib_systemd_system_openvswitch.service \
> > +       rhel/usr_lib_systemd_system_openvswitch-nonetwork.service
> >
> >  update_rhel_spec = \
> >    ($(ro_shell) && sed -e 's,[@]VERSION[@],$(VERSION),g') \
> > diff --git a/rhel/etc_sysconfig_network-scripts_ifdown-ovs 
> > b/rhel/etc_sysconfig_network-scripts_ifdown-ovs
> > index 8e768c8..2a3d8d2 100755
> > --- a/rhel/etc_sysconfig_network-scripts_ifdown-ovs
> > +++ b/rhel/etc_sysconfig_network-scripts_ifdown-ovs
> > @@ -34,7 +34,15 @@ if [ ! -x ${OTHERSCRIPT} ]; then
> >      OTHERSCRIPT="/etc/sysconfig/network-scripts/ifdown-eth"
> >  fi
> >
> > -[ -f /var/lock/subsys/openvswitch ] || /sbin/service openvswitch start
> > +if [ -x /usr/bin/systemctl ]; then
> > +       if ! systemctl --quiet is-active openvswitch-nonetwork.service; then
> I think this is considered non-portable.
> https://www.sourceware.org/autobook/autobook/autobook_216.html

That construction form is used quite frequently in rpm distros. There
are some examples in /etc/sysconfig/network-scripts/network-functions
and this is specific to rhel/.

What about using the return value? Something like:

/usr/bin/systemctl --quiet is-active openvswitch-nonetwork.service
if [ $? -ne 0 ]; then
      /usr/bin/systemctl start openvswitch-nonetwork.service
fi


> > +               /usr/bin/systemctl start openvswitch-nonetwork.service
> > +       fi
> > +else
> > +       if [ ! -f /var/lock/subsys/openvswitch ]; then
> > +               /sbin/service openvswitch start
> > +       fi
> > +fi
> >
> >  case "$TYPE" in
> >         OVSBridge)
> > diff --git a/rhel/etc_sysconfig_network-scripts_ifup-ovs 
> > b/rhel/etc_sysconfig_network-scripts_ifup-ovs
> > index 017346d..817f93f 100755
> > --- a/rhel/etc_sysconfig_network-scripts_ifup-ovs
> > +++ b/rhel/etc_sysconfig_network-scripts_ifup-ovs
> > @@ -60,8 +60,16 @@ fi
> >         fi
> >  done
> >
> > -[ -f /var/lock/subsys/openvswitch ] || /sbin/service openvswitch start
> > -
> > +if [ -x /usr/bin/systemctl ]; then
> > +       if ! systemctl --quiet is-active openvswitch-nonetwork.service; then
> > +               /usr/bin/systemctl start openvswitch-nonetwork.service
> > +       fi
> > +else
> > +       if [ ! -f /var/lock/subsys/openvswitch ]; then
> > +               /sbin/service openvswitch start
> > +       fi
> > +fi
> > +
> >  case "$TYPE" in
> >         OVSBridge)
> >                 # If bridge already exists and is up, it has been 
> > configured through
> > diff --git a/rhel/openvswitch-fedora.spec.in 
> > b/rhel/openvswitch-fedora.spec.in
> > index 5384c32..e6b40a5 100644
> > --- a/rhel/openvswitch-fedora.spec.in
> > +++ b/rhel/openvswitch-fedora.spec.in
> > @@ -45,6 +45,8 @@ install -d -m 755 $RPM_BUILD_ROOT/etc
> >  install -d -m 755 $RPM_BUILD_ROOT/etc/openvswitch
> >  install -p -D -m 0644 rhel/usr_lib_systemd_system_openvswitch.service \
> >          $RPM_BUILD_ROOT%{_unitdir}/openvswitch.service
> > +install -p -D -m 0644 
> > rhel/usr_lib_systemd_system_openvswitch-nonetwork.service \
> > +        $RPM_BUILD_ROOT%{_unitdir}/openvswitch-nonetwork.service
> >  install -m 755 rhel/etc_init.d_openvswitch \
> >          $RPM_BUILD_ROOT%{_datadir}/openvswitch/scripts/openvswitch.init
> >  install -d -m 755 $RPM_BUILD_ROOT/etc/sysconfig
> > @@ -101,6 +103,7 @@ systemctl start openvswitch.service
> >  %config /etc/sysconfig/openvswitch
> >  %config /etc/logrotate.d/openvswitch
> >  %{_unitdir}/openvswitch.service
> > +%{_unitdir}/openvswitch-nonetwork.service
> >  %{_datadir}/openvswitch/scripts/openvswitch.init
> >  %{_sysconfdir}/sysconfig/network-scripts/ifup-ovs
> >  %{_sysconfdir}/sysconfig/network-scripts/ifdown-ovs
> > diff --git a/rhel/usr_lib_systemd_system_openvswitch-nonetwork.service 
> > b/rhel/usr_lib_systemd_system_openvswitch-nonetwork.service
> > new file mode 100644
> > index 0000000..f9fc83d
> > --- /dev/null
> > +++ b/rhel/usr_lib_systemd_system_openvswitch-nonetwork.service
> > @@ -0,0 +1,14 @@
> > +[Unit]
> > +Description=Open vSwitch Internal Unit
> > +After=syslog.target
> > +PartOf=openvswitch.service
> > +Wants=openvswitch.service
> > +
> > +[Service]
> > +Type=oneshot
> > +EnvironmentFile=-/etc/sysconfig/openvswitch
> > +RemainAfterExit=yes
> > +ExecStart=/usr/share/openvswitch/scripts/ovs-ctl start --system-id=random \
> > +       $FORCE_COREFILES $OVSDB_SERVER_PRIORITY $VSWITCHD_PRIORITY \
> > +       $VSWITCHD_MLOCKALL $BRCOMPAT $OVS_CTL_OPTS
> I think this will not work well.
> If you see the rhel startup script, you will see code like this:
> set ovs_ctl ${1-start}
> if test X"$OVSDB_SERVER_PRIORITY" != X; then
>     set "$@" --ovsdb-server-priority="$OVSDB_SERVER_PRIORITY"
> fi
> "$@"

I forgot to include the /etc/sysconfig/openvswitch in the patch.
It looks like this:

   ### Configuration options for openvswitch
   
   ## FORCE_COREFILES: If 'yes' then core files will be enabled.
   #FORCE_COREFILES="--force-corefiles=yes"
   
   ## OVSDB_SERVER_PRIORITY: "nice" priority at which to run ovsdb-server.
   #OVSDB_SERVER_PRIORITY="--ovsdb-server-priority=-10"
   
   ## VSWITCHD_PRIORITY: "nice" priority at which to run ovs-vswitchd.
   #VSWITCHD_PRIORITY="--ovs-vswitchd-priority=-10"
   
   ## VSWITCHD_MLOCKALL: Whether to pass ovs-vswitchd the --mlockall option.
   #     This option should be set to "yes" or "no".  The default is "yes".
   #     Enabling this option can avoid networking interruptions due to
   #     system memory pressure in extraordinary situations, such as
   #     multiple
   #     concurrent VM import operations.
   #VSWITCHD_MLOCKALL="--mlockall=yes"
   
   ## BRCOMPAT: If 'yes' compatibility mode will be enabled.
   #BRCOMPAT=--brcompat
   
   ## OVS_CTL_OPTS: Extra options to pass to ovs-ctl.  This is, for example,
   # a suitable place to specify --ovs-vswitchd-wrapper=valgrind.
   #OVS_CTL_OPTS="--ovs-vswitchd-wrapper=valgrind"
   

By the way, it is hard coded --systemd-id=random in
rhel/etc_init.d_openvswitch. I think it should be in
/etc/sysconfig/openvswitch too, right?

Thanks for reviewing it.
fbl


> > +ExecStop=/usr/share/openvswitch/scripts/ovs-ctl stop
> > diff --git a/rhel/usr_lib_systemd_system_openvswitch.service 
> > b/rhel/usr_lib_systemd_system_openvswitch.service
> > index f39d7e6..6e08a9a 100644
> > --- a/rhel/usr_lib_systemd_system_openvswitch.service
> > +++ b/rhel/usr_lib_systemd_system_openvswitch.service
> > @@ -1,12 +1,15 @@
> >  [Unit]
> > -Description=Open vSwitch
> > -After=syslog.target network.target
> > +Description=Open vSwitch Unit
> > +After=syslog.target
> > +After=network.target
> > +After=openvswitch-nonetwork.service
> > +Requires=openvswitch-nonetwork.service
> >
> >  [Service]
> >  Type=oneshot
> > -ExecStart=/usr/share/openvswitch/scripts/openvswitch.init start
> > -ExecStop=/usr/share/openvswitch/scripts/openvswitch.init stop
> >  RemainAfterExit=yes
> > +ExecStart=/bin/true
> > +ExecStop=/bin/true
> 
> 
> >
> >  [Install]
> >  WantedBy=multi-user.target
> > --
> > 1.8.3.1
> >
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
> 
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to