blob: 0e42600b1aacb1dce0ab5c1cf648d73c153a2952 [file] [log] [blame]
Dean Troyer67787e62012-05-02 11:48:15 -05001# lib/cinder
2# Install and start Cinder volume service
3
4# Dependencies:
5# - functions
6# - KEYSTONE_AUTH_* must be defined
7# SERVICE_{TENANT_NAME|PASSWORD} must be defined
8
9# stack.sh
10# ---------
11# install_XXX
12# configure_XXX
13# init_XXX
14# start_XXX
15# stop_XXX
16# cleanup_XXX
17
18# Print the commands being run so that we can see the command that triggers
19# an error. It is also useful for following along as the install occurs.
20set -o xtrace
21
22
23# Defaults
24# --------
25
26# set up default directories
27CINDER_DIR=$DEST/cinder
28CINDERCLIENT_DIR=$DEST/python-cinderclient
29CINDER_CONF_DIR=/etc/cinder
30CINDER_CONF=$CINDER_CONF_DIR/cinder.conf
31
32# Name of the lvm volume group to use/create for iscsi volumes
33VOLUME_GROUP=${VOLUME_GROUP:-stack-volumes}
34VOLUME_NAME_PREFIX=${VOLUME_NAME_PREFIX:-volume-}
35
36# cleanup_cinder() - Remove residual data files, anything left over from previous
37# runs that a clean run would need to clean up
38function cleanup_cinder() {
39 # This function intentionally left blank
40 :
41}
42
43# configure_cinder() - Set config files, create data dirs, etc
44function configure_cinder() {
45 setup_develop $CINDER_DIR
46 setup_develop $CINDERCLIENT_DIR
47
48 if [[ ! -d $CINDER_CONF_DIR ]]; then
49 sudo mkdir -p $CINDER_CONF_DIR
50 fi
51 sudo chown `whoami` $CINDER_CONF_DIR
52
53 cp -p $CINDER_DIR/etc/cinder/policy.json $CINDER_CONF_DIR
54
John Griffith4e823ff2012-07-20 13:18:17 -060055 # Set the paths of certain binaries
56 if [[ "$os_PACKAGE" = "deb" ]]; then
57 CINDER_ROOTWRAP=/usr/local/bin/cinder-rootwrap
58 else
59 CINDER_ROOTWRAP=/usr/bin/cinder-rootwrap
60 fi
61
62 # If Cinder ships the new rootwrap filters files, deploy them
63 # (owned by root) and add a parameter to $CINDER_ROOTWRAP
64 ROOTWRAP_CINDER_SUDOER_CMD="$CINDER_ROOTWRAP"
65 if [[ -d $CINDER_DIR/etc/cinder/rootwrap.d ]]; then
66 # Wipe any existing rootwrap.d files first
67 if [[ -d $CINDER_CONF_DIR/rootwrap.d ]]; then
68 sudo rm -rf $CINDER_CONF_DIR/rootwrap.d
69 fi
70 # Deploy filters to /etc/cinder/rootwrap.d
71 sudo mkdir -m 755 $CINDER_CONF_DIR/rootwrap.d
72 sudo cp $CINDER_DIR/etc/cinder/rootwrap.d/*.filters $CINDER_CONF_DIR/rootwrap.d
73 sudo chown -R root:root $CINDER_CONF_DIR/rootwrap.d
74 sudo chmod 644 $CINDER_CONF_DIR/rootwrap.d/*
75 # Set up rootwrap.conf, pointing to /etc/cinder/rootwrap.d
76 sudo cp $CINDER_DIR/etc/cinder/rootwrap.conf $CINDER_CONF_DIR/
77 sudo sed -e "s:^filters_path=.*$:filters_path=$CINDER_CONF_DIR/rootwrap.d:" -i $CINDER_CONF_DIR/rootwrap.conf
78 sudo chown root:root $CINDER_CONF_DIR/rootwrap.conf
79 sudo chmod 0644 $CINDER_CONF_DIR/rootwrap.conf
80 # Specify rootwrap.conf as first parameter to cinder-rootwrap
81 CINDER_ROOTWRAP="$CINDER_ROOTWRAP $CINDER_CONF_DIR/rootwrap.conf"
82 ROOTWRAP_CINDER_SUDOER_CMD="$CINDER_ROOTWRAP *"
83 fi
84
85 TEMPFILE=`mktemp`
86 echo "$USER ALL=(root) NOPASSWD: $ROOTWRAP_CINDER_SUDOER_CMD" >$TEMPFILE
87 chmod 0440 $TEMPFILE
88 sudo chown root:root $TEMPFILE
89 sudo mv $TEMPFILE /etc/sudoers.d/cinder-rootwrap
90
Dean Troyer67787e62012-05-02 11:48:15 -050091 CINDER_API_PASTE_INI=$CINDER_CONF_DIR/api-paste.ini
92 cp $CINDER_DIR/etc/cinder/api-paste.ini $CINDER_API_PASTE_INI
93 iniset $CINDER_API_PASTE_INI filter:authtoken auth_host $KEYSTONE_AUTH_HOST
94 iniset $CINDER_API_PASTE_INI filter:authtoken auth_port $KEYSTONE_AUTH_PORT
95 iniset $CINDER_API_PASTE_INI filter:authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
96 iniset $CINDER_API_PASTE_INI filter:authtoken admin_tenant_name $SERVICE_TENANT_NAME
97 iniset $CINDER_API_PASTE_INI filter:authtoken admin_user cinder
98 iniset $CINDER_API_PASTE_INI filter:authtoken admin_password $SERVICE_PASSWORD
99
100 cp $CINDER_DIR/etc/cinder/cinder.conf.sample $CINDER_CONF
101 iniset $CINDER_CONF DEFAULT auth_strategy keystone
102 iniset $CINDER_CONF DEFAULT verbose True
103 iniset $CINDER_CONF DEFAULT volume_group $VOLUME_GROUP
104 iniset $CINDER_CONF DEFAULT volume_name_template ${VOLUME_NAME_PREFIX}%s
105 iniset $CINDER_CONF DEFAULT iscsi_helper tgtadm
106 iniset $CINDER_CONF DEFAULT sql_connection $BASE_SQL_CONN/cinder?charset=utf8
107 iniset $CINDER_CONF DEFAULT rabbit_host $RABBIT_HOST
108 iniset $CINDER_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
109 iniset $CINDER_CONF DEFAULT api_paste_config $CINDER_API_PASTE_INI
John Griffith4e823ff2012-07-20 13:18:17 -0600110 iniset $CINDER_CONF DEFAULT root_helper "sudo ${CINDER_ROOTWRAP}"
111
Dean Troyer67787e62012-05-02 11:48:15 -0500112}
113
114# init_cinder() - Initialize database and volume group
115function init_cinder() {
116 # Force nova volumes off
117 NOVA_ENABLED_APIS=$(echo $NOVA_ENABLED_APIS | sed "s/osapi_volume,//")
118
119 if is_service_enabled mysql; then
120 # (re)create cinder database
121 mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS cinder;'
122 mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE cinder;'
123
124 # (re)create cinder database
125 $CINDER_DIR/bin/cinder-manage db sync
126 fi
127
128 if is_service_enabled c-vol; then
129 # Configure a default volume group called '`stack-volumes`' for the volume
130 # service if it does not yet exist. If you don't wish to use a file backed
131 # volume group, create your own volume group called ``stack-volumes`` before
132 # invoking ``stack.sh``.
133 #
Eoghan Glynn9cb17762012-07-15 10:22:45 +0100134 # By default, the backing file is 5G in size, and is stored in ``/opt/stack/data``.
Dean Troyer67787e62012-05-02 11:48:15 -0500135
136 if ! sudo vgs $VOLUME_GROUP; then
137 VOLUME_BACKING_FILE=${VOLUME_BACKING_FILE:-$DATA_DIR/${VOLUME_GROUP}-backing-file}
Dean Troyer67787e62012-05-02 11:48:15 -0500138 # Only create if the file doesn't already exists
139 [[ -f $VOLUME_BACKING_FILE ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $VOLUME_BACKING_FILE
140 DEV=`sudo losetup -f --show $VOLUME_BACKING_FILE`
141 # Only create if the loopback device doesn't contain $VOLUME_GROUP
142 if ! sudo vgs $VOLUME_GROUP; then sudo vgcreate $VOLUME_GROUP $DEV; fi
143 fi
144
145 if sudo vgs $VOLUME_GROUP; then
Vincent Untz0230aa82012-06-14 08:51:01 +0200146 if [[ "$os_PACKAGE" = "rpm" ]]; then
147 # RPM doesn't start the service
148 start_service tgtd
149 fi
150
Dean Troyer67787e62012-05-02 11:48:15 -0500151 # Remove iscsi targets
152 sudo tgtadm --op show --mode target | grep $VOLUME_NAME_PREFIX | grep Target | cut -f3 -d ' ' | sudo xargs -n1 tgt-admin --delete || true
153 # Clean out existing volumes
154 for lv in `sudo lvs --noheadings -o lv_name $VOLUME_GROUP`; do
155 # VOLUME_NAME_PREFIX prefixes the LVs we want
156 if [[ "${lv#$VOLUME_NAME_PREFIX}" != "$lv" ]]; then
157 sudo lvremove -f $VOLUME_GROUP/$lv
158 fi
159 done
160 fi
161 fi
162}
163
164# install_cinder() - Collect source and prepare
165function install_cinder() {
166 git_clone $CINDER_REPO $CINDER_DIR $CINDER_BRANCH
167 git_clone $CINDERCLIENT_REPO $CINDERCLIENT_DIR $CINDERCLIENT_BRANCH
168}
169
170# start_cinder() - Start running processes, including screen
171function start_cinder() {
172 if is_service_enabled c-vol; then
173 if [[ "$os_PACKAGE" = "deb" ]]; then
174 # tgt in oneiric doesn't restart properly if tgtd isn't running
175 # do it in two steps
176 sudo stop tgt || true
177 sudo start tgt
178 else
179 # bypass redirection to systemctl during restart
180 sudo /sbin/service --skip-redirect tgtd restart
181 fi
182 fi
183
184 screen_it c-api "cd $CINDER_DIR && $CINDER_DIR/bin/cinder-api --config-file $CINDER_CONF"
185 screen_it c-vol "cd $CINDER_DIR && $CINDER_DIR/bin/cinder-volume --config-file $CINDER_CONF"
186 screen_it c-sch "cd $CINDER_DIR && $CINDER_DIR/bin/cinder-scheduler --config-file $CINDER_CONF"
187}
188
189# stop_cinder() - Stop running processes (non-screen)
190function stop_cinder() {
191 # FIXME(dtroyer): stop only the cinder screen window?
192
193 if is_service_enabled c-vol; then
194 stop_service tgt
195 fi
196}