From 3107907644e3d00715577394488ea7e67276a994 Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Thu, 30 Jan 2025 17:29:51 -0800
Subject: [PATCH 01/12] Create setup.py structure for pip package

---
 ibpc_py/README.md                   | 24 ++++++++++++++++++++
 ibpc_py/setup.py                    | 34 +++++++++++++++++++++++++++++
 ibpc_py/src/ibpc/__init__.py        |  0
 ibpc.py => ibpc_py/src/ibpc/ibpc.py |  4 ----
 4 files changed, 58 insertions(+), 4 deletions(-)
 create mode 100644 ibpc_py/README.md
 create mode 100644 ibpc_py/setup.py
 create mode 100644 ibpc_py/src/ibpc/__init__.py
 rename ibpc.py => ibpc_py/src/ibpc/ibpc.py (98%)

diff --git a/ibpc_py/README.md b/ibpc_py/README.md
new file mode 100644
index 00000000..6438d02f
--- /dev/null
+++ b/ibpc_py/README.md
@@ -0,0 +1,24 @@
+# Industrial Bin Picking Challenge (IBPC)
+
+This is the python entrypoint for the Industrial Bin Picking Challenge
+
+## Usage
+
+`ibpc <Pose Estimator Image Name> ~/<Path to dataset to test>`
+
+`ibpc ibpc:pose_estimator ~/ws/ibpc/lm`
+
+
+## Prerequisites
+
+
+### Install the package:
+
+In a virtualenv
+`pip install ibpc`
+
+
+### Nvidia Docker (optoinal)
+Make sure nvidia_docker is installed if you want cuda. 
+
+Add `--cuda` to your command line options
\ No newline at end of file
diff --git a/ibpc_py/setup.py b/ibpc_py/setup.py
new file mode 100644
index 00000000..659ff295
--- /dev/null
+++ b/ibpc_py/setup.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+
+import os
+import setuptools
+
+with open("README.md", "r") as fh:
+    long_description = fh.read()
+
+
+setuptools.setup(
+    name='ibpc',
+    version="0.0.1",
+    packages=['ibpc'],
+    package_dir={'': 'src'},
+    # package_data={'ibpc': ['templates/*.em']},
+    author="Tully Foote",
+    author_email="tullyfoote@intrinsic.ai",
+    description="An entrypoint for the Industrial Bin Picking Challenge",
+    long_description=long_description,
+    long_description_content_type="text/markdown",
+    url="https://bpc.opencv.org/",
+    license='Apache 2.0',
+    install_requires=[
+        'empy',
+        'rocker>=0.2.13',
+    ],
+    install_package_data=True,
+    zip_safe=False,
+    entry_points={
+        'console_scripts': [
+            'ibpc = ibpc.ibpc:main',
+	    ],
+    }
+)
\ No newline at end of file
diff --git a/ibpc_py/src/ibpc/__init__.py b/ibpc_py/src/ibpc/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/ibpc.py b/ibpc_py/src/ibpc/ibpc.py
similarity index 98%
rename from ibpc.py
rename to ibpc_py/src/ibpc/ibpc.py
index 4c0475c1..43a19d2c 100644
--- a/ibpc.py
+++ b/ibpc_py/src/ibpc/ibpc.py
@@ -104,7 +104,3 @@ def run_instance(dig_instance, args):
     result = dig.run(**args_dict)
     # TODO clean up threads here
     return result
-
-
-if __name__ == "__main__":
-    main()

From 4c697239ff4e65a77c7342547c5a83b7eb663d45 Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Thu, 30 Jan 2025 17:45:15 -0800
Subject: [PATCH 02/12] tempoarry workaround rocker release pending

---
 ibpc_py/README.md | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/ibpc_py/README.md b/ibpc_py/README.md
index 6438d02f..4daa5029 100644
--- a/ibpc_py/README.md
+++ b/ibpc_py/README.md
@@ -17,6 +17,9 @@ This is the python entrypoint for the Industrial Bin Picking Challenge
 In a virtualenv
 `pip install ibpc`
 
