Rearranged file structure. Separated App code from Terraform code.
This commit is contained in:
13
app/Dockerfile
Normal file
13
app/Dockerfile
Normal file
@@ -0,0 +1,13 @@
|
||||
FROM python:3.13-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY requirements.txt .
|
||||
|
||||
RUN pip install --root-user-action=ignore --no-cache-dir -r requirements.txt
|
||||
|
||||
COPY image-chooser.py .
|
||||
COPY ./entrypoint.sh /
|
||||
|
||||
ENTRYPOINT [ "/entrypoint.sh" ]
|
||||
CMD [ "run", "image-chooser.py" ]
|
||||
8
app/entrypoint.sh
Executable file
8
app/entrypoint.sh
Executable file
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ "$1" = "-s" ] || [ "$1" = "--shell" ]; then
|
||||
shift
|
||||
exec bash $@
|
||||
fi
|
||||
|
||||
exec streamlit $@
|
||||
88
app/image-chooser.py
Normal file
88
app/image-chooser.py
Normal file
@@ -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 = "c885a276-c882-483f-b216-42f73715161d"
|
||||
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"})
|
||||
3
app/requirements.txt
Normal file
3
app/requirements.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
streamlit
|
||||
azure-identity
|
||||
azure-mgmt-compute
|
||||
Reference in New Issue
Block a user