changed MinerFactory to a singleton class to ensure clearing its cache is easier and removed creation of independant miner factories for each utility

This commit is contained in:
UpstreamData
2022-03-16 12:05:44 -06:00
parent 57bd606f21
commit bae2ee4245
12 changed files with 37 additions and 49 deletions

View File

@@ -37,9 +37,19 @@ from settings import MINER_FACTORY_GET_VERSION_RETRIES as GET_VERSION_RETRIES
class MinerFactory:
_instance = None
def __init__(self):
self.miners = {}
def __new__(cls):
if not cls._instance:
cls._instance = super(
MinerFactory,
cls
).__new__(cls)
return cls._instance
async def get_miner_generator(self, ips: list):
"""
Get Miner objects from ip addresses using an async generator.

View File

@@ -8,7 +8,6 @@ from settings import NETWORK_PING_RETRIES as PING_RETRIES, NETWORK_PING_TIMEOUT
class MinerNetwork:
def __init__(self, ip_addr: str or None = None, mask: str or int or None = None) -> None:
self.network = None
self.miner_factory = MinerFactory()
self.ip_addr = ip_addr
self.connected_miners = {}
self.mask = mask
@@ -50,6 +49,9 @@ class MinerNetwork:
local_network = self.get_network()
print(f"Scanning {local_network} for miners...")
# clear cached miners
MinerFactory().clear_cached_miners()
# create a list of tasks and miner IPs
scan_tasks = []
miner_ips = []
@@ -79,13 +81,10 @@ class MinerNetwork:
# create a list of tasks to get miners
create_miners_tasks = []
# clear cached miners
self.miner_factory.clear_cached_miners()
# try to get each miner found
for miner_ip in miner_ips:
# append to the list of tasks
create_miners_tasks.append(self.miner_factory.get_miner(miner_ip))
create_miners_tasks.append(MinerFactory().get_miner(miner_ip))
# get all miners in the list
miners = await asyncio.gather(*create_miners_tasks)

View File

@@ -16,5 +16,5 @@ whatsminer_pwd = "admin"
### DEBUG MODE ###
# change this to debug = true
# to enable debug mode.
# debug = false
debug = true
debug = false
# debug = true

View File

@@ -1,6 +1,5 @@
# TODO: Add Logging
from tools.bad_board_util.miner_factory import miner_factory
from tools.bad_board_util.ui import ui
import asyncio

View File

@@ -4,7 +4,7 @@ import warnings
from tools.bad_board_util.func.ui import update_ui_with_data, update_prog_bar, set_progress_bar_len
from tools.bad_board_util.layout import window
from tools.bad_board_util.miner_factory import miner_factory
from miners.miner_factory import MinerFactory
async def scan_network(network):
@@ -24,7 +24,7 @@ async def scan_network(network):
asyncio.create_task(update_prog_bar(progress_bar_len))
progress_bar_len += network_size - len(miners)
asyncio.create_task(update_prog_bar(progress_bar_len))
get_miner_genenerator = miner_factory.get_miner_generator(miners)
get_miner_genenerator = MinerFactory().get_miner_generator(miners)
all_miners = []
async for found_miner in get_miner_genenerator:
all_miners.append(found_miner)
@@ -118,7 +118,7 @@ async def scan_and_get_data(network):
asyncio.create_task(update_prog_bar(progress_bar_len))
progress_bar_len += network_size - len(miners)
asyncio.create_task(update_prog_bar(progress_bar_len))
get_miner_genenerator = miner_factory.get_miner_generator(miners)
get_miner_genenerator = MinerFactory().get_miner_generator(miners)
all_miners = []
async for found_miner in get_miner_genenerator:
all_miners.append(found_miner)
@@ -190,7 +190,7 @@ def split_chips(string, number_of_splits):
async def get_formatted_data(ip: ipaddress.ip_address):
miner = await miner_factory.get_miner(ip)
miner = await MinerFactory().get_miner(ip)
model = await miner.get_model()
warnings.filterwarnings('ignore')
board_data = await miner.get_board_info()

View File

@@ -1,7 +0,0 @@
"""
This file stores the MinerFactory instance used by the BadBoardUtility for use in other files.
"""
from miners.miner_factory import MinerFactory
miner_factory = MinerFactory()

View File

@@ -8,7 +8,7 @@ from API import APIError
from tools.cfg_util.cfg_util_sg.func.parse_data import safe_parse_api_data
from tools.cfg_util.cfg_util_sg.func.ui import update_ui_with_data, update_prog_bar, set_progress_bar_len
from tools.cfg_util.cfg_util_sg.layout import window
from tools.cfg_util.cfg_util_sg.miner_factory import miner_factory
from miners.miner_factory import MinerFactory
from config.bos import bos_config_convert
from tools.cfg_util.cfg_util_sg.func.decorators import disable_buttons
from settings import CFG_UTIL_CONFIG_THREADS as CONFIG_THREADS, CFG_UTIL_REBOOT_THREADS as REBOOT_THREADS
@@ -17,7 +17,7 @@ from settings import CFG_UTIL_CONFIG_THREADS as CONFIG_THREADS, CFG_UTIL_REBOOT_
async def import_config(idx):
await update_ui_with_data("status", "Importing")
logging.debug(f"{window['ip_table'].Values[idx[0]][0]}: Importing config.")
miner = await miner_factory.get_miner(ipaddress.ip_address(window["ip_table"].Values[idx[0]][0]))
miner = await MinerFactory().get_miner(ipaddress.ip_address(window["ip_table"].Values[idx[0]][0]))
await miner.get_config()
config = miner.config
await update_ui_with_data("config", str(config))
@@ -48,7 +48,7 @@ async def scan_network(network):
asyncio.create_task(update_prog_bar(progress_bar_len))
progress_bar_len += network_size - len(miners)
asyncio.create_task(update_prog_bar(progress_bar_len))
get_miner_genenerator = miner_factory.get_miner_generator(miners)
get_miner_genenerator = MinerFactory().get_miner_generator(miners)
all_miners = []
async for found_miner in get_miner_genenerator:
all_miners.append(found_miner)
@@ -67,7 +67,7 @@ async def miner_light(ips: list):
async def flip_light(ip):
ip_list = window['ip_table'].Widget
miner = await miner_factory.get_miner(ip)
miner = await MinerFactory().get_miner(ip)
index = [item[0] for item in window["ip_table"].Values].index(ip)
index_tags = ip_list.item(index + 1)['tags']
if "light" not in index_tags:
@@ -101,7 +101,7 @@ async def send_ssh_command(miner, command: str):
async def send_miners_ssh_commands(ips: list, command: str, ssh_cmd_window):
get_miner_genenerator = miner_factory.get_miner_generator(ips)
get_miner_genenerator = MinerFactory().get_miner_generator(ips)
all_miners = []
async for miner in get_miner_genenerator:
all_miners.append(miner)
@@ -146,7 +146,7 @@ async def reboot_miners(ips: list):
await update_ui_with_data("status", "Rebooting")
await set_progress_bar_len(2 * len(ips))
progress_bar_len = 0
get_miner_genenerator = miner_factory.get_miner_generator(ips)
get_miner_genenerator = MinerFactory().get_miner_generator(ips)
all_miners = []
async for miner in get_miner_genenerator:
all_miners.append(miner)
@@ -180,7 +180,7 @@ async def restart_miners_backend(ips: list):
await update_ui_with_data("status", "Restarting Backends")
await set_progress_bar_len(2 * len(ips))
progress_bar_len = 0
get_miner_genenerator = miner_factory.get_miner_generator(ips)
get_miner_genenerator = MinerFactory().get_miner_generator(ips)
all_miners = []
async for miner in get_miner_genenerator:
all_miners.append(miner)
@@ -215,7 +215,7 @@ async def send_config(ips: list, config):
await set_progress_bar_len(2 * len(ips))
progress_bar_len = 0
asyncio.create_task(update_prog_bar(progress_bar_len))
get_miner_genenerator = miner_factory.get_miner_generator(ips)
get_miner_genenerator = MinerFactory().get_miner_generator(ips)
all_miners = []
async for miner in get_miner_genenerator:
all_miners.append(miner)
@@ -290,6 +290,7 @@ async def scan_and_get_data(network):
await update_ui_with_data("ip_table", [])
network_size = len(network)
miner_generator = network.scan_network_generator()
MinerFactory().clear_cached_miners()
logging.info(f"Scanning network: {str(network)}")
@@ -309,7 +310,7 @@ async def scan_and_get_data(network):
logging.debug(f"Found miners: {miners}")
progress_bar_len += network_size - len(miners)
asyncio.create_task(update_prog_bar(progress_bar_len))
get_miner_genenerator = miner_factory.get_miner_generator(miners)
get_miner_genenerator = MinerFactory().get_miner_generator(miners)
all_miners = []
async for found_miner in get_miner_genenerator:
all_miners.append(found_miner)
@@ -346,7 +347,7 @@ async def scan_and_get_data(network):
async def get_formatted_data(ip: ipaddress.ip_address):
miner = await miner_factory.get_miner(ip)
miner = await MinerFactory().get_miner(ip)
logging.debug(f"Getting data for miner: {miner.ip}")
warnings.filterwarnings('ignore')
miner_data = None

View File

@@ -1,7 +0,0 @@
"""
This file stores the MinerFactory instance used by the ConfigUtility for use in other files.
"""
from miners.miner_factory import MinerFactory
miner_factory = MinerFactory()

View File

@@ -1,6 +1,6 @@
import asyncio
from tools.web_monitor.miner_factory import miner_factory
from miners.miner_factory import MinerFactory
from tools.web_monitor._settings.func import get_current_settings
@@ -11,7 +11,7 @@ async def get_miner_data_dashboard(miner_ip):
miner_data_timeout = settings["miner_data_timeout"]
miner_ip = await asyncio.wait_for(
miner_factory.get_miner(miner_ip),
MinerFactory().get_miner(miner_ip),
miner_identify_timeout
)

View File

@@ -4,7 +4,7 @@ import datetime
import websockets.exceptions
from fastapi import WebSocket, WebSocketDisconnect, APIRouter
from tools.web_monitor.miner_factory import miner_factory
from miners.miner_factory import MinerFactory
from tools.web_monitor._settings.func import get_current_settings
@@ -22,7 +22,7 @@ async def miner_websocket(websocket: WebSocket, miner_ip):
while True:
try:
cur_miner = await asyncio.wait_for(
miner_factory.get_miner(str(miner_ip)),
MinerFactory().get_miner(str(miner_ip)),
miner_identify_timeout
)

View File

@@ -1,7 +0,0 @@
"""
This file stores the MinerFactory instance used by the WebMonitor for use in other files.
"""
from miners.miner_factory import MinerFactory
miner_factory = MinerFactory()

View File

@@ -4,7 +4,7 @@ from fastapi import WebSocket
from network import MinerNetwork
from tools.web_monitor.func import get_current_miner_list
from tools.web_monitor.miner_factory import miner_factory
from miners.miner_factory import MinerFactory
async def do_websocket_scan(websocket: WebSocket, network_ip: str):
@@ -21,7 +21,7 @@ async def do_websocket_scan(websocket: WebSocket, network_ip: str):
if miner_ip and str(miner_ip) not in cur_miners:
miners.append(miner_ip)
get_miner_generator = miner_factory.get_miner_generator(miners)
get_miner_generator = MinerFactory().get_miner_generator(miners)
all_miners = []
async for found_miner in get_miner_generator:
all_miners.append(