+Temporary before rocker release of https://github.com/osrf/rocker/pull/317/ 
+`pip uninstall rocker && pip install git+http://github.com/osrf/rocker.git@console_to_file`
+
 
 ### Nvidia Docker (optoinal)
 Make sure nvidia_docker is installed if you want cuda. 

From 057ae80c827f285705bfad070bbe21e3bff2b151 Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Thu, 30 Jan 2025 21:45:18 -0800
Subject: [PATCH 03/12] formatting

---
 ibpc_py/setup.py | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/ibpc_py/setup.py b/ibpc_py/setup.py
index 659ff295..4b812eae 100644
--- a/ibpc_py/setup.py
+++ b/ibpc_py/setup.py
@@ -8,10 +8,10 @@
 
 
 setuptools.setup(
-    name='ibpc',
+    name="ibpc",
     version="0.0.1",
-    packages=['ibpc'],
-    package_dir={'': 'src'},
+    packages=["ibpc"],
+    package_dir={"": "src"},
     # package_data={'ibpc': ['templates/*.em']},
     author="Tully Foote",
     author_email="tullyfoote@intrinsic.ai",
@@ -19,16 +19,16 @@
     long_description=long_description,
     long_description_content_type="text/markdown",
     url="https://bpc.opencv.org/",
-    license='Apache 2.0',
+    license="Apache 2.0",
     install_requires=[
-        'empy',
-        'rocker>=0.2.13',
+        "empy",
+        "rocker>=0.2.13",
     ],
     install_package_data=True,
     zip_safe=False,
     entry_points={
-        'console_scripts': [
-            'ibpc = ibpc.ibpc:main',
-	    ],
-    }
-)
\ No newline at end of file
+        "console_scripts": [
+            "ibpc = ibpc.ibpc:main",
+        ],
+    },
+)

From e959f9c06d356bd046d86ab97a07362be4803e53 Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Thu, 30 Jan 2025 22:06:36 -0800
Subject: [PATCH 04/12] remove debugging slowdowns and resolved todos

---
 ibpc_py/src/ibpc/ibpc.py | 13 ++-----------
 1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py
index 43a19d2c..d1b91210 100644
--- a/ibpc_py/src/ibpc/ibpc.py
+++ b/ibpc_py/src/ibpc/ibpc.py
@@ -76,20 +76,10 @@ def run_instance(dig_instance, args):
     tester_thread = threading.Thread(target=run_instance, args=(dig_zenoh, zenoh_args))
     tester_thread.start()
 
-    # TODO Redirect stdout
-    import time
-
-    time.sleep(3)
-
     tester_thread = threading.Thread(
         target=run_instance, args=(dig_tester, tester_args)
     )
     tester_thread.start()
-    # TODO Redirect stdout
-
-    import time
-
-    time.sleep(3)
 
     dig = DockerImageGenerator(active_extensions, args_dict, args_dict["test_image"])
 
@@ -102,5 +92,6 @@ def run_instance(dig_instance, args):
         args_dict["command"] = "bash"
 
     result = dig.run(**args_dict)
-    # TODO clean up threads here
+    # TODO clean up th            "bpc = ibpc.ibpc:main",
+reads here
     return result

From d9f2d04464f73a05bd154de7bc43b86d4b0c6b30 Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Thu, 30 Jan 2025 22:23:07 -0800
Subject: [PATCH 05/12] add subcommand test

---
 ibpc_py/README.md        |  4 ++--
 ibpc_py/src/ibpc/ibpc.py | 23 +++++++++++++----------
 2 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/ibpc_py/README.md b/ibpc_py/README.md
index 4daa5029..259b6b56 100644
--- a/ibpc_py/README.md
+++ b/ibpc_py/README.md
@@ -4,9 +4,9 @@ This is the python entrypoint for the Industrial Bin Picking Challenge
 
 ## Usage
 
-`ibpc <Pose Estimator Image Name> ~/<Path to dataset to test>`
+`ibpc test <Pose Estimator Image Name> ~/<Path to dataset to test>`
 
