From 43af3125f11fcdd7d5a73255f831694655685c0c Mon Sep 17 00:00:00 2001 From: askiiart Date: Thu, 15 Dec 2022 17:39:32 -0600 Subject: [PATCH] Fix error handling & add custom info printer --- basic_management.py | 156 +++++++++++++++++++++++++++----------------- 1 file changed, 97 insertions(+), 59 deletions(-) diff --git a/basic_management.py b/basic_management.py index 3cb1a0f..adcc2e5 100644 --- a/basic_management.py +++ b/basic_management.py @@ -1,69 +1,107 @@ -from docker_wrapper import Docker -from pprint import pprint +from docker_wrapper import Docker, NoContainersError +from subprocess import getoutput -while True: - # Main Menu - print('Select the container to manage:') - containers = Docker.containers() - for i in range(len(containers)): - print(f' {i} - {containers[i]}') - print(' q - quit') - - container_i = input() - print() - if container_i == 'q': - exit(0) - +def container_to_str(container): + """ + Returns info about a Docker container as a string + :parameters:f + container: The name of the container (str) + + :returns: + str: The container info as a string, formatted for printing + """ + # Header: "CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES" (with way more spaces) + info = Docker.container_info(container) + info_str = f'{container}\n' + info_str += f' CONTAINER ID: {info["CONTAINER ID"]}\n' + info_str += f' IMAGE: {info["IMAGE"]}\n' + info_str += f' COMMAND: {info["COMMAND"]}\n' + info_str += f' CREATED: {info["CREATED"]}\n' + info_str += f' STATUS: {info["STATUS"]}\n' + info_str += f' PORTS: {info["PORTS"]}\n' + info_str += f' NAMES: {info["NAMES"]}' + + return info_str + +try: while True: - # Container Menu - container = containers[int(container_i)] - print() - print(f'You selected {container}. What would you like to do with it?') - print(f' view - View container info - (docker ps -a)') - print(f' start - Starts the container (docker start {container})') - print(f' stop - Stops the container (docker stop {container}') - print(f' rm - Deletes the container (docker rm {container})') - print( ' menu - Back to the main menu') - - selection = input() + if not Docker.containers_exist(): + raise(NoContainersError('No containers exist! Please create a container and try again.')) + + # Main Menu + print('Select the container to manage:') + + containers = Docker.containers() + for i in range(len(containers)): + print(f' {i} - {containers[i]}') + print(' q - Quit') + + container_i = input() print() - if selection == 'menu': - break + if container_i == 'q': + exit(0) - elif selection == 'view': - pprint(Docker.container_info(container)) # TODO: Make better, custom printer + while True: + if not Docker.containers_exist(): + raise(NoContainersError('No containers exist! Please create a container and try again.')) + # Container Menu + container = containers[int(container_i)] + print() + print(f'You selected {container}. What would you like to do with it?') + print(f' view - View container info - (docker ps -a)') + print(f' start - Starts the container (docker start {container})') + print(f' stop - Stops the container (docker stop {container}') + print(f' rm - Deletes the container (docker rm {container})') + print( ' menu - Back to the main menu') - elif selection == 'start': - print('Starting...') - status = Docker.start(container) - - elif selection == 'stop': - print('Stopping...') - status = Docker.stop(container) - print('Done.') - - elif selection == 'rm': - break_later = False - while selection != 'y' and selection != 'n' and selection != 'Y' and selection != 'N': - print(f'WARNING! This will DELETE {container}!') - print(f'Are you absolutely sure you want to delete {container}? (y/N)') - selection = input() - if selection == 'y' or selection == 'Y': - print('Deleting...') - status = Docker.rm(container) - print('Done') - break_later = True - elif selection == 'n' or selection == 'N': - print(f'Operation cancelled, returning to {container} menu...') - if break_later: + selection = input() + print() + + if selection == 'menu': break - elif selection == 'menu': - print('Returning to main menu...') - break + elif selection == 'view': + print(container_to_str(container)) - else: - print('Selection invalid. Please try again.') - print() + elif selection == 'start': + print('Starting...') + Docker.start(container) + + elif selection == 'stop': + print('Stopping...') + Docker.stop(container) + print('Done') + + elif selection == 'rm': + break_later = False + while selection != 'y' and selection != 'n' and selection != 'Y' and selection != 'N': + print(f'WARNING! This will DELETE {container}!') + print( + f'Are you absolutely sure you want to delete {container}? (y/N)') + selection = input() + if selection == 'y' or selection == 'Y': + print('Stopping...') + Docker.stop(container) + print('Deleting...') + Docker.rm(container) + print('Done') + break_later = True + elif selection == 'n' or selection == 'N': + print(f'Operation cancelled, returning to {container} menu...') + if break_later: + print() + break + + elif selection == 'menu': + print('Returning to main menu...') + break + + else: + print('Selection invalid. Please try again.') + print() +except NoContainersError as e: + print('Error:', e) + print('No containers found. Exiting...') + exit()