text: # 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.
  # --------------------------------------------------------------------------
  
  from msrest.serialization import Model
  from msrest.exceptions import HttpOperationError
  
  
  class AzureResourceBase(Model):
      """Common properties for all Azure resources.
  
      Variables are only populated by the server, and will be ignored when
      sending a request.
  
      :ivar id: String Id used to locate any resource on Azure.
      :vartype id: str
      :ivar name: Name of this resource.
      :vartype name: str
      :ivar type: Type of this resource.
      :vartype type: str
      :ivar system_data: Azure Resource Manager metadata containing createdBy
       and modifiedBy information.
      :vartype system_data:
       ~azure.mgmt.resource.templatespecs.v2019_06_preview.models.SystemData
      """
  
      _validation = {
          'id': {'readonly': True},
          'name': {'readonly': True},
          'type': {'readonly': True},
          'system_data': {'readonly': True},
      }
  
      _attribute_map = {
          'id': {'key': 'id', 'type': 'str'},
          'name': {'key': 'name', 'type': 'str'},
          'type': {'key': 'type', 'type': 'str'},
          'system_data': {'key': 'systemData', 'type': 'SystemData'},
      }
  
      def __init__(self, **kwargs) -> None:
          super(AzureResourceBase, self).__init__(**kwargs)
          self.id = None
          self.name = None
          self.type = None
          self.system_data = None
  
  
  class CloudError(Model):
      """CloudError.
      """
  
      _attribute_map = {
      }
  
  
  class ErrorAdditionalInfo(Model):
      """The resource management error additional info.
  
      Variables are only populated by the server, and will be ignored when
      sending a request.
  
      :ivar type: The additional info type.
      :vartype type: str
      :ivar info: The additional info.
      :vartype info: object
      """
  
      _validation = {
          'type': {'readonly': True},
          'info': {'readonly': True},
      }
  
      _attribute_map = {
          'type': {'key': 'type', 'type': 'str'},
          'info': {'key': 'info', 'type': 'object'},
      }
  
      def __init__(self, **kwargs) -> None:
          super(ErrorAdditionalInfo, self).__init__(**kwargs)
          self.type = None
          self.info = None
  
  
  class ErrorResponse(Model):
      """The resource management error response.
  
      Variables are only populated by the server, and will be ignored when
      sending a request.
  
      :ivar code: The error code.
      :vartype code: str
      :ivar message: The error message.
      :vartype message: str
      :ivar target: The error target.
      :vartype target: str
      :ivar details: The error details.
      :vartype details:
       list[~azure.mgmt.resource.templatespecs.v2019_06_preview.models.ErrorResponse]
      :ivar additional_info: The error additional info.
      :vartype additional_info:
       list[~azure.mgmt.resource.templatespecs.v2019_06_preview.models.ErrorAdditionalInfo]
      """
  
      _validation = {
          'code': {'readonly': True},
          'message': {'readonly': True},
          'target': {'readonly': True},
          'details': {'readonly': True},
          'additional_info': {'readonly': True},
      }
  
      _attribute_map = {
          'code': {'key': 'code', 'type': 'str'},
          'message': {'key': 'message', 'type': 'str'},
          'target': {'key': 'target', 'type': 'str'},
          'details': {'key': 'details', 'type': '[ErrorResponse]'},
          'additional_info': {'key': 'additionalInfo', 'type': '[ErrorAdditionalInfo]'},
      }
  
      def __init__(self, **kwargs) -> None:
          super(ErrorResponse, self).__init__(**kwargs)
          self.code = None
          self.message = None
          self.target = None
          self.details = None
          self.additional_info = None
  
  
  class SystemData(Model):
      """Metadata pertaining to creation and last modification of the resource.
  
      :param created_by: The identity that created the resource.
      :type created_by: str
      :param created_by_type: The type of identity that created the resource.
       Possible values include: 'User', 'Application', 'ManagedIdentity', 'Key'
      :type created_by_type: str or
       ~azure.mgmt.resource.templatespecs.v2019_06_preview.models.CreatedByType
      :param created_at: The timestamp of resource creation (UTC).
      :type created_at: datetime
      :param last_modified_by: The identity that last modified the resource.
      :type last_modified_by: str
      :param last_modified_by_type: The type of identity that last modified the
       resource. Possible values include: 'User', 'Application',
       'ManagedIdentity', 'Key'
      :type last_modified_by_type: str or
       ~azure.mgmt.resource.templatespecs.v2019_06_preview.models.CreatedByType
      :param last_modified_at: The type of identity that last modified the
       resource.
      :type last_modified_at: datetime
      """
  
      _attribute_map = {
          'created_by': {'key': 'createdBy', 'type': 'str'},
          'created_by_type': {'key': 'createdByType', 'type': 'str'},
          'created_at': {'key': 'createdAt', 'type': 'iso-8601'},
          'last_modified_by': {'key': 'lastModifiedBy', 'type': 'str'},
          'last_modified_by_type': {'key': 'lastModifiedByType', 'type': 'str'},
          'last_modified_at': {'key': 'lastModifiedAt', 'type': 'iso-8601'},
      }
  
      def __init__(self, *, created_by: str=None, created_by_type=None, created_at=None, last_modified_by: str=None, last_modified_by_type=None, last_modified_at=None, **kwargs) -> None:
          super(SystemData, self).__init__(**kwargs)
          self.created_by = created_by
          self.created_by_type = created_by_type
          self.created_at = created_at
          self.last_modified_by = last_modified_by
          self.last_modified_by_type = last_modified_by_type
          self.last_modified_at = last_modified_at
  
  
  class TemplateSpecArtifact(Model):
      """Represents a Template Spec artifact.
  
      You probably want to use the sub-classes and not this class directly. Known
      sub-classes are: TemplateSpecTemplateArtifact
  
      All required parameters must be populated in order to send to Azure.
  
      :param path: Required. A filesystem safe relative path of the artifact.
      :type path: str
      :param kind: Required. Constant filled by server.
      :type kind: str
      """
  
      _validation = {
          'path': {'required': True},
          'kind': {'required': True},
      }
  
      _attribute_map = {
          'path': {'key': 'path', 'type': 'str'},
          'kind': {'key': 'kind', 'type': 'str'},
      }
  
      _subtype_map = {
          'kind': {'template': 'TemplateSpecTemplateArtifact'}
      }
  
      def __init__(self, *, path: str, **kwargs) -> None:
          super(TemplateSpecArtifact, self).__init__(**kwargs)
          self.path = path
          self.kind = None
  
  
  class TemplateSpecModel(AzureResourceBase):
      """Template Spec object.
  
      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: String Id used to locate any resource on Azure.
      :vartype id: str
      :ivar name: Name of this resource.
      :vartype name: str
      :ivar type: Type of this resource.
      :vartype type: str
      :ivar system_data: Azure Resource Manager metadata containing createdBy
       and modifiedBy information.
      :vartype system_data:
       ~azure.mgmt.resource.templatespecs.v2019_06_preview.models.SystemData
      :param location: Required. The location of the Template Spec. It cannot be
       changed after Template Spec creation. It must be one of the supported
       Azure locations.
      :type location: str
      :param description: Template Spec description.
      :type description: str
      :param display_name: Template Spec display name.
      :type display_name: str
      :param tags: Resource tags.
      :type tags: dict[str, str]
      """
  
      _validation = {
          'id': {'readonly': True},
          'name': {'readonly': True},
          'type': {'readonly': True},
          'system_data': {'readonly': True},
          'location': {'required': True},
          'description': {'max_length': 4096},
          'display_name': {'max_length': 64},
      }
  
      _attribute_map = {
          'id': {'key': 'id', 'type': 'str'},
          'name': {'key': 'name', 'type': 'str'},
          'type': {'key': 'type', 'type': 'str'},
          'system_data': {'key': 'systemData', 'type': 'SystemData'},
          'location': {'key': 'location', 'type': 'str'},
          'description': {'key': 'properties.description', 'type': 'str'},
          'display_name': {'key': 'properties.displayName', 'type': 'str'},
          'tags': {'key': 'tags', 'type': '{str}'},
      }
  
      def __init__(self, *, location: str, description: str=None, display_name: str=None, tags=None, **kwargs) -> None:
          super(TemplateSpecModel, self).__init__(**kwargs)
          self.location = location
          self.description = description
          self.display_name = display_name
          self.tags = tags
  
  
  class TemplateSpecsError(Model):
      """Template Specs error response.
  
      :param error:
      :type error:
       ~azure.mgmt.resource.templatespecs.v2019_06_preview.models.ErrorResponse
      """
  
      _attribute_map = {
          'error': {'key': 'error', 'type': 'ErrorResponse'},
      }
  
      def __init__(self, *, error=None, **kwargs) -> None:
          super(TemplateSpecsError, self).__init__(**kwargs)
          self.error = error
  
  
  class TemplateSpecsErrorException(HttpOperationError):
      """Server responsed with exception of type: 'TemplateSpecsError'.
  
      :param deserialize: A deserializer
      :param response: Server response to be deserialized.
      """
  
      def __init__(self, deserialize, response, *args):
  
          super(TemplateSpecsErrorException, self).__init__(deserialize, response, 'TemplateSpecsError', *args)
  
  
  class TemplateSpecTemplateArtifact(TemplateSpecArtifact):
      """Represents a Template Spec artifact containing an embedded Azure Resource
      Manager template.
  
      All required parameters must be populated in order to send to Azure.
  
      :param path: Required. A filesystem safe relative path of the artifact.
      :type path: str
      :param kind: Required. Constant filled by server.
      :type kind: str
      :param template: Required. The Azure Resource Manager template.
      :type template: object
      """
  
      _validation = {
          'path': {'required': True},
          'kind': {'required': True},
          'template': {'required': True},
      }
  
      _attribute_map = {
          'path': {'key': 'path', 'type': 'str'},
          'kind': {'key': 'kind', 'type': 'str'},
          'template': {'key': 'template', 'type': 'object'},
      }
  
      def __init__(self, *, path: str, template, **kwargs) -> None:
          super(TemplateSpecTemplateArtifact, self).__init__(path=path, **kwargs)
          self.template = template
          self.kind = 'template'
  
  
  class TemplateSpecUpdateModel(AzureResourceBase):
      """Template Spec properties to be updated (only tags are currently supported).
  
      Variables are only populated by the server, and will be ignored when
      sending a request.
  
      :ivar id: String Id used to locate any resource on Azure.
      :vartype id: str
      :ivar name: Name of this resource.
      :vartype name: str
      :ivar type: Type of this resource.
      :vartype type: str
      :ivar system_data: Azure Resource Manager metadata containing createdBy
       and modifiedBy information.
      :vartype system_data:
       ~azure.mgmt.resource.templatespecs.v2019_06_preview.models.SystemData
      :param tags: Resource tags.
      :type tags: dict[str, str]
      """
  
      _validation = {
          'id': {'readonly': True},
          'name': {'readonly': True},
          'type': {'readonly': True},
          'system_data': {'readonly': True},
      }
  
      _attribute_map = {
          'id': {'key': 'id', 'type': 'str'},
          'name': {'key': 'name', 'type': 'str'},
          'type': {'key': 'type', 'type': 'str'},
          'system_data': {'key': 'systemData', 'type': 'SystemData'},
          'tags': {'key': 'tags', 'type': '{str}'},
      }
  
      def __init__(self, *, tags=None, **kwargs) -> None:
          super(TemplateSpecUpdateModel, self).__init__(**kwargs)
          self.tags = tags
  
  
  class TemplateSpecVersionModel(AzureResourceBase):
      """Template Spec Version object.
  
      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: String Id used to locate any resource on Azure.
      :vartype id: str
      :ivar name: Name of this resource.
      :vartype name: str
      :ivar type: Type of this resource.
      :vartype type: str
      :ivar system_data: Azure Resource Manager metadata containing createdBy
       and modifiedBy information.
      :vartype system_data:
       ~azure.mgmt.resource.templatespecs.v2019_06_preview.models.SystemData
      :param location: Required. The location of the Template Spec Version. It
       must match the location of the parent Template Spec.
      :type location: str
      :param artifacts: An array of Template Spec artifacts.
      :type artifacts:
       list[~azure.mgmt.resource.templatespecs.v2019_06_preview.models.TemplateSpecArtifact]
      :param description: Template Spec version description.
      :type description: str
      :param template: The Azure Resource Manager template content.
      :type template: object
      :param tags: Resource tags.
      :type tags: dict[str, str]
      """
  
      _validation = {
          'id': {'readonly': True},
          'name': {'readonly': True},
          'type': {'readonly': True},
          'system_data': {'readonly': True},
          'location': {'required': True},
          'description': {'max_length': 4096},
      }
  
      _attribute_map = {
          'id': {'key': 'id', 'type': 'str'},
          'name': {'key': 'name', 'type': 'str'},
          'type': {'key': 'type', 'type': 'str'},
          'system_data': {'key': 'systemData', 'type': 'SystemData'},
          'location': {'key': 'location', 'type': 'str'},
          'artifacts': {'key': 'properties.artifacts', 'type': '[TemplateSpecArtifact]'},
          'description': {'key': 'properties.description', 'type': 'str'},
          'template': {'key': 'properties.template', 'type': 'object'},
          'tags': {'key': 'tags', 'type': '{str}'},
      }
  
      def __init__(self, *, location: str, artifacts=None, description: str=None, template=None, tags=None, **kwargs) -> None:
          super(TemplateSpecVersionModel, self).__init__(**kwargs)
          self.location = location
          self.artifacts = artifacts
          self.description = description
          self.template = template
          self.tags = tags
  
  
  class TemplateSpecVersionUpdateModel(AzureResourceBase):
      """Template Spec Version properties to be updated (only tags are currently
      supported).
  
      Variables are only populated by the server, and will be ignored when
      sending a request.
  
      :ivar id: String Id used to locate any resource on Azure.
      :vartype id: str
      :ivar name: Name of this resource.
      :vartype name: str
      :ivar type: Type of this resource.
      :vartype type: str
      :ivar system_data: Azure Resource Manager metadata containing createdBy
       and modifiedBy information.
      :vartype system_data:
       ~azure.mgmt.resource.templatespecs.v2019_06_preview.models.SystemData
      :param tags: Resource tags.
      :type tags: dict[str, str]
      """
  
      _validation = {
          'id': {'readonly': True},
          'name': {'readonly': True},
          'type': {'readonly': True},
          'system_data': {'readonly': True},
      }
  
      _attribute_map = {
          'id': {'key': 'id', 'type': 'str'},
          'name': {'key': 'name', 'type': 'str'},
          'type': {'key': 'type', 'type': 'str'},
          'system_data': {'key': 'systemData', 'type': 'SystemData'},
          'tags': {'key': 'tags', 'type': '{str}'},
      }
  
      def __init__(self, *, tags=None, **kwargs) -> None:
          super(TemplateSpecVersionUpdateModel, self).__init__(**kwargs)
          self.tags = tags
  