-`ibpc ibpc:pose_estimator ~/ws/ibpc/lm`
+`ibpc test ibpc:pose_estimator ~/ws/ibpc/lm`
 
 
 ## Prerequisites
diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py
index d1b91210..4bf10759 100644
--- a/ibpc_py/src/ibpc/ibpc.py
+++ b/ibpc_py/src/ibpc/ibpc.py
@@ -11,22 +11,26 @@
 
 def main():
 
-    parser = argparse.ArgumentParser(
+    main_parser = argparse.ArgumentParser(
         description="The entry point for the Bin Picking Challenge",
         formatter_class=argparse.ArgumentDefaultsHelpFormatter,
     )
-    parser.add_argument("test_image")
-    parser.add_argument("dataset_directory")
-    parser.add_argument(
+    main_parser.add_argument(
         "-v", "--version", action="version", version="%(prog)s " + get_rocker_version()
     )
-    parser.add_argument("--debug-inside", action="store_true")
+
+    sub_parsers= main_parser.add_subparsers(title="test")
+    test_parser = sub_parsers.add_parser("test")
+
+    test_parser.add_argument("estimator_image")
+    test_parser.add_argument("dataset_directory")
+    test_parser.add_argument("--debug-inside", action="store_true")
 
     extension_manager = RockerExtensionManager()
     default_args = {"cuda": True, "network": "host"}
-    extension_manager.extend_cli_parser(parser, default_args)
+    extension_manager.extend_cli_parser(test_parser, default_args)
 
-    args = parser.parse_args()
+    args = main_parser.parse_args()
     args_dict = vars(args)
 
     # Confirm dataset directory is absolute
@@ -81,7 +85,7 @@ def run_instance(dig_instance, args):
     )
     tester_thread.start()
 
-    dig = DockerImageGenerator(active_extensions, args_dict, args_dict["test_image"])
+    dig = DockerImageGenerator(active_extensions, args_dict, args_dict["estimator_image"])
 
     exit_code = dig.build(**vars(args))
     if exit_code != 0:
@@ -92,6 +96,5 @@ def run_instance(dig_instance, args):
         args_dict["command"] = "bash"
 
     result = dig.run(**args_dict)
-    # TODO clean up th            "bpc = ibpc.ibpc:main",
-reads here
+    # TODO clean up threads here
     return result

From 43fe46b53183143e4ed77668c571b73dda008624 Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Thu, 30 Jan 2025 22:24:33 -0800
Subject: [PATCH 06/12] rename executable to bpc

---
 ibpc_py/README.md | 5 ++---
 ibpc_py/setup.py  | 2 +-
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/ibpc_py/README.md b/ibpc_py/README.md
index 259b6b56..df978cf1 100644
--- a/ibpc_py/README.md
+++ b/ibpc_py/README.md
@@ -4,9 +4,9 @@ This is the python entrypoint for the Industrial Bin Picking Challenge
 
 ## Usage
 
-`ibpc test <Pose Estimator Image Name> ~/<Path to dataset to test>`
+`bpc test <Pose Estimator Image Name> ~/<Path to dataset to test>`
 
-`ibpc test ibpc:pose_estimator ~/ws/ibpc/lm`
+`bpc test ibpc:pose_estimator ~/ws/ibpc/lm`
 
 
 ## Prerequisites
@@ -24,4 +24,3 @@ Temporary before rocker release of https://github.com/osrf/rocker/pull/317/
 ### Nvidia Docker (optoinal)
 Make sure nvidia_docker is installed if you want cuda. 
 
-Add `--cuda` to your command line options
\ No newline at end of file
diff --git a/ibpc_py/setup.py b/ibpc_py/setup.py
index 4b812eae..80e57a05 100644
--- a/ibpc_py/setup.py
+++ b/ibpc_py/setup.py
@@ -28,7 +28,7 @@
     zip_safe=False,
     entry_points={
         "console_scripts": [
-            "ibpc = ibpc.ibpc:main",
+            "bpc = ibpc.ibpc:main",
         ],
     },
 )

From 59c1c5915a78555fd959dad1a98e780cc1b203f3 Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Thu, 30 Jan 2025 22:26:01 -0800
Subject: [PATCH 07/12] formatting fix

