Dean Troyer | 67787e6 | 2012-05-02 11:48:15 -0500 | [diff] [blame] | 1 | # 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. |
| 20 | set -o xtrace |
| 21 | |
| 22 | |
| 23 | # Defaults |
| 24 | # -------- |
| 25 | |
| 26 | # set up default directories |
| 27 | CINDER_DIR=$DEST/cinder |
| 28 | CINDERCLIENT_DIR=$DEST/python-cinderclient |
| 29 | CINDER_CONF_DIR=/etc/cinder |
| 30 | CINDER_CONF=$CINDER_CONF_DIR/cinder.conf |
| 31 | |
| 32 | # Name of the lvm volume group to use/create for iscsi volumes |
| 33 | VOLUME_GROUP=${VOLUME_GROUP:-stack-volumes} |
| 34 | VOLUME_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 |
| 38 | function cleanup_cinder() { |
| 39 | # This function intentionally left blank |
| 40 | : |
| 41 | } |
| 42 | |
| 43 | # configure_cinder() - Set config files, create data dirs, etc |
| 44 | function 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 Griffith | 4e823ff | 2012-07-20 13:18:17 -0600 | [diff] [blame] | 55 | # 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 Troyer | 67787e6 | 2012-05-02 11:48:15 -0500 | [diff] [blame] | 91 | 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 |
Dean Troyer | 67787e6 | 2012-05-02 11:48:15 -0500 | [diff] [blame] | 107 | iniset $CINDER_CONF DEFAULT api_paste_config $CINDER_API_PASTE_INI |
John Griffith | 4e823ff | 2012-07-20 13:18:17 -0600 | [diff] [blame] | 108 | iniset $CINDER_CONF DEFAULT root_helper "sudo ${CINDER_ROOTWRAP}" |
| 109 | |
Gary Kotton | f71bf19 | 2012-08-06 11:15:36 -0400 | [diff] [blame^] | 110 | if is_service_enabled qpid ; then |
| 111 | iniset $CINDER_CONF DEFAULT rpc_backend cinder.openstack.common.rpc.impl_qpid |
| 112 | elif [ -n "$RABBIT_HOST" ] && [ -n "$RABBIT_PASSWORD" ]; then |
| 113 | iniset $CINDER_CONF DEFAULT rabbit_host $RABBIT_HOST |
| 114 | iniset $CINDER_CONF DEFAULT rabbit_password $RABBIT_PASSWORD |
| 115 | fi |
| 116 | |
Dean Troyer | 67787e6 | 2012-05-02 11:48:15 -0500 | [diff] [blame] | 117 | } |
| 118 | |
| 119 | # init_cinder() - Initialize database and volume group |
| 120 | function init_cinder() { |
| 121 | # Force nova volumes off |
| 122 | NOVA_ENABLED_APIS=$(echo $NOVA_ENABLED_APIS | sed "s/osapi_volume,//") |
| 123 | |
| 124 | if is_service_enabled mysql; then |
| 125 | # (re)create cinder database |
| 126 | mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS cinder;' |
| 127 | mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE cinder;' |
| 128 | |
| 129 | # (re)create cinder database |
| 130 | $CINDER_DIR/bin/cinder-manage db sync |
| 131 | fi |
| 132 | |
| 133 | if is_service_enabled c-vol; then |
| 134 | # Configure a default volume group called '`stack-volumes`' for the volume |
| 135 | # service if it does not yet exist. If you don't wish to use a file backed |
| 136 | # volume group, create your own volume group called ``stack-volumes`` before |
| 137 | # invoking ``stack.sh``. |
| 138 | # |
Eoghan Glynn | 9cb1776 | 2012-07-15 10:22:45 +0100 | [diff] [blame] | 139 | # By default, the backing file is 5G in size, and is stored in ``/opt/stack/data``. |
Dean Troyer | 67787e6 | 2012-05-02 11:48:15 -0500 | [diff] [blame] | 140 | |
| 141 | if ! sudo vgs $VOLUME_GROUP; then |
| 142 | VOLUME_BACKING_FILE=${VOLUME_BACKING_FILE:-$DATA_DIR/${VOLUME_GROUP}-backing-file} |
Dean Troyer | 67787e6 | 2012-05-02 11:48:15 -0500 | [diff] [blame] | 143 | # Only create if the file doesn't already exists |
| 144 | [[ -f $VOLUME_BACKING_FILE ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $VOLUME_BACKING_FILE |
| 145 | DEV=`sudo losetup -f --show $VOLUME_BACKING_FILE` |
| 146 | # Only create if the loopback device doesn't contain $VOLUME_GROUP |
| 147 | if ! sudo vgs $VOLUME_GROUP; then sudo vgcreate $VOLUME_GROUP $DEV; fi |
| 148 | fi |
| 149 | |
Chuck Short | 3f603d9 | 2012-07-28 13:28:33 -0500 | [diff] [blame] | 150 | mkdir -p $CINDER_DIR/volumes |
| 151 | |
Dean Troyer | 67787e6 | 2012-05-02 11:48:15 -0500 | [diff] [blame] | 152 | if sudo vgs $VOLUME_GROUP; then |
Vincent Untz | 0230aa8 | 2012-06-14 08:51:01 +0200 | [diff] [blame] | 153 | if [[ "$os_PACKAGE" = "rpm" ]]; then |
| 154 | # RPM doesn't start the service |
| 155 | start_service tgtd |
| 156 | fi |
| 157 | |
Dean Troyer | 67787e6 | 2012-05-02 11:48:15 -0500 | [diff] [blame] | 158 | # Remove iscsi targets |
| 159 | sudo tgtadm --op show --mode target | grep $VOLUME_NAME_PREFIX | grep Target | cut -f3 -d ' ' | sudo xargs -n1 tgt-admin --delete || true |
| 160 | # Clean out existing volumes |
| 161 | for lv in `sudo lvs --noheadings -o lv_name $VOLUME_GROUP`; do |
| 162 | # VOLUME_NAME_PREFIX prefixes the LVs we want |
| 163 | if [[ "${lv#$VOLUME_NAME_PREFIX}" != "$lv" ]]; then |
| 164 | sudo lvremove -f $VOLUME_GROUP/$lv |
| 165 | fi |
| 166 | done |
| 167 | fi |
| 168 | fi |
| 169 | } |
| 170 | |
| 171 | # install_cinder() - Collect source and prepare |
| 172 | function install_cinder() { |
| 173 | git_clone $CINDER_REPO $CINDER_DIR $CINDER_BRANCH |
| 174 | git_clone $CINDERCLIENT_REPO $CINDERCLIENT_DIR $CINDERCLIENT_BRANCH |
| 175 | } |
| 176 | |
| 177 | # start_cinder() - Start running processes, including screen |
| 178 | function start_cinder() { |
| 179 | if is_service_enabled c-vol; then |
| 180 | if [[ "$os_PACKAGE" = "deb" ]]; then |
Chuck Short | 3f603d9 | 2012-07-28 13:28:33 -0500 | [diff] [blame] | 181 | if [[ ! -f /etc/tgt/conf.d/cinder.conf ]]; then |
| 182 | echo "include $CINDER_DIR/volumes/*" | sudo tee /etc/tgt/conf.d/cinder.conf |
| 183 | fi |
Dean Troyer | 67787e6 | 2012-05-02 11:48:15 -0500 | [diff] [blame] | 184 | # tgt in oneiric doesn't restart properly if tgtd isn't running |
| 185 | # do it in two steps |
| 186 | sudo stop tgt || true |
| 187 | sudo start tgt |
| 188 | else |
| 189 | # bypass redirection to systemctl during restart |
| 190 | sudo /sbin/service --skip-redirect tgtd restart |
| 191 | fi |
| 192 | fi |
| 193 | |
| 194 | screen_it c-api "cd $CINDER_DIR && $CINDER_DIR/bin/cinder-api --config-file $CINDER_CONF" |
| 195 | screen_it c-vol "cd $CINDER_DIR && $CINDER_DIR/bin/cinder-volume --config-file $CINDER_CONF" |
| 196 | screen_it c-sch "cd $CINDER_DIR && $CINDER_DIR/bin/cinder-scheduler --config-file $CINDER_CONF" |
| 197 | } |
| 198 | |
| 199 | # stop_cinder() - Stop running processes (non-screen) |
| 200 | function stop_cinder() { |
| 201 | # FIXME(dtroyer): stop only the cinder screen window? |
| 202 | |
| 203 | if is_service_enabled c-vol; then |
| 204 | stop_service tgt |
| 205 | fi |
| 206 | } |