import attr
import pytest
import six.moves.urllib.parse
import warnings
from cfme.fixtures import terminalreporter
from cfme.utils import conf
from cfme.utils.appliance import (
load_appliances_from_config, stack,
DummyAppliance,
ApplianceSummoningWarning)
from cfme.utils.path import log_path
PLUGIN_KEY = "appliance-holder"
warnings.simplefilter('error', ApplianceSummoningWarning)
[docs]def pytest_addoption(parser):
parser.addoption('--dummy-appliance', action='store_true')
parser.addoption('--dummy-appliance-version', default=None)
[docs]def appliances_from_cli(cli_appliances):
appliance_config = dict(appliances=[])
for appliance_data in cli_appliances:
parsed_url = six.moves.urllib.parse.urlparse(appliance_data['hostname'])
if not parsed_url.hostname:
raise ValueError(
"Invalid appliance url: {}".format(appliance_data)
)
appliance = appliance_data.copy()
appliance.update(dict(
hostname=parsed_url.hostname,
ui_protocol=parsed_url.scheme if parsed_url.scheme else "https",
ui_port=parsed_url.port if parsed_url.port else 443,
))
appliance_config['appliances'].append(appliance)
return load_appliances_from_config(appliance_config)
@pytest.hookimpl(tryfirst=True)
@pytest.hookimpl(trylast=True)
@attr.s(cmp=False)
[docs]class ApplianceHolderPlugin(object):
held_appliance = attr.ib()
appliances = attr.ib(default=attr.Factory(list))
@pytest.fixture(scope="session")
[docs] def appliance(self):
return self.held_appliance
[docs] def pytest_sessionstart(self):
if isinstance(self.held_appliance, DummyAppliance) or self.held_appliance.is_dev:
return
if pytest.store.parallelizer_role != 'slave':
with log_path.join('appliance_version').open('w') as appliance_version:
appliance_version.write(self.held_appliance.version.vstring)