# coding=utf-8
# --------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# Code generated by Microsoft (R) AutoRest Code Generator.
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
# --------------------------------------------------------------------------

import msrest.serialization


class Resource(msrest.serialization.Model):
    """Resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(Resource, self).__init__(**kwargs)
        self.id = None
        self.name = None
        self.type = None


class Application(Resource):
    """Schema for Application properties.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param description: Description of Application.
    :type description: str
    :param friendly_name: Friendly name of Application.
    :type friendly_name: str
    :param file_path: Specifies a path for the executable file for the application.
    :type file_path: str
    :param command_line_setting: Required. Specifies whether this published application can be
     launched with command line arguments provided by the client, command line arguments specified
     at publish time, or no command line arguments at all. Possible values include: "DoNotAllow",
     "Allow", "Require".
    :type command_line_setting: str or ~desktop_virtualization_api_client.models.CommandLineSetting
    :param command_line_arguments: Command Line Arguments for Application.
    :type command_line_arguments: str
    :param show_in_portal: Specifies whether to show the RemoteApp program in the RD Web Access
     server.
    :type show_in_portal: bool
    :param icon_path: Path to icon.
    :type icon_path: str
    :param icon_index: Index of the icon.
    :type icon_index: int
    :ivar icon_hash: Hash of the icon.
    :vartype icon_hash: str
    :ivar icon_content: the icon a 64 bit string as a byte array.
    :vartype icon_content: bytearray
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
        'command_line_setting': {'required': True},
        'icon_hash': {'readonly': True},
        'icon_content': {'readonly': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'description': {'key': 'properties.description', 'type': 'str'},
        'friendly_name': {'key': 'properties.friendlyName', 'type': 'str'},
        'file_path': {'key': 'properties.filePath', 'type': 'str'},
        'command_line_setting': {'key': 'properties.commandLineSetting', 'type': 'str'},
        'command_line_arguments': {'key': 'properties.commandLineArguments', 'type': 'str'},
        'show_in_portal': {'key': 'properties.showInPortal', 'type': 'bool'},
        'icon_path': {'key': 'properties.iconPath', 'type': 'str'},
        'icon_index': {'key': 'properties.iconIndex', 'type': 'int'},
        'icon_hash': {'key': 'properties.iconHash', 'type': 'str'},
        'icon_content': {'key': 'properties.iconContent', 'type': 'bytearray'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(Application, self).__init__(**kwargs)
        self.description = kwargs.get('description', None)
        self.friendly_name = kwargs.get('friendly_name', None)
        self.file_path = kwargs.get('file_path', None)
        self.command_line_setting = kwargs['command_line_setting']
        self.command_line_arguments = kwargs.get('command_line_arguments', None)
        self.show_in_portal = kwargs.get('show_in_portal', None)
        self.icon_path = kwargs.get('icon_path', None)
        self.icon_index = kwargs.get('icon_index', None)
        self.icon_hash = None
        self.icon_content = None


class TrackedResource(Resource):
    """The resource model definition for a ARM tracked top level resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param tags: A set of tags. Resource tags.
    :type tags: dict[str, str]
    :param location: Required. The geo-location where the resource lives.
    :type location: str
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
        'location': {'required': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'tags': {'key': 'tags', 'type': '{str}'},
        'location': {'key': 'location', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(TrackedResource, self).__init__(**kwargs)
        self.tags = kwargs.get('tags', None)
        self.location = kwargs['location']


class ApplicationGroup(TrackedResource):
    """Represents a ApplicationGroup definition.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param tags: A set of tags. Resource tags.
    :type tags: dict[str, str]
    :param location: Required. The geo-location where the resource lives.
    :type location: str
    :param description: Description of ApplicationGroup.
    :type description: str
    :param friendly_name: Friendly name of ApplicationGroup.
    :type friendly_name: str
    :param host_pool_arm_path: Required. HostPool arm path of ApplicationGroup.
    :type host_pool_arm_path: str
    :ivar workspace_arm_path: Workspace arm path of ApplicationGroup.
    :vartype workspace_arm_path: str
    :param application_group_type: Required. Resource Type of ApplicationGroup. Possible values
     include: "RemoteApp", "Desktop".
    :type application_group_type: str or
     ~desktop_virtualization_api_client.models.ApplicationGroupType
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
        'location': {'required': True},
        'host_pool_arm_path': {'required': True},
        'workspace_arm_path': {'readonly': True},
        'application_group_type': {'required': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'tags': {'key': 'tags', 'type': '{str}'},
        'location': {'key': 'location', 'type': 'str'},
        'description': {'key': 'properties.description', 'type': 'str'},
        'friendly_name': {'key': 'properties.friendlyName', 'type': 'str'},
        'host_pool_arm_path': {'key': 'properties.hostPoolArmPath', 'type': 'str'},
        'workspace_arm_path': {'key': 'properties.workspaceArmPath', 'type': 'str'},
        'application_group_type': {'key': 'properties.applicationGroupType', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(ApplicationGroup, self).__init__(**kwargs)
        self.description = kwargs.get('description', None)
        self.friendly_name = kwargs.get('friendly_name', None)
        self.host_pool_arm_path = kwargs['host_pool_arm_path']
        self.workspace_arm_path = None
        self.application_group_type = kwargs['application_group_type']


class ApplicationGroupList(msrest.serialization.Model):
    """List of ApplicationGroup definitions.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param value: List of ApplicationGroup definitions.
    :type value: list[~desktop_virtualization_api_client.models.ApplicationGroup]
    :ivar next_link: Link to the next page of results.
    :vartype next_link: str
    """

    _validation = {
        'next_link': {'readonly': True},
    }

    _attribute_map = {
        'value': {'key': 'value', 'type': '[ApplicationGroup]'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(ApplicationGroupList, self).__init__(**kwargs)
        self.value = kwargs.get('value', None)
        self.next_link = None


class ApplicationGroupPatch(Resource):
    """ApplicationGroup properties that can be patched.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param tags: A set of tags. tags to be updated.
    :type tags: dict[str, str]
    :param description: Description of ApplicationGroup.
    :type description: str
    :param friendly_name: Friendly name of ApplicationGroup.
    :type friendly_name: str
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'tags': {'key': 'tags', 'type': '{str}'},
        'description': {'key': 'properties.description', 'type': 'str'},
        'friendly_name': {'key': 'properties.friendlyName', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(ApplicationGroupPatch, self).__init__(**kwargs)
        self.tags = kwargs.get('tags', None)
        self.description = kwargs.get('description', None)
        self.friendly_name = kwargs.get('friendly_name', None)


class ApplicationList(msrest.serialization.Model):
    """List of Application definitions.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param value: List of Application definitions.
    :type value: list[~desktop_virtualization_api_client.models.Application]
    :ivar next_link: Link to the next page of results.
    :vartype next_link: str
    """

    _validation = {
        'next_link': {'readonly': True},
    }

    _attribute_map = {
        'value': {'key': 'value', 'type': '[Application]'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(ApplicationList, self).__init__(**kwargs)
        self.value = kwargs.get('value', None)
        self.next_link = None


class ApplicationPatch(msrest.serialization.Model):
    """Application properties that can be patched.

    :param tags: A set of tags. tags to be updated.
    :type tags: dict[str, str]
    :param description: Description of Application.
    :type description: str
    :param friendly_name: Friendly name of Application.
    :type friendly_name: str
    :param file_path: Specifies a path for the executable file for the application.
    :type file_path: str
    :param command_line_setting: Specifies whether this published application can be launched with
     command line arguments provided by the client, command line arguments specified at publish
     time, or no command line arguments at all. Possible values include: "DoNotAllow", "Allow",
     "Require".
    :type command_line_setting: str or ~desktop_virtualization_api_client.models.CommandLineSetting
    :param command_line_arguments: Command Line Arguments for Application.
    :type command_line_arguments: str
    :param show_in_portal: Specifies whether to show the RemoteApp program in the RD Web Access
     server.
    :type show_in_portal: bool
    :param icon_path: Path to icon.
    :type icon_path: str
    :param icon_index: Index of the icon.
    :type icon_index: int
    """

    _attribute_map = {
        'tags': {'key': 'tags', 'type': '{str}'},
        'description': {'key': 'properties.description', 'type': 'str'},
        'friendly_name': {'key': 'properties.friendlyName', 'type': 'str'},
        'file_path': {'key': 'properties.filePath', 'type': 'str'},
        'command_line_setting': {'key': 'properties.commandLineSetting', 'type': 'str'},
        'command_line_arguments': {'key': 'properties.commandLineArguments', 'type': 'str'},
        'show_in_portal': {'key': 'properties.showInPortal', 'type': 'bool'},
        'icon_path': {'key': 'properties.iconPath', 'type': 'str'},
        'icon_index': {'key': 'properties.iconIndex', 'type': 'int'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(ApplicationPatch, self).__init__(**kwargs)
        self.tags = kwargs.get('tags', None)
        self.description = kwargs.get('description', None)
        self.friendly_name = kwargs.get('friendly_name', None)
        self.file_path = kwargs.get('file_path', None)
        self.command_line_setting = kwargs.get('command_line_setting', None)
        self.command_line_arguments = kwargs.get('command_line_arguments', None)
        self.show_in_portal = kwargs.get('show_in_portal', None)
        self.icon_path = kwargs.get('icon_path', None)
        self.icon_index = kwargs.get('icon_index', None)


class Desktop(Resource):
    """Schema for Desktop properties.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param description: Description of Desktop.
    :type description: str
    :param friendly_name: Friendly name of Desktop.
    :type friendly_name: str
    :ivar icon_hash: Hash of the icon.
    :vartype icon_hash: str
    :ivar icon_content: The icon a 64 bit string as a byte array.
    :vartype icon_content: bytearray
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
        'icon_hash': {'readonly': True},
        'icon_content': {'readonly': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'description': {'key': 'properties.description', 'type': 'str'},
        'friendly_name': {'key': 'properties.friendlyName', 'type': 'str'},
        'icon_hash': {'key': 'properties.iconHash', 'type': 'str'},
        'icon_content': {'key': 'properties.iconContent', 'type': 'bytearray'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(Desktop, self).__init__(**kwargs)
        self.description = kwargs.get('description', None)
        self.friendly_name = kwargs.get('friendly_name', None)
        self.icon_hash = None
        self.icon_content = None


class DesktopList(msrest.serialization.Model):
    """List of Desktop definitions.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param value: List of Desktop definitions.
    :type value: list[~desktop_virtualization_api_client.models.Desktop]
    :ivar next_link: Link to the next page of results.
    :vartype next_link: str
    """

    _validation = {
        'next_link': {'readonly': True},
    }

    _attribute_map = {
        'value': {'key': 'value', 'type': '[Desktop]'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(DesktopList, self).__init__(**kwargs)
        self.value = kwargs.get('value', None)
        self.next_link = None


class DesktopPatch(msrest.serialization.Model):
    """Desktop properties that can be patched.

    :param tags: A set of tags. tags to be updated.
    :type tags: dict[str, str]
    :param description: Description of Desktop.
    :type description: str
    :param friendly_name: Friendly name of Desktop.
    :type friendly_name: str
    """

    _attribute_map = {
        'tags': {'key': 'tags', 'type': '{str}'},
        'description': {'key': 'properties.description', 'type': 'str'},
        'friendly_name': {'key': 'properties.friendlyName', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(DesktopPatch, self).__init__(**kwargs)
        self.tags = kwargs.get('tags', None)
        self.description = kwargs.get('description', None)
        self.friendly_name = kwargs.get('friendly_name', None)


class HostPool(TrackedResource):
    """Represents a HostPool definition.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param tags: A set of tags. Resource tags.
    :type tags: dict[str, str]
    :param location: Required. The geo-location where the resource lives.
    :type location: str
    :param friendly_name: Friendly name of HostPool.
    :type friendly_name: str
    :param description: Description of HostPool.
    :type description: str
    :param host_pool_type: Required. HostPool type for desktop. Possible values include:
     "Personal", "Pooled".
    :type host_pool_type: str or ~desktop_virtualization_api_client.models.HostPoolType
    :param personal_desktop_assignment_type: Required. PersonalDesktopAssignment type for HostPool.
     Possible values include: "Automatic", "Direct".
    :type personal_desktop_assignment_type: str or
     ~desktop_virtualization_api_client.models.PersonalDesktopAssignmentType
    :param custom_rdp_property: Custom rdp property of HostPool.
    :type custom_rdp_property: str
    :param max_session_limit: The max session limit of HostPool.
    :type max_session_limit: int
    :param load_balancer_type: Required. The type of the load balancer. Possible values include:
     "BreadthFirst", "DepthFirst", "Persistent".
    :type load_balancer_type: str or ~desktop_virtualization_api_client.models.LoadBalancerType
    :param ring: The ring number of HostPool.
    :type ring: int
    :param validation_environment: Is validation environment.
    :type validation_environment: bool
    :param registration_info: The registration info of HostPool.
    :type registration_info: ~desktop_virtualization_api_client.models.RegistrationInfo
    :param vm_template: VM template for sessionhosts configuration within hostpool.
    :type vm_template: str
    :ivar application_group_references: List of applicationGroup links.
    :vartype application_group_references: list[str]
    :param sso_context: Path to keyvault containing ssoContext secret.
    :type sso_context: str
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
        'location': {'required': True},
        'host_pool_type': {'required': True},
        'personal_desktop_assignment_type': {'required': True},
        'load_balancer_type': {'required': True},
        'application_group_references': {'readonly': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'tags': {'key': 'tags', 'type': '{str}'},
        'location': {'key': 'location', 'type': 'str'},
        'friendly_name': {'key': 'properties.friendlyName', 'type': 'str'},
        'description': {'key': 'properties.description', 'type': 'str'},
        'host_pool_type': {'key': 'properties.hostPoolType', 'type': 'str'},
        'personal_desktop_assignment_type': {'key': 'properties.personalDesktopAssignmentType', 'type': 'str'},
        'custom_rdp_property': {'key': 'properties.customRdpProperty', 'type': 'str'},
        'max_session_limit': {'key': 'properties.maxSessionLimit', 'type': 'int'},
        'load_balancer_type': {'key': 'properties.loadBalancerType', 'type': 'str'},
        'ring': {'key': 'properties.ring', 'type': 'int'},
        'validation_environment': {'key': 'properties.validationEnvironment', 'type': 'bool'},
        'registration_info': {'key': 'properties.registrationInfo', 'type': 'RegistrationInfo'},
        'vm_template': {'key': 'properties.vmTemplate', 'type': 'str'},
        'application_group_references': {'key': 'properties.applicationGroupReferences', 'type': '[str]'},
        'sso_context': {'key': 'properties.ssoContext', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(HostPool, self).__init__(**kwargs)
        self.friendly_name = kwargs.get('friendly_name', None)
        self.description = kwargs.get('description', None)
        self.host_pool_type = kwargs['host_pool_type']
        self.personal_desktop_assignment_type = kwargs['personal_desktop_assignment_type']
        self.custom_rdp_property = kwargs.get('custom_rdp_property', None)
        self.max_session_limit = kwargs.get('max_session_limit', None)
        self.load_balancer_type = kwargs['load_balancer_type']
        self.ring = kwargs.get('ring', None)
        self.validation_environment = kwargs.get('validation_environment', None)
        self.registration_info = kwargs.get('registration_info', None)
        self.vm_template = kwargs.get('vm_template', None)
        self.application_group_references = None
        self.sso_context = kwargs.get('sso_context', None)


class HostPoolList(msrest.serialization.Model):
    """List of HostPool definitions.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param value: List of HostPool definitions.
    :type value: list[~desktop_virtualization_api_client.models.HostPool]
    :ivar next_link: Link to the next page of results.
    :vartype next_link: str
    """

    _validation = {
        'next_link': {'readonly': True},
    }

    _attribute_map = {
        'value': {'key': 'value', 'type': '[HostPool]'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(HostPoolList, self).__init__(**kwargs)
        self.value = kwargs.get('value', None)
        self.next_link = None


class HostPoolPatch(Resource):
    """HostPool properties that can be patched.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param tags: A set of tags. tags to be updated.
    :type tags: dict[str, str]
    :param friendly_name: Friendly name of HostPool.
    :type friendly_name: str
    :param description: Description of HostPool.
    :type description: str
    :param custom_rdp_property: Custom rdp property of HostPool.
    :type custom_rdp_property: str
    :param max_session_limit: The max session limit of HostPool.
    :type max_session_limit: int
    :param personal_desktop_assignment_type: PersonalDesktopAssignment type for HostPool. Possible
     values include: "Automatic", "Direct".
    :type personal_desktop_assignment_type: str or
     ~desktop_virtualization_api_client.models.PersonalDesktopAssignmentType
    :param load_balancer_type: The type of the load balancer. Possible values include:
     "BreadthFirst", "DepthFirst", "Persistent".
    :type load_balancer_type: str or ~desktop_virtualization_api_client.models.LoadBalancerType
    :param ring: The ring number of HostPool.
    :type ring: int
    :param validation_environment: Is validation environment.
    :type validation_environment: bool
    :param registration_info: The registration info of HostPool.
    :type registration_info: ~desktop_virtualization_api_client.models.RegistrationInfoPatch
    :param sso_context: Path to keyvault containing ssoContext secret.
    :type sso_context: str
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'tags': {'key': 'tags', 'type': '{str}'},
        'friendly_name': {'key': 'properties.friendlyName', 'type': 'str'},
        'description': {'key': 'properties.description', 'type': 'str'},
        'custom_rdp_property': {'key': 'properties.customRdpProperty', 'type': 'str'},
        'max_session_limit': {'key': 'properties.maxSessionLimit', 'type': 'int'},
        'personal_desktop_assignment_type': {'key': 'properties.personalDesktopAssignmentType', 'type': 'str'},
        'load_balancer_type': {'key': 'properties.loadBalancerType', 'type': 'str'},
        'ring': {'key': 'properties.ring', 'type': 'int'},
        'validation_environment': {'key': 'properties.validationEnvironment', 'type': 'bool'},
        'registration_info': {'key': 'properties.registrationInfo', 'type': 'RegistrationInfoPatch'},
        'sso_context': {'key': 'properties.ssoContext', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(HostPoolPatch, self).__init__(**kwargs)
        self.tags = kwargs.get('tags', None)
        self.friendly_name = kwargs.get('friendly_name', None)
        self.description = kwargs.get('description', None)
        self.custom_rdp_property = kwargs.get('custom_rdp_property', None)
        self.max_session_limit = kwargs.get('max_session_limit', None)
        self.personal_desktop_assignment_type = kwargs.get('personal_desktop_assignment_type', None)
        self.load_balancer_type = kwargs.get('load_balancer_type', None)
        self.ring = kwargs.get('ring', None)
        self.validation_environment = kwargs.get('validation_environment', None)
        self.registration_info = kwargs.get('registration_info', None)
        self.sso_context = kwargs.get('sso_context', None)


class RegistrationInfo(msrest.serialization.Model):
    """Represents a RegistrationInfo definition.

    :param expiration_time: Expiration time of registration token.
    :type expiration_time: ~datetime.datetime
    :param token: The registration token base64 encoded string.
    :type token: str
    :param registration_token_operation: The type of resetting the token. Possible values include:
     "Delete", "None", "Update".
    :type registration_token_operation: str or
     ~desktop_virtualization_api_client.models.RegistrationTokenOperation
    """

    _attribute_map = {
        'expiration_time': {'key': 'expirationTime', 'type': 'iso-8601'},
        'token': {'key': 'token', 'type': 'str'},
        'registration_token_operation': {'key': 'registrationTokenOperation', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(RegistrationInfo, self).__init__(**kwargs)
        self.expiration_time = kwargs.get('expiration_time', None)
        self.token = kwargs.get('token', None)
        self.registration_token_operation = kwargs.get('registration_token_operation', None)


class RegistrationInfoPatch(msrest.serialization.Model):
    """Represents a RegistrationInfo definition.

    :param expiration_time: Expiration time of registration token.
    :type expiration_time: ~datetime.datetime
    :param registration_token_operation: The type of resetting the token. Possible values include:
     "Delete", "None", "Update".
    :type registration_token_operation: str or
     ~desktop_virtualization_api_client.models.RegistrationTokenOperation
    """

    _attribute_map = {
        'expiration_time': {'key': 'expirationTime', 'type': 'iso-8601'},
        'registration_token_operation': {'key': 'registrationTokenOperation', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(RegistrationInfoPatch, self).__init__(**kwargs)
        self.expiration_time = kwargs.get('expiration_time', None)
        self.registration_token_operation = kwargs.get('registration_token_operation', None)


class ResourceProviderOperation(msrest.serialization.Model):
    """Supported operation of this resource provider.

    :param name: Operation name, in format of {provider}/{resource}/{operation}.
    :type name: str
    :param display: Display metadata associated with the operation.
    :type display: ~desktop_virtualization_api_client.models.ResourceProviderOperationDisplay
    """

    _attribute_map = {
        'name': {'key': 'name', 'type': 'str'},
        'display': {'key': 'display', 'type': 'ResourceProviderOperationDisplay'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(ResourceProviderOperation, self).__init__(**kwargs)
        self.name = kwargs.get('name', None)
        self.display = kwargs.get('display', None)


class ResourceProviderOperationDisplay(msrest.serialization.Model):
    """Display metadata associated with the operation.

    :param provider: Resource provider: Microsoft Desktop Virtualization.
    :type provider: str
    :param resource: Resource on which the operation is performed.
    :type resource: str
    :param operation: Type of operation: get, read, delete, etc.
    :type operation: str
    :param description: Description of this operation.
    :type description: str
    """

    _attribute_map = {
        'provider': {'key': 'provider', 'type': 'str'},
        'resource': {'key': 'resource', 'type': 'str'},
        'operation': {'key': 'operation', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(ResourceProviderOperationDisplay, self).__init__(**kwargs)
        self.provider = kwargs.get('provider', None)
        self.resource = kwargs.get('resource', None)
        self.operation = kwargs.get('operation', None)
        self.description = kwargs.get('description', None)


class ResourceProviderOperationList(msrest.serialization.Model):
    """Result of the request to list operations.

    :param value: List of operations supported by this resource provider.
    :type value: list[~desktop_virtualization_api_client.models.ResourceProviderOperation]
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[ResourceProviderOperation]'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(ResourceProviderOperationList, self).__init__(**kwargs)
        self.value = kwargs.get('value', None)


class SendMessage(msrest.serialization.Model):
    """Represents message sent to a UserSession.

    :param message_title: Title of message.
    :type message_title: str
    :param message_body: Body of message.
    :type message_body: str
    """

    _attribute_map = {
        'message_title': {'key': 'messageTitle', 'type': 'str'},
        'message_body': {'key': 'messageBody', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(SendMessage, self).__init__(**kwargs)
        self.message_title = kwargs.get('message_title', None)
        self.message_body = kwargs.get('message_body', None)


class SessionHost(Resource):
    """Represents a SessionHost definition.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param last_heart_beat: Last heart beat from SessionHost.
    :type last_heart_beat: ~datetime.datetime
    :param sessions: Number of sessions on SessionHost.
    :type sessions: int
    :param agent_version: Version of agent on SessionHost.
    :type agent_version: str
    :param allow_new_session: Allow a new session.
    :type allow_new_session: bool
    :param assigned_user: User assigned to SessionHost.
    :type assigned_user: str
    :param status: Status for a SessionHost. Possible values include: "Available", "Unavailable",
     "Shutdown", "Disconnected", "Upgrading", "UpgradeFailed".
    :type status: str or ~desktop_virtualization_api_client.models.Status
    :ivar status_timestamp: The timestamp of the status.
    :vartype status_timestamp: ~datetime.datetime
    :param os_version: The version of the OS on the session host.
    :type os_version: str
    :param sx_s_stack_version: The version of the side by side stack on the session host.
    :type sx_s_stack_version: str
    :param update_state: Update state of a SessionHost. Possible values include: "Initial",
     "Pending", "Started", "Succeeded", "Failed".
    :type update_state: str or ~desktop_virtualization_api_client.models.UpdateState
    :ivar last_update_time: The timestamp of the last update.
    :vartype last_update_time: ~datetime.datetime
    :param update_error_message: The error message.
    :type update_error_message: str
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
        'status_timestamp': {'readonly': True},
        'last_update_time': {'readonly': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'last_heart_beat': {'key': 'properties.lastHeartBeat', 'type': 'iso-8601'},
        'sessions': {'key': 'properties.sessions', 'type': 'int'},
        'agent_version': {'key': 'properties.agentVersion', 'type': 'str'},
        'allow_new_session': {'key': 'properties.allowNewSession', 'type': 'bool'},
        'assigned_user': {'key': 'properties.assignedUser', 'type': 'str'},
        'status': {'key': 'properties.status', 'type': 'str'},
        'status_timestamp': {'key': 'properties.statusTimestamp', 'type': 'iso-8601'},
        'os_version': {'key': 'properties.osVersion', 'type': 'str'},
        'sx_s_stack_version': {'key': 'properties.sxSStackVersion', 'type': 'str'},
        'update_state': {'key': 'properties.updateState', 'type': 'str'},
        'last_update_time': {'key': 'properties.lastUpdateTime', 'type': 'iso-8601'},
        'update_error_message': {'key': 'properties.updateErrorMessage', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(SessionHost, self).__init__(**kwargs)
        self.last_heart_beat = kwargs.get('last_heart_beat', None)
        self.sessions = kwargs.get('sessions', None)
        self.agent_version = kwargs.get('agent_version', None)
        self.allow_new_session = kwargs.get('allow_new_session', None)
        self.assigned_user = kwargs.get('assigned_user', None)
        self.status = kwargs.get('status', None)
        self.status_timestamp = None
        self.os_version = kwargs.get('os_version', None)
        self.sx_s_stack_version = kwargs.get('sx_s_stack_version', None)
        self.update_state = kwargs.get('update_state', None)
        self.last_update_time = None
        self.update_error_message = kwargs.get('update_error_message', None)


class SessionHostList(msrest.serialization.Model):
    """List of SessionHost definitions.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param value: List of SessionHost definitions.
    :type value: list[~desktop_virtualization_api_client.models.SessionHost]
    :ivar next_link: Link to the next page of results.
    :vartype next_link: str
    """

    _validation = {
        'next_link': {'readonly': True},
    }

    _attribute_map = {
        'value': {'key': 'value', 'type': '[SessionHost]'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(SessionHostList, self).__init__(**kwargs)
        self.value = kwargs.get('value', None)
        self.next_link = None


class SessionHostPatch(Resource):
    """SessionHost properties that can be patched.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param allow_new_session: Allow a new session.
    :type allow_new_session: bool
    :param assigned_user: User assigned to SessionHost.
    :type assigned_user: str
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'allow_new_session': {'key': 'properties.allowNewSession', 'type': 'bool'},
        'assigned_user': {'key': 'properties.assignedUser', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(SessionHostPatch, self).__init__(**kwargs)
        self.allow_new_session = kwargs.get('allow_new_session', None)
        self.assigned_user = kwargs.get('assigned_user', None)


class StartMenuItem(Resource):
    """Represents a StartMenuItem definition.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param app_alias: Alias of StartMenuItem.
    :type app_alias: str
    :param friendly_name: Friendly name of StartMenuItem.
    :type friendly_name: str
    :param file_path: Path to the file of StartMenuItem.
    :type file_path: str
    :param command_line_arguments: Command line arguments for StartMenuItem.
    :type command_line_arguments: str
    :param icon_path: Path to the icon.
    :type icon_path: str
    :param icon_index: Index of the icon.
    :type icon_index: int
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'app_alias': {'key': 'properties.appAlias', 'type': 'str'},
        'friendly_name': {'key': 'properties.friendlyName', 'type': 'str'},
        'file_path': {'key': 'properties.filePath', 'type': 'str'},
        'command_line_arguments': {'key': 'properties.commandLineArguments', 'type': 'str'},
        'icon_path': {'key': 'properties.iconPath', 'type': 'str'},
        'icon_index': {'key': 'properties.iconIndex', 'type': 'int'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(StartMenuItem, self).__init__(**kwargs)
        self.app_alias = kwargs.get('app_alias', None)
        self.friendly_name = kwargs.get('friendly_name', None)
        self.file_path = kwargs.get('file_path', None)
        self.command_line_arguments = kwargs.get('command_line_arguments', None)
        self.icon_path = kwargs.get('icon_path', None)
        self.icon_index = kwargs.get('icon_index', None)


class StartMenuItemList(msrest.serialization.Model):
    """List of StartMenuItem definitions.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param value: List of StartMenuItem definitions.
    :type value: list[~desktop_virtualization_api_client.models.StartMenuItem]
    :ivar next_link: Link to the next page of results.
    :vartype next_link: str
    """

    _validation = {
        'next_link': {'readonly': True},
    }

    _attribute_map = {
        'value': {'key': 'value', 'type': '[StartMenuItem]'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(StartMenuItemList, self).__init__(**kwargs)
        self.value = kwargs.get('value', None)
        self.next_link = None


class UserSession(Resource):
    """Represents a UserSession definition.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param user_principal_name: The user principal name.
    :type user_principal_name: str
    :param application_type: Application type of application. Possible values include: "RemoteApp",
     "Desktop".
    :type application_type: str or ~desktop_virtualization_api_client.models.ApplicationType
    :param session_state: State of user session. Possible values include: "Unknown", "Active",
     "Disconnected", "Pending", "LogOff", "UserProfileDiskMounted".
    :type session_state: str or ~desktop_virtualization_api_client.models.SessionState
    :param active_directory_user_name: The active directory user name.
    :type active_directory_user_name: str
    :param create_time: The timestamp of the user session create.
    :type create_time: ~datetime.datetime
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'user_principal_name': {'key': 'properties.userPrincipalName', 'type': 'str'},
        'application_type': {'key': 'properties.applicationType', 'type': 'str'},
        'session_state': {'key': 'properties.sessionState', 'type': 'str'},
        'active_directory_user_name': {'key': 'properties.activeDirectoryUserName', 'type': 'str'},
        'create_time': {'key': 'properties.createTime', 'type': 'iso-8601'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(UserSession, self).__init__(**kwargs)
        self.user_principal_name = kwargs.get('user_principal_name', None)
        self.application_type = kwargs.get('application_type', None)
        self.session_state = kwargs.get('session_state', None)
        self.active_directory_user_name = kwargs.get('active_directory_user_name', None)
        self.create_time = kwargs.get('create_time', None)


class UserSessionList(msrest.serialization.Model):
    """List of UserSession definitions.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param value: List of UserSession definitions.
    :type value: list[~desktop_virtualization_api_client.models.UserSession]
    :ivar next_link: Link to the next page of results.
    :vartype next_link: str
    """

    _validation = {
        'next_link': {'readonly': True},
    }

    _attribute_map = {
        'value': {'key': 'value', 'type': '[UserSession]'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(UserSessionList, self).__init__(**kwargs)
        self.value = kwargs.get('value', None)
        self.next_link = None


class Workspace(TrackedResource):
    """Represents a Workspace definition.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :ivar id: Fully qualified resource Id for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. Ex- Microsoft.Compute/virtualMachines or
     Microsoft.Storage/storageAccounts.
    :vartype type: str
    :param tags: A set of tags. Resource tags.
    :type tags: dict[str, str]
    :param location: Required. The geo-location where the resource lives.
    :type location: str
    :param description: Description of Workspace.
    :type description: str
    :param friendly_name: Friendly name of Workspace.
    :type friendly_name: str
    :param application_group_references: List of applicationGroup resource Ids.
    :type application_group_references: list[str]
    """

    _validation = {
        'id': {'readonly': True},
        'name': {'readonly': True},
        'type': {'readonly': True},
        'location': {'required': True},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'type': {'key': 'type', 'type': 'str'},
        'tags': {'key': 'tags', 'type': '{str}'},
        'location': {'key': 'location', 'type': 'str'},
        'description': {'key': 'properties.description', 'type': 'str'},
        'friendly_name': {'key': 'properties.friendlyName', 'type': 'str'},
        'application_group_references': {'key': 'properties.applicationGroupReferences', 'type': '[str]'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(Workspace, self).__init__(**kwargs)
        self.description = kwargs.get('description', None)
        self.friendly_name = kwargs.get('friendly_name', None)
        self.application_group_references = kwargs.get('application_group_references', None)


class WorkspaceList(msrest.serialization.Model):
    """List of Workspace definitions.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param value: List of Workspace definitions.
    :type value: list[~desktop_virtualization_api_client.models.Workspace]
    :ivar next_link: Link to the next page of results.
    :vartype next_link: str
    """

    _validation = {
        'next_link': {'readonly': True},
    }

    _attribute_map = {
        'value': {'key': 'value', 'type': '[Workspace]'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(WorkspaceList, self).__init__(**kwargs)
        self.value = kwargs.get('value', None)
        self.next_link = None


class WorkspacePatch(msrest.serialization.Model):
    """Workspace properties that can be patched.

    :param tags: A set of tags. tags to be updated.
    :type tags: dict[str, str]
    :param description: Description of Workspace.
    :type description: str
    :param friendly_name: Friendly name of Workspace.
    :type friendly_name: str
    :param application_group_references: List of applicationGroup links.
    :type application_group_references: list[str]
    """

    _attribute_map = {
        'tags': {'key': 'tags', 'type': '{str}'},
        'description': {'key': 'properties.description', 'type': 'str'},
        'friendly_name': {'key': 'properties.friendlyName', 'type': 'str'},
        'application_group_references': {'key': 'properties.applicationGroupReferences', 'type': '[str]'},
    }

    def __init__(
        self,
        **kwargs
    ):
        super(WorkspacePatch, self).__init__(**kwargs)
        self.tags = kwargs.get('tags', None)
        self.description = kwargs.get('description', None)
        self.friendly_name = kwargs.get('friendly_name', None)
        self.application_group_references = kwargs.get('application_group_references', None)
