lib/heat
e263c82e
 #!/bin/bash
 #
45ea0811
 # lib/heat
6d04fd7b
 # Install and start **Heat** service
 
bfdad75e
 # To enable, add the following to localrc
6a5aa7c6
 #
 #   ENABLED_SERVICES+=,heat,h-api,h-api-cfn,h-api-cw,h-eng
bfdad75e
 
 # Dependencies:
6a5aa7c6
 #
bfdad75e
 # - functions
 
 # stack.sh
 # ---------
6a5aa7c6
 # - install_heatclient
 # - install_heat
 # - configure_heatclient
 # - configure_heat
 # - init_heat
 # - start_heat
 # - stop_heat
 # - cleanup_heat
bfdad75e
 
7903b795
 # Save trace setting
 XTRACE=$(set +o | grep xtrace)
 set +o xtrace
bfdad75e
 
 
 # Defaults
 # --------
cc6b4435
 
 # set up default directories
e08ab104
 GITDIR["python-heatclient"]=$DEST/python-heatclient
5cb19069
 
bfdad75e
 HEAT_DIR=$DEST/heat
315971d9
 HEAT_CFNTOOLS_DIR=$DEST/heat-cfntools
 HEAT_TEMPLATES_REPO_DIR=$DEST/heat-templates
c3249083
 HEAT_AUTH_CACHE_DIR=${HEAT_AUTH_CACHE_DIR:-/var/cache/heat}
389b3a02
 HEAT_STANDALONE=`trueorfalse False $HEAT_STANDALONE`
f645a850
 HEAT_CONF_DIR=/etc/heat
a213e2c3
 HEAT_CONF=$HEAT_CONF_DIR/heat.conf
f645a850
 HEAT_ENV_DIR=$HEAT_CONF_DIR/environment.d
fb71a272
 HEAT_TEMPLATES_DIR=$HEAT_CONF_DIR/templates
16aca8a3
 HEAT_STACK_DOMAIN=`trueorfalse True $HEAT_STACK_DOMAIN`
e389aed5
 HEAT_API_HOST=${HEAT_API_HOST:-$HOST_IP}
 HEAT_API_PORT=${HEAT_API_PORT:-8004}
cc6b4435
 
f83cf936
 # other default options
 HEAT_DEFERRED_AUTH=${HEAT_DEFERRED_AUTH:-trusts}
 
4237f590
 # Tell Tempest this project is present
 TEMPEST_SERVICES+=,heat
 
 
cc6b4435
 # Functions
 # ---------
bfdad75e
 
29870cce
 # Test if any Heat services are enabled
 # is_heat_enabled
 function is_heat_enabled {
     [[ ,${ENABLED_SERVICES} =~ ,"h-" ]] && return 0
     return 1
 }
 
bfdad75e
 # cleanup_heat() - Remove residual data files, anything left over from previous
 # runs that a clean run would need to clean up
aee18c74
 function cleanup_heat {
c3249083
     sudo rm -rf $HEAT_AUTH_CACHE_DIR
f645a850
     sudo rm -rf $HEAT_ENV_DIR
fb71a272
     sudo rm -rf $HEAT_TEMPLATES_DIR
bfdad75e
 }
 
 # configure_heat() - Set config files, create data dirs, etc
