diff --git a/contrib/ci/common.sh b/contrib/ci/common.sh index 07ebfa549f..48505548f9 100755 --- a/contrib/ci/common.sh +++ b/contrib/ci/common.sh @@ -42,25 +42,12 @@ function manila_wait_for_generic_driver_init { GENERIC_DRIVER='manila.share.drivers.generic.GenericShareDriver' DHSS=$(iniget $MANILA_CONF $driver_group driver_handles_share_servers) if [[ $SHARE_DRIVER == $GENERIC_DRIVER && $(trueorfalse False DHSS) == False ]]; then - # Wait for availability + # Wait for service VM availability source /opt/stack/new/devstack/openrc admin demo - vm_id=$(iniget $MANILA_CONF $driver_group service_instance_name_or_id) - vm_ips=$(nova show $vm_id | grep "private network") - attempts=0 - for vm_ip in ${vm_ips//,/ }; do - # Get IPv4 address - if [[ $vm_ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then - # Check availability - ((attempts++)) - manila_check_service_vm_availability $vm_ip - break - fi - done - if [[ (( attempts < 1 )) ]]; then - echo "No IPv4 addresses found among private IPs of '$vm_id' for '$GENERIC_DRIVER'. "\ - "Reported IPs: '$vm_ips'." - exit 1 - fi + vm_ip=$(iniget $MANILA_CONF $driver_group service_net_name_or_ip) + + # Check availability + manila_check_service_vm_availability $vm_ip fi done } diff --git a/devstack/plugin.sh b/devstack/plugin.sh index 8548539c6c..637f195b0c 100755 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -300,7 +300,7 @@ function is_driver_enabled { # create_service_share_servers - creates service Nova VMs, one per generic # driver, and only if it is configured to mode without handling of share servers. function create_service_share_servers { - private_net_id=$(nova net-list | grep ' private ' | get_field 1) + private_net_id=$(openstack network show $PRIVATE_NETWORK_NAME -f value -c id) created_admin_network=false for BE in ${MANILA_ENABLED_BACKENDS//,/ }; do driver_handles_share_servers=$(iniget $MANILA_CONF $BE driver_handles_share_servers) @@ -321,9 +321,12 @@ function create_service_share_servers { vm_id=$(nova show $vm_name | grep ' id ' | get_field 2) + floating_ip=$(openstack floating ip create $PUBLIC_NETWORK_NAME --subnet $PUBLIC_SUBNET_NAME | grep 'floating_ip_address' | get_field 2) + openstack server add floating ip $vm_name $floating_ip + iniset $MANILA_CONF $BE service_instance_name_or_id $vm_id - iniset $MANILA_CONF $BE service_net_name_or_ip private - iniset $MANILA_CONF $BE tenant_net_name_or_ip private + iniset $MANILA_CONF $BE service_net_name_or_ip $floating_ip + iniset $MANILA_CONF $BE tenant_net_name_or_ip $PRIVATE_NETWORK_NAME else if is_service_enabled neutron; then if ! [[ -z $MANILA_ADMIN_NET_RANGE ]]; then diff --git a/manila/share/drivers/generic.py b/manila/share/drivers/generic.py index 49bc5751b5..7e7fbfca4f 100644 --- a/manila/share/drivers/generic.py +++ b/manila/share/drivers/generic.py @@ -242,9 +242,14 @@ class GenericShareDriver(driver.ExecuteMixin, driver.ShareDriver): "export_location_metadata_example": "example", }, }] - if server_details.get('admin_ip'): + # NOTE(vponomaryov): 'admin_ip' exists only in case of DHSS=True mode. + # 'ip' exists in case of DHSS=False mode. + # Use one of these for creation of export location for service needs. + service_address = server_details.get( + "admin_ip", server_details.get("ip")) + if service_address: admin_location = location.replace( - server_details['public_address'], server_details['admin_ip']) + server_details['public_address'], service_address) export_list.append({ "path": admin_location, "is_admin_only": True, diff --git a/manila/tests/share/drivers/test_generic.py b/manila/tests/share/drivers/test_generic.py index 7bbaaaf812..f9e380d74c 100644 --- a/manila/tests/share/drivers/test_generic.py +++ b/manila/tests/share/drivers/test_generic.py @@ -218,6 +218,7 @@ class GenericShareDriverTestCase(test.TestCase): 'pk_path': 'fake_pk_path', 'backend_details': { 'ip': '1.2.3.4', + 'public_address': 'fake_public_address', 'instance_id': 'fake', 'service_ip': 'fake_ip', }, @@ -316,23 +317,33 @@ class GenericShareDriverTestCase(test.TestCase): def test_create_share(self): volume = 'fake_volume' volume2 = 'fake_volume2' - self._helper_nfs.create_export.return_value = 'fakelocation' + location = ( + '%s:/fake/path' % self.server['backend_details']['public_address']) + self._helper_nfs.create_export.return_value = location self.mock_object(self._driver, '_allocate_container', mock.Mock(return_value=volume)) self.mock_object(self._driver, '_attach_volume', mock.Mock(return_value=volume2)) self.mock_object(self._driver, '_format_device') self.mock_object(self._driver, '_mount_device') - expected_el = [{ - 'is_admin_only': False, - 'path': 'fakelocation', - 'metadata': {'export_location_metadata_example': 'example'}, - }] + expected_el = [ + {'is_admin_only': False, + 'path': location, + 'metadata': {'export_location_metadata_example': 'example'}}, + {'is_admin_only': True, + 'path': location.replace( + self.server['backend_details']['public_address'], + self.server['backend_details']['ip']), + 'metadata': {'export_location_metadata_example': 'example'}}, + ] result = self._driver.create_share( self._context, self.share, share_server=self.server) - self.assertEqual(expected_el, result) + self.assertIsInstance(result, list) + self.assertEqual(2, len(result)) + for el in expected_el: + self.assertIn(el, result) self._driver._allocate_container.assert_called_once_with( self._driver.admin_context, self.share) self._driver._attach_volume.assert_called_once_with(