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 | |
| 55 | CINDER_API_PASTE_INI=$CINDER_CONF_DIR/api-paste.ini |
| 56 | cp $CINDER_DIR/etc/cinder/api-paste.ini $CINDER_API_PASTE_INI |
| 57 | iniset $CINDER_API_PASTE_INI filter:authtoken auth_host $KEYSTONE_AUTH_HOST |
| 58 | iniset $CINDER_API_PASTE_INI filter:authtoken auth_port $KEYSTONE_AUTH_PORT |
| 59 | iniset $CINDER_API_PASTE_INI filter:authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL |
| 60 | iniset $CINDER_API_PASTE_INI filter:authtoken admin_tenant_name $SERVICE_TENANT_NAME |
| 61 | iniset $CINDER_API_PASTE_INI filter:authtoken admin_user cinder |
| 62 | iniset $CINDER_API_PASTE_INI filter:authtoken admin_password $SERVICE_PASSWORD |
| 63 | |
| 64 | cp $CINDER_DIR/etc/cinder/cinder.conf.sample $CINDER_CONF |
| 65 | iniset $CINDER_CONF DEFAULT auth_strategy keystone |
| 66 | iniset $CINDER_CONF DEFAULT verbose True |
| 67 | iniset $CINDER_CONF DEFAULT volume_group $VOLUME_GROUP |
| 68 | iniset $CINDER_CONF DEFAULT volume_name_template ${VOLUME_NAME_PREFIX}%s |
| 69 | iniset $CINDER_CONF DEFAULT iscsi_helper tgtadm |
| 70 | iniset $CINDER_CONF DEFAULT sql_connection $BASE_SQL_CONN/cinder?charset=utf8 |
| 71 | iniset $CINDER_CONF DEFAULT rabbit_host $RABBIT_HOST |
| 72 | iniset $CINDER_CONF DEFAULT rabbit_password $RABBIT_PASSWORD |
| 73 | iniset $CINDER_CONF DEFAULT api_paste_config $CINDER_API_PASTE_INI |
| 74 | } |
| 75 | |
| 76 | # init_cinder() - Initialize database and volume group |
| 77 | function init_cinder() { |
| 78 | # Force nova volumes off |
| 79 | NOVA_ENABLED_APIS=$(echo $NOVA_ENABLED_APIS | sed "s/osapi_volume,//") |
| 80 | |
| 81 | if is_service_enabled mysql; then |
| 82 | # (re)create cinder database |
| 83 | mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS cinder;' |
| 84 | mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE cinder;' |
| 85 | |
| 86 | # (re)create cinder database |
| 87 | $CINDER_DIR/bin/cinder-manage db sync |
| 88 | fi |
| 89 | |
| 90 | if is_service_enabled c-vol; then |
| 91 | # Configure a default volume group called '`stack-volumes`' for the volume |
| 92 | # service if it does not yet exist. If you don't wish to use a file backed |
| 93 | # volume group, create your own volume group called ``stack-volumes`` before |
| 94 | # invoking ``stack.sh``. |
| 95 | # |
| 96 | # By default, the backing file is 2G in size, and is stored in ``/opt/stack/data``. |
| 97 | |
| 98 | if ! sudo vgs $VOLUME_GROUP; then |
| 99 | VOLUME_BACKING_FILE=${VOLUME_BACKING_FILE:-$DATA_DIR/${VOLUME_GROUP}-backing-file} |
| 100 | VOLUME_BACKING_FILE_SIZE=${VOLUME_BACKING_FILE_SIZE:-2052M} |
| 101 | # Only create if the file doesn't already exists |
| 102 | [[ -f $VOLUME_BACKING_FILE ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $VOLUME_BACKING_FILE |
| 103 | DEV=`sudo losetup -f --show $VOLUME_BACKING_FILE` |
| 104 | # Only create if the loopback device doesn't contain $VOLUME_GROUP |
| 105 | if ! sudo vgs $VOLUME_GROUP; then sudo vgcreate $VOLUME_GROUP $DEV; fi |
| 106 | fi |
| 107 | |
| 108 | if sudo vgs $VOLUME_GROUP; then |
| 109 | # Remove iscsi targets |
| 110 | sudo tgtadm --op show --mode target | grep $VOLUME_NAME_PREFIX | grep Target | cut -f3 -d ' ' | sudo xargs -n1 tgt-admin --delete || true |
| 111 | # Clean out existing volumes |
| 112 | for lv in `sudo lvs --noheadings -o lv_name $VOLUME_GROUP`; do |
| 113 | # VOLUME_NAME_PREFIX prefixes the LVs we want |
| 114 | if [[ "${lv#$VOLUME_NAME_PREFIX}" != "$lv" ]]; then |
| 115 | sudo lvremove -f $VOLUME_GROUP/$lv |
| 116 | fi |
| 117 | done |
| 118 | fi |
| 119 | fi |
| 120 | } |
| 121 | |
| 122 | # install_cinder() - Collect source and prepare |
| 123 | function install_cinder() { |
| 124 | git_clone $CINDER_REPO $CINDER_DIR $CINDER_BRANCH |
| 125 | git_clone $CINDERCLIENT_REPO $CINDERCLIENT_DIR $CINDERCLIENT_BRANCH |
| 126 | } |
| 127 | |
| 128 | # start_cinder() - Start running processes, including screen |
| 129 | function start_cinder() { |
| 130 | if is_service_enabled c-vol; then |
| 131 | if [[ "$os_PACKAGE" = "deb" ]]; then |
| 132 | # tgt in oneiric doesn't restart properly if tgtd isn't running |
| 133 | # do it in two steps |
| 134 | sudo stop tgt || true |
| 135 | sudo start tgt |
| 136 | else |
| 137 | # bypass redirection to systemctl during restart |
| 138 | sudo /sbin/service --skip-redirect tgtd restart |
| 139 | fi |
| 140 | fi |
| 141 | |
| 142 | screen_it c-api "cd $CINDER_DIR && $CINDER_DIR/bin/cinder-api --config-file $CINDER_CONF" |
| 143 | screen_it c-vol "cd $CINDER_DIR && $CINDER_DIR/bin/cinder-volume --config-file $CINDER_CONF" |
| 144 | screen_it c-sch "cd $CINDER_DIR && $CINDER_DIR/bin/cinder-scheduler --config-file $CINDER_CONF" |
| 145 | } |
| 146 | |
| 147 | # stop_cinder() - Stop running processes (non-screen) |
| 148 | function stop_cinder() { |
| 149 | # FIXME(dtroyer): stop only the cinder screen window? |
| 150 | |
| 151 | if is_service_enabled c-vol; then |
| 152 | stop_service tgt |
| 153 | fi |
| 154 | } |