Exemple #1
0
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()
Exemple #2
0
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()
Exemple #3
0
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)
Exemple #4
0
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)
Exemple #5
0
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()
Exemple #6
0
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()
Exemple #7
0
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()
Exemple #8
0
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()
Exemple #9
0
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)
Exemple #12
0
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)
Exemple #13
0
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()
Exemple #14
0
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)
Exemple #15
0
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()
Exemple #16
0
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)
Exemple #17
0
    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
Exemple #18
0
    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
Exemple #19
0
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)