sahara-tests/sahara_tests/unit/scenario/test_runner.py

377 lines
15 KiB
Python

# Copyright (c) 2015 Mirantis Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys
from jsonschema import exceptions
import mock
import testtools
from sahara_tests.scenario import runner
class RunnerUnitTest(testtools.TestCase):
def _isDictContainSubset(self, sub_dictionary, dictionary):
for key in sub_dictionary:
if sub_dictionary[key] != dictionary[key]:
return False
return True
def test_set_defaults(self):
config_without_cred_net = {
"clusters": [
{
"plugin_name": "vanilla",
"plugin_version": "2.7.1",
"image": "sahara-vanilla-2.7.1-ubuntu-14.04"
}
]
}
expected_default_credential = {
"credentials": {
"os_username": "admin",
"os_auth_url": "http://localhost:5000/v2.0",
"sahara_url": None,
"sahara_service_type": "data-processing",
"os_password": "nova",
"os_tenant": "admin",
"ssl_cert": None,
"ssl_verify": False
}
}
expected_default_network = {
"network": {
"type": "neutron",
"private_network": "private",
"public_network": "public",
"auto_assignment_floating_ip": False
}
}
expected_default_cluster = {
"clusters": [
{
"image": "sahara-vanilla-2.7.1-ubuntu-14.04",
"edp_jobs_flow": [],
"class_name": "vanilla2_7_1",
"plugin_name": "vanilla",
"scenario": ['run_jobs', 'scale', 'run_jobs'],
"plugin_version": "2.7.1",
"retain_resources": False,
}
]
}
runner.set_defaults(config_without_cred_net)
self.assertTrue(self._isDictContainSubset(
expected_default_credential, config_without_cred_net))
self.assertTrue(self._isDictContainSubset(
expected_default_network, config_without_cred_net))
self.assertTrue(self._isDictContainSubset(
expected_default_cluster, config_without_cred_net))
config = {
"credentials": {
"os_username": "changed_admin",
"os_auth_url": "http://127.0.0.1:5000/v2.0",
"sahara_url": "http://127.0.0.1",
"os_password": "changed_nova",
"os_tenant": "changed_admin",
"ssl_cert": "sahara_tests/unit/scenario/dummy.crt"
},
"network": {
"type": "neutron",
"private_network": "changed_private",
"public_network": "changed_public",
"auto_assignment_floating_ip": True,
},
"clusters": [
{
"plugin_name": "vanilla",
"plugin_version": "2.7.1",
"image": "sahara-vanilla-2.7.1-ubuntu-14.04",
"edp_jobs_flow": "test_flow",
"retain_resources": True
}
],
"edp_jobs_flow": {
"test_flow": [
{
"type": "Pig",
"input_datasource": {
"type": "swift",
"source": "sahara_tests/scenario/defaults/"
"edp-examples/edp-pig/top-todoers/"
"data/input"
},
"output_datasource": {
"type": "hdfs",
"destination": "/user/hadoop/edp-output"
},
"main_lib": {
"type": "swift",
"source": "sahara_tests/scenario/defaults/"
"edp-examples/edp-pig/top-todoers/"
"example.pig"
}
},
{
"type": "Java",
"additional_libs": [
{
"type": "database",
"source": 'sahara_tests/scenario/defaults/'
'edp-examples/hadoop2/edp-java/'
'hadoop-mapreduce-examples-'
'2.6.0.jars',
}],
"configs": "edp.java.main_class: org.apache.hadoop."
"examples.QuasiMonteCarlo",
"args": [10, 10]
},
],
"test_flow2": [
{
"type": "Java",
"additional_libs": [
{
"type": "database",
"source":
"sahara_tests/scenario/defaults/"
"edp-examples/hadoop2/edp-java/hadoop-"
"mapreduce-examples-2.6.0.jars"
}],
"configs": "edp.java.main_class: org.apache.hadoop."
"examples.QuasiMonteCarlo",
"args": [20, 20]
}
]
}
}
expected_credential = {
"credentials": {
"os_username": "changed_admin",
"os_auth_url": "http://127.0.0.1:5000/v2.0",
"sahara_url": "http://127.0.0.1",
"os_password": "changed_nova",
"os_tenant": "changed_admin",
"sahara_service_type": "data-processing",
"ssl_cert": "sahara_tests/unit/scenario/dummy.crt",
"ssl_verify": False
},
}
expected_network = {
"network": {
"type": "neutron",
"private_network": "changed_private",
"public_network": "changed_public",
"auto_assignment_floating_ip": True,
}
}
expected_cluster = {
"clusters": [
{
"plugin_name": "vanilla",
"plugin_version": "2.7.1",
"image": "sahara-vanilla-2.7.1-ubuntu-14.04",
"retain_resources": True,
'edp_jobs_flow': [
{
'main_lib': {
'source': 'sahara_tests/scenario/defaults/'
'edp-examples/edp-pig/'
'top-todoers/example.pig',
'type': 'swift'
},
'type': 'Pig',
'input_datasource': {
'source': 'sahara_tests/scenario/defaults/'
'edp-examples/edp-pig/'
'top-todoers/data/input',
'type': 'swift'
},
'output_datasource': {
'type': 'hdfs',
'destination': '/user/hadoop/edp-output'
}
},
{
'args': [10, 10],
'configs': 'edp.java.main_class: org.apache.'
'hadoop.examples.QuasiMonteCarlo',
'type': 'Java',
'additional_libs': [
{
'source': 'sahara_tests/scenario/defaults/'
'edp-examples/hadoop2/edp-java/'
'hadoop-mapreduce-examples-'
'2.6.0.jars',
'type': 'database'
}]
}
],
"scenario": ['run_jobs', 'scale', 'run_jobs'],
"class_name": "vanilla2_7_1"
}],
}
runner.set_defaults(config)
self.assertTrue(self._isDictContainSubset(
expected_credential, config))
self.assertTrue(self._isDictContainSubset(
expected_network, config))
self.assertTrue(self._isDictContainSubset(
expected_cluster, config))
@mock.patch('sys.exit', return_value=None)
@mock.patch('subprocess.call', return_value=None)
def test_runner_main(self, mock_sub, mock_sys):
sys.argv = ['sahara_tests/scenario/runner.py',
'sahara_tests/unit/scenario/vanilla2_7_1.yaml']
runner.main()
@mock.patch('sys.exit', return_value=None)
@mock.patch('subprocess.call', return_value=None)
def test_runner_template_missing_varfile(self, mock_sub, mock_sys):
sys.argv = ['sahara_tests/scenario/runner.py',
'sahara_tests/unit/scenario/vanilla2_7_1.yaml.mako']
self.assertRaises(NameError, runner.main)
@mock.patch('sys.exit', return_value=None)
@mock.patch('subprocess.call', return_value=None)
def test_runner_template_wrong_varfile(self, mock_sub, mock_sys):
sys.argv = ['sahara_tests/scenario/runner.py',
'-V',
'sahara_tests/unit/scenario/templatevars_nodefault.ini',
'sahara_tests/unit/scenario/vanilla2_7_1.yaml.mako']
self.assertRaises(NameError, runner.main)
@mock.patch('sys.exit', return_value=None)
@mock.patch('subprocess.call', return_value=None)
def test_runner_template_incomplete_varfile(self, mock_sub, mock_sys):
sys.argv = ['sahara_tests/scenario/runner.py',
'-V',
'sahara_tests/unit/scenario/templatevars_incomplete.ini',
'sahara_tests/unit/scenario/vanilla2_7_1.yaml.mako']
self.assertRaises(NameError, runner.main)
@mock.patch('sys.exit', return_value=None)
@mock.patch('subprocess.call', return_value=None)
def test_runner_template_working(self, mock_sub, mock_sys):
sys.argv = ['sahara_tests/scenario/runner.py',
'-V',
'sahara_tests/unit/scenario/templatevars_complete.ini',
'sahara_tests/unit/scenario/vanilla2_7_1.yaml.mako']
runner.main()
@mock.patch('sys.exit', return_value=None)
def test_runner_validate(self, mock_sys):
sys.argv = ['sahara_tests/scenario/runner.py',
'--validate',
'-V',
'sahara_tests/unit/scenario/templatevars_complete.ini',
'sahara_tests/unit/scenario/vanilla2_7_1.yaml.mako']
runner.main()
@mock.patch('sahara_tests.scenario.validation.validate')
@mock.patch('subprocess.call', return_value=None)
@mock.patch('sys.exit', return_value=None)
def test_runner_from_args(self, mock_sys, mock_sub, mock_validate):
sys.argv = ['sahara_tests/scenario/runner.py',
'sahara_tests/unit/scenario/vanilla2_7_1.yaml.mako',
'--args', 'OS_USERNAME:demo', 'OS_PASSWORD:demopwd',
'OS_TENANT_NAME:demo', 'network_type:neutron',
'network_private_name:private',
'network_public_name:public',
'vanilla_two_six_image:hadoop_2_6_latest',
'ci_flavor_id:2', 'OS_AUTH_URL:localhost']
runner.main()
expected = {
'os_username': 'demo',
'os_password': 'demopwd',
'os_tenant': 'demo',
'os_auth_url': 'localhost'
}
self.assertTrue(self._isDictContainSubset(
expected, mock_validate.call_args_list[0][0][0]['credentials']))
@mock.patch('subprocess.call', return_value=None)
@mock.patch('sys.exit', return_value=None)
def test_replace_value_args(self, mock_sys, mock_sub):
sys.argv = ['sahara_tests/scenario/runner.py',
'-V',
'sahara_tests/unit/scenario/templatevars_complete.ini',
'sahara_tests/unit/scenario/vanilla2_7_1.yaml.mako',
'--args',
'network_type:test']
with testtools.ExpectedException(exceptions.ValidationError):
runner.main()
@mock.patch('sahara_tests.scenario.validation.validate')
@mock.patch('subprocess.call', return_value=None)
@mock.patch('sys.exit', return_value=None)
def test_default_templates_non_plugin(self, mock_sys, mock_sub,
mock_validate):
sys.argv = ['sahara_tests/scenario/runner.py',
'-V',
'sahara_tests/unit/scenario/templatevars_complete.ini',
'-p', 'transient']
runner.main()
@mock.patch('sahara_tests.scenario.validation.validate')
@mock.patch('subprocess.call', return_value=None)
@mock.patch('sys.exit', return_value=None)
def test_default_templates_negative(self, mock_sys, mock_sub,
mock_validate):
sys.argv = ['sahara_tests/scenario/runner.py',
'-V',
'sahara_tests/unit/scenario/templatevars_complete.ini',
'-p', 'vanilla']
with testtools.ExpectedException(ValueError):
runner.main()
@mock.patch('sahara_tests.scenario.validation.validate')
@mock.patch('subprocess.call', return_value=None)
@mock.patch('sys.exit', return_value=None)
def test_default_templates_kilo(self, mock_sys, mock_sub, mock_validate):
sys.argv = ['sahara_tests/scenario/runner.py',
'-V',
'sahara_tests/unit/scenario/templatevars_complete.ini',
'-p', 'spark', '-v', '1.0.0', '-r', 'kilo']
runner.main()
self.assertEqual('spark',
mock_validate.call_args[0][0]['clusters'][0][
'plugin_name'])
self.assertEqual('1.0.0',
mock_validate.call_args[0][0]['clusters'][0][
'plugin_version'])
@mock.patch('subprocess.call', return_value=None)
@mock.patch('sys.exit', return_value=None)
def test_count(self, mock_sys, mock_sub):
sys.argv = ['sahara_tests/scenario/runner.py',
'-V',
'sahara_tests/unit/scenario/templatevars_complete.ini',
'-p', 'spark', '-v', '1.0.0', '--count', '4']
runner.main()