Skip to content

Commit

Permalink
Knack conversion for lab module (#5068)
Browse files Browse the repository at this point in the history
* initial lab knack convert

* username validator to commands.py

* resource-group to resource_group_name to get argtype bindings

* cleaned up params

* tranformers to _format, fixed precedence of client_factory kwarg, style, validators

* enabled style/static check

* bug with if no command_type

* addressed comments, fixed transformers

* flake

* Operations template path periods
  • Loading branch information
williexu authored and tjprescott committed Dec 12, 2017
1 parent dc3f6bf commit 262361e
Show file tree
Hide file tree
Showing 13 changed files with 438 additions and 465 deletions.
2 changes: 0 additions & 2 deletions .flake8
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ exclude =
doc
build_scripts
src/command_modules/azure-cli-storage
src/command_modules/azure-cli-lab
src/command_modules/azure-cli-rdbms
src/command_modules/azure-cli-lab
src/command_modules/azure-cli-sql
src/command_modules/azure-cli-vm
src/command_modules/azure-cli-acs
Expand Down
2 changes: 1 addition & 1 deletion scripts/ci/test_static.sh
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ run_style azure.cli.command_modules.find
run_style azure.cli.command_modules.interactive
#run_style azure.cli.command_modules.iot
run_style azure.cli.command_modules.keyvault
#run_style azure.cli.command_modules.lab
run_style azure.cli.command_modules.lab
#run_style azure.cli.command_modules.monitor
run_style azure.cli.command_modules.network
#run_style azure.cli.command_modules.nspkg
Expand Down
4 changes: 2 additions & 2 deletions src/azure-cli-core/azure/cli/core/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -317,8 +317,8 @@ def _cli_command(self, name, operation=None, handler=None, argument_loader=None,
name = ' '.join(name.split())

command_type = kwargs.get('command_type', None)
client_factory = command_type.settings.get('client_factory', None) if command_type \
else kwargs.get('client_factory', None)
client_factory = kwargs.get('client_factory', None) or command_type and \
command_type.settings.get('client_factory', None)

def default_command_handler(command_args):
from azure.cli.core.util import get_arg_list
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,27 @@
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------

from azure.cli.core import AzCommandsLoader

import azure.cli.command_modules.lab._help # pylint: disable=unused-import


def load_params(_):
import azure.cli.command_modules.lab._params # pylint: disable=redefined-outer-name, unused-variable
class DevTestLabCommandsLoader(AzCommandsLoader):

def __init__(self, cli_ctx=None):
from azure.cli.core.commands import CliCommandType
lab_custom = CliCommandType(operations_tmpl='azure.cli.command_modules.lab.custom#{}')
super(DevTestLabCommandsLoader, self).__init__(cli_ctx=cli_ctx, custom_command_type=lab_custom,
min_profile='2017-03-10-profile')

def load_command_table(self, args):
from azure.cli.command_modules.lab.commands import load_command_table
load_command_table(self, args)
return self.command_table

def load_arguments(self, command):
from azure.cli.command_modules.lab._params import load_arguments
load_arguments(self, command)


def load_commands():
import azure.cli.command_modules.lab.commands # pylint: disable=redefined-outer-name, unused-variable
COMMAND_LOADER_CLS = DevTestLabCommandsLoader
Original file line number Diff line number Diff line change
Expand Up @@ -5,51 +5,51 @@


# MANAGEMENT CLIENT FACTORIES
def get_devtestlabs_management_client(_):
def get_devtestlabs_management_client(cli_ctx, _):
from azure.mgmt.devtestlabs import DevTestLabsClient
from azure.cli.core.commands.client_factory import get_mgmt_service_client
return get_mgmt_service_client(DevTestLabsClient)
return get_mgmt_service_client(cli_ctx, DevTestLabsClient)


def get_devtestlabs_virtual_machine_operation(kwargs):
return get_devtestlabs_management_client(kwargs).virtual_machines
def get_devtestlabs_virtual_machine_operation(cli_ctx, _):
return get_devtestlabs_management_client(cli_ctx, _).virtual_machines


def get_devtestlabs_lab_operation(kwargs):
return get_devtestlabs_management_client(kwargs).labs
def get_devtestlabs_lab_operation(cli_ctx, _):
return get_devtestlabs_management_client(cli_ctx, _).labs


def get_devtestlabs_custom_image_operation(kwargs):
return get_devtestlabs_management_client(kwargs).custom_images
def get_devtestlabs_custom_image_operation(cli_ctx, _):
return get_devtestlabs_management_client(cli_ctx, _).custom_images


def get_devtestlabs_gallery_image_operation(kwargs):
return get_devtestlabs_management_client(kwargs).gallery_images
def get_devtestlabs_gallery_image_operation(cli_ctx, _):
return get_devtestlabs_management_client(cli_ctx, _).gallery_images


def get_devtestlabs_artifact_operation(kwargs):
return get_devtestlabs_management_client(kwargs).artifacts
def get_devtestlabs_artifact_operation(cli_ctx, _):
return get_devtestlabs_management_client(cli_ctx, _).artifacts


def get_devtestlabs_artifact_source_operation(kwargs):
return get_devtestlabs_management_client(kwargs).artifact_sources
def get_devtestlabs_artifact_source_operation(cli_ctx, _):
return get_devtestlabs_management_client(cli_ctx, _).artifact_sources


def get_devtestlabs_virtual_network_operation(kwargs):
return get_devtestlabs_management_client(kwargs).virtual_networks
def get_devtestlabs_virtual_network_operation(cli_ctx, _):
return get_devtestlabs_management_client(cli_ctx, _).virtual_networks


def get_devtestlabs_formula_operation(kwargs):
return get_devtestlabs_management_client(kwargs).formulas
def get_devtestlabs_formula_operation(cli_ctx, _):
return get_devtestlabs_management_client(cli_ctx, _).formulas


def get_devtestlabs_secret_operation(kwargs):
return get_devtestlabs_management_client(kwargs).secrets
def get_devtestlabs_secret_operation(cli_ctx, _):
return get_devtestlabs_management_client(cli_ctx, _).secrets


def get_devtestlabs_environment_operation(kwargs):
return get_devtestlabs_management_client(kwargs).environments
def get_devtestlabs_environment_operation(cli_ctx, _):
return get_devtestlabs_management_client(cli_ctx, _).environments


def get_devtestlabs_arm_template_operation(kwargs):
return get_devtestlabs_management_client(kwargs).arm_templates
def get_devtestlabs_arm_template_operation(cli_ctx, _):
return get_devtestlabs_management_client(cli_ctx, _).arm_templates
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------


from collections import OrderedDict


def export_artifacts(formula):
""" Exports artifacts from the given formula. This method removes some of the properties of the
artifact model as they do not play important part for users in create or read context.
"""
artifacts = []
if formula and formula.formula_content and formula.formula_content.artifacts:
artifacts = formula.formula_content.artifacts
for artifact in formula.formula_content.artifacts:
del artifact.status
del artifact.deployment_status_message
del artifact.vm_extension_status_message
del artifact.install_time
return artifacts


def transform_artifact_source_list(artifact_source_list):
return [transform_artifact_source(v) for v in artifact_source_list]


def transform_artifact_source(result):
return OrderedDict([('name', result['name']),
('sourceType', result['sourceType']),
('status', result.get('status')),
('uri', result.get('uri'))])


def transform_arm_template_list(arm_template_list):
return [transform_arm_template(v) for v in arm_template_list]


def transform_arm_template(result):
return OrderedDict([('name', result['name']),
('resourceGroup', result['resourceGroup']),
('publisher', result.get('publisher'))])


def transform_vm_list(vm_list):
return [_transform_vm_dict(v) for v in vm_list]


def _transform_vm_dict(result):
return OrderedDict([('name', result['name']),
('location', result['location']),
('osType', result['osType'])])


def transform_vm(result):
return OrderedDict([('name', result.name),
('location', result.location),
('osType', result.os_type)])
Original file line number Diff line number Diff line change
Expand Up @@ -3,116 +3,78 @@
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------

from azure.cli.command_modules.lab.validators import (validate_lab_vm_create,
validate_lab_vm_list,
validate_user_name,
validate_template_id,
validate_claim_vm,
_validate_artifacts)
from azure.cli.core.commands.parameters import resource_group_name_type
from azure.cli.core.commands import ParametersContext
from azure.cli.command_modules.lab.validators import validate_artifacts, validate_template_id
from azure.cli.core.util import get_json_object


with ParametersContext(command='lab') as c:
c.argument('resource_group', arg_type=resource_group_name_type,
help='Name of lab\'s resource group. You can configure the default group '
'using \'az configure --defaults group=<name>\'')
def load_arguments(self, _):
with self.argument_context('lab custom-image create') as c:
c.argument('name', options_list=['--name', '-n'])

with ParametersContext(command='lab custom-image create') as c:
c.register_alias('resource_group', ('--resource-group', '-g'))
c.register_alias('name', ('--name', '-n'))
with self.argument_context('lab vm create') as c:
c.argument('name', options_list=['--name', '-n'])

with ParametersContext(command='lab vm create') as c:
c.register_alias('resource_group', ('--resource-group', '-g'), validator=validate_lab_vm_create)
c.register_alias('name', ('--name', '-n'))
# Authentication related arguments
for arg_name in ['admin_username', 'admin_password', 'authentication_type', 'ssh_key', 'generate_ssh_keys',
'saved_secret']:
c.argument(arg_name, arg_group='Authentication')
c.argument('generate_ssh_keys', action='store_true')

# Authentication related arguments
authentication_group_name = 'Authentication'
c.argument('admin_username', arg_group=authentication_group_name)
c.argument('admin_password', arg_group=authentication_group_name)
c.argument('authentication_type', arg_group=authentication_group_name)
c.argument('ssh_key', arg_group=authentication_group_name)
c.argument('generate_ssh_keys', action='store_true', arg_group=authentication_group_name)
c.argument('saved_secret', arg_group=authentication_group_name)
# Add Artifacts from json object
c.argument('artifacts', type=get_json_object)

# Add Artifacts from json object
c.argument('artifacts', type=get_json_object)
# Image related arguments
c.ignore('os_type', 'gallery_image_reference', 'custom_image_id')

# Image related arguments
c.ignore('os_type')
c.ignore('gallery_image_reference')
c.ignore('custom_image_id')
c.argument('image')
# Network related arguments
for arg_name in ['ip_configuration', 'subnet', 'vnet_name']:
c.argument(arg_name, arg_group='Network')

# Network related arguments
network_group_name = 'Network'
c.argument('ip_configuration', arg_group=network_group_name)
c.argument('subnet', arg_group=network_group_name)
c.argument('vnet_name', arg_group=network_group_name)
c.ignore('lab_subnet_name')
c.ignore('lab_virtual_network_id')
c.ignore('disallow_public_ip_address')
c.ignore('network_interface')
c.ignore('lab_subnet_name', 'lab_virtual_network_id', 'disallow_public_ip_address', 'network_interface')

# Creating VM in the different location then lab is an officially unsupported scenario
c.ignore('location')
# Creating VM in the different location then lab is an officially unsupported scenario
c.ignore('location')
c.argument('allow_claim', action='store_true')

c.argument('expiration_date')
c.argument('formula')
c.argument('allow_claim', action='store_true')
with self.argument_context('lab vm list') as c:
for arg_name in ['filters', 'all', 'claimable', 'environment']:
c.argument(arg_name, arg_group='Filter')

for arg_name in ['all', 'claimable']:
c.argument(arg_name, action='store_true')

with ParametersContext(command='lab vm list') as c:
filter_arg_group_name = 'Filter'
c.argument('filters', arg_group=filter_arg_group_name)
c.argument('all', action='store_true', arg_group=filter_arg_group_name)
c.argument('claimable', action='store_true', arg_group=filter_arg_group_name)
c.argument('environment', arg_group=filter_arg_group_name)
c.register_alias('resource_group', ('--resource-group', '-g'), validator=validate_lab_vm_list)
with self.argument_context('lab vm claim') as c:
c.argument('name', options_list=['--name', '-n'], id_part='child_name_1')
c.argument('lab_name', id_part='name')

with self.argument_context('lab vm apply-artifacts') as c:
c.argument('artifacts', type=get_json_object, validator=validate_artifacts)
c.argument('name', options_list=['--name', '-n'])

with ParametersContext(command='lab vm claim') as c:
c.register_alias('resource_group', ('--resource-group', '-g'), validator=validate_claim_vm)
c.register_alias('name', ('--name', '-n'), id_part='child_name_1')
c.argument('lab_name', id_part='name')
with self.argument_context('lab formula') as c:
c.argument('name', options_list=['--name', '-n'])

with self.argument_context('lab secret') as c:
from azure.mgmt.devtestlabs.models.secret import Secret

with ParametersContext(command='lab vm apply-artifacts') as c:
c.register('artifacts', ('--artifacts',), type=get_json_object, validator=_validate_artifacts)
c.register_alias('name', ('--name', '-n'))
c.argument('name', options_list=['--name', '-n'])
c.argument('secret', options_list=['--value'], type=lambda x: Secret(value=x))
c.ignore('user_name')

with self.argument_context('lab formula export-artifacts') as c:
# Exporting artifacts does not need expand filter
c.ignore('expand')

with ParametersContext(command='lab formula') as c:
c.register_alias('name', ('--name', '-n'))
with self.argument_context('lab environment') as c:
c.argument('name', options_list=['--name', '-n'])
c.ignore('user_name')

with self.argument_context('lab environment create') as c:
c.argument('arm_template', validator=validate_template_id)
c.argument('parameters', type=get_json_object)

with ParametersContext(command='lab secret') as c:
from azure.mgmt.devtestlabs.models.secret import Secret
with self.argument_context('lab arm-template') as c:
c.argument('name', options_list=['--name', '-n'])

c.register_alias('name', ('--name', '-n'))
c.register_alias('secret', ('--value', ), type=lambda x: Secret(value=x))
c.ignore('user_name')
c.argument('lab_name', validator=validate_user_name)


with ParametersContext(command='lab formula export-artifacts') as c:
# Exporting artifacts does not need expand filter
c.ignore('expand')


with ParametersContext(command='lab environment') as c:
c.register_alias('name', ('--name', '-n'))
c.ignore('user_name')
c.argument('lab_name', validator=validate_user_name)


with ParametersContext(command='lab environment create') as c:
c.argument('arm_template', validator=validate_template_id)
c.argument('parameters', type=get_json_object)

with ParametersContext(command='lab arm-template') as c:
c.register_alias('name', ('--name', '-n'))

with ParametersContext(command='lab arm-template show') as c:
c.argument('export_parameters', action='store_true')
with self.argument_context('lab arm-template show') as c:
c.argument('export_parameters', action='store_true')
Loading

0 comments on commit 262361e

Please sign in to comment.