Manually add servers (#9)

* Add ability to manually add servers to client

* Misc client cleanup

* Add availability check before adding server to client UI
This commit is contained in:
2023-06-08 08:19:37 -05:00
committed by GitHub
parent f54d665714
commit 05c8ac506c
3 changed files with 35 additions and 16 deletions

View File

@@ -1,12 +1,10 @@
import subprocess
import logging import logging
import requests
import tkinter as tk import tkinter as tk
import threading import threading
import time import time
import socket import socket
import os, sys import os
from tkinter import ttk, messagebox from tkinter import ttk, messagebox, simpledialog
from PIL import Image, ImageTk from PIL import Image, ImageTk
from lib.client.new_job_window import NewJobWindow from lib.client.new_job_window import NewJobWindow
from lib.server.server_proxy import RenderServerProxy from lib.server.server_proxy import RenderServerProxy
@@ -42,6 +40,7 @@ class DashboardWindow:
self.local_host = socket.gethostname() self.local_host = socket.gethostname()
self.server_proxy = RenderServerProxy(hostname=self.local_host) self.server_proxy = RenderServerProxy(hostname=self.local_host)
self.job_cache = [] self.job_cache = []
self.added_hostnames = []
# Setup zeroconf # Setup zeroconf
self.zeroconf = ZeroconfServer("_zordon._tcp.local.", socket.gethostname(), 8080) self.zeroconf = ZeroconfServer("_zordon._tcp.local.", socket.gethostname(), 8080)
@@ -58,13 +57,21 @@ class DashboardWindow:
server_frame.pack(fill=tk.BOTH, pady=5, padx=5, expand=True) server_frame.pack(fill=tk.BOTH, pady=5, padx=5, expand=True)
# Create server tree # Create server tree
self.server_tree = ttk.Treeview(server_frame, show="headings") left_frame = tk.Frame(server_frame)
self.server_tree.pack(side=tk.LEFT, expand=True, fill=tk.BOTH) left_frame.pack(side=tk.LEFT, expand=True, fill=tk.BOTH)
self.server_tree = ttk.Treeview(left_frame, show="headings")
self.server_tree.pack(expand=True, fill=tk.BOTH)
self.server_tree["columns"] = ("Server") self.server_tree["columns"] = ("Server")
self.server_tree.column("Server", width=50) self.server_tree.column("Server", width=50)
self.server_tree.bind("<<TreeviewSelect>>", self.server_picked) self.server_tree.bind("<<TreeviewSelect>>", self.server_picked)
self.server_tree.column("Server", width=200) self.server_tree.column("Server", width=200)
make_sortable(self.server_tree)
left_button_frame = tk.Frame(left_frame)
left_button_frame.pack(side=tk.BOTTOM, fill=tk.X, expand=False)
# Create buttons
add_server_button = tk.Button(left_button_frame, text="Add Server", command=self.add_server_button)
add_server_button.pack(side=tk.RIGHT, padx=5, pady=5)
# Create separator # Create separator
separator = ttk.Separator(server_frame, orient=tk.VERTICAL) separator = ttk.Separator(server_frame, orient=tk.VERTICAL)
@@ -96,7 +103,7 @@ class DashboardWindow:
self.job_tree.pack(fill=tk.BOTH, expand=True) self.job_tree.pack(fill=tk.BOTH, expand=True)
button_frame = tk.Frame(server_frame) button_frame = tk.Frame(server_frame)
button_frame.pack(pady=5, fill=tk.BOTH, expand=True) button_frame.pack(pady=5, fill=tk.X, expand=False)
# Create buttons # Create buttons
self.logs_button = tk.Button(button_frame, text="Logs", command=self.open_logs) self.logs_button = tk.Button(button_frame, text="Logs", command=self.open_logs)
@@ -105,8 +112,6 @@ class DashboardWindow:
self.delete_button = tk.Button(button_frame, text="Delete", command=self.delete_job) self.delete_button = tk.Button(button_frame, text="Delete", command=self.delete_job)
add_job_button = tk.Button(button_frame, text="Add Job", command=self.show_new_job_window) add_job_button = tk.Button(button_frame, text="Add Job", command=self.show_new_job_window)
self.stop_button.config(state='disabled')
# Pack the buttons in the frame # Pack the buttons in the frame
self.stop_button.pack(side=tk.LEFT) self.stop_button.pack(side=tk.LEFT)
self.stop_button.config(state='disabled') self.stop_button.config(state='disabled')
@@ -123,6 +128,7 @@ class DashboardWindow:
self.root.maxsize(width=2000, height=1200) self.root.maxsize(width=2000, height=1200)
self.root.minsize(width=900, height=800) self.root.minsize(width=900, height=800)
make_sortable(self.job_tree) make_sortable(self.job_tree)
make_sortable(self.server_tree)
# update jobs # update jobs
self.update_jobs() self.update_jobs()
@@ -145,6 +151,16 @@ class DashboardWindow:
x.daemon = True x.daemon = True
x.start() x.start()
def add_server_button(self):
hostname = simpledialog.askstring("Server Hostname", "Enter the server hostname to add:")
if hostname:
hostname = hostname.strip()
if hostname not in self.added_hostnames:
if RenderServerProxy(hostname=hostname).connect():
self.added_hostnames.append(hostname)
else:
messagebox.showerror("Cannot Connect", f"Cannot connect to server at hostname: '{hostname}'")
def server_picked(self, event): def server_picked(self, event):
try: try:
new_hostname = self.server_tree.selection()[0] new_hostname = self.server_tree.selection()[0]
@@ -250,7 +266,7 @@ class DashboardWindow:
time.sleep(3) time.sleep(3)
def update_servers(self): def update_servers(self):
servers = self.zeroconf.found_clients() servers = list(set(self.zeroconf.found_clients() + self.added_hostnames))
if len(servers) < len(self.server_tree.get_children()): if len(servers) < len(self.server_tree.get_children()):
self.server_tree.delete(*self.server_tree.get_children()) self.server_tree.delete(*self.server_tree.get_children())
for hostname in servers: for hostname in servers:
@@ -268,7 +284,7 @@ class DashboardWindow:
break break
hostname = self.server_proxy.hostname hostname = self.server_proxy.hostname
job_fetch = self.server_proxy.get_jobs() job_fetch = self.server_proxy.get_jobs(ignore_token=clear_table)
# have to check hostname is still valid because of delay in fetching jobs # have to check hostname is still valid because of delay in fetching jobs
if hostname == self.server_proxy.hostname: if hostname == self.server_proxy.hostname:
if job_fetch is not None: if job_fetch is not None:
@@ -285,7 +301,9 @@ class DashboardWindow:
job['priority'], job['priority'],
display_status, display_status,
job['time_elapsed'], job['time_elapsed'],
job['total_frames']) job['total_frames'],
job['date_created'],
job['owner'])
try: try:
if self.job_tree.exists(job['id']): if self.job_tree.exists(job['id']):
update_row(self.job_tree, job['id'], new_values=values, tags=tags) update_row(self.job_tree, job['id'], new_values=values, tags=tags)

View File

@@ -52,8 +52,8 @@ class RenderServerProxy:
def request(self, payload, timeout=5): def request(self, payload, timeout=5):
return requests.get(f'http://{self.hostname}:{self.port}/api/{payload}', timeout=timeout) return requests.get(f'http://{self.hostname}:{self.port}/api/{payload}', timeout=timeout)
def get_jobs(self, timeout=5): def get_jobs(self, timeout=5, ignore_token=False):
url = f'jobs?token={self.__jobs_cache_token}' if self.__jobs_cache_token else 'jobs' url = f'jobs?token={self.__jobs_cache_token}' if self.__jobs_cache_token and not ignore_token else 'jobs'
status_result = self.request_data(url, timeout=timeout) status_result = self.request_data(url, timeout=timeout)
all_jobs = None all_jobs = None
if status_result is not None: if status_result is not None:

View File

@@ -1,3 +1,4 @@
#!/usr/bin/env python3
from lib.client.dashboard_window import start_client from lib.client.dashboard_window import start_client
if __name__ == '__main__': if __name__ == '__main__':