aee18c74
 function configure_heat {
bfdad75e
     setup_develop $HEAT_DIR
e389aed5
     if [[ "$HEAT_STANDALONE" = "True" ]]; then
         setup_develop $HEAT_DIR/contrib/heat_keystoneclient_v2
     fi
bfdad75e
 
     if [[ ! -d $HEAT_CONF_DIR ]]; then
         sudo mkdir -p $HEAT_CONF_DIR
     fi
91b8d13e
     sudo chown $STACK_USER $HEAT_CONF_DIR
a213e2c3
     # remove old config files
     rm -f $HEAT_CONF_DIR/heat-*.conf
bfdad75e
 
e61bc61a
     HEAT_API_CFN_HOST=${HEAT_API_CFN_HOST:-$HOST_IP}
e2790210
     HEAT_API_CFN_PORT=${HEAT_API_CFN_PORT:-8000}
bfdad75e
     HEAT_ENGINE_HOST=${HEAT_ENGINE_HOST:-$SERVICE_HOST}
     HEAT_ENGINE_PORT=${HEAT_ENGINE_PORT:-8001}
e61bc61a
     HEAT_API_CW_HOST=${HEAT_API_CW_HOST:-$HOST_IP}
e2790210
     HEAT_API_CW_PORT=${HEAT_API_CW_PORT:-8003}
d5cd79b1
     HEAT_API_PASTE_FILE=$HEAT_CONF_DIR/api-paste.ini
     HEAT_POLICY_FILE=$HEAT_CONF_DIR/policy.json
 
     cp $HEAT_DIR/etc/heat/api-paste.ini $HEAT_API_PASTE_FILE
     cp $HEAT_DIR/etc/heat/policy.json $HEAT_POLICY_FILE
a213e2c3
 
     # common options
     iniset_rpc_backend heat $HEAT_CONF DEFAULT
     iniset $HEAT_CONF DEFAULT heat_metadata_server_url http://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT
     iniset $HEAT_CONF DEFAULT heat_waitcondition_server_url http://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT/v1/waitcondition
     iniset $HEAT_CONF DEFAULT heat_watch_server_url http://$HEAT_API_CW_HOST:$HEAT_API_CW_PORT
e231438b
     iniset $HEAT_CONF database connection `database_connection_url heat`
f71b500b
     iniset $HEAT_CONF DEFAULT auth_encryption_key $(generate_hex_string 16)
a213e2c3
 
0abde393
     iniset $HEAT_CONF DEFAULT region_name_for_services "$REGION_NAME"
 
a213e2c3
     # logging
     iniset $HEAT_CONF DEFAULT debug $ENABLE_DEBUG_LOG_LEVEL
     iniset $HEAT_CONF DEFAULT use_syslog $SYSLOG
     if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ]; then
         # Add color to logging output
4897ff55
         setup_colorized_logging $HEAT_CONF DEFAULT tenant user
a213e2c3
     fi
e2790210
 
0595237e
     configure_auth_token_middleware $HEAT_CONF heat $HEAT_AUTH_CACHE_DIR
a213e2c3
 
fefd64b8
     if is_ssl_enabled_service "key"; then
18d4778c
         iniset $HEAT_CONF clients_keystone ca_file $SSL_BUNDLE_FILE
fefd64b8
     fi
 
a213e2c3
     # ec2authtoken
3561d7f9
     iniset $HEAT_CONF ec2authtoken auth_uri $KEYSTONE_SERVICE_URI/v2.0
a213e2c3
 
     # paste_deploy
e389aed5
     if [[ "$HEAT_STANDALONE" = "True" ]]; then
         iniset $HEAT_CONF paste_deploy flavor standalone
         iniset $HEAT_CONF DEFAULT keystone_backend heat_keystoneclient_v2.client.KeystoneClientV2
         iniset $HEAT_CONF clients_heat url "http://$HEAT_API_HOST:$HEAT_API_PORT/v1/%(tenant_id)s"
     fi
bfdad75e
 
6d04fd7b
     # OpenStack API
a213e2c3
     iniset $HEAT_CONF heat_api bind_port $HEAT_API_PORT
bfdad75e
 
a213e2c3
     # Cloudformation API
     iniset $HEAT_CONF heat_api_cfn bind_port $HEAT_API_CFN_PORT
556ffe40
 
6d04fd7b
     # Cloudwatch API
a213e2c3
     iniset $HEAT_CONF heat_api_cloudwatch bind_port $HEAT_API_CW_PORT
bfdad75e
 
18d4778c
     if is_ssl_enabled_service "key" || is_service_enabled tls-proxy; then
         iniset $HEAT_CONF clients_keystone ca_file $SSL_BUNDLE_FILE
     fi
 
     if is_ssl_enabled_service "nova" || is_service_enabled tls-proxy; then
         iniset $HEAT_CONF clients_nova ca_file $SSL_BUNDLE_FILE
     fi
 
     if is_ssl_enabled_service "cinder" || is_service_enabled tls-proxy; then
         iniset $HEAT_CONF clients_cinder ca_file $SSL_BUNDLE_FILE
     fi
 
