[ovs-dev] [PATCH v3] ovn-ctl: Support starting clustered OVN dbs

Ben Pfaff blp at ovn.org
Wed Apr 4 17:21:52 UTC 2018


Hi Numan, thanks for the new version.

Did you (or someone else) re-test this with the changes that I made?  I
did not test them myself, so I have low confidence in them.  The
upgrade_cluster() function especially needs testing.

Thanks,

Ben.

On Wed, Apr 04, 2018 at 09:56:54PM +0530, nusiddiq at redhat.com wrote:
> From: Numan Siddique <nusiddiq at redhat.com>
> 
> This patch adds the options to start clustered OVN db servers in ovn-ctl.
> To support this, following options are added - '--db-(nb/sb)-cluster-local-addr',
> '--db-(nb/sb)-cluster-local-port', '--db-(nb/sb)-cluster-local-proto',
> '--db-(nb/sb)-cluster-remote-addr', '--db-(nb/sb)-cluster-remote-port' and
> '--db-(nb/sb)-cluster-remote-proto'.
> 
> If only '--db-(nb/sb)-cluster-local-addr' is defined then clustered db is created
> (using ovsdb-tool create-cluster). If both are defined, then the db is added to
> the cluster (using ovsdb-tool join-cluster)
> 
> This patch also adds the support to configure ovn-northd to point to all the servers
> in the cluster using the options - '--ovn-northd-nb-db' and 'ovn-northd-sb-db'.
> 
> Presently this patch doesn't handle the schema update scenario when restarting the
> clustered ovsdb-servers. This will be handled in a separate patch.
> 
> The initial versions of these commands are tested by Aliasgar <aginwala <aginwala at asu.edu>
> and the discussion on this can be found here -
> https://mail.openvswitch.org/pipermail/ovs-discuss/2018-March/046470.html
> 
> (There are 4 checkpatch warnings 'Line length is >79-characters long' in ovn-ctl.8.xml
> which I couldn't resolve without losing proper rendering when "man ovn-ctl" is run.)
> 
> Co-authored-by: Ben Pfaff <blp at ovn.org>
> Signed-off-by: Numan Siddique <nusiddiq at redhat.com>
> Signed-off-by: Ben Pfaff <blp at ovn.org>
> ---
>  ovn/utilities/ovn-ctl       | 191 +++++++++++++++++++++++++++++---------------
>  ovn/utilities/ovn-ctl.8.xml |  71 ++++++++++++++++
>  utilities/ovs-lib.in        |  62 ++++++++++++--
>  3 files changed, 255 insertions(+), 69 deletions(-)
> 
> diff --git a/ovn/utilities/ovn-ctl b/ovn/utilities/ovn-ctl
> index dc0c26159..25dda524c 100755
> --- a/ovn/utilities/ovn-ctl
> +++ b/ovn/utilities/ovn-ctl
> @@ -93,84 +93,103 @@ promote_ovnsb() {
>      ovs-appctl -t $rundir/ovnsb_db.ctl ovsdb-server/disconnect-active-ovsdb-server
>  }
>  
> -start_nb_ovsdb() {
> -    # Check and eventually start ovsdb-server for Northbound DB
> -    if ! pidfile_is_running $DB_NB_PID; then
> -        upgrade_db "$DB_NB_FILE" "$DB_NB_SCHEMA" 1>/dev/null 2>/dev/null
> +start_ovsdb__() {
> +    local DB=$1 db=$2 schema_name=$3 table_name=$4
> +    eval local pid=\$DB_${DB}_PID
> +    eval local cluster_local_addr=\$DB_${DB}_CLUSTER_LOCAL_ADDR
> +    eval local cluster_local_port=\$DB_${DB}_CLUSTER_LOCAL_PORT
> +    eval local cluster_local_proto=\$DB_${DB}_CLUSTER_LOCAL_PROTO
> +    eval local cluster_remote_addr=\$DB_${DB}_CLUSTER_REMOTE_ADDR
> +    eval local cluster_remote_port=\$DB_${DB}_CLUSTER_REMOTE_PORT
> +    eval local cluster_remote_proto=\$DB_${DB}_CLUSTER_REMOTE_PROTO
> +    eval local sync_from_proto=\$DB_${DB}_SYNC_FROM_PROTO
> +    eval local sync_from_addr=\$DB_${DB}_SYNC_FROM_ADDR
> +    eval local sync_from_port=\$DB_${DB}_SYNC_FROM_PORT
> +    eval local file=\$DB_${DB}_FILE
> +    eval local schema=\$DB_${DB}_SCHEMA
> +    eval local logfile=\$OVN_${DB}_LOGFILE
> +    eval local log=\$OVN_${DB}_LOG
> +    eval local sock=\$DB_${DB}_SOCK
> +    eval local detach=\$DB_${DB}_DETACH
> +    eval local create_insecure_remote=\$DB_${DB}_CREATE_INSECURE_REMOTE
> +    eval local port=\$DB_${DB}_PORT
> +    eval local addr=\$DB_${DB}_ADDR
> +    eval local active_conf_file=\$ovn${db}_active_conf_file
> +
> +    # Check and eventually start ovsdb-server for DB
> +    if pidfile_is_running $pid; then
> +        return
> +    fi
>  
> -        set ovsdb-server
> +    if test ! -z "$cluster_local_addr"; then
> +        mode=cluster
> +    elif test ! -z "$sync_from_addr"; then
> +        mode=active_passive
> +        echo "$sync_from_proto:$sync_from_addr:\
> +$sync_from_port" > $active_conf_file
> +    else
> +        mode=standalone
> +    fi
>  
> -        if test X"$DB_NB_DETACH" != Xno; then
> -            set "$@" --detach --monitor
> +    if test $mode = cluster; then
> +        local local=$cluster_local_proto:$cluster_local_addr:\
> +$cluster_local_port
> +        local remote=$cluster_remote_proto:$cluster_remote_addr:\
> +$cluster_remote_port
> +        if test -n "$cluster_remote_addr"; then
> +            join_cluster "$file" "$schema_name" "$local" "$remote"
>          else
> -            set exec "$@"
> +            create_cluster "$file" "$schema" "$local"
>          fi
> +    else
> +        upgrade_db "$file" "$schema"
> +    fi
>  
> -        set "$@" $OVN_NB_LOG --log-file=$OVN_NB_LOGFILE
> -        set "$@" --remote=punix:$DB_NB_SOCK --pidfile=$DB_NB_PID
> -        set "$@" --remote=db:OVN_Northbound,NB_Global,connections
> -        set "$@" --unixctl=ovnnb_db.ctl
> -        set "$@" --private-key=db:OVN_Northbound,SSL,private_key
> -        set "$@" --certificate=db:OVN_Northbound,SSL,certificate
> -        set "$@" --ca-cert=db:OVN_Northbound,SSL,ca_cert
> -        set "$@" --ssl-protocols=db:OVN_Northbound,SSL,ssl_protocols
> -        set "$@" --ssl-ciphers=db:OVN_Northbound,SSL,ssl_ciphers
> -
> -        if test X"$DB_NB_CREATE_INSECURE_REMOTE" = Xyes; then
> -            set "$@" --remote=ptcp:$DB_NB_PORT:$DB_NB_ADDR
> -        fi
> +    set ovsdb-server
> +    set "$@" $log --log-file=$logfile
> +    set "$@" --remote=punix:$sock --pidfile=$pid
> +    set "$@" --unixctl=ovn${db}_db.ctl
>  
> -        if test ! -z "$DB_NB_SYNC_FROM_ADDR"; then
> -            echo "$DB_NB_SYNC_FROM_PROTO:$DB_NB_SYNC_FROM_ADDR:$DB_NB_SYNC_FROM_PORT" > $ovnnb_active_conf_file
> -        fi
> +    if test X"$detach" != Xno; then
> +        set "$@" --detach --monitor
> +    else
> +        set exec "$@"
> +    fi
>  
> -        if test -e $ovnnb_active_conf_file; then
> -            set "$@" --sync-from=`cat $ovnnb_active_conf_file`
> -        fi
> +    set "$@" --remote=db:$schema_name,$table_name,connections
> +    set "$@" --private-key=db:$schema_name,SSL,private_key
> +    set "$@" --certificate=db:$schema_name,SSL,certificate
> +    set "$@" --ca-cert=db:$schema_name,SSL,ca_cert
> +    set "$@" --ssl-protocols=db:$schema_name,SSL,ssl_protocols
> +    set "$@" --ssl-ciphers=db:$schema_name,SSL,ssl_ciphers
>  
> -        $@ $DB_NB_FILE
> -        ovn-nbctl init
> +    if test X"$create_insecure_remote" = Xyes; then
> +        set "$@" --remote=ptcp:$port:$addr
>      fi
> -}
>  
> -start_sb_ovsdb() {
> -    # Check and eventually start ovsdb-server for Southbound DB
> -    if ! pidfile_is_running $DB_SB_PID; then
> -        upgrade_db "$DB_SB_FILE" "$DB_SB_SCHEMA" 1>/dev/null 2>/dev/null
> -
> -        set ovsdb-server
> +    if test $mode = active_passive; then
> +        set "$@" --sync-from=`cat $active_conf_file`
> +    fi
>  
> -        if test X"$DB_SB_DETACH" != Xno; then
> -            set "$@" --detach --monitor
> -        else
> -            set exec "$@"
> -        fi
> +    "$@" "$file"
>  
> -        set "$@" $OVN_SB_LOG --log-file=$OVN_SB_LOGFILE
> -        set "$@" --remote=punix:$DB_SB_SOCK --pidfile=$DB_SB_PID
> -        set "$@" --remote=db:OVN_Southbound,SB_Global,connections
> -        set "$@" --unixctl=ovnsb_db.ctl
> -        set "$@" --private-key=db:OVN_Southbound,SSL,private_key
> -        set "$@" --certificate=db:OVN_Southbound,SSL,certificate
> -        set "$@" --ca-cert=db:OVN_Southbound,SSL,ca_cert
> -        set "$@" --ssl-protocols=db:OVN_Southbound,SSL,ssl_protocols
> -        set "$@" --ssl-ciphers=db:OVN_Southbound,SSL,ssl_ciphers
> -
> -        if test X"$DB_SB_CREATE_INSECURE_REMOTE" = Xyes; then
> -            set "$@" --remote=ptcp:$DB_SB_PORT:$DB_SB_ADDR
> -        fi
> +    # Initialize the database if it's running standalone,
> +    # active-passive, or is the first server in a cluster.
> +    if test -z "$cluster_remote_addr"; then
> +        ovn-nbctl init
> +    fi
>  
> -        if test ! -z "$DB_SB_SYNC_FROM_ADDR"; then
> -            echo "$DB_SB_SYNC_FROM_PROTO:$DB_SB_SYNC_FROM_ADDR:$DB_SB_SYNC_FROM_PORT" > $ovnsb_active_conf_file
> -        fi
> +    if test $mode = cluster; then
> +        upgrade_cluster "$schema" "unix:$sock"
> +    fi
> +}
>  
> -        if test -e $ovnsb_active_conf_file; then
> -            set "$@" --sync-from=`cat $ovnsb_active_conf_file`
> -        fi
> +start_nb_ovsdb() {
> +    start_ovsdb__ NB nb OVN_Northbound NB_Global
> +}
>  
> -        $@ $DB_SB_FILE
> -        ovn-sbctl init
> -    fi
> +start_sb_ovsdb() {
> +    start_ovsdb__ SB sb OVN_Southbound SB_Global
>  }
>  
>  start_ovsdb () {
> @@ -236,7 +255,8 @@ start_northd () {
>                  exit
>              fi
>          fi
> -        ovn_northd_params="--ovnnb-db=unix:$DB_NB_SOCK --ovnsb-db=unix:$DB_SB_SOCK"
> +        ovn_northd_params="--ovnnb-db=$OVN_NORTHD_NB_DB \
> +        --ovnsb-db=$OVN_NORTHD_SB_DB"
>      else
>          ovn_northd_params="`cat $ovn_northd_db_conf_file`"
>      fi
> @@ -406,6 +426,23 @@ set_defaults () {
>  
>      DB_NB_DETACH="yes"
>      DB_SB_DETACH="yes"
> +
> +    DB_NB_CLUSTER_LOCAL_ADDR=""
> +    DB_NB_CLUSTER_LOCAL_PROTO="tcp"
> +    DB_NB_CLUSTER_LOCAL_PORT=6643
> +    DB_NB_CLUSTER_REMOTE_ADDR=""
> +    DB_NB_CLUSTER_REMOTE_PROTO="tcp"
> +    DB_NB_CLUSTER_REMOTE_PORT=6643
> +
> +    DB_SB_CLUSTER_LOCAL_ADDR=""
> +    DB_SB_CLUSTER_LOCAL_PROTO="tcp"
> +    DB_SB_CLUSTER_LOCAL_PORT=6644
> +    DB_SB_CLUSTER_REMOTE_ADDR=""
> +    DB_SB_CLUSTER_REMOTE_PROTO="tcp"
> +    DB_SB_CLUSTER_REMOTE_PORT=6644
> +
> +    OVN_NORTHD_NB_DB="unix:$DB_NB_SOCK"
> +    OVN_NORTHD_SB_DB="unix:$DB_SB_SOCK"
>  }
>  
>  set_option () {
> @@ -494,6 +531,32 @@ File location options:
>    --db-sb-sync-from-port=ADDR OVN Southbound active db tcp port (default: $DB_SB_SYNC_FROM_PORT)
>    --db-sb-sync-from-proto=PROTO OVN Southbound active db transport (default: $DB_SB_SYNC_FROM_PROTO)
>    --db-sb-create-insecure-remote=yes|no Create ptcp OVN Southbound remote (default: $DB_SB_CREATE_INSECURE_REMOTE)
> +  --db-nb-cluster-local-addr=ADDR OVN_Northbound cluster local address \
> +  (default: $DB_NB_CLUSTER_LOCAL_ADDR)
> +  --db-nb-cluster-local-port=PORT OVN_Northbound cluster local tcp port \
> +  (default: $DB_NB_CLUSTER_LOCAL_PORT)
> +  --db-nb-cluster-local-proto=PROTO OVN_Northbound cluster local db transport \
> +  (default: $DB_NB_CLUSTER_LOCAL_PROTO)
> +  --db-nb-cluster-remote-addr=ADDR OVN_Northbound cluster remote address \
> +  (default: $DB_NB_CLUSTER_REMOTE_ADDR)
> +  --db-nb-cluster-remote-port=PORT OVN_Northbound cluster remote tcp port \
> +  (default: $DB_NB_CLUSTER_REMOTE_PORT)
> +  --db-nb-cluster-remote-proto=PROTO OVN_Northbound cluster remote db \
> +  transport (default: $DB_NB_CLUSTER_REMOTE_PROTO)
> +  --db-sb-cluster-local-addr=ADDR OVN_Southbound cluster local address \
> +  (default: $DB_SB_CLUSTER_LOCAL_ADDR)
> +  --db-sb-cluster-local-port=PORT OVN_Southbound cluster local tcp port \
> +  (default: $DB_SB_CLUSTER_LOCAL_PORT)
> +  --db-sb-cluster-local-proto=PROTO OVN_Southbound cluster local db transport \
> +  (default: $DB_SB_CLUSTER_LOCAL_PROTO)
> +  --db-sb-cluster-remote-addr=ADDR OVN_Southbound cluster remote address \
> +  (default: $DB_SB_CLUSTER_REMOTE_ADDR)
> +  --db-sb-cluster-remote-port=PORT OVN_Southbound cluster remote tcp port \
> +  (default: $DB_SB_CLUSTER_REMOTE_PORT)
> +  --db-sb-cluster-remote-proto=PROTO OVN_Southbound cluster remote db \
> +  transport (default: $DB_SB_CLUSTER_REMOTE_PROTO)
> +  --ovn-northd-nb-db=NB DB address(es) (default: $OVN_NORTHD_NB_DB)
> +  --ovn-northd-sb-db=SB DB address(es) (default: $OVN_NORTHD_SB_DB)
>  
>  Default directories with "configure" option and environment variable override:
>    logs: /usr/local/var/log/openvswitch (--with-logdir, OVS_LOGDIR)
> diff --git a/ovn/utilities/ovn-ctl.8.xml b/ovn/utilities/ovn-ctl.8.xml
> index 40defc9ec..02235fe1e 100644
> --- a/ovn/utilities/ovn-ctl.8.xml
> +++ b/ovn/utilities/ovn-ctl.8.xml
> @@ -66,6 +66,31 @@
>      <p><code>--db-sb-sync-from-addr=<var>IP ADDRESS</var></code></p>
>      <p><code>--db-sb-sync-from-port=<var>PORT NUMBER</var></code></p>
>      <p><code>--db-sb-sync-from-proto=<var>PROTO</var></code></p>
> +    <p>
> +      <code>
> +        --ovn-northd-nb-db=<var>PROTO</var>:<var>IP ADDRESS</var>:
> +        <var>PORT</var>..
> +      </code>
> +    </p>
> +    <p>
> +      <code>
> +        --ovn-northd-sb-db=<var>PROTO</var>:<var>IP ADDRESS</var>:
> +        <var>PORT</var>..
> +      </code>
> +    </p>
> +    <h1> Clustering options </h1>
> +    <p><code>--db-nb-cluster-local-addr=<var>IP ADDRESS</var></code></p>
> +    <p><code>--db-nb-cluster-local-port=<var>PORT NUMBER</var></code></p>
> +    <p><code>--db-nb-cluster-local-proto=<var>PROTO (tcp/ssl)</var></code></p>
> +    <p><code>--db-nb-cluster-remote-addr=<var>IP ADDRESS</var></code></p>
> +    <p><code>--db-nb-cluster-remote-port=<var>PORT NUMBER</var></code></p>
> +    <p><code>--db-nb-cluster-remote-proto=<var>PROTO (tcp/ssl)</var></code></p>
> +    <p><code>--db-sb-cluster-local-addr=<var>IP ADDRESS</var></code></p>
> +    <p><code>--db-sb-cluster-local-port=<var>PORT NUMBER</var></code></p>
> +    <p><code>--db-sb-cluster-local-proto=<var>PROTO (tcp/ssl)</var></code></p>
> +    <p><code>--db-sb-cluster-remote-addr=<var>IP ADDRESS</var></code></p>
> +    <p><code>--db-sb-cluster-remote-port=<var>PORT NUMBER</var></code></p>
> +    <p><code>--db-sb-cluster-remote-proto=<var>PROTO (tcp/ssl)</var></code></p>
>  
>      <h1>Configuration files</h1>
>      <p>Following are the optional configuration files. If present, it should be located in the etc dir</p>
> @@ -125,4 +150,50 @@
>      <p><code># ovn-ctl promote_ovnsb</code></p>
>      <p><code># ovn-ctl --db-nb-sync-from-addr=x.x.x.x --db-nb-sync-from-port=6641 demote_ovnnb</code></p>
>      <p><code># ovn-ctl --db-sb-sync-from-addr=x.x.x.x --db-sb-sync-from-port=6642 demote_ovnsb</code></p>
> +
> +    <h2>Creating a clustered db on 3 nodes with IPs x.x.x.x, y.y.y.y and z.z.z.z</h2>
> +    <h3>Starting OVN ovsdb servers and ovn-northd on the node with IP x.x.x.x</h3>
> +    <p>
> +      <code>
> +        # ovn-ctl --db-nb-addr=x.x.x.x --db-nb-create-insecure-remote=yes
> +        --db-sb-addr=x.x.x.x --db-sb-create-insecure-remote=yes
> +        --db-nb-cluster-local-addr=x.x.x.x
> +        --db-sb-cluster-local-addr=x.x.x.x
> +        --ovn-northd-nb-db=tcp:x.x.x.x:6641,tcp:y.y.y.y:6641,tcp:z.z.z.z:6641
> +        --ovn-northd-sb-db=tcp:x.x.x.x:6642,tcp:y.y.y.y:6642,tcp:z.z.z.z:6642
> +        start_northd
> +      </code>
> +    </p>
> +
> +    <h3>Starting OVN ovsdb-servers and ovn-northd on the node with IP y.y.y.y and joining the cluster started at x.x.x.x</h3>
> +    <p>
> +      <code>
> +        # ovn-ctl --db-nb-addr=y.y.y.y --db-nb-create-insecure-remote=yes
> +        --db-sb-addr=y.y.y.y --db-sb-create-insecure-remote=yes
> +        --db-nb-cluster-local-addr=y.y.y.y
> +        --db-sb-cluster-local-addr=y.y.y.y
> +        --db-nb-cluster-remote-addr=x.x.x.x
> +        --db-sb-cluster-remote-addr=x.x.x.x
> +        --ovn-northd-nb-db=tcp:x.x.x.x:6641,tcp:y.y.y.y:6641,tcp:z.z.z.z:6641
> +        --ovn-northd-sb-db=tcp:x.x.x.x:6642,tcp:y.y.y.y:6642,tcp:z.z.z.z:6642
> +        start_northd
> +      </code>
> +    </p>
> +
> +    <h3>Starting OVN ovsdb-servers and ovn-northd on the node with IP z.z.z.z and joining the cluster started at x.x.x.x</h3>
> +    <p>
> +      <code>
> +        # ovn-ctl --db-nb-addr=z.z.z.z
> +          --db-nb-create-insecure-remote=yes
> +          --db-nb-cluster-local-addr=z.z.z.z
> +          --db-sb-addr=z.z.z.z
> +          --db-sb-create-insecure-remote=yes
> +          --db-sb-cluster-local-addr=z.z.z.z
> +          --db-nb-cluster-remote-addr=x.x.x.x
> +          --db-sb-cluster-remote-addr=x.x.x.x
> +          --ovn-northd-nb-db=tcp:x.x.x.x:6641,tcp:y.y.y.y:6641,tcp:z.z.z.z:6641
> +          --ovn-northd-sb-db=tcp:x.x.x.x:6642,tcp:y.y.y.y:6642,tcp:z.z.z.z:6642
> +          start_northd
> +      </code>
> +    </p>
>  </manpage>
> diff --git a/utilities/ovs-lib.in b/utilities/ovs-lib.in
> index 4b08f0f53..4dc315118 100644
> --- a/utilities/ovs-lib.in
> +++ b/utilities/ovs-lib.in
> @@ -401,6 +401,14 @@ create_db () {
>      action "Creating empty database $DB_FILE" ovsdb_tool create "$DB_FILE" "$DB_SCHEMA"
>  }
>  
> +backup_db () {
> +    # Back up the old version.
> +    version=`ovsdb_tool db-version "$DB_FILE"`
> +    cksum=`ovsdb_tool db-cksum "$DB_FILE" | awk '{print $1}'`
> +    backup=$DB_FILE.backup$version-$cksum
> +    action "Backing up database to $backup" cp "$DB_FILE" "$backup" || return 1
> +}
> +
>  upgrade_db () {
>      DB_FILE="$1"
>      DB_SCHEMA="$2"
> @@ -411,11 +419,7 @@ upgrade_db () {
>          install_dir `dirname $DB_FILE`
>          create_db "$DB_FILE" "$DB_SCHEMA"
>      elif test X"`ovsdb_tool needs-conversion "$DB_FILE" "$DB_SCHEMA"`" = Xyes; then
> -        # Back up the old version.
> -        version=`ovsdb_tool db-version "$DB_FILE"`
> -        cksum=`ovsdb_tool db-cksum "$DB_FILE" | awk '{print $1}'`
> -        backup=$DB_FILE.backup$version-$cksum
> -        action "Backing up database to $backup" cp "$DB_FILE" "$backup" || return 1
> +        backup_db || return 1
>  
>          # Compact database.  This is important if the old schema did not enable
>          # garbage collection (i.e. if it did not have any tables with "isRoot":
> @@ -443,6 +447,54 @@ upgrade_db () {
>      fi
>  }
>  
> +upgrade_cluster () {
> +    local DB_SCHEMA=$1 DB_SERVER=$2
> +    local schema_name=$(ovsdb-tool schema-name $1) || return 1
> +
> +    action "Waiting for $schema_name to come up" ovsdb-client -t 30 wait "$DB_SERVER" "$schema_name" connected || return $?
> +    local db_version=$(ovsdb-client -t 10 get-schema-version "$DB_SERVER" "$schema_name") || return $?
> +    local target_version=$(ovsdb-tool schema-version "$DB_SCHEMA") || return $?
> +
> +    if ovsdb-tool compare-versions "$db_version" == "$target_version"; then
> +        :
> +    elif ovsdb-tool compare-versions "$db_version" ">" "$target_version"; then
> +        log_warning_msg "Database $schema_name has newer schema version ($db_version) than our local schema ($target_version), possibly an upgrade is partially complete?"
> +    else
> +        action "Upgrading database $schema_name from schema version $db_version to $target_version" ovsdb-client -t 30 convert "$DB_SERVER" "$DB_SCHEMA"
> +    fi
> +}
> +
> +create_cluster () {
> +    DB_FILE="$1"
> +    DB_SCHEMA="$2"
> +    LOCAL_ADDR="$3"
> +
> +    if test ! -e "$DB_FILE"; then
> +        action "Creating cluster database $DB_FILE" ovsdb_tool create-cluster "$DB_FILE" "$DB_SCHEMA" "$LOCAL_ADDR"
> +    elif ovsdb_tool db-is-standalone "$DB_FILE"; then
> +        # Convert standalone database to clustered.
> +        backup_db || return 1
> +        action "Creating cluster database $DB_FILE from existing one" \
> +               ovsdb_tool create-cluster "$DB_FILE" "$backup" "$LOCAL_ADDR"
> +    fi
> +}
> +
> +join_cluster() {
> +    DB_FILE="$1"
> +    SCHEMA_NAME="$2"
> +    LOCAL_ADDR="$3"
> +    REMOTE_ADDR="$4"
> +
> +    if test ! -e "$DB_FILE"; then
> +        ovsdb_tool join-cluster "$DB_FILE" "$SCHEMA_NAME" "$LOCAL_ADDR" "$REMOTE_ADDR"
> +    elif ovsdb_tool db-is-standalone "$DB_FILE"; then
> +        # Backup standalone database and join cluster.
> +        backup_db || return 1
> +        action "Joining $DB_FILE to cluster" \
> +               ovsdb_tool join-cluster "$DB_FILE" "$SCHEMA_NAME" "$LOCAL_ADDR"
> +    fi
> +}
> +
>  ovs_vsctl () {
>      ovs-vsctl --no-wait "$@"
>  }
> -- 
> 2.14.3
> 


More information about the dev mailing list