def delete_public_ip_block(client, ipblockid): try: ip_block = client.node.ex_get_public_ip_block(ipblockid) client.node.ex_delete_public_ip_block(ip_block) click.secho("Public IP block with id {0} deleted.".format(ipblockid), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def remove_disk(client, serverid, serverfilteripv6, diskid): node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) # See if we can find the disk to remove disk_to_remove = _find_disk_id_from_node(node, diskid) try: response = client.node.ex_remove_storage_from_node( node, disk_to_remove.id) if response is True: click.secho("Removed disk {0} from {1}".format( disk_to_remove.id, serverid), fg='green', bold=True) else: click.secho( "Something went wrong attempting to remove disk {0} from {1}". format(disk_to_remove.id, serverid), fg='red', bold=True) exit(1) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def create_vlan(client, networkdomainid, name, baseipv4address, description, prefixsize): try: networkdomainid = DimensionDataNetworkDomain(networkdomainid, None, None, None, None, None) vlan = client.node.ex_create_vlan(networkdomainid, name, baseipv4address, description, prefixsize) click.secho("Successfully created VLAN {0}".format(vlan.id), bold=True, fg='green') except DimensionDataAPIException as e: handle_dd_api_exception(e)
def info(client, serverid, serverfilteripv6): if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) try: details = client.backup.ex_get_backup_details_for_target(serverid) click.secho("Backup Details for {0}".format(serverid)) click.secho("Service Plan: {0}".format(details.service_plan[0])) if len(details.clients) > 0: click.secho("Clients:") for backup_client in details.clients: click.secho("") click.secho("{0}".format(backup_client.type), bold=True) click.secho("Description: {0}".format( backup_client.description)) click.secho("Schedule: {0}".format( backup_client.schedule_policy)) click.secho("Retention: {0}".format( backup_client.storage_policy)) click.secho("DownloadURL: {0}".format( backup_client.download_url)) if backup_client.running_job is not None: click.secho("Running Job", bold=True) click.secho("ID: {0}".format(backup_client.running_job.id)) click.secho("Status: {0}".format( backup_client.running_job.status)) click.secho("Percentage Complete: {0}".format( backup_client.running_job.percentage)) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def modify_disk(client, serverid, serverfilteripv6, diskid, size, speed): # Validate parameters, wish click had exculsion if size is not None and speed is not None: click.secho("Only one modify disk operation can happen at a time. Please choose either --speed or --size", fg='red', bold=True) exit(1) elif size is None and speed is None: click.secho("Must choose one of --speed or --size to change", fg='red', bold=True) exit(1) node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) # See if we can find the disk to modify disk_to_modify = _find_disk_id_from_node(node, diskid) try: if speed is not None: response = client.node.ex_change_storage_speed(node, disk_to_modify.id, speed) else: response = client.node.ex_change_storage_size(node, disk_to_modify.id, size) if response is True: click.secho("Successfully modified disk {0} from {1}".format(disk_to_modify.scsi_id, serverid), fg='green', bold=True) else: click.secho("Something went wrong attempting to modify disk {0} from {1}".format(disk_to_modify.id, serverid), fg='red', bold=True) exit(1) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def create_firewall_rule(client, name, action, networkdomainid, ipversion, protocol, sourceip, sourceip_prefix_size, sourcestartport, sourceendport, destinationip, destinationip_prefix_size, destinationstartport, destinationendport, position): try: network_domain = client.node.ex_get_network_domain(networkdomainid) source_any = True if sourceip == 'ANY' else False dest_any = True if destinationip == 'ANY' else False source_address = DimensionDataFirewallAddress(source_any, sourceip, sourceip_prefix_size, sourcestartport, sourceendport) dest_address = DimensionDataFirewallAddress(dest_any, destinationip, destinationip_prefix_size, destinationstartport, destinationendport) rule = DimensionDataFirewallRule(id=None, name=name, action=action, location=network_domain.location, network_domain=network_domain, status=None, ip_version=ipversion, protocol=protocol, source=source_address, destination=dest_address, enabled=True) client.node.ex_create_firewall_rule(network_domain, rule, position) click.secho("Firewall rule {0} created in {1}".format( name, network_domain.name), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def remove_client(client, serverid, clienttype, serverfilteripv6): if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) try: details = client.backup.ex_get_backup_details_for_target(serverid) if len(details.clients) <= 0: click.secho("No clients found for {0}".format(serverid), fg='red', bold=True) exit(1) else: for backup_client in details.clients: if backup_client.type.type == clienttype: client.backup.ex_remove_client_from_target( serverid, backup_client) click.secho( "Successfully removed client {0} from {1}".format( clienttype, serverid), fg='green', bold=True) exit(0) click.secho("Could not find a client {0} on {1}".format( clienttype, serverid), fg='red', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def delete_vlan(client, vlanid): try: client.node.ex_delete_vlan( DimensionDataVlan(vlanid, None, None, None, None, None, None, None, None, None, None, None)) click.secho("Vlan {0} deleted.".format(vlanid), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def create_network(client, datacenterid, name, serviceplan): try: client.node.ex_create_network(datacenterid, name, serviceplan) click.secho("Network {0} created in {1}".format(name, datacenterid), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def delete_firewall_rule(client, networkdomainid, ruleid): try: network_domain = client.node.ex_get_network_domain(networkdomainid) rule = client.node.ex_get_firewall_rule(network_domain, ruleid) client.node.ex_delete_firewall_rule(rule) click.secho("Firewall rule {0} deleted.".format(ruleid), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def add_public_ip_block(client, networkdomainid): try: network_domain = client.node.ex_get_network_domain(networkdomainid) ip_block = client.node.ex_add_public_ip_block_to_network_domain(network_domain) click.secho("Public IP Block with base IP of {0} and block size of {1} added to {2}".format(ip_block.base_ip, ip_block.size, networkdomainid), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def delete_network(client, networkid): try: client.node.ex_delete_network(networkid) click.secho("Network {0} deleted.".format(networkid), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def add_client(client, serverid, clienttype, storagepolicy, schedulepolicy, triggeron, notifyemail, serverfilteripv6): if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) try: client.backup.ex_add_client_to_target(serverid, clienttype, storagepolicy, schedulepolicy, triggeron, notifyemail) click.secho("Enabled {0} client on {1}".format(clienttype, serverid), fg='red', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def enable(client, serverid, serviceplan, serverfilteripv6): if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) try: extra = {'service_plan': serviceplan} client.backup.create_target(serverid, serverid, extra=extra) click.secho("Backups enabled for {0}. Service plan: {1}".format(serverid, serviceplan), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def create(client, name, description, imageid, autostart, administratorpassword, networkdomainid, vlanid): try: response = client.node.create_node(name, imageid, administratorpassword, description, ex_network_domain=networkdomainid, ex_vlan=vlanid, ex_is_started=autostart) click.secho("Node starting up: {0}. IPv6: {1}".format(response.id, response.extra['ipv6']), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list(client, datacenterid): try: locations = client.node.list_locations(ex_id=datacenterid) for location in locations: click.secho("{0}".format(location.name), bold=True) click.secho("ID: {0}".format(location.id)) click.secho("Description: {0}".format(location.country)) click.secho("") except DimensionDataAPIException as e: handle_dd_api_exception(e)
def update_ram(client, serverid, serverfilteripv6, ramingb): node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) try: client.node.ex_reconfigure_node(node, ramingb, None, None, None) click.secho("Server {0} ram is being changed to {1}GB".format(serverid, ramingb), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def delete_network_domain(client, networkdomainid): try: client.node.ex_delete_network_domain( DimensionDataNetworkDomain(networkdomainid, None, None, None, None, None)) click.secho("Network Domain {0} deleted.".format(networkdomainid), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def delete_network_domain(client, networkdomainid): try: client.node.ex_delete_network_domain( DimensionDataNetworkDomain( networkdomainid, None, None, None, None, None ) ) click.secho("Network Domain {0} deleted.".format(networkdomainid), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def update_cpu_count(client, serverid, serverfilteripv6, cpucount): node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) try: client.node.ex_reconfigure_node(node, None, cpucount, None, None) click.secho("Server {0} CPU Count changing to {1}".format(serverid, cpucount), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def delete_vlan(client, vlanid): try: client.node.ex_delete_vlan( DimensionDataVlan( vlanid, None, None, None, None, None, None, None, None, None, None, None ) ) click.secho("Vlan {0} deleted.".format(vlanid), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def disable(client, serverid, serverfilteripv6): if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) try: response = client.backup.delete_target(serverid) if response is True: click.secho("Backups disabled for {0}".format(serverid), fg='green', bold=True) else: click.secho("Backups not disabled for {0}".format(serverid, fg='red', bold=True)) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def download_url(client, serverid, serverfilteripv6): if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) try: details = client.backup.ex_get_backup_details_for_target(serverid) if len(details.clients) < 1: click.secho("No clients configured so there is no backup url", fg='red', bold=True) exit(1) click.secho("{0}".format(details.clients[0].download_url)) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list_networks(client, datacenterid): try: networks = client.node.ex_list_networks(location=datacenterid) for network in networks: click.secho("{0}".format(network.name), bold=True) click.secho("ID: {0}".format(network.id)) click.secho("Description: {0}".format(network.description)) click.secho("PrivateNet: {0}".format(network.private_net)) click.secho("Location: {0}".format(network.location.id)) click.secho("") except DimensionDataAPIException as e: handle_dd_api_exception(e)
def add_public_ip_block(client, networkdomainid): try: network_domain = client.node.ex_get_network_domain(networkdomainid) ip_block = client.node.ex_add_public_ip_block_to_network_domain( network_domain) click.secho( "Public IP Block with base IP of {0} and block size of {1} added to {2}" .format(ip_block.base_ip, ip_block.size, networkdomainid), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list_available_client_types(client, serverid, serverfilteripv6): if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) try: client_types = client.backup.ex_list_available_client_types(serverid) if len(client_types) < 1: click.secho("No available clients types for {0}".format(serverid), fg='red', bold=True) exit(1) click.secho("Available Client Types:", bold=True) for client_type in client_types: click.secho("{0}".format(client_type.type)) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list_available_storage_policies(client, serverid, serverfilteripv6): if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) try: storage_policies = client.backup.ex_list_available_storage_policies(serverid) if len(storage_policies) < 1: click.secho("No available storage_policies for {0}".format(serverid), fg='red', bold=True) exit(1) click.secho("Available Storage Policies:", bold=True) for storage_policy in storage_policies: click.secho("{0}".format(storage_policy.name)) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list_network_domains(client, datacenterid): try: network_domains = client.node.ex_list_network_domains(location=datacenterid) for network_domain in network_domains: click.secho("{0}".format(network_domain.name), bold=True) click.secho("ID: {0}".format(network_domain.id)) click.secho("Description: {0}".format(network_domain.description)) click.secho("Plan: {0}".format(network_domain.plan)) click.secho("Location: {0}".format(network_domain.location.id)) click.secho("Status: {0}".format(network_domain.status)) click.secho("") except DimensionDataAPIException as e: handle_dd_api_exception(e)
def reboot(client, serverid, serverfilteripv6): node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) try: response = client.node.reboot_node(node) if response is True: click.secho("Server {0} is being rebooted".format(serverid), fg='green', bold=True) else: click.secho("Something went wrong with attempting to reboot {0}".format(serverid)) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def shutdown_hard(client, serverid, serverfilteripv6): node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) try: response = client.node.ex_power_off(node) if response is True: click.secho("Server {0} is shutting down hard".format(serverid), fg='green', bold=True) else: click.secho("Something went wrong when attempting to shut down {0}".format(serverid)) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def update_ram(client, serverid, serverfilteripv6, ramingb): node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) try: client.node.ex_reconfigure_node(node, ramingb, None, None, None) click.secho("Server {0} ram is being changed to {1}GB".format( serverid, ramingb), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list_network_domains(client, datacenterid, query): try: network_domains = client.node.ex_list_network_domains(location=datacenterid) response = DiDataCLIFilterableResponse() for network_domain in network_domains: response.add(_network_domain_to_dict(network_domain)) if not response.is_empty(): if query is not None: response.do_filter(query) click.secho(response.to_string(client.output_type)) else: click.secho("No network domains found", fg='red', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def add_disk(client, serverid, serverfilteripv6, size, speed): node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) try: response = client.node.ex_add_storage_to_node(node, size, speed) if response is True: click.secho("Adding disk {0} {1}GB to {2}".format(speed, size, serverid), fg='green', bold=True) else: click.secho("Something went wrong attempting to add disk to {0}".format(serverid), fg='red', bold=True) exit(1) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list_network_domains(client, datacenterid): try: network_domains = client.node.ex_list_network_domains( location=datacenterid) for network_domain in network_domains: click.secho("{0}".format(network_domain.name), bold=True) click.secho("ID: {0}".format(network_domain.id)) click.secho("Description: {0}".format(network_domain.description)) click.secho("Plan: {0}".format(network_domain.plan)) click.secho("Location: {0}".format(network_domain.location.id)) click.secho("Status: {0}".format(network_domain.status)) click.secho("") except DimensionDataAPIException as e: handle_dd_api_exception(e)
def update_cpu_count(client, serverid, serverfilteripv6, cpucount): node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) try: client.node.ex_reconfigure_node(node, None, cpucount, None, None) click.secho("Server {0} CPU Count changing to {1}".format( serverid, cpucount), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list_public_ip_blocks(client, networkdomainid, query): try: network_domain = client.node.ex_get_network_domain(networkdomainid) ip_blocks = client.node.ex_list_public_ip_blocks(network_domain) response = DiDataCLIFilterableResponse() for ip_block in ip_blocks: response.add(_ip_block_to_dict(ip_block)) if not response.is_empty(): if query is not None: response.do_filter(query) click.secho(response.to_string(client.output_type)) else: click.secho("No public ip blocks found", fg='red', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list_firewall_rules(client, networkdomainid, query): try: network_domain = client.node.ex_get_network_domain(networkdomainid) rules = client.node.ex_list_firewall_rules(network_domain) response = DiDataCLIFilterableResponse() for rule in rules: response.add(_firewall_rule_to_dict(rule)) if not response.is_empty(): if query is not None: response.do_filter(query) click.secho(response.to_string(client.output_type)) else: click.secho("No firewall rules found", fg='red', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list_network_domains(client, datacenterid, query): try: network_domains = client.node.ex_list_network_domains( location=datacenterid) response = DiDataCLIFilterableResponse() for network_domain in network_domains: response.add(_network_domain_to_dict(network_domain)) if not response.is_empty(): if query is not None: response.do_filter(query) click.secho(response.to_string(client.output_type)) else: click.secho("No network domains found", fg='red', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def create(client, name, description, imageid, autostart, administratorpassword, networkdomainid, vlanid): try: response = client.node.create_node(name, imageid, administratorpassword, description, ex_network_domain=networkdomainid, ex_vlan=vlanid, ex_is_started=autostart) click.secho("Node starting up: {0}. IPv6: {1}".format( response.id, response.extra['ipv6']), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list_customer_images(client, datacenterid): try: images = client.node.ex_list_customer_images(location=datacenterid) for image in images: click.secho("{}".format(image.extra['OS_displayName']), bold=True) click.secho("ID: {0}".format(image.id)) click.secho("Description: {0}".format(image.extra['description'])) click.secho("CPU Count: {0} Cores per Socket: {1} Speed: {2}".format( image.extra['cpu'].cpu_count, image.extra['cpu'].cores_per_socket, image.extra['cpu'].performance )) click.secho("Memory: {0}GB".format(image.extra['memoryGb'])) click.secho("Location: {0}".format(image.extra['location'].id)) click.secho("") except DimensionDataAPIException as e: handle_dd_api_exception(e)
def list_customer_images(client, datacenterid): try: images = client.node.ex_list_customer_images(location=datacenterid) for image in images: click.secho("{}".format(image.extra['OS_displayName']), bold=True) click.secho("ID: {0}".format(image.id)) click.secho("Description: {0}".format(image.extra['description'])) click.secho( "CPU Count: {0} Cores per Socket: {1} Speed: {2}".format( image.extra['cpu'].cpu_count, image.extra['cpu'].cores_per_socket, image.extra['cpu'].performance)) click.secho("Memory: {0}GB".format(image.extra['memoryGb'])) click.secho("Location: {0}".format(image.extra['location'].id)) click.secho("") except DimensionDataAPIException as e: handle_dd_api_exception(e)
def shutdown_hard(client, serverid, serverfilteripv6): node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) try: response = client.node.ex_power_off(node) if response is True: click.secho("Server {0} is shutting down hard".format(serverid), fg='green', bold=True) else: click.secho( "Something went wrong when attempting to shut down {0}".format( serverid)) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def reboot_hard(client, serverid, serverfilteripv6): node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) try: response = client.node.ex_reset(node) if response is True: click.secho("Server {0} is being rebooted".format(serverid), fg='green', bold=True) else: click.secho( "Something went wrong with attempting to reboot {0}".format( serverid)) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def remove_client(client, serverid, clienttype, serverfilteripv6): if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) try: details = client.backup.ex_get_backup_details_for_target(serverid) if len(details.clients) <= 0: click.secho("No clients found for {0}".format(serverid), fg='red', bold=True) exit(1) else: for backup_client in details.clients: if backup_client.type.type == clienttype: client.backup.ex_remove_client_from_target(serverid, backup_client) click.secho("Successfully removed client {0} from {1}".format(clienttype, serverid), fg='green', bold=True) exit(0) click.secho("Could not find a client {0} on {1}".format(clienttype, serverid), fg='red', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def create_firewall_rule(client, name, action, networkdomainid, ipversion, protocol, sourceip, sourceip_prefix_size, sourcestartport, sourceendport, destinationip, destinationip_prefix_size, destinationstartport, destinationendport, position): try: network_domain = client.node.ex_get_network_domain(networkdomainid) source_any = True if sourceip == 'ANY' else False dest_any = True if destinationip == 'ANY' else False source_address = DimensionDataFirewallAddress(source_any, sourceip, sourceip_prefix_size, sourcestartport, sourceendport) dest_address = DimensionDataFirewallAddress(dest_any, destinationip, destinationip_prefix_size, destinationstartport, destinationendport) rule = DimensionDataFirewallRule(id=None, name=name, action=action, location=network_domain.location, network_domain=network_domain, status=None, ip_version=ipversion, protocol=protocol, source=source_address, destination=dest_address, enabled=True) client.node.ex_create_firewall_rule(network_domain, rule, position) click.secho("Firewall rule {0} created in {1}".format(name, network_domain.name), fg='green', bold=True) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def remove_disk(client, serverid, serverfilteripv6, diskid): node = None if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) node = client.node.ex_get_node_by_id(serverid) # See if we can find the disk to remove disk_to_remove = _find_disk_id_from_node(node, diskid) try: response = client.node.ex_remove_storage_from_node(node, disk_to_remove.id) if response is True: click.secho("Removed disk {0} from {1}".format(disk_to_remove.id, serverid), fg='green', bold=True) else: click.secho("Something went wrong attempting to remove disk {0} from {1}".format(disk_to_remove.id, serverid), fg='red', bold=True) exit(1) except DimensionDataAPIException as e: handle_dd_api_exception(e)
def info(client, serverid, serverfilteripv6): if not serverid: serverid = get_single_server_id_from_filters(client, ex_ipv6=serverfilteripv6) try: details = client.backup.ex_get_backup_details_for_target(serverid) click.secho("Backup Details for {0}".format(serverid)) click.secho("Service Plan: {0}".format(details.service_plan[0])) if len(details.clients) > 0: click.secho("Clients:") for backup_client in details.clients: click.secho("") click.secho("{0}".format(backup_client.type), bold=True) click.secho("Description: {0}".format(backup_client.description)) click.secho("Schedule: {0}".format(backup_client.schedule_policy)) click.secho("Retention: {0}".format(backup_client.storage_policy)) click.secho("DownloadURL: {0}".format(backup_client.download_url)) if backup_client.running_job is not None: click.secho("Running Job", bold=True) click.secho("ID: {0}".format(backup_client.running_job.id)) click.secho("Status: {0}".format(backup_client.running_job.status)) click.secho("Percentage Complete: {0}".format(backup_client.running_job.percentage)) except DimensionDataAPIException as e: handle_dd_api_exception(e)