Shared filesystem management project for OpenStack.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

533 lines
20 KiB

#!/bin/bash
set -o errexit
source $GRENADE_DIR/grenaderc
source $GRENADE_DIR/functions
source $TOP_DIR/openrc admin demo
set -o xtrace
################################# Settings ####################################
# Access rules data specific to first enabled backend.
MANILA_GRENADE_ACCESS_TYPE=${MANILA_GRENADE_ACCESS_TYPE:-"ip"}
MANILA_GRENADE_ACCESS_TO=${MANILA_GRENADE_ACCESS_TO:-"0.0.0.0/0"}
# Network information that will be used in case DHSS=True driver is used
# with non-single-network-plugin.
MANILA_GRENADE_NETWORK_NAME=${MANILA_GRENADE_NETWORK_NAME:-"private"}
MANILA_GRENADE_SUBNET_NAME=${MANILA_GRENADE_SUBNET_NAME:-"private-subnet"}
# Timeout that will be used for share creation wait operation.
MANILA_GRENADE_WAIT_STEP=${MANILA_GRENADE_WAIT_STEP:-"4"}
MANILA_GRENADE_WAIT_TIMEOUT=${MANILA_GRENADE_WAIT_TIMEOUT:-"300"}
MANILA_GRENADE_SHARE_NETWORK_NAME=${MANILA_GRENADE_SHARE_NETWORK_NAME:-"manila_grenade_share_network"}
MANILA_GRENADE_SHARE_TYPE_NAME=${MANILA_GRENADE_SHARE_TYPE_NAME:-"manila_grenade_share_type"}
MANILA_GRENADE_SHARE_NAME=${MANILA_GRENADE_SHARE_NAME:-"manila_grenade_share"}
MANILA_GRENADE_SHARE_SNAPSHOT_NAME=${MANILA_GRENADE_SHARE_SNAPSHOT_NAME:-"manila_grenade_share_snapshot"}
# Extra specs that will be set for newly created share type
MANILA_GRENADE_SHARE_TYPE_SNAPSHOT_SUPPORT_EXTRA_SPEC=${MANILA_GRENADE_SHARE_TYPE_SNAPSHOT_SUPPORT_EXTRA_SPEC:-"True"}
MANILA_GRENADE_SHARE_TYPE_CREATE_SHARE_FROM_SNAPSHOT_SUPPORT_EXTRA_SPEC=${MANILA_GRENADE_SHARE_TYPE_CREATE_SHARE_FROM_SNAPSHOT_SUPPORT_EXTRA_SPEC:-"True"}
MANILA_GRENADE_SHARE_TYPE_REVERT_TO_SNAPSHOT_SUPPORT_EXTRA_SPEC=${MANILA_GRENADE_SHARE_TYPE_REVERT_TO_SNAPSHOT_SUPPORT_EXTRA_SPEC:-"True"}
MANILA_GRENADE_SHARE_TYPE_MOUNT_SNAPSHOT_SUPPORT_EXTRA_SPEC=${MANILA_GRENADE_SHARE_TYPE_MOUNT_SNAPSHOT_SUPPORT_EXTRA_SPEC:-"True"}
MANILA_CONF_DIR=${MANILA_CONF_DIR:-/etc/manila}
MANILA_CONF=$MANILA_CONF_DIR/manila.conf
################################ Scenarios ####################################
function scenario_1_do_share_with_rules_and_metadata {
# NOTE(vponomaryov): nova-network with DHSS=True drivers is not supported
# by this scenario.
enabled_share_backends=$(iniget $MANILA_CONF DEFAULT enabled_share_backends)
backend=$( echo $enabled_share_backends | cut -d',' -f 1 )
enabled_share_protocols=$(iniget $MANILA_CONF DEFAULT enabled_share_protocols)
share_protocol=$( echo $enabled_share_protocols | cut -d',' -f 1 )
driver_handles_share_servers=$(iniget $MANILA_CONF $backend driver_handles_share_servers)
create_share_cmd="manila create $share_protocol 1 "
create_share_cmd+="--share-type $MANILA_GRENADE_SHARE_TYPE_NAME "
create_share_cmd+="--name $MANILA_GRENADE_SHARE_NAME"
resource_save manila share_protocol $share_protocol
if [[ $(trueorfalse False driver_handles_share_servers) == True ]]; then
share_driver=$(iniget $MANILA_CONF $backend share_driver)
generic_driver='manila.share.drivers.generic.GenericShareDriver'
windows_driver='manila.share.drivers.windows.windows_smb_driver.WindowsSMBDriver'
network_plugin=$(iniget $MANILA_CONF $backend network_plugin)
share_network_cmd="manila share-network-create "
share_network_cmd+="--name $MANILA_GRENADE_SHARE_NETWORK_NAME"
if is_service_enabled neutron; then
if [[ $share_driver == $generic_driver || \
$share_driver == $windows_driver || \
! $network_plugin =~ 'Single' || \
! $network_plugin =~ 'Standalone' ]]; then
net_id=$(openstack network show $MANILA_GRENADE_NETWORK_NAME -c id -f value)
subnet_id=$(openstack subnet show $MANILA_GRENADE_SUBNET_NAME -c id -f value)
share_network_cmd+=" --neutron-net $net_id --neutron-subnet $subnet_id"
fi
else
echo 'Neutron service is disabled, creating empty share-network'
fi
create_share_cmd+=" --share-network $MANILA_GRENADE_SHARE_NETWORK_NAME"
resource_save manila share_network $MANILA_GRENADE_SHARE_NETWORK_NAME
else
resource_save manila share_network 'None'
fi
# Create share-network
eval $share_network_cmd
# Create share-type
manila type-create \
$MANILA_GRENADE_SHARE_TYPE_NAME \
$driver_handles_share_servers \
--snapshot_support $MANILA_GRENADE_SHARE_TYPE_SNAPSHOT_SUPPORT_EXTRA_SPEC \
--create_share_from_snapshot_support $MANILA_GRENADE_SHARE_TYPE_CREATE_SHARE_FROM_SNAPSHOT_SUPPORT_EXTRA_SPEC \
--revert_to_snapshot_support $MANILA_GRENADE_SHARE_TYPE_REVERT_TO_SNAPSHOT_SUPPORT_EXTRA_SPEC \
--mount_snapshot_support $MANILA_GRENADE_SHARE_TYPE_MOUNT_SNAPSHOT_SUPPORT_EXTRA_SPEC
# Create share
eval $create_share_cmd
# Wait for share creation results
wait_timeout=$MANILA_GRENADE_WAIT_TIMEOUT
available='false'
while (( wait_timeout > 0 )) ; do
current_status=$( manila show $MANILA_GRENADE_SHARE_NAME | \
grep " status " | get_field 2 )
if [[ $current_status == 'available' ]]; then
available='true'
break
elif [[ $current_status == 'creating' ]]; then
((wait_timeout-=$MANILA_GRENADE_WAIT_STEP))
sleep $MANILA_GRENADE_WAIT_STEP
elif [[ $current_status == 'error' ]]; then
die $LINENO "Share is in 'error' state."
else
die $LINENO "Should never reach this line."
fi
done
if [[ $available == 'true' ]]; then
echo "Share has been created successfully."
else
die $LINENO "Share timed out to reach 'available' status."
fi
# grab the export location
export_path=$(manila share-export-location-list \
$MANILA_GRENADE_SHARE_NAME | grep ":/" | \
cut -d "|" -f 3 | head -1)
resource_save manila export_path $export_path
# Create some metadata
manila metadata $MANILA_GRENADE_SHARE_NAME set gre=nade
# Add access rules
manila access-allow $MANILA_GRENADE_SHARE_NAME \
$MANILA_GRENADE_ACCESS_TYPE $MANILA_GRENADE_ACCESS_TO
# Wait for access rule creation results
wait_timeout=$MANILA_GRENADE_WAIT_TIMEOUT
active='false'
while (( wait_timeout > 0 )) ; do
current_state=$( manila access-list $MANILA_GRENADE_SHARE_NAME | \
grep " $MANILA_GRENADE_ACCESS_TO " | get_field 5 )
case $current_state in
active)
active='true'
break;;
creating|new|queued_to_apply|applying)
((wait_timeout-=$MANILA_GRENADE_WAIT_STEP))
sleep $MANILA_GRENADE_WAIT_STEP;;
error)
die $LINENO "Failed to create access rule.";;
*)
die $LINENO "Should never reach this line.";;
esac
done
if [[ $active == 'true' ]]; then
echo "Access rule has been created successfully."
else
die $LINENO "Access rule timed out to reach 'active' state."
fi
}
function scenario_1_verify_share_with_rules_and_metadata {
share_status=$(manila show $MANILA_GRENADE_SHARE_NAME | \
grep " status " | get_field 2)
if [[ $share_status != "available" ]]; then
die $LINENO "Share status is not 'available'. It is $share_status"
fi
rule_state=$(manila access-list $MANILA_GRENADE_SHARE_NAME | \
grep " $MANILA_GRENADE_ACCESS_TO " | get_field 5)
if [[ $rule_state != "active" ]]; then
die $LINENO "Share rule state is not 'active'. It is $rule_state"
fi
metadata=$(manila metadata-show $MANILA_GRENADE_SHARE_NAME | \
grep 'gre' | get_field 2)
if [[ $metadata != "nade" ]]; then
die $LINENO "Share metadata is not 'gre=nade'. It is gre=$metadata"
fi
}
function scenario_1_destroy_share_with_rules_and_metadata {
manila delete $MANILA_GRENADE_SHARE_NAME
wait_timeout=$MANILA_GRENADE_WAIT_TIMEOUT
found='true'
while (( wait_timeout > 0 )) ; do
share_status=$( manila list --columns id,name,status | \
grep $MANILA_GRENADE_SHARE_NAME | get_field 3)
if [[ -z $share_status ]]; then
found='false'
break
elif [[ $share_status == 'deleting' ]]; then
((wait_timeout-=$MANILA_GRENADE_WAIT_STEP))
sleep $MANILA_GRENADE_WAIT_STEP
elif [[ $share_status == 'error_deleting' ]]; then
die $LINENO "Share failed to be deleted."
else
die $LINENO "Should never reach this line."
fi
done
if [[ $found == 'true' ]]; then
die $LINENO "Share timed out to be deleted."
else
echo "Share has been deleted successfully."
fi
share_network=$(resource_get manila share_network)
if [[ -n $share_network && $share_network != 'None' ]]; then
manila share-network-delete $MANILA_GRENADE_SHARE_NETWORK_NAME
fi
manila type-delete $MANILA_GRENADE_SHARE_TYPE_NAME
}
#####
function scenario_2_do_attach_ss_to_sn {
manila security-service-create \
ldap \
--name fake_ss_name \
--description fake_ss_description \
--dns-ip fake_dns_ip \
--server fake_server \
--domain fake_domain \
--user fake_user \
--password fake_password
manila share-network-create \
--name fake_sn_name \
--description fake_sn_description \
--neutron-net-id fake_net \
--neutron-subnet-id fake_subnet
manila share-network-security-service-add fake_sn_name fake_ss_name
}
function scenario_2_verify_attach_ss_to_sn {
attached_security_service=$(\
manila share-network-security-service-list fake_sn_name | \
grep "fake_ss_name")
if [[ -z $attached_security_service ]] ; then
die $LINENO "Security service 'fake_ss_name' is not attached "\
"to share-network 'fake_sn_name'."
fi
function assert {
actual=$(manila $1 $2 | grep " $3 " | get_field 2)
if [[ $actual != $4 ]]; then
die $LINENO "Field $3 for command $1 with arg $2 has "\
"value $actual, but $4 is expected."
fi
}
assert share-network-show fake_sn_name description fake_sn_description
# From API version 2.51, share-network-show command doesn't have
# neutron_net_id and neutron_subnet_id, that information is in
# "share-network-subnets"
assert "--os-share-api-version 2.50 share-network-show" fake_sn_name neutron_net_id fake_net
assert "--os-share-api-version 2.50 share-network-show" fake_sn_name neutron_subnet_id fake_subnet
share_network_subnets=$(manila share-network-show fake_sn_name | grep share_network_subnets)
if [[ ! -z "$share_network_subnets" ]]; then
neutron_net_id=$(echo $share_network_subnets | tr ',' '\n' | grep neutron_net_id | cut -d "'" -f4)
neutron_subnet_id=$(echo $share_network_subnets | tr ',' '\n' | grep neutron_subnet_id | cut -d "'" -f4)
if [[ $neutron_net_id != fake_net ]]; then
die $LINENO "Neutron net ID for share network isn't fake_net, it is $neutron_net_id"
fi
if [[ $neutron_subnet_id != fake_subnet ]]; then
die $LINENO "Neutron subnet ID for share network isn't fake_subnet, it is $neutron_subnet_id"
fi
fi
assert security-service-show fake_ss_name description fake_ss_description
assert security-service-show fake_ss_name dns_ip fake_dns_ip
assert security-service-show fake_ss_name server fake_server
assert security-service-show fake_ss_name domain fake_domain
assert security-service-show fake_ss_name user fake_user
assert security-service-show fake_ss_name password fake_password
}
function scenario_2_destroy_attach_ss_to_sn {
manila share-network-delete fake_sn_name
manila security-service-delete fake_ss_name
}
#####
function scenario_3_do_quotas {
current_shares_quota=$(manila quota-show --tenant fake | \
grep " shares " | get_field 2)
((new_shares_quota=$current_shares_quota + 5))
manila quota-update fake --shares $new_shares_quota
resource_save manila quota $new_shares_quota
}
function scenario_3_verify_quotas {
shares_quota=$(manila quota-show --tenant fake | \
grep " shares " | get_field 2)
expected=$(resource_get manila quota)
if [[ $shares_quota != $expected ]] ; then
die $LINENO "Shares quota for 'fake' tenant is expected "\
"as $expected but it is $shares_quota."
fi
}
function scenario_3_destroy_quotas {
manila quota-delete --tenant fake
}
#####
function scenario_4_do_private_share_types {
manila type-create ${MANILA_GRENADE_SHARE_TYPE_NAME}_scenario4 false \
--is-public false
manila type-access-add ${MANILA_GRENADE_SHARE_TYPE_NAME}_scenario4 \
$(openstack project show demo -c id -f value)
}
function scenario_4_verify_private_share_types {
share_type_visibility=$(manila type-list --all \
--columns name,visibility | \
grep ${MANILA_GRENADE_SHARE_TYPE_NAME}_scenario4 | get_field 2)
if [[ $share_type_visibility != 'private' ]] ; then
die $LINENO "Visibility of share type "\
"${MANILA_GRENADE_SHARE_TYPE_NAME}_scenario4 is not "\
"'private'. It is $share_type_visibility"
fi
project_id=$(openstack project show demo -c id -f value)
access=$(manila type-access-list \
${MANILA_GRENADE_SHARE_TYPE_NAME}_scenario4 | grep $project_id)
if [[ -z $access ]]; then
die $LINENO "Expected $project_id project ID is not found in list "\
"of allowed projects of "\
"${MANILA_GRENADE_SHARE_TYPE_NAME}_scenario4 share type."
fi
}
function scenario_4_destroy_private_share_types {
manila type-delete ${MANILA_GRENADE_SHARE_TYPE_NAME}_scenario4
}
#####
function scenario_5_do_share_snapshot {
if [[ $(trueorfalse True MANILA_GRENADE_SHARE_TYPE_SNAPSHOT_SUPPORT_EXTRA_SPEC) == True ]]; then
# Create share snapshot
manila snapshot-create $MANILA_GRENADE_SHARE_NAME \
--name $MANILA_GRENADE_SHARE_SNAPSHOT_NAME
resource_save manila share_snapshot $MANILA_GRENADE_SHARE_SNAPSHOT_NAME
# Wait for share snapshot creation results
wait_timeout=$MANILA_GRENADE_WAIT_TIMEOUT
available='false'
while (( wait_timeout > 0 )) ; do
current_status=$( manila snapshot-show $MANILA_GRENADE_SHARE_SNAPSHOT_NAME | \
grep " status " | get_field 2 )
if [[ $current_status == 'available' ]]; then
available='true'
break
elif [[ $current_status == 'creating' ]]; then
((wait_timeout-=$MANILA_GRENADE_WAIT_STEP))
sleep $MANILA_GRENADE_WAIT_STEP
elif [[ $current_status == 'error' ]]; then
die $LINENO "Share snapshot is in 'error' state."
else
die $LINENO "Should never reach this line."
fi
done
if [[ $available == 'true' ]]; then
echo "Share snapshot has been created successfully."
else
die $LINENO "Share snapshot timed out to reach 'available' status."
fi
else
echo "Skipping scenario '5' with creation of share snapshot."
fi
}
function scenario_5_verify_share_snapshot {
if [[ $(trueorfalse True MANILA_GRENADE_SHARE_TYPE_SNAPSHOT_SUPPORT_EXTRA_SPEC) == True ]]; then
# Check that source share ID is set
share_id_in_snapshot=$( manila snapshot-show \
$MANILA_GRENADE_SHARE_SNAPSHOT_NAME \
| grep "| share_id " | get_field 2 )
if [[ -z $share_id_in_snapshot ]]; then
die $LINENO "Source share ID is not set."
fi
# Check that snapshot's source share ID is correct
share_id=$( manila show $MANILA_GRENADE_SHARE_NAME \
| grep "| id " | get_field 2 )
if [[ $share_id != $share_id_in_snapshot ]]; then
die $LINENO "Actual source share ID '$share_id_in_snapshot' is not "\
"equal to expected value '$share_id'."
fi
# Check presence of expected columns in snapshot view
snapshot_output=$( manila snapshot-show $MANILA_GRENADE_SHARE_SNAPSHOT_NAME )
for snapshot_column in 'id' 'provider_location' 'name' 'size' 'export_locations'; do
echo $snapshot_output | grep "| $snapshot_column "
if [[ $? != 0 ]]; then
die $LINENO "'$snapshot_column' column was not found in output '$snapshot_output'"
fi
done
fi
}
function scenario_5_destroy_share_snapshot {
if [[ $(trueorfalse True MANILA_GRENADE_SHARE_TYPE_SNAPSHOT_SUPPORT_EXTRA_SPEC) == True ]]; then
manila snapshot-delete $MANILA_GRENADE_SHARE_SNAPSHOT_NAME
wait_timeout=$MANILA_GRENADE_WAIT_TIMEOUT
found='true'
while (( wait_timeout > 0 )) ; do
snapshot_status=$( manila snapshot-list --columns id,name,status | \
grep $MANILA_GRENADE_SHARE_SNAPSHOT_NAME | get_field 3)
if [[ -z $snapshot_status ]]; then
found='false'
break
elif [[ $snapshot_status == 'deleting' ]]; then
((wait_timeout-=$MANILA_GRENADE_WAIT_STEP))
sleep $MANILA_GRENADE_WAIT_STEP
elif [[ $snapshot_status == 'error_deleting' ]]; then
die $LINENO "Share snapshot failed to be deleted."
else
die $LINENO "Should never reach this line."
fi
done
if [[ $found == 'true' ]]; then
die $LINENO "Share snapshot timed out to be deleted."
else
echo "Share snapshot has been deleted successfully."
fi
fi
}
#####
function scenario_6_do_share_mount_and_write_data {
mkdir -p /tmp/manila-share
export_path=$(resource_get manila export_path)
share_protocol=$(resource_get manila share_protocol| awk '{print tolower($0)}')
sudo mount -t $share_protocol $export_path /tmp/manila-share
test_msg="Hello from the past"
echo $test_msg | sudo tee /tmp/manila-share/testfile && sudo sync
}
function scenario_6_verify_share_mount_and_read_data {
export_path=$(resource_get manila export_path)
share_is_mounted=$(sudo mount | grep $export_path)
[[ -z $share_is_mounted ]] && die $LINENO "Share $export_path is not mounted"
read_data=$(sudo cat /tmp/manila-share/testfile|xargs)
if [[ $read_data == "Hello from the past" ]]; then
echo "Share data remains unmodified."
else
die $LINENO "Share data does not match what was written before upgrade."
fi
}
function scenario_6_destroy_share_mount {
export_path=$(resource_get manila export_path)
sudo umount -f /tmp/manila-share
}
################################# Main logic ##################################
function create {
scenario_1_do_share_with_rules_and_metadata
scenario_2_do_attach_ss_to_sn
scenario_3_do_quotas
scenario_4_do_private_share_types
scenario_5_do_share_snapshot
scenario_6_do_share_mount_and_write_data
echo "Manila 'create': SUCCESS"
}
function verify {
scenario_1_verify_share_with_rules_and_metadata
scenario_2_verify_attach_ss_to_sn
scenario_3_verify_quotas
scenario_4_verify_private_share_types
scenario_5_verify_share_snapshot
scenario_6_verify_share_mount_and_read_data
echo "Manila 'verify': SUCCESS"
}
function destroy {
scenario_6_destroy_share_mount
scenario_5_destroy_share_snapshot
scenario_1_destroy_share_with_rules_and_metadata
scenario_2_destroy_attach_ss_to_sn
scenario_3_destroy_quotas
scenario_4_destroy_private_share_types
echo "Manila 'destroy': SUCCESS"
}
function verify_noapi {
scenario_6_verify_share_mount_and_read_data
}
################################# Dispatcher ##################################
case $1 in
"create")
create
;;
"verify_noapi")
verify_noapi
;;
"verify")
verify
;;
"destroy")
destroy
;;
"force_destroy")
set +o errexit
destroy
;;
esac
###############################################################################