cloudstack: add route to the metadata base url

If the CloudStack metadata url is 169.254.169.254,
Windows requires special logic to enable the static
route. The same logic is used on AWS / OpenStack
metadata implementation.

More info:
https://bugs.launchpad.net/quantum/+bug/1174657

Change-Id: Iab9b1d082d4c48ced362b816881c39564dcaaf91
This commit is contained in:
Adrian Vladu 2019-08-12 15:13:14 +03:00
parent 303ce0ed6f
commit cd8eca0f91
3 changed files with 13 additions and 1 deletions

View File

@ -43,6 +43,9 @@ class CloudStackOptions(conf_base.Options):
"https_ca_bundle", default=None,
help="The path to a CA_BUNDLE file or directory with "
"certificates of trusted CAs."),
cfg.BoolOpt(
"add_metadata_private_ip_route", default=False,
help="Add a route for the metadata ip address to the gateway"),
]
def register(self):

View File

@ -23,6 +23,7 @@ from cloudbaseinit import conf as cloudbaseinit_conf
from cloudbaseinit.metadata.services import base
from cloudbaseinit.osutils import factory as osutils_factory
from cloudbaseinit.utils import encoding
from cloudbaseinit.utils import network
CONF = cloudbaseinit_conf.CONF
LOG = oslo_logging.getLogger(__name__)
@ -83,6 +84,10 @@ class CloudStack(base.BaseHTTPMetadataService):
def load(self):
"""Obtain all the required information."""
super(CloudStack, self).load()
if CONF.cloudstack.add_metadata_private_ip_route:
network.check_metadata_ip_route(CONF.cloudstack.metadata_base_url)
if self._test_api(CONF.cloudstack.metadata_base_url):
return True

View File

@ -35,6 +35,7 @@ class CloudStackTest(unittest.TestCase):
def setUp(self):
CONF.set_override('retry_count_interval', 0)
CONF.set_override('retry_count', 1)
CONF.set_override('add_metadata_private_ip_route', True, 'cloudstack')
self._service = self._get_service()
self._service._metadata_uri = "http://10.1.1.1/latest/meta-data/"
@ -75,15 +76,18 @@ class CloudStackTest(unittest.TestCase):
self.assertTrue(self._service.load())
self.assertEqual(4, mock_test_api.call_count)
@mock.patch('cloudbaseinit.utils.network.check_metadata_ip_route')
@mock.patch('cloudbaseinit.metadata.services.cloudstack.CloudStack'
'._test_api')
def test_load_default(self, mock_test_api):
def test_load_default(self, mock_test_api, mock_check_metadata_ip_route):
mock_test_api.side_effect = [True]
self._service._test_api = mock_test_api
self.assertTrue(self._service.load())
mock_test_api.assert_called_once_with(
CONF.cloudstack.metadata_base_url)
mock_check_metadata_ip_route.assert_called_once_with(
CONF.cloudstack.metadata_base_url)
@mock.patch('cloudbaseinit.osutils.factory.get_os_utils')
@mock.patch('cloudbaseinit.metadata.services.cloudstack.CloudStack'