---
 ibpc_py/src/ibpc/ibpc.py | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py
index 4bf10759..70b36449 100644
--- a/ibpc_py/src/ibpc/ibpc.py
+++ b/ibpc_py/src/ibpc/ibpc.py
@@ -19,7 +19,7 @@ def main():
         "-v", "--version", action="version", version="%(prog)s " + get_rocker_version()
     )
 
-    sub_parsers= main_parser.add_subparsers(title="test")
+    sub_parsers = main_parser.add_subparsers(title="test")
     test_parser = sub_parsers.add_parser("test")
 
     test_parser.add_argument("estimator_image")
@@ -85,7 +85,9 @@ def run_instance(dig_instance, args):
     )
     tester_thread.start()
 
-    dig = DockerImageGenerator(active_extensions, args_dict, args_dict["estimator_image"])
+    dig = DockerImageGenerator(
+        active_extensions, args_dict, args_dict["estimator_image"]
+    )
 
     exit_code = dig.build(**vars(args))
     if exit_code != 0:

From 68002459bd968ec622fcdee7cbdc4aa99bcc21c8 Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Thu, 30 Jan 2025 22:33:02 -0800
Subject: [PATCH 08/12] 0.0.2 with build and upload notes

---
 ibpc_py/README.md | 7 +++++++
 ibpc_py/setup.py  | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/ibpc_py/README.md b/ibpc_py/README.md
index df978cf1..6be6e28c 100644
--- a/ibpc_py/README.md
+++ b/ibpc_py/README.md
@@ -24,3 +24,10 @@ Temporary before rocker release of https://github.com/osrf/rocker/pull/317/
 ### Nvidia Docker (optoinal)
 Make sure nvidia_docker is installed if you want cuda. 
 
+## Release instructions
+
+```
+rm -rf dist/*
+python3 -m build --sdist .
+twine upload dist/*
+```
\ No newline at end of file
diff --git a/ibpc_py/setup.py b/ibpc_py/setup.py
index 80e57a05..08654a56 100644
--- a/ibpc_py/setup.py
+++ b/ibpc_py/setup.py
@@ -9,7 +9,7 @@
 
 setuptools.setup(
     name="ibpc",
-    version="0.0.1",
+    version="0.0.2",
     packages=["ibpc"],
     package_dir={"": "src"},
     # package_data={'ibpc': ['templates/*.em']},

From e342bb458cb48423ea9c8aac7c3036e7dc57d2ea Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Fri, 31 Jan 2025 00:04:19 -0800
Subject: [PATCH 09/12] add fetch subcommand with support for lm

---
 ibpc_py/src/ibpc/ibpc.py | 37 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py
index 70b36449..ff0b5a36 100644
--- a/ibpc_py/src/ibpc/ibpc.py
+++ b/ibpc_py/src/ibpc/ibpc.py
@@ -8,6 +8,33 @@
 from rocker.core import RockerExtensionManager
 from rocker.core import OPERATIONS_NON_INTERACTIVE
 
+from io import BytesIO
+from urllib.request import urlopen
+from zipfile import ZipFile
+
+
+def get_bop_template(modelname):
+    return f"https://huggingface.co/datasets/bop-benchmark/datasets/resolve/main/{modelname}/{modelname}"
+
+
+available_datasets = {"lm": get_bop_template("lm")}
+
+bop_suffixes = [
+    "_base.zip",
+    "_models.zip",
+    "_test_all.zip",
+    "_train_pbr.zip",
+]
+
+
+def fetch_bop_dataset(dataset, output_path):
+    for suffix in bop_suffixes:
+
+        url = get_bop_template(dataset) + suffix
+        with urlopen(url) as zipurlfile:
+            with ZipFile(BytesIO(zipurlfile.read())) as zfile:
+                zfile.extractall(output_path)
+
 
 def main():
 
@@ -19,19 +46,27 @@ def main():
         "-v", "--version", action="version", version="%(prog)s " + get_rocker_version()
     )
 
