Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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'))
Exemplo n.º 3
0
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})
Exemplo n.º 4
0
def test_check_template_varnode_wrong_attr():
    with nose.tools.assert_raises_regexp(
            ValueError,
            'Attempt to add invalid attribute type to varnode template. This node can contain only one TemplateAttributeVariable attribute template and nothing else'
    ) as e:
        cfg.TemplateNodeVariableAttr('varnode',
                                     cfg.TemplateAttributeFixed('fixedattr'))
Exemplo n.º 5
0
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'))
Exemplo n.º 6
0
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())
Exemplo n.º 7
0
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())
Exemplo n.º 8
0
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())
Exemplo n.º 9
0
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']
Exemplo n.º 10
0
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())
Exemplo n.º 11
0
 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
Exemplo n.º 12
0
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'
Exemplo n.º 13
0
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())
Exemplo n.º 14
0
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())
Exemplo n.º 15
0
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
Exemplo n.º 16
0
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())
Exemplo n.º 17
0
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())