def update_wp_custom_rule(cmd, resource_group_name, policy_name, rule_name, priority=None, action=None, rate_limit_duration=None, rate_limit_threshold=None, disabled=None): client = cf_waf_policies(cmd.cli_ctx, None) policy = cached_get(cmd, client.get, resource_group_name, policy_name) foundRule = False for rule in policy.custom_rules.rules: if rule.name.lower() == rule_name.lower(): foundRule = True with UpdateContext(rule) as c: c.update_param('priority', priority, None) c.update_param('action', action, None) c.update_param('rate_limit_duration', rate_limit_duration, None) c.update_param('rate_limit_threshold', rate_limit_threshold, None) c.update_param('enabled_state', 'Enabled' if not disabled else 'Disabled', 'Disabled') if not foundRule: from knack.util import CLIError raise CLIError("rule '{}' not found".format(rule_name)) return cached_put(cmd, client.create_or_update, policy, resource_group_name, policy_name).result()
def config_repo_delete(cmd, client, resource_group, name, repo_name): resource = client.get(resource_group, name) config_server = resource.properties.config_server_properties.config_server if not config_server or not config_server.config or not config_server.config.repositories: raise CLIError("Repo {} not found.".format(repo_name)) config = config_server.git_property repository = [ repo for repo in config.repositories if repo.name == repo_name ] if not repository: raise CLIError("Repo {} not found.".format(repo_name)) config.repositories.remove(repository[0]) config_server_settings = models.ConfigServerSettings(git_property=config) config_server_properties = models.ConfigServerProperties( config_server=config_server_settings) cluster_esource_properties = models.ClusterResourceProperties( config_server_properties=config_server_properties) service_resource = models.ServiceResource( properties=cluster_esource_properties) return cached_put(cmd, client.update, service_resource, resource_group, name).result()
def remove_template_output(cmd, client, resource_group_name, image_template_name, output_name): _require_defer(cmd) existing_image_template = cached_get( cmd, client.virtual_machine_image_templates.get, resource_group_name=resource_group_name, image_template_name=image_template_name) if not existing_image_template.distribute: raise CLIError("No outputs to remove.") new_distribute = [] for existing_distributor in existing_image_template.distribute: if existing_distributor.run_output_name.lower() == output_name.lower(): continue new_distribute.append(existing_distributor) if len(new_distribute) == len(existing_image_template.distribute): raise CLIError( "Output with output name {} not in image template distribute list." .format(output_name)) existing_image_template.distribute = new_distribute return cached_put( cmd, client.virtual_machine_image_templates.begin_create_or_update, parameters=existing_image_template, # pylint: disable=line-too-long resource_group_name=resource_group_name, image_template_name=image_template_name)
def remove_template_customizer(cmd, client, resource_group_name, image_template_name, customizer_name): existing_image_template = cached_get( cmd, client.virtual_machine_image_templates.get, resource_group_name=resource_group_name, image_template_name=image_template_name) _require_defer(cmd) if not existing_image_template.customize: raise CLIError("No customizers to remove.") new_customize = [] for existing_customizer in existing_image_template.customize: if existing_customizer.name == customizer_name: continue new_customize.append(existing_customizer) if len(new_customize) == len(existing_image_template.customize): raise CLIError( "Customizer with name {} not in image template customizer list.". format(customizer_name)) existing_image_template.customize = new_customize return cached_put( cmd, client.virtual_machine_image_templates.begin_create_or_update, parameters=existing_image_template, # pylint: disable=line-too-long resource_group_name=resource_group_name, image_template_name=image_template_name)
def add_custom_rule_match_condition(cmd, resource_group_name, policy_name, rule_name, match_variable, operator, values, negate=None, transforms=None): from azext_front_door.vendored_sdks.models import MatchCondition client = cf_waf_policies(cmd.cli_ctx, None) policy = cached_get(cmd, client.get, resource_group_name, policy_name) foundRule = False for rule in policy.custom_rules.rules: if rule.name.upper() == rule_name.upper(): foundRule = True selector = None variable_parts = match_variable.split('.') if len(variable_parts) == 2: match_variable = variable_parts[0] selector = variable_parts[1] rule.match_conditions.append(MatchCondition( match_variable=match_variable, selector=selector, operator=operator, negate_condition=negate, match_value=values, transforms=transforms )) if not foundRule: from knack.util import CLIError raise CLIError("rule '{}' not found".format(rule_name)) return cached_put(cmd, client.create_or_update, policy, resource_group_name, policy_name).result()
def create_wp_custom_rule(cmd, resource_group_name, policy_name, rule_name, priority, rule_type, action, rate_limit_duration=None, rate_limit_threshold=None, disabled=None): if rule_type.lower() == "ratelimitrule" and (rate_limit_duration is None or rate_limit_threshold is None): from knack.util import CLIError raise CLIError( "rate_limit_duration and rate_limit_threshold are required for a RateLimitRule" ) from azext_front_door.vendored_sdks.models import CustomRule client = cf_waf_policies(cmd.cli_ctx, None) policy = cached_get(cmd, client.get, resource_group_name, policy_name) rule = CustomRule(name=rule_name, priority=priority, rule_type=rule_type, action=action, match_conditions=[], rate_limit_duration_in_minutes=rate_limit_duration, rate_limit_threshold=rate_limit_threshold, enabled_state='Enabled' if not disabled else 'Disabled') policy.custom_rules.rules.append(rule) return cached_put(cmd, client.create_or_update, policy, resource_group_name, policy_name).result()
def config_repo_update(cmd, client, resource_group, name, repo_name, uri=None, pattern=None, label=None, search_paths=None, username=None, password=None, host_key=None, host_key_algorithm=None, private_key=None, strict_host_key_checking=None): resource = client.get(resource_group, name) config_server = resource.properties.config_server_properties.config_server if not config_server or not config_server.git_property or not config_server.git_property.repositories: raise CLIError("Repo {} not found.".format(repo_name)) config = config_server.git_property repository = [ repo for repo in config.repositories if repo.name == repo_name ] if not repository: raise CLIError("Repo {} not found.".format(repo_name)) if search_paths: search_paths = search_paths.split(",") if pattern: pattern = pattern.split(",") repository = repository[0] repository = models.GitPatternRepository() repository.uri = uri or repository.uri repository.label = label or repository.label repository.search_paths = search_paths or repository.search_paths repository.username = username or repository.username repository.password = password or repository.password repository.host_key = host_key or repository.host_key repository.host_key_algorithm = host_key_algorithm or repository.host_key_algorithm repository.private_key = private_key or repository.private_key repository.strict_host_key_checking = strict_host_key_checking or repository.strict_host_key_checking config_server_settings = models.ConfigServerSettings(git_property=config) config_server_properties = models.ConfigServerProperties( config_server=config_server_settings) cluster_esource_properties = models.ClusterResourceProperties( config_server_properties=config_server_properties) service_resource = models.ServiceResource( properties=cluster_esource_properties) return cached_put(cmd, client.update, service_resource, resource_group, name).result()
def config_repo_add(cmd, client, resource_group, name, uri, repo_name, pattern=None, label=None, search_paths=None, username=None, password=None, host_key=None, host_key_algorithm=None, private_key=None, strict_host_key_checking=None): resource = client.get(resource_group, name) config_server = resource.properties.config_server_properties.config_server config = models.ConfigServerGitProperty( uri=uri) if not config_server else config_server.git_property if search_paths: search_paths = search_paths.split(",") if config.repositories: repos = [ repo for repo in config.repositories if repo.name == repo_name ] if repos: raise CLIError("Repo {} already exiests.".format(repo_name)) else: config.repositories = [] repository = models.GitPatternRepository( uri=uri, name=repo_name, label=label, search_paths=search_paths, username=username, password=password, host_key=host_key, host_key_algorithm=host_key_algorithm, private_key=private_key, strict_host_key_checking=strict_host_key_checking) config.repositories.append(repository) config_server_settings = models.ConfigServerSettings(git_property=config) config_server_properties = models.ConfigServerProperties( config_server=config_server_settings) cluster_resource_properties = models.ClusterResourceProperties( config_server_properties=config_server_properties) service_resource = models.ServiceResource( properties=cluster_resource_properties) return cached_put(cmd, client.update, service_resource, resource_group, name).result()
def add_template_output(cmd, client, resource_group_name, image_template_name, gallery_name=None, location=None, # pylint: disable=line-too-long, unused-argument output_name=None, is_vhd=None, tags=None, gallery_image_definition=None, gallery_replication_regions=None, managed_image=None, managed_image_location=None): # pylint: disable=line-too-long, unused-argument _require_defer(cmd) from azure.mgmt.imagebuilder.models import ( ImageTemplateManagedImageDistributor, ImageTemplateVhdDistributor, ImageTemplateSharedImageDistributor) existing_image_template = cached_get( cmd, client.virtual_machine_image_templates.get, resource_group_name=resource_group_name, image_template_name=image_template_name) distributor = None if managed_image: parsed = parse_resource_id(managed_image) distributor = ImageTemplateManagedImageDistributor( run_output_name=output_name or parsed['name'], image_id=managed_image, location=managed_image_location or location) elif gallery_image_definition: parsed = parse_resource_id(gallery_image_definition) distributor = ImageTemplateSharedImageDistributor( run_output_name=output_name or parsed['child_name_1'], gallery_image_id=gallery_image_definition, replication_regions=gallery_replication_regions or [location]) elif is_vhd: distributor = ImageTemplateVhdDistributor(run_output_name=output_name) if distributor: distributor.artifact_tags = tags or {} if existing_image_template.distribute is None: existing_image_template.distribute = [] else: for existing_distributor in existing_image_template.distribute: if existing_distributor.run_output_name == distributor.run_output_name: raise CLIError( "Output with output name {} already exists in image template {}." .format(distributor.run_output_name.lower(), image_template_name)) existing_image_template.distribute.append(distributor) return cached_put( cmd, client.virtual_machine_image_templates.begin_create_or_update, parameters=existing_image_template, # pylint: disable=line-too-long resource_group_name=resource_group_name, image_template_name=image_template_name)
def create_image_template( # pylint: disable=too-many-locals cmd, client, resource_group_name, image_template_name, location=None, source_dict=None, scripts_list=None, destinations_lists=None, build_timeout=None, tags=None, source=None, scripts=None, checksum=None, managed_image_destinations=None, # pylint: disable=unused-argument shared_image_destinations=None, no_wait=False): # pylint: disable=unused-argument, too-many-locals from azure.mgmt.imagebuilder.models import (ImageTemplate, ImageTemplateSharedImageVersionSource, ImageTemplatePlatformImageSource, ImageTemplateIsoSource, ImageTemplateManagedImageSource, # pylint: disable=line-too-long ImageTemplateShellCustomizer, ImageTemplatePowerShellCustomizer, ImageTemplateManagedImageDistributor, ImageTemplateSharedImageDistributor) # pylint: disable=line-too-long template_source, template_scripts, template_destinations = None, [], [] # create image template source settings if source_dict['type'] == _SourceType.PLATFORM_IMAGE: template_source = ImageTemplatePlatformImageSource(**source_dict) elif source_dict['type'] == _SourceType.ISO_URI: template_source = ImageTemplateIsoSource(**source_dict) elif source_dict['type'] == _SourceType.MANAGED_IMAGE: template_source = ImageTemplateManagedImageSource(**source_dict) elif source_dict['type'] == _SourceType.SIG_VERSION: template_source = ImageTemplateSharedImageVersionSource(**source_dict) # create image template customizer settings # Script structure can be found in _parse_script's function definition for script in scripts_list: script.pop("is_url") script["script_uri"] = script.pop("script") if script["type"] == ScriptType.SHELL: template_scripts.append(ImageTemplateShellCustomizer(**script)) elif script["type"] == ScriptType.POWERSHELL: template_scripts.append(ImageTemplatePowerShellCustomizer(**script)) else: # Should never happen logger.debug("Script %s has type %s", script["script"], script["type"]) raise CLIError("Script {} has an invalid type.".format(script["script"])) # create image template distribution / destination settings for dest_type, rid, loc_info in destinations_lists: parsed = parse_resource_id(rid) if dest_type == _DestType.MANAGED_IMAGE: template_destinations.append(ImageTemplateManagedImageDistributor( image_id=rid, location=loc_info, run_output_name=parsed['name'])) elif dest_type == _DestType.SHARED_IMAGE_GALLERY: template_destinations.append(ImageTemplateSharedImageDistributor( gallery_image_id=rid, replication_regions=loc_info, run_output_name=parsed['child_name_1'])) else: logger.info("No applicable destination found for destination %s", str(tuple([dest_type, rid, loc_info]))) image_template = ImageTemplate(source=template_source, customize=template_scripts, distribute=template_destinations, location=location, build_timeout_in_minutes=build_timeout, tags=(tags or {})) return cached_put(cmd, client.virtual_machine_image_templates.create_or_update, parameters=image_template, resource_group_name=resource_group_name, image_template_name=image_template_name)
def clear_template_output(cmd, client, resource_group_name, image_template_name): _require_defer(cmd) existing_image_template = cached_get(cmd, client.virtual_machine_image_templates.get, resource_group_name=resource_group_name, image_template_name=image_template_name) if not existing_image_template.distribute: raise CLIError("No outputs to remove.") existing_image_template.distribute = [] return cached_put(cmd, client.virtual_machine_image_templates.create_or_update, parameters=existing_image_template, resource_group_name=resource_group_name, image_template_name=image_template_name)
def add_template_customizer(cmd, client, resource_group_name, image_template_name, customizer_name, customizer_type, script_url=None, inline_script=None, valid_exit_codes=None, restart_command=None, restart_check_command=None, restart_timeout=None, file_source=None, dest_path=None, search_criteria=None, filters=None, update_limit=None): _require_defer(cmd) from azure.mgmt.imagebuilder.models import (ImageTemplateShellCustomizer, ImageTemplatePowerShellCustomizer, ImageTemplateRestartCustomizer, ImageTemplateFileCustomizer, ImageTemplateWindowsUpdateCustomizer) existing_image_template = cached_get(cmd, client.virtual_machine_image_templates.get, resource_group_name=resource_group_name, image_template_name=image_template_name) if existing_image_template.customize is None: existing_image_template.customize = [] else: for existing_customizer in existing_image_template.customize: if existing_customizer.name == customizer_name: raise CLIError("Output with output name {} already exists in image template {}." .format(customizer_name, image_template_name)) new_customizer = None if customizer_type.lower() == ScriptType.SHELL.value.lower(): # pylint:disable=no-member new_customizer = ImageTemplateShellCustomizer(name=customizer_name, script_uri=script_url, inline=inline_script) elif customizer_type.lower() == ScriptType.POWERSHELL.value.lower(): # pylint:disable=no-member new_customizer = ImageTemplatePowerShellCustomizer(name=customizer_name, script_uri=script_url, inline=inline_script, valid_exit_codes=valid_exit_codes) elif customizer_type.lower() == ScriptType.WINDOWS_RESTART.value.lower(): # pylint:disable=no-member new_customizer = ImageTemplateRestartCustomizer(name=customizer_name, restart_command=restart_command, restart_check_command=restart_check_command, restart_timeout=restart_timeout) elif customizer_type.lower() == ScriptType.FILE.value.lower(): # pylint:disable=no-member new_customizer = ImageTemplateFileCustomizer(name=customizer_name, source_uri=file_source, destination=dest_path) elif customizer_type.lower() == ScriptType.WINDOWS_UPDATE.value.lower(): new_customizer = ImageTemplateWindowsUpdateCustomizer(name=customizer_name, search_criteria=search_criteria, filters=filters, update_limit=update_limit) if not new_customizer: raise CLIError("Cannot determine customizer from type {}.".format(customizer_type)) existing_image_template.customize.append(new_customizer) return cached_put(cmd, client.virtual_machine_image_templates.create_or_update, parameters=existing_image_template, resource_group_name=resource_group_name, image_template_name=image_template_name)
def config_git_set(cmd, client, resource_group, name, uri, label=None, search_paths=None, username=None, password=None, host_key=None, host_key_algorithm=None, private_key=None, strict_host_key_checking=None): resource = client.get(resource_group, name) config_server = resource.properties.config_server_properties.config_server config = models.ConfigServerGitProperty( uri=uri) if not config_server else config_server.git_property if search_paths: search_paths = search_paths.split(",") config.uri = uri config.label = label config.search_paths = search_paths config.username = username config.password = password config.host_key = host_key config.host_key_algorithm = host_key_algorithm config.private_key = private_key config.strict_host_key_checking = strict_host_key_checking config_server = models.ConfigServerSettings(git_property=config) config_server_properties = models.ConfigServerProperties( config_server=config_server) cluster_esource_properties = models.ClusterResourceProperties( config_server_properties=config_server_properties) service_resource = models.ServiceResource( properties=cluster_esource_properties) return cached_put(cmd, client.update, service_resource, resource_group, name).result()
def clear_template_customizer(cmd, client, resource_group_name, image_template_name): _require_defer(cmd) existing_image_template = cached_get( cmd, client.virtual_machine_image_templates.get, resource_group_name=resource_group_name, image_template_name=image_template_name) if not existing_image_template.customize: raise CLIError("No customizers to remove.") existing_image_template.customize = [] return cached_put( cmd, client.virtual_machine_image_templates.begin_create_or_update, parameters=existing_image_template, # pylint: disable=line-too-long resource_group_name=resource_group_name, image_template_name=image_template_name)
def remove_custom_rule_match_condition(cmd, resource_group_name, policy_name, rule_name, index): client = cf_waf_policies(cmd.cli_ctx, None) policy = cached_get(cmd, client.get, resource_group_name, policy_name) foundRule = False for rule in policy.custom_rules.rules: if rule.name.upper() == rule_name.upper(): foundRule = True if index >= len(rule.match_conditions): from knack.util import CLIError raise CLIError("Index out of bounds") rule.match_conditions = [v for (i, v) in enumerate(rule.match_conditions) if i != index] if not foundRule: from knack.util import CLIError raise CLIError("rule '{}' not found".format(rule_name)) return cached_put(cmd, client.create_or_update, policy, resource_group_name, policy_name).result()
def create_image_template( # pylint: disable=too-many-locals, too-many-branches, too-many-statements cmd, client, resource_group_name, image_template_name, location=None, source_dict=None, scripts_list=None, destinations_lists=None, build_timeout=None, tags=None, source=None, scripts=None, checksum=None, managed_image_destinations=None, # pylint: disable=unused-argument shared_image_destinations=None, no_wait=False, image_template=None): # pylint: disable=unused-argument, too-many-locals from azure.mgmt.imagebuilder.models import (ImageTemplate, ImageTemplateSharedImageVersionSource, ImageTemplatePlatformImageSource, ImageTemplateIsoSource, ImageTemplateManagedImageSource, # pylint: disable=line-too-long ImageTemplateShellCustomizer, ImageTemplatePowerShellCustomizer, ImageTemplateManagedImageDistributor, ImageTemplateSharedImageDistributor) # pylint: disable=line-too-long if image_template is not None: if os.path.exists(image_template): # Local file with open(image_template) as f: content = f.read() else: # It should be an URL msg = '\nusage error: --image-template is not a correct local path or URL' try: r = requests.get(image_template) except Exception: raise CLIError(traceback.format_exc() + msg) if r.status_code != 200: raise CLIError(traceback.format_exc() + msg) content = r.content try: obj = json.loads(content) except json.JSONDecodeError: raise CLIError( traceback.format_exc() + '\nusage error: Content of --image-template is not a valid JSON string' ) content = {} if 'properties' in obj: content = obj['properties'] if 'location' in obj: content['location'] = obj['location'] if 'tags' in obj: content['tags'] = obj['tags'] return client.virtual_machine_image_templates.create_or_update( parameters=content, resource_group_name=resource_group_name, image_template_name=image_template_name) template_source, template_scripts, template_destinations = None, [], [] # create image template source settings if source_dict['type'] == _SourceType.PLATFORM_IMAGE: template_source = ImageTemplatePlatformImageSource(**source_dict) elif source_dict['type'] == _SourceType.ISO_URI: template_source = ImageTemplateIsoSource(**source_dict) elif source_dict['type'] == _SourceType.MANAGED_IMAGE: template_source = ImageTemplateManagedImageSource(**source_dict) elif source_dict['type'] == _SourceType.SIG_VERSION: template_source = ImageTemplateSharedImageVersionSource(**source_dict) # create image template customizer settings # Script structure can be found in _parse_script's function definition for script in scripts_list: script.pop("is_url") script["script_uri"] = script.pop("script") if script["type"] == ScriptType.SHELL: template_scripts.append(ImageTemplateShellCustomizer(**script)) elif script["type"] == ScriptType.POWERSHELL: template_scripts.append( ImageTemplatePowerShellCustomizer(**script)) else: # Should never happen logger.debug("Script %s has type %s", script["script"], script["type"]) raise CLIError("Script {} has an invalid type.".format( script["script"])) # create image template distribution / destination settings for dest_type, rid, loc_info in destinations_lists: parsed = parse_resource_id(rid) if dest_type == _DestType.MANAGED_IMAGE: template_destinations.append( ImageTemplateManagedImageDistributor( image_id=rid, location=loc_info, run_output_name=parsed['name'])) elif dest_type == _DestType.SHARED_IMAGE_GALLERY: template_destinations.append( ImageTemplateSharedImageDistributor( gallery_image_id=rid, replication_regions=loc_info, run_output_name=parsed['child_name_1'])) else: logger.info("No applicable destination found for destination %s", str(tuple([dest_type, rid, loc_info]))) image_template = ImageTemplate(source=template_source, customize=template_scripts, distribute=template_destinations, location=location, build_timeout_in_minutes=build_timeout, tags=(tags or {})) return cached_put(cmd, client.virtual_machine_image_templates.create_or_update, parameters=image_template, resource_group_name=resource_group_name, image_template_name=image_template_name)
def handler(self, command_args): # pylint: disable=too-many-locals, too-many-statements, too-many-branches """ Callback function of CLICommand handler """ from knack.util import CLIError from azure.cli.core.commands import cached_get, cached_put, _is_poller from azure.cli.core.util import find_child_item, augment_no_wait_handler_args from azure.cli.core.commands.arm import add_usage, remove_usage, set_usage,\ add_properties, remove_properties, set_properties self.cmd = command_args.get('cmd') force_string = command_args.get('force_string', False) ordered_arguments = command_args.pop('ordered_arguments', []) dest_names = self.child_arg_name.split('.') child_names = [command_args.get(key, None) for key in dest_names] for item in [ 'properties_to_add', 'properties_to_set', 'properties_to_remove' ]: if command_args[item]: raise CLIError("Unexpected '{}' was not empty.".format(item)) del command_args[item] getter, getterargs = self._extract_op_handler_and_args( command_args, self.getter_op_path) if self.child_collection_prop_name: parent = cached_get(self.cmd, getter, **getterargs) instance = find_child_item(parent, *child_names, path=self.child_collection_prop_name, key_path=self.child_collection_key) else: parent = None instance = cached_get(self.cmd, getter, **getterargs) # pass instance to the custom_function, if provided if self.custom_function_op_path: custom_function, custom_func_args = self._extract_op_handler_and_args( command_args, self.custom_function_op_path) if self.child_collection_prop_name: parent = custom_function(instance=instance, parent=parent, **custom_func_args) else: instance = custom_function(instance=instance, **custom_func_args) # apply generic updates after custom updates setter, setterargs = self._extract_op_handler_and_args( command_args, self.setter_op_path) for arg in ordered_arguments: arg_type, arg_values = arg if arg_type == '--set': try: for expression in arg_values: set_properties(instance, expression, force_string) except ValueError: raise CLIError('invalid syntax: {}'.format(set_usage)) elif arg_type == '--add': try: add_properties(instance, arg_values, force_string) except ValueError: raise CLIError('invalid syntax: {}'.format(add_usage)) elif arg_type == '--remove': try: remove_properties(instance, arg_values) except ValueError: raise CLIError('invalid syntax: {}'.format(remove_usage)) # Done... update the instance! setterargs[ self. setter_arg_name] = parent if self.child_collection_prop_name else instance # Handle no-wait supports_no_wait = self.cmd.command_kwargs.get('supports_no_wait', None) if supports_no_wait: no_wait_enabled = command_args.get('no_wait', False) augment_no_wait_handler_args(no_wait_enabled, setter, setterargs) else: no_wait_param = self.cmd.command_kwargs.get('no_wait_param', None) if no_wait_param: setterargs[no_wait_param] = command_args[no_wait_param] if self.setter_arg_name == 'parameters': result = cached_put(self.cmd, setter, **setterargs) else: result = cached_put(self.cmd, setter, setterargs[self.setter_arg_name], setter_arg_name=self.setter_arg_name, **setterargs) if supports_no_wait and no_wait_enabled: return None no_wait_param = self.cmd.command_kwargs.get('no_wait_param', None) if no_wait_param and setterargs.get(no_wait_param, None): return None if _is_poller(result): result = result.result() if self.child_collection_prop_name: result = find_child_item(result, *child_names, path=self.child_collection_prop_name, key_path=self.child_collection_key) return result
def handler(args): # pylint: disable=too-many-branches,too-many-statements cmd = args.get('cmd') context_copy = copy.copy(context) context_copy.cli_ctx = cmd.cli_ctx force_string = args.get('force_string', False) ordered_arguments = args.pop('ordered_arguments', []) dest_names = child_arg_name.split('.') child_names = [args.get(key, None) for key in dest_names] for item in ['properties_to_add', 'properties_to_set', 'properties_to_remove']: if args[item]: raise CLIError("Unexpected '{}' was not empty.".format(item)) del args[item] getter, getterargs = _extract_handler_and_args(args, cmd.command_kwargs, getter_op, context_copy) if child_collection_prop_name: parent = cached_get(cmd, getter, **getterargs) instance = find_child_item( parent, *child_names, path=child_collection_prop_name, key_path=child_collection_key) else: parent = None instance = cached_get(cmd, getter, **getterargs) # pass instance to the custom_function, if provided if custom_function_op: custom_function, custom_func_args = _extract_handler_and_args( args, cmd.command_kwargs, custom_function_op, context_copy) if child_collection_prop_name: parent = custom_function(instance=instance, parent=parent, **custom_func_args) else: instance = custom_function(instance=instance, **custom_func_args) # apply generic updates after custom updates setter, setterargs = _extract_handler_and_args(args, cmd.command_kwargs, setter_op, context_copy) for arg in ordered_arguments: arg_type, arg_values = arg if arg_type == '--set': try: for expression in arg_values: set_properties(instance, expression, force_string) except ValueError: raise CLIError('invalid syntax: {}'.format(set_usage)) elif arg_type == '--add': try: add_properties(instance, arg_values, force_string) except ValueError: raise CLIError('invalid syntax: {}'.format(add_usage)) elif arg_type == '--remove': try: remove_properties(instance, arg_values) except ValueError: raise CLIError('invalid syntax: {}'.format(remove_usage)) # Done... update the instance! setterargs[setter_arg_name] = parent if child_collection_prop_name else instance # Handle no-wait supports_no_wait = cmd.command_kwargs.get('supports_no_wait', None) if supports_no_wait: no_wait_enabled = args.get('no_wait', False) augment_no_wait_handler_args(no_wait_enabled, setter, setterargs) else: no_wait_param = cmd.command_kwargs.get('no_wait_param', None) if no_wait_param: setterargs[no_wait_param] = args[no_wait_param] if setter_arg_name == 'parameters': result = cached_put(cmd, setter, **setterargs) else: result = cached_put(cmd, setter, setterargs[setter_arg_name], **setterargs) if supports_no_wait and no_wait_enabled: return None no_wait_param = cmd.command_kwargs.get('no_wait_param', None) if no_wait_param and setterargs.get(no_wait_param, None): return None if _is_poller(result): result = result.result() if child_collection_prop_name: result = find_child_item( result, *child_names, path=child_collection_prop_name, key_path=child_collection_key) return result
def create_image_template( # pylint: disable=too-many-locals, too-many-branches, too-many-statements, unused-argument cmd, client, resource_group_name, image_template_name, location=None, source_dict=None, scripts_list=None, destinations_lists=None, build_timeout=None, tags=None, source=None, scripts=None, checksum=None, managed_image_destinations=None, shared_image_destinations=None, no_wait=False, image_template=None, identity=None, vm_size=None, os_disk_size=None, vnet=None, subnet=None, proxy_vm_size=None, build_vm_identities=None): from azure.mgmt.imagebuilder.models import ( ImageTemplate, ImageTemplateSharedImageVersionSource, ImageTemplatePlatformImageSource, ImageTemplateManagedImageSource, ImageTemplateShellCustomizer, ImageTemplatePowerShellCustomizer, ImageTemplateManagedImageDistributor, ImageTemplateSharedImageDistributor, ImageTemplateIdentity, ComponentsVrq145SchemasImagetemplateidentityPropertiesUserassignedidentitiesAdditionalproperties, # pylint: disable=line-too-long ImageTemplateVmProfile, VirtualNetworkConfig) if image_template is not None: logger.warning( 'You are using --image-template. All other parameters will be ignored.' ) if os.path.exists(image_template): # Local file with open(image_template) as f: content = f.read() else: # It should be an URL msg = '\nusage error: --image-template is not a correct local path or URL' try: r = requests.get(image_template) except Exception: raise CLIError(traceback.format_exc() + msg) if r.status_code != 200: raise CLIError(traceback.format_exc() + msg) content = r.content try: obj = json.loads(content) except json.JSONDecodeError: raise CLIError( traceback.format_exc() + '\nusage error: Content of --image-template is not a valid JSON string' ) content = {} if 'properties' in obj: content = obj['properties'] if 'location' in obj: content['location'] = obj['location'] if 'tags' in obj: content['tags'] = obj['tags'] if 'identity' in obj: content['identity'] = obj['identity'] return client.virtual_machine_image_templates.begin_create_or_update( parameters=content, resource_group_name=resource_group_name, image_template_name=image_template_name) template_source, template_scripts, template_destinations = None, [], [] # create image template source settings if source_dict['type'] == _SourceType.PLATFORM_IMAGE: template_source = ImageTemplatePlatformImageSource(**source_dict) elif source_dict['type'] == _SourceType.ISO_URI: # It was supported before but is removed in the current service version. raise CLIError('usage error: Source type ISO URI is not supported.') elif source_dict['type'] == _SourceType.MANAGED_IMAGE: template_source = ImageTemplateManagedImageSource(**source_dict) elif source_dict['type'] == _SourceType.SIG_VERSION: template_source = ImageTemplateSharedImageVersionSource(**source_dict) # create image template customizer settings # Script structure can be found in _parse_script's function definition for script in scripts_list: script.pop("is_url") script["script_uri"] = script.pop("script") if script["type"] == ScriptType.SHELL: template_scripts.append(ImageTemplateShellCustomizer(**script)) elif script["type"] == ScriptType.POWERSHELL: template_scripts.append( ImageTemplatePowerShellCustomizer(**script)) else: # Should never happen logger.debug("Script %s has type %s", script["script"], script["type"]) raise CLIError("Script {} has an invalid type.".format( script["script"])) # create image template distribution / destination settings for dest_type, rid, loc_info in destinations_lists: parsed = parse_resource_id(rid) if dest_type == _DestType.MANAGED_IMAGE: template_destinations.append( ImageTemplateManagedImageDistributor( image_id=rid, location=loc_info, run_output_name=parsed['name'])) elif dest_type == _DestType.SHARED_IMAGE_GALLERY: template_destinations.append( ImageTemplateSharedImageDistributor( gallery_image_id=rid, replication_regions=loc_info, run_output_name=parsed['child_name_1'])) else: logger.info("No applicable destination found for destination %s", str(tuple([dest_type, rid, loc_info]))) # Identity identity_body = None if identity is not None: subscription_id = get_subscription_id(cmd.cli_ctx) user_assigned_identities = {} for ide in identity: if not is_valid_resource_id(ide): ide = resource_id(subscription=subscription_id, resource_group=resource_group_name, namespace='Microsoft.ManagedIdentity', type='userAssignedIdentities', name=ide) user_assigned_identities[ide] = ComponentsVrq145SchemasImagetemplateidentityPropertiesUserassignedidentitiesAdditionalproperties() # pylint: disable=line-too-long identity_body = ImageTemplateIdentity( type='UserAssigned', user_assigned_identities=user_assigned_identities) # VM profile vnet_config = None if vnet or subnet: if not is_valid_resource_id(subnet): subscription_id = get_subscription_id(cmd.cli_ctx) subnet = resource_id(subscription=subscription_id, resource_group=resource_group_name, namespace='Microsoft.Network', type='virtualNetworks', name=vnet, child_type_1='subnets', child_name_1=subnet) vnet_config = VirtualNetworkConfig(subnet_id=subnet) if proxy_vm_size is not None: if subnet is not None: vnet_config = VirtualNetworkConfig(subnet_id=subnet, proxy_vm_size=proxy_vm_size) else: raise RequiredArgumentMissingError( 'Usage error: --proxy-vm-size is only configurable when --subnet is specified.' ) vm_profile = ImageTemplateVmProfile(vm_size=vm_size, os_disk_size_gb=os_disk_size, user_assigned_identities=build_vm_identities, vnet_config=vnet_config) # pylint: disable=line-too-long image_template = ImageTemplate(source=template_source, customize=template_scripts, distribute=template_destinations, location=location, build_timeout_in_minutes=build_timeout, tags=(tags or {}), identity=identity_body, vm_profile=vm_profile) return cached_put( cmd, client.virtual_machine_image_templates.begin_create_or_update, parameters=image_template, resource_group_name=resource_group_name, image_template_name=image_template_name)