Simplify getParent()
[yangtools.git] / csit / yangtools_test.py
index 136cad522162949c9582a8697cb1396a617d4d1d..b83d2fc06bb09e44f58b785166608bc75e4f5973 100644 (file)
@@ -8,6 +8,9 @@ import datetime
 import os
 import sys, getopt
 import pytest_lib
+import time
+
+start_time = time.time()
 
 def get_java():
     global java_home
@@ -24,18 +27,20 @@ def get_java():
 
 # retrieve args from command
 def main(argv):
-    global log, models
+    global log, models, validator
     log = "N"
     models = "/src/main/yang/"
+    validator = ""
     try:
-        opts, args = getopt.getopt(argv,"hl:m:",["help", "log=","models="])
+        opts, args = getopt.getopt(argv,"hl:m:v:",["help", "log=","models=", "validator="])
     except getopt.GetoptError:
         print("wrong usage type -h or --help for help")
         sys.exit(2)
     for opt, arg in opts:
         if opt == '-h' or opt == '--help':
-            print("Usage: python3 yangtools_test.py [log] [models]")
+            print("Usage: python3 yangtools_test.py [log] [models] [validator_version]")
             print("[log]\n-l, --log=y/n    for delete previous logs in ~/yangtools_csit_test/yang_validator_logs/ (omitting will not delete previous logs)")
+            print("[validator_version]\n-v, --validator=10.0.2    will download yang-model-validator-10.0.0-jar-with-dependencies.jar from nexus.opendaylight.org (omitting will build it locally")
             print("[models]\n-m, --models=/path/to/models/    select directory for testing (omitting will test all models)")
             print('''models option examples:
 /src/main/yang/standard/
@@ -49,6 +54,8 @@ def main(argv):
             log = arg.upper()
         elif opt in ("-m", "--models"):
             models = arg
+        elif opt in ("-v", "--validator"):
+            validator = arg
 
 if __name__ == "__main__":
    main(sys.argv[1:])
@@ -81,49 +88,73 @@ def get_yang_files_to_validate():
     return (yang_files_to_validate)
 
 
-def yang_path_option():
+def get_yang_path():
     global yang_path_option
     yang_path_option = "--path "
     for path in pytest_lib.yang_model_paths:
         yang_path_option += (working_dir + path +  " ")
-    return yang_path_option
-
 
 def download_yang_model_validator():
-    global url, artifact, version, filename
-    urlbase = pytest_lib.NEXUS_RELEASE_BASE_URL
-    location = "org/opendaylight/yangtools"
-    component="yangtools"
-    artifact=pytest_lib.TEST_TOOL_NAME
-    version = "9.0.2"
-    url = urlbase + "/" + location + "/" + artifact + "/" + version
-    name_prefix = f"{artifact}-"
-    suffix="jar-with-dependencies"
-    extension = "tar" if component == "odl-micro" else "jar"
-    name_suffix = f"-{suffix}.{extension}" if suffix != "" else f".{extension}"
-    filename = name_prefix + version + name_suffix
-    if not os.path.exists(working_dir + "/" + filename):
-        url = url + "/" + filename
-        print(f"downloading {filename}")
-        cmd = f"cd {working_dir} && wget -q -N '{url}' 2>&1"
-        os.popen(cmd).read()
+    global validator_file_name, validator
+    # check if validator argument received
+    if validator == "":
+        # check if validator was build with maven or built it
+        if check_maven() and get_validator_file_name():
+            return validator_file_name
+        elif check_maven() and not get_validator_file_name():
+            print("building yang-validator with command 'cd ../ && mvn clean install -pl tools/yang-model-validator/'")
+            print(os.popen(f"cd ../ && mvn clean install -pl tools/yang-model-validator/").read())
+            get_validator_file_name()
+        else:
+            print("MAVEN not found, please install MAVEN first and restart python command")
+            sys.exit()
+    else:
+        validator_file_name = f"yang-model-validator-{validator}-jar-with-dependencies.jar"
+        if validator_file_name in os.popen("ls -la").read():
+            print(f"file {validator_file_name} exist...")
+        else:
+            print(f"downloading {validator_file_name}")
+            print(os.system(f"wget https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/yangtools/yang-model-validator/{validator}/{validator_file_name}"))
+
+
+
+def get_validator_file_name():
+    global validator_file_name, yang_target_dir
+    yang_target_dir = "../tools/yang-model-validator/target/"
+    get_dir_files = os.popen(f"ls {yang_target_dir}").read()
+    if "-SNAPSHOT-jar-with-dependencies.jar" in get_dir_files:
+        for line in get_dir_files.split("\n"):
+            if "-SNAPSHOT-jar-with-dependencies.jar" in line:
+                validator_file_name = line
+                return True
+
+def check_maven():
+    if "Apache Maven" in os.popen("mvn --version").read():
+        return True
 
 
 def yang_files_loop(yang_files_to_validate):
-    global url
+    global yang_path_option, yang_target_dir
+    file_counter = 0
     effective_model_not_resolved, all_not_pass_yang_files, leaf_is_missing, mount_points, following_components = [],[],[],[],[]
     leaf_list_is_missing, statement_has_to_be_present, augment_cannot_add_node_named, augment_target, other = [],[],[],[],[]
     for x in range (0,len(yang_files_to_validate)):
+        file_counter +=1
         print("Working on file: ", yang_files_to_validate[x])
+        print(f"Testing file {file_counter} from total {len(yang_files_to_validate)} files")
+        # update --path option for ietf/RFC/ models to shorten test duration
+        if "/src/main/yang/standard/ietf/RFC" in yang_files_to_validate[x]:
+            yang_path_option = f"--path {working_dir}/src/main/yang/standard/ietf/RFC {working_dir}/src/main/yang/standard/ieee/published/802.1 {working_dir}/src/main/yang/standard/ieee/published/802 {working_dir}/src/main/yang/vendor/ciena "
         tool_options=f" {yang_path_option}-- {yang_files_to_validate[x]}"
-        # set java version based on ip (testing on locallhost)
-        base_command = java_home
-        command = base_command + "  -jar " + working_dir + "/" + filename + tool_options
+        # update command if argument --validator given
+        if validator != "":
+            yang_target_dir =  ""
+        command = java_home + "  -jar " + yang_target_dir + validator_file_name + tool_options
         # generate name for log file
-        name = "yangtools-system-txt"
+        name = "yangtools-log"
         date = datetime.datetime.today()
         timestamp = str(date.timestamp())[:-3]
-        logfile = f"{artifact}--{name}.{timestamp}.log"
+        logfile = f"{name}.{timestamp}.log"
         cmd =  f"{command} > {logfile_path + logfile} 2>&1"
         os.popen(cmd).read()
         # copy log file and print error to console
@@ -175,6 +206,7 @@ def yang_files_loop(yang_files_to_validate):
 
     # print test result counts and save txt list with not pass files
     print("\n\n\n",40 * "*", " TEST RESULTS  ", 40 * "*")
+    print(f"All tested files: {len(yang_files_to_validate)}")
     for x in range(0, len(print_files_count)):
         if print_files_count[x]:
             print(f"{print_files_name[x]} = {len(print_files_count[x])}")
@@ -186,5 +218,6 @@ get_java()
 prepare_enviroment()
 delete_static_paths()
 download_yang_model_validator()
-yang_path_option()
-yang_files_loop(get_yang_files_to_validate())
\ No newline at end of file
+get_yang_path()
+yang_files_loop(get_yang_files_to_validate())
+print("test duration --- %s seconds ---" % (time.time() - start_time))
\ No newline at end of file