f645a850
     # heat environment
     sudo mkdir -p $HEAT_ENV_DIR
     sudo chown $STACK_USER $HEAT_ENV_DIR
     # copy the default environment
     cp $HEAT_DIR/etc/heat/environment.d/* $HEAT_ENV_DIR/
 
fb71a272
     # heat template resources.
     sudo mkdir -p $HEAT_TEMPLATES_DIR
     sudo chown $STACK_USER $HEAT_TEMPLATES_DIR
     # copy the default templates
     cp $HEAT_DIR/etc/heat/templates/* $HEAT_TEMPLATES_DIR/
 
bfdad75e
 }
 
 # init_heat() - Initialize database
aee18c74
 function init_heat {
bfdad75e
 
     # (re)create heat database
428af5a2
     recreate_database heat utf8
bfdad75e
 
e3111329
     $HEAT_DIR/bin/heat-manage db_sync
c3249083
     create_heat_cache_dir
 }
 
 # create_heat_cache_dir() - Part of the init_heat() process
aee18c74
 function create_heat_cache_dir {
c3249083
     # Create cache dirs
e1186550
     sudo mkdir -p $HEAT_AUTH_CACHE_DIR
     sudo chown $STACK_USER $HEAT_AUTH_CACHE_DIR
bfdad75e
 }
 
32761a49
 # install_heatclient() - Collect source and prepare
aee18c74
 function install_heatclient {
e08ab104
     if use_library_from_git "python-heatclient"; then
         git_clone_by_name "python-heatclient"
         setup_dev_lib "python-heatclient"
         sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-heatclient"]}/tools/,/etc/bash_completion.d/}heat.bash_completion
5cb19069
     fi
32761a49
 }
 
bfdad75e
 # install_heat() - Collect source and prepare
aee18c74
 function install_heat {
bfdad75e
     git_clone $HEAT_REPO $HEAT_DIR $HEAT_BRANCH
 }
 
315971d9
 # install_heat_other() - Collect source and prepare
 function install_heat_other {
     git_clone $HEAT_CFNTOOLS_REPO $HEAT_CFNTOOLS_DIR $HEAT_CFNTOOLS_BRANCH
     git_clone $HEAT_TEMPLATES_REPO $HEAT_TEMPLATES_REPO_DIR $HEAT_TEMPLATES_BRANCH
 }
 
bfdad75e
 # start_heat() - Start running processes, including screen
aee18c74
 function start_heat {
2f27a0ed
     run_process h-eng "$HEAT_DIR/bin/heat-engine --config-file=$HEAT_CONF"
     run_process h-api "$HEAT_DIR/bin/heat-api --config-file=$HEAT_CONF"
     run_process h-api-cfn "$HEAT_DIR/bin/heat-api-cfn --config-file=$HEAT_CONF"
     run_process h-api-cw "$HEAT_DIR/bin/heat-api-cloudwatch --config-file=$HEAT_CONF"
bfdad75e
 }
 
699a29f7
 # stop_heat() - Stop running processes
aee18c74
 function stop_heat {
7033829d
     # Kill the screen windows
7d31bdcf
     local serv
7033829d
     for serv in h-eng h-api h-api-cfn h-api-cw; do
2f27a0ed
         stop_process $serv
699a29f7
     done
bfdad75e
 }
7903b795
 
33d1f86a
 # create_heat_accounts() - Set up common required heat accounts
aee18c74
 function create_heat_accounts {
57d478d8
     # migrated from files/keystone_data.sh
7d31bdcf
     local service_tenant=$(openstack project list | awk "/ $SERVICE_TENANT_NAME / { print \$2 }")
     local admin_role=$(openstack role list | awk "/ admin / { print \$2 }")
57d478d8
 
7d31bdcf
     local heat_user=$(get_or_create_user "heat" \
         "$SERVICE_PASSWORD" $service_tenant)
     get_or_add_user_role $admin_role $heat_user $service_tenant
0abde393
 
57d478d8
     if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
0abde393
 
7d31bdcf
         local heat_service=$(get_or_create_service "heat" \
0abde393
                 "orchestration" "Heat Orchestration Service")
7d31bdcf
         get_or_create_endpoint $heat_service \
0abde393
             "$REGION_NAME" \
             "$SERVICE_PROTOCOL://$HEAT_API_HOST:$HEAT_API_PORT/v1/\$(tenant_id)s" \
             "$SERVICE_PROTOCOL://$HEAT_API_HOST:$HEAT_API_PORT/v1/\$(tenant_id)s" \
             "$SERVICE_PROTOCOL://$HEAT_API_HOST:$HEAT_API_PORT/v1/\$(tenant_id)s"
 
7d31bdcf
         local heat_cfn_service=$(get_or_create_service "heat-cfn" \
0abde393
                 "cloudformation" "Heat CloudFormation Service")
7d31bdcf
         get_or_create_endpoint $heat_cfn_service \
0abde393
             "$REGION_NAME" \
             "$SERVICE_PROTOCOL://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT/v1" \
             "$SERVICE_PROTOCOL://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT/v1" \
             "$SERVICE_PROTOCOL://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT/v1"
57d478d8
     fi
 
     # heat_stack_user role is for users created by Heat
0abde393
     get_or_create_role "heat_stack_user"
57d478d8
 
f83cf936
     if [[ $HEAT_DEFERRED_AUTH == trusts ]]; then
0abde393
 
f83cf936
         # heat_stack_owner role is given to users who create Heat stacks,
         # it's the default role used by heat to delegate to the heat service
         # user (for performing deferred operations via trusts), see heat.conf
7d31bdcf
         local heat_owner_role=$(get_or_create_role "heat_stack_owner")
2ca3bf18
 
f83cf936
         # Give the role to the demo and admin users so they can create stacks
         # in either of the projects created by devstack
7d31bdcf
         get_or_add_user_role $heat_owner_role demo demo
         get_or_add_user_role $heat_owner_role admin demo
         get_or_add_user_role $heat_owner_role admin admin
f83cf936
         iniset $HEAT_CONF DEFAULT deferred_auth_method trusts
     fi
2ca3bf18
 
16aca8a3
     if [[ "$HEAT_STACK_DOMAIN" == "True" ]]; then
         # Note we have to pass token/endpoint here because the current endpoint and
         # version negotiation in OSC means just --os-identity-api-version=3 won't work
7d31bdcf
         local ks_endpoint_v3="$KEYSTONE_SERVICE_URI/v3"
0abde393
 
7d31bdcf
         D_ID=$(openstack --os-token $OS_TOKEN --os-url=$ks_endpoint_v3 \
0abde393
             --os-identity-api-version=3 domain list | grep ' heat ' | get_field 1)
 
         if [[ -z "$D_ID" ]]; then
7d31bdcf
             D_ID=$(openstack --os-token $OS_TOKEN --os-url=$ks_endpoint_v3 \
0abde393
                 --os-identity-api-version=3 domain create heat \
                 --description "Owns users and projects created by heat" \
                 | grep ' id ' | get_field 2)
2f92c8d7
             iniset $HEAT_CONF DEFAULT stack_user_domain_id ${D_ID}
0abde393
 
7d31bdcf
             openstack --os-token $OS_TOKEN --os-url=$ks_endpoint_v3 \
0abde393
                 --os-identity-api-version=3 user create --password $SERVICE_PASSWORD \
                 --domain $D_ID heat_domain_admin \
                 --description "Manages users and projects created by heat"
7d31bdcf
             openstack --os-token $OS_TOKEN --os-url=$ks_endpoint_v3 \
0abde393
                 --os-identity-api-version=3 role add \
                 --user heat_domain_admin --domain ${D_ID} admin
             iniset $HEAT_CONF DEFAULT stack_domain_admin heat_domain_admin
             iniset $HEAT_CONF DEFAULT stack_domain_admin_password $SERVICE_PASSWORD
         fi
16aca8a3
     fi
33d1f86a
 }
 
2a6009cd
 # build_heat_functional_test_image() - Build and upload functional test image
 function build_heat_functional_test_image {
     build_dib_pip_repo "$OCC_DIR $OAC_DIR $ORC_DIR $HEAT_CFNTOOLS_DIR"
     local image_name=heat-functional-tests-image
 
     # The elements to invoke disk-image-create with
     local image_elements="vm fedora selinux-permissive pypi \
         os-collect-config os-refresh-config os-apply-config heat-cfntools \
         heat-config heat-config-cfn-init heat-config-puppet heat-config-script"
 
     # Elements path for tripleo-image-elements and heat-templates software-config
     local elements_path=$TIE_DIR/elements:$HEAT_TEMPLATES_REPO_DIR/hot/software-config/elements
 
     disk_image_create_upload "$image_name" "$image_elements" "$elements_path"
     iniset $TEMPEST_CONFIG orchestration image_ref $image_name
 }
 
7903b795
 # Restore xtrace
 $XTRACE
584d90ec
 
6a5aa7c6
 # Tell emacs to use shell-script-mode
 ## Local variables:
 ## mode: shell-script
 ## End: