Add FilePathOrUrlType

This type does check whether is path or url passed, check if file
available and perform os.path.expanduser if needed.

Change-Id: I2551fbf90b1180ec9246478ee6ed64938b52d923
This commit is contained in:
Sergey Skripnick 2015-08-13 16:06:56 +02:00
parent d3a45d9228
commit f9f5ad73ad
3 changed files with 53 additions and 0 deletions

View File

@ -27,6 +27,7 @@ class GlanceImages(utils.GlanceScenario, nova_utils.NovaScenario):
RESOURCE_NAME_PREFIX = "rally_image_" RESOURCE_NAME_PREFIX = "rally_image_"
RESOURCE_NAME_LENGTH = 16 RESOURCE_NAME_LENGTH = 16
@types.set(image_location=types.FilePathOrUrlType)
@validation.required_services(consts.Service.GLANCE) @validation.required_services(consts.Service.GLANCE)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["glance"]}) @scenario.configure(context={"cleanup": ["glance"]})

View File

@ -19,6 +19,8 @@ import operator
import os.path import os.path
import re import re
import requests
from rally import exceptions from rally import exceptions
from rally import osclients from rally import osclients
from rally.task import scenario from rally.task import scenario
@ -341,6 +343,32 @@ class NeutronNetworkResourceType(ResourceType):
name=resource_config.get("name"))) name=resource_config.get("name")))
class FilePathOrUrlType(ResourceType):
@classmethod
def transform(cls, clients, resource_config):
"""Check whether file exists or url available.
:param clients: openstack admin client handles
:param resource_config: path or url
:returns: url or expanded file path
"""
path = os.path.expanduser(resource_config)
if os.path.isfile(path):
return path
try:
head = requests.head(path)
if head.status_code == 200:
return path
raise exceptions.InvalidScenarioArgument(
"Url %s unavailable (code %s)" % (path, head.status_code))
except Exception as ex:
raise exceptions.InvalidScenarioArgument(
"Url error %s (%s)" % (path, ex))
class FileType(ResourceType): class FileType(ResourceType):
@classmethod @classmethod

View File

@ -362,6 +362,30 @@ class PreprocessTestCase(test.TestCase):
self.assertEqual({"a": 20, "b": 20}, result) self.assertEqual({"a": 20, "b": 20}, result)
class FilePathOrUrlTypeTestCase(test.TestCase):
@mock.patch("rally.task.types.os.path.isfile")
@mock.patch("rally.task.types.requests")
def test_transform_file(self, mock_requests, mock_isfile):
mock_isfile.return_value = True
path = types.FilePathOrUrlType.transform(None, "fake_path")
self.assertEqual("fake_path", path)
mock_isfile.return_value = False
mock_requests.head.return_value = mock.Mock(status_code=500)
self.assertRaises(exceptions.InvalidScenarioArgument,
types.FilePathOrUrlType.transform,
None, "fake_path")
mock_requests.head.assert_called_once_with("fake_path")
@mock.patch("rally.task.types.os.path.isfile")
@mock.patch("rally.task.types.requests")
def test_transform_url(self, mock_requests, mock_isfile):
mock_isfile.return_value = False
mock_requests.head.return_value = mock.Mock(status_code=200)
path = types.FilePathOrUrlType.transform(None, "fake_url")
self.assertEqual("fake_url", path)
class FileTypeTestCase(test.TestCase): class FileTypeTestCase(test.TestCase):
@mock.patch("rally.task.types.open", @mock.patch("rally.task.types.open",