Skip to content
This repository was archived by the owner on Aug 28, 2025. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/windowsiot/azext_windowsiotservices/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ def __init__(self, cli_ctx=None):
windowsiotservices_custom = CliCommandType(
operations_tmpl='azext_windowsiotservices.custom#{}',
client_factory=cf_windowsiotservices)
super(DeviceServicesCommandsLoader, self).__init__(cli_ctx=cli_ctx,
custom_command_type=windowsiotservices_custom)
parent = super(DeviceServicesCommandsLoader, self)
parent.__init__(cli_ctx=cli_ctx, custom_command_type=windowsiotservices_custom)

def load_command_table(self, args):
from azext_windowsiotservices.generated.commands import load_command_table
Expand Down
7 changes: 3 additions & 4 deletions src/windowsiot/azext_windowsiotservices/generated/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
# pylint: disable=too-many-lines
# pylint: disable=too-many-statements

from knack.arguments import CLIArgumentType
from azure.cli.core.commands.parameters import resource_group_name_type


Expand All @@ -21,7 +20,7 @@ def load_arguments(self, _):

with self.argument_context('windowsiotservices service show') as c:
c.argument('resource_group_name', resource_group_name_type)
c.argument('device_name', help='The name of the Windows IoT Device Service.')
c.argument('device_name', help='The name of the Windows IoT Device Service.', id_part='name')

with self.argument_context('windowsiotservices service create') as c:
c.argument('resource_group_name', resource_group_name_type)
Expand All @@ -35,7 +34,7 @@ def load_arguments(self, _):

with self.argument_context('windowsiotservices service update') as c:
c.argument('resource_group_name', resource_group_name_type)
c.argument('device_name', help='The name of the Windows IoT Device Service.')
c.argument('device_name', help='The name of the Windows IoT Device Service.', id_part='name')
c.argument('if_match', help='ETag of the Windows IoT Device Service. Do not specify for creating a brand new Wi'
'ndows IoT Device Service. Required to update an existing Windows IoT Device Service.')
c.argument('notes', help='Windows IoT Device Service notes.')
Expand All @@ -45,7 +44,7 @@ def load_arguments(self, _):

with self.argument_context('windowsiotservices service delete') as c:
c.argument('resource_group_name', resource_group_name_type)
c.argument('device_name', help='The name of the Windows IoT Device Service.')
c.argument('device_name', help='The name of the Windows IoT Device Service.', id_part='name')

with self.argument_context('windowsiotservices service check-device-service-name-availability') as c:
c.argument('name', help='The name of the Windows IoT Device Service to check.')
14 changes: 0 additions & 14 deletions src/windowsiot/azext_windowsiotservices/generated/_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,3 @@
# Changes may cause incorrect behavior and will be lost if the code is
# regenerated.
# --------------------------------------------------------------------------


def example_name_or_id_validator(cmd, namespace):
from azure.cli.core.commands.client_factory import get_subscription_id
from msrestazure.tools import is_valid_resource_id, resource_id
if namespace.storage_account:
if not is_valid_resource_id(namespace.RESOURCE):
namespace.storage_account = resource_id(
subscription=get_subscription_id(cmd.cli_ctx),
resource_group=namespace.resource_group_name,
namespace='Microsoft.Storage',
type='storageAccounts',
name=namespace.storage_account
)
14 changes: 7 additions & 7 deletions src/windowsiot/azext_windowsiotservices/generated/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@
# pylint: disable=too-many-lines


