Skip to content

Commit 7321b2c

Browse files
committed
add opa testing to smoke
1 parent af9f8cb commit 7321b2c

4 files changed

Lines changed: 90 additions & 7 deletions

File tree

tests/templates/kuttl/smoke/50-install-opa.yaml.j2

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,36 @@ data:
4848
default partition_allow = false
4949
default user_allow = false
5050

51+
stackable_user := "stackable"
52+
db_name := "test_metastore"
53+
5154
database_allow if {
52-
input.identity.username == "stackable"
55+
input.identity.username == stackable_user
56+
input.resources.database.name == db_name
57+
}
58+
59+
table_allow if {
60+
input.identity.username == stackable_user
61+
input.resources.table.dbName == db_name
62+
input.privileges.writeRequiredPriv[0].priv == "CREATE"
63+
input.resources.table.tableName in ["s3_one_column_table", "one_column_table"]
5364
}
5465

5566
table_allow if {
56-
input.identity.username == "stackable"
67+
input.identity.username == stackable_user
68+
input.resources.table.dbName == db_name
69+
input.privileges.readRequiredPriv[0].priv == "SELECT"
70+
input.resources.table.tableName in ["s3_one_column_table", "one_column_table"]
5771
}
5872

5973
column_allow if {
60-
input.identity.username == "stackable"
74+
input.identity.username == stackable_user
6175
}
6276

6377
partition_allow if {
64-
input.identity.username == "stackable"
78+
input.identity.username == stackable_user
6579
}
6680

6781
user_allow if {
68-
input.identity.username == "stackable"
82+
input.identity.username == stackable_user
6983
}

tests/templates/kuttl/smoke/80-assert.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
apiVersion: kuttl.dev/v1beta1
33
kind: TestAssert
44
commands:
5-
- script: kubectl exec -n "$NAMESPACE" test-metastore-0 -- python /tmp/test_metastore.py -m hive-metastore.$NAMESPACE.svc.cluster.local
6-
- script: kubectl exec -n "$NAMESPACE" test-metastore-0 -- python /tmp/test_metastore.py -m hive-metastore-default-headless.$NAMESPACE.svc.cluster.local
5+
- script: kubectl exec -n "$NAMESPACE" test-metastore-0 -- python /tmp/test_metastore.py -d test_metastore -m hive-metastore.$NAMESPACE.svc.cluster.local
6+
- script: kubectl exec -n "$NAMESPACE" test-metastore-0 -- python /tmp/test_metastore.py -d test_metastore -m hive-metastore-default-headless.$NAMESPACE.svc.cluster.local
7+
- script: kubectl exec -n "$NAMESPACE" test-metastore-0 -- python /tmp/test_metastore_opa.py -d db_not_allowed -m hive-metastore.$NAMESPACE.svc.cluster.local

tests/templates/kuttl/smoke/80-prepare-test-metastore.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ apiVersion: kuttl.dev/v1beta1
33
kind: TestStep
44
commands:
55
- script: kubectl cp -n "$NAMESPACE" ./test_metastore.py test-metastore-0:/tmp
6+
- script: kubectl cp -n "$NAMESPACE" ./test_metastore_opa.py test-metastore-0:/tmp
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#!/usr/bin/env python3
2+
from hive_metastore_client import HiveMetastoreClient
3+
from hive_metastore_client.builders import (
4+
DatabaseBuilder,
5+
ColumnBuilder,
6+
SerDeInfoBuilder,
7+
StorageDescriptorBuilder,
8+
TableBuilder,
9+
)
10+
import argparse
11+
12+
13+
def table(db_name, table_name, location):
14+
columns = [ColumnBuilder("id", "string", "col comment").build()]
15+
16+
serde_info = SerDeInfoBuilder(
17+
serialization_lib="org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe"
18+
).build()
19+
20+
storage_descriptor = StorageDescriptorBuilder(
21+
columns=columns,
22+
location=location,
23+
input_format="org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat",
24+
output_format="org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat",
25+
serde_info=serde_info,
26+
compressed=True,
27+
).build()
28+
29+
test_table = TableBuilder(
30+
db_name=db_name,
31+
table_name=table_name,
32+
storage_descriptor=storage_descriptor,
33+
).build()
34+
35+
return test_table
36+
37+
38+
if __name__ == "__main__":
39+
all_args = argparse.ArgumentParser(description="Test hive-metastore-opa-authorizer and rego rules.")
40+
all_args.add_argument("-p", "--port", help="Metastore server port", default="9083")
41+
all_args.add_argument(
42+
"-d", "--database", help="Test DB name", default="db_not_allowed"
43+
)
44+
all_args.add_argument(
45+
"-m", "--metastore", help="The host or service to connect to", required=True
46+
)
47+
args = vars(all_args.parse_args())
48+
49+
database_name = args["database"]
50+
port = args["port"]
51+
host = args["metastore"]
52+
53+
# Creating database object using builder
54+
database = DatabaseBuilder(database_name).build()
55+
56+
print(f"[INFO] Trying to access '{database_name}' which is expected to fail due to 'database_allow' authorization policy...!")
57+
58+
with HiveMetastoreClient(host, port) as hive_client:
59+
try:
60+
hive_client.create_database_if_not_exists(database)
61+
except Exception as e:
62+
print(f"[DENIED] {e}")
63+
print(f"[SUCCESS] Test hive-metastore-opa-authorizer succeeded. Could not access database '{database_name}'!")
64+
exit(0)
65+
66+
print(f"[ERROR] Test hive-metastore-opa-authorizer failed. Could access database '{database_name}'!")
67+
exit(-1)

0 commit comments

Comments
 (0)