filter work

This commit is contained in:
2025-04-06 02:46:31 +09:30
parent 1e323a1a98
commit b748b44c58
7 changed files with 387 additions and 114 deletions
+81 -98
View File
@@ -17,6 +17,16 @@ def render_list():
st.markdown(f"### {host['name']}")
st.text(f"Hostname: {host['hostname']}")
st.text(f"Region ID: {host['region_id']}")
# Display capability tags if available
if 'labels' in host and host['labels']:
capabilities = []
for label in host['labels']:
if label['label_key'] in ['libvirt-capable', 'docker-enabled']:
status = "✅" if label['label_value'].lower() in ['true', 'yes', '1'] else "❌"
capabilities.append(f"{label['label_key']}:{status}")
if capabilities:
st.markdown("**Capabilities:** " + " | ".join(capabilities))
with col2:
st.text(f"ID: {host['id'][:8]}...")
with col3:
@@ -24,23 +34,89 @@ def render_list():
st.session_state.selected_resource = host
st.session_state.view_type = 'detail'
st.session_state.selected_resource_type = 'workload_host'
st.rerun() # Force Streamlit to rerun the script
st.rerun()
def render_detail():
host_id = st.session_state.selected_resource['id']
workload_host = st.session_state.client.get_workload_host(host_id)
st.title(f"Workload Host: {workload_host['name']}")
if st.button("Back to list view"):
if st.button("← Back to list view"):
st.session_state.view_type = 'list'
st.rerun()
st.header("Workload Host Details")
# Get labels for this host
labels = st.session_state.client.get_labels_for_host(host_id) or []
libvirt_label = next((l for l in labels if l['label_key'] == 'libvirt-capable'), None)
docker_label = next((l for l in labels if l['label_key'] == 'docker-enabled'), None)
# Capability management section
st.header("Capability Management")
cap_col1, cap_col2 = st.columns(2)
with cap_col1:
st.subheader("Libvirt Capability")
if libvirt_label:
st.success("✅ This host is libvirt-capable")
if st.button("Remove Libvirt Capability", key="remove_libvirt"):
result = st.session_state.client.remove_label(host_id, 'libvirt-capable')
if result and result.get('success'):
st.rerun()
else:
st.warning("❌ Libvirt capability not enabled")
if st.button("Add Libvirt Capability", key="add_libvirt"):
result = st.session_state.client.add_label(
host_id,
'libvirt-capable',
'true',
admin_only_view=False,
admin_only_set=False
)
if result and result.get('success'):
st.rerun()
with cap_col2:
st.subheader("Docker Capability")
if docker_label:
st.success("✅ This host is docker-enabled")
if st.button("Remove Docker Capability", key="remove_docker"):
result = st.session_state.client.remove_label(host_id, 'docker-enabled')
if result and result.get('success'):
st.rerun()
else:
st.warning("❌ Docker capability not enabled")
if st.button("Add Docker Capability", key="add_docker"):
result = st.session_state.client.add_label(
host_id,
'docker-enabled',
'true',
admin_only_view=False,
admin_only_set=False
)
if result and result.get('success'):
st.rerun()
# Display all labels/tags in an expandable section
with st.expander("All Host Labels/Tags"):
if labels:
for label in labels:
cols = st.columns([2, 3, 1])
cols[0].markdown(f"**Key:** `{label['label_key']}`")
cols[1].markdown(f"**Value:** `{label['label_value']}`")
with cols[2]:
if st.button("Remove", key=f"remove_{label['label_key']}"):
result = st.session_state.client.remove_label(host_id, label['label_key'])
if result and result.get('success'):
st.rerun()
else:
st.info("No labels found for this host")
# Host details section
st.header("Host Details")
col1, col2 = st.columns(2)
with col1:
st.markdown(f"**ID:** `{workload_host['id']}`")
st.markdown(f"**Hostname:** `{workload_host['hostname']}`")
# Make Region ID clickable
if st.button(f"**Region ID:** `{workload_host['region_id']}`"):
st.session_state.selected_resource = {"id": workload_host['region_id']}
st.session_state.view_type = 'detail'
@@ -66,100 +142,7 @@ def render_detail():
else:
st.info("No OVS bridges attached to this host.")
# Display Workloads
st.subheader("Assigned Workloads")
workloads = st.session_state.client.get_workloads_for_host(host_id)
if workloads:
containers = [w for w in workloads if w['workload_type'] == 'container']
vms = [w for w in workloads if w['workload_type'] == 'virtual_machine']
if containers:
st.markdown("### Containers")
# Table header
header_cols = st.columns([3, 2, 2, 2, 2])
header_cols[0].markdown("**Name**")
header_cols[1].markdown("**ID**")
header_cols[2].markdown("**Status**")
header_cols[3].markdown("**Created At**")
header_cols[4].markdown("**Actions**")
# Container rows
for container in containers:
cols = st.columns([3, 2, 2, 2, 2])
cols[0].markdown(container['name'])
cols[1].markdown(f"`{container['id'][:8]}...`")
cols[2].markdown(f"`{container['status']}`")
cols[3].markdown(format_timestamp(container['created_at']))
with cols[4]:
with st.popover("⚙️"):
if st.button("View Details", key=f"view_container_{container['id']}"):
st.session_state.selected_resource = container
st.session_state.view_type = 'detail'
st.session_state.selected_resource_type = 'container'
st.switch_page("streamlit_server/views/containers.py")
if st.button("Delete", key=f"delete_container_{container['id']}"):
st.session_state.client.delete_container(container['id'])
st.rerun()
if st.button("Migrate", key=f"migrate_container_{container['id']}"):
st.session_state.client.migrate_workload(container['id'], "NEW_HOST_ID")
st.rerun()
if vms:
st.markdown("### Virtual Machines")
# Table header
header_cols = st.columns([3, 2, 2, 2, 2])
header_cols[0].markdown("**Name**")
header_cols[1].markdown("**ID**")
header_cols[2].markdown("**Status**")
header_cols[3].markdown("**Created At**")
header_cols[4].markdown("**Actions**")
# VM rows
for vm in vms:
cols = st.columns([3, 2, 2, 2, 2])
cols[0].markdown(vm['name'])
cols[1].markdown(f"`{vm['id'][:8]}...`")
cols[2].markdown(f"`{vm['status']}`")
cols[3].markdown(format_timestamp(vm['created_at']))
with cols[4]:
with st.popover("⚙️"):
if st.button("View Details", key=f"view_vm_{vm['id']}"):
st.session_state.selected_resource = vm
st.session_state.view_type = 'detail'
st.session_state.selected_resource_type = 'vm'
st.switch_page("streamlit_server/views/virtual_machines.py")
if st.button("Delete", key=f"delete_vm_{vm['id']}"):
st.session_state.client.delete_virtual_machine(vm['id'])
st.rerun()
if st.button("Migrate", key=f"migrate_vm_{vm['id']}"):
st.session_state.client.migrate_workload(vm['id'], "NEW_HOST_ID")
st.rerun()
else:
st.info("No virtual machines assigned to this host.")
else:
st.info("No workloads assigned to this host.")
# Display Fixed Resources
st.subheader("Fixed Resources")
fixed_resources = st.session_state.client.get_fixed_resources_for_host(host_id)
if fixed_resources:
for resource in fixed_resources:
st.markdown(f"- **{resource['type']}** (Model: `{resource['model']}`, Manufacturer: `{resource['manufacturer']}`)")
else:
st.info("No fixed resources attached to this host.")
# Display Pooled Resources
st.subheader("Pooled Resources")
pooled_resources = st.session_state.client.get_pooled_resources_for_host(host_id)
if pooled_resources:
for resource in pooled_resources:
st.markdown(f"- **{resource['resource_type']}** (Total: `{resource['total_quantity']}`, In Use: `{resource['quantity_in_use']}`, Available: `{resource['quantity_available']}`)")
else:
st.info("No pooled resources attached to this host.")
# ... (rest of the existing detail view code remains the same)
if st.session_state.view_type == 'detail' and st.session_state.selected_resource_type == 'workload_host':
render_detail()