| name | fabric-slice-manage |
| description | List, inspect, renew, modify, and delete FABRIC experiment slices |
| allowed-tools | ["Read","Grep","Glob","Write","Edit","Bash"] |
Instructions
When invoked, generate code for FABRIC slice lifecycle management operations. Determine which operation the user needs:
- List: Show all slices or filter by state
- Inspect: Get details of a specific slice (nodes, networks, interfaces)
- Renew: Extend a slice lease
- Modify: Add or remove nodes/networks from a running slice
- Delete: Remove a slice or all slices
Always assume FABlib is initialized as fablib.
API Reference
Listing Slices
fablib.list_slices(
excludes: list[SliceState] = None,
output: str = None,
fields: list[str] = None,
quiet: bool = False,
filter_function=None,
pretty_names: bool = True,
)
Getting a Slice
slice = fablib.get_slice(name="my-slice")
slice = fablib.get_slice(slice_id="abc-123-def")
slices = fablib.get_slices(
excludes: list[SliceState] = None,
slice_name: str = None,
slice_id: str = None,
user_only: bool = True,
)
Slice Information
slice.show(fields=None, output=None, quiet=False, colors=False, pretty_names=True)
slice.list_nodes(output=None, fields=None, colors=False, quiet=False, filter_function=None, pretty_names=True)
slice.list_networks(output=None, fields=None, colors=False, quiet=False, filter_function=None, pretty_names=True)
slice.list_interfaces(output=None, fields=None, quiet=False, filter_function=None, pretty_names=True, refresh=False)
Accessing Nodes
node = slice.get_node(name="node1")
nodes = slice.get_nodes()
stdout, stderr = node.execute("hostname")
print(node.get_ssh_command())
print(node.get_management_ip())
Renewing a Slice
slice.renew(days=14)
from datetime import datetime, timezone, timedelta
end_date = (datetime.now(timezone.utc) + timedelta(days=6)).strftime("%Y-%m-%d %H:%M:%S %z")
slice.renew(end_date=end_date)
Modifying a Slice
new_node = slice.add_node(name="node3", site="TACC", cores=4, ram=16, disk=50)
slice.modify(
wait=True,
wait_timeout=600,
wait_interval=10,
progress=True,
post_boot_config=True,
)
slice.modify_accept()
Deleting Slices
slice.delete()
fablib.delete_all(progress=True)
Slice States
from fabrictestbed.slice_manager import SliceState
SSH-Related Methods
slice.wait_ssh(timeout=1800, interval=20, progress=False)
slice.test_ssh() -> bool
slice.post_boot_config()
slice.update()
Patterns
List Active Slices
fablib.list_slices()
List Only Running Slices
from fabrictestbed.slice_manager import SliceState
fablib.list_slices(
excludes=[SliceState.Dead, SliceState.Closing],
output="text",
)
Filter Slices by State
fablib.list_slices(
filter_function=lambda x: x["state"] == "StableOK"
)
List as Python Objects
slice_list = fablib.list_slices(output="list", quiet=True)
for s in slice_list:
print(f"Slice: {s['id']}, {s['name']}, {s['state']}")
Inspect a Slice
slice = fablib.get_slice(name="my-experiment")
slice.show()
print("\n--- Nodes ---")
slice.list_nodes()
print("\n--- Networks ---")
slice.list_networks()
print("\n--- Interfaces ---")
slice.list_interfaces()
Renew a Slice
from datetime import datetime, timezone, timedelta
slice = fablib.get_slice(name="my-experiment")
slice.renew(days=14)
print(f"Lease End: {slice.get_lease_end()}")
Execute Commands on All Nodes
slice = fablib.get_slice(name="my-experiment")
for node in slice.get_nodes():
stdout, stderr = node.execute("uname -a")
print(f"{node.get_name()}: {stdout}")
Upload/Download Files
node = slice.get_node(name="node1")
node.upload_file("local_script.sh", "/home/ubuntu/script.sh")
node.execute("chmod +x /home/ubuntu/script.sh && /home/ubuntu/script.sh")
node.download_file("local_results.tar.gz", "/home/ubuntu/results.tar.gz")
Add Node to Existing Slice
slice = fablib.get_slice(name="my-experiment")
new_node = slice.add_node(name="worker3", site="TACC", cores=8, ram=32, disk=100)
slice.modify()
slice.modify_accept()
slice.list_nodes()
Delete a Slice
slice = fablib.get_slice(name="my-experiment")
slice.delete()
print("Slice deleted successfully")
Delete All Slices
fablib.delete_all(progress=True)
Reconnect After Reboot
slice.wait_ssh(timeout=360, interval=10, progress=True)
slice.update()
slice.test_ssh()