Esempio n. 1
0
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)
Esempio n. 2
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)
Esempio n. 3
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)
Esempio n. 4
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)