Browse code

etcd3 as a base service

ETCD_DOWNLOAD_URL is set to github url, in our CI, we can point
ETCD_DOWNLOAD_URL to a url in tarballs.openstack.org possibly
in devstack-gate

Download the etcd binaries and drop them into /opt/stack/bin and
use it from there. Cache the tgz for subsequent use (local workflow)

daemon-reload is called twice once from inside the write_user_unit_file
and then when we adjust the entries with additional things recommended
by the etcd team. We need a better way to do this in the future.

Added a TODO to verify the downloaded artifact later. The etcd team
posts gpg signature, we could verify that or run sha256sum and hard
code that in lib/etcd3 file. We would have to update it whenever we
bump the etcd3 version.

We use the public key "CoreOS Application Signing Key <security@coreos.com>"
with ID FC8A365E to verify the integrity of the downloaded file

Any jobs that need to be run on architectures where v3.1.7 is not available
should rey the v3.2.0-rcX release candidates. We can switch to v3.2.0
when it gets released.

Initial version of this code was borrowed from the dragonflow
repo:
http://git.openstack.org/cgit/openstack/dragonflow/tree/devstack

Change-Id: Ibbb430fb1dbf66942168e0cb52d990ab6a2eb8d7

Davanum Srinivas authored on 2017/03/14 20:05:19
Showing 4 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,126 @@
0
+#!/bin/bash
1
+#
2
+# lib/etcd3
3
+#
4
+# Functions to control the installation and configuration of etcd 3.x
5
+# that provides a key-value store (and possibly other functions).
6
+
7
+# Dependencies:
8
+#
9
+# - ``functions`` file
10
+
11
+# ``stack.sh`` calls the entry points in this order:
12
+#
13
+# - start_etcd3
14
+# - stop_etcd3
15
+# - cleanup_etcd3
16
+
17
+# Save trace setting
18
+_XTRACE_ETCD3=$(set +o | grep xtrace)
19
+set +o xtrace
20
+
21
+
22
+# Defaults
23
+# --------
24
+
25
+# Set up default values for etcd
26
+ETCD_DOWNLOAD_URL=${ETCD_DOWNLOAD_URL:-https://github.com/coreos/etcd/releases/download}
27
+ETCD_VERSION=${ETCD_VERSION:-v3.1.7}
28
+ETCD_DATA_DIR="$DEST/data/etcd"
29
+ETCD_SYSTEMD_SERVICE="devstack@etcd.service"
30
+ETCD_BIN_DIR="$DEST/bin"
31
+
32
+if is_ubuntu ; then
33
+    UBUNTU_RELEASE_BASE_NUM=`lsb_release -r | awk '{print $2}' | cut -d '.' -f 1`
34
+fi
35
+
36
+# start_etcd3() - Starts to run the etcd process
37
+function start_etcd3 {
38
+    _install_etcd
39
+
40
+    local cmd="$ETCD_BIN_DIR/etcd"
41
+    cmd+=" --name $HOSTNAME --data-dir $ETCD_DATA_DIR"
42
+    cmd+=" --initial-cluster-state new --initial-cluster-token etcd-cluster-01"
43
+    cmd+=" --initial-cluster $HOSTNAME=http://$SERVICE_HOST:2380"
44
+    cmd+=" --initial-advertise-peer-urls http://$SERVICE_HOST:2380"
45
+    cmd+=" --advertise-client-urls http://$SERVICE_HOST:2379"
46
+    cmd+=" --listen-peer-urls http://0.0.0.0:2380 "
47
+    cmd+=" --listen-client-urls http://$SERVICE_HOST:2379"
48
+
49
+    local unitfile="$SYSTEMD_DIR/$ETCD_SYSTEMD_SERVICE"
50
+    write_user_unit_file $ETCD_SYSTEMD_SERVICE "$cmd" "" "root"
51
+
52
+    iniset -sudo $unitfile "Unit" "After" "network.target"
53
+    iniset -sudo $unitfile "Service" "Type" "notify"
54
+    iniset -sudo $unitfile "Service" "Restart" "on-failure"
55
+    iniset -sudo $unitfile "Service" "LimitNOFILE" "65536"
56
+
57
+    $SYSTEMCTL daemon-reload
58
+    $SYSTEMCTL enable $ETCD_SYSTEMD_SERVICE
59
+    $SYSTEMCTL start $ETCD_SYSTEMD_SERVICE
60
+}
61
+
62
+# stop_etcd3() stops the etcd3 process
63
+function stop_etcd3 {
64
+    $SYSTEMCTL stop $ETCD_SYSTEMD_SERVICE
65
+}
66
+
67
+function cleanup_etcd {
68
+    $SYSTEMCTL disable $ETCD_SYSTEMD_SERVICE
69
+
70
+    local unitfile="$SYSTEMD_DIR/$ETCD_SYSTEMD_SERVICE"
71
+    sudo rm -f $unitfile
72
+
73
+    $SYSTEMCTL daemon-reload
74
+
75
+    sudo rm -rf $ETCD_DATA_DIR
76
+}
77
+
78
+function _install_etcd {
79
+    echo "Installing etcd"
80
+
81
+    # Make sure etcd3 downloads the correct architecture
82
+    if is_arch "x86_64"; then
83
+        ETCD_ARCH="amd64"
84
+    elif is_arch "aarch64"; then
85
+        ETCD_ARCH="arm64"
86
+    elif is_arch "ppc64le"; then
87
+        ETCD_ARCH="ppc64le"
88
+    else
89
+        exit_distro_not_supported "invalid hardware type - $ETCD_ARCH"
90
+    fi
91
+
92
+    # Install the libraries needed. Note: tooz for example does not have a hard dependency on these libraries
93
+    pip_install etcd3
94
+    pip_install etcd3gw
95
+
96
+    # Create the necessary directories
97
+    sudo mkdir -p $ETCD_BIN_DIR
98
+    sudo mkdir -p $ETCD_DATA_DIR
99
+
100
+    # Download and cache the etcd tgz for subsequent use
101
+    if [ ! -f "$DEST/etcd/etcd-$ETCD_VERSION-linux-$ETCD_ARCH/etcd" ]; then
102
+        mkdir -p $DEST/etcd
103
+        ETCD_DOWNLOAD_FILE=etcd-$ETCD_VERSION-linux-$ETCD_ARCH.tar.gz
104
+        wget $ETCD_DOWNLOAD_URL/$ETCD_VERSION/$ETCD_DOWNLOAD_FILE -O $DEST/etcd/$ETCD_DOWNLOAD_FILE
105
+        wget $ETCD_DOWNLOAD_URL/$ETCD_VERSION/$ETCD_DOWNLOAD_FILE.asc -O $DEST/etcd/$ETCD_DOWNLOAD_FILE.asc
106
+
107
+        # use gpg to verify the artifact, use a backup key server in case the first one is down for some reason
108
+        gpg --keyserver hkps.pool.sks-keyservers.net --recv-key FC8A365E || gpg --keyserver pgpkeys.mit.edu --recv-key FC8A365E
109
+        gpg --verify $DEST/etcd/$ETCD_DOWNLOAD_FILE.asc $DEST/etcd/$ETCD_DOWNLOAD_FILE
110
+
111
+        tar xzvf $DEST/etcd/$ETCD_DOWNLOAD_FILE -C $DEST/etcd
112
+        sudo cp $DEST/etcd/etcd-$ETCD_VERSION-linux-$ETCD_ARCH/etcd $ETCD_BIN_DIR/etcd
113
+    fi
114
+    if [ ! -f "$ETCD_BIN_DIR/etcd" ]; then
115
+        sudo cp $DEST/etcd/etcd-$ETCD_VERSION-linux-$ETCD_ARCH/etcd $ETCD_BIN_DIR/etcd
116
+    fi
117
+}
118
+
119
+# Restore xtrace
120
+$_XTRACE_ETCD3
121
+
122
+# Tell emacs to use shell-script-mode
123
+## Local variables:
124
+## mode: shell-script
125
+## End:
... ...
@@ -574,6 +574,7 @@ source $TOP_DIR/lib/neutron
574 574
 source $TOP_DIR/lib/ldap
575 575
 source $TOP_DIR/lib/dstat
576 576
 source $TOP_DIR/lib/dlm
577
+source $TOP_DIR/lib/etcd3
577 578
 source $TOP_DIR/lib/os_brick
578 579
 
579 580
 # Extras Source
... ...
@@ -1043,6 +1044,11 @@ fi
1043 1043
 # A better kind of sysstat, with the top process per time slice
1044 1044
 start_dstat
1045 1045
 
1046
+# Etcd
1047
+# -----
1048
+
1049
+# etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines
1050
+start_etcd3
1046 1051
 
1047 1052
 # Keystone
1048 1053
 # --------
... ...
@@ -65,7 +65,7 @@ if ! isset ENABLED_SERVICES ; then
65 65
     # Dashboard
66 66
     ENABLED_SERVICES+=,horizon
67 67
     # Additional services
68
-    ENABLED_SERVICES+=,rabbit,tempest,mysql,dstat
68
+    ENABLED_SERVICES+=,rabbit,tempest,mysql,etcd3,dstat
69 69
 fi
70 70
 
71 71
 # Global toggle for enabling services under mod_wsgi. If this is set to
... ...
@@ -69,6 +69,7 @@ source $TOP_DIR/lib/swift
69 69
 source $TOP_DIR/lib/neutron
70 70
 source $TOP_DIR/lib/ldap
71 71
 source $TOP_DIR/lib/dstat
72
+source $TOP_DIR/lib/etcd3
72 73
 source $TOP_DIR/lib/dlm
73 74
 
74 75
 # Extras Source
... ...
@@ -162,6 +163,11 @@ if is_service_enabled neutron; then
162 162
     cleanup_neutron
163 163
 fi
164 164
 
165
+if is_service_enabled etcd3; then
166
+    stop_etcd3
167
+    cleanup_etcd3
168
+fi
169
+
165 170
 if is_service_enabled dstat; then
166 171
     stop_dstat
167 172
 fi