def windowsiotservices_service_list(cmd, client,
def windowsiotservices_service_list(client,
resource_group_name=None):
if resource_group_name is not None:
if resource_group_name:
return client.list_by_resource_group(resource_group_name=resource_group_name)
return client.list()


def windowsiotservices_service_show(cmd, client,
def windowsiotservices_service_show(client,
resource_group_name,
device_name):
return client.get(resource_group_name=resource_group_name,
device_name=device_name)


def windowsiotservices_service_create(cmd, client,
def windowsiotservices_service_create(client,
resource_group_name,
device_name,
if_match=None,
Expand All @@ -41,7 +41,7 @@ def windowsiotservices_service_create(cmd, client,
admin_domain_name=admin_domain_name)


def windowsiotservices_service_update(cmd, client,
def windowsiotservices_service_update(client,
resource_group_name,
device_name,
if_match=None,
Expand All @@ -58,13 +58,13 @@ def windowsiotservices_service_update(cmd, client,
admin_domain_name=admin_domain_name)


def windowsiotservices_service_delete(cmd, client,
def windowsiotservices_service_delete(client,
resource_group_name,
device_name):
return client.delete(resource_group_name=resource_group_name,
device_name=device_name)


def windowsiotservices_service_check_device_service_name_availability(cmd, client,
def windowsiotservices_service_check_device_service_name_availability(client,
name):
return client.check_device_service_name_availability(name=name)
28 changes: 25 additions & 3 deletions src/windowsiot/azext_windowsiotservices/tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,14 @@
# --------------------------------------------------------------------------
import inspect
import os
import sys
import traceback
from azure.core.exceptions import AzureError
from azure.cli.testsdk.exceptions import CliTestError, CliExecutionError, JMESPathCheckAssertionError


__path__ = __import__('pkgutil').extend_path(__path__, __name__)
exceptions = []


def try_manual(func):
Expand All @@ -34,16 +39,33 @@ def get_func_to_call():
func_to_call = func
try:
func_to_call = import_manual_function(func)
print("Found manual override for {}(...)".format(func.__name__))
except (ImportError, AttributeError):
pass
return func_to_call

def wrapper(*args, **kwargs):
func_to_call = get_func_to_call()
print("running {}()...".format(func.__name__))
return func_to_call(*args, **kwargs)
try:
return func_to_call(*args, **kwargs)
except (AssertionError, AzureError, CliTestError, CliExecutionError, JMESPathCheckAssertionError) as e:
print("--------------------------------------")
print("step exception: ", e)
print("--------------------------------------", file=sys.stderr)
print("step exception in {}: {}".format(func.__name__, e), file=sys.stderr)
traceback.print_exc()
exceptions.append((func.__name__, sys.exc_info()))

if inspect.isclass(func):
return get_func_to_call()
else:
return wrapper
return wrapper


def raise_if():
if exceptions:
if len(exceptions) <= 1:
raise exceptions[0][1][1]
message = "{}\nFollowed with exceptions in other steps:\n".format(str(exceptions[0][1][1]))
message += "\n".join(["{}: {}".format(h[0], h[1][1]) for h in exceptions[1:]])
raise exceptions[0][1][0](message).with_traceback(exceptions[0][1][2])
89 changes: 66 additions & 23 deletions src/windowsiot/azext_windowsiotservices/tests/latest/preparers.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,16 @@

import os
from datetime import datetime
from azure.cli.testsdk.preparers import NoTrafficRecordingPreparer
from azure_devtools.scenario_tests import SingleValueReplacer
from azure.cli.testsdk.preparers import NoTrafficRecordingPreparer
from azure.cli.testsdk.exceptions import CliTestError
from azure.cli.testsdk.reverse_dependency import get_dummy_cli


KEY_RESOURCE_GROUP = 'rg'
KEY_VIRTUAL_NETWORK = 'vnet'
KEY_VNET_SUBNET = 'subnet'
KEY_VNET_NIC = 'nic'


class VirtualNetworkPreparer(NoTrafficRecordingPreparer, SingleValueReplacer):
Expand All @@ -40,7 +41,7 @@ def __init__(self, name_prefix='clitest.vn',
self.resource_group_key = resource_group_key
self.dev_setting_name = os.environ.get(dev_setting_name, None)

def create_resource(self, name, **kwargs):
def create_resource(self, name, **_):
if self.dev_setting_name:
return {self.parameter_name: self.dev_setting_name, }

Expand All @@ -56,61 +57,103 @@ def create_resource(self, name, **kwargs):
tags['job'] = os.environ['ENV_JOB_NAME']
tags = ' '.join(['{}={}'.format(key, value)
for key, value in tags.items()])
template = 'az network vnet create --resource-group {} --name {} --tag ' + tags
template = 'az network vnet create --resource-group {} --name {} --subnet-name default --tag ' + tags
self.live_only_execute(self.cli_ctx, template.format(
self.resource_group_name, name))

self.test_class_instance.kwargs[self.key] = name
return {self.parameter_name: name}

def remove_resource(self, name, **kwargs):
def remove_resource(self, name, **_):
# delete vnet if test is being recorded and if the vnet is not a dev rg
if not self.dev_setting_name:
self.live_only_execute(
self.cli_ctx, 'az network vnet delete --name {} --resource-group {}'.format(name, self.resource_group_name))
self.cli_ctx,
'az network vnet delete --name {} --resource-group {}'.format(name, self.resource_group_name))


class VnetSubnetPreparer(NoTrafficRecordingPreparer, SingleValueReplacer):
def __init__(self, name_prefix='clitest.vn',
parameter_name='subnet',
resource_group_name=None,
resource_group_key=KEY_RESOURCE_GROUP,
vnet_name=None,
vnet_key=KEY_VIRTUAL_NETWORK,
address_prefixes="11.0.0.0/24",
dev_setting_name='AZURE_CLI_TEST_DEV_VNET_SUBNET_NAME',
random_name_length=24, key=KEY_VNET_SUBNET):
key=KEY_VNET_SUBNET):
if ' ' in name_prefix:
raise CliTestError(
'Error: Space character in name prefix \'%s\'' % name_prefix)
super(VnetSubnetPreparer, self).__init__(
name_prefix, random_name_length)
super(VnetSubnetPreparer, self).__init__(name_prefix, 15)
self.cli_ctx = get_dummy_cli()
self.parameter_name = parameter_name
self.key = key
self.resource_group_name = resource_group_name
self.resource_group_key = resource_group_key
self.vnet_name = vnet_name
self.vnet_key = vnet_key
self.resource_group = [resource_group_key, None]
self.vnet = [vnet_key, None]
self.address_prefixes = address_prefixes
self.dev_setting_name = os.environ.get(dev_setting_name, None)

def create_resource(self, name, **kwargs):
def create_resource(self, name, **_):
if self.dev_setting_name:
return {self.parameter_name: self.dev_setting_name, }

if not self.resource_group_name:
self.resource_group_name = self.test_class_instance.kwargs.get(
self.resource_group_key)
if not self.resource_group_name:
if not self.resource_group[1]:
self.resource_group[1] = self.test_class_instance.kwargs.get(
self.resource_group[0])
if not self.resource_group[1]:
raise CliTestError("Error: No resource group configured!")
if not self.vnet_name:
self.vnet_name = self.test_class_instance.kwargs.get(self.vnet_key)
if not self.vnet_name:
if not self.vnet[1]:
self.vnet[1] = self.test_class_instance.kwargs.get(self.vnet[0])
if not self.vnet[1]:
raise CliTestError("Error: No vnet configured!")

self.test_class_instance.kwargs[self.key] = 'default'
return {self.parameter_name: name}

def remove_resource(self, name, **kwargs):
def remove_resource(self, name, **_):
pass


class VnetNicPreparer(NoTrafficRecordingPreparer, SingleValueReplacer):
def __init__(self, name_prefix='clitest.nic',
parameter_name='subnet',
resource_group_key=KEY_RESOURCE_GROUP,
vnet_key=KEY_VIRTUAL_NETWORK,
dev_setting_name='AZURE_CLI_TEST_DEV_VNET_NIC_NAME',
key=KEY_VNET_NIC):
if ' ' in name_prefix:
raise CliTestError(
'Error: Space character in name prefix \'%s\'' % name_prefix)
super(VnetNicPreparer, self).__init__(name_prefix, 15)
self.cli_ctx = get_dummy_cli()
self.parameter_name = parameter_name
self.key = key
self.resource_group = [resource_group_key, None]
self.vnet = [vnet_key, None]
self.dev_setting_name = os.environ.get(dev_setting_name, None)

def create_resource(self, name, **_):
if self.dev_setting_name:
return {self.parameter_name: self.dev_setting_name, }

if not self.resource_group[1]:
self.resource_group[1] = self.test_class_instance.kwargs.get(
self.resource_group[0])
if not self.resource_group[1]:
raise CliTestError("Error: No resource group configured!")
if not self.vnet[1]:
self.vnet[1] = self.test_class_instance.kwargs.get(self.vnet[0])
if not self.vnet[1]:
raise CliTestError("Error: No vnet configured!")

template = 'az network nic create --resource-group {} --name {} --vnet-name {} --subnet default '
self.live_only_execute(self.cli_ctx, template.format(
self.resource_group[1], name, self.vnet[1]))

self.test_class_instance.kwargs[self.key] = name
return {self.parameter_name: name}

def remove_resource(self, name, **_):
if not self.dev_setting_name:
self.live_only_execute(
self.cli_ctx,
'az network nic delete --name {} --resource-group {}'.format(name, self.resource_group[1]))
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,8 @@
# --------------------------------------------------------------------------

import os
import unittest

from azure_devtools.scenario_tests import AllowLargeResponse
from azure.cli.testsdk import ScenarioTest
from .. import try_manual
from .. import try_manual, raise_if
from azure.cli.testsdk import ResourceGroupPreparer


Expand Down Expand Up @@ -41,7 +38,8 @@ def step__services_put_service_create(test, rg, rg_2, rg_3, rg_4):
# EXAMPLE: /Services/get/Service_List
@try_manual
def step__services_get_service_list(test, rg, rg_2, rg_3, rg_4):
test.cmd('az windowsiotservices service list',
test.cmd('az windowsiotservices service list '
'-g ""',
checks=[])


Expand Down Expand Up @@ -120,3 +118,4 @@ class DeviceServicesScenarioTest(ScenarioTest):
def test_windowsiotservices(self, rg, rg_2, rg_3, rg_4):

call_scenario(self, rg, rg_2, rg_3, rg_4)
raise_if()
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,10 @@
# --------------------------------------------------------------------------

from ._device_services import DeviceServices
from ._version import VERSION

__version__ = VERSION
__all__ = ['DeviceServices']

try:
from .patch import patch_sdk
from ._patch import patch_sdk
patch_sdk()
except ImportError:
pass
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,13 @@
from azure.core.configuration import Configuration
from azure.core.pipeline import policies

from ._version import VERSION

if TYPE_CHECKING:
# pylint: disable=unused-import,ungrouped-imports
from typing import Any

from azure.core.credentials import TokenCredential

VERSION = "unknown"

class DeviceServicesConfiguration(Configuration):
"""Configuration for DeviceServices.
Expand Down Expand Up @@ -47,9 +46,10 @@ def __init__(

self.credential = credential
self.subscription_id = subscription_id
self.api_version = "2019-06-01"
self.api_version = "2019-06-02"
self.credential_scopes = ['https://management.azure.com/.default']
kwargs.setdefault('sdk_moniker', 'mgmt-windowsiot/{}'.format(VERSION))
self.credential_scopes.extend(kwargs.pop('credential_scopes', []))
kwargs.setdefault('sdk_moniker', 'deviceservices/{}'.format(VERSION))
self._configure(**kwargs)

def _configure(
Expand Down
Loading