本程序主要实现hive权限测试。系统中有管理员用户single和测试用户test。在路径/home/test/下,将用例和预期结果写在xml文件中。

        执 行过程:kinit single用户,beeline -u -e登录并执行对test用户对应角色回收和赋予权限的语句;kinit test用户,beeline -u -e去执行测试语句并保存执行结果到tmp文件中;在tmp文件中查找预期关键字,得出该测试pass还是fail的结果,统计测试结果。


#!/usr/bin/python
#coding:utf-8
#by cvv54

import sys
import os
import re

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

try:
    tree = ET.parse("/home/test/case/usecase.xml")
    #root = ET.fromstring(country_string)
    root = tree.getroot()
except Exception,e:
    print "Error:cannot parse file:usecase.xml."
    sys.exit(1)
print root.tag,"---",root.attrib
for child in root:
    print child.tag,"---",child.attrib

passed=0
failed=0    

for case in root.findall('case'):
    pre = case.find('pre').text
    perform = case.find('perform').text
    expect = case.find('expect').text.strip('\n')
    id = case.get("id")

    print "key words are :"    
    print expect

    for each in pre.split(';'):
#        print each
        if not each.strip()=='':
            command = each.strip('\n')
            os.environ['command']=str(command)
            print command
        
            os.system("kdestroy")
            os.system("kinit -kt /etc/security/keytabs/single.keytab single")
            os.system('beeline -u "jdbc:hive2://gateway.xxx.xxx:10000/;principal=single" -e "$command;" &>>log')

    for each in perform.split(';'):
#        print each
        if not each.strip()=='':
            command = each.strip('\n')
            os.environ['command']=str(command)
            print command
        
            os.system("kdestroy")
            os.system("kinit -kt /etc/security/keytabs/test.keytab test")
            os.system('beeline -u "jdbc:hive2://gateway.xxx.xxx:10000/;principal=single" -e "$command;" &>tmp')
   
    f=open('tmp')
    flag=0
    for line in f:
#        print "line is :"
#        print line
        match=re.findall(expect,line)
        if match != []:
            passed+=1
            flag=1
        
    if flag == 0:
        failed+=1            
        print(id)
    
    os.system("cat tmp>>log")
    os.system("rm -f tmp")

print "passed:"
print passed
print "failed:"
print failed

os.system('mv log `date "+%Y-%m-%d~%H-%M-%S"`')



我的xml是这样写的:

<?xml version="1.0" encoding="utf-8"?>

<test>



<case id="001" name="SHOW TABLES">

<pre>

REVOKE ALL ON SERVER server1 FROM ROLE test_role; GRANT ALL ON URI TO ROLE test_role;

</pre>

<perform>

SHOW TABLES;

</perform>

<expect>

tab_name

</expect>

</case>



<case id="002" name="SHOW TABLES">

<pre>

REVOKE ALL ON SERVER server1 FROM ROLE test_role; 

</pre>

<perform>

SHOW TABLES;

</perform>

<expect>

FAILED: SemanticException No valid privileges

</expect>

</case>



<case id="003" name="SHOW CREATE TABLE" privilege="SELECT">

<pre>

CREATE TABLE IF NOT EXISTS test_table1  (id INT,name STRING,salary FLOAT,street STRING,city STRING,state STRING,zip INT) PARTITIONED BY (address STRING) row format delimited fields terminated by ' ';

REVOKE ALL ON SERVER server1 FROM ROLE test_role;GRANT SELECT ON TABLE test_table1 TO ROLE test_role;

</pre>

<perform>

SHOW CREATE TABLE test_table1;

</perform>

<expect>

createtab_stmt 

</expect>

</case>



<case id="004" name="SHOW CREATE TABLE" privilege="INSERT">

<pre>

REVOKE ALL ON SERVER server1 FROM ROLE test_role;GRANT INSERT ON TABLE test_table1 TO ROLE test_role;

</pre>

<perform>

SHOW CREATE TABLE test_table1;

</perform>

<expect>

createtab_stmt 

</expect>

</case>



<case id="005" name="SHOW CREATE TABLE" >

<pre>

REVOKE ALL ON SERVER server1 FROM ROLE test_role;

</pre>

<perform>

SHOW CREATE TABLE test_table1;

</perform>

<expect>

FAILED: SemanticException No valid privileges

</expect>

</case>



</test>