diff --git a/README.md b/README.md index 6a0882b..7dc0416 100644 --- a/README.md +++ b/README.md @@ -38,9 +38,9 @@ The following properties can be configured: - `SCENARIO_DIRECTORY` - default is `swagger_server/itm/data/%(EVALUATION_TYPE)s/scenarios/` - `SOARTECH_URL` - - default is `http://10.216.38.125:8084` + - default is `http://10.216.38.25:8084` - `ADEPT_URL` - - default is `http://10.216.38.70:8080` + - default is `http://10.216.38.101:8080` - `SAVE_HISTORY` - default is `True` - `HISTORY_DIRECTORY` @@ -49,6 +49,7 @@ The following properties can be configured: - default is `True` - `HISTORY_S3_BUCKET` - default is `itm-ui-assets` +- A variety of ADEPT and SoarTech properties for filenames, scenario IDs, and alignment target IDs *NOTE:* the trailing **`s`** in `.../data/%(EVALUATION_TYPE)s/...` is needed for string interpolation to work properly. @@ -63,12 +64,24 @@ Please note: 3. Use `eval` for evaluation scenarios and `train` for training scenarios; and 4. The `id` should be derived from the scenario ID in the YAML file, although it isn't required, e.g., `qol`, `MJ2`, `urban`, etc. -## Usage -To run the server, please execute the following from the root directory: +## Installation and Usage +To install the server, run: ``` pip3 install -r requirements.txt -python -m swagger_server +``` + +To run the server, please execute from the root directory with the following usage: +``` +usage: python -m swagger_server [-h] [-c CONFIG_GROUP] [-p PORT] + +Specify Config Group, will default to the DEFAULT group + +options: + -h, --help show this help message and exit + -c CONFIG_GROUP, --config_group CONFIG_GROUP + Specify the configuration group in config.ini used to launch the Swagger server (default = DEFAULT) + -p PORT, --port PORT Specify the port the Swagger server will listen on (default = 8080) ``` You can browse the API at: diff --git a/swagger_server/__main__.py b/swagger_server/__main__.py index f9fd1c4..0547856 100644 --- a/swagger_server/__main__.py +++ b/swagger_server/__main__.py @@ -2,19 +2,46 @@ import connexion import os +import argparse +import builtins +import sys +from swagger_server import config_util from swagger_server import encoder PORT = os.getenv("TA3_PORT") + if (PORT is None or PORT == ""): PORT = 8080 -def main(): +def main(args): + + itm_port = PORT if args.port == None else args.port + itm_kwargs = {'title': 'ITM TA3 API'} + + builtins.config_group = args.config_group + app = connexion.App(__name__, specification_dir='../swagger/') app.app.json_encoder = encoder.JSONEncoder - app.add_api('swagger.yaml', arguments={'title': 'ITM TA3 API'}, pythonic_params=True) - app.run(port=PORT) + app.add_api('swagger.yaml', arguments=itm_kwargs, pythonic_params=True) + app.run(port=itm_port) if __name__ == '__main__': - main() + + parser = argparse.ArgumentParser(description='Specify Config Group, will default to the DEFAULT group', usage='python -m swagger_server [-h] -c CONFIG_GROUP -p PORT') + parser.add_argument('-c', '--config_group', dest='config_group', type=str, default="DEFAULT", help='Specify the configuration group in config.ini used to launch the Swagger server (default = DEFAULT)') + parser.add_argument('-p', '--port', dest='port', type=int, default=None, help='Specify the port the Swagger server will listen on (default = 8080)') + args = parser.parse_args() + + #Checking for config_group in config.ini + config_util.check_ini() + config = config_util.read_ini()[0] + if args.config_group not in config: + print("The Config Group `" + args.config_group + "` does not exist in config.ini.") + sys.exit() + + print("Swagger server launching with the `" + args.config_group + "` group (from config.ini)") + + + main(args) diff --git a/swagger_server/config.ini.template b/swagger_server/config.ini.template index b488e5c..4e5bae7 100644 --- a/swagger_server/config.ini.template +++ b/swagger_server/config.ini.template @@ -15,7 +15,7 @@ SCENARIO_DIRECTORY=swagger_server/itm/data/%(EVALUATION_TYPE)s/scenarios/ ; SOARTECH_URL=https://darpaitm.caci.com/soartech ; Prod Default URLs (use on production AWS only) -SOARTECH_URL=http://10.216.38.125:8084 +SOARTECH_URL=http://10.216.38.25:8084 ADEPT_URL=http://10.216.38.101:8080 SAVE_HISTORY=True @@ -118,3 +118,78 @@ ADEPT_IO_ALIGNMENT_TARGETS=ADEPT-DryRun-Ingroup Bias-0.0, ADEPT-DryRun-Ingroup Bias-0.8, ADEPT-DryRun-Ingroup Bias-0.9, ADEPT-DryRun-Ingroup Bias-1.0 + + +[GROUP_TARGET] + +EVALUATION_TYPE=dryrun +SCENARIO_DIRECTORY=swagger_server/itm/data/%(EVALUATION_TYPE)s/scenarios/ + +; Local Default URLs +; ADEPT_URL=http://localhost:8081 +; SOARTECH_URL=http://localhost:8084 + +; AWS TA1 Default URLs (access Prod AWS servers locally) +; ADEPT_URL=https://darpaitm.caci.com/adept +; SOARTECH_URL=https://darpaitm.caci.com/soartech + +; Prod Default URLs (use on production AWS only) +SOARTECH_URL=http://10.216.38.25:8084 +ADEPT_URL=http://10.216.38.101:8080 + +SAVE_HISTORY=True +SAVE_HISTORY_TO_S3=True +; This applies to `soartech` and `adept` non-training sessions +ALWAYS_CONNECT_TO_TA1=True + +HISTORY_DIRECTORY=itm_history_output +HISTORY_S3_BUCKET=itm-ui-assets + +EVAL_NAME=Dry Run Evaluation +EVAL_NUMBER=4 + +SOARTECH_EVAL_FILENAMES=dryrun-soartech-eval-qol1.yaml, + dryrun-soartech-eval-qol2.yaml, + dryrun-soartech-eval-qol3.yaml, + dryrun-soartech-eval-vol1.yaml, + dryrun-soartech-eval-vol2.yaml, + dryrun-soartech-eval-vol3.yaml + +SOARTECH_TRAIN_FILENAMES=dryrun-soartech-train-qol1.yaml, + dryrun-soartech-train-qol2.yaml, + dryrun-soartech-train-vol1.yaml, + dryrun-soartech-train-vol2.yaml + +SOARTECH_EVAL_QOL_SCENARIOS=qol-dre-1-eval,qol-dre-2-eval,qol-dre-3-eval +SOARTECH_EVAL_VOL_SCENARIOS=vol-dre-1-eval,vol-dre-2-eval,vol-dre-3-eval + +SOARTECH_TRAIN_QOL_SCENARIOS=qol-dre-1-train,qol-dre-2-train +SOARTECH_TRAIN_VOL_SCENARIOS=vol-dre-1-train,vol-dre-2-train + +SOARTECH_QOL_ALIGNMENT_TARGETS=qol-group-target-dre-1, + qol-group-target-dre-2 + +SOARTECH_VOL_ALIGNMENT_TARGETS=vol-group-target-dre-1, + vol-group-target-dre-2 + +ADEPT_EVAL_FILENAMES=dryrun-adept-eval-MJ2.yaml, + dryrun-adept-eval-MJ4.yaml, + dryrun-adept-eval-MJ5.yaml + +ADEPT_TRAIN_FILENAMES=dryrun-adept-train-MJ1.yaml, + dryrun-adept-train-MJ3.yaml, + dryrun-adept-train-IO1.yaml, + dryrun-adept-train-IO2.yaml, + dryrun-adept-train-IO3.yaml + +ADEPT_EVAL_MJ_SCENARIOS=DryRunEval-MJ2-eval,DryRunEval-MJ4-eval,DryRunEval-MJ5-eval +ADEPT_EVAL_IO_SCENARIOS=DryRunEval-MJ2-eval,DryRunEval-MJ4-eval,DryRunEval-MJ5-eval + +ADEPT_TRAIN_MJ_SCENARIOS=DryRunEval.MJ1,DryRunEval.MJ3 +ADEPT_TRAIN_IO_SCENARIOS=DryRunEval.IO1,DryRunEval.IO2,DryRunEval.IO3 + +ADEPT_MJ_ALIGNMENT_TARGETS=ADEPT-DryRun-Moral judgement-Group-Low, + ADEPT-DryRun-Moral judgement-Group-High + +ADEPT_IO_ALIGNMENT_TARGETS=ADEPT-DryRun-Ingroup Bias-Group-Low, + ADEPT-DryRun-Ingroup Bias-Group-High \ No newline at end of file diff --git a/swagger_server/itm/itm_history.py b/swagger_server/itm/itm_history.py index ab313f1..9404b14 100644 --- a/swagger_server/itm/itm_history.py +++ b/swagger_server/itm/itm_history.py @@ -4,6 +4,7 @@ import os import time import datetime +import builtins from botocore.exceptions import ClientError from typing import Union @@ -17,12 +18,13 @@ def __init__(self, config): """ Initialize an instance of ITMHistory. """ + config_group = builtins.config_group self.history = [] - self.filepath = config["DEFAULT"]["HISTORY_DIRECTORY"] + os.sep + self.filepath = config[config_group]["HISTORY_DIRECTORY"] + os.sep self.save_history_bucket = config["DEFAULT"]["HISTORY_S3_BUCKET"] self.evaluation_info = { - "evalName": config['DEFAULT']['EVAL_NAME'], - "evalNumber": config['DEFAULT']['EVAL_NUMBER'], + "evalName": config[config_group]['EVAL_NAME'], + "evalNumber": config[config_group]['EVAL_NUMBER'], "created" : str(datetime.datetime.now()) } diff --git a/swagger_server/itm/itm_session.py b/swagger_server/itm/itm_session.py index fc1cd8f..cde68c6 100644 --- a/swagger_server/itm/itm_session.py +++ b/swagger_server/itm/itm_session.py @@ -3,6 +3,7 @@ import random import os import logging +import builtins from datetime import datetime from typing import List from copy import deepcopy @@ -29,28 +30,29 @@ class ITMSession: """ config_util.check_ini() config = config_util.read_ini()[0] + config_group = builtins.config_group # Class variables - EVALUATION_TYPE = config['DEFAULT']['EVALUATION_TYPE'] - EVALUATION_NAME = config['DEFAULT']['EVAL_NAME'] - EVALUATION_NUMBER = config['DEFAULT']['EVAL_NUMBER'] - SCENARIO_DIRECTORY = config['DEFAULT']['SCENARIO_DIRECTORY'] - SOARTECH_EVAL_FILENAMES = config['DEFAULT']['SOARTECH_EVAL_FILENAMES'].replace('\n','').split(',') - SOARTECH_TRAIN_FILENAMES = config['DEFAULT']['SOARTECH_TRAIN_FILENAMES'].replace('\n','').split(',') - SOARTECH_EVAL_QOL_SCENARIOS = config['DEFAULT']['SOARTECH_EVAL_QOL_SCENARIOS'].replace('\n','').split(',') - SOARTECH_EVAL_VOL_SCENARIOS = config['DEFAULT']['SOARTECH_EVAL_VOL_SCENARIOS'].replace('\n','').split(',') - SOARTECH_TRAIN_QOL_SCENARIOS = config['DEFAULT']['SOARTECH_TRAIN_QOL_SCENARIOS'].replace('\n','').split(',') - SOARTECH_TRAIN_VOL_SCENARIOS = config['DEFAULT']['SOARTECH_TRAIN_VOL_SCENARIOS'].replace('\n','').split(',') - SOARTECH_QOL_ALIGNMENT_TARGETS = config['DEFAULT']['SOARTECH_QOL_ALIGNMENT_TARGETS'].replace('\n','').split(',') - SOARTECH_VOL_ALIGNMENT_TARGETS = config['DEFAULT']['SOARTECH_VOL_ALIGNMENT_TARGETS'].replace('\n','').split(',') - ADEPT_EVAL_FILENAMES = config['DEFAULT']['ADEPT_EVAL_FILENAMES'].replace('\n','').split(',') - ADEPT_TRAIN_FILENAMES = config['DEFAULT']['ADEPT_TRAIN_FILENAMES'].replace('\n','').split(',') - ADEPT_EVAL_MJ_SCENARIOS = config['DEFAULT']['ADEPT_EVAL_MJ_SCENARIOS'].replace('\n','').split(',') - ADEPT_EVAL_IO_SCENARIOS = config['DEFAULT']['ADEPT_EVAL_IO_SCENARIOS'].replace('\n','').split(',') - ADEPT_TRAIN_MJ_SCENARIOS = config['DEFAULT']['ADEPT_TRAIN_MJ_SCENARIOS'].replace('\n','').split(',') - ADEPT_TRAIN_IO_SCENARIOS = config['DEFAULT']['ADEPT_TRAIN_IO_SCENARIOS'].replace('\n','').split(',') - ADEPT_MJ_ALIGNMENT_TARGETS = config['DEFAULT']['ADEPT_MJ_ALIGNMENT_TARGETS'].replace('\n','').split(',') - ADEPT_IO_ALIGNMENT_TARGETS = config['DEFAULT']['ADEPT_IO_ALIGNMENT_TARGETS'].replace('\n','').split(',') + EVALUATION_TYPE = config[config_group]['EVALUATION_TYPE'] + EVALUATION_NAME = config[config_group]['EVAL_NAME'] + EVALUATION_NUMBER = config[config_group]['EVAL_NUMBER'] + SCENARIO_DIRECTORY = config[config_group]['SCENARIO_DIRECTORY'] + SOARTECH_EVAL_FILENAMES = config[config_group]['SOARTECH_EVAL_FILENAMES'].replace('\n','').split(',') + SOARTECH_TRAIN_FILENAMES = config[config_group]['SOARTECH_TRAIN_FILENAMES'].replace('\n','').split(',') + SOARTECH_EVAL_QOL_SCENARIOS = config[config_group]['SOARTECH_EVAL_QOL_SCENARIOS'].replace('\n','').split(',') + SOARTECH_EVAL_VOL_SCENARIOS = config[config_group]['SOARTECH_EVAL_VOL_SCENARIOS'].replace('\n','').split(',') + SOARTECH_TRAIN_QOL_SCENARIOS = config[config_group]['SOARTECH_TRAIN_QOL_SCENARIOS'].replace('\n','').split(',') + SOARTECH_TRAIN_VOL_SCENARIOS = config[config_group]['SOARTECH_TRAIN_VOL_SCENARIOS'].replace('\n','').split(',') + SOARTECH_QOL_ALIGNMENT_TARGETS = config[config_group]['SOARTECH_QOL_ALIGNMENT_TARGETS'].replace('\n','').split(',') + SOARTECH_VOL_ALIGNMENT_TARGETS = config[config_group]['SOARTECH_VOL_ALIGNMENT_TARGETS'].replace('\n','').split(',') + ADEPT_EVAL_FILENAMES = config[config_group]['ADEPT_EVAL_FILENAMES'].replace('\n','').split(',') + ADEPT_TRAIN_FILENAMES = config[config_group]['ADEPT_TRAIN_FILENAMES'].replace('\n','').split(',') + ADEPT_EVAL_MJ_SCENARIOS = config[config_group]['ADEPT_EVAL_MJ_SCENARIOS'].replace('\n','').split(',') + ADEPT_EVAL_IO_SCENARIOS = config[config_group]['ADEPT_EVAL_IO_SCENARIOS'].replace('\n','').split(',') + ADEPT_TRAIN_MJ_SCENARIOS = config[config_group]['ADEPT_TRAIN_MJ_SCENARIOS'].replace('\n','').split(',') + ADEPT_TRAIN_IO_SCENARIOS = config[config_group]['ADEPT_TRAIN_IO_SCENARIOS'].replace('\n','').split(',') + ADEPT_MJ_ALIGNMENT_TARGETS = config[config_group]['ADEPT_MJ_ALIGNMENT_TARGETS'].replace('\n','').split(',') + ADEPT_IO_ALIGNMENT_TARGETS = config[config_group]['ADEPT_IO_ALIGNMENT_TARGETS'].replace('\n','').split(',') local_alignment_targets = {} # alignment_targets baked into server, for use when not connecting to TA1 alignment_data = {} # maps ta1_name to list alignment_targets, used whether connecting to TA1 or not diff --git a/swagger_server/itm/itm_ta1_controller.py b/swagger_server/itm/itm_ta1_controller.py index 6ed3042..995ae8e 100644 --- a/swagger_server/itm/itm_ta1_controller.py +++ b/swagger_server/itm/itm_ta1_controller.py @@ -1,6 +1,7 @@ import requests import json import urllib +import builtins from swagger_server.models.probe_response import ProbeResponse # noqa: F401,E501 from swagger_server.models.alignment_results import AlignmentResults # noqa: F401,E501 from swagger_server.models.alignment_target import AlignmentTarget # noqa: F401,E501 @@ -12,8 +13,10 @@ class ITMTa1Controller: config_util.check_ini() config = config_util.read_ini()[0] - ADEPT_URL = config['DEFAULT']['ADEPT_URL'] - SOARTECH_URL = config['DEFAULT']['SOARTECH_URL'] + config_group = builtins.config_group + + ADEPT_URL = config[config_group]['ADEPT_URL'] + SOARTECH_URL = config[config_group]['SOARTECH_URL'] def __init__(self, alignment_target_id, scene_type, alignment_target = None): self.session_id = ''