def test_check_template_template_ok(): template = cfg.TemplateNodeFixed('node') template.add( cfg.TemplateAttributeFixed('attr1', optional=False, value_type=int)) subnode = cfg.TemplateNodeFixed('subnode') subnode.add(cfg.TemplateAttributeFixed('subattr')) template.add(subnode)
def test_validate_type_mismatch_element(): template = cfg.TemplateNodeFixed('root', optional=False) general = cfg.TemplateNodeFixed('general', optional=False) general.add(cfg.TemplateAttributeFixed('log_level', value_type=int)) template.add(general) with nose.tools.assert_raises_regexp( ValueError, "Expecting /general/log_level to be of type <type 'int'>") as e: template.validate(cfg.root())
def test_validate_section_missing(): template = cfg.TemplateNodeFixed('root', optional=False) no_such_section = cfg.TemplateNodeFixed('no_such_section', optional=False) no_such_section.add(cfg.TemplateAttributeFixed('attr')) template.add(no_such_section) with nose.tools.assert_raises_regexp( ValueError, 'Mandatory node /no_such_section is missing, with no defaults set' ) as e: template.validate(cfg.root())
def test_validate_optional_node_mandatory_attr(): # validation for optional node with mandatory attributes without default value should pass template = cfg.TemplateNodeFixed('root', optional=False) opt_node = cfg.TemplateNodeFixed('opt_node', optional=True) opt_node.add(cfg.TemplateAttributeFixed('mand_attr', optional=False)) template.add(opt_node) cfg_node = cfg.ConfigNode('root', node_type='CN') cfg_node.add(cfg.ConfigNode('some_node', attributes={'attr1': 'val1'})) res = template.validate(cfg_node) res.print_fmt() assert res.list_nodes() == ['some_node']
def test_validate_type_mismatch_node_as_element(): template = cfg.TemplateNodeFixed('root', optional=False) general = cfg.TemplateNodeFixed('general', optional=False) log_level = cfg.TemplateNodeFixed('log_level', optional=False) log_level.add( cfg.TemplateAttributeFixed('attr', optional=False, value_type=int)) general.add(log_level) template.add(general) with nose.tools.assert_raises_regexp( ValueError, "Configuration object passed for validation to template log_level is not a ConfigNode" ) as e: template.validate(cfg.root())
def test_validate_nodeset_missing_mandatory_node_default_attr(): # validation for a missing mandatory node in a nodeset, where all mandatory attributes have default values, should pass template = cfg.TemplateNodeFixed('root', optional=False) source_spec = cfg.TemplateNodeFixed('source_spec', optional=False) source_spec.add( cfg.TemplateAttributeFixed('method', optional=False, default_value='abc')) template.add( cfg.TemplateNodeSet('source_spec', source_spec, ['test_missing_node'])) res = template.validate(cfg.root()) res.print_fmt() assert res.get('/test_missing_node/method') == 'abc'
def test_validate_nodeset_missing_node(): template = cfg.TemplateNodeFixed('root', optional=False) source_spec = cfg.TemplateNodeFixed('source_spec', optional=False) source_spec.add( cfg.TemplateAttributeFixed( 'method', optional=False, validator=lambda x: x in ['local', 'ftp', 'sftp', 'http', 's3'])) template.add( cfg.TemplateNodeSet('source_spec', source_spec, ['test_missing_method'])) with nose.tools.assert_raises_regexp( ValueError, 'Parameter /test_missing_method/method failed validation') as e: template.validate(cfg.root())
def test_validate_fail_value_check(): template = cfg.TemplateNodeFixed('root', optional=False) general = cfg.TemplateNodeFixed('general', optional=False) general.add( cfg.TemplateAttributeFixed('log_level', optional=True, value_type=str, validator=lambda x: x.upper() in ['INFO', 'WARNING', 'ERROR', 'CRITICAL'])) template.add(general) with nose.tools.assert_raises_regexp( ValueError, 'Parameter /general/log_level failed validation for value debug' ) as e: template.validate(cfg.root())
def test_validate_type_mismatch_element_as_node(): template = cfg.TemplateNodeFixed('root', optional=False) template.add( cfg.TemplateAttributeFixed('general', optional=False, value_type=int)) with nose.tools.assert_raises_regexp( AttributeError, "'ConfigNode' object has no attribute 'value'") as e: template.validate(cfg.root())
def test_validate_missing_mandatory_attr(): template = cfg.TemplateNodeFixed('node1') template.add(cfg.TemplateAttributeFixed('attr', optional=False)) with nose.tools.assert_raises_regexp( ValueError, 'Mandatory parameter /node1/attr has not been set, and has no default value' ) as e: template.validate(cfg.ConfigNode('node1'))
def test_check_template_invalid_template_invalid_attribute(): template = cfg.TemplateNodeFixed('some_node') template.add(cfg.TemplateAttributeFixed('attr1')) template.add(cfg.TemplateAttributeFixed('attr2')) with nose.tools.assert_raises_regexp( ValueError, 'Attempt to add invalid attribute type to some_node template' ) as e: template.add({'a': 3})
def test_check_template_invalid_template_duplicate_attribute(): template = cfg.TemplateNodeFixed('some_node') template.add(cfg.TemplateAttributeFixed('attr1')) template.add(cfg.TemplateAttributeFixed('attr2')) with nose.tools.assert_raises_regexp( ValueError, 'Attribute or node attr1 can only be added to node some_node once' ) as e: template.add(config.TemplateAttributeFixed('attr1'))
def test_validate_json_value_type_ok(): # validation for attribute of json value type template = cfg.TemplateNodeFixed('root', optional=False) json_node = cfg.TemplateNodeFixed('json_node', optional=False) json_node.add( cfg.TemplateAttributeFixed( 'json_attr', optional=False, value_type=str, validator=lambda x: json.loads(x)['a'] == 1)) template.add(json_node) cfg_node = cfg.ConfigNode('root', node_type='CN') cfg_node.add( cfg.ConfigNode('json_node', attributes={'json_attr': json.dumps({ 'a': 1, 'b': 2 })})) cfg_node.print_fmt() res = template.validate(cfg_node) res.print_fmt() assert json.loads(res.get('/json_node/json_attr'))['b'] == 2
def create_config_template(node): template = cfg.TemplateNodeFixed('root', optional=False) n1 = cfg.TemplateNodeFixed('n1') n11 = cfg.TemplateNodeFixed('n11') n12 = cfg.TemplateNodeFixed('n12') n111 = cfg.TemplateNodeFixed('n111', node_type='CN') n111.add(cfg.TemplateAttributeFixed('attr', value_type=int)) n11.add(n111) n112 = cfg.TemplateNodeFixed('n112') n112.add(cfg.TemplateAttributeFixed('attr', value_type=int)) n11.add(n112) n11.add(cfg.TemplateAttributeFixed('n11_attr', value_type=int)) n121 = cfg.TemplateNodeFixed('n121') n121.add(cfg.TemplateAttributeFixed('attr', value_type=int)) n12.add(n121) n122 = cfg.TemplateNodeFixed('n122') n122.add(cfg.TemplateAttributeFixed('attr', value_type=int)) n12.add(n122) n1.add(n11) n1.add(n12) template.add(n1) return template
def test_validate_optional_section_missing(): template = cfg.TemplateNodeFixed('root', optional=False) no_such_section = cfg.TemplateNodeFixed('no_such_section') no_such_section.add(cfg.TemplateAttributeFixed('attr')) template.add(no_such_section) assert template.validate(cfg.root())
def test_validate_ok(): template = cfg.TemplateNodeFixed('root', optional=False) # [general] def general_validator(spec): if 'post_type' in spec.keys(): if (spec['post_type'].upper() == 'SQL' and 'post_sql' not in spec.keys())\ or (spec['post_type'].upper() == 'SCRIPT' and 'post_script' not in spec.keys()): print 'Missing correct post processing attribute in node general' return False return True general = cfg.TemplateNodeFixed('general', optional=False, validator=general_validator) general.add( cfg.TemplateAttributeFixed( 'log_level', validator=lambda x: x.upper( ) in ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'])) general.add(cfg.TemplateAttributeFixed('log_file', optional=False)) general.add( cfg.TemplateAttributeFixed('log_days_to_keep', optional=False, value_type=int, default_value=30)) general.add( cfg.TemplateAttributeFixed( 'no_update', optional=False, validator=lambda x: x.upper() in ['YES', 'NO'])) general.add(cfg.TemplateAttributeFixed('file_archive', optional=False)) general.add( cfg.TemplateAttributeFixed( 'post_type', validator=lambda x: x.upper() in ['SQL', 'SCRIPT'])) general.add(cfg.TemplateAttributeFixed('post_sql')) general.add(cfg.TemplateAttributeFixed('post_script')) template.add(general) # [target] target = cfg.TemplateNodeFixed('target', optional=False) target.add(cfg.TemplateAttributeFixed('db_server', optional=False)) target.add(cfg.TemplateAttributeFixed('database', optional=False)) target.add(cfg.TemplateAttributeFixed('schema', optional=False)) template.add(target) # [zookeeper] zookeeper = cfg.TemplateNodeFixed('zookeeper', optional=False) zookeeper.add(cfg.TemplateAttributeFixed('zk_host', optional=False)) template.add(zookeeper) # [sources] sources = cfg.TemplateNodeVariableAttr( 'sources', cfg.TemplateAttributeVariable( validator=lambda x: x.upper() in ['YES', 'NO']), optional=False) template.add(sources) # Source spec def source_spec_validator(spec): if spec['method'] == 'local' and 'file_dir' not in spec.keys(): print 'Missing mandatory file_dir attribute' return False elif spec['method'] in ['ftp', 'sftp', 'http', 's3' ] and 'url' not in spec.keys(): print 'Missing mandatory url attribute' return False if 'reimport' in spec.keys() and spec['reimport'].upper() == 'YES': if 'reimport_start' not in spec.keys( ) or 'reimport_end' not in spec.keys(): print 'Missing reimport_start or reimport_end attribute(s)' return False elif spec['reimport_start'] > spec['reimport_end']: print 'reimport_start cannot be greater than reimport_end' return False if 'file_post_type' in spec.keys(): if (spec['file_post_type'].upper() == 'SQL' and 'file_post_sql' not in spec.keys())\ or (spec['file_post_type'].upper() == 'SCRIPT' and 'file_post_script' not in spec.keys()): print 'Missing correct file post processing attribute' return False if 'src_post_type' in spec.keys(): if (spec['src_post_type'].upper() == 'SQL' and 'src_post_sql' not in spec.keys())\ or (spec['src_post_type'].upper() == 'SCRIPT' and 'src_post_script' not in spec.keys()): print 'Missing correct source post processing attribute' return False return True source_spec = cfg.TemplateNodeFixed('source_spec', optional=False, validator=source_spec_validator) source_spec.add( cfg.TemplateAttributeFixed( 'method', optional=False, validator=lambda x: x in ['local', 'ftp', 'sftp', 'http', 's3'])) source_spec.add(cfg.TemplateAttributeFixed('file_dir')) source_spec.add(cfg.TemplateAttributeFixed('filename', optional=False)) source_spec.add(cfg.TemplateAttributeFixed('fileext', optional=False)) source_spec.add(cfg.TemplateAttributeFixed('source_tag', optional=False)) source_spec.add( cfg.TemplateAttributeFixed('file_date_lag', value_type=int, default_value=0)) source_spec.add( cfg.TemplateAttributeFixed('csv_header_row', value_type=int, default_value=0)) source_spec.add( cfg.TemplateAttributeFixed('csv_encoding', default_value='utf-8')) source_spec.add(cfg.TemplateAttributeFixed('csv_sep', default_value=',')) source_spec.add(cfg.TemplateAttributeFixed('csv_date_field')) source_spec.add(cfg.TemplateAttributeFixed('dest_table', optional=False)) source_spec.add(cfg.TemplateAttributeFixed('start_date', optional=False)) source_spec.add( cfg.TemplateAttributeFixed('start_interval', value_type=int, default_value=0)) source_spec.add( cfg.TemplateAttributeFixed( 'granularity', default_value='D', validator=lambda x: x in ['D', 'H', '30', '15'])) source_spec.add( cfg.TemplateAttributeFixed( 'reimport', default_value='no', validator=lambda x: x.upper() in ['YES', 'NO'])) source_spec.add(cfg.TemplateAttributeFixed('reimport_start')) source_spec.add(cfg.TemplateAttributeFixed('reimport_end')) source_list = cfg.get('/sources').keys() print source_list template.add(cfg.TemplateNodeSet('source_spec', source_spec, source_list)) def source_field_spec_validator(value): sizes = { 'identity': 5, 'integer': 2, 'float': 2, 'varchar': 3, 'date': 2, 'datetime': 2 } if len(value) < 2: print 'Field spec cannot be empty or have less than 2 elements' return False elif value[0] == 'S_filedate': if len(value) != 3 or value[1] != 'date': print 'S_filedate fieldspec misconfigured' return False elif value[0] == 'S_constant': if len(value) != sizes[value[1]] + 1: print '%s fieldspec should have %d attributes' % ( value[0], sizes[value[1]] + 1) return False elif len(value) != sizes[value[1]]: print '%s fieldspec should have %d attributes' % (value[0], sizes[value[1]]) return False elif value[0] == 'S_ignore' and value[1] != 'identity': print 'S_ignore fieldspec misconfigured' return False if value[0] == 'S_interval' and value[1] != 'integer': print 'S_interval should be an integer data type' return False elif value[0] == 'S_datetime' and value[1] != 'datetime': print 'S_datetime should be a datetime data type' return False return True source_field_spec = cfg.TemplateNodeVariableAttr( 'field_attr', cfg.TemplateAttributeVariable(value_type=list, validator=source_field_spec_validator), optional=False) template.add( cfg.TemplateNodeSet('source_field_spec', source_field_spec, [x + '_fields' for x in source_list])) print template.sample() print template.sample('TEXT') assert template.validate(cfg.root())
def test_check_template_invalid_template_node_no_content(): template = cfg.TemplateNodeFixed('empty_node') with nose.tools.assert_raises_regexp( ValueError, 'Template for node empty_node has no attributes') as e: template.validate(config.ConfigNode('empty_node'))