From 73c87a733b281b670f8cb13f93042a19fd67cfd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awek=20Koszewski?= Date: Thu, 14 Aug 2025 15:52:05 +0000 Subject: [PATCH] Added first application version (draft) --- image-chooser.py | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 image-chooser.py diff --git a/image-chooser.py b/image-chooser.py new file mode 100644 index 0000000..3c71604 --- /dev/null +++ b/image-chooser.py @@ -0,0 +1,88 @@ +import streamlit as st +import pandas as pd +import re +from azure.identity import DefaultAzureCredential +from azure.mgmt.compute import ComputeManagementClient + +def clear_offers(): + if 'offers' in st.session_state: del st.session_state.offers + if 'selected_offer' in st.session_state: del st.session_state.selected_offer + clear_skus() + +def clear_selected_sku(): + if 'selected_sku' in st.session_state: del st.session_state.selected_sku + +def clear_skus(): + if 'skus' in st.session_state: del st.session_state.skus + clear_selected_sku() + +@st.cache_data +def get_publishers(location: str): + return [publisher.name for publisher in compute_client.virtual_machine_images.list_publishers(location)] + +@st.cache_data +def get_offers(location: str, publisher: str): + return [offer.name for offer in compute_client.virtual_machine_images.list_offers(location, publisher)] + +@st.cache_data +def get_skus(location: str, publisher: str, offer: str): + return [sku.name for sku in compute_client.virtual_machine_images.list_skus(location, publisher, offer)] + +@st.cache_data +def get_image_versions(location: str, publisher: str, offer: str, sku: str): + return [version.name for version in compute_client.virtual_machine_images.list(location, publisher, offer, sku)] + +subscription_id = "046a1c08-9940-48c0-893c-77eccd7e875d" +location = "westeurope" + +credential = DefaultAzureCredential() +compute_client = ComputeManagementClient(credential, subscription_id) + +st.set_page_config(page_title='Azure Image Chooser', layout='wide') + +st.title('Azure Image Chooser') + +left_col, middle_col, right_col = st.columns(3) + +if 'publishers' not in st.session_state: + st.session_state.publishers = get_publishers(location) + clear_offers() + +selected_publisher = left_col.selectbox('Select Publisher', options=st.session_state.publishers) + +if 'selected_publisher' not in st.session_state or selected_publisher != st.session_state.selected_publisher: + st.session_state.selected_publisher = selected_publisher + clear_offers() + +if 'offers' not in st.session_state: + st.session_state.offers = get_offers(location, st.session_state.selected_publisher) + clear_skus() + +selected_offer = middle_col.selectbox('Select Offer', options=st.session_state.offers) + +if 'selected_offer' not in st.session_state or selected_offer != st.session_state.selected_offer: + st.session_state.selected_offer = selected_offer + clear_skus() + +if 'skus' not in st.session_state: + st.session_state.skus = get_skus(location, st.session_state.selected_publisher, st.session_state.selected_offer) + clear_selected_sku() + +selected_sku = right_col.selectbox('Select SKU', options=st.session_state.skus) + +if 'selected_sku' not in st.session_state or selected_sku != st.session_state.selected_sku: + st.session_state.selected_sku = selected_sku + +def version_key(v): + return [int(x) for x in v.split('.')] + +regex = re.compile(r'^[0-9]+\.[0-9]+\.[0-9]+$') + +# Display available image versions +images_versions = get_image_versions(location, st.session_state.selected_publisher, st.session_state.selected_offer, st.session_state.selected_sku) + +# Check if all image version string match the re. +if all(regex.match(version) for version in images_versions): + images_versions = sorted(images_versions, key=version_key) + +st.dataframe(images_versions, hide_index=True, column_config={"value": "Image Version"})