Improve messages for validation

Change-Id: Icce40f843e97ffff11c6f7e26438e94d7fed247b
Closes-bug: #1283289
This commit is contained in:
Vitaly Gridnev 2015-02-10 17:02:23 +03:00
parent 4ab4a449df
commit 0ce861f72c
3 changed files with 32 additions and 16 deletions

View File

@ -13,6 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import collections
import operator
import novaclient.exceptions as nova_ex
@ -49,6 +50,17 @@ def _get_plugin_configs(plugin_name, hadoop_version, scope=None):
return pl_confs
def _check_duplicates(lst, message):
invalid = []
lst = collections.Counter(lst)
for (key, value) in lst.iteritems():
if value > 1:
invalid.append(key)
if len(invalid) > 0:
raise ex.InvalidDataException(message % invalid)
# Common validation checks
def check_plugin_name_exists(name):
@ -181,25 +193,30 @@ def check_floatingip_pool_exists(ng_name, pool_id):
def check_node_processes(plugin_name, version, node_processes):
if len(set(node_processes)) != len(node_processes):
raise ex.InvalidDataException(
_("Duplicates in node processes have been detected"))
_check_duplicates(node_processes, _("Duplicates in node processes have "
"been detected: %s"))
plugin_processes = []
for process in plugin_base.PLUGINS.get_plugin(
plugin_name).get_node_processes(version).values():
plugin_processes += process
plugin_processes = set(plugin_processes)
if not set(node_processes).issubset(set(plugin_processes)):
invalid_processes = []
for node_process in node_processes:
if node_process not in plugin_processes:
invalid_processes.append(node_process)
if len(invalid_processes) > 0:
raise ex.InvalidReferenceException(
_("Plugin supports the following node procesess: %s")
% sorted(plugin_processes))
_("Plugin doesn't support the following node processes: %s")
% sorted(invalid_processes))
def check_duplicates_node_groups_names(node_groups):
ng_names = [ng['name'] for ng in node_groups]
if len(set(ng_names)) < len(node_groups):
raise ex.InvalidDataException(
_("Duplicates in node group names are detected"))
_check_duplicates(
ng_names, _("Duplicates in node group names are detected: %s"))
def check_availability_zone_exist(az):

View File

@ -37,6 +37,8 @@ class TestScalingValidation(u.ValidationTestCase):
super(TestScalingValidation, self).setUp()
api.plugin_base.setup_plugins()
self._create_object_fun = mock.Mock()
self.duplicates_detected = ("Duplicates in node group names are"
" detected: ['a']")
@mock.patch('sahara.service.api.get_cluster')
@mock.patch('sahara.plugins.base.PluginManager.get_plugin')
@ -101,8 +103,7 @@ class TestScalingValidation(u.ValidationTestCase):
]})
self._assert_check_scaling(
data=data, cluster=cluster,
expected_message='Duplicates in node '
'group names are detected',
expected_message=self.duplicates_detected,
expected_exception=ex.InvalidDataException)
@mock.patch("sahara.service.api.OPS")
@ -128,8 +129,7 @@ class TestScalingValidation(u.ValidationTestCase):
}
self._assert_check_scaling(
data=data, cluster=cluster,
expected_message='Duplicates in node '
'group names are detected',
expected_message=self.duplicates_detected,
expected_exception=ex.InvalidDataException)
data = {
'add_node_groups': [

View File

@ -101,9 +101,8 @@ class TestNGTemplateCreateValidation(u.ValidationTestCase):
'node_processes': ['wrong_process']
},
bad_req_i=(1, 'INVALID_REFERENCE',
"Plugin supports the following node procesess: ["
"'datanode', 'hiveserver', 'jobtracker', 'namenode', "
"'oozie', 'secondarynamenode', 'tasktracker']")
"Plugin doesn't support the following node processes: "
"['wrong_process']")
)
def test_ng_template_create_v_right(self):