azure command message cleanup. sub select by starts_with

This commit is contained in:
Jon Gallant 2018-02-27 10:43:10 +01:00
Родитель 85d4819088
Коммит 8edf46ade4
8 изменённых файлов: 158 добавлений и 85 удалений

Просмотреть файл

Просмотреть файл

@ -1,2 +1,2 @@
FROM jongallant/iotedgedev-deps:0.62.0-linux FROM jongallant/iotedgedev-deps:0.63.0-linux
RUN pip --no-cache-dir install -U azure-iot-edge-dev-tool RUN pip --no-cache-dir install -U azure-iot-edge-dev-tool

Просмотреть файл

@ -23,26 +23,38 @@ class AzureCli:
def is_posix(self): def is_posix(self):
self.envvars.is_posix() self.envvars.is_posix()
def prepare_az_cli_args(self, args): def prepare_az_cli_args(self, args, suppress_output=False):
if suppress_output:
args.extend(["--query", "\"[?n]|[0]\""])
az_args = ["az"]+args az_args = ["az"]+args
if self.is_posix(): if self.is_posix():
return [" ".join(az_args)] return [" ".join(az_args)]
return az_args return az_args
def invoke_az_cli_outproc(self, args, error_message=None, stdout_io=None, stderr_io=None): def invoke_az_cli_outproc(self, args, error_message=None, stdout_io=None, stderr_io=None, suppress_output=False):
try: try:
if stdout_io or stderr_io: if stdout_io or stderr_io:
process = subprocess.Popen(self.prepare_az_cli_args( process = subprocess.Popen(self.prepare_az_cli_args(
args), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=not self.envvars.is_posix()) args, suppress_output), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=not self.envvars.is_posix())
else:
process = subprocess.Popen(self.prepare_az_cli_args(
args, suppress_output), shell=not self.envvars.is_posix())
stdout_data, stderr_data = process.communicate() stdout_data, stderr_data = process.communicate()
if stderr_data and "400" in stderr_data:
self.output.info(
"Your Azure CLI session has expired. Please re-run iotedgedev azure --setup to refresh your credentials.")
self.logout()
sys.exit()
if stdout_io and stdout_data != "": if stdout_io and stdout_data != "":
stdout_io.writelines(self.decode(stdout_data)) stdout_io.writelines(self.decode(stdout_data))
if stderr_io and stderr_data != "": if stderr_io and stderr_data != "":
stderr_io.writelines(self.decode(stderr_data)) stderr_io.writelines(self.decode(stderr_data))
else:
process = subprocess.Popen(
self.prepare_az_cli_args(args), shell=not self.envvars.is_posix())
process.communicate()
if process.returncode != 0: if process.returncode != 0:
if error_message: if error_message:
@ -50,6 +62,9 @@ class AzureCli:
self.output.line() self.output.line()
return False return False
if not stdout_io and not stderr_io:
self.output.line()
except Exception as e: except Exception as e:
if error_message: if error_message:
self.output.error(error_message) self.output.error(error_message)
@ -57,8 +72,6 @@ class AzureCli:
self.output.line() self.output.line()
return False return False
self.output.line()
return True return True
def invoke_az_cli(self, args, error_message=None, stdout_io=None): def invoke_az_cli(self, args, error_message=None, stdout_io=None):
@ -79,20 +92,19 @@ class AzureCli:
return True return True
def add_extension(self, name): def add_extension(self, name):
self.output.header(f("Adding extension {name}"))
return self.invoke_az_cli_outproc(["extension", "add", "--name", name, return self.invoke_az_cli_outproc(["extension", "add", "--name", name,
"--yes"], "--yes"],
f("Error while adding extension {name}.")) f("Error while adding extension {name}."), suppress_output=True)
def extension_exists(self, name): def extension_exists(self, name):
self.output.header(f("Checking for extension {name}"))
return self.invoke_az_cli_outproc(["extension", "show", "--name", name, "--output", "table"], return self.invoke_az_cli_outproc(["extension", "show", "--name", name, "--output", "table"],
f("Error while checking for extension {name}.")) f("Error while checking for extension {name}."), suppress_output=True)
def user_has_logged_in(self): def user_has_logged_in(self):
self.output.header("Checking for cached credentials")
self.output.header("AUTHENTICATION")
self.output.status(f("Retrieving Azure CLI credentials from cache..."))
with output_io_cls() as io: with output_io_cls() as io:
result = self.invoke_az_cli_outproc( result = self.invoke_az_cli_outproc(
@ -100,6 +112,7 @@ class AzureCli:
if result: if result:
try: try:
self.output.prompt("Azure CLI credentials found.")
out_string = io.getvalue() out_string = io.getvalue()
data = json.loads(out_string) data = json.loads(out_string)
return data["id"] return data["id"]
@ -107,35 +120,27 @@ class AzureCli:
pass pass
self.output.prompt( self.output.prompt(
"Azure CLI credentials not found. Please follow instructions below to login to the Azure CLI.") "Azure CLI credentials not found. Please follow instructions below to login to the Azure CLI.")
self.output.line()
return None return None
def login(self, username, password): def login(self, username, password):
self.output.header("Logging in to Azure")
return self.invoke_az_cli_outproc(["login", "-u", username, return self.invoke_az_cli_outproc(["login", "-u", username,
"-p", password, "-o", "table"], "-p", password],
"Error while trying to login to Azure. Try logging in with the interactive login mode (do not use the --credentials).") "Error while trying to login to Azure. Try logging in with the interactive login mode (do not use the --credentials parameter).", suppress_output=True)
def login_interactive(self): def login_interactive(self):
self.output.header("Interactive login to Azure") return self.invoke_az_cli_outproc(["login"],
"Error while trying to login to Azure.", suppress_output=True)
return self.invoke_az_cli_outproc(["login", "--o", "table"],
"Error while trying to login to Azure.")
def logout(self): def logout(self):
self.output.header("Logout from Azure")
return self.invoke_az_cli_outproc(["account", "clear"]) return self.invoke_az_cli_outproc(["account", "clear"])
def list_subscriptions(self): def list_subscriptions(self):
self.output.header("Listing Subscriptions") self.output.status("Retrieving Azure Subscriptions...")
return self.invoke_az_cli_outproc(["account", "list", "--all", "--query", "[].{\"Subscription Name\":name, Id:id}", "--out", "table"],
return self.invoke_az_cli_outproc(["account", "list", "--out", "table"],
"Error while trying to list Azure subscriptions.") "Error while trying to list Azure subscriptions.")
def get_default_subscription(self): def get_default_subscription(self):
self.output.header("Getting default subscription id")
with output_io_cls() as io: with output_io_cls() as io:
result = self.invoke_az_cli_outproc(["account", "show"], result = self.invoke_az_cli_outproc(["account", "show"],
@ -146,14 +151,29 @@ class AzureCli:
return data["id"] return data["id"]
return '' return ''
def get_subscription_id_starts_with(self, token):
with output_io_cls() as io:
result = self.invoke_az_cli_outproc(["account", "list", "--query", "[?starts_with(@.id,'{0}') || starts_with(@.name,'{0}')] | [0]".format(token)],
"Could not find a subscription that starts with '{0}'".format(token), io)
if result:
out_string = io.getvalue()
if out_string:
data = json.loads(out_string)
return data["id"]
return ''
def set_subscription(self, subscription): def set_subscription(self, subscription):
self.output.header("Setting Subscription")
if len(subscription) < 36:
subscription = self.get_subscription_id_starts_with(subscription)
self.output.status(f("Setting Subscription to '{subscription}'..."))
return self.invoke_az_cli_outproc(["account", "set", "--subscription", subscription], return self.invoke_az_cli_outproc(["account", "set", "--subscription", subscription],
"Error while trying to set Azure subscription.") "Error while trying to set Azure subscription.")
def resource_group_exists(self, name): def resource_group_exists(self, name):
self.output.header(f("Checking if Resource Group {name} exists")) self.output.status(f("Checking if Resource Group '{name}' exists..."))
with output_io_cls() as io: with output_io_cls() as io:
result = self.invoke_az_cli_outproc(["group", "exists", "-n", name, "--debug"], result = self.invoke_az_cli_outproc(["group", "exists", "-n", name, "--debug"],
@ -165,12 +185,12 @@ class AzureCli:
return True return True
self.output.prompt(f("Resource Group {name} does not exist.")) self.output.prompt(f("Resource Group {name} does not exist."))
self.output.line()
return False return False
def create_resource_group(self, name, location): def create_resource_group(self, name, location):
self.output.header( self.output.status(
f("Creating Resource Group {name} at location:{location}")) f("Creating Resource Group '{name}' at '{location}'..."))
with output_io_cls() as io: with output_io_cls() as io:
@ -179,15 +199,12 @@ class AzureCli:
return result return result
def list_resource_groups(self): def list_resource_groups(self):
self.output.header("Listing Resource Groups") self.output.header("RESOURCE GROUP")
self.output.status("Retrieving Resource Groups...")
return self.invoke_az_cli_outproc(["group", "list", "--out", "table"], return self.invoke_az_cli_outproc(["group", "list", "--query", "[].{\"Resource Group\":name, Location:location}", "--out", "table"],
"Could not list the Resource Groups.") "Could not list the Resource Groups.")
def get_free_iothub(self): def get_free_iothub(self):
self.output.header(
f("Checking if an F1 (free) IoT Hub exists in the subscription"))
with output_io_cls() as io: with output_io_cls() as io:
result = self.invoke_az_cli_outproc(["iot", "hub", "list"], result = self.invoke_az_cli_outproc(["iot", "hub", "list"],
@ -200,16 +217,27 @@ class AzureCli:
return (iot["name"], iot["resourceGroup"]) return (iot["name"], iot["resourceGroup"])
return (None, None) return (None, None)
def list_iot_hubs(self, resource_group): def get_first_iothub(self, resource_group):
self.output.header(
f("Listing IoT Hubs in {resource_group}"))
return self.invoke_az_cli_outproc(["iot", "hub", "list", "--resource-group", resource_group, "--out", "table"], with output_io_cls() as io:
f("Could not list the IoT Hubs in {resource_group}.")) result = self.invoke_az_cli_outproc(["iot", "hub", "list", "--resource-group", resource_group, "--query", "[0]"], f("Could not get first IoT Hub."), io)
if result:
out_string = io.getvalue()
if out_string:
data = json.loads(out_string)
return data["name"]
return ''
def list_iot_hubs(self, resource_group):
self.output.header("IOT HUB")
self.output.status(f("Retrieving IoT Hubs in '{resource_group}'..."))
return self.invoke_az_cli_outproc(["iot", "hub", "list", "--resource-group", resource_group, "--query", "[].{\"IoT Hub\":name}", "--out", "table"], f("Could not list the IoT Hubs in {resource_group}."))
def iothub_exists(self, value, resource_group): def iothub_exists(self, value, resource_group):
self.output.header( self.output.status(
f("Checking if {value} IoT Hub exists in {resource_group}")) f("Checking if '{value}' IoT Hub exists..."))
with output_io_cls() as io: with output_io_cls() as io:
@ -218,12 +246,11 @@ class AzureCli:
if not result: if not result:
self.output.prompt( self.output.prompt(
f("Could not locate the {value} in {resource_group}.")) f("Could not locate the {value} in {resource_group}."))
self.output.line()
return result return result
def create_iothub(self, value, resource_group, sku): def create_iothub(self, value, resource_group, sku):
self.output.header( self.output.status(
f("Creating {value} in {resource_group} with sku {sku}")) f("Creating '{value}' in '{resource_group}' with '{sku}' sku..."))
with output_io_cls() as io: with output_io_cls() as io:
with output_io_cls() as error_io: with output_io_cls() as error_io:
@ -231,7 +258,7 @@ class AzureCli:
"Creating IoT Hub. Please wait as this could take a few minutes to complete...") "Creating IoT Hub. Please wait as this could take a few minutes to complete...")
result = self.invoke_az_cli_outproc(["iot", "hub", "create", "--name", value, "--resource-group", result = self.invoke_az_cli_outproc(["iot", "hub", "create", "--name", value, "--resource-group",
resource_group, "--sku", sku, "--out", "table"], resource_group, "--sku", sku, "--query", "[].{\"IoT Hub\":name}", "--out", "table"],
f("Could not create the IoT Hub {value} in {resource_group} with sku {sku}."), stdout_io=io, stderr_io=error_io) f("Could not create the IoT Hub {value} in {resource_group} with sku {sku}."), stdout_io=io, stderr_io=error_io)
if not result and error_io.getvalue(): if not result and error_io.getvalue():
self.output.error(error_io.getvalue()) self.output.error(error_io.getvalue())
@ -242,8 +269,8 @@ class AzureCli:
return result return result
def get_iothub_connection_string(self, value, resource_group): def get_iothub_connection_string(self, value, resource_group):
self.output.header( self.output.status(
f("Getting the connection string for {value} in {resource_group} ")) f("Retrieving '{value}' connection string..."))
with output_io_cls() as io: with output_io_cls() as io:
result = self.invoke_az_cli_outproc(["iot", "hub", "show-connection-string", "--hub-name", value, result = self.invoke_az_cli_outproc(["iot", "hub", "show-connection-string", "--hub-name", value,
@ -256,8 +283,8 @@ class AzureCli:
return '' return ''
def edge_device_exists(self, value, iothub, resource_group): def edge_device_exists(self, value, iothub, resource_group):
self.output.header( self.output.status(
f("Checking if {value} device exists in {iothub} IoT Hub in {resource_group}")) f("Checking if '{value}' device exists in '{iothub}'..."))
with output_io_cls() as io: with output_io_cls() as io:
result = self.invoke_az_cli_outproc(["iot", "hub", "device-identity", "show", "--device-id", value, "--hub-name", iothub, result = self.invoke_az_cli_outproc(["iot", "hub", "device-identity", "show", "--device-id", value, "--hub-name", iothub,
@ -265,28 +292,28 @@ class AzureCli:
if not result: if not result:
self.output.prompt( self.output.prompt(
f("Could not locate the {value} device in {iothub} IoT Hub in {resource_group}.")) f("Could not locate the {value} device in {iothub} IoT Hub in {resource_group}."))
self.output.line()
return result return result
def list_edge_devices(self, iothub): def list_edge_devices(self, iothub):
self.output.header( self.output.header("EDGE DEVICE")
f("Listing edge devices in {iothub} IoT Hub")) self.output.status(
f("Retrieving edge devices in '{iothub}'..."))
return self.invoke_az_cli_outproc(["iot", "hub", "device-identity", "list", "--hub-name", iothub, return self.invoke_az_cli_outproc(["iot", "hub", "device-identity", "list", "--hub-name", iothub,
"--edge-enabled", "--output", "table"], "--edge-enabled", "--query", "[].{\"Device Id\":deviceId}", "--output", "table"],
f("Could not list the edge devices in {iothub} IoT Hub.")) f("Could not list the edge devices in {iothub} IoT Hub."))
def create_edge_device(self, value, iothub, resource_group): def create_edge_device(self, value, iothub, resource_group):
self.output.header( self.output.status(
f("Creating {value} edge device in {iothub} IoT Hub in {resource_group}")) f("Creating '{value}' edge device in '{iothub}'..."))
return self.invoke_az_cli_outproc(["iot", "hub", "device-identity", "create", "--device-id", value, "--hub-name", iothub, return self.invoke_az_cli_outproc(["iot", "hub", "device-identity", "create", "--device-id", value, "--hub-name", iothub,
"--resource-group", resource_group, "--edge-enabled", "--output", "table"], "--resource-group", resource_group, "--edge-enabled", "--query", "[].{\"Device Id\":deviceId}", "--output", "table"],
f("Could not locate the {value} device in {iothub} IoT Hub in {resource_group}.")) f("Could not locate the {value} device in {iothub} IoT Hub in {resource_group}."))
def get_device_connection_string(self, value, iothub, resource_group): def get_device_connection_string(self, value, iothub, resource_group):
self.output.header( self.output.status(
f("Getting the connection string for {value} edge device in {iothub} IoT Hub in {resource_group}")) f("Retrieving '{value}' connection string..."))
with output_io_cls() as io: with output_io_cls() as io:
result = self.invoke_az_cli_outproc(["iot", "hub", "device-identity", "show-connection-string", "--device-id", value, "--hub-name", iothub, result = self.invoke_az_cli_outproc(["iot", "hub", "device-identity", "show-connection-string", "--device-id", value, "--hub-name", iothub,

Просмотреть файл

@ -22,6 +22,7 @@ output = Output()
envvars = EnvVars(output) envvars = EnvVars(output)
azure_cli = AzureCli(output, envvars) azure_cli = AzureCli(output, envvars)
default_subscriptionId = None default_subscriptionId = None
azure_cli_processing_complete = False
CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
@ -77,13 +78,18 @@ def iothub(monitor_events):
def validate_option(ctx, param, value): def validate_option(ctx, param, value):
global default_subscriptionId global default_subscriptionId
global azure_cli_processing_complete
if param.name == "credentials": if param.name == "credentials":
if value and value[0] and value[1]: if value and value[0] and value[1]:
output.param("CREDENTIALS", value, "Setting Credentials...", azure_cli_processing_complete)
if not azure_cli.login(*value): if not azure_cli.login(*value):
sys.exit() sys.exit()
if param.name == "subscription": if param.name == "subscription":
output.param("SUBSCRIPTION", value, f("Setting Subscription to '{value}'..."), azure_cli_processing_complete)
# first verify that we have an existing auth token in cache, otherwise login using interactive # first verify that we have an existing auth token in cache, otherwise login using interactive
if not default_subscriptionId: if not default_subscriptionId:
default_subscriptionId = azure_cli.user_has_logged_in() default_subscriptionId = azure_cli.user_has_logged_in()
@ -97,9 +103,14 @@ def validate_option(ctx, param, value):
if param.name == "resource_group_location": if param.name == "resource_group_location":
output.param("RESOURCE GROUP LOCATION", value, f("Setting Resource Group Location to '{value}'..."), azure_cli_processing_complete)
envvars.RESOURCE_GROUP_LOCATION = value envvars.RESOURCE_GROUP_LOCATION = value
if param.name == "resource_group_name": if param.name == "resource_group_name":
output.param("RESOURCE GROUP NAME", value, f("Setting Resource Group Name to '{value}'..."), azure_cli_processing_complete)
envvars.RESOURCE_GROUP_NAME = value envvars.RESOURCE_GROUP_NAME = value
if not azure_cli.resource_group_exists(value): if not azure_cli.resource_group_exists(value):
if not azure_cli.create_resource_group(value, envvars.RESOURCE_GROUP_LOCATION): if not azure_cli.create_resource_group(value, envvars.RESOURCE_GROUP_LOCATION):
@ -107,9 +118,12 @@ def validate_option(ctx, param, value):
f('Could not find Resource Group {value}')) f('Could not find Resource Group {value}'))
if param.name == "iothub_sku": if param.name == "iothub_sku":
output.param("IOT HUB SKU", value, f("Setting IoT Hub SKU to '{value}'..."), azure_cli_processing_complete)
envvars.IOTHUB_SKU = value envvars.IOTHUB_SKU = value
if param.name == "iothub_name": if param.name == "iothub_name":
output.param("IOT HUB", value, f("Setting IoT Hub to '{value}'..."), azure_cli_processing_complete)
envvars.IOTHUB_NAME = value envvars.IOTHUB_NAME = value
if not azure_cli.extension_exists("azure-cli-iot-ext"): if not azure_cli.extension_exists("azure-cli-iot-ext"):
azure_cli.add_extension("azure-cli-iot-ext") azure_cli.add_extension("azure-cli-iot-ext")
@ -135,12 +149,15 @@ def validate_option(ctx, param, value):
f('Could not create IoT Hub {value} in {envvars.RESOURCE_GROUP_NAME}')) f('Could not create IoT Hub {value} in {envvars.RESOURCE_GROUP_NAME}'))
if param.name == "edge_device_id": if param.name == "edge_device_id":
output.param("EDGE DEVICE", value, f("Setting Edge Device to '{value}'..."), azure_cli_processing_complete)
envvars.EDGE_DEVICE_ID = value envvars.EDGE_DEVICE_ID = value
if not azure_cli.edge_device_exists(value, envvars.IOTHUB_NAME, envvars.RESOURCE_GROUP_NAME): if not azure_cli.edge_device_exists(value, envvars.IOTHUB_NAME, envvars.RESOURCE_GROUP_NAME):
if not azure_cli.create_edge_device(value, envvars.IOTHUB_NAME, envvars.RESOURCE_GROUP_NAME): if not azure_cli.create_edge_device(value, envvars.IOTHUB_NAME, envvars.RESOURCE_GROUP_NAME):
raise click.BadParameter( raise click.BadParameter(
f('Could not create IoT Edge Device {value} in {envvars.IOTHUB_NAME} in {envvars.RESOURCE_GROUP_NAME}')) f('Could not create IoT Edge Device {value} in {envvars.IOTHUB_NAME} in {envvars.RESOURCE_GROUP_NAME}'))
output.header("CONNECTION STRINGS")
envvars.IOTHUB_CONNECTION_STRING = azure_cli.get_iothub_connection_string( envvars.IOTHUB_CONNECTION_STRING = azure_cli.get_iothub_connection_string(
envvars.IOTHUB_NAME, envvars.RESOURCE_GROUP_NAME) envvars.IOTHUB_NAME, envvars.RESOURCE_GROUP_NAME)
envvars.DEVICE_CONNECTION_STRING = azure_cli.get_device_connection_string( envvars.DEVICE_CONNECTION_STRING = azure_cli.get_device_connection_string(
@ -152,24 +169,33 @@ def validate_option(ctx, param, value):
output.info( output.info(
f("DEVICE_CONNECTION_STRING=\"{envvars.DEVICE_CONNECTION_STRING}\"")) f("DEVICE_CONNECTION_STRING=\"{envvars.DEVICE_CONNECTION_STRING}\""))
azure_cli_processing_complete = True
output.line()
return value return value
def list_edge_devices_and_set_default(): def list_edge_devices_and_set_default():
if not azure_cli.list_edge_devices(envvars.IOTHUB_NAME): if not azure_cli.list_edge_devices(envvars.IOTHUB_NAME):
sys.exit() sys.exit()
return "iotedgedev-edgedevice-dev" return "iotedgedev-edgedevice"
def list_iot_hubs_and_set_default(): def list_iot_hubs_and_set_default():
if not azure_cli.list_iot_hubs(envvars.RESOURCE_GROUP_NAME): if not azure_cli.list_iot_hubs(envvars.RESOURCE_GROUP_NAME):
sys.exit() sys.exit()
first_iothub = azure_cli.get_first_iothub(envvars.RESOURCE_GROUP_NAME)
if first_iothub:
return first_iothub
else:
subscription_rg_hash = hashlib.sha1((default_subscriptionId + envvars.RESOURCE_GROUP_NAME).encode('utf-8')).hexdigest()[:6] subscription_rg_hash = hashlib.sha1((default_subscriptionId + envvars.RESOURCE_GROUP_NAME).encode('utf-8')).hexdigest()[:6]
return "iotedgedev-iothub-dev-" + subscription_rg_hash return "iotedgedev-iothub-" + subscription_rg_hash
def list_resource_groups_and_set_default(): def list_resource_groups_and_set_default():
if not azure_cli.list_resource_groups(): if not azure_cli.list_resource_groups():
sys.exit() sys.exit()
return "iotedgedev-rg-dev" return "iotedgedev-rg"
def list_subscriptions_and_set_default(): def list_subscriptions_and_set_default():
global default_subscriptionId global default_subscriptionId
@ -180,6 +206,8 @@ def list_subscriptions_and_set_default():
if not default_subscriptionId and not azure_cli.login_interactive(): if not default_subscriptionId and not azure_cli.login_interactive():
sys.exit() sys.exit()
output.header("SUBSCRIPTION")
if not azure_cli.list_subscriptions(): if not azure_cli.list_subscriptions():
sys.exit() sys.exit()
default_subscriptionId = azure_cli.get_default_subscription() default_subscriptionId = azure_cli.get_default_subscription()
@ -205,7 +233,7 @@ def list_subscriptions_and_set_default():
default=lambda: list_subscriptions_and_set_default(), default=lambda: list_subscriptions_and_set_default(),
required=True, required=True,
callback=validate_option, callback=validate_option,
prompt="The Azure subscription name or id to use", prompt="Enter the first 3 characters of the Azure subscription name or id to use. Hit Enter to use the default subscription.",
help="The Azure subscription name or id to use.") help="The Azure subscription name or id to use.")
@click.option( @click.option(
'--resource-group-location', '--resource-group-location',
@ -220,7 +248,7 @@ def list_subscriptions_and_set_default():
default=lambda: list_resource_groups_and_set_default(), default=lambda: list_resource_groups_and_set_default(),
type=str, type=str,
callback=validate_option, callback=validate_option,
prompt="The name of the Resource Group to use or create. Creates a new Resource Group if not found", prompt="Enter the name of the Resource Group to use or create. Creates a new Resource Group if not found",
help="The name of the Resource Group to use or create. Creates a new Resource Group if not found.") help="The name of the Resource Group to use or create. Creates a new Resource Group if not found.")
@click.option( @click.option(
'--iothub-sku', '--iothub-sku',
@ -235,7 +263,7 @@ def list_subscriptions_and_set_default():
default=lambda: list_iot_hubs_and_set_default(), default=lambda: list_iot_hubs_and_set_default(),
type=str, type=str,
callback=validate_option, callback=validate_option,
prompt='The IoT Hub name to be used. Creates a new IoT Hub if not found', prompt='Enter the IoT Hub name to be used. Creates a new IoT Hub if not found',
help='The IoT Hub name to be used. Creates a new IoT Hub if not found.') help='The IoT Hub name to be used. Creates a new IoT Hub if not found.')
@click.option( @click.option(
'--edge-device-id', '--edge-device-id',
@ -243,7 +271,7 @@ def list_subscriptions_and_set_default():
default=lambda: list_edge_devices_and_set_default(), default=lambda: list_edge_devices_and_set_default(),
type=str, type=str,
callback=validate_option, callback=validate_option,
prompt='The IoT Edge Device Id to be used. Creates a new Edge Device if not found', prompt='Enter the IoT Edge Device Id to be used. Creates a new Edge Device if not found',
help='The IoT Edge Device Id to be used. Creates a new Edge Device if not found.') help='The IoT Edge Device Id to be used. Creates a new Edge Device if not found.')
@click.option( @click.option(
'--update-dotenv', '--update-dotenv',

Просмотреть файл

@ -56,6 +56,9 @@ class EnvVars:
def check(self): def check(self):
if not self.checked: if not self.checked:
self.output.header("ENVIRONMENT VARIABLES")
self.load_dotenv() self.load_dotenv()
try: try:

Просмотреть файл

@ -5,6 +5,10 @@ class Output:
def info(self, text): def info(self, text):
click.secho(text, fg='yellow') click.secho(text, fg='yellow')
def status(self, text):
self.info(text)
self.line()
def prompt(self, text): def prompt(self, text):
click.secho(text, fg='white') click.secho(text, fg='white')
@ -13,7 +17,17 @@ class Output:
def header(self, text): def header(self, text):
self.line() self.line()
click.secho("======== {0} ========".format(text).upper(), fg='white') s = "======== {0} ========".format(text).upper()
m = "="*len(s)
click.secho(m, fg='white')
click.secho(s, fg='white')
click.secho(m, fg='white')
self.line()
def param(self, text, value, status, suppress):
if value and not suppress:
self.header("SETTING " + text)
self.status(status)
def footer(self, text): def footer(self, text):
self.info(text.upper()) self.info(text.upper())

Просмотреть файл

@ -15,8 +15,9 @@ else:
from .moduletype import ModuleType from .moduletype import ModuleType
class Utility: class Utility:
def __init__(self, envvars, output): def __init__(self, envvars, output, envvars_check=True):
self.envvars = envvars self.envvars = envvars
if envvars_check:
self.envvars.check() self.envvars.check()
self.output = output self.output = output
self.config_set = False self.config_set = False

Просмотреть файл

@ -104,9 +104,9 @@ class TestIotedgedev(unittest.TestCase):
'azure', '--setup', 'azure', '--setup',
'--credentials', 'username', 'password', '--credentials', 'username', 'password',
'--subscription', '12341234-1234-1234-1234-123412341234', '--subscription', '12341234-1234-1234-1234-123412341234',
'--resource-group-name', 'iotedgedev-rg-dev', '--resource-group-name', 'iotedgedev-rg',
'--iothub-name', 'iotedgedev-iothub-dev', '--iothub-name', 'iotedgedev-iothub',
'--edge-device-id', 'iotedgedev-edgedevice-dev', '--edge-device-id', 'iotedgedev-edgedevice',
'--update-dotenv' '--update-dotenv'
], az_cli = TestAzureCli(sys.stdout) ) ], az_cli = TestAzureCli(sys.stdout) )
print(result.output) print(result.output)