-    sub_parsers = main_parser.add_subparsers(title="test")
+    sub_parsers = main_parser.add_subparsers(title="test", dest="subparser_name")
     test_parser = sub_parsers.add_parser("test")
 
     test_parser.add_argument("estimator_image")
     test_parser.add_argument("dataset_directory")
     test_parser.add_argument("--debug-inside", action="store_true")
 
+    fetch_parser = sub_parsers.add_parser("fetch")
+    fetch_parser.add_argument("dataset", choices=["lm"])
+    fetch_parser.add_argument("--dataset-path", default=".")
+
     extension_manager = RockerExtensionManager()
     default_args = {"cuda": True, "network": "host"}
     extension_manager.extend_cli_parser(test_parser, default_args)
 
     args = main_parser.parse_args()
     args_dict = vars(args)
+    if args.subparser_name == "fetch":
+        print("called fetch_dataset")
+        fetch_bop_dataset(args_dict["dataset"], args_dict["dataset_path"])
+        return
 
     # Confirm dataset directory is absolute
     args_dict["dataset_directory"] = os.path.abspath(args_dict["dataset_directory"])

From 641571ceb68c8d5b9f6d7c1721cf0eeaf1f8f722 Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Fri, 31 Jan 2025 00:39:30 -0800
Subject: [PATCH 10/12] resolve dataset paths

---
 ibpc_py/src/ibpc/ibpc.py | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py
index ff0b5a36..159e52e7 100644
--- a/ibpc_py/src/ibpc/ibpc.py
+++ b/ibpc_py/src/ibpc/ibpc.py
@@ -50,7 +50,8 @@ def main():
     test_parser = sub_parsers.add_parser("test")
 
     test_parser.add_argument("estimator_image")
-    test_parser.add_argument("dataset_directory")
+    test_parser.add_argument("dataset")
+    test_parser.add_argument("--dataset_directory", action="store", default=".")
     test_parser.add_argument("--debug-inside", action="store_true")
 
     fetch_parser = sub_parsers.add_parser("fetch")
@@ -59,13 +60,14 @@ def main():
 
     extension_manager = RockerExtensionManager()
     default_args = {"cuda": True, "network": "host"}
-    extension_manager.extend_cli_parser(test_parser, default_args)
+    # extension_manager.extend_cli_parser(test_parser, default_args)
 
     args = main_parser.parse_args()
     args_dict = vars(args)
     if args.subparser_name == "fetch":
-        print("called fetch_dataset")
+        print(f"Fetching dataset {args_dict['dataset']} to {args_dict['dataset_path']}")
         fetch_bop_dataset(args_dict["dataset"], args_dict["dataset_path"])
+        print("Fetch complete")
         return
 
     # Confirm dataset directory is absolute
@@ -78,10 +80,13 @@ def main():
         "network": "host",
         "extension_blacklist": {},
         "operating_mode": OPERATIONS_NON_INTERACTIVE,
-        "env": [[f"BOP_PATH:/opt/ros/underlay/install/datasets"]],
+        "env": [
+            [f"BOP_PATH:/opt/ros/underlay/install/datasets/{args_dict['dataset']}"],
+            [f"DATASET_NAME:{args_dict['dataset']}"],
+        ],
         "console_output_file": "ibpc_test_output.log",
         "volume": [
-            [f"{args_dict['dataset_directory']}:/opt/ros/underlay/install/datasets/lm"]
+            [f"{args_dict['dataset_directory']}:/opt/ros/underlay/install/datasets"]
         ],
     }
     print("Buiding tester env")
@@ -98,11 +103,13 @@ def main():
         "extension_blacklist": {},
         "console_output_file": "ibpc_zenoh_output.log",
         "operating_mode": OPERATIONS_NON_INTERACTIVE,
+        "volume": [],
     }
+    zenoh_extensions = extension_manager.get_active_extensions(tester_args)
 
     print("Buiding zenoh env")
     dig_zenoh = DockerImageGenerator(
-        tester_extensions, tester_args, "eclipse/zenoh:1.1.1"
+        zenoh_extensions, zenoh_args, "eclipse/zenoh:1.1.1"
     )
     exit_code = dig_zenoh.build(**zenoh_args)
     if exit_code != 0:

