100 lines
4.1 KiB
Python
100 lines
4.1 KiB
Python
import streamlit as st
|
|
import pandas as pd
|
|
from streamlit_server.utils.helpers import format_timestamp
|
|
|
|
def render_list():
|
|
st.header("Network Management")
|
|
|
|
# Create Network Form
|
|
with st.expander("Create New Network"):
|
|
with st.form("create_network"):
|
|
name = st.text_input("Network Name")
|
|
vdcs = st.session_state.client.get_virtual_data_centers()
|
|
vdc_choices = {v['name']: v['id'] for v in vdcs} if vdcs else {}
|
|
selected_vdc = st.selectbox("Select VDC", list(vdc_choices.keys()))
|
|
submit = st.form_submit_button("Create Network")
|
|
|
|
if submit and name and selected_vdc:
|
|
result = st.session_state.client.create_network(name, vdc_choices[selected_vdc])
|
|
if result:
|
|
st.success(f"Network '{name}' created successfully!")
|
|
|
|
# List Networks
|
|
st.subheader("Existing Networks")
|
|
networks = st.session_state.client.get_networks()
|
|
|
|
if networks:
|
|
for network in networks:
|
|
with st.container():
|
|
col1, col2, col3 = st.columns([3, 1, 1])
|
|
with col1:
|
|
st.markdown(f"### {network['name']}")
|
|
st.text(f"Created: {format_timestamp(network['created_at'])}")
|
|
with col2:
|
|
st.text(f"ID: {network['id'][:8]}...")
|
|
with col3:
|
|
if st.button("View Details", key=f"view_{network['id']}"):
|
|
st.session_state.selected_resource = network
|
|
st.session_state.view_type = 'detail'
|
|
st.session_state.selected_resource_type='network'
|
|
st.rerun() # Force Streamlit to rerun the script
|
|
|
|
|
|
|
|
def render_detail():
|
|
network = st.session_state.client.get_network(st.session_state.selected_resource['id'])
|
|
if not network:
|
|
st.error("Network not found.")
|
|
st.session_state.selected_resource = None
|
|
st.session_state.view_type = 'list'
|
|
st.session_state.selected_resource_type = None
|
|
return
|
|
|
|
st.title(f"Network: {network['name']}")
|
|
if st.button("Back to list view"):
|
|
st.session_state.view_type = 'list'
|
|
st.rerun()
|
|
|
|
st.header("Network Details")
|
|
col1, col2 = st.columns(2)
|
|
with col1:
|
|
st.markdown(f"**ID:** `{network['id']}`")
|
|
st.markdown(f"**VDC ID:** `{network['vdc_id']}`")
|
|
st.markdown(f"**Created:** {network.get('created_at', 'Unknown')}")
|
|
st.markdown(f"**IPv4 CIDR:** {network.get('ipv4_cidr', 'N/A')}")
|
|
st.markdown(f"**IPv4 Gateway:** {network.get('ipv4_gateway', 'N/A')}")
|
|
with col2:
|
|
if network.get('updated_at'):
|
|
st.markdown(f"**Last Updated:** {network['updated_at']}")
|
|
if network.get('description'):
|
|
st.markdown(f"**Description:** {network['description']}")
|
|
st.markdown(f"**IPv6 CIDR:** {network.get('ipv6_cidr', 'N/A')}")
|
|
st.markdown(f"**IPv6 Gateway:** {network.get('ipv6_gateway', 'N/A')}")
|
|
|
|
st.header("Network Ports")
|
|
network_ports = st.session_state.client.get_network_ports_by_network(network['id'])
|
|
|
|
if network_ports:
|
|
# Fetch workloads to map workload_id to workload name
|
|
# TODO Enable to fetching of workloads once htey exist
|
|
# workloads = st.session_state.client.get_workloads()
|
|
# workload_map = {workload['id']: workload['name'] for workload in workloads}
|
|
|
|
# Add workload names to each network port entry
|
|
for port in network_ports:
|
|
port['workload_name'] = "Unk" #workload_map.get(port['workload_id'], 'Unknown Workload')
|
|
|
|
# Create a DataFrame with the enriched data
|
|
df = pd.DataFrame(network_ports)
|
|
df = df[[
|
|
'id', 'workload_id', 'workload_name', 'ip_address', 'mac_address',
|
|
'port_type','status'
|
|
]]
|
|
st.dataframe(df, use_container_width=True)
|
|
else:
|
|
st.info("No network ports found for this network.")
|
|
|
|
if st.session_state.view_type == 'detail' and st.session_state.selected_resource_type=='network':
|
|
render_detail()
|
|
else:
|
|
render_list() |