From 54b86d351ae9657ec461317f875efe659e1b9296 Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Fri, 31 Jan 2025 00:45:47 -0800
Subject: [PATCH 11/12] update readme

---
 ibpc_py/README.md | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/ibpc_py/README.md b/ibpc_py/README.md
index 6be6e28c..1fa0ded8 100644
--- a/ibpc_py/README.md
+++ b/ibpc_py/README.md
@@ -4,9 +4,14 @@ This is the python entrypoint for the Industrial Bin Picking Challenge
 
 ## Usage
 
-`bpc test <Pose Estimator Image Name> ~/<Path to dataset to test>`
+Get a dataset
+`bpc fetch lm`
 
-`bpc test ibpc:pose_estimator ~/ws/ibpc/lm`
+
+Run tests against a dataset
+`bpc test <Pose Estimator Image Name> <datasetname> `
+
+`bpc test ibpc:pose_estimator lm`
 
 
 ## Prerequisites

From a40640fe9ef6c4a7c2c0e6d2614903675a19a4c5 Mon Sep 17 00:00:00 2001
From: Tully Foote <tullyfoote@intrinsic.ai>
Date: Fri, 31 Jan 2025 14:58:28 -0800
Subject: [PATCH 12/12] downloading ipd

---
 ibpc_py/src/ibpc/ibpc.py | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py
index 159e52e7..f3943dd0 100644
--- a/ibpc_py/src/ibpc/ibpc.py
+++ b/ibpc_py/src/ibpc/ibpc.py
@@ -10,14 +10,15 @@
 
 from io import BytesIO
 from urllib.request import urlopen
+import urllib.request
 from zipfile import ZipFile
 
 
 def get_bop_template(modelname):
     return f"https://huggingface.co/datasets/bop-benchmark/datasets/resolve/main/{modelname}/{modelname}"
 
-
-available_datasets = {"lm": get_bop_template("lm")}
+def get_ipb_template(modelname):
+    return f"https://huggingface.co/datasets/bop-benchmark/{modelname}/resolve/main/{modelname}"
 
 bop_suffixes = [
     "_base.zip",
@@ -26,11 +27,21 @@ def get_bop_template(modelname):
     "_train_pbr.zip",
 ]
 
+ipb_suffixes = [s for s in bop_suffixes]
+ipb_suffixes.append('_val.zip')
+ipb_suffixes.append('_test_all.z01')
+
+available_datasets = {
+    "ipb": (get_ipb_template("ipb"), ipb_suffixes),
+    "lm": (get_bop_template("lm"), bop_suffixes),
+    }
 
-def fetch_bop_dataset(dataset, output_path):
-    for suffix in bop_suffixes:
+def fetch_dataset(dataset, output_path):
+    (url_base, suffixes) = available_datasets[dataset]
+    for suffix in suffixes:
 
-        url = get_bop_template(dataset) + suffix
+        url = url_base + suffix
+        print(f"Downloading from url: {url}")
         with urlopen(url) as zipurlfile:
             with ZipFile(BytesIO(zipurlfile.read())) as zfile:
                 zfile.extractall(output_path)
@@ -55,7 +66,7 @@ def main():
     test_parser.add_argument("--debug-inside", action="store_true")
 
     fetch_parser = sub_parsers.add_parser("fetch")
-    fetch_parser.add_argument("dataset", choices=["lm"])
+    fetch_parser.add_argument("dataset", choices=available_datasets.keys())
     fetch_parser.add_argument("--dataset-path", default=".")
 
     extension_manager = RockerExtensionManager()
@@ -66,7 +77,7 @@ def main():
     args_dict = vars(args)
     if args.subparser_name == "fetch":
         print(f"Fetching dataset {args_dict['dataset']} to {args_dict['dataset_path']}")
-        fetch_bop_dataset(args_dict["dataset"], args_dict["dataset_path"])
+        fetch_dataset(args_dict["dataset"], args_dict["dataset_path"])
         print("Fetch complete")
         return