/// Error types.
pub mod error {
    /// Error from a `TryFrom` or `FromStr` implementation.
    pub struct ConversionError(::std::borrow::Cow<'static, str>);
    impl ::std::error::Error for ConversionError {}
    impl ::std::fmt::Display for ConversionError {
        fn fmt(
            &self,
            f: &mut ::std::fmt::Formatter<'_>,
        ) -> Result<(), ::std::fmt::Error> {
            ::std::fmt::Display::fmt(&self.0, f)
        }
    }
    impl ::std::fmt::Debug for ConversionError {
        fn fmt(
            &self,
            f: &mut ::std::fmt::Formatter<'_>,
        ) -> Result<(), ::std::fmt::Error> {
            ::std::fmt::Debug::fmt(&self.0, f)
        }
    }
    impl From<&'static str> for ConversionError {
        fn from(value: &'static str) -> Self {
            Self(value.into())
        }
    }
    impl From<String> for ConversionError {
        fn from(value: String) -> Self {
            Self(value.into())
        }
    }
}
///Enables or disables a capability on the virtual machine or virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Enables or disables a capability on the virtual machine or virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "enableFips1403Encryption": {
///      "description": "The flag enables the usage of FIPS 140-3 compliant cryptography on the protectedSettings of an extension. Learn more at: https://aka.ms/linuxagentfipssupport.",
///      "type": "boolean"
///    },
///    "hibernationEnabled": {
///      "description": "The flag that enables or disables hibernation capability on the VM.",
///      "type": "boolean"
///    },
///    "ultraSSDEnabled": {
///      "description": "The flag that enables or disables a capability to have one or more managed data disks with UltraSSD_LRS storage account type on the VM or VMSS. Managed disks with storage account type UltraSSD_LRS can be added to a virtual machine or virtual machine scale set only if this property is enabled.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AdditionalCapabilities {
    ///The flag enables the usage of FIPS 140-3 compliant cryptography on the protectedSettings of an extension. Learn more at: https://aka.ms/linuxagentfipssupport.
    #[serde(
        rename = "enableFips1403Encryption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_fips1403_encryption: ::std::option::Option<bool>,
    ///The flag that enables or disables hibernation capability on the VM.
    #[serde(
        rename = "hibernationEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hibernation_enabled: ::std::option::Option<bool>,
    ///The flag that enables or disables a capability to have one or more managed data disks with UltraSSD_LRS storage account type on the VM or VMSS. Managed disks with storage account type UltraSSD_LRS can be added to a virtual machine or virtual machine scale set only if this property is enabled.
    #[serde(
        rename = "ultraSSDEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub ultra_ssd_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&AdditionalCapabilities> for AdditionalCapabilities {
    fn from(value: &AdditionalCapabilities) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for AdditionalCapabilities {
    fn default() -> Self {
        Self {
            enable_fips1403_encryption: Default::default(),
            hibernation_enabled: Default::default(),
            ultra_ssd_enabled: Default::default(),
        }
    }
}
///Specifies additional XML formatted information that can be included in the Unattend.xml file, which is used by Windows Setup. Contents are defined by setting name, component name, and the pass in which the content is applied.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies additional XML formatted information that can be included in the Unattend.xml file, which is used by Windows Setup. Contents are defined by setting name, component name, and the pass in which the content is applied.",
///  "type": "object",
///  "properties": {
///    "componentName": {
///      "$ref": "#/components/schemas/ComponentNames"
///    },
///    "content": {
///      "description": "Specifies the XML formatted content that is added to the unattend.xml file for the specified path and component. The XML must be less than 4KB and must include the root element for the setting or feature that is being inserted.",
///      "type": "string"
///    },
///    "passName": {
///      "$ref": "#/components/schemas/PassNames"
///    },
///    "settingName": {
///      "$ref": "#/components/schemas/SettingNames"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AdditionalUnattendContent {
    #[serde(
        rename = "componentName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub component_name: ::std::option::Option<ComponentNames>,
    ///Specifies the XML formatted content that is added to the unattend.xml file for the specified path and component. The XML must be less than 4KB and must include the root element for the setting or feature that is being inserted.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub content: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "passName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub pass_name: ::std::option::Option<PassNames>,
    #[serde(
        rename = "settingName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub setting_name: ::std::option::Option<SettingNames>,
}
impl ::std::convert::From<&AdditionalUnattendContent> for AdditionalUnattendContent {
    fn from(value: &AdditionalUnattendContent) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for AdditionalUnattendContent {
    fn default() -> Self {
        Self {
            component_name: Default::default(),
            content: Default::default(),
            pass_name: Default::default(),
            setting_name: Default::default(),
        }
    }
}
///Specifies if Scheduled Events should be auto-approved when all instances are down.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies if Scheduled Events should be auto-approved when all instances are down.",
///  "type": "object",
///  "properties": {
///    "automaticallyApprove": {
///      "description": "Specifies if Scheduled Events should be auto-approved when all instances are down.\nits default value is true",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AllInstancesDown {
    /**Specifies if Scheduled Events should be auto-approved when all instances are down.
its default value is true*/
    #[serde(
        rename = "automaticallyApprove",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub automatically_approve: ::std::option::Option<bool>,
}
impl ::std::convert::From<&AllInstancesDown> for AllInstancesDown {
    fn from(value: &AllInstancesDown) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for AllInstancesDown {
    fn default() -> Self {
        Self {
            automatically_approve: Default::default(),
        }
    }
}
///Specifies the allocation strategy for the virtual machine scale set based on which the VMs will be allocated.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the allocation strategy for the virtual machine scale set based on which the VMs will be allocated.",
///  "type": "string",
///  "enum": [
///    "LowestPrice",
///    "CapacityOptimized",
///    "Prioritized"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "AllocationStrategy",
///    "values": [
///      {
///        "name": "LowestPrice",
///        "value": "LowestPrice"
///      },
///      {
///        "name": "CapacityOptimized",
///        "value": "CapacityOptimized"
///      },
///      {
///        "name": "Prioritized",
///        "value": "Prioritized"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum AllocationStrategy {
    LowestPrice,
    CapacityOptimized,
    Prioritized,
}
impl ::std::convert::From<&Self> for AllocationStrategy {
    fn from(value: &AllocationStrategy) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for AllocationStrategy {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::LowestPrice => f.write_str("LowestPrice"),
            Self::CapacityOptimized => f.write_str("CapacityOptimized"),
            Self::Prioritized => f.write_str("Prioritized"),
        }
    }
}
impl ::std::str::FromStr for AllocationStrategy {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "lowestprice" => Ok(Self::LowestPrice),
            "capacityoptimized" => Ok(Self::CapacityOptimized),
            "prioritized" => Ok(Self::Prioritized),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for AllocationStrategy {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for AllocationStrategy {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for AllocationStrategy {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes the alternative option specified by the Publisher for this image when this image is deprecated.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the alternative option specified by the Publisher for this image when this image is deprecated.",
///  "type": "object",
///  "properties": {
///    "type": {
///      "$ref": "#/components/schemas/AlternativeType"
///    },
///    "value": {
///      "description": "Indicates the alternative option value specified by the Publisher. This is the Offer name when the type is Offer or the Plan name when the type is Plan.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AlternativeOption {
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<AlternativeType>,
    ///Indicates the alternative option value specified by the Publisher. This is the Offer name when the type is Offer or the Plan name when the type is Plan.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub value: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&AlternativeOption> for AlternativeOption {
    fn from(value: &AlternativeOption) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for AlternativeOption {
    fn default() -> Self {
        Self {
            type_: Default::default(),
            value: Default::default(),
        }
    }
}
///Describes the type of the alternative option.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the type of the alternative option.",
///  "type": "string",
///  "enum": [
///    "None",
///    "Offer",
///    "Plan"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "AlternativeType",
///    "values": [
///      {
///        "name": "None",
///        "value": "None"
///      },
///      {
///        "name": "Offer",
///        "value": "Offer"
///      },
///      {
///        "name": "Plan",
///        "value": "Plan"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum AlternativeType {
    None,
    Offer,
    Plan,
}
impl ::std::convert::From<&Self> for AlternativeType {
    fn from(value: &AlternativeType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for AlternativeType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::None => f.write_str("None"),
            Self::Offer => f.write_str("Offer"),
            Self::Plan => f.write_str("Plan"),
        }
    }
}
impl ::std::str::FromStr for AlternativeType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "none" => Ok(Self::None),
            "offer" => Ok(Self::Offer),
            "plan" => Ok(Self::Plan),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for AlternativeType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for AlternativeType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for AlternativeType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The API entity reference.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The API entity reference.",
///  "type": "object",
///  "properties": {
///    "id": {
///      "description": "The ARM resource id in the form of /subscriptions/{SubscriptionId}/resourceGroups/{ResourceGroupName}/...",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ApiEntityReference {
    ///The ARM resource id in the form of /subscriptions/{SubscriptionId}/resourceGroups/{ResourceGroupName}/...
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&ApiEntityReference> for ApiEntityReference {
    fn from(value: &ApiEntityReference) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ApiEntityReference {
    fn default() -> Self {
        Self { id: Default::default() }
    }
}
///Api error.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Api error.",
///  "type": "object",
///  "properties": {
///    "code": {
///      "description": "The error code.",
///      "type": "string"
///    },
///    "details": {
///      "description": "The Api error details",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/ApiErrorBase"
///      },
///      "x-ms-identifiers": [
///        "message",
///        "target"
///      ]
///    },
///    "innererror": {
///      "$ref": "#/components/schemas/InnerError"
///    },
///    "message": {
///      "description": "The error message.",
///      "type": "string"
///    },
///    "target": {
///      "description": "The target of the particular error.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ApiError {
    ///The error code.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub code: ::std::option::Option<::std::string::String>,
    ///The Api error details
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub details: ::std::vec::Vec<ApiErrorBase>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub innererror: ::std::option::Option<InnerError>,
    ///The error message.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub message: ::std::option::Option<::std::string::String>,
    ///The target of the particular error.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub target: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&ApiError> for ApiError {
    fn from(value: &ApiError) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ApiError {
    fn default() -> Self {
        Self {
            code: Default::default(),
            details: Default::default(),
            innererror: Default::default(),
            message: Default::default(),
            target: Default::default(),
        }
    }
}
///Api error base.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Api error base.",
///  "type": "object",
///  "properties": {
///    "code": {
///      "description": "The error code.",
///      "type": "string"
///    },
///    "message": {
///      "description": "The error message.",
///      "type": "string"
///    },
///    "target": {
///      "description": "The target of the particular error.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ApiErrorBase {
    ///The error code.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub code: ::std::option::Option<::std::string::String>,
    ///The error message.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub message: ::std::option::Option<::std::string::String>,
    ///The target of the particular error.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub target: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&ApiErrorBase> for ApiErrorBase {
    fn from(value: &ApiErrorBase) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ApiErrorBase {
    fn default() -> Self {
        Self {
            code: Default::default(),
            message: Default::default(),
            target: Default::default(),
        }
    }
}
///Contains the list of gallery applications that should be made available to the VM/VMSS
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Contains the list of gallery applications that should be made available to the VM/VMSS",
///  "type": "object",
///  "properties": {
///    "galleryApplications": {
///      "description": "Specifies the gallery applications that should be made available to the VM/VMSS",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VMGalleryApplication"
///      },
///      "x-ms-identifiers": [
///        "packageReferenceId"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ApplicationProfile {
    ///Specifies the gallery applications that should be made available to the VM/VMSS
    #[serde(
        rename = "galleryApplications",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub gallery_applications: ::std::vec::Vec<VmGalleryApplication>,
}
impl ::std::convert::From<&ApplicationProfile> for ApplicationProfile {
    fn from(value: &ApplicationProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ApplicationProfile {
    fn default() -> Self {
        Self {
            gallery_applications: Default::default(),
        }
    }
}
///Specifies the Architecture Type
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the Architecture Type",
///  "type": "string",
///  "enum": [
///    "x64",
///    "Arm64"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ArchitectureTypes",
///    "values": [
///      {
///        "name": "x64",
///        "value": "x64"
///      },
///      {
///        "name": "Arm64",
///        "value": "Arm64"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ArchitectureTypes {
    #[serde(rename = "x64")]
    X64,
    Arm64,
}
impl ::std::convert::From<&Self> for ArchitectureTypes {
    fn from(value: &ArchitectureTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ArchitectureTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::X64 => f.write_str("x64"),
            Self::Arm64 => f.write_str("Arm64"),
        }
    }
}
impl ::std::str::FromStr for ArchitectureTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "x64" => Ok(Self::X64),
            "arm64" => Ok(Self::Arm64),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ArchitectureTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ArchitectureTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ArchitectureTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the input for attaching and detaching a list of managed data disks.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the input for attaching and detaching a list of managed data disks.",
///  "type": "object",
///  "properties": {
///    "dataDisksToAttach": {
///      "description": "The list of managed data disks to be attached.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DataDisksToAttach"
///      },
///      "minItems": 1,
///      "x-ms-identifiers": [
///        "diskId"
///      ]
///    },
///    "dataDisksToDetach": {
///      "description": "The list of managed data disks to be detached.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DataDisksToDetach"
///      },
///      "minItems": 1,
///      "x-ms-identifiers": [
///        "diskId"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AttachDetachDataDisksRequest {
    ///The list of managed data disks to be attached.
    #[serde(
        rename = "dataDisksToAttach",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub data_disks_to_attach: ::std::vec::Vec<DataDisksToAttach>,
    ///The list of managed data disks to be detached.
    #[serde(
        rename = "dataDisksToDetach",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub data_disks_to_detach: ::std::vec::Vec<DataDisksToDetach>,
}
impl ::std::convert::From<&AttachDetachDataDisksRequest>
for AttachDetachDataDisksRequest {
    fn from(value: &AttachDetachDataDisksRequest) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for AttachDetachDataDisksRequest {
    fn default() -> Self {
        Self {
            data_disks_to_attach: Default::default(),
            data_disks_to_detach: Default::default(),
        }
    }
}
///The configuration parameters used for performing automatic OS upgrade.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The configuration parameters used for performing automatic OS upgrade.",
///  "type": "object",
///  "properties": {
///    "disableAutomaticRollback": {
///      "description": "Whether OS image rollback feature should be disabled. Default value is false.",
///      "type": "boolean"
///    },
///    "enableAutomaticOSUpgrade": {
///      "description": "Indicates whether OS upgrades should automatically be applied to scale set instances in a rolling fashion when a newer version of the OS image becomes available. Default value is false. If this is set to true for Windows based scale sets, [enableAutomaticUpdates](https://docs.microsoft.com/dotnet/api/microsoft.azure.management.compute.models.windowsconfiguration.enableautomaticupdates?view=azure-dotnet) is automatically set to false and cannot be set to true.",
///      "type": "boolean"
///    },
///    "osRollingUpgradeDeferral": {
///      "description": "Indicates whether Auto OS Upgrade should undergo deferral. Deferred OS upgrades will send advanced notifications on a per-VM basis that an OS upgrade from rolling upgrades is incoming, via the IMDS tag 'Platform.PendingOSUpgrade'. The upgrade then defers until the upgrade is approved via an ApproveRollingUpgrade call.",
///      "type": "boolean"
///    },
///    "useRollingUpgradePolicy": {
///      "description": "Indicates whether rolling upgrade policy should be used during Auto OS Upgrade. Default value is false. Auto OS Upgrade will fallback to the default policy if no policy is defined on the VMSS.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AutomaticOsUpgradePolicy {
    ///Whether OS image rollback feature should be disabled. Default value is false.
    #[serde(
        rename = "disableAutomaticRollback",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disable_automatic_rollback: ::std::option::Option<bool>,
    ///Indicates whether OS upgrades should automatically be applied to scale set instances in a rolling fashion when a newer version of the OS image becomes available. Default value is false. If this is set to true for Windows based scale sets, [enableAutomaticUpdates](https://docs.microsoft.com/dotnet/api/microsoft.azure.management.compute.models.windowsconfiguration.enableautomaticupdates?view=azure-dotnet) is automatically set to false and cannot be set to true.
    #[serde(
        rename = "enableAutomaticOSUpgrade",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_automatic_os_upgrade: ::std::option::Option<bool>,
    ///Indicates whether Auto OS Upgrade should undergo deferral. Deferred OS upgrades will send advanced notifications on a per-VM basis that an OS upgrade from rolling upgrades is incoming, via the IMDS tag 'Platform.PendingOSUpgrade'. The upgrade then defers until the upgrade is approved via an ApproveRollingUpgrade call.
    #[serde(
        rename = "osRollingUpgradeDeferral",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_rolling_upgrade_deferral: ::std::option::Option<bool>,
    ///Indicates whether rolling upgrade policy should be used during Auto OS Upgrade. Default value is false. Auto OS Upgrade will fallback to the default policy if no policy is defined on the VMSS.
    #[serde(
        rename = "useRollingUpgradePolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub use_rolling_upgrade_policy: ::std::option::Option<bool>,
}
impl ::std::convert::From<&AutomaticOsUpgradePolicy> for AutomaticOsUpgradePolicy {
    fn from(value: &AutomaticOsUpgradePolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for AutomaticOsUpgradePolicy {
    fn default() -> Self {
        Self {
            disable_automatic_rollback: Default::default(),
            enable_automatic_os_upgrade: Default::default(),
            os_rolling_upgrade_deferral: Default::default(),
            use_rolling_upgrade_policy: Default::default(),
        }
    }
}
///Describes automatic OS upgrade properties on the image.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes automatic OS upgrade properties on the image.",
///  "type": "object",
///  "required": [
///    "automaticOSUpgradeSupported"
///  ],
///  "properties": {
///    "automaticOSUpgradeSupported": {
///      "description": "Specifies whether automatic OS upgrade is supported on the image.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AutomaticOsUpgradeProperties {
    ///Specifies whether automatic OS upgrade is supported on the image.
    #[serde(rename = "automaticOSUpgradeSupported")]
    pub automatic_os_upgrade_supported: bool,
}
impl ::std::convert::From<&AutomaticOsUpgradeProperties>
for AutomaticOsUpgradeProperties {
    fn from(value: &AutomaticOsUpgradeProperties) -> Self {
        value.clone()
    }
}
///Specifies the configuration parameters for automatic repairs on the virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the configuration parameters for automatic repairs on the virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "enabled": {
///      "description": "Specifies whether automatic repairs should be enabled on the virtual machine scale set. The default value is false.",
///      "type": "boolean"
///    },
///    "gracePeriod": {
///      "description": "The amount of time for which automatic repairs are suspended due to a state change on VM. The grace time starts after the state change has completed. This helps avoid premature or accidental repairs. The time duration should be specified in ISO 8601 format. The minimum allowed grace period is 10 minutes (PT10M), which is also the default value. The maximum allowed grace period is 90 minutes (PT90M).",
///      "type": "string"
///    },
///    "repairAction": {
///      "$ref": "#/components/schemas/RepairAction"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AutomaticRepairsPolicy {
    ///Specifies whether automatic repairs should be enabled on the virtual machine scale set. The default value is false.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enabled: ::std::option::Option<bool>,
    ///The amount of time for which automatic repairs are suspended due to a state change on VM. The grace time starts after the state change has completed. This helps avoid premature or accidental repairs. The time duration should be specified in ISO 8601 format. The minimum allowed grace period is 10 minutes (PT10M), which is also the default value. The maximum allowed grace period is 90 minutes (PT90M).
    #[serde(
        rename = "gracePeriod",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub grace_period: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "repairAction",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub repair_action: ::std::option::Option<RepairAction>,
}
impl ::std::convert::From<&AutomaticRepairsPolicy> for AutomaticRepairsPolicy {
    fn from(value: &AutomaticRepairsPolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for AutomaticRepairsPolicy {
    fn default() -> Self {
        Self {
            enabled: Default::default(),
            grace_period: Default::default(),
            repair_action: Default::default(),
        }
    }
}
///The configuration parameters used while performing automatic AZ balancing.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The configuration parameters used while performing automatic AZ balancing.",
///  "type": "object",
///  "properties": {
///    "enabled": {
///      "description": "Specifies whether Automatic AZ Balancing should be enabled on the virtual machine scale set. The default value is false.",
///      "type": "boolean"
///    },
///    "rebalanceBehavior": {
///      "$ref": "#/components/schemas/RebalanceBehavior"
///    },
///    "rebalanceStrategy": {
///      "$ref": "#/components/schemas/RebalanceStrategy"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AutomaticZoneRebalancingPolicy {
    ///Specifies whether Automatic AZ Balancing should be enabled on the virtual machine scale set. The default value is false.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enabled: ::std::option::Option<bool>,
    #[serde(
        rename = "rebalanceBehavior",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub rebalance_behavior: ::std::option::Option<RebalanceBehavior>,
    #[serde(
        rename = "rebalanceStrategy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub rebalance_strategy: ::std::option::Option<RebalanceStrategy>,
}
impl ::std::convert::From<&AutomaticZoneRebalancingPolicy>
for AutomaticZoneRebalancingPolicy {
    fn from(value: &AutomaticZoneRebalancingPolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for AutomaticZoneRebalancingPolicy {
    fn default() -> Self {
        Self {
            enabled: Default::default(),
            rebalance_behavior: Default::default(),
            rebalance_strategy: Default::default(),
        }
    }
}
///Specifies information about the availability set that the virtual machine should be assigned to. Virtual machines specified in the same availability set are allocated to different nodes to maximize availability. For more information about availability sets, see [Availability sets overview](https://docs.microsoft.com/azure/virtual-machines/availability-set-overview). For more information on Azure planned maintenance, see [Maintenance and updates for Virtual Machines in Azure](https://docs.microsoft.com/azure/virtual-machines/maintenance-and-updates). Currently, a VM can only be added to an availability set at creation time. An existing VM cannot be added to an availability set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the availability set that the virtual machine should be assigned to. Virtual machines specified in the same availability set are allocated to different nodes to maximize availability. For more information about availability sets, see [Availability sets overview](https://docs.microsoft.com/azure/virtual-machines/availability-set-overview). For more information on Azure planned maintenance, see [Maintenance and updates for Virtual Machines in Azure](https://docs.microsoft.com/azure/virtual-machines/maintenance-and-updates). Currently, a VM can only be added to an availability set at creation time. An existing VM cannot be added to an availability set.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/AvailabilitySetProperties"
///    },
///    "sku": {
///      "$ref": "#/components/schemas/Sku"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AvailabilitySet {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<AvailabilitySetProperties>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku: ::std::option::Option<Sku>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&AvailabilitySet> for AvailabilitySet {
    fn from(value: &AvailabilitySet) -> Self {
        value.clone()
    }
}
///The List Availability Set operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Availability Set operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The URI to fetch the next page of AvailabilitySets. Call ListNext() with this URI to fetch the next page of AvailabilitySets.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of availability sets.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/AvailabilitySet"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AvailabilitySetListResult {
    ///The URI to fetch the next page of AvailabilitySets. Call ListNext() with this URI to fetch the next page of AvailabilitySets.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of availability sets.
    pub value: ::std::vec::Vec<AvailabilitySet>,
}
impl ::std::convert::From<&AvailabilitySetListResult> for AvailabilitySetListResult {
    fn from(value: &AvailabilitySetListResult) -> Self {
        value.clone()
    }
}
///The instance view of a resource.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a resource.",
///  "type": "object",
///  "properties": {
///    "platformFaultDomainCount": {
///      "description": "Fault Domain count.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "platformUpdateDomainCount": {
///      "description": "Update Domain count.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "proximityPlacementGroup": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "scheduledEventsPolicy": {
///      "$ref": "#/components/schemas/ScheduledEventsPolicy"
///    },
///    "statuses": {
///      "description": "The resource status information.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    },
///    "virtualMachineScaleSetMigrationInfo": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetMigrationInfo"
///    },
///    "virtualMachines": {
///      "description": "A list of references to all virtual machines in the availability set.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AvailabilitySetProperties {
    ///Fault Domain count.
    #[serde(
        rename = "platformFaultDomainCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub platform_fault_domain_count: ::std::option::Option<i32>,
    ///Update Domain count.
    #[serde(
        rename = "platformUpdateDomainCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub platform_update_domain_count: ::std::option::Option<i32>,
    #[serde(
        rename = "proximityPlacementGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub proximity_placement_group: ::std::option::Option<SubResource>,
    #[serde(
        rename = "scheduledEventsPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scheduled_events_policy: ::std::option::Option<ScheduledEventsPolicy>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
    #[serde(
        rename = "virtualMachineScaleSetMigrationInfo",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machine_scale_set_migration_info: ::std::option::Option<
        VirtualMachineScaleSetMigrationInfo,
    >,
    ///A list of references to all virtual machines in the availability set.
    #[serde(
        rename = "virtualMachines",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machines: ::std::vec::Vec<SubResource>,
}
impl ::std::convert::From<&AvailabilitySetProperties> for AvailabilitySetProperties {
    fn from(value: &AvailabilitySetProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for AvailabilitySetProperties {
    fn default() -> Self {
        Self {
            platform_fault_domain_count: Default::default(),
            platform_update_domain_count: Default::default(),
            proximity_placement_group: Default::default(),
            scheduled_events_policy: Default::default(),
            statuses: Default::default(),
            virtual_machine_scale_set_migration_info: Default::default(),
            virtual_machines: Default::default(),
        }
    }
}
///Specifies the sku of an Availability Set. Use 'Aligned' for virtual machines with managed disks and 'Classic' for virtual machines with unmanaged disks. Default value is 'Classic'.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the sku of an Availability Set. Use 'Aligned' for virtual machines with managed disks and 'Classic' for virtual machines with unmanaged disks. Default value is 'Classic'.",
///  "type": "string",
///  "enum": [
///    "Classic",
///    "Aligned"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "AvailabilitySetSkuTypes",
///    "values": [
///      {
///        "name": "Classic",
///        "value": "Classic"
///      },
///      {
///        "name": "Aligned",
///        "value": "Aligned"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum AvailabilitySetSkuTypes {
    Classic,
    Aligned,
}
impl ::std::convert::From<&Self> for AvailabilitySetSkuTypes {
    fn from(value: &AvailabilitySetSkuTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for AvailabilitySetSkuTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Classic => f.write_str("Classic"),
            Self::Aligned => f.write_str("Aligned"),
        }
    }
}
impl ::std::str::FromStr for AvailabilitySetSkuTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "classic" => Ok(Self::Classic),
            "aligned" => Ok(Self::Aligned),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for AvailabilitySetSkuTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for AvailabilitySetSkuTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for AvailabilitySetSkuTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies information about the availability set that the virtual machine should be assigned to. Only tags may be updated.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the availability set that the virtual machine should be assigned to. Only tags may be updated.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/AvailabilitySetProperties"
///    },
///    "sku": {
///      "$ref": "#/components/schemas/Sku"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AvailabilitySetUpdate {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<AvailabilitySetProperties>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku: ::std::option::Option<Sku>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&AvailabilitySetUpdate> for AvailabilitySetUpdate {
    fn from(value: &AvailabilitySetUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for AvailabilitySetUpdate {
    fn default() -> Self {
        Self {
            properties: Default::default(),
            sku: Default::default(),
            tags: Default::default(),
        }
    }
}
///Describes the properties of an virtual machine instance view for available patch summary.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of an virtual machine instance view for available patch summary.",
///  "type": "object",
///  "properties": {
///    "assessmentActivityId": {
///      "description": "The activity ID of the operation that produced this result. It is used to correlate across CRP and extension logs.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "criticalAndSecurityPatchCount": {
///      "description": "The number of critical or security patches that have been detected as available and not yet installed.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "error": {
///      "$ref": "#/components/schemas/ApiError"
///    },
///    "lastModifiedTime": {
///      "description": "The UTC timestamp when the operation began.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "otherPatchCount": {
///      "description": "The number of all available patches excluding critical and security.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "rebootPending": {
///      "description": "The overall reboot status of the VM. It will be true when partially installed patches require a reboot to complete installation but the reboot has not yet occurred.",
///      "readOnly": true,
///      "type": "boolean"
///    },
///    "startTime": {
///      "description": "The UTC timestamp when the operation began.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "status": {
///      "$ref": "#/components/schemas/PatchOperationStatus"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct AvailablePatchSummary {
    ///The activity ID of the operation that produced this result. It is used to correlate across CRP and extension logs.
    #[serde(
        rename = "assessmentActivityId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub assessment_activity_id: ::std::option::Option<::std::string::String>,
    ///The number of critical or security patches that have been detected as available and not yet installed.
    #[serde(
        rename = "criticalAndSecurityPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub critical_and_security_patch_count: ::std::option::Option<i32>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub error: ::std::option::Option<ApiError>,
    ///The UTC timestamp when the operation began.
    #[serde(
        rename = "lastModifiedTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_modified_time: ::std::option::Option<::std::string::String>,
    ///The number of all available patches excluding critical and security.
    #[serde(
        rename = "otherPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub other_patch_count: ::std::option::Option<i32>,
    ///The overall reboot status of the VM. It will be true when partially installed patches require a reboot to complete installation but the reboot has not yet occurred.
    #[serde(
        rename = "rebootPending",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub reboot_pending: ::std::option::Option<bool>,
    ///The UTC timestamp when the operation began.
    #[serde(
        rename = "startTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub start_time: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub status: ::std::option::Option<PatchOperationStatus>,
}
impl ::std::convert::From<&AvailablePatchSummary> for AvailablePatchSummary {
    fn from(value: &AvailablePatchSummary) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for AvailablePatchSummary {
    fn default() -> Self {
        Self {
            assessment_activity_id: Default::default(),
            critical_and_security_patch_count: Default::default(),
            error: Default::default(),
            last_modified_time: Default::default(),
            other_patch_count: Default::default(),
            reboot_pending: Default::default(),
            start_time: Default::default(),
            status: Default::default(),
        }
    }
}
///Specifies the billing related details of a Azure Spot VM or VMSS. Minimum api-version: 2019-03-01.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the billing related details of a Azure Spot VM or VMSS. Minimum api-version: 2019-03-01.",
///  "type": "object",
///  "properties": {
///    "maxPrice": {
///      "description": "Specifies the maximum price you are willing to pay for a Azure Spot VM/VMSS. This price is in US Dollars. <br><br> This price will be compared with the current Azure Spot price for the VM size. Also, the prices are compared at the time of create/update of Azure Spot VM/VMSS and the operation will only succeed if  the maxPrice is greater than the current Azure Spot price. <br><br> The maxPrice will also be used for evicting a Azure Spot VM/VMSS if the current Azure Spot price goes beyond the maxPrice after creation of VM/VMSS. <br><br> Possible values are: <br><br> - Any decimal value greater than zero. Example: 0.01538 <br><br> -1 – indicates default price to be up-to on-demand. <br><br> You can set the maxPrice to -1 to indicate that the Azure Spot VM/VMSS should not be evicted for price reasons. Also, the default max price is -1 if it is not provided by you. <br><br>Minimum api-version: 2019-03-01.",
///      "type": "number",
///      "format": "double"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct BillingProfile {
    #[serde(
        rename = "maxPrice",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub max_price: ::std::option::Option<f64>,
}
impl ::std::convert::From<&BillingProfile> for BillingProfile {
    fn from(value: &BillingProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for BillingProfile {
    fn default() -> Self {
        Self {
            max_price: Default::default(),
        }
    }
}
///Boot Diagnostics is a debugging feature which allows you to view Console Output and Screenshot to diagnose VM status. You can easily view the output of your console log. Azure also enables you to see a screenshot of the VM from the hypervisor.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Boot Diagnostics is a debugging feature which allows you to view Console Output and Screenshot to diagnose VM status. You can easily view the output of your console log. Azure also enables you to see a screenshot of the VM from the hypervisor.",
///  "type": "object",
///  "properties": {
///    "enabled": {
///      "description": "Whether boot diagnostics should be enabled on the Virtual Machine.",
///      "type": "boolean"
///    },
///    "storageUri": {
///      "description": "Uri of the storage account to use for placing the console output and screenshot. If storageUri is not specified while enabling boot diagnostics, managed storage will be used.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct BootDiagnostics {
    ///Whether boot diagnostics should be enabled on the Virtual Machine.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enabled: ::std::option::Option<bool>,
    ///Uri of the storage account to use for placing the console output and screenshot. If storageUri is not specified while enabling boot diagnostics, managed storage will be used.
    #[serde(
        rename = "storageUri",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_uri: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&BootDiagnostics> for BootDiagnostics {
    fn from(value: &BootDiagnostics) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for BootDiagnostics {
    fn default() -> Self {
        Self {
            enabled: Default::default(),
            storage_uri: Default::default(),
        }
    }
}
///The instance view of a virtual machine boot diagnostics.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a virtual machine boot diagnostics.",
///  "type": "object",
///  "properties": {
///    "consoleScreenshotBlobUri": {
///      "description": "The console screenshot blob URI. **Note:** This will **not** be set if boot diagnostics is currently enabled with managed storage.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "serialConsoleLogBlobUri": {
///      "description": "The serial console log blob Uri. **Note:** This will **not** be set if boot diagnostics is currently enabled with managed storage.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "status": {
///      "$ref": "#/components/schemas/InstanceViewStatus"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct BootDiagnosticsInstanceView {
    ///The console screenshot blob URI. **Note:** This will **not** be set if boot diagnostics is currently enabled with managed storage.
    #[serde(
        rename = "consoleScreenshotBlobUri",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub console_screenshot_blob_uri: ::std::option::Option<::std::string::String>,
    ///The serial console log blob Uri. **Note:** This will **not** be set if boot diagnostics is currently enabled with managed storage.
    #[serde(
        rename = "serialConsoleLogBlobUri",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub serial_console_log_blob_uri: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub status: ::std::option::Option<InstanceViewStatus>,
}
impl ::std::convert::From<&BootDiagnosticsInstanceView> for BootDiagnosticsInstanceView {
    fn from(value: &BootDiagnosticsInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for BootDiagnosticsInstanceView {
    fn default() -> Self {
        Self {
            console_screenshot_blob_uri: Default::default(),
            serial_console_log_blob_uri: Default::default(),
            status: Default::default(),
        }
    }
}
///Specifies the caching requirements. Possible values are: **None,** **ReadOnly,** **ReadWrite.** The default values are: **None for Standard storage. ReadOnly for Premium storage**
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the caching requirements. Possible values are: **None,** **ReadOnly,** **ReadWrite.** The default values are: **None for Standard storage. ReadOnly for Premium storage**",
///  "type": "string",
///  "enum": [
///    "None",
///    "ReadOnly",
///    "ReadWrite"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "CachingTypes"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum CachingTypes {
    None,
    ReadOnly,
    ReadWrite,
}
impl ::std::convert::From<&Self> for CachingTypes {
    fn from(value: &CachingTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for CachingTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::None => f.write_str("None"),
            Self::ReadOnly => f.write_str("ReadOnly"),
            Self::ReadWrite => f.write_str("ReadWrite"),
        }
    }
}
impl ::std::str::FromStr for CachingTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "none" => Ok(Self::None),
            "readonly" => Ok(Self::ReadOnly),
            "readwrite" => Ok(Self::ReadWrite),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for CachingTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for CachingTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for CachingTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies information about the capacity reservation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the capacity reservation.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "required": [
///    "sku"
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/CapacityReservationProperties"
///    },
///    "sku": {
///      "$ref": "#/components/schemas/Sku"
///    },
///    "zones": {
///      "description": "The availability zones.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservation {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<CapacityReservationProperties>,
    pub sku: Sku,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///The availability zones.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zones: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&CapacityReservation> for CapacityReservation {
    fn from(value: &CapacityReservation) -> Self {
        value.clone()
    }
}
///Specifies information about the capacity reservation group that the capacity reservations should be assigned to. Currently, a capacity reservation can only be added to a capacity reservation group at creation time. An existing capacity reservation cannot be added or moved to another capacity reservation group.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the capacity reservation group that the capacity reservations should be assigned to. Currently, a capacity reservation can only be added to a capacity reservation group at creation time. An existing capacity reservation cannot be added or moved to another capacity reservation group.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/CapacityReservationGroupProperties"
///    },
///    "zones": {
///      "description": "The availability zones.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationGroup {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<CapacityReservationGroupProperties>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///The availability zones.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zones: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&CapacityReservationGroup> for CapacityReservationGroup {
    fn from(value: &CapacityReservationGroup) -> Self {
        value.clone()
    }
}
///`CapacityReservationGroupInstanceView`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "capacityReservations": {
///      "description": "List of instance view of the capacity reservations under the capacity reservation group.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/CapacityReservationInstanceViewWithName"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "sharedSubscriptionIds": {
///      "description": "List of the subscriptions that the capacity reservation group is shared with. **Note:** Minimum api-version: 2023-09-01. Please refer to https://aka.ms/computereservationsharing for more details.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResourceReadOnly"
///      },
///      "x-ms-identifiers": [
///        "id"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationGroupInstanceView {
    ///List of instance view of the capacity reservations under the capacity reservation group.
    #[serde(
        rename = "capacityReservations",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub capacity_reservations: ::std::vec::Vec<CapacityReservationInstanceViewWithName>,
    ///List of the subscriptions that the capacity reservation group is shared with. **Note:** Minimum api-version: 2023-09-01. Please refer to https://aka.ms/computereservationsharing for more details.
    #[serde(
        rename = "sharedSubscriptionIds",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub shared_subscription_ids: ::std::vec::Vec<SubResourceReadOnly>,
}
impl ::std::convert::From<&CapacityReservationGroupInstanceView>
for CapacityReservationGroupInstanceView {
    fn from(value: &CapacityReservationGroupInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for CapacityReservationGroupInstanceView {
    fn default() -> Self {
        Self {
            capacity_reservations: Default::default(),
            shared_subscription_ids: Default::default(),
        }
    }
}
///`CapacityReservationGroupInstanceViewTypes`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "instanceView"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "CapacityReservationGroupInstanceViewTypes",
///    "values": [
///      {
///        "name": "instanceView",
///        "value": "instanceView"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum CapacityReservationGroupInstanceViewTypes {
    #[serde(rename = "instanceView")]
    InstanceView,
}
impl ::std::convert::From<&Self> for CapacityReservationGroupInstanceViewTypes {
    fn from(value: &CapacityReservationGroupInstanceViewTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for CapacityReservationGroupInstanceViewTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::InstanceView => f.write_str("instanceView"),
        }
    }
}
impl ::std::str::FromStr for CapacityReservationGroupInstanceViewTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "instanceview" => Ok(Self::InstanceView),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for CapacityReservationGroupInstanceViewTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for CapacityReservationGroupInstanceViewTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for CapacityReservationGroupInstanceViewTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The List capacity reservation group with resource group response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List capacity reservation group with resource group response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The URI to fetch the next page of capacity reservation groups. Call ListNext() with this URI to fetch the next page of capacity reservation groups.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of capacity reservation groups.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/CapacityReservationGroup"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationGroupListResult {
    ///The URI to fetch the next page of capacity reservation groups. Call ListNext() with this URI to fetch the next page of capacity reservation groups.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of capacity reservation groups.
    pub value: ::std::vec::Vec<CapacityReservationGroup>,
}
impl ::std::convert::From<&CapacityReservationGroupListResult>
for CapacityReservationGroupListResult {
    fn from(value: &CapacityReservationGroupListResult) -> Self {
        value.clone()
    }
}
///capacity reservation group Properties.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "capacity reservation group Properties.",
///  "type": "object",
///  "properties": {
///    "capacityReservations": {
///      "description": "A list of all capacity reservation resource ids that belong to capacity reservation group.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResourceReadOnly"
///      }
///    },
///    "instanceView": {
///      "$ref": "#/components/schemas/CapacityReservationGroupInstanceView"
///    },
///    "reservationType": {
///      "$ref": "#/components/schemas/ReservationType"
///    },
///    "sharingProfile": {
///      "$ref": "#/components/schemas/ResourceSharingProfile"
///    },
///    "virtualMachinesAssociated": {
///      "description": "A list of references to all virtual machines associated to the capacity reservation group.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResourceReadOnly"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationGroupProperties {
    ///A list of all capacity reservation resource ids that belong to capacity reservation group.
    #[serde(
        rename = "capacityReservations",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub capacity_reservations: ::std::vec::Vec<SubResourceReadOnly>,
    #[serde(
        rename = "instanceView",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_view: ::std::option::Option<CapacityReservationGroupInstanceView>,
    #[serde(
        rename = "reservationType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub reservation_type: ::std::option::Option<ReservationType>,
    #[serde(
        rename = "sharingProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sharing_profile: ::std::option::Option<ResourceSharingProfile>,
    ///A list of references to all virtual machines associated to the capacity reservation group.
    #[serde(
        rename = "virtualMachinesAssociated",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machines_associated: ::std::vec::Vec<SubResourceReadOnly>,
}
impl ::std::convert::From<&CapacityReservationGroupProperties>
for CapacityReservationGroupProperties {
    fn from(value: &CapacityReservationGroupProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for CapacityReservationGroupProperties {
    fn default() -> Self {
        Self {
            capacity_reservations: Default::default(),
            instance_view: Default::default(),
            reservation_type: Default::default(),
            sharing_profile: Default::default(),
            virtual_machines_associated: Default::default(),
        }
    }
}
///Specifies information about the capacity reservation group. Only tags can be updated.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the capacity reservation group. Only tags can be updated.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/CapacityReservationGroupProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationGroupUpdate {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<CapacityReservationGroupProperties>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&CapacityReservationGroupUpdate>
for CapacityReservationGroupUpdate {
    fn from(value: &CapacityReservationGroupUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for CapacityReservationGroupUpdate {
    fn default() -> Self {
        Self {
            properties: Default::default(),
            tags: Default::default(),
        }
    }
}
///The instance view of a capacity reservation that provides as snapshot of the runtime properties of the capacity reservation that is managed by the platform and can change outside of control plane operations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a capacity reservation that provides as snapshot of the runtime properties of the capacity reservation that is managed by the platform and can change outside of control plane operations.",
///  "type": "object",
///  "properties": {
///    "statuses": {
///      "description": "The resource status information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    },
///    "utilizationInfo": {
///      "$ref": "#/components/schemas/CapacityReservationUtilization"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationInstanceView {
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
    #[serde(
        rename = "utilizationInfo",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub utilization_info: ::std::option::Option<CapacityReservationUtilization>,
}
impl ::std::convert::From<&CapacityReservationInstanceView>
for CapacityReservationInstanceView {
    fn from(value: &CapacityReservationInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for CapacityReservationInstanceView {
    fn default() -> Self {
        Self {
            statuses: Default::default(),
            utilization_info: Default::default(),
        }
    }
}
///`CapacityReservationInstanceViewTypes`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "instanceView"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "CapacityReservationInstanceViewTypes",
///    "values": [
///      {
///        "name": "instanceView",
///        "value": "instanceView"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum CapacityReservationInstanceViewTypes {
    #[serde(rename = "instanceView")]
    InstanceView,
}
impl ::std::convert::From<&Self> for CapacityReservationInstanceViewTypes {
    fn from(value: &CapacityReservationInstanceViewTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for CapacityReservationInstanceViewTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::InstanceView => f.write_str("instanceView"),
        }
    }
}
impl ::std::str::FromStr for CapacityReservationInstanceViewTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "instanceview" => Ok(Self::InstanceView),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for CapacityReservationInstanceViewTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for CapacityReservationInstanceViewTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for CapacityReservationInstanceViewTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The instance view of a capacity reservation that includes the name of the capacity reservation. It is used for the response to the instance view of a capacity reservation group.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a capacity reservation that includes the name of the capacity reservation. It is used for the response to the instance view of a capacity reservation group.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/CapacityReservationInstanceView"
///    }
///  ],
///  "properties": {
///    "name": {
///      "description": "The name of the capacity reservation.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationInstanceViewWithName {
    ///The name of the capacity reservation.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
    #[serde(
        rename = "utilizationInfo",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub utilization_info: ::std::option::Option<CapacityReservationUtilization>,
}
impl ::std::convert::From<&CapacityReservationInstanceViewWithName>
for CapacityReservationInstanceViewWithName {
    fn from(value: &CapacityReservationInstanceViewWithName) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for CapacityReservationInstanceViewWithName {
    fn default() -> Self {
        Self {
            name: Default::default(),
            statuses: Default::default(),
            utilization_info: Default::default(),
        }
    }
}
///The list capacity reservation operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The list capacity reservation operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The URI to fetch the next page of capacity reservations. Call ListNext() with this URI to fetch the next page of capacity reservations.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of capacity reservations.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/CapacityReservation"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationListResult {
    ///The URI to fetch the next page of capacity reservations. Call ListNext() with this URI to fetch the next page of capacity reservations.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of capacity reservations.
    pub value: ::std::vec::Vec<CapacityReservation>,
}
impl ::std::convert::From<&CapacityReservationListResult>
for CapacityReservationListResult {
    fn from(value: &CapacityReservationListResult) -> Self {
        value.clone()
    }
}
///The parameters of a capacity reservation Profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The parameters of a capacity reservation Profile.",
///  "type": "object",
///  "properties": {
///    "capacityReservationGroup": {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationProfile {
    #[serde(
        rename = "capacityReservationGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub capacity_reservation_group: ::std::option::Option<SubResource>,
}
impl ::std::convert::From<&CapacityReservationProfile> for CapacityReservationProfile {
    fn from(value: &CapacityReservationProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for CapacityReservationProfile {
    fn default() -> Self {
        Self {
            capacity_reservation_group: Default::default(),
        }
    }
}
///Properties of the Capacity reservation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Properties of the Capacity reservation.",
///  "type": "object",
///  "properties": {
///    "instanceView": {
///      "$ref": "#/components/schemas/CapacityReservationInstanceView"
///    },
///    "platformFaultDomainCount": {
///      "description": "Specifies the value of fault domain count that Capacity Reservation supports for requested VM size. **Note:** The fault domain count specified for a resource (like virtual machines scale set) must be less than or equal to this value if it deploys using capacity reservation. Minimum api-version: 2022-08-01.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "provisioningState": {
///      "description": "The provisioning state, which only appears in the response.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "provisioningTime": {
///      "description": "The date time when the capacity reservation was last updated.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "reservationId": {
///      "description": "A unique id generated and assigned to the capacity reservation by the platform which does not change throughout the lifetime of the resource.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "scheduleProfile": {
///      "$ref": "#/components/schemas/ScheduleProfile"
///    },
///    "timeCreated": {
///      "description": "Specifies the time at which the Capacity Reservation resource was created. Minimum api-version: 2021-11-01.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "virtualMachinesAssociated": {
///      "description": "A list of all virtual machine resource ids that are associated with the capacity reservation.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResourceReadOnly"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationProperties {
    #[serde(
        rename = "instanceView",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_view: ::std::option::Option<CapacityReservationInstanceView>,
    ///Specifies the value of fault domain count that Capacity Reservation supports for requested VM size. **Note:** The fault domain count specified for a resource (like virtual machines scale set) must be less than or equal to this value if it deploys using capacity reservation. Minimum api-version: 2022-08-01.
    #[serde(
        rename = "platformFaultDomainCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub platform_fault_domain_count: ::std::option::Option<i32>,
    ///The provisioning state, which only appears in the response.
    #[serde(
        rename = "provisioningState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_state: ::std::option::Option<::std::string::String>,
    ///The date time when the capacity reservation was last updated.
    #[serde(
        rename = "provisioningTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_time: ::std::option::Option<::std::string::String>,
    ///A unique id generated and assigned to the capacity reservation by the platform which does not change throughout the lifetime of the resource.
    #[serde(
        rename = "reservationId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub reservation_id: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "scheduleProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub schedule_profile: ::std::option::Option<ScheduleProfile>,
    ///Specifies the time at which the Capacity Reservation resource was created. Minimum api-version: 2021-11-01.
    #[serde(
        rename = "timeCreated",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub time_created: ::std::option::Option<::std::string::String>,
    ///A list of all virtual machine resource ids that are associated with the capacity reservation.
    #[serde(
        rename = "virtualMachinesAssociated",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machines_associated: ::std::vec::Vec<SubResourceReadOnly>,
}
impl ::std::convert::From<&CapacityReservationProperties>
for CapacityReservationProperties {
    fn from(value: &CapacityReservationProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for CapacityReservationProperties {
    fn default() -> Self {
        Self {
            instance_view: Default::default(),
            platform_fault_domain_count: Default::default(),
            provisioning_state: Default::default(),
            provisioning_time: Default::default(),
            reservation_id: Default::default(),
            schedule_profile: Default::default(),
            time_created: Default::default(),
            virtual_machines_associated: Default::default(),
        }
    }
}
///Specifies information about the capacity reservation. sku.capacity cannot be updated for Block Capacity Reservation. Tags can be update for all Capacity Reservation Types.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the capacity reservation. sku.capacity cannot be updated for Block Capacity Reservation. Tags can be update for all Capacity Reservation Types.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/CapacityReservationProperties"
///    },
///    "sku": {
///      "$ref": "#/components/schemas/Sku"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationUpdate {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<CapacityReservationProperties>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku: ::std::option::Option<Sku>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&CapacityReservationUpdate> for CapacityReservationUpdate {
    fn from(value: &CapacityReservationUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for CapacityReservationUpdate {
    fn default() -> Self {
        Self {
            properties: Default::default(),
            sku: Default::default(),
            tags: Default::default(),
        }
    }
}
///Represents the capacity reservation utilization in terms of resources allocated.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Represents the capacity reservation utilization in terms of resources allocated.",
///  "type": "object",
///  "properties": {
///    "currentCapacity": {
///      "description": "The value provides the current capacity of the VM size which was reserved successfully and for which the customer is getting billed. Minimum api-version: 2022-08-01.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "virtualMachinesAllocated": {
///      "description": "A list of all virtual machines resource ids allocated against the capacity reservation.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResourceReadOnly"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CapacityReservationUtilization {
    ///The value provides the current capacity of the VM size which was reserved successfully and for which the customer is getting billed. Minimum api-version: 2022-08-01.
    #[serde(
        rename = "currentCapacity",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub current_capacity: ::std::option::Option<i32>,
    ///A list of all virtual machines resource ids allocated against the capacity reservation.
    #[serde(
        rename = "virtualMachinesAllocated",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machines_allocated: ::std::vec::Vec<SubResourceReadOnly>,
}
impl ::std::convert::From<&CapacityReservationUtilization>
for CapacityReservationUtilization {
    fn from(value: &CapacityReservationUtilization) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for CapacityReservationUtilization {
    fn default() -> Self {
        Self {
            current_capacity: Default::default(),
            virtual_machines_allocated: Default::default(),
        }
    }
}
///An error response from the Compute service.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "An error response from the Compute service.",
///  "type": "object",
///  "properties": {
///    "error": {
///      "$ref": "#/components/schemas/ApiError"
///    }
///  },
///  "x-ms-external": true
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct CloudError {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub error: ::std::option::Option<ApiError>,
}
impl ::std::convert::From<&CloudError> for CloudError {
    fn from(value: &CloudError) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for CloudError {
    fn default() -> Self {
        Self { error: Default::default() }
    }
}
///`ComponentNames`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "Microsoft-Windows-Shell-Setup"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ComponentNames {
    #[serde(rename = "Microsoft-Windows-Shell-Setup")]
    MicrosoftWindowsShellSetup,
}
impl ::std::convert::From<&Self> for ComponentNames {
    fn from(value: &ComponentNames) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ComponentNames {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::MicrosoftWindowsShellSetup => {
                f.write_str("Microsoft-Windows-Shell-Setup")
            }
        }
    }
}
impl ::std::str::FromStr for ComponentNames {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "microsoft-windows-shell-setup" => Ok(Self::MicrosoftWindowsShellSetup),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ComponentNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ComponentNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ComponentNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///ConsistencyMode of the RestorePoint. Can be specified in the input while creating a restore point. For now, only CrashConsistent is accepted as a valid input. Please refer to https://aka.ms/RestorePoints for more details.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "ConsistencyMode of the RestorePoint. Can be specified in the input while creating a restore point. For now, only CrashConsistent is accepted as a valid input. Please refer to https://aka.ms/RestorePoints for more details.",
///  "type": "string",
///  "enum": [
///    "CrashConsistent",
///    "FileSystemConsistent",
///    "ApplicationConsistent"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ConsistencyModeTypes",
///    "values": [
///      {
///        "name": "CrashConsistent",
///        "value": "CrashConsistent"
///      },
///      {
///        "name": "FileSystemConsistent",
///        "value": "FileSystemConsistent"
///      },
///      {
///        "name": "ApplicationConsistent",
///        "value": "ApplicationConsistent"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ConsistencyModeTypes {
    CrashConsistent,
    FileSystemConsistent,
    ApplicationConsistent,
}
impl ::std::convert::From<&Self> for ConsistencyModeTypes {
    fn from(value: &ConsistencyModeTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ConsistencyModeTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::CrashConsistent => f.write_str("CrashConsistent"),
            Self::FileSystemConsistent => f.write_str("FileSystemConsistent"),
            Self::ApplicationConsistent => f.write_str("ApplicationConsistent"),
        }
    }
}
impl ::std::str::FromStr for ConsistencyModeTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "crashconsistent" => Ok(Self::CrashConsistent),
            "filesystemconsistent" => Ok(Self::FileSystemConsistent),
            "applicationconsistent" => Ok(Self::ApplicationConsistent),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ConsistencyModeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ConsistencyModeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ConsistencyModeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes the Virtual Machine Scale Set to convert from Availability Set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the Virtual Machine Scale Set to convert from Availability Set.",
///  "type": "object",
///  "properties": {
///    "virtualMachineScaleSetName": {
///      "description": "Specifies information about the Virtual Machine Scale Set that the Availability Set should be converted to.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ConvertToVirtualMachineScaleSetInput {
    ///Specifies information about the Virtual Machine Scale Set that the Availability Set should be converted to.
    #[serde(
        rename = "virtualMachineScaleSetName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machine_scale_set_name: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&ConvertToVirtualMachineScaleSetInput>
for ConvertToVirtualMachineScaleSetInput {
    fn from(value: &ConvertToVirtualMachineScaleSetInput) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ConvertToVirtualMachineScaleSetInput {
    fn default() -> Self {
        Self {
            virtual_machine_scale_set_name: Default::default(),
        }
    }
}
///Describes a data disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a data disk.",
///  "type": "object",
///  "required": [
///    "createOption",
///    "lun"
///  ],
///  "properties": {
///    "caching": {
///      "$ref": "#/components/schemas/CachingTypes"
///    },
///    "createOption": {
///      "$ref": "#/components/schemas/DiskCreateOptionTypes"
///    },
///    "deleteOption": {
///      "$ref": "#/components/schemas/DiskDeleteOptionTypes"
///    },
///    "detachOption": {
///      "$ref": "#/components/schemas/DiskDetachOptionTypes"
///    },
///    "diskIOPSReadWrite": {
///      "description": "Specifies the Read-Write IOPS for the managed disk when StorageAccountType is UltraSSD_LRS.",
///      "type": "integer",
///      "format": "int64"
///    },
///    "diskMBpsReadWrite": {
///      "description": "Specifies the bandwidth in MB per second for the managed disk when StorageAccountType is UltraSSD_LRS.",
///      "type": "integer",
///      "format": "int64"
///    },
///    "diskSizeGB": {
///      "description": "Specifies the size of an empty data disk in gigabytes. This element can be used to overwrite the size of the disk in a virtual machine image. The property 'diskSizeGB' is the number of bytes x 1024^3 for the disk and the value cannot be larger than 1023.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "image": {
///      "$ref": "#/components/schemas/VirtualHardDisk"
///    },
///    "lun": {
///      "description": "Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "managedDisk": {
///      "$ref": "#/components/schemas/ManagedDiskParameters"
///    },
///    "name": {
///      "description": "The disk name.",
///      "type": "string"
///    },
///    "sourceResource": {
///      "$ref": "#/components/schemas/ApiEntityReference"
///    },
///    "toBeDetached": {
///      "description": "Specifies whether the data disk is in process of detachment from the VirtualMachine/VirtualMachineScaleset",
///      "type": "boolean"
///    },
///    "vhd": {
///      "$ref": "#/components/schemas/VirtualHardDisk"
///    },
///    "writeAcceleratorEnabled": {
///      "description": "Specifies whether writeAccelerator should be enabled or disabled on the disk.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DataDisk {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub caching: ::std::option::Option<CachingTypes>,
    #[serde(rename = "createOption")]
    pub create_option: DiskCreateOptionTypes,
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DiskDeleteOptionTypes>,
    #[serde(
        rename = "detachOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub detach_option: ::std::option::Option<DiskDetachOptionTypes>,
    ///Specifies the Read-Write IOPS for the managed disk when StorageAccountType is UltraSSD_LRS.
    #[serde(
        rename = "diskIOPSReadWrite",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_iops_read_write: ::std::option::Option<i64>,
    ///Specifies the bandwidth in MB per second for the managed disk when StorageAccountType is UltraSSD_LRS.
    #[serde(
        rename = "diskMBpsReadWrite",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_m_bps_read_write: ::std::option::Option<i64>,
    ///Specifies the size of an empty data disk in gigabytes. This element can be used to overwrite the size of the disk in a virtual machine image. The property 'diskSizeGB' is the number of bytes x 1024^3 for the disk and the value cannot be larger than 1023.
    #[serde(
        rename = "diskSizeGB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_size_gb: ::std::option::Option<i32>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub image: ::std::option::Option<VirtualHardDisk>,
    ///Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.
    pub lun: i32,
    #[serde(
        rename = "managedDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub managed_disk: ::std::option::Option<ManagedDiskParameters>,
    ///The disk name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "sourceResource",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub source_resource: ::std::option::Option<ApiEntityReference>,
    ///Specifies whether the data disk is in process of detachment from the VirtualMachine/VirtualMachineScaleset
    #[serde(
        rename = "toBeDetached",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub to_be_detached: ::std::option::Option<bool>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vhd: ::std::option::Option<VirtualHardDisk>,
    ///Specifies whether writeAccelerator should be enabled or disabled on the disk.
    #[serde(
        rename = "writeAcceleratorEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub write_accelerator_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&DataDisk> for DataDisk {
    fn from(value: &DataDisk) -> Self {
        value.clone()
    }
}
///Contains the data disk images information.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Contains the data disk images information.",
///  "type": "object",
///  "properties": {
///    "lun": {
///      "description": "Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DataDiskImage {
    ///Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub lun: ::std::option::Option<i32>,
}
impl ::std::convert::From<&DataDiskImage> for DataDiskImage {
    fn from(value: &DataDiskImage) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DataDiskImage {
    fn default() -> Self {
        Self { lun: Default::default() }
    }
}
///Describes the data disk to be attached.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the data disk to be attached.",
///  "type": "object",
///  "required": [
///    "diskId"
///  ],
///  "properties": {
///    "caching": {
///      "$ref": "#/components/schemas/CachingTypes"
///    },
///    "deleteOption": {
///      "$ref": "#/components/schemas/DiskDeleteOptionTypes"
///    },
///    "diskEncryptionSet": {
///      "$ref": "#/components/schemas/DiskEncryptionSetParameters"
///    },
///    "diskId": {
///      "description": "ID of the managed data disk.",
///      "type": "string"
///    },
///    "lun": {
///      "description": "The logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. If not specified, lun would be auto assigned.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "writeAcceleratorEnabled": {
///      "description": "Specifies whether writeAccelerator should be enabled or disabled on the disk.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DataDisksToAttach {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub caching: ::std::option::Option<CachingTypes>,
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DiskDeleteOptionTypes>,
    #[serde(
        rename = "diskEncryptionSet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_encryption_set: ::std::option::Option<DiskEncryptionSetParameters>,
    ///ID of the managed data disk.
    #[serde(rename = "diskId")]
    pub disk_id: ::std::string::String,
    ///The logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. If not specified, lun would be auto assigned.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub lun: ::std::option::Option<i32>,
    ///Specifies whether writeAccelerator should be enabled or disabled on the disk.
    #[serde(
        rename = "writeAcceleratorEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub write_accelerator_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&DataDisksToAttach> for DataDisksToAttach {
    fn from(value: &DataDisksToAttach) -> Self {
        value.clone()
    }
}
///Describes the data disk to be detached.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the data disk to be detached.",
///  "type": "object",
///  "required": [
///    "diskId"
///  ],
///  "properties": {
///    "detachOption": {
///      "$ref": "#/components/schemas/DiskDetachOptionTypes"
///    },
///    "diskId": {
///      "description": "ID of the managed data disk.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DataDisksToDetach {
    #[serde(
        rename = "detachOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub detach_option: ::std::option::Option<DiskDetachOptionTypes>,
    ///ID of the managed data disk.
    #[serde(rename = "diskId")]
    pub disk_id: ::std::string::String,
}
impl ::std::convert::From<&DataDisksToDetach> for DataDisksToDetach {
    fn from(value: &DataDisksToDetach) -> Self {
        value.clone()
    }
}
///Specifies information about the Dedicated host.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the Dedicated host.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "required": [
///    "sku"
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/DedicatedHostProperties"
///    },
///    "sku": {
///      "$ref": "#/components/schemas/Sku"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHost {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<DedicatedHostProperties>,
    pub sku: Sku,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&DedicatedHost> for DedicatedHost {
    fn from(value: &DedicatedHost) -> Self {
        value.clone()
    }
}
///Represents the dedicated host unutilized capacity in terms of a specific VM size.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Represents the dedicated host unutilized capacity in terms of a specific VM size.",
///  "type": "object",
///  "properties": {
///    "count": {
///      "description": "Maximum number of VMs of size vmSize that can fit in the dedicated host's remaining capacity.",
///      "type": "number",
///      "format": "double"
///    },
///    "vmSize": {
///      "description": "VM size in terms of which the unutilized capacity is represented.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostAllocatableVm {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub count: ::std::option::Option<f64>,
    ///VM size in terms of which the unutilized capacity is represented.
    #[serde(
        rename = "vmSize",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_size: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&DedicatedHostAllocatableVm> for DedicatedHostAllocatableVm {
    fn from(value: &DedicatedHostAllocatableVm) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DedicatedHostAllocatableVm {
    fn default() -> Self {
        Self {
            count: Default::default(),
            vm_size: Default::default(),
        }
    }
}
///Dedicated host unutilized capacity.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Dedicated host unutilized capacity.",
///  "type": "object",
///  "properties": {
///    "allocatableVMs": {
///      "description": "The unutilized capacity of the dedicated host represented in terms of each VM size that is allowed to be deployed to the dedicated host.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DedicatedHostAllocatableVM"
///      },
///      "x-ms-identifiers": []
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostAvailableCapacity {
    ///The unutilized capacity of the dedicated host represented in terms of each VM size that is allowed to be deployed to the dedicated host.
    #[serde(
        rename = "allocatableVMs",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub allocatable_v_ms: ::std::vec::Vec<DedicatedHostAllocatableVm>,
}
impl ::std::convert::From<&DedicatedHostAvailableCapacity>
for DedicatedHostAvailableCapacity {
    fn from(value: &DedicatedHostAvailableCapacity) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DedicatedHostAvailableCapacity {
    fn default() -> Self {
        Self {
            allocatable_v_ms: Default::default(),
        }
    }
}
///Specifies information about the dedicated host group that the dedicated hosts should be assigned to. Currently, a dedicated host can only be added to a dedicated host group at creation time. An existing dedicated host cannot be added to another dedicated host group.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the dedicated host group that the dedicated hosts should be assigned to. Currently, a dedicated host can only be added to a dedicated host group at creation time. An existing dedicated host cannot be added to another dedicated host group.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/DedicatedHostGroupProperties"
///    },
///    "zones": {
///      "description": "The availability zones.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostGroup {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<DedicatedHostGroupProperties>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///The availability zones.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zones: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&DedicatedHostGroup> for DedicatedHostGroup {
    fn from(value: &DedicatedHostGroup) -> Self {
        value.clone()
    }
}
///`DedicatedHostGroupInstanceView`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "hosts": {
///      "description": "List of instance view of the dedicated hosts under the dedicated host group.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DedicatedHostInstanceViewWithName"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostGroupInstanceView {
    ///List of instance view of the dedicated hosts under the dedicated host group.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hosts: ::std::vec::Vec<DedicatedHostInstanceViewWithName>,
}
impl ::std::convert::From<&DedicatedHostGroupInstanceView>
for DedicatedHostGroupInstanceView {
    fn from(value: &DedicatedHostGroupInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DedicatedHostGroupInstanceView {
    fn default() -> Self {
        Self { hosts: Default::default() }
    }
}
///The List Dedicated Host Group with resource group response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Dedicated Host Group with resource group response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The URI to fetch the next page of Dedicated Host Groups. Call ListNext() with this URI to fetch the next page of Dedicated Host Groups.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of dedicated host groups.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DedicatedHostGroup"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostGroupListResult {
    ///The URI to fetch the next page of Dedicated Host Groups. Call ListNext() with this URI to fetch the next page of Dedicated Host Groups.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of dedicated host groups.
    pub value: ::std::vec::Vec<DedicatedHostGroup>,
}
impl ::std::convert::From<&DedicatedHostGroupListResult>
for DedicatedHostGroupListResult {
    fn from(value: &DedicatedHostGroupListResult) -> Self {
        value.clone()
    }
}
///Dedicated Host Group Properties.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Dedicated Host Group Properties.",
///  "type": "object",
///  "required": [
///    "platformFaultDomainCount"
///  ],
///  "properties": {
///    "additionalCapabilities": {
///      "$ref": "#/components/schemas/DedicatedHostGroupPropertiesAdditionalCapabilities"
///    },
///    "hosts": {
///      "description": "A list of references to all dedicated hosts in the dedicated host group.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResourceReadOnly"
///      }
///    },
///    "instanceView": {
///      "$ref": "#/components/schemas/DedicatedHostGroupInstanceView"
///    },
///    "platformFaultDomainCount": {
///      "description": "Number of fault domains that the host group can span.",
///      "type": "integer",
///      "format": "int32",
///      "minimum": 1.0
///    },
///    "supportAutomaticPlacement": {
///      "description": "Specifies whether virtual machines or virtual machine scale sets can be placed automatically on the dedicated host group. Automatic placement means resources are allocated on dedicated hosts, that are chosen by Azure, under the dedicated host group. The value is defaulted to 'false' when not provided. Minimum api-version: 2020-06-01.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostGroupProperties {
    #[serde(
        rename = "additionalCapabilities",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub additional_capabilities: ::std::option::Option<
        DedicatedHostGroupPropertiesAdditionalCapabilities,
    >,
    ///A list of references to all dedicated hosts in the dedicated host group.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hosts: ::std::vec::Vec<SubResourceReadOnly>,
    #[serde(
        rename = "instanceView",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_view: ::std::option::Option<DedicatedHostGroupInstanceView>,
    ///Number of fault domains that the host group can span.
    #[serde(rename = "platformFaultDomainCount")]
    pub platform_fault_domain_count: ::std::num::NonZeroU32,
    ///Specifies whether virtual machines or virtual machine scale sets can be placed automatically on the dedicated host group. Automatic placement means resources are allocated on dedicated hosts, that are chosen by Azure, under the dedicated host group. The value is defaulted to 'false' when not provided. Minimum api-version: 2020-06-01.
    #[serde(
        rename = "supportAutomaticPlacement",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub support_automatic_placement: ::std::option::Option<bool>,
}
impl ::std::convert::From<&DedicatedHostGroupProperties>
for DedicatedHostGroupProperties {
    fn from(value: &DedicatedHostGroupProperties) -> Self {
        value.clone()
    }
}
///Enables or disables a capability on the dedicated host group. Minimum api-version: 2022-03-01.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Enables or disables a capability on the dedicated host group. Minimum api-version: 2022-03-01.",
///  "type": "object",
///  "properties": {
///    "ultraSSDEnabled": {
///      "description": "The flag that enables or disables a capability to have UltraSSD Enabled Virtual Machines on Dedicated Hosts of the Dedicated Host Group. For the Virtual Machines to be UltraSSD Enabled, UltraSSDEnabled flag for the resource needs to be set true as well. The value is defaulted to 'false' when not provided. Please refer to https://docs.microsoft.com/en-us/azure/virtual-machines/disks-enable-ultra-ssd for more details on Ultra SSD feature. **Note:** The ultraSSDEnabled setting can only be enabled for Host Groups that are created as zonal. Minimum api-version: 2022-03-01.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostGroupPropertiesAdditionalCapabilities {
    ///The flag that enables or disables a capability to have UltraSSD Enabled Virtual Machines on Dedicated Hosts of the Dedicated Host Group. For the Virtual Machines to be UltraSSD Enabled, UltraSSDEnabled flag for the resource needs to be set true as well. The value is defaulted to 'false' when not provided. Please refer to https://docs.microsoft.com/en-us/azure/virtual-machines/disks-enable-ultra-ssd for more details on Ultra SSD feature. **Note:** The ultraSSDEnabled setting can only be enabled for Host Groups that are created as zonal. Minimum api-version: 2022-03-01.
    #[serde(
        rename = "ultraSSDEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub ultra_ssd_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&DedicatedHostGroupPropertiesAdditionalCapabilities>
for DedicatedHostGroupPropertiesAdditionalCapabilities {
    fn from(value: &DedicatedHostGroupPropertiesAdditionalCapabilities) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DedicatedHostGroupPropertiesAdditionalCapabilities {
    fn default() -> Self {
        Self {
            ultra_ssd_enabled: Default::default(),
        }
    }
}
///Specifies information about the dedicated host group that the dedicated host should be assigned to. Only tags may be updated.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the dedicated host group that the dedicated host should be assigned to. Only tags may be updated.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/DedicatedHostGroupProperties"
///    },
///    "zones": {
///      "description": "Availability Zone to use for this host group. Only single zone is supported. The zone can be assigned only during creation. If not provided, the group supports all zones in the region. If provided, enforces each host in the group to be in the same zone.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostGroupUpdate {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<DedicatedHostGroupProperties>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///Availability Zone to use for this host group. Only single zone is supported. The zone can be assigned only during creation. If not provided, the group supports all zones in the region. If provided, enforces each host in the group to be in the same zone.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zones: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&DedicatedHostGroupUpdate> for DedicatedHostGroupUpdate {
    fn from(value: &DedicatedHostGroupUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DedicatedHostGroupUpdate {
    fn default() -> Self {
        Self {
            properties: Default::default(),
            tags: Default::default(),
            zones: Default::default(),
        }
    }
}
///The instance view of a dedicated host.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a dedicated host.",
///  "type": "object",
///  "properties": {
///    "assetId": {
///      "description": "Specifies the unique id of the dedicated physical machine on which the dedicated host resides.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "availableCapacity": {
///      "$ref": "#/components/schemas/DedicatedHostAvailableCapacity"
///    },
///    "statuses": {
///      "description": "The resource status information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostInstanceView {
    ///Specifies the unique id of the dedicated physical machine on which the dedicated host resides.
    #[serde(
        rename = "assetId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub asset_id: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "availableCapacity",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub available_capacity: ::std::option::Option<DedicatedHostAvailableCapacity>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
}
impl ::std::convert::From<&DedicatedHostInstanceView> for DedicatedHostInstanceView {
    fn from(value: &DedicatedHostInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DedicatedHostInstanceView {
    fn default() -> Self {
        Self {
            asset_id: Default::default(),
            available_capacity: Default::default(),
            statuses: Default::default(),
        }
    }
}
///The instance view of a dedicated host that includes the name of the dedicated host. It is used for the response to the instance view of a dedicated host group.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a dedicated host that includes the name of the dedicated host. It is used for the response to the instance view of a dedicated host group.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/DedicatedHostInstanceView"
///    }
///  ],
///  "properties": {
///    "name": {
///      "description": "The name of the dedicated host.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostInstanceViewWithName {
    ///Specifies the unique id of the dedicated physical machine on which the dedicated host resides.
    #[serde(
        rename = "assetId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub asset_id: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "availableCapacity",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub available_capacity: ::std::option::Option<DedicatedHostAvailableCapacity>,
    ///The name of the dedicated host.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
}
impl ::std::convert::From<&DedicatedHostInstanceViewWithName>
for DedicatedHostInstanceViewWithName {
    fn from(value: &DedicatedHostInstanceViewWithName) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DedicatedHostInstanceViewWithName {
    fn default() -> Self {
        Self {
            asset_id: Default::default(),
            available_capacity: Default::default(),
            name: Default::default(),
            statuses: Default::default(),
        }
    }
}
///Specifies the software license type that will be applied to the VMs deployed on the dedicated host. Possible values are: **None,** **Windows_Server_Hybrid,** **Windows_Server_Perpetual.** The default value is: **None.**
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the software license type that will be applied to the VMs deployed on the dedicated host. Possible values are: **None,** **Windows_Server_Hybrid,** **Windows_Server_Perpetual.** The default value is: **None.**",
///  "type": "string",
///  "enum": [
///    "None",
///    "Windows_Server_Hybrid",
///    "Windows_Server_Perpetual"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "DedicatedHostLicenseTypes"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum DedicatedHostLicenseTypes {
    None,
    #[serde(rename = "Windows_Server_Hybrid")]
    WindowsServerHybrid,
    #[serde(rename = "Windows_Server_Perpetual")]
    WindowsServerPerpetual,
}
impl ::std::convert::From<&Self> for DedicatedHostLicenseTypes {
    fn from(value: &DedicatedHostLicenseTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for DedicatedHostLicenseTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::None => f.write_str("None"),
            Self::WindowsServerHybrid => f.write_str("Windows_Server_Hybrid"),
            Self::WindowsServerPerpetual => f.write_str("Windows_Server_Perpetual"),
        }
    }
}
impl ::std::str::FromStr for DedicatedHostLicenseTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "none" => Ok(Self::None),
            "windows_server_hybrid" => Ok(Self::WindowsServerHybrid),
            "windows_server_perpetual" => Ok(Self::WindowsServerPerpetual),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for DedicatedHostLicenseTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for DedicatedHostLicenseTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for DedicatedHostLicenseTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The list dedicated host operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The list dedicated host operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The URI to fetch the next page of dedicated hosts. Call ListNext() with this URI to fetch the next page of dedicated hosts.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of dedicated hosts.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DedicatedHost"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostListResult {
    ///The URI to fetch the next page of dedicated hosts. Call ListNext() with this URI to fetch the next page of dedicated hosts.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of dedicated hosts.
    pub value: ::std::vec::Vec<DedicatedHost>,
}
impl ::std::convert::From<&DedicatedHostListResult> for DedicatedHostListResult {
    fn from(value: &DedicatedHostListResult) -> Self {
        value.clone()
    }
}
///Properties of the dedicated host.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Properties of the dedicated host.",
///  "type": "object",
///  "properties": {
///    "autoReplaceOnFailure": {
///      "description": "Specifies whether the dedicated host should be replaced automatically in case of a failure. The value is defaulted to 'true' when not provided.",
///      "type": "boolean"
///    },
///    "hostId": {
///      "description": "A unique id generated and assigned to the dedicated host by the platform. Does not change throughout the lifetime of the host.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "instanceView": {
///      "$ref": "#/components/schemas/DedicatedHostInstanceView"
///    },
///    "licenseType": {
///      "$ref": "#/components/schemas/DedicatedHostLicenseTypes"
///    },
///    "platformFaultDomain": {
///      "description": "Fault domain of the dedicated host within a dedicated host group.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "provisioningState": {
///      "description": "The provisioning state, which only appears in the response.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "provisioningTime": {
///      "description": "The date when the host was first provisioned.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "timeCreated": {
///      "description": "Specifies the time at which the Dedicated Host resource was created. Minimum api-version: 2021-11-01.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "virtualMachines": {
///      "description": "A list of references to all virtual machines in the Dedicated Host.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResourceReadOnly"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostProperties {
    ///Specifies whether the dedicated host should be replaced automatically in case of a failure. The value is defaulted to 'true' when not provided.
    #[serde(
        rename = "autoReplaceOnFailure",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub auto_replace_on_failure: ::std::option::Option<bool>,
    ///A unique id generated and assigned to the dedicated host by the platform. Does not change throughout the lifetime of the host.
    #[serde(
        rename = "hostId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub host_id: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "instanceView",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_view: ::std::option::Option<DedicatedHostInstanceView>,
    #[serde(
        rename = "licenseType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub license_type: ::std::option::Option<DedicatedHostLicenseTypes>,
    ///Fault domain of the dedicated host within a dedicated host group.
    #[serde(
        rename = "platformFaultDomain",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub platform_fault_domain: ::std::option::Option<i32>,
    ///The provisioning state, which only appears in the response.
    #[serde(
        rename = "provisioningState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_state: ::std::option::Option<::std::string::String>,
    ///The date when the host was first provisioned.
    #[serde(
        rename = "provisioningTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_time: ::std::option::Option<::std::string::String>,
    ///Specifies the time at which the Dedicated Host resource was created. Minimum api-version: 2021-11-01.
    #[serde(
        rename = "timeCreated",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub time_created: ::std::option::Option<::std::string::String>,
    ///A list of references to all virtual machines in the Dedicated Host.
    #[serde(
        rename = "virtualMachines",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machines: ::std::vec::Vec<SubResourceReadOnly>,
}
impl ::std::convert::From<&DedicatedHostProperties> for DedicatedHostProperties {
    fn from(value: &DedicatedHostProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DedicatedHostProperties {
    fn default() -> Self {
        Self {
            auto_replace_on_failure: Default::default(),
            host_id: Default::default(),
            instance_view: Default::default(),
            license_type: Default::default(),
            platform_fault_domain: Default::default(),
            provisioning_state: Default::default(),
            provisioning_time: Default::default(),
            time_created: Default::default(),
            virtual_machines: Default::default(),
        }
    }
}
///The List Dedicated Host sizes operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Dedicated Host sizes operation response.",
///  "type": "object",
///  "properties": {
///    "nextLink": {
///      "description": "The link to the next page of items.",
///      "type": "string"
///    },
///    "value": {
///      "description": "The list of dedicated host sizes.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostSizeListResult {
    ///The link to the next page of items.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of dedicated host sizes.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub value: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&DedicatedHostSizeListResult> for DedicatedHostSizeListResult {
    fn from(value: &DedicatedHostSizeListResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DedicatedHostSizeListResult {
    fn default() -> Self {
        Self {
            next_link: Default::default(),
            value: Default::default(),
        }
    }
}
///Specifies information about the dedicated host. Only tags, autoReplaceOnFailure and licenseType may be updated.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the dedicated host. Only tags, autoReplaceOnFailure and licenseType may be updated.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/DedicatedHostProperties"
///    },
///    "sku": {
///      "$ref": "#/components/schemas/Sku"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DedicatedHostUpdate {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<DedicatedHostProperties>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku: ::std::option::Option<Sku>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&DedicatedHostUpdate> for DedicatedHostUpdate {
    fn from(value: &DedicatedHostUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DedicatedHostUpdate {
    fn default() -> Self {
        Self {
            properties: Default::default(),
            sku: Default::default(),
            tags: Default::default(),
        }
    }
}
///Indicates the target Virtual Machine ScaleSet properties upon triggering a seamless migration without downtime of the VMs via the ConvertToVirtualMachineScaleSet API.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Indicates the target Virtual Machine ScaleSet properties upon triggering a seamless migration without downtime of the VMs via the ConvertToVirtualMachineScaleSet API.",
///  "type": "object",
///  "properties": {
///    "constrainedMaximumCapacity": {
///      "description": "Indicates if the the maximum capacity of the default migrated Virtual Machine Scale Set after its migration will be constrained to a limited number of VMs.",
///      "readOnly": true,
///      "type": "boolean"
///    },
///    "defaultVirtualMachineScaleSet": {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DefaultVirtualMachineScaleSetInfo {
    ///Indicates if the the maximum capacity of the default migrated Virtual Machine Scale Set after its migration will be constrained to a limited number of VMs.
    #[serde(
        rename = "constrainedMaximumCapacity",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub constrained_maximum_capacity: ::std::option::Option<bool>,
    #[serde(
        rename = "defaultVirtualMachineScaleSet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub default_virtual_machine_scale_set: ::std::option::Option<SubResource>,
}
impl ::std::convert::From<&DefaultVirtualMachineScaleSetInfo>
for DefaultVirtualMachineScaleSetInfo {
    fn from(value: &DefaultVirtualMachineScaleSetInfo) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DefaultVirtualMachineScaleSetInfo {
    fn default() -> Self {
        Self {
            constrained_maximum_capacity: Default::default(),
            default_virtual_machine_scale_set: Default::default(),
        }
    }
}
///Specify what happens to the network interface when the VM is deleted
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specify what happens to the network interface when the VM is deleted",
///  "type": "string",
///  "enum": [
///    "Delete",
///    "Detach"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "DeleteOptions",
///    "values": [
///      {
///        "name": "Delete",
///        "value": "Delete"
///      },
///      {
///        "name": "Detach",
///        "value": "Detach"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum DeleteOptions {
    Delete,
    Detach,
}
impl ::std::convert::From<&Self> for DeleteOptions {
    fn from(value: &DeleteOptions) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for DeleteOptions {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Delete => f.write_str("Delete"),
            Self::Detach => f.write_str("Detach"),
        }
    }
}
impl ::std::str::FromStr for DeleteOptions {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "delete" => Ok(Self::Delete),
            "detach" => Ok(Self::Detach),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for DeleteOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for DeleteOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for DeleteOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the boot diagnostic settings state. Minimum api-version: 2015-06-15.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the boot diagnostic settings state. Minimum api-version: 2015-06-15.",
///  "type": "object",
///  "properties": {
///    "bootDiagnostics": {
///      "$ref": "#/components/schemas/BootDiagnostics"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DiagnosticsProfile {
    #[serde(
        rename = "bootDiagnostics",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub boot_diagnostics: ::std::option::Option<BootDiagnostics>,
}
impl ::std::convert::From<&DiagnosticsProfile> for DiagnosticsProfile {
    fn from(value: &DiagnosticsProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DiagnosticsProfile {
    fn default() -> Self {
        Self {
            boot_diagnostics: Default::default(),
        }
    }
}
///Specifies the ephemeral disk option for operating system disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the ephemeral disk option for operating system disk.",
///  "type": "string",
///  "enum": [
///    "Local"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "DiffDiskOptions",
///    "values": [
///      {
///        "name": "Local",
///        "value": "Local"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum DiffDiskOptions {
    Local,
}
impl ::std::convert::From<&Self> for DiffDiskOptions {
    fn from(value: &DiffDiskOptions) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for DiffDiskOptions {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Local => f.write_str("Local"),
        }
    }
}
impl ::std::str::FromStr for DiffDiskOptions {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "local" => Ok(Self::Local),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for DiffDiskOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for DiffDiskOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for DiffDiskOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the ephemeral disk placement for operating system disk. This property can be used by user in the request to choose the location i.e, cache disk, resource disk or nvme disk space for Ephemeral OS disk provisioning. For more information on Ephemeral OS disk size requirements, please refer Ephemeral OS disk size requirements for Windows VM at https://docs.microsoft.com/azure/virtual-machines/windows/ephemeral-os-disks#size-requirements and Linux VM at https://docs.microsoft.com/azure/virtual-machines/linux/ephemeral-os-disks#size-requirements. Minimum api-version for NvmeDisk: 2024-03-01.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the ephemeral disk placement for operating system disk. This property can be used by user in the request to choose the location i.e, cache disk, resource disk or nvme disk space for Ephemeral OS disk provisioning. For more information on Ephemeral OS disk size requirements, please refer Ephemeral OS disk size requirements for Windows VM at https://docs.microsoft.com/azure/virtual-machines/windows/ephemeral-os-disks#size-requirements and Linux VM at https://docs.microsoft.com/azure/virtual-machines/linux/ephemeral-os-disks#size-requirements. Minimum api-version for NvmeDisk: 2024-03-01.",
///  "type": "string",
///  "enum": [
///    "CacheDisk",
///    "ResourceDisk",
///    "NvmeDisk"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "DiffDiskPlacement",
///    "values": [
///      {
///        "name": "CacheDisk",
///        "value": "CacheDisk"
///      },
///      {
///        "name": "ResourceDisk",
///        "value": "ResourceDisk"
///      },
///      {
///        "name": "NvmeDisk",
///        "value": "NvmeDisk"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum DiffDiskPlacement {
    CacheDisk,
    ResourceDisk,
    NvmeDisk,
}
impl ::std::convert::From<&Self> for DiffDiskPlacement {
    fn from(value: &DiffDiskPlacement) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for DiffDiskPlacement {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::CacheDisk => f.write_str("CacheDisk"),
            Self::ResourceDisk => f.write_str("ResourceDisk"),
            Self::NvmeDisk => f.write_str("NvmeDisk"),
        }
    }
}
impl ::std::str::FromStr for DiffDiskPlacement {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "cachedisk" => Ok(Self::CacheDisk),
            "resourcedisk" => Ok(Self::ResourceDisk),
            "nvmedisk" => Ok(Self::NvmeDisk),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for DiffDiskPlacement {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for DiffDiskPlacement {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for DiffDiskPlacement {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes the parameters of ephemeral disk settings that can be specified for operating system disk. **Note:** The ephemeral disk settings can only be specified for managed disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the parameters of ephemeral disk settings that can be specified for operating system disk. **Note:** The ephemeral disk settings can only be specified for managed disk.",
///  "type": "object",
///  "properties": {
///    "option": {
///      "$ref": "#/components/schemas/DiffDiskOptions"
///    },
///    "placement": {
///      "$ref": "#/components/schemas/DiffDiskPlacement"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DiffDiskSettings {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub option: ::std::option::Option<DiffDiskOptions>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub placement: ::std::option::Option<DiffDiskPlacement>,
}
impl ::std::convert::From<&DiffDiskSettings> for DiffDiskSettings {
    fn from(value: &DiffDiskSettings) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DiffDiskSettings {
    fn default() -> Self {
        Self {
            option: Default::default(),
            placement: Default::default(),
        }
    }
}
///Specifies the disallowed configuration for a virtual machine image.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the disallowed configuration for a virtual machine image.",
///  "type": "object",
///  "properties": {
///    "vmDiskType": {
///      "$ref": "#/components/schemas/VmDiskTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DisallowedConfiguration {
    #[serde(
        rename = "vmDiskType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_disk_type: ::std::option::Option<VmDiskTypes>,
}
impl ::std::convert::From<&DisallowedConfiguration> for DisallowedConfiguration {
    fn from(value: &DisallowedConfiguration) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DisallowedConfiguration {
    fn default() -> Self {
        Self {
            vm_disk_type: Default::default(),
        }
    }
}
///Specifies the disk controller type configured for the VM and VirtualMachineScaleSet. This property is only supported for virtual machines whose operating system disk and VM sku supports Generation 2 (https://docs.microsoft.com/en-us/azure/virtual-machines/generation-2), please check the HyperVGenerations capability returned as part of VM sku capabilities in the response of Microsoft.Compute SKUs api for the region contains V2 (https://docs.microsoft.com/rest/api/compute/resourceskus/list). For more information about Disk Controller Types supported please refer to https://aka.ms/azure-diskcontrollertypes.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the disk controller type configured for the VM and VirtualMachineScaleSet. This property is only supported for virtual machines whose operating system disk and VM sku supports Generation 2 (https://docs.microsoft.com/en-us/azure/virtual-machines/generation-2), please check the HyperVGenerations capability returned as part of VM sku capabilities in the response of Microsoft.Compute SKUs api for the region contains V2 (https://docs.microsoft.com/rest/api/compute/resourceskus/list). For more information about Disk Controller Types supported please refer to https://aka.ms/azure-diskcontrollertypes.",
///  "type": "string",
///  "enum": [
///    "SCSI",
///    "NVMe"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "DiskControllerTypes",
///    "values": [
///      {
///        "name": "SCSI",
///        "value": "SCSI"
///      },
///      {
///        "name": "NVMe",
///        "value": "NVMe"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum DiskControllerTypes {
    #[serde(rename = "SCSI")]
    Scsi,
    #[serde(rename = "NVMe")]
    NvMe,
}
impl ::std::convert::From<&Self> for DiskControllerTypes {
    fn from(value: &DiskControllerTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for DiskControllerTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Scsi => f.write_str("SCSI"),
            Self::NvMe => f.write_str("NVMe"),
        }
    }
}
impl ::std::str::FromStr for DiskControllerTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "scsi" => Ok(Self::Scsi),
            "nvme" => Ok(Self::NvMe),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for DiskControllerTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for DiskControllerTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for DiskControllerTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies how the virtual machine disk should be created. Possible values are **Attach:** This value is used when you are using a specialized disk to create the virtual machine. **FromImage:** This value is used when you are using an image to create the virtual machine. If you are using a platform image, you should also use the imageReference element described above. If you are using a marketplace image, you should also use the plan element previously described. **Empty:** This value is used when creating an empty data disk. **Copy:** This value is used to create a data disk from a snapshot or another disk. **Restore:** This value is used to create a data disk from a disk restore point.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies how the virtual machine disk should be created. Possible values are **Attach:** This value is used when you are using a specialized disk to create the virtual machine. **FromImage:** This value is used when you are using an image to create the virtual machine. If you are using a platform image, you should also use the imageReference element described above. If you are using a marketplace image, you should also use the plan element previously described. **Empty:** This value is used when creating an empty data disk. **Copy:** This value is used to create a data disk from a snapshot or another disk. **Restore:** This value is used to create a data disk from a disk restore point.",
///  "type": "string",
///  "enum": [
///    "FromImage",
///    "Empty",
///    "Attach",
///    "Copy",
///    "Restore"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "DiskCreateOptionTypes",
///    "values": [
///      {
///        "name": "FromImage",
///        "value": "FromImage"
///      },
///      {
///        "name": "Empty",
///        "value": "Empty"
///      },
///      {
///        "name": "Attach",
///        "value": "Attach"
///      },
///      {
///        "name": "Copy",
///        "value": "Copy"
///      },
///      {
///        "name": "Restore",
///        "value": "Restore"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum DiskCreateOptionTypes {
    FromImage,
    Empty,
    Attach,
    Copy,
    Restore,
}
impl ::std::convert::From<&Self> for DiskCreateOptionTypes {
    fn from(value: &DiskCreateOptionTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for DiskCreateOptionTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::FromImage => f.write_str("FromImage"),
            Self::Empty => f.write_str("Empty"),
            Self::Attach => f.write_str("Attach"),
            Self::Copy => f.write_str("Copy"),
            Self::Restore => f.write_str("Restore"),
        }
    }
}
impl ::std::str::FromStr for DiskCreateOptionTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "fromimage" => Ok(Self::FromImage),
            "empty" => Ok(Self::Empty),
            "attach" => Ok(Self::Attach),
            "copy" => Ok(Self::Copy),
            "restore" => Ok(Self::Restore),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for DiskCreateOptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for DiskCreateOptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for DiskCreateOptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the behavior of the managed disk when the VM gets deleted, for example whether the managed disk is deleted or detached. Supported values are: **Delete.** If this value is used, the managed disk is deleted when VM gets deleted. **Detach.** If this value is used, the managed disk is retained after VM gets deleted. Minimum api-version: 2021-03-01.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the behavior of the managed disk when the VM gets deleted, for example whether the managed disk is deleted or detached. Supported values are: **Delete.** If this value is used, the managed disk is deleted when VM gets deleted. **Detach.** If this value is used, the managed disk is retained after VM gets deleted. Minimum api-version: 2021-03-01.",
///  "type": "string",
///  "enum": [
///    "Delete",
///    "Detach"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "DiskDeleteOptionTypes",
///    "values": [
///      {
///        "name": "Delete",
///        "value": "Delete"
///      },
///      {
///        "name": "Detach",
///        "value": "Detach"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum DiskDeleteOptionTypes {
    Delete,
    Detach,
}
impl ::std::convert::From<&Self> for DiskDeleteOptionTypes {
    fn from(value: &DiskDeleteOptionTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for DiskDeleteOptionTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Delete => f.write_str("Delete"),
            Self::Detach => f.write_str("Detach"),
        }
    }
}
impl ::std::str::FromStr for DiskDeleteOptionTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "delete" => Ok(Self::Delete),
            "detach" => Ok(Self::Detach),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for DiskDeleteOptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for DiskDeleteOptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for DiskDeleteOptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the detach behavior to be used while detaching a disk or which is already in the process of detachment from the virtual machine. Supported values are: **ForceDetach.** detachOption: **ForceDetach** is applicable only for managed data disks. If a previous detachment attempt of the data disk did not complete due to an unexpected failure from the virtual machine and the disk is still not released then use force-detach as a last resort option to detach the disk forcibly from the VM. All writes might not have been flushed when using this detach behavior. **This feature is still in preview**. To force-detach a data disk update toBeDetached to 'true' along with setting detachOption: 'ForceDetach'.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the detach behavior to be used while detaching a disk or which is already in the process of detachment from the virtual machine. Supported values are: **ForceDetach.** detachOption: **ForceDetach** is applicable only for managed data disks. If a previous detachment attempt of the data disk did not complete due to an unexpected failure from the virtual machine and the disk is still not released then use force-detach as a last resort option to detach the disk forcibly from the VM. All writes might not have been flushed when using this detach behavior. **This feature is still in preview**. To force-detach a data disk update toBeDetached to 'true' along with setting detachOption: 'ForceDetach'.",
///  "type": "string",
///  "enum": [
///    "ForceDetach"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "DiskDetachOptionTypes",
///    "values": [
///      {
///        "name": "ForceDetach",
///        "value": "ForceDetach"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum DiskDetachOptionTypes {
    ForceDetach,
}
impl ::std::convert::From<&Self> for DiskDetachOptionTypes {
    fn from(value: &DiskDetachOptionTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for DiskDetachOptionTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::ForceDetach => f.write_str("ForceDetach"),
        }
    }
}
impl ::std::str::FromStr for DiskDetachOptionTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "forcedetach" => Ok(Self::ForceDetach),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for DiskDetachOptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for DiskDetachOptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for DiskDetachOptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes the parameter of customer managed disk encryption set resource id that can be specified for disk. **Note:** The disk encryption set resource id can only be specified for managed disk. Please refer https://aka.ms/mdssewithcmkoverview for more details.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the parameter of customer managed disk encryption set resource id that can be specified for disk. **Note:** The disk encryption set resource id can only be specified for managed disk. Please refer https://aka.ms/mdssewithcmkoverview for more details.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  ]
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(transparent)]
pub struct DiskEncryptionSetParameters(pub SubResource);
impl ::std::ops::Deref for DiskEncryptionSetParameters {
    type Target = SubResource;
    fn deref(&self) -> &SubResource {
        &self.0
    }
}
impl ::std::convert::From<DiskEncryptionSetParameters> for SubResource {
    fn from(value: DiskEncryptionSetParameters) -> Self {
        value.0
    }
}
impl ::std::convert::From<&DiskEncryptionSetParameters> for DiskEncryptionSetParameters {
    fn from(value: &DiskEncryptionSetParameters) -> Self {
        value.clone()
    }
}
impl ::std::convert::From<SubResource> for DiskEncryptionSetParameters {
    fn from(value: SubResource) -> Self {
        Self(value)
    }
}
///Describes a Encryption Settings for a Disk
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Encryption Settings for a Disk",
///  "type": "object",
///  "properties": {
///    "diskEncryptionKey": {
///      "$ref": "#/components/schemas/KeyVaultSecretReference"
///    },
///    "enabled": {
///      "description": "Specifies whether disk encryption should be enabled on the virtual machine.",
///      "type": "boolean"
///    },
///    "keyEncryptionKey": {
///      "$ref": "#/components/schemas/KeyVaultKeyReference"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DiskEncryptionSettings {
    #[serde(
        rename = "diskEncryptionKey",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_encryption_key: ::std::option::Option<KeyVaultSecretReference>,
    ///Specifies whether disk encryption should be enabled on the virtual machine.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enabled: ::std::option::Option<bool>,
    #[serde(
        rename = "keyEncryptionKey",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub key_encryption_key: ::std::option::Option<KeyVaultKeyReference>,
}
impl ::std::convert::From<&DiskEncryptionSettings> for DiskEncryptionSettings {
    fn from(value: &DiskEncryptionSettings) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DiskEncryptionSettings {
    fn default() -> Self {
        Self {
            disk_encryption_key: Default::default(),
            enabled: Default::default(),
            key_encryption_key: Default::default(),
        }
    }
}
///The instance view of the disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of the disk.",
///  "type": "object",
///  "properties": {
///    "encryptionSettings": {
///      "description": "Specifies the encryption settings for the OS Disk. <br><br> Minimum api-version: 2015-06-15",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DiskEncryptionSettings"
///      },
///      "x-ms-identifiers": [
///        "diskEncryptionKey/sourceVault/id"
///      ]
///    },
///    "name": {
///      "description": "The disk name.",
///      "type": "string"
///    },
///    "statuses": {
///      "description": "The resource status information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DiskInstanceView {
    ///Specifies the encryption settings for the OS Disk. <br><br> Minimum api-version: 2015-06-15
    #[serde(
        rename = "encryptionSettings",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub encryption_settings: ::std::vec::Vec<DiskEncryptionSettings>,
    ///The disk name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
}
impl ::std::convert::From<&DiskInstanceView> for DiskInstanceView {
    fn from(value: &DiskInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DiskInstanceView {
    fn default() -> Self {
        Self {
            encryption_settings: Default::default(),
            name: Default::default(),
            statuses: Default::default(),
        }
    }
}
///Disk Restore Point details.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Disk Restore Point details.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResourceReadOnly"
///    }
///  ],
///  "properties": {
///    "encryption": {
///      "$ref": "#/components/schemas/RestorePointEncryption"
///    },
///    "sourceDiskRestorePoint": {
///      "$ref": "#/components/schemas/ApiEntityReference"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DiskRestorePointAttributes {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub encryption: ::std::option::Option<RestorePointEncryption>,
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "sourceDiskRestorePoint",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub source_disk_restore_point: ::std::option::Option<ApiEntityReference>,
}
impl ::std::convert::From<&DiskRestorePointAttributes> for DiskRestorePointAttributes {
    fn from(value: &DiskRestorePointAttributes) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DiskRestorePointAttributes {
    fn default() -> Self {
        Self {
            encryption: Default::default(),
            id: Default::default(),
            source_disk_restore_point: Default::default(),
        }
    }
}
///The instance view of a disk restore point.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a disk restore point.",
///  "type": "object",
///  "properties": {
///    "id": {
///      "description": "Disk restore point Id.",
///      "type": "string"
///    },
///    "replicationStatus": {
///      "$ref": "#/components/schemas/DiskRestorePointReplicationStatus"
///    },
///    "snapshotAccessState": {
///      "$ref": "#/components/schemas/SnapshotAccessState"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DiskRestorePointInstanceView {
    ///Disk restore point Id.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "replicationStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub replication_status: ::std::option::Option<DiskRestorePointReplicationStatus>,
    #[serde(
        rename = "snapshotAccessState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub snapshot_access_state: ::std::option::Option<SnapshotAccessState>,
}
impl ::std::convert::From<&DiskRestorePointInstanceView>
for DiskRestorePointInstanceView {
    fn from(value: &DiskRestorePointInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DiskRestorePointInstanceView {
    fn default() -> Self {
        Self {
            id: Default::default(),
            replication_status: Default::default(),
            snapshot_access_state: Default::default(),
        }
    }
}
///The instance view of a disk restore point.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a disk restore point.",
///  "type": "object",
///  "properties": {
///    "completionPercent": {
///      "description": "Replication completion percentage.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "status": {
///      "$ref": "#/components/schemas/InstanceViewStatus"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct DiskRestorePointReplicationStatus {
    ///Replication completion percentage.
    #[serde(
        rename = "completionPercent",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub completion_percent: ::std::option::Option<i32>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub status: ::std::option::Option<InstanceViewStatus>,
}
impl ::std::convert::From<&DiskRestorePointReplicationStatus>
for DiskRestorePointReplicationStatus {
    fn from(value: &DiskRestorePointReplicationStatus) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for DiskRestorePointReplicationStatus {
    fn default() -> Self {
        Self {
            completion_percent: Default::default(),
            status: Default::default(),
        }
    }
}
///The Domain name label scope.The concatenation of the hashed domain name label that generated according to the policy from domain name label scope and vm index will be the domain name labels of the PublicIPAddress resources that will be created
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The Domain name label scope.The concatenation of the hashed domain name label that generated according to the policy from domain name label scope and vm index will be the domain name labels of the PublicIPAddress resources that will be created",
///  "type": "string",
///  "enum": [
///    "TenantReuse",
///    "SubscriptionReuse",
///    "ResourceGroupReuse",
///    "NoReuse"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "DomainNameLabelScopeTypes",
///    "values": [
///      {
///        "name": "TenantReuse",
///        "value": "TenantReuse"
///      },
///      {
///        "name": "SubscriptionReuse",
///        "value": "SubscriptionReuse"
///      },
///      {
///        "name": "ResourceGroupReuse",
///        "value": "ResourceGroupReuse"
///      },
///      {
///        "name": "NoReuse",
///        "value": "NoReuse"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum DomainNameLabelScopeTypes {
    TenantReuse,
    SubscriptionReuse,
    ResourceGroupReuse,
    NoReuse,
}
impl ::std::convert::From<&Self> for DomainNameLabelScopeTypes {
    fn from(value: &DomainNameLabelScopeTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for DomainNameLabelScopeTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::TenantReuse => f.write_str("TenantReuse"),
            Self::SubscriptionReuse => f.write_str("SubscriptionReuse"),
            Self::ResourceGroupReuse => f.write_str("ResourceGroupReuse"),
            Self::NoReuse => f.write_str("NoReuse"),
        }
    }
}
impl ::std::str::FromStr for DomainNameLabelScopeTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "tenantreuse" => Ok(Self::TenantReuse),
            "subscriptionreuse" => Ok(Self::SubscriptionReuse),
            "resourcegroupreuse" => Ok(Self::ResourceGroupReuse),
            "noreuse" => Ok(Self::NoReuse),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for DomainNameLabelScopeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for DomainNameLabelScopeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for DomainNameLabelScopeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the Managed Identity used by ADE to get access token for keyvault operations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the Managed Identity used by ADE to get access token for keyvault operations.",
///  "type": "object",
///  "properties": {
///    "userAssignedIdentityResourceId": {
///      "description": "Specifies ARM Resource ID of one of the user identities associated with the VM.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct EncryptionIdentity {
    ///Specifies ARM Resource ID of one of the user identities associated with the VM.
    #[serde(
        rename = "userAssignedIdentityResourceId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub user_assigned_identity_resource_id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&EncryptionIdentity> for EncryptionIdentity {
    fn from(value: &EncryptionIdentity) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for EncryptionIdentity {
    fn default() -> Self {
        Self {
            user_assigned_identity_resource_id: Default::default(),
        }
    }
}
///Specifies eventGridAndResourceGraph related Scheduled Event related configurations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies eventGridAndResourceGraph related Scheduled Event related configurations.",
///  "type": "object",
///  "properties": {
///    "enable": {
///      "description": "Specifies if event grid and resource graph is enabled for Scheduled event related configurations.",
///      "type": "boolean"
///    },
///    "scheduledEventsApiVersion": {
///      "description": "Specifies the api-version to determine which Scheduled Events configuration schema version will be delivered.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct EventGridAndResourceGraph {
    ///Specifies if event grid and resource graph is enabled for Scheduled event related configurations.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable: ::std::option::Option<bool>,
    ///Specifies the api-version to determine which Scheduled Events configuration schema version will be delivered.
    #[serde(
        rename = "scheduledEventsApiVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scheduled_events_api_version: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&EventGridAndResourceGraph> for EventGridAndResourceGraph {
    fn from(value: &EventGridAndResourceGraph) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for EventGridAndResourceGraph {
    fn default() -> Self {
        Self {
            enable: Default::default(),
            scheduled_events_api_version: Default::default(),
        }
    }
}
///Script execution status.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Script execution status.",
///  "type": "string",
///  "enum": [
///    "Unknown",
///    "Pending",
///    "Running",
///    "Failed",
///    "Succeeded",
///    "TimedOut",
///    "Canceled"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ExecutionState",
///    "values": [
///      {
///        "name": "Unknown",
///        "value": "Unknown"
///      },
///      {
///        "name": "Pending",
///        "value": "Pending"
///      },
///      {
///        "name": "Running",
///        "value": "Running"
///      },
///      {
///        "name": "Failed",
///        "value": "Failed"
///      },
///      {
///        "name": "Succeeded",
///        "value": "Succeeded"
///      },
///      {
///        "name": "TimedOut",
///        "value": "TimedOut"
///      },
///      {
///        "name": "Canceled",
///        "value": "Canceled"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ExecutionState {
    Unknown,
    Pending,
    Running,
    Failed,
    Succeeded,
    TimedOut,
    Canceled,
}
impl ::std::convert::From<&Self> for ExecutionState {
    fn from(value: &ExecutionState) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ExecutionState {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Unknown => f.write_str("Unknown"),
            Self::Pending => f.write_str("Pending"),
            Self::Running => f.write_str("Running"),
            Self::Failed => f.write_str("Failed"),
            Self::Succeeded => f.write_str("Succeeded"),
            Self::TimedOut => f.write_str("TimedOut"),
            Self::Canceled => f.write_str("Canceled"),
        }
    }
}
impl ::std::str::FromStr for ExecutionState {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "unknown" => Ok(Self::Unknown),
            "pending" => Ok(Self::Pending),
            "running" => Ok(Self::Running),
            "failed" => Ok(Self::Failed),
            "succeeded" => Ok(Self::Succeeded),
            "timedout" => Ok(Self::TimedOut),
            "canceled" => Ok(Self::Canceled),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ExecutionState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ExecutionState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ExecutionState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///`ExpandTypeForListVMs`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "instanceView"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ExpandTypeForListVMs",
///    "values": [
///      {
///        "name": "instanceView",
///        "value": "instanceView"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ExpandTypeForListVMs {
    #[serde(rename = "instanceView")]
    InstanceView,
}
impl ::std::convert::From<&Self> for ExpandTypeForListVMs {
    fn from(value: &ExpandTypeForListVMs) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ExpandTypeForListVMs {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::InstanceView => f.write_str("instanceView"),
        }
    }
}
impl ::std::str::FromStr for ExpandTypeForListVMs {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "instanceview" => Ok(Self::InstanceView),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ExpandTypeForListVMs {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ExpandTypeForListVMs {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ExpandTypeForListVMs {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///`ExpandTypesForGetCapacityReservationGroups`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "virtualMachineScaleSetVMs/$ref",
///    "virtualMachines/$ref"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ExpandTypesForGetCapacityReservationGroups",
///    "values": [
///      {
///        "name": "virtualMachineScaleSetVMs/$ref",
///        "value": "virtualMachineScaleSetVMs/$ref"
///      },
///      {
///        "name": "virtualMachines/$ref",
///        "value": "virtualMachines/$ref"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ExpandTypesForGetCapacityReservationGroups {
    #[serde(rename = "virtualMachineScaleSetVMs/$ref")]
    VirtualMachineScaleSetVMsRef,
    #[serde(rename = "virtualMachines/$ref")]
    VirtualMachinesRef,
}
impl ::std::convert::From<&Self> for ExpandTypesForGetCapacityReservationGroups {
    fn from(value: &ExpandTypesForGetCapacityReservationGroups) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ExpandTypesForGetCapacityReservationGroups {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::VirtualMachineScaleSetVMsRef => {
                f.write_str("virtualMachineScaleSetVMs/$ref")
            }
            Self::VirtualMachinesRef => f.write_str("virtualMachines/$ref"),
        }
    }
}
impl ::std::str::FromStr for ExpandTypesForGetCapacityReservationGroups {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "virtualmachinescalesetvms/$ref" => Ok(Self::VirtualMachineScaleSetVMsRef),
            "virtualmachines/$ref" => Ok(Self::VirtualMachinesRef),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ExpandTypesForGetCapacityReservationGroups {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for ExpandTypesForGetCapacityReservationGroups {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for ExpandTypesForGetCapacityReservationGroups {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///`ExpandTypesForGetVmScaleSets`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "userData"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ExpandTypesForGetVMScaleSets",
///    "values": [
///      {
///        "name": "userData",
///        "value": "userData"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ExpandTypesForGetVmScaleSets {
    #[serde(rename = "userData")]
    UserData,
}
impl ::std::convert::From<&Self> for ExpandTypesForGetVmScaleSets {
    fn from(value: &ExpandTypesForGetVmScaleSets) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ExpandTypesForGetVmScaleSets {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::UserData => f.write_str("userData"),
        }
    }
}
impl ::std::str::FromStr for ExpandTypesForGetVmScaleSets {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "userdata" => Ok(Self::UserData),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ExpandTypesForGetVmScaleSets {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ExpandTypesForGetVmScaleSets {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ExpandTypesForGetVmScaleSets {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///`ExpandTypesForListVMs`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "instanceView"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ExpandTypesForListVMs",
///    "values": [
///      {
///        "name": "instanceView",
///        "value": "instanceView"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ExpandTypesForListVMs {
    #[serde(rename = "instanceView")]
    InstanceView,
}
impl ::std::convert::From<&Self> for ExpandTypesForListVMs {
    fn from(value: &ExpandTypesForListVMs) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ExpandTypesForListVMs {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::InstanceView => f.write_str("instanceView"),
        }
    }
}
impl ::std::str::FromStr for ExpandTypesForListVMs {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "instanceview" => Ok(Self::InstanceView),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ExpandTypesForListVMs {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ExpandTypesForListVMs {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ExpandTypesForListVMs {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The complex type of the extended location.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The complex type of the extended location.",
///  "type": "object",
///  "properties": {
///    "name": {
///      "description": "The name of the extended location.",
///      "type": "string"
///    },
///    "type": {
///      "$ref": "#/components/schemas/ExtendedLocationType"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ExtendedLocation {
    ///The name of the extended location.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<ExtendedLocationType>,
}
impl ::std::convert::From<&ExtendedLocation> for ExtendedLocation {
    fn from(value: &ExtendedLocation) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ExtendedLocation {
    fn default() -> Self {
        Self {
            name: Default::default(),
            type_: Default::default(),
        }
    }
}
///The type of extendedLocation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The type of extendedLocation.",
///  "type": "string",
///  "enum": [
///    "EdgeZone"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ExtendedLocationTypes"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ExtendedLocationType {
    EdgeZone,
}
impl ::std::convert::From<&Self> for ExtendedLocationType {
    fn from(value: &ExtendedLocationType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ExtendedLocationType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::EdgeZone => f.write_str("EdgeZone"),
        }
    }
}
impl ::std::str::FromStr for ExtendedLocationType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "edgezone" => Ok(Self::EdgeZone),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ExtendedLocationType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ExtendedLocationType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ExtendedLocationType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the hardware settings for the virtual machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the hardware settings for the virtual machine.",
///  "type": "object",
///  "properties": {
///    "vmSize": {
///      "$ref": "#/components/schemas/VirtualMachineSizeTypes"
///    },
///    "vmSizeProperties": {
///      "$ref": "#/components/schemas/VMSizeProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct HardwareProfile {
    #[serde(
        rename = "vmSize",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_size: ::std::option::Option<VirtualMachineSizeTypes>,
    #[serde(
        rename = "vmSizeProperties",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_size_properties: ::std::option::Option<VmSizeProperties>,
}
impl ::std::convert::From<&HardwareProfile> for HardwareProfile {
    fn from(value: &HardwareProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for HardwareProfile {
    fn default() -> Self {
        Self {
            vm_size: Default::default(),
            vm_size_properties: Default::default(),
        }
    }
}
///Specifies the high speed interconnect placement for the virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the high speed interconnect placement for the virtual machine scale set.",
///  "type": "string",
///  "enum": [
///    "None",
///    "Trunk"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "HighSpeedInterconnectPlacement",
///    "values": [
///      {
///        "description": "No high speed interconnect placement",
///        "name": "None",
///        "value": "None"
///      },
///      {
///        "description": "Trunk high speed interconnect placement",
///        "name": "Trunk",
///        "value": "Trunk"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum HighSpeedInterconnectPlacement {
    None,
    Trunk,
}
impl ::std::convert::From<&Self> for HighSpeedInterconnectPlacement {
    fn from(value: &HighSpeedInterconnectPlacement) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for HighSpeedInterconnectPlacement {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::None => f.write_str("None"),
            Self::Trunk => f.write_str("Trunk"),
        }
    }
}
impl ::std::str::FromStr for HighSpeedInterconnectPlacement {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "none" => Ok(Self::None),
            "trunk" => Ok(Self::Trunk),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for HighSpeedInterconnectPlacement {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for HighSpeedInterconnectPlacement {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for HighSpeedInterconnectPlacement {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies particular host endpoint settings.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies particular host endpoint settings.",
///  "type": "object",
///  "properties": {
///    "inVMAccessControlProfileReferenceId": {
///      "description": "Specifies the InVMAccessControlProfileVersion resource id in the format of /subscriptions/{SubscriptionId}/resourceGroups/{ResourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/inVMAccessControlProfiles/{profile}/versions/{version}",
///      "type": "string"
///    },
///    "mode": {
///      "$ref": "#/components/schemas/Modes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct HostEndpointSettings {
    ///Specifies the InVMAccessControlProfileVersion resource id in the format of /subscriptions/{SubscriptionId}/resourceGroups/{ResourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/inVMAccessControlProfiles/{profile}/versions/{version}
    #[serde(
        rename = "inVMAccessControlProfileReferenceId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub in_vm_access_control_profile_reference_id: ::std::option::Option<
        ::std::string::String,
    >,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub mode: ::std::option::Option<Modes>,
}
impl ::std::convert::From<&HostEndpointSettings> for HostEndpointSettings {
    fn from(value: &HostEndpointSettings) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for HostEndpointSettings {
    fn default() -> Self {
        Self {
            in_vm_access_control_profile_reference_id: Default::default(),
            mode: Default::default(),
        }
    }
}
///The hypervisor generation of the Virtual Machine [V1, V2]
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The hypervisor generation of the Virtual Machine [V1, V2]",
///  "type": "string",
///  "enum": [
///    "V1",
///    "V2"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "HyperVGeneration",
///    "values": [
///      {
///        "name": "V1",
///        "value": "V1"
///      },
///      {
///        "name": "V2",
///        "value": "V2"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum HyperVGeneration {
    V1,
    V2,
}
impl ::std::convert::From<&Self> for HyperVGeneration {
    fn from(value: &HyperVGeneration) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for HyperVGeneration {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::V1 => f.write_str("V1"),
            Self::V2 => f.write_str("V2"),
        }
    }
}
impl ::std::str::FromStr for HyperVGeneration {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "v1" => Ok(Self::V1),
            "v2" => Ok(Self::V2),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for HyperVGeneration {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for HyperVGeneration {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for HyperVGeneration {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the HyperVGeneration Type associated with a resource
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the HyperVGeneration Type associated with a resource",
///  "type": "string",
///  "enum": [
///    "V1",
///    "V2"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "HyperVGenerationType",
///    "values": [
///      {
///        "name": "V1",
///        "value": "V1"
///      },
///      {
///        "name": "V2",
///        "value": "V2"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum HyperVGenerationType {
    V1,
    V2,
}
impl ::std::convert::From<&Self> for HyperVGenerationType {
    fn from(value: &HyperVGenerationType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for HyperVGenerationType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::V1 => f.write_str("V1"),
            Self::V2 => f.write_str("V2"),
        }
    }
}
impl ::std::str::FromStr for HyperVGenerationType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "v1" => Ok(Self::V1),
            "v2" => Ok(Self::V2),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for HyperVGenerationType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for HyperVGenerationType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for HyperVGenerationType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the HyperVGeneration Type
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the HyperVGeneration Type",
///  "type": "string",
///  "enum": [
///    "V1",
///    "V2"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "HyperVGenerationTypes",
///    "values": [
///      {
///        "name": "V1",
///        "value": "V1"
///      },
///      {
///        "name": "V2",
///        "value": "V2"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum HyperVGenerationTypes {
    V1,
    V2,
}
impl ::std::convert::From<&Self> for HyperVGenerationTypes {
    fn from(value: &HyperVGenerationTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for HyperVGenerationTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::V1 => f.write_str("V1"),
            Self::V2 => f.write_str("V2"),
        }
    }
}
impl ::std::str::FromStr for HyperVGenerationTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "v1" => Ok(Self::V1),
            "v2" => Ok(Self::V2),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for HyperVGenerationTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for HyperVGenerationTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for HyperVGenerationTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The source user image virtual hard disk. The virtual hard disk will be copied before being attached to the virtual machine. If SourceImage is provided, the destination virtual hard drive must not exist.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The source user image virtual hard disk. The virtual hard disk will be copied before being attached to the virtual machine. If SourceImage is provided, the destination virtual hard drive must not exist.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "extendedLocation": {
///      "$ref": "#/components/schemas/ExtendedLocation"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/ImageProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct Image {
    #[serde(
        rename = "extendedLocation",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extended_location: ::std::option::Option<ExtendedLocation>,
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<ImageProperties>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&Image> for Image {
    fn from(value: &Image) -> Self {
        value.clone()
    }
}
///Describes a data disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a data disk.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/ImageDisk"
///    }
///  ],
///  "required": [
///    "lun"
///  ],
///  "properties": {
///    "lun": {
///      "description": "Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.",
///      "type": "integer",
///      "format": "int32"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ImageDataDisk {
    ///The Virtual Hard Disk.
    #[serde(
        rename = "blobUri",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub blob_uri: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub caching: ::std::option::Option<CachingTypes>,
    #[serde(
        rename = "diskEncryptionSet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_encryption_set: ::std::option::Option<DiskEncryptionSetParameters>,
    ///Specifies the size of empty data disks in gigabytes. This element can be used to overwrite the name of the disk in a virtual machine image. This value cannot be larger than 1023 GB.
    #[serde(
        rename = "diskSizeGB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_size_gb: ::std::option::Option<i32>,
    ///Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.
    pub lun: i32,
    #[serde(
        rename = "managedDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub managed_disk: ::std::option::Option<SubResource>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub snapshot: ::std::option::Option<SubResource>,
    #[serde(
        rename = "storageAccountType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_account_type: ::std::option::Option<StorageAccountTypes>,
}
impl ::std::convert::From<&ImageDataDisk> for ImageDataDisk {
    fn from(value: &ImageDataDisk) -> Self {
        value.clone()
    }
}
///Describes image deprecation status properties on the image.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes image deprecation status properties on the image.",
///  "type": "object",
///  "properties": {
///    "alternativeOption": {
///      "$ref": "#/components/schemas/AlternativeOption"
///    },
///    "imageState": {
///      "$ref": "#/components/schemas/ImageState"
///    },
///    "scheduledDeprecationTime": {
///      "description": "The time, in future, at which this image will be marked as deprecated. This scheduled time is chosen by the Publisher.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ImageDeprecationStatus {
    #[serde(
        rename = "alternativeOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub alternative_option: ::std::option::Option<AlternativeOption>,
    #[serde(
        rename = "imageState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub image_state: ::std::option::Option<ImageState>,
    ///The time, in future, at which this image will be marked as deprecated. This scheduled time is chosen by the Publisher.
    #[serde(
        rename = "scheduledDeprecationTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scheduled_deprecation_time: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&ImageDeprecationStatus> for ImageDeprecationStatus {
    fn from(value: &ImageDeprecationStatus) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ImageDeprecationStatus {
    fn default() -> Self {
        Self {
            alternative_option: Default::default(),
            image_state: Default::default(),
            scheduled_deprecation_time: Default::default(),
        }
    }
}
///Describes a image disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a image disk.",
///  "type": "object",
///  "properties": {
///    "blobUri": {
///      "description": "The Virtual Hard Disk.",
///      "type": "string"
///    },
///    "caching": {
///      "$ref": "#/components/schemas/CachingTypes"
///    },
///    "diskEncryptionSet": {
///      "$ref": "#/components/schemas/DiskEncryptionSetParameters"
///    },
///    "diskSizeGB": {
///      "description": "Specifies the size of empty data disks in gigabytes. This element can be used to overwrite the name of the disk in a virtual machine image. This value cannot be larger than 1023 GB.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "managedDisk": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "snapshot": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "storageAccountType": {
///      "$ref": "#/components/schemas/StorageAccountTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ImageDisk {
    ///The Virtual Hard Disk.
    #[serde(
        rename = "blobUri",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub blob_uri: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub caching: ::std::option::Option<CachingTypes>,
    #[serde(
        rename = "diskEncryptionSet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_encryption_set: ::std::option::Option<DiskEncryptionSetParameters>,
    ///Specifies the size of empty data disks in gigabytes. This element can be used to overwrite the name of the disk in a virtual machine image. This value cannot be larger than 1023 GB.
    #[serde(
        rename = "diskSizeGB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_size_gb: ::std::option::Option<i32>,
    #[serde(
        rename = "managedDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub managed_disk: ::std::option::Option<SubResource>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub snapshot: ::std::option::Option<SubResource>,
    #[serde(
        rename = "storageAccountType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_account_type: ::std::option::Option<StorageAccountTypes>,
}
impl ::std::convert::From<&ImageDisk> for ImageDisk {
    fn from(value: &ImageDisk) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ImageDisk {
    fn default() -> Self {
        Self {
            blob_uri: Default::default(),
            caching: Default::default(),
            disk_encryption_set: Default::default(),
            disk_size_gb: Default::default(),
            managed_disk: Default::default(),
            snapshot: Default::default(),
            storage_account_type: Default::default(),
        }
    }
}
///The List Image operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Image operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The uri to fetch the next page of Images. Call ListNext() with this to fetch the next page of Images.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of Images",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/Image"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ImageListResult {
    ///The uri to fetch the next page of Images. Call ListNext() with this to fetch the next page of Images.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of Images
    pub value: ::std::vec::Vec<Image>,
}
impl ::std::convert::From<&ImageListResult> for ImageListResult {
    fn from(value: &ImageListResult) -> Self {
        value.clone()
    }
}
///Describes an Operating System disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes an Operating System disk.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/ImageDisk"
///    }
///  ],
///  "required": [
///    "osState",
///    "osType"
///  ],
///  "properties": {
///    "osState": {
///      "$ref": "#/components/schemas/OperatingSystemStateTypes"
///    },
///    "osType": {
///      "$ref": "#/components/schemas/OperatingSystemTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ImageOsDisk {
    ///The Virtual Hard Disk.
    #[serde(
        rename = "blobUri",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub blob_uri: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub caching: ::std::option::Option<CachingTypes>,
    #[serde(
        rename = "diskEncryptionSet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_encryption_set: ::std::option::Option<DiskEncryptionSetParameters>,
    ///Specifies the size of empty data disks in gigabytes. This element can be used to overwrite the name of the disk in a virtual machine image. This value cannot be larger than 1023 GB.
    #[serde(
        rename = "diskSizeGB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_size_gb: ::std::option::Option<i32>,
    #[serde(
        rename = "managedDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub managed_disk: ::std::option::Option<SubResource>,
    #[serde(rename = "osState")]
    pub os_state: OperatingSystemStateTypes,
    #[serde(rename = "osType")]
    pub os_type: OperatingSystemTypes,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub snapshot: ::std::option::Option<SubResource>,
    #[serde(
        rename = "storageAccountType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_account_type: ::std::option::Option<StorageAccountTypes>,
}
impl ::std::convert::From<&ImageOsDisk> for ImageOsDisk {
    fn from(value: &ImageOsDisk) -> Self {
        value.clone()
    }
}
///Describes the properties of an Image.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of an Image.",
///  "type": "object",
///  "properties": {
///    "hyperVGeneration": {
///      "$ref": "#/components/schemas/HyperVGenerationTypes"
///    },
///    "provisioningState": {
///      "description": "The provisioning state.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "sourceVirtualMachine": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "storageProfile": {
///      "$ref": "#/components/schemas/ImageStorageProfile"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ImageProperties {
    #[serde(
        rename = "hyperVGeneration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hyper_v_generation: ::std::option::Option<HyperVGenerationTypes>,
    ///The provisioning state.
    #[serde(
        rename = "provisioningState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_state: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "sourceVirtualMachine",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub source_virtual_machine: ::std::option::Option<SubResource>,
    #[serde(
        rename = "storageProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_profile: ::std::option::Option<ImageStorageProfile>,
}
impl ::std::convert::From<&ImageProperties> for ImageProperties {
    fn from(value: &ImageProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ImageProperties {
    fn default() -> Self {
        Self {
            hyper_v_generation: Default::default(),
            provisioning_state: Default::default(),
            source_virtual_machine: Default::default(),
            storage_profile: Default::default(),
        }
    }
}
///Specifies information about the image to use. You can specify information about platform images, marketplace images, or virtual machine images. This element is required when you want to use a platform image, marketplace image, or virtual machine image, but is not used in other creation operations. NOTE: Image reference publisher and offer can only be set when you create the scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the image to use. You can specify information about platform images, marketplace images, or virtual machine images. This element is required when you want to use a platform image, marketplace image, or virtual machine image, but is not used in other creation operations. NOTE: Image reference publisher and offer can only be set when you create the scale set.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  ],
///  "properties": {
///    "communityGalleryImageId": {
///      "description": "Specified the community gallery image unique id for vm deployment. This can be fetched from community gallery image GET call.",
///      "type": "string"
///    },
///    "exactVersion": {
///      "description": "Specifies in decimal numbers, the version of platform image or marketplace image used to create the virtual machine. This readonly field differs from 'version', only if the value specified in 'version' field is 'latest'.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "offer": {
///      "description": "Specifies the offer of the platform image or marketplace image used to create the virtual machine.",
///      "type": "string"
///    },
///    "publisher": {
///      "description": "The image publisher.",
///      "type": "string"
///    },
///    "sharedGalleryImageId": {
///      "description": "Specified the shared gallery image unique id for vm deployment. This can be fetched from shared gallery image GET call.",
///      "type": "string"
///    },
///    "sku": {
///      "description": "The image SKU.",
///      "type": "string"
///    },
///    "version": {
///      "description": "Specifies the version of the platform image or marketplace image used to create the virtual machine. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. Please do not use field 'version' for gallery image deployment, gallery image should always use 'id' field for deployment, to use 'latest' version of gallery image, just set '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}' in the 'id' field without version input.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ImageReference {
    ///Specified the community gallery image unique id for vm deployment. This can be fetched from community gallery image GET call.
    #[serde(
        rename = "communityGalleryImageId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub community_gallery_image_id: ::std::option::Option<::std::string::String>,
    ///Specifies in decimal numbers, the version of platform image or marketplace image used to create the virtual machine. This readonly field differs from 'version', only if the value specified in 'version' field is 'latest'.
    #[serde(
        rename = "exactVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub exact_version: ::std::option::Option<::std::string::String>,
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///Specifies the offer of the platform image or marketplace image used to create the virtual machine.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub offer: ::std::option::Option<::std::string::String>,
    ///The image publisher.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub publisher: ::std::option::Option<::std::string::String>,
    ///Specified the shared gallery image unique id for vm deployment. This can be fetched from shared gallery image GET call.
    #[serde(
        rename = "sharedGalleryImageId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub shared_gallery_image_id: ::std::option::Option<::std::string::String>,
    ///The image SKU.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku: ::std::option::Option<::std::string::String>,
    ///Specifies the version of the platform image or marketplace image used to create the virtual machine. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. Please do not use field 'version' for gallery image deployment, gallery image should always use 'id' field for deployment, to use 'latest' version of gallery image, just set '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}' in the 'id' field without version input.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub version: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&ImageReference> for ImageReference {
    fn from(value: &ImageReference) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ImageReference {
    fn default() -> Self {
        Self {
            community_gallery_image_id: Default::default(),
            exact_version: Default::default(),
            id: Default::default(),
            offer: Default::default(),
            publisher: Default::default(),
            shared_gallery_image_id: Default::default(),
            sku: Default::default(),
            version: Default::default(),
        }
    }
}
///Describes the state of the image.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the state of the image.",
///  "type": "string",
///  "enum": [
///    "Active",
///    "ScheduledForDeprecation",
///    "Deprecated"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ImageState",
///    "values": [
///      {
///        "name": "Active",
///        "value": "Active"
///      },
///      {
///        "name": "ScheduledForDeprecation",
///        "value": "ScheduledForDeprecation"
///      },
///      {
///        "name": "Deprecated",
///        "value": "Deprecated"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ImageState {
    Active,
    ScheduledForDeprecation,
    Deprecated,
}
impl ::std::convert::From<&Self> for ImageState {
    fn from(value: &ImageState) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ImageState {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Active => f.write_str("Active"),
            Self::ScheduledForDeprecation => f.write_str("ScheduledForDeprecation"),
            Self::Deprecated => f.write_str("Deprecated"),
        }
    }
}
impl ::std::str::FromStr for ImageState {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "active" => Ok(Self::Active),
            "scheduledfordeprecation" => Ok(Self::ScheduledForDeprecation),
            "deprecated" => Ok(Self::Deprecated),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ImageState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ImageState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ImageState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes a storage profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a storage profile.",
///  "type": "object",
///  "properties": {
///    "dataDisks": {
///      "description": "Specifies the parameters that are used to add a data disk to a virtual machine. <br><br> For more information about disks, see [About disks and VHDs for Azure virtual machines](https://docs.microsoft.com/azure/virtual-machines/managed-disks-overview).",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/ImageDataDisk"
///      },
///      "x-ms-identifiers": [
///        "lun"
///      ]
///    },
///    "osDisk": {
///      "$ref": "#/components/schemas/ImageOSDisk"
///    },
///    "zoneResilient": {
///      "description": "Specifies whether an image is zone resilient or not. Default is false. Zone resilient images can be created only in regions that provide Zone Redundant Storage (ZRS).",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ImageStorageProfile {
    ///Specifies the parameters that are used to add a data disk to a virtual machine. <br><br> For more information about disks, see [About disks and VHDs for Azure virtual machines](https://docs.microsoft.com/azure/virtual-machines/managed-disks-overview).
    #[serde(
        rename = "dataDisks",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub data_disks: ::std::vec::Vec<ImageDataDisk>,
    #[serde(
        rename = "osDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_disk: ::std::option::Option<ImageOsDisk>,
    ///Specifies whether an image is zone resilient or not. Default is false. Zone resilient images can be created only in regions that provide Zone Redundant Storage (ZRS).
    #[serde(
        rename = "zoneResilient",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zone_resilient: ::std::option::Option<bool>,
}
impl ::std::convert::From<&ImageStorageProfile> for ImageStorageProfile {
    fn from(value: &ImageStorageProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ImageStorageProfile {
    fn default() -> Self {
        Self {
            data_disks: Default::default(),
            os_disk: Default::default(),
            zone_resilient: Default::default(),
        }
    }
}
///The source user image virtual hard disk. Only tags may be updated.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The source user image virtual hard disk. Only tags may be updated.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/ImageProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ImageUpdate {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<ImageProperties>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&ImageUpdate> for ImageUpdate {
    fn from(value: &ImageUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ImageUpdate {
    fn default() -> Self {
        Self {
            properties: Default::default(),
            tags: Default::default(),
        }
    }
}
///Inner error details.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Inner error details.",
///  "type": "object",
///  "properties": {
///    "errordetail": {
///      "description": "The internal error message or exception dump.",
///      "type": "string"
///    },
///    "exceptiontype": {
///      "description": "The exception type.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct InnerError {
    ///The internal error message or exception dump.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub errordetail: ::std::option::Option<::std::string::String>,
    ///The exception type.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub exceptiontype: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&InnerError> for InnerError {
    fn from(value: &InnerError) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for InnerError {
    fn default() -> Self {
        Self {
            errordetail: Default::default(),
            exceptiontype: Default::default(),
        }
    }
}
///Instance view status.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Instance view status.",
///  "type": "object",
///  "properties": {
///    "code": {
///      "description": "The status code.",
///      "type": "string"
///    },
///    "displayStatus": {
///      "description": "The short localizable label for the status.",
///      "type": "string"
///    },
///    "level": {
///      "$ref": "#/components/schemas/StatusLevelTypes"
///    },
///    "message": {
///      "description": "The detailed status message, including for alerts and error messages.",
///      "type": "string"
///    },
///    "time": {
///      "description": "The time of the status.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct InstanceViewStatus {
    ///The status code.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub code: ::std::option::Option<::std::string::String>,
    ///The short localizable label for the status.
    #[serde(
        rename = "displayStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub display_status: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub level: ::std::option::Option<StatusLevelTypes>,
    ///The detailed status message, including for alerts and error messages.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub message: ::std::option::Option<::std::string::String>,
    ///The time of the status.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub time: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&InstanceViewStatus> for InstanceViewStatus {
    fn from(value: &InstanceViewStatus) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for InstanceViewStatus {
    fn default() -> Self {
        Self {
            code: Default::default(),
            display_status: Default::default(),
            level: Default::default(),
            message: Default::default(),
            time: Default::default(),
        }
    }
}
///`InstanceViewTypes`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "instanceView",
///    "userData",
///    "resiliencyView"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "InstanceViewTypes"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum InstanceViewTypes {
    #[serde(rename = "instanceView")]
    InstanceView,
    #[serde(rename = "userData")]
    UserData,
    #[serde(rename = "resiliencyView")]
    ResiliencyView,
}
impl ::std::convert::From<&Self> for InstanceViewTypes {
    fn from(value: &InstanceViewTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for InstanceViewTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::InstanceView => f.write_str("instanceView"),
            Self::UserData => f.write_str("userData"),
            Self::ResiliencyView => f.write_str("resiliencyView"),
        }
    }
}
impl ::std::str::FromStr for InstanceViewTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "instanceview" => Ok(Self::InstanceView),
            "userdata" => Ok(Self::UserData),
            "resiliencyview" => Ok(Self::ResiliencyView),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for InstanceViewTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for InstanceViewTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for InstanceViewTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Interval value in minutes used to create LogAnalytics call rate logs.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Interval value in minutes used to create LogAnalytics call rate logs.",
///  "type": "string",
///  "enum": [
///    "ThreeMins",
///    "FiveMins",
///    "ThirtyMins",
///    "SixtyMins"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "IntervalInMins"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum IntervalInMins {
    ThreeMins,
    FiveMins,
    ThirtyMins,
    SixtyMins,
}
impl ::std::convert::From<&Self> for IntervalInMins {
    fn from(value: &IntervalInMins) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for IntervalInMins {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::ThreeMins => f.write_str("ThreeMins"),
            Self::FiveMins => f.write_str("FiveMins"),
            Self::ThirtyMins => f.write_str("ThirtyMins"),
            Self::SixtyMins => f.write_str("SixtyMins"),
        }
    }
}
impl ::std::str::FromStr for IntervalInMins {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "threemins" => Ok(Self::ThreeMins),
            "fivemins" => Ok(Self::FiveMins),
            "thirtymins" => Ok(Self::ThirtyMins),
            "sixtymins" => Ok(Self::SixtyMins),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for IntervalInMins {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for IntervalInMins {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for IntervalInMins {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Available from Api-Version 2017-03-30 onwards, it represents whether the specific ipconfiguration is IPv4 or IPv6. Default is taken as IPv4.  Possible values are: 'IPv4' and 'IPv6'.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Available from Api-Version 2017-03-30 onwards, it represents whether the specific ipconfiguration is IPv4 or IPv6. Default is taken as IPv4.  Possible values are: 'IPv4' and 'IPv6'.",
///  "type": "string",
///  "enum": [
///    "IPv4",
///    "IPv6"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "IPVersion",
///    "values": [
///      {
///        "name": "IPv4",
///        "value": "IPv4"
///      },
///      {
///        "name": "IPv6",
///        "value": "IPv6"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum IpVersion {
    IPv4,
    IPv6,
}
impl ::std::convert::From<&Self> for IpVersion {
    fn from(value: &IpVersion) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for IpVersion {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::IPv4 => f.write_str("IPv4"),
            Self::IPv6 => f.write_str("IPv6"),
        }
    }
}
impl ::std::str::FromStr for IpVersion {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "ipv4" => Ok(Self::IPv4),
            "ipv6" => Ok(Self::IPv6),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for IpVersion {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for IpVersion {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for IpVersion {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Available from Api-Version 2017-03-30 onwards, it represents whether the specific ipconfiguration is IPv4 or IPv6. Default is taken as IPv4.  Possible values are: 'IPv4' and 'IPv6'.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Available from Api-Version 2017-03-30 onwards, it represents whether the specific ipconfiguration is IPv4 or IPv6. Default is taken as IPv4.  Possible values are: 'IPv4' and 'IPv6'.",
///  "type": "string",
///  "enum": [
///    "IPv4",
///    "IPv6"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "IPVersions",
///    "values": [
///      {
///        "name": "IPv4",
///        "value": "IPv4"
///      },
///      {
///        "name": "IPv6",
///        "value": "IPv6"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum IpVersions {
    IPv4,
    IPv6,
}
impl ::std::convert::From<&Self> for IpVersions {
    fn from(value: &IpVersions) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for IpVersions {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::IPv4 => f.write_str("IPv4"),
            Self::IPv6 => f.write_str("IPv6"),
        }
    }
}
impl ::std::str::FromStr for IpVersions {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "ipv4" => Ok(Self::IPv4),
            "ipv6" => Ok(Self::IPv6),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for IpVersions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for IpVersions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for IpVersions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes a reference to Key Vault Key
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a reference to Key Vault Key",
///  "type": "object",
///  "required": [
///    "keyUrl",
///    "sourceVault"
///  ],
///  "properties": {
///    "keyUrl": {
///      "description": "The URL referencing a key encryption key in Key Vault.",
///      "type": "string"
///    },
///    "sourceVault": {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct KeyVaultKeyReference {
    ///The URL referencing a key encryption key in Key Vault.
    #[serde(rename = "keyUrl")]
    pub key_url: ::std::string::String,
    #[serde(rename = "sourceVault")]
    pub source_vault: SubResource,
}
impl ::std::convert::From<&KeyVaultKeyReference> for KeyVaultKeyReference {
    fn from(value: &KeyVaultKeyReference) -> Self {
        value.clone()
    }
}
///Describes a reference to Key Vault Secret
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a reference to Key Vault Secret",
///  "type": "object",
///  "required": [
///    "secretUrl",
///    "sourceVault"
///  ],
///  "properties": {
///    "secretUrl": {
///      "description": "The URL referencing a secret in a Key Vault.",
///      "type": "string"
///    },
///    "sourceVault": {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct KeyVaultSecretReference {
    ///The URL referencing a secret in a Key Vault.
    #[serde(rename = "secretUrl")]
    pub secret_url: ::std::string::String,
    #[serde(rename = "sourceVault")]
    pub source_vault: SubResource,
}
impl ::std::convert::From<&KeyVaultSecretReference> for KeyVaultSecretReference {
    fn from(value: &KeyVaultSecretReference) -> Self {
        value.clone()
    }
}
///Describes the properties of the last installed patch summary.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of the last installed patch summary.",
///  "type": "object",
///  "properties": {
///    "error": {
///      "$ref": "#/components/schemas/ApiError"
///    },
///    "excludedPatchCount": {
///      "description": "The number of all available patches but excluded explicitly by a customer-specified exclusion list match.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "failedPatchCount": {
///      "description": "The count of patches that failed installation.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "installationActivityId": {
///      "description": "The activity ID of the operation that produced this result. It is used to correlate across CRP and extension logs.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "installedPatchCount": {
///      "description": "The count of patches that successfully installed.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "lastModifiedTime": {
///      "description": "The UTC timestamp when the operation began.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "maintenanceWindowExceeded": {
///      "description": "Describes whether the operation ran out of time before it completed all its intended actions",
///      "readOnly": true,
///      "type": "boolean"
///    },
///    "notSelectedPatchCount": {
///      "description": "The number of all available patches but not going to be installed because it didn't match a classification or inclusion list entry.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "pendingPatchCount": {
///      "description": "The number of all available patches expected to be installed over the course of the patch installation operation.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "startTime": {
///      "description": "The UTC timestamp when the operation began.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "status": {
///      "$ref": "#/components/schemas/PatchOperationStatus"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct LastPatchInstallationSummary {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub error: ::std::option::Option<ApiError>,
    ///The number of all available patches but excluded explicitly by a customer-specified exclusion list match.
    #[serde(
        rename = "excludedPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub excluded_patch_count: ::std::option::Option<i32>,
    ///The count of patches that failed installation.
    #[serde(
        rename = "failedPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub failed_patch_count: ::std::option::Option<i32>,
    ///The activity ID of the operation that produced this result. It is used to correlate across CRP and extension logs.
    #[serde(
        rename = "installationActivityId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub installation_activity_id: ::std::option::Option<::std::string::String>,
    ///The count of patches that successfully installed.
    #[serde(
        rename = "installedPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub installed_patch_count: ::std::option::Option<i32>,
    ///The UTC timestamp when the operation began.
    #[serde(
        rename = "lastModifiedTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_modified_time: ::std::option::Option<::std::string::String>,
    ///Describes whether the operation ran out of time before it completed all its intended actions
    #[serde(
        rename = "maintenanceWindowExceeded",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub maintenance_window_exceeded: ::std::option::Option<bool>,
    ///The number of all available patches but not going to be installed because it didn't match a classification or inclusion list entry.
    #[serde(
        rename = "notSelectedPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub not_selected_patch_count: ::std::option::Option<i32>,
    ///The number of all available patches expected to be installed over the course of the patch installation operation.
    #[serde(
        rename = "pendingPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub pending_patch_count: ::std::option::Option<i32>,
    ///The UTC timestamp when the operation began.
    #[serde(
        rename = "startTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub start_time: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub status: ::std::option::Option<PatchOperationStatus>,
}
impl ::std::convert::From<&LastPatchInstallationSummary>
for LastPatchInstallationSummary {
    fn from(value: &LastPatchInstallationSummary) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for LastPatchInstallationSummary {
    fn default() -> Self {
        Self {
            error: Default::default(),
            excluded_patch_count: Default::default(),
            failed_patch_count: Default::default(),
            installation_activity_id: Default::default(),
            installed_patch_count: Default::default(),
            last_modified_time: Default::default(),
            maintenance_window_exceeded: Default::default(),
            not_selected_patch_count: Default::default(),
            pending_patch_count: Default::default(),
            start_time: Default::default(),
            status: Default::default(),
        }
    }
}
///Specifies the Linux operating system settings on the virtual machine. For a list of supported Linux distributions, see [Linux on Azure-Endorsed Distributions](https://docs.microsoft.com/azure/virtual-machines/linux/endorsed-distros).
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the Linux operating system settings on the virtual machine. For a list of supported Linux distributions, see [Linux on Azure-Endorsed Distributions](https://docs.microsoft.com/azure/virtual-machines/linux/endorsed-distros).",
///  "type": "object",
///  "properties": {
///    "disablePasswordAuthentication": {
///      "description": "Specifies whether password authentication should be disabled.",
///      "type": "boolean"
///    },
///    "enableVMAgentPlatformUpdates": {
///      "description": "Indicates whether VMAgent Platform Updates is enabled for the Linux virtual machine. Default value is false.",
///      "type": "boolean"
///    },
///    "patchSettings": {
///      "$ref": "#/components/schemas/LinuxPatchSettings"
///    },
///    "provisionVMAgent": {
///      "description": "Indicates whether virtual machine agent should be provisioned on the virtual machine. When this property is not specified in the request body, default behavior is to set it to true. This will ensure that VM Agent is installed on the VM so that extensions can be added to the VM later.",
///      "type": "boolean"
///    },
///    "ssh": {
///      "$ref": "#/components/schemas/SshConfiguration"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct LinuxConfiguration {
    ///Specifies whether password authentication should be disabled.
    #[serde(
        rename = "disablePasswordAuthentication",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disable_password_authentication: ::std::option::Option<bool>,
    ///Indicates whether VMAgent Platform Updates is enabled for the Linux virtual machine. Default value is false.
    #[serde(
        rename = "enableVMAgentPlatformUpdates",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_vm_agent_platform_updates: ::std::option::Option<bool>,
    #[serde(
        rename = "patchSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub patch_settings: ::std::option::Option<LinuxPatchSettings>,
    ///Indicates whether virtual machine agent should be provisioned on the virtual machine. When this property is not specified in the request body, default behavior is to set it to true. This will ensure that VM Agent is installed on the VM so that extensions can be added to the VM later.
    #[serde(
        rename = "provisionVMAgent",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provision_vm_agent: ::std::option::Option<bool>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub ssh: ::std::option::Option<SshConfiguration>,
}
impl ::std::convert::From<&LinuxConfiguration> for LinuxConfiguration {
    fn from(value: &LinuxConfiguration) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for LinuxConfiguration {
    fn default() -> Self {
        Self {
            disable_password_authentication: Default::default(),
            enable_vm_agent_platform_updates: Default::default(),
            patch_settings: Default::default(),
            provision_vm_agent: Default::default(),
            ssh: Default::default(),
        }
    }
}
///Input for InstallPatches on a Linux VM, as directly received by the API
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Input for InstallPatches on a Linux VM, as directly received by the API",
///  "type": "object",
///  "properties": {
///    "classificationsToInclude": {
///      "description": "The update classifications to select when installing patches for Linux.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VMGuestPatchClassificationLinux"
///      }
///    },
///    "maintenanceRunId": {
///      "description": "This is used as a maintenance run identifier for Auto VM Guest Patching in Linux.",
///      "type": "string"
///    },
///    "packageNameMasksToExclude": {
///      "description": "packages to exclude in the patch operation. Format: packageName_packageVersion",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "packageNameMasksToInclude": {
///      "description": "packages to include in the patch operation. Format: packageName_packageVersion",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct LinuxParameters {
    ///The update classifications to select when installing patches for Linux.
    #[serde(
        rename = "classificationsToInclude",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub classifications_to_include: ::std::vec::Vec<VmGuestPatchClassificationLinux>,
    ///This is used as a maintenance run identifier for Auto VM Guest Patching in Linux.
    #[serde(
        rename = "maintenanceRunId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub maintenance_run_id: ::std::option::Option<::std::string::String>,
    ///packages to exclude in the patch operation. Format: packageName_packageVersion
    #[serde(
        rename = "packageNameMasksToExclude",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub package_name_masks_to_exclude: ::std::vec::Vec<::std::string::String>,
    ///packages to include in the patch operation. Format: packageName_packageVersion
    #[serde(
        rename = "packageNameMasksToInclude",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub package_name_masks_to_include: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&LinuxParameters> for LinuxParameters {
    fn from(value: &LinuxParameters) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for LinuxParameters {
    fn default() -> Self {
        Self {
            classifications_to_include: Default::default(),
            maintenance_run_id: Default::default(),
            package_name_masks_to_exclude: Default::default(),
            package_name_masks_to_include: Default::default(),
        }
    }
}
///Specifies the mode of VM Guest Patch Assessment for the IaaS virtual machine.<br /><br /> Possible values are:<br /><br /> **ImageDefault** - You control the timing of patch assessments on a virtual machine. <br /><br /> **AutomaticByPlatform** - The platform will trigger periodic patch assessments. The property provisionVMAgent must be true.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the mode of VM Guest Patch Assessment for the IaaS virtual machine.<br /><br /> Possible values are:<br /><br /> **ImageDefault** - You control the timing of patch assessments on a virtual machine. <br /><br /> **AutomaticByPlatform** - The platform will trigger periodic patch assessments. The property provisionVMAgent must be true.",
///  "type": "string",
///  "enum": [
///    "ImageDefault",
///    "AutomaticByPlatform"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "LinuxPatchAssessmentMode",
///    "values": [
///      {
///        "name": "ImageDefault",
///        "value": "ImageDefault"
///      },
///      {
///        "name": "AutomaticByPlatform",
///        "value": "AutomaticByPlatform"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum LinuxPatchAssessmentMode {
    ImageDefault,
    AutomaticByPlatform,
}
impl ::std::convert::From<&Self> for LinuxPatchAssessmentMode {
    fn from(value: &LinuxPatchAssessmentMode) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for LinuxPatchAssessmentMode {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::ImageDefault => f.write_str("ImageDefault"),
            Self::AutomaticByPlatform => f.write_str("AutomaticByPlatform"),
        }
    }
}
impl ::std::str::FromStr for LinuxPatchAssessmentMode {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "imagedefault" => Ok(Self::ImageDefault),
            "automaticbyplatform" => Ok(Self::AutomaticByPlatform),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for LinuxPatchAssessmentMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for LinuxPatchAssessmentMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for LinuxPatchAssessmentMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies settings related to VM Guest Patching on Linux.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies settings related to VM Guest Patching on Linux.",
///  "type": "object",
///  "properties": {
///    "assessmentMode": {
///      "$ref": "#/components/schemas/LinuxPatchAssessmentMode"
///    },
///    "automaticByPlatformSettings": {
///      "$ref": "#/components/schemas/LinuxVMGuestPatchAutomaticByPlatformSettings"
///    },
///    "patchMode": {
///      "$ref": "#/components/schemas/LinuxVMGuestPatchMode"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct LinuxPatchSettings {
    #[serde(
        rename = "assessmentMode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub assessment_mode: ::std::option::Option<LinuxPatchAssessmentMode>,
    #[serde(
        rename = "automaticByPlatformSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub automatic_by_platform_settings: ::std::option::Option<
        LinuxVmGuestPatchAutomaticByPlatformSettings,
    >,
    #[serde(
        rename = "patchMode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub patch_mode: ::std::option::Option<LinuxVmGuestPatchMode>,
}
impl ::std::convert::From<&LinuxPatchSettings> for LinuxPatchSettings {
    fn from(value: &LinuxPatchSettings) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for LinuxPatchSettings {
    fn default() -> Self {
        Self {
            assessment_mode: Default::default(),
            automatic_by_platform_settings: Default::default(),
            patch_mode: Default::default(),
        }
    }
}
///Specifies the reboot setting for all AutomaticByPlatform patch installation operations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the reboot setting for all AutomaticByPlatform patch installation operations.",
///  "type": "string",
///  "enum": [
///    "Unknown",
///    "IfRequired",
///    "Never",
///    "Always"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "LinuxVMGuestPatchAutomaticByPlatformRebootSetting",
///    "values": [
///      {
///        "name": "Unknown",
///        "value": "Unknown"
///      },
///      {
///        "name": "IfRequired",
///        "value": "IfRequired"
///      },
///      {
///        "name": "Never",
///        "value": "Never"
///      },
///      {
///        "name": "Always",
///        "value": "Always"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum LinuxVmGuestPatchAutomaticByPlatformRebootSetting {
    Unknown,
    IfRequired,
    Never,
    Always,
}
impl ::std::convert::From<&Self> for LinuxVmGuestPatchAutomaticByPlatformRebootSetting {
    fn from(value: &LinuxVmGuestPatchAutomaticByPlatformRebootSetting) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for LinuxVmGuestPatchAutomaticByPlatformRebootSetting {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Unknown => f.write_str("Unknown"),
            Self::IfRequired => f.write_str("IfRequired"),
            Self::Never => f.write_str("Never"),
            Self::Always => f.write_str("Always"),
        }
    }
}
impl ::std::str::FromStr for LinuxVmGuestPatchAutomaticByPlatformRebootSetting {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "unknown" => Ok(Self::Unknown),
            "ifrequired" => Ok(Self::IfRequired),
            "never" => Ok(Self::Never),
            "always" => Ok(Self::Always),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str>
for LinuxVmGuestPatchAutomaticByPlatformRebootSetting {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for LinuxVmGuestPatchAutomaticByPlatformRebootSetting {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for LinuxVmGuestPatchAutomaticByPlatformRebootSetting {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies additional settings to be applied when patch mode AutomaticByPlatform is selected in Linux patch settings.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies additional settings to be applied when patch mode AutomaticByPlatform is selected in Linux patch settings.",
///  "type": "object",
///  "properties": {
///    "bypassPlatformSafetyChecksOnUserSchedule": {
///      "description": "Enables customer to schedule patching without accidental upgrades",
///      "type": "boolean"
///    },
///    "rebootSetting": {
///      "$ref": "#/components/schemas/LinuxVMGuestPatchAutomaticByPlatformRebootSetting"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct LinuxVmGuestPatchAutomaticByPlatformSettings {
    ///Enables customer to schedule patching without accidental upgrades
    #[serde(
        rename = "bypassPlatformSafetyChecksOnUserSchedule",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub bypass_platform_safety_checks_on_user_schedule: ::std::option::Option<bool>,
    #[serde(
        rename = "rebootSetting",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub reboot_setting: ::std::option::Option<
        LinuxVmGuestPatchAutomaticByPlatformRebootSetting,
    >,
}
impl ::std::convert::From<&LinuxVmGuestPatchAutomaticByPlatformSettings>
for LinuxVmGuestPatchAutomaticByPlatformSettings {
    fn from(value: &LinuxVmGuestPatchAutomaticByPlatformSettings) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for LinuxVmGuestPatchAutomaticByPlatformSettings {
    fn default() -> Self {
        Self {
            bypass_platform_safety_checks_on_user_schedule: Default::default(),
            reboot_setting: Default::default(),
        }
    }
}
///Specifies the mode of VM Guest Patching to IaaS virtual machine or virtual machines associated to virtual machine scale set with OrchestrationMode as Flexible.<br /><br /> Possible values are:<br /><br /> **ImageDefault** - The virtual machine's default patching configuration is used. <br /><br /> **AutomaticByPlatform** - The virtual machine will be automatically updated by the platform. The property provisionVMAgent must be true
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the mode of VM Guest Patching to IaaS virtual machine or virtual machines associated to virtual machine scale set with OrchestrationMode as Flexible.<br /><br /> Possible values are:<br /><br /> **ImageDefault** - The virtual machine's default patching configuration is used. <br /><br /> **AutomaticByPlatform** - The virtual machine will be automatically updated by the platform. The property provisionVMAgent must be true",
///  "type": "string",
///  "enum": [
///    "ImageDefault",
///    "AutomaticByPlatform"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "LinuxVMGuestPatchMode",
///    "values": [
///      {
///        "name": "ImageDefault",
///        "value": "ImageDefault"
///      },
///      {
///        "name": "AutomaticByPlatform",
///        "value": "AutomaticByPlatform"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum LinuxVmGuestPatchMode {
    ImageDefault,
    AutomaticByPlatform,
}
impl ::std::convert::From<&Self> for LinuxVmGuestPatchMode {
    fn from(value: &LinuxVmGuestPatchMode) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for LinuxVmGuestPatchMode {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::ImageDefault => f.write_str("ImageDefault"),
            Self::AutomaticByPlatform => f.write_str("AutomaticByPlatform"),
        }
    }
}
impl ::std::str::FromStr for LinuxVmGuestPatchMode {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "imagedefault" => Ok(Self::ImageDefault),
            "automaticbyplatform" => Ok(Self::AutomaticByPlatform),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for LinuxVmGuestPatchMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for LinuxVmGuestPatchMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for LinuxVmGuestPatchMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The List Usages operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Usages operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The URI to fetch the next page of compute resource usage information. Call ListNext() with this to fetch the next page of compute resource usage information.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of compute resource usages.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/Usage"
///      },
///      "x-ms-identifiers": []
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ListUsagesResult {
    ///The URI to fetch the next page of compute resource usage information. Call ListNext() with this to fetch the next page of compute resource usage information.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of compute resource usages.
    pub value: ::std::vec::Vec<Usage>,
}
impl ::std::convert::From<&ListUsagesResult> for ListUsagesResult {
    fn from(value: &ListUsagesResult) -> Self {
        value.clone()
    }
}
///Api input base class for LogAnalytics Api.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Api input base class for LogAnalytics Api.",
///  "type": "object",
///  "required": [
///    "blobContainerSasUri",
///    "fromTime",
///    "toTime"
///  ],
///  "properties": {
///    "blobContainerSasUri": {
///      "description": "SAS Uri of the logging blob container to which LogAnalytics Api writes output logs to.",
///      "type": "string"
///    },
///    "fromTime": {
///      "description": "From time of the query",
///      "type": "string"
///    },
///    "groupByClientApplicationId": {
///      "description": "Group query result by Client Application ID.",
///      "type": "boolean"
///    },
///    "groupByOperationName": {
///      "description": "Group query result by Operation Name.",
///      "type": "boolean"
///    },
///    "groupByResourceName": {
///      "description": "Group query result by Resource Name.",
///      "type": "boolean"
///    },
///    "groupByThrottlePolicy": {
///      "description": "Group query result by Throttle Policy applied.",
///      "type": "boolean"
///    },
///    "groupByUserAgent": {
///      "description": "Group query result by User Agent.",
///      "type": "boolean"
///    },
///    "toTime": {
///      "description": "To time of the query",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct LogAnalyticsInputBase {
    ///SAS Uri of the logging blob container to which LogAnalytics Api writes output logs to.
    #[serde(rename = "blobContainerSasUri")]
    pub blob_container_sas_uri: ::std::string::String,
    ///From time of the query
    #[serde(rename = "fromTime")]
    pub from_time: ::std::string::String,
    ///Group query result by Client Application ID.
    #[serde(
        rename = "groupByClientApplicationId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub group_by_client_application_id: ::std::option::Option<bool>,
    ///Group query result by Operation Name.
    #[serde(
        rename = "groupByOperationName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub group_by_operation_name: ::std::option::Option<bool>,
    ///Group query result by Resource Name.
    #[serde(
        rename = "groupByResourceName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub group_by_resource_name: ::std::option::Option<bool>,
    ///Group query result by Throttle Policy applied.
    #[serde(
        rename = "groupByThrottlePolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub group_by_throttle_policy: ::std::option::Option<bool>,
    ///Group query result by User Agent.
    #[serde(
        rename = "groupByUserAgent",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub group_by_user_agent: ::std::option::Option<bool>,
    ///To time of the query
    #[serde(rename = "toTime")]
    pub to_time: ::std::string::String,
}
impl ::std::convert::From<&LogAnalyticsInputBase> for LogAnalyticsInputBase {
    fn from(value: &LogAnalyticsInputBase) -> Self {
        value.clone()
    }
}
///LogAnalytics operation status response
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "LogAnalytics operation status response",
///  "type": "object",
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/LogAnalyticsOutput"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct LogAnalyticsOperationResult {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<LogAnalyticsOutput>,
}
impl ::std::convert::From<&LogAnalyticsOperationResult> for LogAnalyticsOperationResult {
    fn from(value: &LogAnalyticsOperationResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for LogAnalyticsOperationResult {
    fn default() -> Self {
        Self {
            properties: Default::default(),
        }
    }
}
///LogAnalytics output properties
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "LogAnalytics output properties",
///  "type": "object",
///  "properties": {
///    "output": {
///      "description": "Output file Uri path to blob container.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct LogAnalyticsOutput {
    ///Output file Uri path to blob container.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub output: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&LogAnalyticsOutput> for LogAnalyticsOutput {
    fn from(value: &LogAnalyticsOutput) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for LogAnalyticsOutput {
    fn default() -> Self {
        Self { output: Default::default() }
    }
}
///The Last Maintenance Operation Result Code.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The Last Maintenance Operation Result Code.",
///  "type": "string",
///  "enum": [
///    "None",
///    "RetryLater",
///    "MaintenanceAborted",
///    "MaintenanceCompleted"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "MaintenanceOperationResultCodeTypes"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum MaintenanceOperationResultCodeTypes {
    None,
    RetryLater,
    MaintenanceAborted,
    MaintenanceCompleted,
}
impl ::std::convert::From<&Self> for MaintenanceOperationResultCodeTypes {
    fn from(value: &MaintenanceOperationResultCodeTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for MaintenanceOperationResultCodeTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::None => f.write_str("None"),
            Self::RetryLater => f.write_str("RetryLater"),
            Self::MaintenanceAborted => f.write_str("MaintenanceAborted"),
            Self::MaintenanceCompleted => f.write_str("MaintenanceCompleted"),
        }
    }
}
impl ::std::str::FromStr for MaintenanceOperationResultCodeTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "none" => Ok(Self::None),
            "retrylater" => Ok(Self::RetryLater),
            "maintenanceaborted" => Ok(Self::MaintenanceAborted),
            "maintenancecompleted" => Ok(Self::MaintenanceCompleted),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for MaintenanceOperationResultCodeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for MaintenanceOperationResultCodeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for MaintenanceOperationResultCodeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Maintenance Operation Status.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Maintenance Operation Status.",
///  "type": "object",
///  "properties": {
///    "isCustomerInitiatedMaintenanceAllowed": {
///      "description": "True, if customer is allowed to perform Maintenance.",
///      "type": "boolean"
///    },
///    "lastOperationMessage": {
///      "description": "Message returned for the last Maintenance Operation.",
///      "type": "string"
///    },
///    "lastOperationResultCode": {
///      "$ref": "#/components/schemas/MaintenanceOperationResultCodeTypes"
///    },
///    "maintenanceWindowEndTime": {
///      "description": "End Time for the Maintenance Window.",
///      "type": "string"
///    },
///    "maintenanceWindowStartTime": {
///      "description": "Start Time for the Maintenance Window.",
///      "type": "string"
///    },
///    "preMaintenanceWindowEndTime": {
///      "description": "End Time for the Pre Maintenance Window.",
///      "type": "string"
///    },
///    "preMaintenanceWindowStartTime": {
///      "description": "Start Time for the Pre Maintenance Window.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct MaintenanceRedeployStatus {
    ///True, if customer is allowed to perform Maintenance.
    #[serde(
        rename = "isCustomerInitiatedMaintenanceAllowed",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub is_customer_initiated_maintenance_allowed: ::std::option::Option<bool>,
    ///Message returned for the last Maintenance Operation.
    #[serde(
        rename = "lastOperationMessage",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_operation_message: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "lastOperationResultCode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_operation_result_code: ::std::option::Option<
        MaintenanceOperationResultCodeTypes,
    >,
    ///End Time for the Maintenance Window.
    #[serde(
        rename = "maintenanceWindowEndTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub maintenance_window_end_time: ::std::option::Option<::std::string::String>,
    ///Start Time for the Maintenance Window.
    #[serde(
        rename = "maintenanceWindowStartTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub maintenance_window_start_time: ::std::option::Option<::std::string::String>,
    ///End Time for the Pre Maintenance Window.
    #[serde(
        rename = "preMaintenanceWindowEndTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub pre_maintenance_window_end_time: ::std::option::Option<::std::string::String>,
    ///Start Time for the Pre Maintenance Window.
    #[serde(
        rename = "preMaintenanceWindowStartTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub pre_maintenance_window_start_time: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&MaintenanceRedeployStatus> for MaintenanceRedeployStatus {
    fn from(value: &MaintenanceRedeployStatus) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for MaintenanceRedeployStatus {
    fn default() -> Self {
        Self {
            is_customer_initiated_maintenance_allowed: Default::default(),
            last_operation_message: Default::default(),
            last_operation_result_code: Default::default(),
            maintenance_window_end_time: Default::default(),
            maintenance_window_start_time: Default::default(),
            pre_maintenance_window_end_time: Default::default(),
            pre_maintenance_window_start_time: Default::default(),
        }
    }
}
///The parameters of a managed disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The parameters of a managed disk.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  ],
///  "properties": {
///    "diskEncryptionSet": {
///      "$ref": "#/components/schemas/DiskEncryptionSetParameters"
///    },
///    "securityProfile": {
///      "$ref": "#/components/schemas/VMDiskSecurityProfile"
///    },
///    "storageAccountType": {
///      "$ref": "#/components/schemas/StorageAccountTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ManagedDiskParameters {
    #[serde(
        rename = "diskEncryptionSet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_encryption_set: ::std::option::Option<DiskEncryptionSetParameters>,
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "securityProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub security_profile: ::std::option::Option<VmDiskSecurityProfile>,
    #[serde(
        rename = "storageAccountType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_account_type: ::std::option::Option<StorageAccountTypes>,
}
impl ::std::convert::From<&ManagedDiskParameters> for ManagedDiskParameters {
    fn from(value: &ManagedDiskParameters) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ManagedDiskParameters {
    fn default() -> Self {
        Self {
            disk_encryption_set: Default::default(),
            id: Default::default(),
            security_profile: Default::default(),
            storage_account_type: Default::default(),
        }
    }
}
///The configuration parameters used to limit the number of virtual machines per availability zone in the virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The configuration parameters used to limit the number of virtual machines per availability zone in the virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "enabled": {
///      "description": "Specifies whether maxInstancePercentPerZonePolicy should be enabled on the virtual machine scale set.",
///      "type": "boolean"
///    },
///    "value": {
///      "description": "Limit on the number of instances in each zone as a percentage of the total capacity of the virtual machine scale set.",
///      "type": "integer",
///      "format": "int32",
///      "maximum": 100.0
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct MaxInstancePercentPerZonePolicy {
    ///Specifies whether maxInstancePercentPerZonePolicy should be enabled on the virtual machine scale set.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enabled: ::std::option::Option<bool>,
    ///Limit on the number of instances in each zone as a percentage of the total capacity of the virtual machine scale set.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub value: ::std::option::Option<i32>,
}
impl ::std::convert::From<&MaxInstancePercentPerZonePolicy>
for MaxInstancePercentPerZonePolicy {
    fn from(value: &MaxInstancePercentPerZonePolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for MaxInstancePercentPerZonePolicy {
    fn default() -> Self {
        Self {
            enabled: Default::default(),
            value: Default::default(),
        }
    }
}
///Describes the Virtual Machine Scale Set to migrate from Availability Set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the Virtual Machine Scale Set to migrate from Availability Set.",
///  "type": "object",
///  "required": [
///    "virtualMachineScaleSetFlexible"
///  ],
///  "properties": {
///    "virtualMachineScaleSetFlexible": {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct MigrateToVirtualMachineScaleSetInput {
    #[serde(rename = "virtualMachineScaleSetFlexible")]
    pub virtual_machine_scale_set_flexible: SubResource,
}
impl ::std::convert::From<&MigrateToVirtualMachineScaleSetInput>
for MigrateToVirtualMachineScaleSetInput {
    fn from(value: &MigrateToVirtualMachineScaleSetInput) -> Self {
        value.clone()
    }
}
///The input of virtual machine migration from Availability Set to Flexible Virtual Machine Scale Set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The input of virtual machine migration from Availability Set to Flexible Virtual Machine Scale Set.",
///  "type": "object",
///  "properties": {
///    "targetFaultDomain": {
///      "description": "The target compute fault domain of VM migration to Flexible Virtual Machine Scale Set.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "targetVMSize": {
///      "description": "The target Virtual Machine size of VM migration to Flexible Virtual Machine Scale Set.",
///      "type": "string"
///    },
///    "targetZone": {
///      "description": "The target zone of VM migration to Flexible Virtual Machine Scale Set.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct MigrateVmToVirtualMachineScaleSetInput {
    ///The target compute fault domain of VM migration to Flexible Virtual Machine Scale Set.
    #[serde(
        rename = "targetFaultDomain",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub target_fault_domain: ::std::option::Option<i32>,
    ///The target Virtual Machine size of VM migration to Flexible Virtual Machine Scale Set.
    #[serde(
        rename = "targetVMSize",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub target_vm_size: ::std::option::Option<::std::string::String>,
    ///The target zone of VM migration to Flexible Virtual Machine Scale Set.
    #[serde(
        rename = "targetZone",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub target_zone: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&MigrateVmToVirtualMachineScaleSetInput>
for MigrateVmToVirtualMachineScaleSetInput {
    fn from(value: &MigrateVmToVirtualMachineScaleSetInput) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for MigrateVmToVirtualMachineScaleSetInput {
    fn default() -> Self {
        Self {
            target_fault_domain: Default::default(),
            target_vm_size: Default::default(),
            target_zone: Default::default(),
        }
    }
}
///Specifies the mode that ProxyAgent will execute on if the feature is enabled. ProxyAgent will start to audit or monitor but not enforce access control over requests to host endpoints in Audit mode, while in Enforce mode it will enforce access control. The default value is Enforce mode.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the mode that ProxyAgent will execute on if the feature is enabled. ProxyAgent will start to audit or monitor but not enforce access control over requests to host endpoints in Audit mode, while in Enforce mode it will enforce access control. The default value is Enforce mode.",
///  "type": "string",
///  "enum": [
///    "Audit",
///    "Enforce"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "Mode",
///    "values": [
///      {
///        "name": "Audit",
///        "value": "Audit"
///      },
///      {
///        "name": "Enforce",
///        "value": "Enforce"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum Mode {
    Audit,
    Enforce,
}
impl ::std::convert::From<&Self> for Mode {
    fn from(value: &Mode) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for Mode {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Audit => f.write_str("Audit"),
            Self::Enforce => f.write_str("Enforce"),
        }
    }
}
impl ::std::str::FromStr for Mode {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "audit" => Ok(Self::Audit),
            "enforce" => Ok(Self::Enforce),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for Mode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for Mode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for Mode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the execution mode. In Audit mode, the system acts as if it is enforcing the access control policy, including emitting access denial entries in the logs but it does not actually deny any requests to host endpoints. In Enforce mode, the system will enforce the access control and it is the recommended mode of operation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the execution mode. In Audit mode, the system acts as if it is enforcing the access control policy, including emitting access denial entries in the logs but it does not actually deny any requests to host endpoints. In Enforce mode, the system will enforce the access control and it is the recommended mode of operation.",
///  "type": "string",
///  "enum": [
///    "Audit",
///    "Enforce",
///    "Disabled"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "Modes",
///    "values": [
///      {
///        "name": "Audit",
///        "value": "Audit"
///      },
///      {
///        "name": "Enforce",
///        "value": "Enforce"
///      },
///      {
///        "name": "Disabled",
///        "value": "Disabled"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum Modes {
    Audit,
    Enforce,
    Disabled,
}
impl ::std::convert::From<&Self> for Modes {
    fn from(value: &Modes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for Modes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Audit => f.write_str("Audit"),
            Self::Enforce => f.write_str("Enforce"),
            Self::Disabled => f.write_str("Disabled"),
        }
    }
}
impl ::std::str::FromStr for Modes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "audit" => Ok(Self::Audit),
            "enforce" => Ok(Self::Enforce),
            "disabled" => Ok(Self::Disabled),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for Modes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for Modes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for Modes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///specifies the Microsoft.Network API version used when creating networking resources in the Network Interface Configurations
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "specifies the Microsoft.Network API version used when creating networking resources in the Network Interface Configurations",
///  "type": "string",
///  "enum": [
///    "2020-11-01",
///    "2022-11-01"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "NetworkApiVersion",
///    "values": [
///      {
///        "name": "2020-11-01",
///        "value": "2020-11-01"
///      },
///      {
///        "name": "2022-11-01",
///        "value": "2022-11-01"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum NetworkApiVersion {
    #[serde(rename = "2020-11-01")]
    X20201101,
    #[serde(rename = "2022-11-01")]
    X20221101,
}
impl ::std::convert::From<&Self> for NetworkApiVersion {
    fn from(value: &NetworkApiVersion) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for NetworkApiVersion {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::X20201101 => f.write_str("2020-11-01"),
            Self::X20221101 => f.write_str("2022-11-01"),
        }
    }
}
impl ::std::str::FromStr for NetworkApiVersion {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "2020-11-01" => Ok(Self::X20201101),
            "2022-11-01" => Ok(Self::X20221101),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for NetworkApiVersion {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for NetworkApiVersion {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for NetworkApiVersion {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies whether the Auxiliary mode is enabled for the Network Interface resource.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies whether the Auxiliary mode is enabled for the Network Interface resource.",
///  "type": "string",
///  "enum": [
///    "None",
///    "AcceleratedConnections",
///    "Floating"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "NetworkInterfaceAuxiliaryMode",
///    "values": [
///      {
///        "name": "None",
///        "value": "None"
///      },
///      {
///        "name": "AcceleratedConnections",
///        "value": "AcceleratedConnections"
///      },
///      {
///        "name": "Floating",
///        "value": "Floating"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum NetworkInterfaceAuxiliaryMode {
    None,
    AcceleratedConnections,
    Floating,
}
impl ::std::convert::From<&Self> for NetworkInterfaceAuxiliaryMode {
    fn from(value: &NetworkInterfaceAuxiliaryMode) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for NetworkInterfaceAuxiliaryMode {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::None => f.write_str("None"),
            Self::AcceleratedConnections => f.write_str("AcceleratedConnections"),
            Self::Floating => f.write_str("Floating"),
        }
    }
}
impl ::std::str::FromStr for NetworkInterfaceAuxiliaryMode {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "none" => Ok(Self::None),
            "acceleratedconnections" => Ok(Self::AcceleratedConnections),
            "floating" => Ok(Self::Floating),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for NetworkInterfaceAuxiliaryMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for NetworkInterfaceAuxiliaryMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for NetworkInterfaceAuxiliaryMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies whether the Auxiliary sku is enabled for the Network Interface resource.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies whether the Auxiliary sku is enabled for the Network Interface resource.",
///  "type": "string",
///  "enum": [
///    "None",
///    "A1",
///    "A2",
///    "A4",
///    "A8"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "NetworkInterfaceAuxiliarySku",
///    "values": [
///      {
///        "name": "None",
///        "value": "None"
///      },
///      {
///        "name": "A1",
///        "value": "A1"
///      },
///      {
///        "name": "A2",
///        "value": "A2"
///      },
///      {
///        "name": "A4",
///        "value": "A4"
///      },
///      {
///        "name": "A8",
///        "value": "A8"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum NetworkInterfaceAuxiliarySku {
    None,
    A1,
    A2,
    A4,
    A8,
}
impl ::std::convert::From<&Self> for NetworkInterfaceAuxiliarySku {
    fn from(value: &NetworkInterfaceAuxiliarySku) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for NetworkInterfaceAuxiliarySku {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::None => f.write_str("None"),
            Self::A1 => f.write_str("A1"),
            Self::A2 => f.write_str("A2"),
            Self::A4 => f.write_str("A4"),
            Self::A8 => f.write_str("A8"),
        }
    }
}
impl ::std::str::FromStr for NetworkInterfaceAuxiliarySku {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "none" => Ok(Self::None),
            "a1" => Ok(Self::A1),
            "a2" => Ok(Self::A2),
            "a4" => Ok(Self::A4),
            "a8" => Ok(Self::A8),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for NetworkInterfaceAuxiliarySku {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for NetworkInterfaceAuxiliarySku {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for NetworkInterfaceAuxiliarySku {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes a network interface reference.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a network interface reference.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/NetworkInterfaceReferenceProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct NetworkInterfaceReference {
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<NetworkInterfaceReferenceProperties>,
}
impl ::std::convert::From<&NetworkInterfaceReference> for NetworkInterfaceReference {
    fn from(value: &NetworkInterfaceReference) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for NetworkInterfaceReference {
    fn default() -> Self {
        Self {
            id: Default::default(),
            properties: Default::default(),
        }
    }
}
///Describes a network interface reference properties.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a network interface reference properties.",
///  "type": "object",
///  "properties": {
///    "deleteOption": {
///      "$ref": "#/components/schemas/DeleteOptions"
///    },
///    "primary": {
///      "description": "Specifies the primary network interface in case the virtual machine has more than 1 network interface.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct NetworkInterfaceReferenceProperties {
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DeleteOptions>,
    ///Specifies the primary network interface in case the virtual machine has more than 1 network interface.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub primary: ::std::option::Option<bool>,
}
impl ::std::convert::From<&NetworkInterfaceReferenceProperties>
for NetworkInterfaceReferenceProperties {
    fn from(value: &NetworkInterfaceReferenceProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for NetworkInterfaceReferenceProperties {
    fn default() -> Self {
        Self {
            delete_option: Default::default(),
            primary: Default::default(),
        }
    }
}
///Specifies the network interfaces or the networking configuration of the virtual machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the network interfaces or the networking configuration of the virtual machine.",
///  "type": "object",
///  "properties": {
///    "networkApiVersion": {
///      "$ref": "#/components/schemas/NetworkApiVersion"
///    },
///    "networkInterfaceConfigurations": {
///      "description": "Specifies the networking configurations that will be used to create the virtual machine networking resources.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineNetworkInterfaceConfiguration"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "networkInterfaces": {
///      "description": "Specifies the list of resource Ids for the network interfaces associated with the virtual machine.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/NetworkInterfaceReference"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct NetworkProfile {
    #[serde(
        rename = "networkApiVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_api_version: ::std::option::Option<NetworkApiVersion>,
    ///Specifies the networking configurations that will be used to create the virtual machine networking resources.
    #[serde(
        rename = "networkInterfaceConfigurations",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_interface_configurations: ::std::vec::Vec<
        VirtualMachineNetworkInterfaceConfiguration,
    >,
    ///Specifies the list of resource Ids for the network interfaces associated with the virtual machine.
    #[serde(
        rename = "networkInterfaces",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_interfaces: ::std::vec::Vec<NetworkInterfaceReference>,
}
impl ::std::convert::From<&NetworkProfile> for NetworkProfile {
    fn from(value: &NetworkProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for NetworkProfile {
    fn default() -> Self {
        Self {
            network_api_version: Default::default(),
            network_interface_configurations: Default::default(),
            network_interfaces: Default::default(),
        }
    }
}
///The OS State. For managed images, use Generalized.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The OS State. For managed images, use Generalized.",
///  "type": "string",
///  "enum": [
///    "Generalized",
///    "Specialized"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "OperatingSystemStateTypes",
///    "values": [
///      {
///        "description": "Generalized image. Needs to be provisioned during deployment time.",
///        "name": "Generalized",
///        "value": "Generalized"
///      },
///      {
///        "description": "Specialized image. Contains already provisioned OS Disk.",
///        "name": "Specialized",
///        "value": "Specialized"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum OperatingSystemStateTypes {
    Generalized,
    Specialized,
}
impl ::std::convert::From<&Self> for OperatingSystemStateTypes {
    fn from(value: &OperatingSystemStateTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for OperatingSystemStateTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Generalized => f.write_str("Generalized"),
            Self::Specialized => f.write_str("Specialized"),
        }
    }
}
impl ::std::str::FromStr for OperatingSystemStateTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "generalized" => Ok(Self::Generalized),
            "specialized" => Ok(Self::Specialized),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for OperatingSystemStateTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for OperatingSystemStateTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for OperatingSystemStateTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Gets the Operating System type.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Gets the Operating System type.",
///  "type": "string",
///  "enum": [
///    "Windows",
///    "Linux"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "OperatingSystemType",
///    "values": [
///      {
///        "name": "Windows",
///        "value": "Windows"
///      },
///      {
///        "name": "Linux",
///        "value": "Linux"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum OperatingSystemType {
    Windows,
    Linux,
}
impl ::std::convert::From<&Self> for OperatingSystemType {
    fn from(value: &OperatingSystemType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for OperatingSystemType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Windows => f.write_str("Windows"),
            Self::Linux => f.write_str("Linux"),
        }
    }
}
impl ::std::str::FromStr for OperatingSystemType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "windows" => Ok(Self::Windows),
            "linux" => Ok(Self::Linux),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for OperatingSystemType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for OperatingSystemType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for OperatingSystemType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///This property allows you to specify the type of the OS that is included in the disk if creating a VM from user-image or a specialized VHD. Possible values are: **Windows,** **Linux.**
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "This property allows you to specify the type of the OS that is included in the disk if creating a VM from user-image or a specialized VHD. Possible values are: **Windows,** **Linux.**",
///  "type": "string",
///  "enum": [
///    "Windows",
///    "Linux"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "OperatingSystemTypes"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum OperatingSystemTypes {
    Windows,
    Linux,
}
impl ::std::convert::From<&Self> for OperatingSystemTypes {
    fn from(value: &OperatingSystemTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for OperatingSystemTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Windows => f.write_str("Windows"),
            Self::Linux => f.write_str("Linux"),
        }
    }
}
impl ::std::str::FromStr for OperatingSystemTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "windows" => Ok(Self::Windows),
            "linux" => Ok(Self::Linux),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for OperatingSystemTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for OperatingSystemTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for OperatingSystemTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Details of a REST API operation, returned from the Resource Provider Operations API
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "title": "REST API Operation",
///  "description": "Details of a REST API operation, returned from the Resource Provider Operations API",
///  "type": "object",
///  "properties": {
///    "actionType": {
///      "description": "Enum. Indicates the action type. \"Internal\" refers to actions that are for internal only APIs.",
///      "readOnly": true,
///      "type": "string",
///      "enum": [
///        "Internal"
///      ],
///      "x-ms-enum": {
///        "modelAsString": true,
///        "name": "ActionType"
///      }
///    },
///    "display": {
///      "description": "Localized display information for this particular operation.",
///      "type": "object",
///      "properties": {
///        "description": {
///          "description": "The short, localized friendly description of the operation; suitable for tool tips and detailed views.",
///          "readOnly": true,
///          "type": "string"
///        },
///        "operation": {
///          "description": "The concise, localized friendly name for the operation; suitable for dropdowns. E.g. \"Create or Update Virtual Machine\", \"Restart Virtual Machine\".",
///          "readOnly": true,
///          "type": "string"
///        },
///        "provider": {
///          "description": "The localized friendly form of the resource provider name, e.g. \"Microsoft Monitoring Insights\" or \"Microsoft Compute\".",
///          "readOnly": true,
///          "type": "string"
///        },
///        "resource": {
///          "description": "The localized friendly name of the resource type related to this operation. E.g. \"Virtual Machines\" or \"Job Schedule Collections\".",
///          "readOnly": true,
///          "type": "string"
///        }
///      }
///    },
///    "isDataAction": {
///      "description": "Whether the operation applies to data-plane. This is \"true\" for data-plane operations and \"false\" for ARM/control-plane operations.",
///      "readOnly": true,
///      "type": "boolean"
///    },
///    "name": {
///      "description": "The name of the operation, as per Resource-Based Access Control (RBAC). Examples: \"Microsoft.Compute/virtualMachines/write\", \"Microsoft.Compute/virtualMachines/capture/action\"",
///      "readOnly": true,
///      "type": "string"
///    },
///    "origin": {
///      "description": "The intended executor of the operation; as in Resource Based Access Control (RBAC) and audit logs UX. Default value is \"user,system\"",
///      "readOnly": true,
///      "type": "string",
///      "enum": [
///        "user",
///        "system",
///        "user,system"
///      ],
///      "x-ms-enum": {
///        "modelAsString": true,
///        "name": "Origin"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct Operation {
    ///Enum. Indicates the action type. "Internal" refers to actions that are for internal only APIs.
    #[serde(
        rename = "actionType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub action_type: ::std::option::Option<OperationActionType>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub display: ::std::option::Option<OperationDisplay>,
    ///Whether the operation applies to data-plane. This is "true" for data-plane operations and "false" for ARM/control-plane operations.
    #[serde(
        rename = "isDataAction",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub is_data_action: ::std::option::Option<bool>,
    ///The name of the operation, as per Resource-Based Access Control (RBAC). Examples: "Microsoft.Compute/virtualMachines/write", "Microsoft.Compute/virtualMachines/capture/action"
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///The intended executor of the operation; as in Resource Based Access Control (RBAC) and audit logs UX. Default value is "user,system"
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub origin: ::std::option::Option<OperationOrigin>,
}
impl ::std::convert::From<&Operation> for Operation {
    fn from(value: &Operation) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for Operation {
    fn default() -> Self {
        Self {
            action_type: Default::default(),
            display: Default::default(),
            is_data_action: Default::default(),
            name: Default::default(),
            origin: Default::default(),
        }
    }
}
///Enum. Indicates the action type. "Internal" refers to actions that are for internal only APIs.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Enum. Indicates the action type. \"Internal\" refers to actions that are for internal only APIs.",
///  "readOnly": true,
///  "type": "string",
///  "enum": [
///    "Internal"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ActionType"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum OperationActionType {
    Internal,
}
impl ::std::convert::From<&Self> for OperationActionType {
    fn from(value: &OperationActionType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for OperationActionType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Internal => f.write_str("Internal"),
        }
    }
}
impl ::std::str::FromStr for OperationActionType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "internal" => Ok(Self::Internal),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for OperationActionType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for OperationActionType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for OperationActionType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Localized display information for this particular operation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Localized display information for this particular operation.",
///  "type": "object",
///  "properties": {
///    "description": {
///      "description": "The short, localized friendly description of the operation; suitable for tool tips and detailed views.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "operation": {
///      "description": "The concise, localized friendly name for the operation; suitable for dropdowns. E.g. \"Create or Update Virtual Machine\", \"Restart Virtual Machine\".",
///      "readOnly": true,
///      "type": "string"
///    },
///    "provider": {
///      "description": "The localized friendly form of the resource provider name, e.g. \"Microsoft Monitoring Insights\" or \"Microsoft Compute\".",
///      "readOnly": true,
///      "type": "string"
///    },
///    "resource": {
///      "description": "The localized friendly name of the resource type related to this operation. E.g. \"Virtual Machines\" or \"Job Schedule Collections\".",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct OperationDisplay {
    ///The short, localized friendly description of the operation; suitable for tool tips and detailed views.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub description: ::std::option::Option<::std::string::String>,
    ///The concise, localized friendly name for the operation; suitable for dropdowns. E.g. "Create or Update Virtual Machine", "Restart Virtual Machine".
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub operation: ::std::option::Option<::std::string::String>,
    ///The localized friendly form of the resource provider name, e.g. "Microsoft Monitoring Insights" or "Microsoft Compute".
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provider: ::std::option::Option<::std::string::String>,
    ///The localized friendly name of the resource type related to this operation. E.g. "Virtual Machines" or "Job Schedule Collections".
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub resource: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&OperationDisplay> for OperationDisplay {
    fn from(value: &OperationDisplay) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for OperationDisplay {
    fn default() -> Self {
        Self {
            description: Default::default(),
            operation: Default::default(),
            provider: Default::default(),
            resource: Default::default(),
        }
    }
}
///A list of REST API operations supported by an Azure Resource Provider. It contains an URL link to get the next set of results.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "A list of REST API operations supported by an Azure Resource Provider. It contains an URL link to get the next set of results.",
///  "type": "object",
///  "properties": {
///    "nextLink": {
///      "description": "URL to get the next set of operation list results (if there are any).",
///      "readOnly": true,
///      "type": "string"
///    },
///    "value": {
///      "description": "List of operations supported by the resource provider",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/Operation"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct OperationListResult {
    ///URL to get the next set of operation list results (if there are any).
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///List of operations supported by the resource provider
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub value: ::std::vec::Vec<Operation>,
}
impl ::std::convert::From<&OperationListResult> for OperationListResult {
    fn from(value: &OperationListResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for OperationListResult {
    fn default() -> Self {
        Self {
            next_link: Default::default(),
            value: Default::default(),
        }
    }
}
///The intended executor of the operation; as in Resource Based Access Control (RBAC) and audit logs UX. Default value is "user,system"
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The intended executor of the operation; as in Resource Based Access Control (RBAC) and audit logs UX. Default value is \"user,system\"",
///  "readOnly": true,
///  "type": "string",
///  "enum": [
///    "user",
///    "system",
///    "user,system"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "Origin"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum OperationOrigin {
    #[serde(rename = "user")]
    User,
    #[serde(rename = "system")]
    System,
    #[serde(rename = "user,system")]
    UserSystem,
}
impl ::std::convert::From<&Self> for OperationOrigin {
    fn from(value: &OperationOrigin) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for OperationOrigin {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::User => f.write_str("user"),
            Self::System => f.write_str("system"),
            Self::UserSystem => f.write_str("user,system"),
        }
    }
}
impl ::std::str::FromStr for OperationOrigin {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "user" => Ok(Self::User),
            "system" => Ok(Self::System),
            "user,system" => Ok(Self::UserSystem),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for OperationOrigin {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for OperationOrigin {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for OperationOrigin {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the orchestration mode for the virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the orchestration mode for the virtual machine scale set.",
///  "type": "string",
///  "enum": [
///    "Uniform",
///    "Flexible"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "OrchestrationMode",
///    "values": [
///      {
///        "name": "Uniform",
///        "value": "Uniform"
///      },
///      {
///        "name": "Flexible",
///        "value": "Flexible"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum OrchestrationMode {
    Uniform,
    Flexible,
}
impl ::std::convert::From<&Self> for OrchestrationMode {
    fn from(value: &OrchestrationMode) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for OrchestrationMode {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Uniform => f.write_str("Uniform"),
            Self::Flexible => f.write_str("Flexible"),
        }
    }
}
impl ::std::str::FromStr for OrchestrationMode {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "uniform" => Ok(Self::Uniform),
            "flexible" => Ok(Self::Flexible),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for OrchestrationMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for OrchestrationMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for OrchestrationMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The name of the service.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The name of the service.",
///  "type": "string",
///  "enum": [
///    "AutomaticRepairs",
///    "AutomaticZoneRebalancing"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "OrchestrationServiceNames",
///    "values": [
///      {
///        "name": "AutomaticRepairs",
///        "value": "AutomaticRepairs"
///      },
///      {
///        "description": "AutomaticZoneRebalancing orchestration service.",
///        "name": "AutomaticZoneRebalancing",
///        "value": "AutomaticZoneRebalancing"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum OrchestrationServiceNames {
    AutomaticRepairs,
    AutomaticZoneRebalancing,
}
impl ::std::convert::From<&Self> for OrchestrationServiceNames {
    fn from(value: &OrchestrationServiceNames) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for OrchestrationServiceNames {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::AutomaticRepairs => f.write_str("AutomaticRepairs"),
            Self::AutomaticZoneRebalancing => f.write_str("AutomaticZoneRebalancing"),
        }
    }
}
impl ::std::str::FromStr for OrchestrationServiceNames {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "automaticrepairs" => Ok(Self::AutomaticRepairs),
            "automaticzonerebalancing" => Ok(Self::AutomaticZoneRebalancing),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for OrchestrationServiceNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for OrchestrationServiceNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for OrchestrationServiceNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The latest operation status of the service.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The latest operation status of the service.",
///  "type": "string",
///  "enum": [
///    "InProgress",
///    "Completed"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "OrchestrationServiceOperationStatus",
///    "values": [
///      {
///        "description": "InProgress orchestration service operation status.",
///        "name": "InProgress",
///        "value": "InProgress"
///      },
///      {
///        "description": "Completed orchestration service operation status.",
///        "name": "Completed",
///        "value": "Completed"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum OrchestrationServiceOperationStatus {
    InProgress,
    Completed,
}
impl ::std::convert::From<&Self> for OrchestrationServiceOperationStatus {
    fn from(value: &OrchestrationServiceOperationStatus) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for OrchestrationServiceOperationStatus {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::InProgress => f.write_str("InProgress"),
            Self::Completed => f.write_str("Completed"),
        }
    }
}
impl ::std::str::FromStr for OrchestrationServiceOperationStatus {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "inprogress" => Ok(Self::InProgress),
            "completed" => Ok(Self::Completed),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for OrchestrationServiceOperationStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for OrchestrationServiceOperationStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for OrchestrationServiceOperationStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The current state of the service.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The current state of the service.",
///  "type": "string",
///  "enum": [
///    "NotRunning",
///    "Running",
///    "Suspended"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "OrchestrationServiceState",
///    "values": [
///      {
///        "name": "NotRunning",
///        "value": "NotRunning"
///      },
///      {
///        "name": "Running",
///        "value": "Running"
///      },
///      {
///        "name": "Suspended",
///        "value": "Suspended"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum OrchestrationServiceState {
    NotRunning,
    Running,
    Suspended,
}
impl ::std::convert::From<&Self> for OrchestrationServiceState {
    fn from(value: &OrchestrationServiceState) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for OrchestrationServiceState {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::NotRunning => f.write_str("NotRunning"),
            Self::Running => f.write_str("Running"),
            Self::Suspended => f.write_str("Suspended"),
        }
    }
}
impl ::std::str::FromStr for OrchestrationServiceState {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "notrunning" => Ok(Self::NotRunning),
            "running" => Ok(Self::Running),
            "suspended" => Ok(Self::Suspended),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for OrchestrationServiceState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for OrchestrationServiceState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for OrchestrationServiceState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The action to be performed.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The action to be performed.",
///  "type": "string",
///  "enum": [
///    "Resume",
///    "Suspend"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "OrchestrationServiceStateAction",
///    "values": [
///      {
///        "name": "Resume",
///        "value": "Resume"
///      },
///      {
///        "name": "Suspend",
///        "value": "Suspend"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum OrchestrationServiceStateAction {
    Resume,
    Suspend,
}
impl ::std::convert::From<&Self> for OrchestrationServiceStateAction {
    fn from(value: &OrchestrationServiceStateAction) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for OrchestrationServiceStateAction {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Resume => f.write_str("Resume"),
            Self::Suspend => f.write_str("Suspend"),
        }
    }
}
impl ::std::str::FromStr for OrchestrationServiceStateAction {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "resume" => Ok(Self::Resume),
            "suspend" => Ok(Self::Suspend),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for OrchestrationServiceStateAction {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for OrchestrationServiceStateAction {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for OrchestrationServiceStateAction {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The input for OrchestrationServiceState
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The input for OrchestrationServiceState",
///  "type": "object",
///  "required": [
///    "action",
///    "serviceName"
///  ],
///  "properties": {
///    "action": {
///      "$ref": "#/components/schemas/OrchestrationServiceStateAction"
///    },
///    "serviceName": {
///      "$ref": "#/components/schemas/OrchestrationServiceNames"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct OrchestrationServiceStateInput {
    pub action: OrchestrationServiceStateAction,
    #[serde(rename = "serviceName")]
    pub service_name: OrchestrationServiceNames,
}
impl ::std::convert::From<&OrchestrationServiceStateInput>
for OrchestrationServiceStateInput {
    fn from(value: &OrchestrationServiceStateInput) -> Self {
        value.clone()
    }
}
///Summary for an orchestration service of a virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Summary for an orchestration service of a virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "lastStatusChangeTime": {
///      "description": "The last UTC time when the operation status changed. Minimum API version for this property is 2025-04-01.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "latestOperationStatus": {
///      "$ref": "#/components/schemas/OrchestrationServiceOperationStatus"
///    },
///    "serviceName": {
///      "$ref": "#/components/schemas/OrchestrationServiceNames"
///    },
///    "serviceState": {
///      "$ref": "#/components/schemas/OrchestrationServiceState"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct OrchestrationServiceSummary {
    ///The last UTC time when the operation status changed. Minimum API version for this property is 2025-04-01.
    #[serde(
        rename = "lastStatusChangeTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_status_change_time: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "latestOperationStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub latest_operation_status: ::std::option::Option<
        OrchestrationServiceOperationStatus,
    >,
    #[serde(
        rename = "serviceName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub service_name: ::std::option::Option<OrchestrationServiceNames>,
    #[serde(
        rename = "serviceState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub service_state: ::std::option::Option<OrchestrationServiceState>,
}
impl ::std::convert::From<&OrchestrationServiceSummary> for OrchestrationServiceSummary {
    fn from(value: &OrchestrationServiceSummary) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for OrchestrationServiceSummary {
    fn default() -> Self {
        Self {
            last_status_change_time: Default::default(),
            latest_operation_status: Default::default(),
            service_name: Default::default(),
            service_state: Default::default(),
        }
    }
}
///Specifies information about the operating system disk used by the virtual machine. For more information about disks, see [About disks and VHDs for Azure virtual machines](https://docs.microsoft.com/azure/virtual-machines/managed-disks-overview).
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the operating system disk used by the virtual machine. For more information about disks, see [About disks and VHDs for Azure virtual machines](https://docs.microsoft.com/azure/virtual-machines/managed-disks-overview).",
///  "type": "object",
///  "required": [
///    "createOption"
///  ],
///  "properties": {
///    "caching": {
///      "$ref": "#/components/schemas/CachingTypes"
///    },
///    "createOption": {
///      "$ref": "#/components/schemas/DiskCreateOptionTypes"
///    },
///    "deleteOption": {
///      "$ref": "#/components/schemas/DiskDeleteOptionTypes"
///    },
///    "diffDiskSettings": {
///      "$ref": "#/components/schemas/DiffDiskSettings"
///    },
///    "diskSizeGB": {
///      "description": "Specifies the size of an empty data disk in gigabytes. This element can be used to overwrite the size of the disk in a virtual machine image. The property 'diskSizeGB' is the number of bytes x 1024^3 for the disk and the value cannot be larger than 1023.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "encryptionSettings": {
///      "$ref": "#/components/schemas/DiskEncryptionSettings"
///    },
///    "image": {
///      "$ref": "#/components/schemas/VirtualHardDisk"
///    },
///    "managedDisk": {
///      "$ref": "#/components/schemas/ManagedDiskParameters"
///    },
///    "name": {
///      "description": "The disk name.",
///      "type": "string"
///    },
///    "osType": {
///      "$ref": "#/components/schemas/OperatingSystemTypes"
///    },
///    "vhd": {
///      "$ref": "#/components/schemas/VirtualHardDisk"
///    },
///    "writeAcceleratorEnabled": {
///      "description": "Specifies whether writeAccelerator should be enabled or disabled on the disk.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct OsDisk {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub caching: ::std::option::Option<CachingTypes>,
    #[serde(rename = "createOption")]
    pub create_option: DiskCreateOptionTypes,
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DiskDeleteOptionTypes>,
    #[serde(
        rename = "diffDiskSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub diff_disk_settings: ::std::option::Option<DiffDiskSettings>,
    ///Specifies the size of an empty data disk in gigabytes. This element can be used to overwrite the size of the disk in a virtual machine image. The property 'diskSizeGB' is the number of bytes x 1024^3 for the disk and the value cannot be larger than 1023.
    #[serde(
        rename = "diskSizeGB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_size_gb: ::std::option::Option<i32>,
    #[serde(
        rename = "encryptionSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub encryption_settings: ::std::option::Option<DiskEncryptionSettings>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub image: ::std::option::Option<VirtualHardDisk>,
    #[serde(
        rename = "managedDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub managed_disk: ::std::option::Option<ManagedDiskParameters>,
    ///The disk name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "osType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_type: ::std::option::Option<OperatingSystemTypes>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vhd: ::std::option::Option<VirtualHardDisk>,
    ///Specifies whether writeAccelerator should be enabled or disabled on the disk.
    #[serde(
        rename = "writeAcceleratorEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub write_accelerator_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&OsDisk> for OsDisk {
    fn from(value: &OsDisk) -> Self {
        value.clone()
    }
}
///Contains the os disk image information.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Contains the os disk image information.",
///  "type": "object",
///  "required": [
///    "operatingSystem"
///  ],
///  "properties": {
///    "operatingSystem": {
///      "$ref": "#/components/schemas/OperatingSystemTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct OsDiskImage {
    #[serde(rename = "operatingSystem")]
    pub operating_system: OperatingSystemTypes,
}
impl ::std::convert::From<&OsDiskImage> for OsDiskImage {
    fn from(value: &OsDiskImage) -> Self {
        value.clone()
    }
}
///`OsImageNotificationProfile`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "enable": {
///      "description": "Specifies whether the OS Image Scheduled event is enabled or disabled.",
///      "type": "boolean"
///    },
///    "notBeforeTimeout": {
///      "description": "Length of time a Virtual Machine being reimaged or having its OS upgraded will have to potentially approve the OS Image Scheduled Event before the event is auto approved (timed out). The configuration is specified in ISO 8601 format, and the value must be 15 minutes (PT15M)",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct OsImageNotificationProfile {
    ///Specifies whether the OS Image Scheduled event is enabled or disabled.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable: ::std::option::Option<bool>,
    ///Length of time a Virtual Machine being reimaged or having its OS upgraded will have to potentially approve the OS Image Scheduled Event before the event is auto approved (timed out). The configuration is specified in ISO 8601 format, and the value must be 15 minutes (PT15M)
    #[serde(
        rename = "notBeforeTimeout",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub not_before_timeout: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&OsImageNotificationProfile> for OsImageNotificationProfile {
    fn from(value: &OsImageNotificationProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for OsImageNotificationProfile {
    fn default() -> Self {
        Self {
            enable: Default::default(),
            not_before_timeout: Default::default(),
        }
    }
}
///Specifies the operating system settings for the virtual machine. Some of the settings cannot be changed once VM is provisioned.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the operating system settings for the virtual machine. Some of the settings cannot be changed once VM is provisioned.",
///  "type": "object",
///  "properties": {
///    "adminPassword": {
///      "description": "Specifies the password of the administrator account. <br><br> **Minimum-length (Windows):** 8 characters <br><br> **Minimum-length (Linux):** 6 characters <br><br> **Max-length (Windows):** 123 characters <br><br> **Max-length (Linux):** 72 characters <br><br> **Complexity requirements:** 3 out of 4 conditions below need to be fulfilled <br> Has lower characters <br>Has upper characters <br> Has a digit <br> Has a special character (Regex match [\\W_]) <br><br> **Disallowed values:** \"abc@123\", \"P@$$w0rd\", \"P@ssw0rd\", \"P@ssword123\", \"Pa$$word\", \"pass@word1\", \"Password!\", \"Password1\", \"Password22\", \"iloveyou!\" <br><br> For resetting the password, see [How to reset the Remote Desktop service or its login password in a Windows VM](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/reset-rdp) <br><br> For resetting root password, see [Manage users, SSH, and check or repair disks on Azure Linux VMs using the VMAccess Extension](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/troubleshoot-ssh-connection)",
///      "type": "string",
///      "format": "password",
///      "x-ms-secret": true
///    },
///    "adminUsername": {
///      "description": "Specifies the name of the administrator account. <br><br> This property cannot be updated after the VM is created. <br><br> **Windows-only restriction:** Cannot end in \".\" <br><br> **Disallowed values:** \"administrator\", \"admin\", \"user\", \"user1\", \"test\", \"user2\", \"test1\", \"user3\", \"admin1\", \"1\", \"123\", \"a\", \"actuser\", \"adm\", \"admin2\", \"aspnet\", \"backup\", \"console\", \"david\", \"guest\", \"john\", \"owner\", \"root\", \"server\", \"sql\", \"support\", \"support_388945a0\", \"sys\", \"test2\", \"test3\", \"user4\", \"user5\". <br><br> **Minimum-length (Linux):** 1  character <br><br> **Max-length (Linux):** 64 characters <br><br> **Max-length (Windows):** 20 characters.",
///      "type": "string"
///    },
///    "allowExtensionOperations": {
///      "description": "Specifies whether extension operations should be allowed on the virtual machine. This may only be set to False when no extensions are present on the virtual machine.",
///      "type": "boolean"
///    },
///    "computerName": {
///      "description": "Specifies the host OS name of the virtual machine. This name cannot be updated after the VM is created. **Max-length (Windows):** 15 characters. **Max-length (Linux):** 64 characters. For naming conventions and restrictions see [Azure infrastructure services implementation guidelines](https://docs.microsoft.com/azure/azure-resource-manager/management/resource-name-rules).",
///      "type": "string"
///    },
///    "customData": {
///      "description": "Specifies a base-64 encoded string of custom data. The base-64 encoded string is decoded to a binary array that is saved as a file on the Virtual Machine. The maximum length of the binary array is 65535 bytes. **Note: Do not pass any secrets or passwords in customData property.** This property cannot be updated after the VM is created. The property 'customData' is passed to the VM to be saved as a file, for more information see [Custom Data on Azure VMs](https://azure.microsoft.com/blog/custom-data-and-cloud-init-on-windows-azure/). For using cloud-init for your Linux VM, see [Using cloud-init to customize a Linux VM during creation](https://docs.microsoft.com/azure/virtual-machines/linux/using-cloud-init).",
///      "type": "string"
///    },
///    "linuxConfiguration": {
///      "$ref": "#/components/schemas/LinuxConfiguration"
///    },
///    "requireGuestProvisionSignal": {
///      "description": "Optional property which must either be set to True or omitted.",
///      "type": "boolean"
///    },
///    "secrets": {
///      "description": "Specifies set of certificates that should be installed onto the virtual machine. To install certificates on a virtual machine it is recommended to use the [Azure Key Vault virtual machine extension for Linux](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-linux) or the [Azure Key Vault virtual machine extension for Windows](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-windows).",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VaultSecretGroup"
///      },
///      "x-ms-identifiers": [
///        "sourceVault/id"
///      ]
///    },
///    "windowsConfiguration": {
///      "$ref": "#/components/schemas/WindowsConfiguration"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct OsProfile {
    ///Specifies the password of the administrator account. <br><br> **Minimum-length (Windows):** 8 characters <br><br> **Minimum-length (Linux):** 6 characters <br><br> **Max-length (Windows):** 123 characters <br><br> **Max-length (Linux):** 72 characters <br><br> **Complexity requirements:** 3 out of 4 conditions below need to be fulfilled <br> Has lower characters <br>Has upper characters <br> Has a digit <br> Has a special character (Regex match [\W_]) <br><br> **Disallowed values:** "abc@123", "P@$$w0rd", "P@ssw0rd", "P@ssword123", "Pa$$word", "pass@word1", "Password!", "Password1", "Password22", "iloveyou!" <br><br> For resetting the password, see [How to reset the Remote Desktop service or its login password in a Windows VM](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/reset-rdp) <br><br> For resetting root password, see [Manage users, SSH, and check or repair disks on Azure Linux VMs using the VMAccess Extension](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/troubleshoot-ssh-connection)
    #[serde(
        rename = "adminPassword",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub admin_password: ::std::option::Option<::std::string::String>,
    ///Specifies the name of the administrator account. <br><br> This property cannot be updated after the VM is created. <br><br> **Windows-only restriction:** Cannot end in "." <br><br> **Disallowed values:** "administrator", "admin", "user", "user1", "test", "user2", "test1", "user3", "admin1", "1", "123", "a", "actuser", "adm", "admin2", "aspnet", "backup", "console", "david", "guest", "john", "owner", "root", "server", "sql", "support", "support_388945a0", "sys", "test2", "test3", "user4", "user5". <br><br> **Minimum-length (Linux):** 1  character <br><br> **Max-length (Linux):** 64 characters <br><br> **Max-length (Windows):** 20 characters.
    #[serde(
        rename = "adminUsername",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub admin_username: ::std::option::Option<::std::string::String>,
    ///Specifies whether extension operations should be allowed on the virtual machine. This may only be set to False when no extensions are present on the virtual machine.
    #[serde(
        rename = "allowExtensionOperations",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub allow_extension_operations: ::std::option::Option<bool>,
    ///Specifies the host OS name of the virtual machine. This name cannot be updated after the VM is created. **Max-length (Windows):** 15 characters. **Max-length (Linux):** 64 characters. For naming conventions and restrictions see [Azure infrastructure services implementation guidelines](https://docs.microsoft.com/azure/azure-resource-manager/management/resource-name-rules).
    #[serde(
        rename = "computerName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub computer_name: ::std::option::Option<::std::string::String>,
    ///Specifies a base-64 encoded string of custom data. The base-64 encoded string is decoded to a binary array that is saved as a file on the Virtual Machine. The maximum length of the binary array is 65535 bytes. **Note: Do not pass any secrets or passwords in customData property.** This property cannot be updated after the VM is created. The property 'customData' is passed to the VM to be saved as a file, for more information see [Custom Data on Azure VMs](https://azure.microsoft.com/blog/custom-data-and-cloud-init-on-windows-azure/). For using cloud-init for your Linux VM, see [Using cloud-init to customize a Linux VM during creation](https://docs.microsoft.com/azure/virtual-machines/linux/using-cloud-init).
    #[serde(
        rename = "customData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub custom_data: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "linuxConfiguration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub linux_configuration: ::std::option::Option<LinuxConfiguration>,
    ///Optional property which must either be set to True or omitted.
    #[serde(
        rename = "requireGuestProvisionSignal",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub require_guest_provision_signal: ::std::option::Option<bool>,
    ///Specifies set of certificates that should be installed onto the virtual machine. To install certificates on a virtual machine it is recommended to use the [Azure Key Vault virtual machine extension for Linux](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-linux) or the [Azure Key Vault virtual machine extension for Windows](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-windows).
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub secrets: ::std::vec::Vec<VaultSecretGroup>,
    #[serde(
        rename = "windowsConfiguration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub windows_configuration: ::std::option::Option<WindowsConfiguration>,
}
impl ::std::convert::From<&OsProfile> for OsProfile {
    fn from(value: &OsProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for OsProfile {
    fn default() -> Self {
        Self {
            admin_password: Default::default(),
            admin_username: Default::default(),
            allow_extension_operations: Default::default(),
            computer_name: Default::default(),
            custom_data: Default::default(),
            linux_configuration: Default::default(),
            require_guest_provision_signal: Default::default(),
            secrets: Default::default(),
            windows_configuration: Default::default(),
        }
    }
}
///Additional parameters for Reimaging Non-Ephemeral Virtual Machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Additional parameters for Reimaging Non-Ephemeral Virtual Machine.",
///  "type": "object",
///  "properties": {
///    "adminPassword": {
///      "description": "Specifies the password of the administrator account. <br><br> **Minimum-length (Windows):** 8 characters <br><br> **Minimum-length (Linux):** 6 characters <br><br> **Max-length (Windows):** 123 characters <br><br> **Max-length (Linux):** 72 characters <br><br> **Complexity requirements:** 3 out of 4 conditions below need to be fulfilled <br> Has lower characters <br>Has upper characters <br> Has a digit <br> Has a special character (Regex match [\\W_]) <br><br> **Disallowed values:** \"abc@123\", \"P@$$w0rd\", \"P@ssw0rd\", \"P@ssword123\", \"Pa$$word\", \"pass@word1\", \"Password!\", \"Password1\", \"Password22\", \"iloveyou!\" <br><br> For resetting the password, see [How to reset the Remote Desktop service or its login password in a Windows VM](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/reset-rdp) <br><br> For resetting root password, see [Manage users, SSH, and check or repair disks on Azure Linux VMs using the VMAccess Extension](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/troubleshoot-ssh-connection)",
///      "type": "string",
///      "format": "password",
///      "x-ms-secret": true
///    },
///    "customData": {
///      "description": "Specifies a base-64 encoded string of custom data. The base-64 encoded string is decoded to a binary array that is saved as a file on the Virtual Machine. The maximum length of the binary array is 65535 bytes. **Note: Do not pass any secrets or passwords in customData property.** This property cannot be updated after the VM is created. The property customData is passed to the VM to be saved as a file, for more information see [Custom Data on Azure VMs](https://azure.microsoft.com/blog/custom-data-and-cloud-init-on-windows-azure/). If using cloud-init for your Linux VM, see [Using cloud-init to customize a Linux VM during creation](https://docs.microsoft.com/azure/virtual-machines/linux/using-cloud-init).",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct OsProfileProvisioningData {
    ///Specifies the password of the administrator account. <br><br> **Minimum-length (Windows):** 8 characters <br><br> **Minimum-length (Linux):** 6 characters <br><br> **Max-length (Windows):** 123 characters <br><br> **Max-length (Linux):** 72 characters <br><br> **Complexity requirements:** 3 out of 4 conditions below need to be fulfilled <br> Has lower characters <br>Has upper characters <br> Has a digit <br> Has a special character (Regex match [\W_]) <br><br> **Disallowed values:** "abc@123", "P@$$w0rd", "P@ssw0rd", "P@ssword123", "Pa$$word", "pass@word1", "Password!", "Password1", "Password22", "iloveyou!" <br><br> For resetting the password, see [How to reset the Remote Desktop service or its login password in a Windows VM](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/reset-rdp) <br><br> For resetting root password, see [Manage users, SSH, and check or repair disks on Azure Linux VMs using the VMAccess Extension](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/troubleshoot-ssh-connection)
    #[serde(
        rename = "adminPassword",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub admin_password: ::std::option::Option<::std::string::String>,
    ///Specifies a base-64 encoded string of custom data. The base-64 encoded string is decoded to a binary array that is saved as a file on the Virtual Machine. The maximum length of the binary array is 65535 bytes. **Note: Do not pass any secrets or passwords in customData property.** This property cannot be updated after the VM is created. The property customData is passed to the VM to be saved as a file, for more information see [Custom Data on Azure VMs](https://azure.microsoft.com/blog/custom-data-and-cloud-init-on-windows-azure/). If using cloud-init for your Linux VM, see [Using cloud-init to customize a Linux VM during creation](https://docs.microsoft.com/azure/virtual-machines/linux/using-cloud-init).
    #[serde(
        rename = "customData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub custom_data: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&OsProfileProvisioningData> for OsProfileProvisioningData {
    fn from(value: &OsProfileProvisioningData) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for OsProfileProvisioningData {
    fn default() -> Self {
        Self {
            admin_password: Default::default(),
            custom_data: Default::default(),
        }
    }
}
///`PassNames`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "OobeSystem"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum PassNames {
    OobeSystem,
}
impl ::std::convert::From<&Self> for PassNames {
    fn from(value: &PassNames) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for PassNames {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::OobeSystem => f.write_str("OobeSystem"),
        }
    }
}
impl ::std::str::FromStr for PassNames {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "oobesystem" => Ok(Self::OobeSystem),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for PassNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for PassNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for PassNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes the availability of a given patch.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the availability of a given patch.",
///  "type": "string",
///  "enum": [
///    "Unknown",
///    "Available"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "PatchAssessmentState",
///    "values": [
///      {
///        "name": "Unknown",
///        "value": "Unknown"
///      },
///      {
///        "name": "Available",
///        "value": "Available"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum PatchAssessmentState {
    Unknown,
    Available,
}
impl ::std::convert::From<&Self> for PatchAssessmentState {
    fn from(value: &PatchAssessmentState) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for PatchAssessmentState {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Unknown => f.write_str("Unknown"),
            Self::Available => f.write_str("Available"),
        }
    }
}
impl ::std::str::FromStr for PatchAssessmentState {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "unknown" => Ok(Self::Unknown),
            "available" => Ok(Self::Available),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for PatchAssessmentState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for PatchAssessmentState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for PatchAssessmentState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Information about a specific patch that was encountered during an installation action.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Information about a specific patch that was encountered during an installation action.",
///  "type": "object",
///  "properties": {
///    "classifications": {
///      "description": "The classification(s) of the patch as provided by the patch publisher.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "installationState": {
///      "$ref": "#/components/schemas/PatchInstallationState"
///    },
///    "kbId": {
///      "description": "The KBID of the patch. Only applies to Windows patches.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "name": {
///      "description": "The friendly name of the patch.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "patchId": {
///      "description": "A unique identifier for the patch.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "version": {
///      "description": "The version string of the package. It may conform to Semantic Versioning. Only applies to Linux.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct PatchInstallationDetail {
    ///The classification(s) of the patch as provided by the patch publisher.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub classifications: ::std::vec::Vec<::std::string::String>,
    #[serde(
        rename = "installationState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub installation_state: ::std::option::Option<PatchInstallationState>,
    ///The KBID of the patch. Only applies to Windows patches.
    #[serde(
        rename = "kbId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub kb_id: ::std::option::Option<::std::string::String>,
    ///The friendly name of the patch.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///A unique identifier for the patch.
    #[serde(
        rename = "patchId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub patch_id: ::std::option::Option<::std::string::String>,
    ///The version string of the package. It may conform to Semantic Versioning. Only applies to Linux.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub version: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&PatchInstallationDetail> for PatchInstallationDetail {
    fn from(value: &PatchInstallationDetail) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for PatchInstallationDetail {
    fn default() -> Self {
        Self {
            classifications: Default::default(),
            installation_state: Default::default(),
            kb_id: Default::default(),
            name: Default::default(),
            patch_id: Default::default(),
            version: Default::default(),
        }
    }
}
///The state of the patch after the installation operation completed.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The state of the patch after the installation operation completed.",
///  "type": "string",
///  "enum": [
///    "Unknown",
///    "Installed",
///    "Failed",
///    "Excluded",
///    "NotSelected",
///    "Pending"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "PatchInstallationState",
///    "values": [
///      {
///        "name": "Unknown",
///        "value": "Unknown"
///      },
///      {
///        "name": "Installed",
///        "value": "Installed"
///      },
///      {
///        "name": "Failed",
///        "value": "Failed"
///      },
///      {
///        "name": "Excluded",
///        "value": "Excluded"
///      },
///      {
///        "name": "NotSelected",
///        "value": "NotSelected"
///      },
///      {
///        "name": "Pending",
///        "value": "Pending"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum PatchInstallationState {
    Unknown,
    Installed,
    Failed,
    Excluded,
    NotSelected,
    Pending,
}
impl ::std::convert::From<&Self> for PatchInstallationState {
    fn from(value: &PatchInstallationState) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for PatchInstallationState {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Unknown => f.write_str("Unknown"),
            Self::Installed => f.write_str("Installed"),
            Self::Failed => f.write_str("Failed"),
            Self::Excluded => f.write_str("Excluded"),
            Self::NotSelected => f.write_str("NotSelected"),
            Self::Pending => f.write_str("Pending"),
        }
    }
}
impl ::std::str::FromStr for PatchInstallationState {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "unknown" => Ok(Self::Unknown),
            "installed" => Ok(Self::Installed),
            "failed" => Ok(Self::Failed),
            "excluded" => Ok(Self::Excluded),
            "notselected" => Ok(Self::NotSelected),
            "pending" => Ok(Self::Pending),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for PatchInstallationState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for PatchInstallationState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for PatchInstallationState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The overall success or failure status of the operation. It remains "InProgress" until the operation completes. At that point it will become "Unknown", "Failed", "Succeeded", or "CompletedWithWarnings."
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The overall success or failure status of the operation. It remains \"InProgress\" until the operation completes. At that point it will become \"Unknown\", \"Failed\", \"Succeeded\", or \"CompletedWithWarnings.\"",
///  "type": "string",
///  "enum": [
///    "Unknown",
///    "InProgress",
///    "Failed",
///    "Succeeded",
///    "CompletedWithWarnings"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "PatchOperationStatus",
///    "values": [
///      {
///        "name": "Unknown",
///        "value": "Unknown"
///      },
///      {
///        "name": "InProgress",
///        "value": "InProgress"
///      },
///      {
///        "name": "Failed",
///        "value": "Failed"
///      },
///      {
///        "name": "Succeeded",
///        "value": "Succeeded"
///      },
///      {
///        "name": "CompletedWithWarnings",
///        "value": "CompletedWithWarnings"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum PatchOperationStatus {
    Unknown,
    InProgress,
    Failed,
    Succeeded,
    CompletedWithWarnings,
}
impl ::std::convert::From<&Self> for PatchOperationStatus {
    fn from(value: &PatchOperationStatus) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for PatchOperationStatus {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Unknown => f.write_str("Unknown"),
            Self::InProgress => f.write_str("InProgress"),
            Self::Failed => f.write_str("Failed"),
            Self::Succeeded => f.write_str("Succeeded"),
            Self::CompletedWithWarnings => f.write_str("CompletedWithWarnings"),
        }
    }
}
impl ::std::str::FromStr for PatchOperationStatus {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "unknown" => Ok(Self::Unknown),
            "inprogress" => Ok(Self::InProgress),
            "failed" => Ok(Self::Failed),
            "succeeded" => Ok(Self::Succeeded),
            "completedwithwarnings" => Ok(Self::CompletedWithWarnings),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for PatchOperationStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for PatchOperationStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for PatchOperationStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies settings related to VM Guest Patching on Windows.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies settings related to VM Guest Patching on Windows.",
///  "type": "object",
///  "properties": {
///    "assessmentMode": {
///      "$ref": "#/components/schemas/WindowsPatchAssessmentMode"
///    },
///    "automaticByPlatformSettings": {
///      "$ref": "#/components/schemas/WindowsVMGuestPatchAutomaticByPlatformSettings"
///    },
///    "enableHotpatching": {
///      "description": "Enables customers to patch their Azure VMs without requiring a reboot. For enableHotpatching, the 'provisionVMAgent' must be set to true and 'patchMode' must be set to 'AutomaticByPlatform'.",
///      "type": "boolean"
///    },
///    "patchMode": {
///      "$ref": "#/components/schemas/WindowsVMGuestPatchMode"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct PatchSettings {
    #[serde(
        rename = "assessmentMode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub assessment_mode: ::std::option::Option<WindowsPatchAssessmentMode>,
    #[serde(
        rename = "automaticByPlatformSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub automatic_by_platform_settings: ::std::option::Option<
        WindowsVmGuestPatchAutomaticByPlatformSettings,
    >,
    ///Enables customers to patch their Azure VMs without requiring a reboot. For enableHotpatching, the 'provisionVMAgent' must be set to true and 'patchMode' must be set to 'AutomaticByPlatform'.
    #[serde(
        rename = "enableHotpatching",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_hotpatching: ::std::option::Option<bool>,
    #[serde(
        rename = "patchMode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub patch_mode: ::std::option::Option<WindowsVmGuestPatchMode>,
}
impl ::std::convert::From<&PatchSettings> for PatchSettings {
    fn from(value: &PatchSettings) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for PatchSettings {
    fn default() -> Self {
        Self {
            assessment_mode: Default::default(),
            automatic_by_platform_settings: Default::default(),
            enable_hotpatching: Default::default(),
            patch_mode: Default::default(),
        }
    }
}
///Describes the user-defined constraints for resource hardware placement.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the user-defined constraints for resource hardware placement.",
///  "type": "object",
///  "properties": {
///    "excludeZones": {
///      "description": "This property supplements the 'zonePlacementPolicy' property. If 'zonePlacementPolicy' is set to 'Any'/'Auto', availability zone selected by the system must not be present in the list of availability zones passed with 'excludeZones'. If 'excludeZones' is not provided, all availability zones in region will be considered for selection.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "includeZones": {
///      "description": "This property supplements the 'zonePlacementPolicy' property. If 'zonePlacementPolicy' is set to 'Any'/'Auto', availability zone selected by the system must be present in the list of availability zones passed with 'includeZones'. If 'includeZones' is not provided, all availability zones in region will be considered for selection.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "zonePlacementPolicy": {
///      "$ref": "#/components/schemas/ZonePlacementPolicyType"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct Placement {
    ///This property supplements the 'zonePlacementPolicy' property. If 'zonePlacementPolicy' is set to 'Any'/'Auto', availability zone selected by the system must not be present in the list of availability zones passed with 'excludeZones'. If 'excludeZones' is not provided, all availability zones in region will be considered for selection.
    #[serde(
        rename = "excludeZones",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub exclude_zones: ::std::vec::Vec<::std::string::String>,
    ///This property supplements the 'zonePlacementPolicy' property. If 'zonePlacementPolicy' is set to 'Any'/'Auto', availability zone selected by the system must be present in the list of availability zones passed with 'includeZones'. If 'includeZones' is not provided, all availability zones in region will be considered for selection.
    #[serde(
        rename = "includeZones",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub include_zones: ::std::vec::Vec<::std::string::String>,
    #[serde(
        rename = "zonePlacementPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zone_placement_policy: ::std::option::Option<ZonePlacementPolicyType>,
}
impl ::std::convert::From<&Placement> for Placement {
    fn from(value: &Placement) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for Placement {
    fn default() -> Self {
        Self {
            exclude_zones: Default::default(),
            include_zones: Default::default(),
            zone_placement_policy: Default::default(),
        }
    }
}
///Specifies information about the marketplace image used to create the virtual machine. This element is only used for marketplace images. Before you can use a marketplace image from an API, you must enable the image for programmatic use.  In the Azure portal, find the marketplace image that you want to use and then click **Want to deploy programmatically, Get Started ->**. Enter any required information and then click **Save**.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the marketplace image used to create the virtual machine. This element is only used for marketplace images. Before you can use a marketplace image from an API, you must enable the image for programmatic use.  In the Azure portal, find the marketplace image that you want to use and then click **Want to deploy programmatically, Get Started ->**. Enter any required information and then click **Save**.",
///  "type": "object",
///  "properties": {
///    "name": {
///      "description": "The plan ID.",
///      "type": "string"
///    },
///    "product": {
///      "description": "Specifies the product of the image from the marketplace. This is the same value as Offer under the imageReference element.",
///      "type": "string"
///    },
///    "promotionCode": {
///      "description": "The promotion code.",
///      "type": "string"
///    },
///    "publisher": {
///      "description": "The publisher ID.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct Plan {
    ///The plan ID.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///Specifies the product of the image from the marketplace. This is the same value as Offer under the imageReference element.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub product: ::std::option::Option<::std::string::String>,
    ///The promotion code.
    #[serde(
        rename = "promotionCode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub promotion_code: ::std::option::Option<::std::string::String>,
    ///The publisher ID.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub publisher: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&Plan> for Plan {
    fn from(value: &Plan) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for Plan {
    fn default() -> Self {
        Self {
            name: Default::default(),
            product: Default::default(),
            promotion_code: Default::default(),
            publisher: Default::default(),
        }
    }
}
///Specifies the target splits for Spot and Regular priority VMs within a scale set with flexible orchestration mode. With this property the customer is able to specify the base number of regular priority VMs created as the VMSS flex instance scales out and the split between Spot and Regular priority VMs after this base target has been reached.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the target splits for Spot and Regular priority VMs within a scale set with flexible orchestration mode. With this property the customer is able to specify the base number of regular priority VMs created as the VMSS flex instance scales out and the split between Spot and Regular priority VMs after this base target has been reached.",
///  "type": "object",
///  "properties": {
///    "baseRegularPriorityCount": {
///      "description": "The base number of regular priority VMs that will be created in this scale set as it scales out.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "regularPriorityPercentageAboveBase": {
///      "description": "The percentage of VM instances, after the base regular priority count has been reached, that are expected to use regular priority.",
///      "type": "integer",
///      "format": "int32",
///      "maximum": 100.0
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct PriorityMixPolicy {
    ///The base number of regular priority VMs that will be created in this scale set as it scales out.
    #[serde(
        rename = "baseRegularPriorityCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub base_regular_priority_count: ::std::option::Option<i32>,
    ///The percentage of VM instances, after the base regular priority count has been reached, that are expected to use regular priority.
    #[serde(
        rename = "regularPriorityPercentageAboveBase",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub regular_priority_percentage_above_base: ::std::option::Option<i32>,
}
impl ::std::convert::From<&PriorityMixPolicy> for PriorityMixPolicy {
    fn from(value: &PriorityMixPolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for PriorityMixPolicy {
    fn default() -> Self {
        Self {
            base_regular_priority_count: Default::default(),
            regular_priority_percentage_above_base: Default::default(),
        }
    }
}
///Specifies the protocol of WinRM listener. Possible values are: **http,** **https.**
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the protocol of WinRM listener. Possible values are: **http,** **https.**",
///  "type": "string",
///  "enum": [
///    "Http",
///    "Https"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "ProtocolTypes"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ProtocolTypes {
    Http,
    Https,
}
impl ::std::convert::From<&Self> for ProtocolTypes {
    fn from(value: &ProtocolTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ProtocolTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Http => f.write_str("Http"),
            Self::Https => f.write_str("Https"),
        }
    }
}
impl ::std::str::FromStr for ProtocolTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "http" => Ok(Self::Http),
            "https" => Ok(Self::Https),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ProtocolTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ProtocolTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ProtocolTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies information about the proximity placement group.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the proximity placement group.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/ProximityPlacementGroupProperties"
///    },
///    "zones": {
///      "description": "The availability zones.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ProximityPlacementGroup {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<ProximityPlacementGroupProperties>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///The availability zones.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zones: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&ProximityPlacementGroup> for ProximityPlacementGroup {
    fn from(value: &ProximityPlacementGroup) -> Self {
        value.clone()
    }
}
///The List Proximity Placement Group operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Proximity Placement Group operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The URI to fetch the next page of proximity placement groups.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of proximity placement groups.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/ProximityPlacementGroup"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ProximityPlacementGroupListResult {
    ///The URI to fetch the next page of proximity placement groups.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of proximity placement groups.
    pub value: ::std::vec::Vec<ProximityPlacementGroup>,
}
impl ::std::convert::From<&ProximityPlacementGroupListResult>
for ProximityPlacementGroupListResult {
    fn from(value: &ProximityPlacementGroupListResult) -> Self {
        value.clone()
    }
}
///Describes the properties of a Proximity Placement Group.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Proximity Placement Group.",
///  "type": "object",
///  "properties": {
///    "availabilitySets": {
///      "description": "A list of references to all availability sets in the proximity placement group.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResourceWithColocationStatus"
///      }
///    },
///    "colocationStatus": {
///      "$ref": "#/components/schemas/InstanceViewStatus"
///    },
///    "intent": {
///      "$ref": "#/components/schemas/ProximityPlacementGroupPropertiesIntent"
///    },
///    "proximityPlacementGroupType": {
///      "$ref": "#/components/schemas/ProximityPlacementGroupType"
///    },
///    "virtualMachineScaleSets": {
///      "description": "A list of references to all virtual machine scale sets in the proximity placement group.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResourceWithColocationStatus"
///      }
///    },
///    "virtualMachines": {
///      "description": "A list of references to all virtual machines in the proximity placement group.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResourceWithColocationStatus"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ProximityPlacementGroupProperties {
    ///A list of references to all availability sets in the proximity placement group.
    #[serde(
        rename = "availabilitySets",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub availability_sets: ::std::vec::Vec<SubResourceWithColocationStatus>,
    #[serde(
        rename = "colocationStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub colocation_status: ::std::option::Option<InstanceViewStatus>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub intent: ::std::option::Option<ProximityPlacementGroupPropertiesIntent>,
    #[serde(
        rename = "proximityPlacementGroupType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub proximity_placement_group_type: ::std::option::Option<
        ProximityPlacementGroupType,
    >,
    ///A list of references to all virtual machine scale sets in the proximity placement group.
    #[serde(
        rename = "virtualMachineScaleSets",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machine_scale_sets: ::std::vec::Vec<SubResourceWithColocationStatus>,
    ///A list of references to all virtual machines in the proximity placement group.
    #[serde(
        rename = "virtualMachines",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machines: ::std::vec::Vec<SubResourceWithColocationStatus>,
}
impl ::std::convert::From<&ProximityPlacementGroupProperties>
for ProximityPlacementGroupProperties {
    fn from(value: &ProximityPlacementGroupProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ProximityPlacementGroupProperties {
    fn default() -> Self {
        Self {
            availability_sets: Default::default(),
            colocation_status: Default::default(),
            intent: Default::default(),
            proximity_placement_group_type: Default::default(),
            virtual_machine_scale_sets: Default::default(),
            virtual_machines: Default::default(),
        }
    }
}
///Specifies the user intent of the proximity placement group.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the user intent of the proximity placement group.",
///  "type": "object",
///  "properties": {
///    "vmSizes": {
///      "description": "Specifies possible sizes of virtual machines that can be created in the proximity placement group.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ProximityPlacementGroupPropertiesIntent {
    ///Specifies possible sizes of virtual machines that can be created in the proximity placement group.
    #[serde(
        rename = "vmSizes",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_sizes: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&ProximityPlacementGroupPropertiesIntent>
for ProximityPlacementGroupPropertiesIntent {
    fn from(value: &ProximityPlacementGroupPropertiesIntent) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ProximityPlacementGroupPropertiesIntent {
    fn default() -> Self {
        Self {
            vm_sizes: Default::default(),
        }
    }
}
///Specifies the type of the proximity placement group. Possible values are: **Standard** : Co-locate resources within an Azure region or Availability Zone. **Ultra** : For future use.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the type of the proximity placement group. Possible values are: **Standard** : Co-locate resources within an Azure region or Availability Zone. **Ultra** : For future use.",
///  "type": "string",
///  "enum": [
///    "Standard",
///    "Ultra"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ProximityPlacementGroupType",
///    "values": [
///      {
///        "name": "Standard",
///        "value": "Standard"
///      },
///      {
///        "name": "Ultra",
///        "value": "Ultra"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ProximityPlacementGroupType {
    Standard,
    Ultra,
}
impl ::std::convert::From<&Self> for ProximityPlacementGroupType {
    fn from(value: &ProximityPlacementGroupType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ProximityPlacementGroupType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Standard => f.write_str("Standard"),
            Self::Ultra => f.write_str("Ultra"),
        }
    }
}
impl ::std::str::FromStr for ProximityPlacementGroupType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "standard" => Ok(Self::Standard),
            "ultra" => Ok(Self::Ultra),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ProximityPlacementGroupType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ProximityPlacementGroupType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ProximityPlacementGroupType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies information about the proximity placement group.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the proximity placement group.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ]
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(transparent)]
pub struct ProximityPlacementGroupUpdate(pub UpdateResource);
impl ::std::ops::Deref for ProximityPlacementGroupUpdate {
    type Target = UpdateResource;
    fn deref(&self) -> &UpdateResource {
        &self.0
    }
}
impl ::std::convert::From<ProximityPlacementGroupUpdate> for UpdateResource {
    fn from(value: ProximityPlacementGroupUpdate) -> Self {
        value.0
    }
}
impl ::std::convert::From<&ProximityPlacementGroupUpdate>
for ProximityPlacementGroupUpdate {
    fn from(value: &ProximityPlacementGroupUpdate) -> Self {
        value.clone()
    }
}
impl ::std::convert::From<UpdateResource> for ProximityPlacementGroupUpdate {
    fn from(value: UpdateResource) -> Self {
        Self(value)
    }
}
///Specifies ProxyAgent settings for the virtual machine or virtual machine scale set. Minimum api-version: 2023-09-01.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies ProxyAgent settings for the virtual machine or virtual machine scale set. Minimum api-version: 2023-09-01.",
///  "type": "object",
///  "properties": {
///    "addProxyAgentExtension": {
///      "description": "Specify whether to implicitly install the ProxyAgent Extension. This option is currently applicable only for Linux Os.",
///      "type": "boolean"
///    },
///    "enabled": {
///      "description": "Specifies whether ProxyAgent feature should be enabled on the virtual machine or virtual machine scale set.",
///      "type": "boolean"
///    },
///    "imds": {
///      "$ref": "#/components/schemas/HostEndpointSettings"
///    },
///    "keyIncarnationId": {
///      "description": "Increase the value of this property allows users to reset the key used for securing communication channel between guest and host.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "mode": {
///      "$ref": "#/components/schemas/Mode"
///    },
///    "wireServer": {
///      "$ref": "#/components/schemas/HostEndpointSettings"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ProxyAgentSettings {
    ///Specify whether to implicitly install the ProxyAgent Extension. This option is currently applicable only for Linux Os.
    #[serde(
        rename = "addProxyAgentExtension",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub add_proxy_agent_extension: ::std::option::Option<bool>,
    ///Specifies whether ProxyAgent feature should be enabled on the virtual machine or virtual machine scale set.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enabled: ::std::option::Option<bool>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub imds: ::std::option::Option<HostEndpointSettings>,
    ///Increase the value of this property allows users to reset the key used for securing communication channel between guest and host.
    #[serde(
        rename = "keyIncarnationId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub key_incarnation_id: ::std::option::Option<i32>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub mode: ::std::option::Option<Mode>,
    #[serde(
        rename = "wireServer",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub wire_server: ::std::option::Option<HostEndpointSettings>,
}
impl ::std::convert::From<&ProxyAgentSettings> for ProxyAgentSettings {
    fn from(value: &ProxyAgentSettings) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ProxyAgentSettings {
    fn default() -> Self {
        Self {
            add_proxy_agent_extension: Default::default(),
            enabled: Default::default(),
            imds: Default::default(),
            key_incarnation_id: Default::default(),
            mode: Default::default(),
            wire_server: Default::default(),
        }
    }
}
///The resource model definition for a Azure Resource Manager proxy resource. It will not have tags and a location
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "title": "Proxy Resource",
///  "description": "The resource model definition for a Azure Resource Manager proxy resource. It will not have tags and a location",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/Resource"
///    }
///  ]
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(transparent)]
pub struct ProxyResource(pub Resource);
impl ::std::ops::Deref for ProxyResource {
    type Target = Resource;
    fn deref(&self) -> &Resource {
        &self.0
    }
}
impl ::std::convert::From<ProxyResource> for Resource {
    fn from(value: ProxyResource) -> Self {
        value.0
    }
}
impl ::std::convert::From<&ProxyResource> for ProxyResource {
    fn from(value: &ProxyResource) -> Self {
        value.clone()
    }
}
impl ::std::convert::From<Resource> for ProxyResource {
    fn from(value: Resource) -> Self {
        Self(value)
    }
}
///Describes the public IP Sku. It can only be set with OrchestrationMode as Flexible.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the public IP Sku. It can only be set with OrchestrationMode as Flexible.",
///  "type": "object",
///  "properties": {
///    "name": {
///      "$ref": "#/components/schemas/PublicIPAddressSkuName"
///    },
///    "tier": {
///      "$ref": "#/components/schemas/PublicIPAddressSkuTier"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct PublicIpAddressSku {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<PublicIpAddressSkuName>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tier: ::std::option::Option<PublicIpAddressSkuTier>,
}
impl ::std::convert::From<&PublicIpAddressSku> for PublicIpAddressSku {
    fn from(value: &PublicIpAddressSku) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for PublicIpAddressSku {
    fn default() -> Self {
        Self {
            name: Default::default(),
            tier: Default::default(),
        }
    }
}
///Specify public IP sku name
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specify public IP sku name",
///  "type": "string",
///  "enum": [
///    "Basic",
///    "Standard"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "PublicIPAddressSkuName",
///    "values": [
///      {
///        "name": "Basic",
///        "value": "Basic"
///      },
///      {
///        "name": "Standard",
///        "value": "Standard"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum PublicIpAddressSkuName {
    Basic,
    Standard,
}
impl ::std::convert::From<&Self> for PublicIpAddressSkuName {
    fn from(value: &PublicIpAddressSkuName) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for PublicIpAddressSkuName {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Basic => f.write_str("Basic"),
            Self::Standard => f.write_str("Standard"),
        }
    }
}
impl ::std::str::FromStr for PublicIpAddressSkuName {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "basic" => Ok(Self::Basic),
            "standard" => Ok(Self::Standard),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for PublicIpAddressSkuName {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for PublicIpAddressSkuName {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for PublicIpAddressSkuName {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specify public IP sku tier
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specify public IP sku tier",
///  "type": "string",
///  "enum": [
///    "Regional",
///    "Global"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "PublicIPAddressSkuTier",
///    "values": [
///      {
///        "name": "Regional",
///        "value": "Regional"
///      },
///      {
///        "name": "Global",
///        "value": "Global"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum PublicIpAddressSkuTier {
    Regional,
    Global,
}
impl ::std::convert::From<&Self> for PublicIpAddressSkuTier {
    fn from(value: &PublicIpAddressSkuTier) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for PublicIpAddressSkuTier {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Regional => f.write_str("Regional"),
            Self::Global => f.write_str("Global"),
        }
    }
}
impl ::std::str::FromStr for PublicIpAddressSkuTier {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "regional" => Ok(Self::Regional),
            "global" => Ok(Self::Global),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for PublicIpAddressSkuTier {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for PublicIpAddressSkuTier {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for PublicIpAddressSkuTier {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specify the public IP allocation type
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specify the public IP allocation type",
///  "type": "string",
///  "enum": [
///    "Dynamic",
///    "Static"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "PublicIPAllocationMethod",
///    "values": [
///      {
///        "name": "Dynamic",
///        "value": "Dynamic"
///      },
///      {
///        "name": "Static",
///        "value": "Static"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum PublicIpAllocationMethod {
    Dynamic,
    Static,
}
impl ::std::convert::From<&Self> for PublicIpAllocationMethod {
    fn from(value: &PublicIpAllocationMethod) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for PublicIpAllocationMethod {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Dynamic => f.write_str("Dynamic"),
            Self::Static => f.write_str("Static"),
        }
    }
}
impl ::std::str::FromStr for PublicIpAllocationMethod {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "dynamic" => Ok(Self::Dynamic),
            "static" => Ok(Self::Static),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for PublicIpAllocationMethod {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for PublicIpAllocationMethod {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for PublicIpAllocationMethod {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Used for establishing the purchase context of any 3rd Party artifact through MarketPlace.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Used for establishing the purchase context of any 3rd Party artifact through MarketPlace.",
///  "type": "object",
///  "required": [
///    "name",
///    "product",
///    "publisher"
///  ],
///  "properties": {
///    "name": {
///      "description": "The plan ID.",
///      "type": "string"
///    },
///    "product": {
///      "description": "Specifies the product of the image from the marketplace. This is the same value as Offer under the imageReference element.",
///      "type": "string"
///    },
///    "publisher": {
///      "description": "The publisher ID.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct PurchasePlan {
    ///The plan ID.
    pub name: ::std::string::String,
    ///Specifies the product of the image from the marketplace. This is the same value as Offer under the imageReference element.
    pub product: ::std::string::String,
    ///The publisher ID.
    pub publisher: ::std::string::String,
}
impl ::std::convert::From<&PurchasePlan> for PurchasePlan {
    fn from(value: &PurchasePlan) -> Self {
        value.clone()
    }
}
///Type of rebalance behavior that will be used for recreating virtual machines in the scale set across availability zones. Default and only supported value for now is CreateBeforeDelete.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Type of rebalance behavior that will be used for recreating virtual machines in the scale set across availability zones. Default and only supported value for now is CreateBeforeDelete.",
///  "type": "string",
///  "enum": [
///    "CreateBeforeDelete"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "RebalanceBehavior",
///    "values": [
///      {
///        "name": "CreateBeforeDelete",
///        "value": "CreateBeforeDelete"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum RebalanceBehavior {
    CreateBeforeDelete,
}
impl ::std::convert::From<&Self> for RebalanceBehavior {
    fn from(value: &RebalanceBehavior) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for RebalanceBehavior {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::CreateBeforeDelete => f.write_str("CreateBeforeDelete"),
        }
    }
}
impl ::std::str::FromStr for RebalanceBehavior {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "createbeforedelete" => Ok(Self::CreateBeforeDelete),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for RebalanceBehavior {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for RebalanceBehavior {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for RebalanceBehavior {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Type of rebalance strategy that will be used for rebalancing virtual machines in the scale set across availability zones. Default and only supported value for now is Recreate.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Type of rebalance strategy that will be used for rebalancing virtual machines in the scale set across availability zones. Default and only supported value for now is Recreate.",
///  "type": "string",
///  "enum": [
///    "Recreate"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "RebalanceStrategy",
///    "values": [
///      {
///        "name": "Recreate",
///        "value": "Recreate"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum RebalanceStrategy {
    Recreate,
}
impl ::std::convert::From<&Self> for RebalanceStrategy {
    fn from(value: &RebalanceStrategy) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for RebalanceStrategy {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Recreate => f.write_str("Recreate"),
        }
    }
}
impl ::std::str::FromStr for RebalanceStrategy {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "recreate" => Ok(Self::Recreate),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for RebalanceStrategy {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for RebalanceStrategy {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for RebalanceStrategy {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Response after calling a manual recovery walk
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Response after calling a manual recovery walk",
///  "type": "object",
///  "properties": {
///    "nextPlatformUpdateDomain": {
///      "description": "The next update domain that needs to be walked. Null means walk spanning all update domains has been completed",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "walkPerformed": {
///      "description": "Whether the recovery walk was performed",
///      "readOnly": true,
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RecoveryWalkResponse {
    ///The next update domain that needs to be walked. Null means walk spanning all update domains has been completed
    #[serde(
        rename = "nextPlatformUpdateDomain",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_platform_update_domain: ::std::option::Option<i32>,
    ///Whether the recovery walk was performed
    #[serde(
        rename = "walkPerformed",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub walk_performed: ::std::option::Option<bool>,
}
impl ::std::convert::From<&RecoveryWalkResponse> for RecoveryWalkResponse {
    fn from(value: &RecoveryWalkResponse) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RecoveryWalkResponse {
    fn default() -> Self {
        Self {
            next_platform_update_domain: Default::default(),
            walk_performed: Default::default(),
        }
    }
}
///Type of repair action (replace, restart, reimage) that will be used for repairing unhealthy virtual machines in the scale set. Default value is replace.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Type of repair action (replace, restart, reimage) that will be used for repairing unhealthy virtual machines in the scale set. Default value is replace.",
///  "type": "string",
///  "enum": [
///    "Replace",
///    "Restart",
///    "Reimage"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "RepairAction",
///    "values": [
///      {
///        "name": "Replace",
///        "value": "Replace"
///      },
///      {
///        "name": "Restart",
///        "value": "Restart"
///      },
///      {
///        "name": "Reimage",
///        "value": "Reimage"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum RepairAction {
    Replace,
    Restart,
    Reimage,
}
impl ::std::convert::From<&Self> for RepairAction {
    fn from(value: &RepairAction) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for RepairAction {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Replace => f.write_str("Replace"),
            Self::Restart => f.write_str("Restart"),
            Self::Reimage => f.write_str("Reimage"),
        }
    }
}
impl ::std::str::FromStr for RepairAction {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "replace" => Ok(Self::Replace),
            "restart" => Ok(Self::Restart),
            "reimage" => Ok(Self::Reimage),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for RepairAction {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for RepairAction {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for RepairAction {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Api request input for LogAnalytics getRequestRateByInterval Api.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Api request input for LogAnalytics getRequestRateByInterval Api.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/LogAnalyticsInputBase"
///    }
///  ],
///  "required": [
///    "intervalLength"
///  ],
///  "properties": {
///    "intervalLength": {
///      "$ref": "#/components/schemas/IntervalInMins"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RequestRateByIntervalInput {
    ///SAS Uri of the logging blob container to which LogAnalytics Api writes output logs to.
    #[serde(rename = "blobContainerSasUri")]
    pub blob_container_sas_uri: ::std::string::String,
    ///From time of the query
    #[serde(rename = "fromTime")]
    pub from_time: ::std::string::String,
    ///Group query result by Client Application ID.
    #[serde(
        rename = "groupByClientApplicationId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub group_by_client_application_id: ::std::option::Option<bool>,
    ///Group query result by Operation Name.
    #[serde(
        rename = "groupByOperationName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub group_by_operation_name: ::std::option::Option<bool>,
    ///Group query result by Resource Name.
    #[serde(
        rename = "groupByResourceName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub group_by_resource_name: ::std::option::Option<bool>,
    ///Group query result by Throttle Policy applied.
    #[serde(
        rename = "groupByThrottlePolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub group_by_throttle_policy: ::std::option::Option<bool>,
    ///Group query result by User Agent.
    #[serde(
        rename = "groupByUserAgent",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub group_by_user_agent: ::std::option::Option<bool>,
    #[serde(rename = "intervalLength")]
    pub interval_length: IntervalInMins,
    ///To time of the query
    #[serde(rename = "toTime")]
    pub to_time: ::std::string::String,
}
impl ::std::convert::From<&RequestRateByIntervalInput> for RequestRateByIntervalInput {
    fn from(value: &RequestRateByIntervalInput) -> Self {
        value.clone()
    }
}
///Indicates the type of capacity reservation. Allowed values are 'Block' for block capacity reservations and 'Targeted' for reservations that enable a VM to consume a specific capacity reservation when a capacity reservation group is provided. The reservation type is immutable and cannot be changed after it is assigned.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Indicates the type of capacity reservation. Allowed values are 'Block' for block capacity reservations and 'Targeted' for reservations that enable a VM to consume a specific capacity reservation when a capacity reservation group is provided. The reservation type is immutable and cannot be changed after it is assigned.",
///  "type": "string",
///  "enum": [
///    "Targeted",
///    "Block"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ReservationType",
///    "values": [
///      {
///        "description": "To consume on demand allocated capacity reservation when a capacity reservation group is provided.",
///        "name": "Targeted",
///        "value": "Targeted"
///      },
///      {
///        "description": "To consume scheduled allocated block capacity reservation when a capacity reservation group is provided.",
///        "name": "Block",
///        "value": "Block"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ReservationType {
    Targeted,
    Block,
}
impl ::std::convert::From<&Self> for ReservationType {
    fn from(value: &ReservationType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ReservationType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Targeted => f.write_str("Targeted"),
            Self::Block => f.write_str("Block"),
        }
    }
}
impl ::std::str::FromStr for ReservationType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "targeted" => Ok(Self::Targeted),
            "block" => Ok(Self::Block),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ReservationType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ReservationType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ReservationType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes an resiliency policy - AutomaticZoneRebalancingPolicy, ResilientVMCreationPolicy and/or ResilientVMDeletionPolicy.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes an resiliency policy - AutomaticZoneRebalancingPolicy, ResilientVMCreationPolicy and/or ResilientVMDeletionPolicy.",
///  "type": "object",
///  "properties": {
///    "automaticZoneRebalancingPolicy": {
///      "$ref": "#/components/schemas/AutomaticZoneRebalancingPolicy"
///    },
///    "resilientVMCreationPolicy": {
///      "$ref": "#/components/schemas/ResilientVMCreationPolicy"
///    },
///    "resilientVMDeletionPolicy": {
///      "$ref": "#/components/schemas/ResilientVMDeletionPolicy"
///    },
///    "zoneAllocationPolicy": {
///      "$ref": "#/components/schemas/ZoneAllocationPolicy"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ResiliencyPolicy {
    #[serde(
        rename = "automaticZoneRebalancingPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub automatic_zone_rebalancing_policy: ::std::option::Option<
        AutomaticZoneRebalancingPolicy,
    >,
    #[serde(
        rename = "resilientVMCreationPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub resilient_vm_creation_policy: ::std::option::Option<ResilientVmCreationPolicy>,
    #[serde(
        rename = "resilientVMDeletionPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub resilient_vm_deletion_policy: ::std::option::Option<ResilientVmDeletionPolicy>,
    #[serde(
        rename = "zoneAllocationPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zone_allocation_policy: ::std::option::Option<ZoneAllocationPolicy>,
}
impl ::std::convert::From<&ResiliencyPolicy> for ResiliencyPolicy {
    fn from(value: &ResiliencyPolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ResiliencyPolicy {
    fn default() -> Self {
        Self {
            automatic_zone_rebalancing_policy: Default::default(),
            resilient_vm_creation_policy: Default::default(),
            resilient_vm_deletion_policy: Default::default(),
            zone_allocation_policy: Default::default(),
        }
    }
}
///The configuration parameters used while performing resilient VM creation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The configuration parameters used while performing resilient VM creation.",
///  "type": "object",
///  "properties": {
///    "enabled": {
///      "description": "Specifies whether resilient VM creation should be enabled on the virtual machine scale set. The default value is false.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ResilientVmCreationPolicy {
    ///Specifies whether resilient VM creation should be enabled on the virtual machine scale set. The default value is false.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&ResilientVmCreationPolicy> for ResilientVmCreationPolicy {
    fn from(value: &ResilientVmCreationPolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ResilientVmCreationPolicy {
    fn default() -> Self {
        Self {
            enabled: Default::default(),
        }
    }
}
///The configuration parameters used while performing resilient VM deletion.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The configuration parameters used while performing resilient VM deletion.",
///  "type": "object",
///  "properties": {
///    "enabled": {
///      "description": "Specifies whether resilient VM deletion should be enabled on the virtual machine scale set. The default value is false.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ResilientVmDeletionPolicy {
    ///Specifies whether resilient VM deletion should be enabled on the virtual machine scale set. The default value is false.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&ResilientVmDeletionPolicy> for ResilientVmDeletionPolicy {
    fn from(value: &ResilientVmDeletionPolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ResilientVmDeletionPolicy {
    fn default() -> Self {
        Self {
            enabled: Default::default(),
        }
    }
}
///Specifies the resilient VM deletion status for the virtual machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the resilient VM deletion status for the virtual machine.",
///  "type": "string",
///  "enum": [
///    "Enabled",
///    "Disabled",
///    "InProgress",
///    "Failed"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ResilientVMDeletionStatus",
///    "values": [
///      {
///        "name": "Enabled",
///        "value": "Enabled"
///      },
///      {
///        "name": "Disabled",
///        "value": "Disabled"
///      },
///      {
///        "name": "InProgress",
///        "value": "InProgress"
///      },
///      {
///        "name": "Failed",
///        "value": "Failed"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ResilientVmDeletionStatus {
    Enabled,
    Disabled,
    InProgress,
    Failed,
}
impl ::std::convert::From<&Self> for ResilientVmDeletionStatus {
    fn from(value: &ResilientVmDeletionStatus) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ResilientVmDeletionStatus {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Enabled => f.write_str("Enabled"),
            Self::Disabled => f.write_str("Disabled"),
            Self::InProgress => f.write_str("InProgress"),
            Self::Failed => f.write_str("Failed"),
        }
    }
}
impl ::std::str::FromStr for ResilientVmDeletionStatus {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "enabled" => Ok(Self::Enabled),
            "disabled" => Ok(Self::Disabled),
            "inprogress" => Ok(Self::InProgress),
            "failed" => Ok(Self::Failed),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ResilientVmDeletionStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ResilientVmDeletionStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ResilientVmDeletionStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Common fields that are returned in the response for all Azure Resource Manager resources
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "title": "Resource",
///  "description": "Common fields that are returned in the response for all Azure Resource Manager resources",
///  "type": "object",
///  "properties": {
///    "id": {
///      "description": "Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}",
///      "readOnly": true,
///      "type": "string"
///    },
///    "name": {
///      "description": "The name of the resource",
///      "readOnly": true,
///      "type": "string"
///    },
///    "systemData": {
///      "$ref": "#/components/schemas/systemData"
///    },
///    "type": {
///      "description": "The type of the resource. E.g. \"Microsoft.Compute/virtualMachines\" or \"Microsoft.Storage/storageAccounts\"",
///      "readOnly": true,
///      "type": "string"
///    }
///  },
///  "x-ms-azure-resource": true
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct Resource {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&Resource> for Resource {
    fn from(value: &Resource) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for Resource {
    fn default() -> Self {
        Self {
            id: Default::default(),
            name: Default::default(),
            system_data: Default::default(),
            type_: Default::default(),
        }
    }
}
///`ResourceIdOptionsForGetCapacityReservationGroups`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "CreatedInSubscription",
///    "SharedWithSubscription",
///    "All"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ResourceIdOptionsForGetCapacityReservationGroups",
///    "values": [
///      {
///        "name": "CreatedInSubscription",
///        "value": "CreatedInSubscription"
///      },
///      {
///        "name": "SharedWithSubscription",
///        "value": "SharedWithSubscription"
///      },
///      {
///        "name": "All",
///        "value": "All"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ResourceIdOptionsForGetCapacityReservationGroups {
    CreatedInSubscription,
    SharedWithSubscription,
    All,
}
impl ::std::convert::From<&Self> for ResourceIdOptionsForGetCapacityReservationGroups {
    fn from(value: &ResourceIdOptionsForGetCapacityReservationGroups) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ResourceIdOptionsForGetCapacityReservationGroups {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::CreatedInSubscription => f.write_str("CreatedInSubscription"),
            Self::SharedWithSubscription => f.write_str("SharedWithSubscription"),
            Self::All => f.write_str("All"),
        }
    }
}
impl ::std::str::FromStr for ResourceIdOptionsForGetCapacityReservationGroups {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "createdinsubscription" => Ok(Self::CreatedInSubscription),
            "sharedwithsubscription" => Ok(Self::SharedWithSubscription),
            "all" => Ok(Self::All),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ResourceIdOptionsForGetCapacityReservationGroups {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for ResourceIdOptionsForGetCapacityReservationGroups {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for ResourceIdOptionsForGetCapacityReservationGroups {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The type of identity used for the virtual machine scale set. The type 'SystemAssigned, UserAssigned' includes both an implicitly created identity and a set of user assigned identities. The type 'None' will remove any identities from the virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The type of identity used for the virtual machine scale set. The type 'SystemAssigned, UserAssigned' includes both an implicitly created identity and a set of user assigned identities. The type 'None' will remove any identities from the virtual machine scale set.",
///  "type": "string",
///  "enum": [
///    "SystemAssigned",
///    "UserAssigned",
///    "SystemAssigned, UserAssigned",
///    "None"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "ResourceIdentityType"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ResourceIdentityType {
    SystemAssigned,
    UserAssigned,
    #[serde(rename = "SystemAssigned, UserAssigned")]
    SystemAssignedUserAssigned,
    None,
}
impl ::std::convert::From<&Self> for ResourceIdentityType {
    fn from(value: &ResourceIdentityType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ResourceIdentityType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::SystemAssigned => f.write_str("SystemAssigned"),
            Self::UserAssigned => f.write_str("UserAssigned"),
            Self::SystemAssignedUserAssigned => {
                f.write_str("SystemAssigned, UserAssigned")
            }
            Self::None => f.write_str("None"),
        }
    }
}
impl ::std::str::FromStr for ResourceIdentityType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "systemassigned" => Ok(Self::SystemAssigned),
            "userassigned" => Ok(Self::UserAssigned),
            "systemassigned, userassigned" => Ok(Self::SystemAssignedUserAssigned),
            "none" => Ok(Self::None),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ResourceIdentityType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ResourceIdentityType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ResourceIdentityType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///`ResourceSharingProfile`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "subscriptionIds": {
///      "description": "Specifies an array of subscription resource IDs that capacity reservation group is shared with. Block Capacity Reservations does not support sharing across subscriptions. **Note:** Minimum api-version: 2023-09-01. Please refer to https://aka.ms/computereservationsharing for more details.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ResourceSharingProfile {
    ///Specifies an array of subscription resource IDs that capacity reservation group is shared with. Block Capacity Reservations does not support sharing across subscriptions. **Note:** Minimum api-version: 2023-09-01. Please refer to https://aka.ms/computereservationsharing for more details.
    #[serde(
        rename = "subscriptionIds",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub subscription_ids: ::std::vec::Vec<SubResource>,
}
impl ::std::convert::From<&ResourceSharingProfile> for ResourceSharingProfile {
    fn from(value: &ResourceSharingProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ResourceSharingProfile {
    fn default() -> Self {
        Self {
            subscription_ids: Default::default(),
        }
    }
}
///The Resource model definition with location property as optional.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The Resource model definition with location property as optional.",
///  "type": "object",
///  "properties": {
///    "id": {
///      "description": "Resource Id",
///      "readOnly": true,
///      "type": "string"
///    },
///    "location": {
///      "description": "Resource location",
///      "type": "string"
///    },
///    "name": {
///      "description": "Resource name",
///      "readOnly": true,
///      "type": "string"
///    },
///    "tags": {
///      "description": "Resource tags",
///      "type": "object",
///      "additionalProperties": {
///        "type": "string"
///      }
///    },
///    "type": {
///      "description": "Resource type",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ResourceWithOptionalLocation {
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///Resource location
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub location: ::std::option::Option<::std::string::String>,
    ///Resource name
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///Resource type
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&ResourceWithOptionalLocation>
for ResourceWithOptionalLocation {
    fn from(value: &ResourceWithOptionalLocation) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ResourceWithOptionalLocation {
    fn default() -> Self {
        Self {
            id: Default::default(),
            location: Default::default(),
            name: Default::default(),
            tags: Default::default(),
            type_: Default::default(),
        }
    }
}
///Restore Point details.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Restore Point details.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/ProxyResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/RestorePointProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePoint {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<RestorePointProperties>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&RestorePoint> for RestorePoint {
    fn from(value: &RestorePoint) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RestorePoint {
    fn default() -> Self {
        Self {
            id: Default::default(),
            name: Default::default(),
            properties: Default::default(),
            system_data: Default::default(),
            type_: Default::default(),
        }
    }
}
///Create or update Restore Point collection parameters.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Create or update Restore Point collection parameters.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/RestorePointCollectionProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointCollection {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<RestorePointCollectionProperties>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&RestorePointCollection> for RestorePointCollection {
    fn from(value: &RestorePointCollection) -> Self {
        value.clone()
    }
}
///`RestorePointCollectionExpandOptions`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "restorePoints"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "RestorePointCollectionExpandOptions",
///    "values": [
///      {
///        "name": "restorePoints",
///        "value": "restorePoints"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum RestorePointCollectionExpandOptions {
    #[serde(rename = "restorePoints")]
    RestorePoints,
}
impl ::std::convert::From<&Self> for RestorePointCollectionExpandOptions {
    fn from(value: &RestorePointCollectionExpandOptions) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for RestorePointCollectionExpandOptions {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::RestorePoints => f.write_str("restorePoints"),
        }
    }
}
impl ::std::str::FromStr for RestorePointCollectionExpandOptions {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "restorepoints" => Ok(Self::RestorePoints),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for RestorePointCollectionExpandOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for RestorePointCollectionExpandOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for RestorePointCollectionExpandOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The List restore point collection operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List restore point collection operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The uri to fetch the next page of RestorePointCollections. Call ListNext() with this to fetch the next page of RestorePointCollections.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "Gets the list of restore point collections.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/RestorePointCollection"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointCollectionListResult {
    ///The uri to fetch the next page of RestorePointCollections. Call ListNext() with this to fetch the next page of RestorePointCollections.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///Gets the list of restore point collections.
    pub value: ::std::vec::Vec<RestorePointCollection>,
}
impl ::std::convert::From<&RestorePointCollectionListResult>
for RestorePointCollectionListResult {
    fn from(value: &RestorePointCollectionListResult) -> Self {
        value.clone()
    }
}
///The restore point collection properties.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The restore point collection properties.",
///  "type": "object",
///  "properties": {
///    "instantAccess": {
///      "description": "This property determines whether instant access snapshot is enabled for restore points created under this restore point collection for Premium SSD v2 or Ultra disk. Instant access snapshot for Premium SSD v2 or Ultra disk is instantaneously available for restoring disk with fast restore performance.",
///      "type": "boolean"
///    },
///    "provisioningState": {
///      "description": "The provisioning state of the restore point collection.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "restorePointCollectionId": {
///      "description": "The unique id of the restore point collection.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "restorePoints": {
///      "description": "A list containing all restore points created under this restore point collection.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/RestorePoint"
///      }
///    },
///    "source": {
///      "$ref": "#/components/schemas/RestorePointCollectionSourceProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointCollectionProperties {
    ///This property determines whether instant access snapshot is enabled for restore points created under this restore point collection for Premium SSD v2 or Ultra disk. Instant access snapshot for Premium SSD v2 or Ultra disk is instantaneously available for restoring disk with fast restore performance.
    #[serde(
        rename = "instantAccess",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instant_access: ::std::option::Option<bool>,
    ///The provisioning state of the restore point collection.
    #[serde(
        rename = "provisioningState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_state: ::std::option::Option<::std::string::String>,
    ///The unique id of the restore point collection.
    #[serde(
        rename = "restorePointCollectionId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub restore_point_collection_id: ::std::option::Option<::std::string::String>,
    ///A list containing all restore points created under this restore point collection.
    #[serde(
        rename = "restorePoints",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub restore_points: ::std::vec::Vec<RestorePoint>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub source: ::std::option::Option<RestorePointCollectionSourceProperties>,
}
impl ::std::convert::From<&RestorePointCollectionProperties>
for RestorePointCollectionProperties {
    fn from(value: &RestorePointCollectionProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RestorePointCollectionProperties {
    fn default() -> Self {
        Self {
            instant_access: Default::default(),
            provisioning_state: Default::default(),
            restore_point_collection_id: Default::default(),
            restore_points: Default::default(),
            source: Default::default(),
        }
    }
}
///The properties of the source resource that this restore point collection is created from.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The properties of the source resource that this restore point collection is created from.",
///  "type": "object",
///  "properties": {
///    "id": {
///      "description": "Resource Id of the source resource used to create this restore point collection",
///      "type": "string"
///    },
///    "location": {
///      "description": "Location of the source resource used to create this restore point collection.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointCollectionSourceProperties {
    ///Resource Id of the source resource used to create this restore point collection
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///Location of the source resource used to create this restore point collection.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub location: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&RestorePointCollectionSourceProperties>
for RestorePointCollectionSourceProperties {
    fn from(value: &RestorePointCollectionSourceProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RestorePointCollectionSourceProperties {
    fn default() -> Self {
        Self {
            id: Default::default(),
            location: Default::default(),
        }
    }
}
///Update Restore Point collection parameters.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Update Restore Point collection parameters.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/RestorePointCollectionProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointCollectionUpdate {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<RestorePointCollectionProperties>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&RestorePointCollectionUpdate>
for RestorePointCollectionUpdate {
    fn from(value: &RestorePointCollectionUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RestorePointCollectionUpdate {
    fn default() -> Self {
        Self {
            properties: Default::default(),
            tags: Default::default(),
        }
    }
}
///Encryption at rest settings for disk restore point. It is an optional property that can be specified in the input while creating a restore point.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Encryption at rest settings for disk restore point. It is an optional property that can be specified in the input while creating a restore point.",
///  "type": "object",
///  "properties": {
///    "diskEncryptionSet": {
///      "$ref": "#/components/schemas/DiskEncryptionSetParameters"
///    },
///    "type": {
///      "$ref": "#/components/schemas/RestorePointEncryptionType"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointEncryption {
    #[serde(
        rename = "diskEncryptionSet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_encryption_set: ::std::option::Option<DiskEncryptionSetParameters>,
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<RestorePointEncryptionType>,
}
impl ::std::convert::From<&RestorePointEncryption> for RestorePointEncryption {
    fn from(value: &RestorePointEncryption) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RestorePointEncryption {
    fn default() -> Self {
        Self {
            disk_encryption_set: Default::default(),
            type_: Default::default(),
        }
    }
}
///The type of key used to encrypt the data of the disk restore point.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The type of key used to encrypt the data of the disk restore point.",
///  "type": "string",
///  "enum": [
///    "EncryptionAtRestWithPlatformKey",
///    "EncryptionAtRestWithCustomerKey",
///    "EncryptionAtRestWithPlatformAndCustomerKeys"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "RestorePointEncryptionType",
///    "values": [
///      {
///        "description": "Disk Restore Point is encrypted at rest with Platform managed key.",
///        "name": "EncryptionAtRestWithPlatformKey",
///        "value": "EncryptionAtRestWithPlatformKey"
///      },
///      {
///        "description": "Disk Restore Point is encrypted at rest with Customer managed key that can be changed and revoked by a customer.",
///        "name": "EncryptionAtRestWithCustomerKey",
///        "value": "EncryptionAtRestWithCustomerKey"
///      },
///      {
///        "description": "Disk Restore Point is encrypted at rest with 2 layers of encryption. One of the keys is Customer managed and the other key is Platform managed.",
///        "name": "EncryptionAtRestWithPlatformAndCustomerKeys",
///        "value": "EncryptionAtRestWithPlatformAndCustomerKeys"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum RestorePointEncryptionType {
    EncryptionAtRestWithPlatformKey,
    EncryptionAtRestWithCustomerKey,
    EncryptionAtRestWithPlatformAndCustomerKeys,
}
impl ::std::convert::From<&Self> for RestorePointEncryptionType {
    fn from(value: &RestorePointEncryptionType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for RestorePointEncryptionType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::EncryptionAtRestWithPlatformKey => {
                f.write_str("EncryptionAtRestWithPlatformKey")
            }
            Self::EncryptionAtRestWithCustomerKey => {
                f.write_str("EncryptionAtRestWithCustomerKey")
            }
            Self::EncryptionAtRestWithPlatformAndCustomerKeys => {
                f.write_str("EncryptionAtRestWithPlatformAndCustomerKeys")
            }
        }
    }
}
impl ::std::str::FromStr for RestorePointEncryptionType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "encryptionatrestwithplatformkey" => {
                Ok(Self::EncryptionAtRestWithPlatformKey)
            }
            "encryptionatrestwithcustomerkey" => {
                Ok(Self::EncryptionAtRestWithCustomerKey)
            }
            "encryptionatrestwithplatformandcustomerkeys" => {
                Ok(Self::EncryptionAtRestWithPlatformAndCustomerKeys)
            }
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for RestorePointEncryptionType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for RestorePointEncryptionType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for RestorePointEncryptionType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///`RestorePointExpandOptions`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "instanceView"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "RestorePointExpandOptions",
///    "values": [
///      {
///        "name": "instanceView",
///        "value": "instanceView"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum RestorePointExpandOptions {
    #[serde(rename = "instanceView")]
    InstanceView,
}
impl ::std::convert::From<&Self> for RestorePointExpandOptions {
    fn from(value: &RestorePointExpandOptions) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for RestorePointExpandOptions {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::InstanceView => f.write_str("instanceView"),
        }
    }
}
impl ::std::str::FromStr for RestorePointExpandOptions {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "instanceview" => Ok(Self::InstanceView),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for RestorePointExpandOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for RestorePointExpandOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for RestorePointExpandOptions {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The instance view of a restore point.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a restore point.",
///  "type": "object",
///  "properties": {
///    "diskRestorePoints": {
///      "description": "The disk restore points information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DiskRestorePointInstanceView"
///      }
///    },
///    "statuses": {
///      "description": "The resource status information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointInstanceView {
    ///The disk restore points information.
    #[serde(
        rename = "diskRestorePoints",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_restore_points: ::std::vec::Vec<DiskRestorePointInstanceView>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
}
impl ::std::convert::From<&RestorePointInstanceView> for RestorePointInstanceView {
    fn from(value: &RestorePointInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RestorePointInstanceView {
    fn default() -> Self {
        Self {
            disk_restore_points: Default::default(),
            statuses: Default::default(),
        }
    }
}
///The restore point properties.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The restore point properties.",
///  "type": "object",
///  "properties": {
///    "consistencyMode": {
///      "$ref": "#/components/schemas/ConsistencyModeTypes"
///    },
///    "excludeDisks": {
///      "description": "List of disk resource ids that the customer wishes to exclude from the restore point. If no disks are specified, all disks will be included.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/ApiEntityReference"
///      }
///    },
///    "instanceView": {
///      "$ref": "#/components/schemas/RestorePointInstanceView"
///    },
///    "instantAccessDurationMinutes": {
///      "description": "This property determines the time in minutes the snapshot is retained as instant access for restoring Premium SSD v2 or Ultra disk with fast restore performance in this restore point.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "provisioningState": {
///      "description": "Gets the provisioning state of the restore point.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "sourceMetadata": {
///      "$ref": "#/components/schemas/RestorePointSourceMetadata"
///    },
///    "sourceRestorePoint": {
///      "$ref": "#/components/schemas/ApiEntityReference"
///    },
///    "timeCreated": {
///      "description": "Gets the creation time of the restore point.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointProperties {
    #[serde(
        rename = "consistencyMode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub consistency_mode: ::std::option::Option<ConsistencyModeTypes>,
    ///List of disk resource ids that the customer wishes to exclude from the restore point. If no disks are specified, all disks will be included.
    #[serde(
        rename = "excludeDisks",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub exclude_disks: ::std::vec::Vec<ApiEntityReference>,
    #[serde(
        rename = "instanceView",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_view: ::std::option::Option<RestorePointInstanceView>,
    ///This property determines the time in minutes the snapshot is retained as instant access for restoring Premium SSD v2 or Ultra disk with fast restore performance in this restore point.
    #[serde(
        rename = "instantAccessDurationMinutes",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instant_access_duration_minutes: ::std::option::Option<i32>,
    ///Gets the provisioning state of the restore point.
    #[serde(
        rename = "provisioningState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_state: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "sourceMetadata",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub source_metadata: ::std::option::Option<RestorePointSourceMetadata>,
    #[serde(
        rename = "sourceRestorePoint",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub source_restore_point: ::std::option::Option<ApiEntityReference>,
    ///Gets the creation time of the restore point.
    #[serde(
        rename = "timeCreated",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub time_created: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&RestorePointProperties> for RestorePointProperties {
    fn from(value: &RestorePointProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RestorePointProperties {
    fn default() -> Self {
        Self {
            consistency_mode: Default::default(),
            exclude_disks: Default::default(),
            instance_view: Default::default(),
            instant_access_duration_minutes: Default::default(),
            provisioning_state: Default::default(),
            source_metadata: Default::default(),
            source_restore_point: Default::default(),
            time_created: Default::default(),
        }
    }
}
///Describes the properties of the Virtual Machine for which the restore point was created. The properties provided are a subset and the snapshot of the overall Virtual Machine properties captured at the time of the restore point creation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of the Virtual Machine for which the restore point was created. The properties provided are a subset and the snapshot of the overall Virtual Machine properties captured at the time of the restore point creation.",
///  "type": "object",
///  "properties": {
///    "diagnosticsProfile": {
///      "$ref": "#/components/schemas/DiagnosticsProfile"
///    },
///    "hardwareProfile": {
///      "$ref": "#/components/schemas/HardwareProfile"
///    },
///    "hyperVGeneration": {
///      "$ref": "#/components/schemas/HyperVGenerationTypes"
///    },
///    "licenseType": {
///      "description": "Gets the license type, which is for bring your own license scenario.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "location": {
///      "description": "Location of the VM from which the restore point was created.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "osProfile": {
///      "$ref": "#/components/schemas/OSProfile"
///    },
///    "securityProfile": {
///      "$ref": "#/components/schemas/SecurityProfile"
///    },
///    "storageProfile": {
///      "$ref": "#/components/schemas/RestorePointSourceVMStorageProfile"
///    },
///    "userData": {
///      "description": "UserData associated with the source VM for which restore point is captured, which is a base-64 encoded value.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "vmId": {
///      "description": "Gets the virtual machine unique id.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointSourceMetadata {
    #[serde(
        rename = "diagnosticsProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub diagnostics_profile: ::std::option::Option<DiagnosticsProfile>,
    #[serde(
        rename = "hardwareProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hardware_profile: ::std::option::Option<HardwareProfile>,
    #[serde(
        rename = "hyperVGeneration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hyper_v_generation: ::std::option::Option<HyperVGenerationTypes>,
    ///Gets the license type, which is for bring your own license scenario.
    #[serde(
        rename = "licenseType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub license_type: ::std::option::Option<::std::string::String>,
    ///Location of the VM from which the restore point was created.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub location: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "osProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_profile: ::std::option::Option<OsProfile>,
    #[serde(
        rename = "securityProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub security_profile: ::std::option::Option<SecurityProfile>,
    #[serde(
        rename = "storageProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_profile: ::std::option::Option<RestorePointSourceVmStorageProfile>,
    ///UserData associated with the source VM for which restore point is captured, which is a base-64 encoded value.
    #[serde(
        rename = "userData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub user_data: ::std::option::Option<::std::string::String>,
    ///Gets the virtual machine unique id.
    #[serde(
        rename = "vmId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&RestorePointSourceMetadata> for RestorePointSourceMetadata {
    fn from(value: &RestorePointSourceMetadata) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RestorePointSourceMetadata {
    fn default() -> Self {
        Self {
            diagnostics_profile: Default::default(),
            hardware_profile: Default::default(),
            hyper_v_generation: Default::default(),
            license_type: Default::default(),
            location: Default::default(),
            os_profile: Default::default(),
            security_profile: Default::default(),
            storage_profile: Default::default(),
            user_data: Default::default(),
            vm_id: Default::default(),
        }
    }
}
///Describes a data disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a data disk.",
///  "type": "object",
///  "properties": {
///    "caching": {
///      "$ref": "#/components/schemas/CachingTypes"
///    },
///    "diskRestorePoint": {
///      "$ref": "#/components/schemas/DiskRestorePointAttributes"
///    },
///    "diskSizeGB": {
///      "description": "Gets the initial disk size in GB for blank data disks, and the new desired size for existing OS and Data disks.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "lun": {
///      "description": "Gets the logical unit number.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "managedDisk": {
///      "$ref": "#/components/schemas/ManagedDiskParameters"
///    },
///    "name": {
///      "description": "Gets the disk name.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "writeAcceleratorEnabled": {
///      "description": "Shows true if the disk is write-accelerator enabled.",
///      "readOnly": true,
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointSourceVmDataDisk {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub caching: ::std::option::Option<CachingTypes>,
    #[serde(
        rename = "diskRestorePoint",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_restore_point: ::std::option::Option<DiskRestorePointAttributes>,
    ///Gets the initial disk size in GB for blank data disks, and the new desired size for existing OS and Data disks.
    #[serde(
        rename = "diskSizeGB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_size_gb: ::std::option::Option<i32>,
    ///Gets the logical unit number.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub lun: ::std::option::Option<i32>,
    #[serde(
        rename = "managedDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub managed_disk: ::std::option::Option<ManagedDiskParameters>,
    ///Gets the disk name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///Shows true if the disk is write-accelerator enabled.
    #[serde(
        rename = "writeAcceleratorEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub write_accelerator_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&RestorePointSourceVmDataDisk>
for RestorePointSourceVmDataDisk {
    fn from(value: &RestorePointSourceVmDataDisk) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RestorePointSourceVmDataDisk {
    fn default() -> Self {
        Self {
            caching: Default::default(),
            disk_restore_point: Default::default(),
            disk_size_gb: Default::default(),
            lun: Default::default(),
            managed_disk: Default::default(),
            name: Default::default(),
            write_accelerator_enabled: Default::default(),
        }
    }
}
///Describes the storage profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the storage profile.",
///  "type": "object",
///  "properties": {
///    "dataDisks": {
///      "description": "Gets the data disks of the VM captured at the time of the restore point creation.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/RestorePointSourceVMDataDisk"
///      },
///      "x-ms-identifiers": [
///        "lun"
///      ]
///    },
///    "diskControllerType": {
///      "$ref": "#/components/schemas/DiskControllerTypes"
///    },
///    "osDisk": {
///      "$ref": "#/components/schemas/RestorePointSourceVMOSDisk"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointSourceVmStorageProfile {
    ///Gets the data disks of the VM captured at the time of the restore point creation.
    #[serde(
        rename = "dataDisks",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub data_disks: ::std::vec::Vec<RestorePointSourceVmDataDisk>,
    #[serde(
        rename = "diskControllerType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_controller_type: ::std::option::Option<DiskControllerTypes>,
    #[serde(
        rename = "osDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_disk: ::std::option::Option<RestorePointSourceVmosDisk>,
}
impl ::std::convert::From<&RestorePointSourceVmStorageProfile>
for RestorePointSourceVmStorageProfile {
    fn from(value: &RestorePointSourceVmStorageProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RestorePointSourceVmStorageProfile {
    fn default() -> Self {
        Self {
            data_disks: Default::default(),
            disk_controller_type: Default::default(),
            os_disk: Default::default(),
        }
    }
}
///Describes an Operating System disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes an Operating System disk.",
///  "type": "object",
///  "properties": {
///    "caching": {
///      "$ref": "#/components/schemas/CachingTypes"
///    },
///    "diskRestorePoint": {
///      "$ref": "#/components/schemas/DiskRestorePointAttributes"
///    },
///    "diskSizeGB": {
///      "description": "Gets the disk size in GB.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "encryptionSettings": {
///      "$ref": "#/components/schemas/DiskEncryptionSettings"
///    },
///    "managedDisk": {
///      "$ref": "#/components/schemas/ManagedDiskParameters"
///    },
///    "name": {
///      "description": "Gets the disk name.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "osType": {
///      "$ref": "#/components/schemas/OperatingSystemType"
///    },
///    "writeAcceleratorEnabled": {
///      "description": "Shows true if the disk is write-accelerator enabled.",
///      "readOnly": true,
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RestorePointSourceVmosDisk {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub caching: ::std::option::Option<CachingTypes>,
    #[serde(
        rename = "diskRestorePoint",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_restore_point: ::std::option::Option<DiskRestorePointAttributes>,
    ///Gets the disk size in GB.
    #[serde(
        rename = "diskSizeGB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_size_gb: ::std::option::Option<i32>,
    #[serde(
        rename = "encryptionSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub encryption_settings: ::std::option::Option<DiskEncryptionSettings>,
    #[serde(
        rename = "managedDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub managed_disk: ::std::option::Option<ManagedDiskParameters>,
    ///Gets the disk name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "osType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_type: ::std::option::Option<OperatingSystemType>,
    ///Shows true if the disk is write-accelerator enabled.
    #[serde(
        rename = "writeAcceleratorEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub write_accelerator_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&RestorePointSourceVmosDisk> for RestorePointSourceVmosDisk {
    fn from(value: &RestorePointSourceVmosDisk) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RestorePointSourceVmosDisk {
    fn default() -> Self {
        Self {
            caching: Default::default(),
            disk_restore_point: Default::default(),
            disk_size_gb: Default::default(),
            encryption_settings: Default::default(),
            managed_disk: Default::default(),
            name: Default::default(),
            os_type: Default::default(),
            write_accelerator_enabled: Default::default(),
        }
    }
}
///The SAS URIs of the console screenshot and serial log blobs.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The SAS URIs of the console screenshot and serial log blobs.",
///  "type": "object",
///  "properties": {
///    "consoleScreenshotBlobUri": {
///      "description": "The console screenshot blob URI",
///      "readOnly": true,
///      "type": "string"
///    },
///    "serialConsoleLogBlobUri": {
///      "description": "The serial console log blob URI.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RetrieveBootDiagnosticsDataResult {
    ///The console screenshot blob URI
    #[serde(
        rename = "consoleScreenshotBlobUri",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub console_screenshot_blob_uri: ::std::option::Option<::std::string::String>,
    ///The serial console log blob URI.
    #[serde(
        rename = "serialConsoleLogBlobUri",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub serial_console_log_blob_uri: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&RetrieveBootDiagnosticsDataResult>
for RetrieveBootDiagnosticsDataResult {
    fn from(value: &RetrieveBootDiagnosticsDataResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RetrieveBootDiagnosticsDataResult {
    fn default() -> Self {
        Self {
            console_screenshot_blob_uri: Default::default(),
            serial_console_log_blob_uri: Default::default(),
        }
    }
}
///Information about rollback on failed VM instances after a OS Upgrade operation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Information about rollback on failed VM instances after a OS Upgrade operation.",
///  "type": "object",
///  "properties": {
///    "failedRolledbackInstanceCount": {
///      "description": "The number of instances which failed to rollback.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "rollbackError": {
///      "$ref": "#/components/schemas/ApiError"
///    },
///    "successfullyRolledbackInstanceCount": {
///      "description": "The number of instances which have been successfully rolled back.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RollbackStatusInfo {
    ///The number of instances which failed to rollback.
    #[serde(
        rename = "failedRolledbackInstanceCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub failed_rolledback_instance_count: ::std::option::Option<i32>,
    #[serde(
        rename = "rollbackError",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub rollback_error: ::std::option::Option<ApiError>,
    ///The number of instances which have been successfully rolled back.
    #[serde(
        rename = "successfullyRolledbackInstanceCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub successfully_rolledback_instance_count: ::std::option::Option<i32>,
}
impl ::std::convert::From<&RollbackStatusInfo> for RollbackStatusInfo {
    fn from(value: &RollbackStatusInfo) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RollbackStatusInfo {
    fn default() -> Self {
        Self {
            failed_rolledback_instance_count: Default::default(),
            rollback_error: Default::default(),
            successfully_rolledback_instance_count: Default::default(),
        }
    }
}
///The last action performed on the rolling upgrade.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The last action performed on the rolling upgrade.",
///  "type": "string",
///  "enum": [
///    "Start",
///    "Cancel"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "RollingUpgradeActionType"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum RollingUpgradeActionType {
    Start,
    Cancel,
}
impl ::std::convert::From<&Self> for RollingUpgradeActionType {
    fn from(value: &RollingUpgradeActionType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for RollingUpgradeActionType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Start => f.write_str("Start"),
            Self::Cancel => f.write_str("Cancel"),
        }
    }
}
impl ::std::str::FromStr for RollingUpgradeActionType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "start" => Ok(Self::Start),
            "cancel" => Ok(Self::Cancel),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for RollingUpgradeActionType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for RollingUpgradeActionType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for RollingUpgradeActionType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The configuration parameters used while performing a rolling upgrade.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The configuration parameters used while performing a rolling upgrade.",
///  "type": "object",
///  "properties": {
///    "enableCrossZoneUpgrade": {
///      "description": "Allow VMSS to ignore AZ boundaries when constructing upgrade batches. Take into consideration the Update Domain and maxBatchInstancePercent to determine the batch size.",
///      "type": "boolean"
///    },
///    "maxBatchInstancePercent": {
///      "description": "The maximum percent of total virtual machine instances that will be upgraded simultaneously by the rolling upgrade in one batch. As this is a maximum, unhealthy instances in previous or future batches can cause the percentage of instances in a batch to decrease to ensure higher reliability. The default value for this parameter is 20%.",
///      "type": "integer",
///      "format": "int32",
///      "maximum": 100.0,
///      "minimum": 5.0
///    },
///    "maxSurge": {
///      "description": "Create new virtual machines to upgrade the scale set, rather than updating the existing virtual machines. Existing virtual machines will be deleted once the new virtual machines are created for each batch.",
///      "type": "boolean"
///    },
///    "maxUnhealthyInstancePercent": {
///      "description": "The maximum percentage of the total virtual machine instances in the scale set that can be simultaneously unhealthy, either as a result of being upgraded, or by being found in an unhealthy state by the virtual machine health checks before the rolling upgrade aborts. This constraint will be checked prior to starting any batch. The default value for this parameter is 20%.",
///      "type": "integer",
///      "format": "int32",
///      "maximum": 100.0,
///      "minimum": 5.0
///    },
///    "maxUnhealthyUpgradedInstancePercent": {
///      "description": "The maximum percentage of upgraded virtual machine instances that can be found to be in an unhealthy state. This check will happen after each batch is upgraded. If this percentage is ever exceeded, the rolling update aborts. The default value for this parameter is 20%.",
///      "type": "integer",
///      "format": "int32",
///      "maximum": 100.0
///    },
///    "pauseTimeBetweenBatches": {
///      "description": "The wait time between completing the update for all virtual machines in one batch and starting the next batch. The time duration should be specified in ISO 8601 format. The default value is 0 seconds (PT0S).",
///      "type": "string"
///    },
///    "prioritizeUnhealthyInstances": {
///      "description": "Upgrade all unhealthy instances in a scale set before any healthy instances.",
///      "type": "boolean"
///    },
///    "rollbackFailedInstancesOnPolicyBreach": {
///      "description": "Rollback failed instances to previous model if the Rolling Upgrade policy is violated.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RollingUpgradePolicy {
    ///Allow VMSS to ignore AZ boundaries when constructing upgrade batches. Take into consideration the Update Domain and maxBatchInstancePercent to determine the batch size.
    #[serde(
        rename = "enableCrossZoneUpgrade",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_cross_zone_upgrade: ::std::option::Option<bool>,
    ///The maximum percent of total virtual machine instances that will be upgraded simultaneously by the rolling upgrade in one batch. As this is a maximum, unhealthy instances in previous or future batches can cause the percentage of instances in a batch to decrease to ensure higher reliability. The default value for this parameter is 20%.
    #[serde(
        rename = "maxBatchInstancePercent",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub max_batch_instance_percent: ::std::option::Option<i32>,
    ///Create new virtual machines to upgrade the scale set, rather than updating the existing virtual machines. Existing virtual machines will be deleted once the new virtual machines are created for each batch.
    #[serde(
        rename = "maxSurge",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub max_surge: ::std::option::Option<bool>,
    ///The maximum percentage of the total virtual machine instances in the scale set that can be simultaneously unhealthy, either as a result of being upgraded, or by being found in an unhealthy state by the virtual machine health checks before the rolling upgrade aborts. This constraint will be checked prior to starting any batch. The default value for this parameter is 20%.
    #[serde(
        rename = "maxUnhealthyInstancePercent",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub max_unhealthy_instance_percent: ::std::option::Option<i32>,
    ///The maximum percentage of upgraded virtual machine instances that can be found to be in an unhealthy state. This check will happen after each batch is upgraded. If this percentage is ever exceeded, the rolling update aborts. The default value for this parameter is 20%.
    #[serde(
        rename = "maxUnhealthyUpgradedInstancePercent",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub max_unhealthy_upgraded_instance_percent: ::std::option::Option<i32>,
    ///The wait time between completing the update for all virtual machines in one batch and starting the next batch. The time duration should be specified in ISO 8601 format. The default value is 0 seconds (PT0S).
    #[serde(
        rename = "pauseTimeBetweenBatches",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub pause_time_between_batches: ::std::option::Option<::std::string::String>,
    ///Upgrade all unhealthy instances in a scale set before any healthy instances.
    #[serde(
        rename = "prioritizeUnhealthyInstances",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub prioritize_unhealthy_instances: ::std::option::Option<bool>,
    ///Rollback failed instances to previous model if the Rolling Upgrade policy is violated.
    #[serde(
        rename = "rollbackFailedInstancesOnPolicyBreach",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub rollback_failed_instances_on_policy_breach: ::std::option::Option<bool>,
}
impl ::std::convert::From<&RollingUpgradePolicy> for RollingUpgradePolicy {
    fn from(value: &RollingUpgradePolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RollingUpgradePolicy {
    fn default() -> Self {
        Self {
            enable_cross_zone_upgrade: Default::default(),
            max_batch_instance_percent: Default::default(),
            max_surge: Default::default(),
            max_unhealthy_instance_percent: Default::default(),
            max_unhealthy_upgraded_instance_percent: Default::default(),
            pause_time_between_batches: Default::default(),
            prioritize_unhealthy_instances: Default::default(),
            rollback_failed_instances_on_policy_breach: Default::default(),
        }
    }
}
///Information about the number of virtual machine instances in each upgrade state.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Information about the number of virtual machine instances in each upgrade state.",
///  "type": "object",
///  "properties": {
///    "failedInstanceCount": {
///      "description": "The number of instances that have failed to be upgraded successfully.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "inProgressInstanceCount": {
///      "description": "The number of instances that are currently being upgraded.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "pendingInstanceCount": {
///      "description": "The number of instances that have not yet begun to be upgraded.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "successfulInstanceCount": {
///      "description": "The number of instances that have been successfully upgraded.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RollingUpgradeProgressInfo {
    ///The number of instances that have failed to be upgraded successfully.
    #[serde(
        rename = "failedInstanceCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub failed_instance_count: ::std::option::Option<i32>,
    ///The number of instances that are currently being upgraded.
    #[serde(
        rename = "inProgressInstanceCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub in_progress_instance_count: ::std::option::Option<i32>,
    ///The number of instances that have not yet begun to be upgraded.
    #[serde(
        rename = "pendingInstanceCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub pending_instance_count: ::std::option::Option<i32>,
    ///The number of instances that have been successfully upgraded.
    #[serde(
        rename = "successfulInstanceCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub successful_instance_count: ::std::option::Option<i32>,
}
impl ::std::convert::From<&RollingUpgradeProgressInfo> for RollingUpgradeProgressInfo {
    fn from(value: &RollingUpgradeProgressInfo) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RollingUpgradeProgressInfo {
    fn default() -> Self {
        Self {
            failed_instance_count: Default::default(),
            in_progress_instance_count: Default::default(),
            pending_instance_count: Default::default(),
            successful_instance_count: Default::default(),
        }
    }
}
///Information about the current running state of the overall upgrade.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Information about the current running state of the overall upgrade.",
///  "type": "object",
///  "properties": {
///    "code": {
///      "$ref": "#/components/schemas/RollingUpgradeStatusCode"
///    },
///    "lastAction": {
///      "$ref": "#/components/schemas/RollingUpgradeActionType"
///    },
///    "lastActionTime": {
///      "description": "Last action time of the upgrade.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "startTime": {
///      "description": "Start time of the upgrade.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RollingUpgradeRunningStatus {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub code: ::std::option::Option<RollingUpgradeStatusCode>,
    #[serde(
        rename = "lastAction",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_action: ::std::option::Option<RollingUpgradeActionType>,
    ///Last action time of the upgrade.
    #[serde(
        rename = "lastActionTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_action_time: ::std::option::Option<::std::string::String>,
    ///Start time of the upgrade.
    #[serde(
        rename = "startTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub start_time: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&RollingUpgradeRunningStatus> for RollingUpgradeRunningStatus {
    fn from(value: &RollingUpgradeRunningStatus) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RollingUpgradeRunningStatus {
    fn default() -> Self {
        Self {
            code: Default::default(),
            last_action: Default::default(),
            last_action_time: Default::default(),
            start_time: Default::default(),
        }
    }
}
///Code indicating the current status of the upgrade.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Code indicating the current status of the upgrade.",
///  "type": "string",
///  "enum": [
///    "RollingForward",
///    "Cancelled",
///    "Completed",
///    "Faulted"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "RollingUpgradeStatusCode"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum RollingUpgradeStatusCode {
    RollingForward,
    Cancelled,
    Completed,
    Faulted,
}
impl ::std::convert::From<&Self> for RollingUpgradeStatusCode {
    fn from(value: &RollingUpgradeStatusCode) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for RollingUpgradeStatusCode {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::RollingForward => f.write_str("RollingForward"),
            Self::Cancelled => f.write_str("Cancelled"),
            Self::Completed => f.write_str("Completed"),
            Self::Faulted => f.write_str("Faulted"),
        }
    }
}
impl ::std::str::FromStr for RollingUpgradeStatusCode {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "rollingforward" => Ok(Self::RollingForward),
            "cancelled" => Ok(Self::Cancelled),
            "completed" => Ok(Self::Completed),
            "faulted" => Ok(Self::Faulted),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for RollingUpgradeStatusCode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for RollingUpgradeStatusCode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for RollingUpgradeStatusCode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The status of the latest virtual machine scale set rolling upgrade.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The status of the latest virtual machine scale set rolling upgrade.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/RollingUpgradeStatusInfoProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RollingUpgradeStatusInfo {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<RollingUpgradeStatusInfoProperties>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&RollingUpgradeStatusInfo> for RollingUpgradeStatusInfo {
    fn from(value: &RollingUpgradeStatusInfo) -> Self {
        value.clone()
    }
}
///The status of the latest virtual machine scale set rolling upgrade.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The status of the latest virtual machine scale set rolling upgrade.",
///  "type": "object",
///  "properties": {
///    "error": {
///      "$ref": "#/components/schemas/ApiError"
///    },
///    "policy": {
///      "$ref": "#/components/schemas/RollingUpgradePolicy"
///    },
///    "progress": {
///      "$ref": "#/components/schemas/RollingUpgradeProgressInfo"
///    },
///    "runningStatus": {
///      "$ref": "#/components/schemas/RollingUpgradeRunningStatus"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RollingUpgradeStatusInfoProperties {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub error: ::std::option::Option<ApiError>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub policy: ::std::option::Option<RollingUpgradePolicy>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub progress: ::std::option::Option<RollingUpgradeProgressInfo>,
    #[serde(
        rename = "runningStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub running_status: ::std::option::Option<RollingUpgradeRunningStatus>,
}
impl ::std::convert::From<&RollingUpgradeStatusInfoProperties>
for RollingUpgradeStatusInfoProperties {
    fn from(value: &RollingUpgradeStatusInfoProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RollingUpgradeStatusInfoProperties {
    fn default() -> Self {
        Self {
            error: Default::default(),
            policy: Default::default(),
            progress: Default::default(),
            running_status: Default::default(),
        }
    }
}
///Describes the properties of a Run Command.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Run Command.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/RunCommandDocumentBase"
///    }
///  ],
///  "required": [
///    "script"
///  ],
///  "properties": {
///    "parameters": {
///      "description": "The parameters used by the script.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/RunCommandParameterDefinition"
///      },
///      "x-ms-identifiers": [
///        "name",
///        "type"
///      ]
///    },
///    "script": {
///      "description": "The script to be executed.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RunCommandDocument {
    ///The VM run command description.
    pub description: ::std::string::String,
    ///The VM run command id.
    pub id: ::std::string::String,
    ///The VM run command label.
    pub label: ::std::string::String,
    #[serde(rename = "osType")]
    pub os_type: OperatingSystemTypes,
    ///The parameters used by the script.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub parameters: ::std::vec::Vec<RunCommandParameterDefinition>,
    ///The VM run command schema.
    #[serde(rename = "$schema")]
    pub schema: ::std::string::String,
    ///The script to be executed.
    pub script: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&RunCommandDocument> for RunCommandDocument {
    fn from(value: &RunCommandDocument) -> Self {
        value.clone()
    }
}
///Describes the properties of a Run Command metadata.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Run Command metadata.",
///  "type": "object",
///  "required": [
///    "$schema",
///    "description",
///    "id",
///    "label",
///    "osType"
///  ],
///  "properties": {
///    "$schema": {
///      "description": "The VM run command schema.",
///      "type": "string",
///      "x-ms-client-name": "schema"
///    },
///    "description": {
///      "description": "The VM run command description.",
///      "type": "string"
///    },
///    "id": {
///      "description": "The VM run command id.",
///      "type": "string"
///    },
///    "label": {
///      "description": "The VM run command label.",
///      "type": "string"
///    },
///    "osType": {
///      "$ref": "#/components/schemas/OperatingSystemTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RunCommandDocumentBase {
    ///The VM run command description.
    pub description: ::std::string::String,
    ///The VM run command id.
    pub id: ::std::string::String,
    ///The VM run command label.
    pub label: ::std::string::String,
    #[serde(rename = "osType")]
    pub os_type: OperatingSystemTypes,
    ///The VM run command schema.
    #[serde(rename = "$schema")]
    pub schema: ::std::string::String,
}
impl ::std::convert::From<&RunCommandDocumentBase> for RunCommandDocumentBase {
    fn from(value: &RunCommandDocumentBase) -> Self {
        value.clone()
    }
}
///Capture Virtual Machine parameters.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Capture Virtual Machine parameters.",
///  "type": "object",
///  "required": [
///    "commandId"
///  ],
///  "properties": {
///    "commandId": {
///      "description": "Specifies a commandId of predefined built-in script. Command IDs available for Linux are listed at https://aka.ms/RunCommandManagedLinux#available-commands, Windows at https://aka.ms/RunCommandManagedWindows#available-commands.",
///      "type": "string"
///    },
///    "parameters": {
///      "description": "The run command parameters.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/RunCommandInputParameter"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "script": {
///      "description": "Optional. The script to be executed.  When this value is given, the given script will override the default script of the command.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RunCommandInput {
    ///Specifies a commandId of predefined built-in script. Command IDs available for Linux are listed at https://aka.ms/RunCommandManagedLinux#available-commands, Windows at https://aka.ms/RunCommandManagedWindows#available-commands.
    #[serde(rename = "commandId")]
    pub command_id: ::std::string::String,
    ///The run command parameters.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub parameters: ::std::vec::Vec<RunCommandInputParameter>,
    ///Optional. The script to be executed.  When this value is given, the given script will override the default script of the command.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub script: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&RunCommandInput> for RunCommandInput {
    fn from(value: &RunCommandInput) -> Self {
        value.clone()
    }
}
///Describes the properties of a run command parameter.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a run command parameter.",
///  "type": "object",
///  "required": [
///    "name",
///    "value"
///  ],
///  "properties": {
///    "name": {
///      "description": "The run command parameter name.",
///      "type": "string"
///    },
///    "value": {
///      "description": "The run command parameter value.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RunCommandInputParameter {
    ///The run command parameter name.
    pub name: ::std::string::String,
    ///The run command parameter value.
    pub value: ::std::string::String,
}
impl ::std::convert::From<&RunCommandInputParameter> for RunCommandInputParameter {
    fn from(value: &RunCommandInputParameter) -> Self {
        value.clone()
    }
}
///The List Virtual Machine operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Virtual Machine operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The uri to fetch the next page of run commands. Call ListNext() with this to fetch the next page of run commands.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of virtual machine run commands.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/RunCommandDocumentBase"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RunCommandListResult {
    ///The uri to fetch the next page of run commands. Call ListNext() with this to fetch the next page of run commands.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of virtual machine run commands.
    pub value: ::std::vec::Vec<RunCommandDocumentBase>,
}
impl ::std::convert::From<&RunCommandListResult> for RunCommandListResult {
    fn from(value: &RunCommandListResult) -> Self {
        value.clone()
    }
}
///Contains clientId or objectId (use only one, not both) of a user-assigned managed identity that has access to storage blob used in Run Command. Use an empty RunCommandManagedIdentity object in case of system-assigned identity. Make sure the Azure storage blob exists in case of scriptUri, and managed identity has been given access to blob's container with 'Storage Blob Data Reader' role assignment with scriptUri blob and 'Storage Blob Data Contributor' for Append blobs(outputBlobUri, errorBlobUri). In case of user assigned identity, make sure you add it under VM's identity. For more info on managed identity and Run Command, refer https://aka.ms/ManagedIdentity and https://aka.ms/RunCommandManaged.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Contains clientId or objectId (use only one, not both) of a user-assigned managed identity that has access to storage blob used in Run Command. Use an empty RunCommandManagedIdentity object in case of system-assigned identity. Make sure the Azure storage blob exists in case of scriptUri, and managed identity has been given access to blob's container with 'Storage Blob Data Reader' role assignment with scriptUri blob and 'Storage Blob Data Contributor' for Append blobs(outputBlobUri, errorBlobUri). In case of user assigned identity, make sure you add it under VM's identity. For more info on managed identity and Run Command, refer https://aka.ms/ManagedIdentity and https://aka.ms/RunCommandManaged.",
///  "type": "object",
///  "properties": {
///    "clientId": {
///      "description": "Client Id (GUID value) of the user-assigned managed identity. ObjectId should not be used if this is provided.",
///      "type": "string"
///    },
///    "objectId": {
///      "description": "Object Id (GUID value) of the user-assigned managed identity. ClientId should not be used if this is provided.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RunCommandManagedIdentity {
    ///Client Id (GUID value) of the user-assigned managed identity. ObjectId should not be used if this is provided.
    #[serde(
        rename = "clientId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub client_id: ::std::option::Option<::std::string::String>,
    ///Object Id (GUID value) of the user-assigned managed identity. ClientId should not be used if this is provided.
    #[serde(
        rename = "objectId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub object_id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&RunCommandManagedIdentity> for RunCommandManagedIdentity {
    fn from(value: &RunCommandManagedIdentity) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RunCommandManagedIdentity {
    fn default() -> Self {
        Self {
            client_id: Default::default(),
            object_id: Default::default(),
        }
    }
}
///Describes the properties of a run command parameter.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a run command parameter.",
///  "type": "object",
///  "required": [
///    "name",
///    "type"
///  ],
///  "properties": {
///    "defaultValue": {
///      "description": "The run command parameter default value.",
///      "type": "string"
///    },
///    "name": {
///      "description": "The run command parameter name.",
///      "type": "string"
///    },
///    "required": {
///      "description": "The run command parameter required.",
///      "type": "boolean"
///    },
///    "type": {
///      "description": "The run command parameter type.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RunCommandParameterDefinition {
    ///The run command parameter default value.
    #[serde(
        rename = "defaultValue",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub default_value: ::std::option::Option<::std::string::String>,
    ///The run command parameter name.
    pub name: ::std::string::String,
    ///The run command parameter required.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub required: ::std::option::Option<bool>,
    ///The run command parameter type.
    #[serde(rename = "type")]
    pub type_: ::std::string::String,
}
impl ::std::convert::From<&RunCommandParameterDefinition>
for RunCommandParameterDefinition {
    fn from(value: &RunCommandParameterDefinition) -> Self {
        value.clone()
    }
}
///`RunCommandResult`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "value": {
///      "description": "Run command operation response.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct RunCommandResult {
    ///Run command operation response.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub value: ::std::vec::Vec<InstanceViewStatus>,
}
impl ::std::convert::From<&RunCommandResult> for RunCommandResult {
    fn from(value: &RunCommandResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for RunCommandResult {
    fn default() -> Self {
        Self { value: Default::default() }
    }
}
///Describes a scale-in policy for a virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a scale-in policy for a virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "forceDeletion": {
///      "description": "This property allows you to specify if virtual machines chosen for removal have to be force deleted when a virtual machine scale set is being scaled-in.(Feature in Preview)",
///      "type": "boolean"
///    },
///    "prioritizeUnhealthyVMs": {
///      "description": "This property allows you to prioritize the deletion of unhealthy and inactive VMs when a virtual machine scale set is being scaled-in.(Feature in Preview)",
///      "type": "boolean"
///    },
///    "rules": {
///      "description": "The rules to be followed when scaling-in a virtual machine scale set. <br><br> Possible values are: <br><br> **Default** When a virtual machine scale set is scaled in, the scale set will first be balanced across zones if it is a zonal scale set. Then, it will be balanced across Fault Domains as far as possible. Within each Fault Domain, the virtual machines chosen for removal will be the newest ones that are not protected from scale-in. <br><br> **OldestVM** When a virtual machine scale set is being scaled-in, the oldest virtual machines that are not protected from scale-in will be chosen for removal. For zonal virtual machine scale sets, the scale set will first be balanced across zones. Within each zone, the oldest virtual machines that are not protected will be chosen for removal. <br><br> **NewestVM** When a virtual machine scale set is being scaled-in, the newest virtual machines that are not protected from scale-in will be chosen for removal. For zonal virtual machine scale sets, the scale set will first be balanced across zones. Within each zone, the newest virtual machines that are not protected will be chosen for removal. <br><br>",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetScaleInRules"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ScaleInPolicy {
    ///This property allows you to specify if virtual machines chosen for removal have to be force deleted when a virtual machine scale set is being scaled-in.(Feature in Preview)
    #[serde(
        rename = "forceDeletion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub force_deletion: ::std::option::Option<bool>,
    ///This property allows you to prioritize the deletion of unhealthy and inactive VMs when a virtual machine scale set is being scaled-in.(Feature in Preview)
    #[serde(
        rename = "prioritizeUnhealthyVMs",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub prioritize_unhealthy_v_ms: ::std::option::Option<bool>,
    ///The rules to be followed when scaling-in a virtual machine scale set. <br><br> Possible values are: <br><br> **Default** When a virtual machine scale set is scaled in, the scale set will first be balanced across zones if it is a zonal scale set. Then, it will be balanced across Fault Domains as far as possible. Within each Fault Domain, the virtual machines chosen for removal will be the newest ones that are not protected from scale-in. <br><br> **OldestVM** When a virtual machine scale set is being scaled-in, the oldest virtual machines that are not protected from scale-in will be chosen for removal. For zonal virtual machine scale sets, the scale set will first be balanced across zones. Within each zone, the oldest virtual machines that are not protected will be chosen for removal. <br><br> **NewestVM** When a virtual machine scale set is being scaled-in, the newest virtual machines that are not protected from scale-in will be chosen for removal. For zonal virtual machine scale sets, the scale set will first be balanced across zones. Within each zone, the newest virtual machines that are not protected will be chosen for removal. <br><br>
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub rules: ::std::vec::Vec<VirtualMachineScaleSetScaleInRules>,
}
impl ::std::convert::From<&ScaleInPolicy> for ScaleInPolicy {
    fn from(value: &ScaleInPolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ScaleInPolicy {
    fn default() -> Self {
        Self {
            force_deletion: Default::default(),
            prioritize_unhealthy_v_ms: Default::default(),
            rules: Default::default(),
        }
    }
}
///Defines the schedule for Block-type capacity reservations. Specifies the schedule during which capacity reservation is active and VM or VMSS resource can be allocated using reservation. This property is required and only supported when the capacity reservation group type is 'Block'. The scheduleProfile, start, and end fields are immutable after creation. Minimum API version: 2025-04-01. Please refer to https://aka.ms/blockcapacityreservation for more details.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Defines the schedule for Block-type capacity reservations. Specifies the schedule during which capacity reservation is active and VM or VMSS resource can be allocated using reservation. This property is required and only supported when the capacity reservation group type is 'Block'. The scheduleProfile, start, and end fields are immutable after creation. Minimum API version: 2025-04-01. Please refer to https://aka.ms/blockcapacityreservation for more details.",
///  "type": "object",
///  "properties": {
///    "end": {
///      "description": "The required end date for block capacity reservations. Must be after the start date, with a duration of either 1–14 whole days or 3–26 whole weeks. Example: 2025-06-28.",
///      "type": "string"
///    },
///    "start": {
///      "description": "The required start date for block capacity reservations. Must be today or within 56 days in the future. For same-day scheduling, requests must be submitted before 11:30 AM UTC. Example: 2025-06-27.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ScheduleProfile {
    ///The required end date for block capacity reservations. Must be after the start date, with a duration of either 1–14 whole days or 3–26 whole weeks. Example: 2025-06-28.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub end: ::std::option::Option<::std::string::String>,
    ///The required start date for block capacity reservations. Must be today or within 56 days in the future. For same-day scheduling, requests must be submitted before 11:30 AM UTC. Example: 2025-06-27.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub start: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&ScheduleProfile> for ScheduleProfile {
    fn from(value: &ScheduleProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ScheduleProfile {
    fn default() -> Self {
        Self {
            end: Default::default(),
            start: Default::default(),
        }
    }
}
///`ScheduledEventsAdditionalPublishingTargets`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "eventGridAndResourceGraph": {
///      "$ref": "#/components/schemas/EventGridAndResourceGraph"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ScheduledEventsAdditionalPublishingTargets {
    #[serde(
        rename = "eventGridAndResourceGraph",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub event_grid_and_resource_graph: ::std::option::Option<EventGridAndResourceGraph>,
}
impl ::std::convert::From<&ScheduledEventsAdditionalPublishingTargets>
for ScheduledEventsAdditionalPublishingTargets {
    fn from(value: &ScheduledEventsAdditionalPublishingTargets) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ScheduledEventsAdditionalPublishingTargets {
    fn default() -> Self {
        Self {
            event_grid_and_resource_graph: Default::default(),
        }
    }
}
///Specifies Redeploy, Reboot and ScheduledEventsAdditionalPublishingTargets Scheduled Event related configurations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies Redeploy, Reboot and ScheduledEventsAdditionalPublishingTargets Scheduled Event related configurations.",
///  "type": "object",
///  "properties": {
///    "allInstancesDown": {
///      "$ref": "#/components/schemas/AllInstancesDown"
///    },
///    "scheduledEventsAdditionalPublishingTargets": {
///      "$ref": "#/components/schemas/ScheduledEventsAdditionalPublishingTargets"
///    },
///    "userInitiatedReboot": {
///      "$ref": "#/components/schemas/UserInitiatedReboot"
///    },
///    "userInitiatedRedeploy": {
///      "$ref": "#/components/schemas/UserInitiatedRedeploy"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ScheduledEventsPolicy {
    #[serde(
        rename = "allInstancesDown",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub all_instances_down: ::std::option::Option<AllInstancesDown>,
    #[serde(
        rename = "scheduledEventsAdditionalPublishingTargets",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scheduled_events_additional_publishing_targets: ::std::option::Option<
        ScheduledEventsAdditionalPublishingTargets,
    >,
    #[serde(
        rename = "userInitiatedReboot",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub user_initiated_reboot: ::std::option::Option<UserInitiatedReboot>,
    #[serde(
        rename = "userInitiatedRedeploy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub user_initiated_redeploy: ::std::option::Option<UserInitiatedRedeploy>,
}
impl ::std::convert::From<&ScheduledEventsPolicy> for ScheduledEventsPolicy {
    fn from(value: &ScheduledEventsPolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ScheduledEventsPolicy {
    fn default() -> Self {
        Self {
            all_instances_down: Default::default(),
            scheduled_events_additional_publishing_targets: Default::default(),
            user_initiated_reboot: Default::default(),
            user_initiated_redeploy: Default::default(),
        }
    }
}
///`ScheduledEventsProfile`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "osImageNotificationProfile": {
///      "$ref": "#/components/schemas/OSImageNotificationProfile"
///    },
///    "terminateNotificationProfile": {
///      "$ref": "#/components/schemas/TerminateNotificationProfile"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ScheduledEventsProfile {
    #[serde(
        rename = "osImageNotificationProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_image_notification_profile: ::std::option::Option<OsImageNotificationProfile>,
    #[serde(
        rename = "terminateNotificationProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub terminate_notification_profile: ::std::option::Option<
        TerminateNotificationProfile,
    >,
}
impl ::std::convert::From<&ScheduledEventsProfile> for ScheduledEventsProfile {
    fn from(value: &ScheduledEventsProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ScheduledEventsProfile {
    fn default() -> Self {
        Self {
            os_image_notification_profile: Default::default(),
            terminate_notification_profile: Default::default(),
        }
    }
}
///Script shell types.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Script shell types.",
///  "type": "string",
///  "enum": [
///    "Default",
///    "Powershell7"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ScriptShellTypes",
///    "values": [
///      {
///        "description": "Default script shell type.",
///        "name": "Default",
///        "value": "Default"
///      },
///      {
///        "description": "Powershell7 script shell type.",
///        "name": "Powershell7",
///        "value": "Powershell7"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ScriptShellTypes {
    Default,
    Powershell7,
}
impl ::std::convert::From<&Self> for ScriptShellTypes {
    fn from(value: &ScriptShellTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ScriptShellTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Default => f.write_str("Default"),
            Self::Powershell7 => f.write_str("Powershell7"),
        }
    }
}
impl ::std::str::FromStr for ScriptShellTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "default" => Ok(Self::Default),
            "powershell7" => Ok(Self::Powershell7),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ScriptShellTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ScriptShellTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ScriptShellTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the EncryptionType of the managed disk. It is set to DiskWithVMGuestState for encryption of the managed disk along with VMGuestState blob, VMGuestStateOnly for encryption of just the VMGuestState blob, and NonPersistedTPM for not persisting firmware state in the VMGuestState blob.. **Note:** It can be set for only Confidential VMs.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the EncryptionType of the managed disk. It is set to DiskWithVMGuestState for encryption of the managed disk along with VMGuestState blob, VMGuestStateOnly for encryption of just the VMGuestState blob, and NonPersistedTPM for not persisting firmware state in the VMGuestState blob.. **Note:** It can be set for only Confidential VMs.",
///  "type": "string",
///  "enum": [
///    "VMGuestStateOnly",
///    "DiskWithVMGuestState",
///    "NonPersistedTPM"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "SecurityEncryptionTypes",
///    "values": [
///      {
///        "name": "VMGuestStateOnly",
///        "value": "VMGuestStateOnly"
///      },
///      {
///        "name": "DiskWithVMGuestState",
///        "value": "DiskWithVMGuestState"
///      },
///      {
///        "name": "NonPersistedTPM",
///        "value": "NonPersistedTPM"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum SecurityEncryptionTypes {
    #[serde(rename = "VMGuestStateOnly")]
    VmGuestStateOnly,
    #[serde(rename = "DiskWithVMGuestState")]
    DiskWithVmGuestState,
    #[serde(rename = "NonPersistedTPM")]
    NonPersistedTpm,
}
impl ::std::convert::From<&Self> for SecurityEncryptionTypes {
    fn from(value: &SecurityEncryptionTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for SecurityEncryptionTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::VmGuestStateOnly => f.write_str("VMGuestStateOnly"),
            Self::DiskWithVmGuestState => f.write_str("DiskWithVMGuestState"),
            Self::NonPersistedTpm => f.write_str("NonPersistedTPM"),
        }
    }
}
impl ::std::str::FromStr for SecurityEncryptionTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "vmgueststateonly" => Ok(Self::VmGuestStateOnly),
            "diskwithvmgueststate" => Ok(Self::DiskWithVmGuestState),
            "nonpersistedtpm" => Ok(Self::NonPersistedTpm),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for SecurityEncryptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for SecurityEncryptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for SecurityEncryptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the security posture to be used in the scale set. Minimum api-version: 2023-03-01
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the security posture to be used in the scale set. Minimum api-version: 2023-03-01",
///  "type": "object",
///  "required": [
///    "id"
///  ],
///  "properties": {
///    "excludeExtensions": {
///      "description": "The list of virtual machine extension names to exclude when applying the security posture.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "id": {
///      "description": "The security posture reference id in the form of /CommunityGalleries/{communityGalleryName}/securityPostures/{securityPostureName}/versions/{major.minor.patch}|latest",
///      "type": "string"
///    },
///    "isOverridable": {
///      "description": "Whether the security posture can be overridden by the user.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SecurityPostureReference {
    ///The list of virtual machine extension names to exclude when applying the security posture.
    #[serde(
        rename = "excludeExtensions",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub exclude_extensions: ::std::vec::Vec<::std::string::String>,
    ///The security posture reference id in the form of /CommunityGalleries/{communityGalleryName}/securityPostures/{securityPostureName}/versions/{major.minor.patch}|latest
    pub id: ::std::string::String,
    ///Whether the security posture can be overridden by the user.
    #[serde(
        rename = "isOverridable",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub is_overridable: ::std::option::Option<bool>,
}
impl ::std::convert::From<&SecurityPostureReference> for SecurityPostureReference {
    fn from(value: &SecurityPostureReference) -> Self {
        value.clone()
    }
}
///Specifies the security posture to be used in the scale set. Minimum api-version: 2023-03-01
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the security posture to be used in the scale set. Minimum api-version: 2023-03-01",
///  "type": "object",
///  "properties": {
///    "excludeExtensions": {
///      "description": "The list of virtual machine extension names to exclude when applying the security posture.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "id": {
///      "description": "The security posture reference id in the form of /CommunityGalleries/{communityGalleryName}/securityPostures/{securityPostureName}/versions/{major.minor.patch}|latest",
///      "type": "string"
///    },
///    "isOverridable": {
///      "description": "Whether the security posture can be overridden by the user.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SecurityPostureReferenceUpdate {
    ///The list of virtual machine extension names to exclude when applying the security posture.
    #[serde(
        rename = "excludeExtensions",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub exclude_extensions: ::std::vec::Vec<::std::string::String>,
    ///The security posture reference id in the form of /CommunityGalleries/{communityGalleryName}/securityPostures/{securityPostureName}/versions/{major.minor.patch}|latest
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///Whether the security posture can be overridden by the user.
    #[serde(
        rename = "isOverridable",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub is_overridable: ::std::option::Option<bool>,
}
impl ::std::convert::From<&SecurityPostureReferenceUpdate>
for SecurityPostureReferenceUpdate {
    fn from(value: &SecurityPostureReferenceUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SecurityPostureReferenceUpdate {
    fn default() -> Self {
        Self {
            exclude_extensions: Default::default(),
            id: Default::default(),
            is_overridable: Default::default(),
        }
    }
}
///Specifies the Security profile settings for the virtual machine or virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the Security profile settings for the virtual machine or virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "encryptionAtHost": {
///      "description": "This property can be used by user in the request to enable or disable the Host Encryption for the virtual machine or virtual machine scale set. This will enable the encryption for all the disks including Resource/Temp disk at host itself. The default behavior is: The Encryption at host will be disabled unless this property is set to true for the resource.",
///      "type": "boolean"
///    },
///    "encryptionIdentity": {
///      "$ref": "#/components/schemas/EncryptionIdentity"
///    },
///    "proxyAgentSettings": {
///      "$ref": "#/components/schemas/ProxyAgentSettings"
///    },
///    "securityType": {
///      "$ref": "#/components/schemas/SecurityTypes"
///    },
///    "uefiSettings": {
///      "$ref": "#/components/schemas/UefiSettings"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SecurityProfile {
    ///This property can be used by user in the request to enable or disable the Host Encryption for the virtual machine or virtual machine scale set. This will enable the encryption for all the disks including Resource/Temp disk at host itself. The default behavior is: The Encryption at host will be disabled unless this property is set to true for the resource.
    #[serde(
        rename = "encryptionAtHost",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub encryption_at_host: ::std::option::Option<bool>,
    #[serde(
        rename = "encryptionIdentity",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub encryption_identity: ::std::option::Option<EncryptionIdentity>,
    #[serde(
        rename = "proxyAgentSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub proxy_agent_settings: ::std::option::Option<ProxyAgentSettings>,
    #[serde(
        rename = "securityType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub security_type: ::std::option::Option<SecurityTypes>,
    #[serde(
        rename = "uefiSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub uefi_settings: ::std::option::Option<UefiSettings>,
}
impl ::std::convert::From<&SecurityProfile> for SecurityProfile {
    fn from(value: &SecurityProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SecurityProfile {
    fn default() -> Self {
        Self {
            encryption_at_host: Default::default(),
            encryption_identity: Default::default(),
            proxy_agent_settings: Default::default(),
            security_type: Default::default(),
            uefi_settings: Default::default(),
        }
    }
}
///Specifies the SecurityType of the virtual machine. It has to be set to any specified value to enable UefiSettings. The default behavior is: UefiSettings will not be enabled unless this property is set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the SecurityType of the virtual machine. It has to be set to any specified value to enable UefiSettings. The default behavior is: UefiSettings will not be enabled unless this property is set.",
///  "type": "string",
///  "enum": [
///    "TrustedLaunch",
///    "ConfidentialVM"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "SecurityTypes",
///    "values": [
///      {
///        "name": "TrustedLaunch",
///        "value": "TrustedLaunch"
///      },
///      {
///        "name": "ConfidentialVM",
///        "value": "ConfidentialVM"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum SecurityTypes {
    TrustedLaunch,
    #[serde(rename = "ConfidentialVM")]
    ConfidentialVm,
}
impl ::std::convert::From<&Self> for SecurityTypes {
    fn from(value: &SecurityTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for SecurityTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::TrustedLaunch => f.write_str("TrustedLaunch"),
            Self::ConfidentialVm => f.write_str("ConfidentialVM"),
        }
    }
}
impl ::std::str::FromStr for SecurityTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "trustedlaunch" => Ok(Self::TrustedLaunch),
            "confidentialvm" => Ok(Self::ConfidentialVm),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for SecurityTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for SecurityTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for SecurityTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the service artifact reference id used to set same image version for all virtual machines in the scale set when using 'latest' image version. Minimum api-version: 2022-11-01
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the service artifact reference id used to set same image version for all virtual machines in the scale set when using 'latest' image version. Minimum api-version: 2022-11-01",
///  "type": "object",
///  "properties": {
///    "id": {
///      "description": "The service artifact reference id in the form of /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/serviceArtifacts/{serviceArtifactName}/vmArtifactsProfiles/{vmArtifactsProfilesName}",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ServiceArtifactReference {
    ///The service artifact reference id in the form of /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/galleries/{galleryName}/serviceArtifacts/{serviceArtifactName}/vmArtifactsProfiles/{vmArtifactsProfilesName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&ServiceArtifactReference> for ServiceArtifactReference {
    fn from(value: &ServiceArtifactReference) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ServiceArtifactReference {
    fn default() -> Self {
        Self { id: Default::default() }
    }
}
///Specifies the name of the setting to which the content applies. Possible values are: FirstLogonCommands and AutoLogon.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the name of the setting to which the content applies. Possible values are: FirstLogonCommands and AutoLogon.",
///  "type": "string",
///  "enum": [
///    "AutoLogon",
///    "FirstLogonCommands"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "SettingNames"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum SettingNames {
    AutoLogon,
    FirstLogonCommands,
}
impl ::std::convert::From<&Self> for SettingNames {
    fn from(value: &SettingNames) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for SettingNames {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::AutoLogon => f.write_str("AutoLogon"),
            Self::FirstLogonCommands => f.write_str("FirstLogonCommands"),
        }
    }
}
impl ::std::str::FromStr for SettingNames {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "autologon" => Ok(Self::AutoLogon),
            "firstlogoncommands" => Ok(Self::FirstLogonCommands),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for SettingNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for SettingNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for SettingNames {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes a virtual machine scale set sku. NOTE: If the new VM SKU is not supported on the hardware the scale set is currently on, you need to deallocate the VMs in the scale set before you modify the SKU name.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set sku. NOTE: If the new VM SKU is not supported on the hardware the scale set is currently on, you need to deallocate the VMs in the scale set before you modify the SKU name.",
///  "type": "object",
///  "properties": {
///    "capacity": {
///      "description": "Specifies the number of virtual machines in the scale set.",
///      "type": "integer",
///      "format": "int64"
///    },
///    "name": {
///      "description": "The sku name.",
///      "type": "string"
///    },
///    "tier": {
///      "description": "Specifies the tier of virtual machines in a scale set.<br /><br /> Possible Values:<br /><br /> **Standard**<br /><br /> **Basic**",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct Sku {
    ///Specifies the number of virtual machines in the scale set.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub capacity: ::std::option::Option<i64>,
    ///The sku name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///Specifies the tier of virtual machines in a scale set.<br /><br /> Possible Values:<br /><br /> **Standard**<br /><br /> **Basic**
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tier: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&Sku> for Sku {
    fn from(value: &Sku) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for Sku {
    fn default() -> Self {
        Self {
            capacity: Default::default(),
            name: Default::default(),
            tier: Default::default(),
        }
    }
}
///Specifies the sku profile for the virtual machine scale set. With this property the customer is able to specify a list of VM sizes and an allocation strategy.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the sku profile for the virtual machine scale set. With this property the customer is able to specify a list of VM sizes and an allocation strategy.",
///  "type": "object",
///  "properties": {
///    "allocationStrategy": {
///      "$ref": "#/components/schemas/AllocationStrategy"
///    },
///    "vmSizes": {
///      "description": "Specifies the VM sizes for the virtual machine scale set.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SkuProfileVMSize"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SkuProfile {
    #[serde(
        rename = "allocationStrategy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub allocation_strategy: ::std::option::Option<AllocationStrategy>,
    ///Specifies the VM sizes for the virtual machine scale set.
    #[serde(
        rename = "vmSizes",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_sizes: ::std::vec::Vec<SkuProfileVmSize>,
}
impl ::std::convert::From<&SkuProfile> for SkuProfile {
    fn from(value: &SkuProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SkuProfile {
    fn default() -> Self {
        Self {
            allocation_strategy: Default::default(),
            vm_sizes: Default::default(),
        }
    }
}
///Specifies the VM Size.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the VM Size.",
///  "type": "object",
///  "properties": {
///    "name": {
///      "description": "Specifies the name of the VM Size.",
///      "type": "string"
///    },
///    "rank": {
///      "description": "Specifies the rank (a.k.a priority) associated with the VM Size.",
///      "type": "integer",
///      "format": "int32"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SkuProfileVmSize {
    ///Specifies the name of the VM Size.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///Specifies the rank (a.k.a priority) associated with the VM Size.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub rank: ::std::option::Option<i32>,
}
impl ::std::convert::From<&SkuProfileVmSize> for SkuProfileVmSize {
    fn from(value: &SkuProfileVmSize) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SkuProfileVmSize {
    fn default() -> Self {
        Self {
            name: Default::default(),
            rank: Default::default(),
        }
    }
}
///The state of snapshot which determines the access availability of the snapshot.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The state of snapshot which determines the access availability of the snapshot.",
///  "type": "string",
///  "enum": [
///    "Unknown",
///    "Pending",
///    "Available",
///    "InstantAccess",
///    "AvailableWithInstantAccess"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "SnapshotAccessState",
///    "values": [
///      {
///        "description": "Default value.",
///        "name": "Unknown",
///        "value": "Unknown"
///      },
///      {
///        "description": "The snapshot cannot be used for restore, copy or download to offline.",
///        "name": "Pending",
///        "value": "Pending"
///      },
///      {
///        "description": "The snapshot can be used for restore, copy to different region, and download to offline.",
///        "name": "Available",
///        "value": "Available"
///      },
///      {
///        "description": "The snapshot can be used for restoring disks with fast performance but cannot be copied or downloaded.",
///        "name": "InstantAccess",
///        "value": "InstantAccess"
///      },
///      {
///        "description": "The snapshot can be used for restoring disks with fast performance, copied and downloaded.",
///        "name": "AvailableWithInstantAccess",
///        "value": "AvailableWithInstantAccess"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum SnapshotAccessState {
    Unknown,
    Pending,
    Available,
    InstantAccess,
    AvailableWithInstantAccess,
}
impl ::std::convert::From<&Self> for SnapshotAccessState {
    fn from(value: &SnapshotAccessState) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for SnapshotAccessState {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Unknown => f.write_str("Unknown"),
            Self::Pending => f.write_str("Pending"),
            Self::Available => f.write_str("Available"),
            Self::InstantAccess => f.write_str("InstantAccess"),
            Self::AvailableWithInstantAccess => f.write_str("AvailableWithInstantAccess"),
        }
    }
}
impl ::std::str::FromStr for SnapshotAccessState {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "unknown" => Ok(Self::Unknown),
            "pending" => Ok(Self::Pending),
            "available" => Ok(Self::Available),
            "instantaccess" => Ok(Self::InstantAccess),
            "availablewithinstantaccess" => Ok(Self::AvailableWithInstantAccess),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for SnapshotAccessState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for SnapshotAccessState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for SnapshotAccessState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the Spot-Try-Restore properties for the virtual machine scale set. With this property customer can enable or disable automatic restore of the evicted Spot VMSS VM instances opportunistically based on capacity availability and pricing constraint.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the Spot-Try-Restore properties for the virtual machine scale set. With this property customer can enable or disable automatic restore of the evicted Spot VMSS VM instances opportunistically based on capacity availability and pricing constraint.",
///  "type": "object",
///  "properties": {
///    "enabled": {
///      "description": "Enables the Spot-Try-Restore feature where evicted VMSS SPOT instances will be tried to be restored opportunistically based on capacity availability and pricing constraints",
///      "type": "boolean"
///    },
///    "restoreTimeout": {
///      "description": "Timeout value expressed as an ISO 8601 time duration after which the platform will not try to restore the VMSS SPOT instances",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SpotRestorePolicy {
    ///Enables the Spot-Try-Restore feature where evicted VMSS SPOT instances will be tried to be restored opportunistically based on capacity availability and pricing constraints
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enabled: ::std::option::Option<bool>,
    ///Timeout value expressed as an ISO 8601 time duration after which the platform will not try to restore the VMSS SPOT instances
    #[serde(
        rename = "restoreTimeout",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub restore_timeout: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&SpotRestorePolicy> for SpotRestorePolicy {
    fn from(value: &SpotRestorePolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SpotRestorePolicy {
    fn default() -> Self {
        Self {
            enabled: Default::default(),
            restore_timeout: Default::default(),
        }
    }
}
///SSH configuration for Linux based VMs running on Azure
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "SSH configuration for Linux based VMs running on Azure",
///  "type": "object",
///  "properties": {
///    "publicKeys": {
///      "description": "The list of SSH public keys used to authenticate with linux based VMs.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SshPublicKey"
///      },
///      "x-ms-identifiers": [
///        "path"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SshConfiguration {
    ///The list of SSH public keys used to authenticate with linux based VMs.
    #[serde(
        rename = "publicKeys",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub public_keys: ::std::vec::Vec<SshPublicKey>,
}
impl ::std::convert::From<&SshConfiguration> for SshConfiguration {
    fn from(value: &SshConfiguration) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SshConfiguration {
    fn default() -> Self {
        Self {
            public_keys: Default::default(),
        }
    }
}
///The encryption type of the SSH keys to be generated. See SshEncryptionTypes for possible set of values. If not provided, will default to RSA
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The encryption type of the SSH keys to be generated. See SshEncryptionTypes for possible set of values. If not provided, will default to RSA",
///  "type": "string",
///  "enum": [
///    "RSA",
///    "Ed25519"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "SshEncryptionTypes",
///    "values": [
///      {
///        "name": "RSA",
///        "value": "RSA"
///      },
///      {
///        "name": "Ed25519",
///        "value": "Ed25519"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum SshEncryptionTypes {
    #[serde(rename = "RSA")]
    Rsa,
    Ed25519,
}
impl ::std::convert::From<&Self> for SshEncryptionTypes {
    fn from(value: &SshEncryptionTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for SshEncryptionTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Rsa => f.write_str("RSA"),
            Self::Ed25519 => f.write_str("Ed25519"),
        }
    }
}
impl ::std::str::FromStr for SshEncryptionTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "rsa" => Ok(Self::Rsa),
            "ed25519" => Ok(Self::Ed25519),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for SshEncryptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for SshEncryptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for SshEncryptionTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Parameters for GenerateSshKeyPair.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Parameters for GenerateSshKeyPair.",
///  "type": "object",
///  "properties": {
///    "encryptionType": {
///      "$ref": "#/components/schemas/SshEncryptionTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SshGenerateKeyPairInputParameters {
    #[serde(
        rename = "encryptionType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub encryption_type: ::std::option::Option<SshEncryptionTypes>,
}
impl ::std::convert::From<&SshGenerateKeyPairInputParameters>
for SshGenerateKeyPairInputParameters {
    fn from(value: &SshGenerateKeyPairInputParameters) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SshGenerateKeyPairInputParameters {
    fn default() -> Self {
        Self {
            encryption_type: Default::default(),
        }
    }
}
///Contains information about SSH certificate public key and the path on the Linux VM where the public key is placed.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Contains information about SSH certificate public key and the path on the Linux VM where the public key is placed.",
///  "type": "object",
///  "properties": {
///    "keyData": {
///      "description": "SSH public key certificate used to authenticate with the VM through ssh. The key needs to be at least 2048-bit and in ssh-rsa format. For creating ssh keys, see [Create SSH keys on Linux and Mac for Linux VMs in Azure]https://docs.microsoft.com/azure/virtual-machines/linux/create-ssh-keys-detailed).",
///      "type": "string"
///    },
///    "path": {
///      "description": "Specifies the full path on the created VM where ssh public key is stored. If the file already exists, the specified key is appended to the file. Example: /home/user/.ssh/authorized_keys",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SshPublicKey {
    ///SSH public key certificate used to authenticate with the VM through ssh. The key needs to be at least 2048-bit and in ssh-rsa format. For creating ssh keys, see [Create SSH keys on Linux and Mac for Linux VMs in Azure]https://docs.microsoft.com/azure/virtual-machines/linux/create-ssh-keys-detailed).
    #[serde(
        rename = "keyData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub key_data: ::std::option::Option<::std::string::String>,
    ///Specifies the full path on the created VM where ssh public key is stored. If the file already exists, the specified key is appended to the file. Example: /home/user/.ssh/authorized_keys
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub path: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&SshPublicKey> for SshPublicKey {
    fn from(value: &SshPublicKey) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SshPublicKey {
    fn default() -> Self {
        Self {
            key_data: Default::default(),
            path: Default::default(),
        }
    }
}
///Response from generation of an SSH key pair.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Response from generation of an SSH key pair.",
///  "type": "object",
///  "required": [
///    "id",
///    "privateKey",
///    "publicKey"
///  ],
///  "properties": {
///    "id": {
///      "description": "The ARM resource id in the form of /subscriptions/{SubscriptionId}/resourceGroups/{ResourceGroupName}/providers/Microsoft.Compute/sshPublicKeys/{SshPublicKeyName}",
///      "type": "string"
///    },
///    "privateKey": {
///      "description": "Private key portion of the key pair used to authenticate to a virtual machine through ssh. The private key is returned in RFC3447 format and should be treated as a secret.",
///      "type": "string"
///    },
///    "publicKey": {
///      "description": "Public key portion of the key pair used to authenticate to a virtual machine through ssh. The public key is in ssh-rsa format.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SshPublicKeyGenerateKeyPairResult {
    ///The ARM resource id in the form of /subscriptions/{SubscriptionId}/resourceGroups/{ResourceGroupName}/providers/Microsoft.Compute/sshPublicKeys/{SshPublicKeyName}
    pub id: ::std::string::String,
    ///Private key portion of the key pair used to authenticate to a virtual machine through ssh. The private key is returned in RFC3447 format and should be treated as a secret.
    #[serde(rename = "privateKey")]
    pub private_key: ::std::string::String,
    ///Public key portion of the key pair used to authenticate to a virtual machine through ssh. The public key is in ssh-rsa format.
    #[serde(rename = "publicKey")]
    pub public_key: ::std::string::String,
}
impl ::std::convert::From<&SshPublicKeyGenerateKeyPairResult>
for SshPublicKeyGenerateKeyPairResult {
    fn from(value: &SshPublicKeyGenerateKeyPairResult) -> Self {
        value.clone()
    }
}
///Specifies information about the SSH public key.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the SSH public key.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/SshPublicKeyResourceProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SshPublicKeyResource {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<SshPublicKeyResourceProperties>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&SshPublicKeyResource> for SshPublicKeyResource {
    fn from(value: &SshPublicKeyResource) -> Self {
        value.clone()
    }
}
///Properties of the SSH public key.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Properties of the SSH public key.",
///  "type": "object",
///  "properties": {
///    "publicKey": {
///      "description": "SSH public key used to authenticate to a virtual machine through ssh. If this property is not initially provided when the resource is created, the publicKey property will be populated when generateKeyPair is called. If the public key is provided upon resource creation, the provided public key needs to be at least 2048-bit and in ssh-rsa format.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SshPublicKeyResourceProperties {
    ///SSH public key used to authenticate to a virtual machine through ssh. If this property is not initially provided when the resource is created, the publicKey property will be populated when generateKeyPair is called. If the public key is provided upon resource creation, the provided public key needs to be at least 2048-bit and in ssh-rsa format.
    #[serde(
        rename = "publicKey",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub public_key: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&SshPublicKeyResourceProperties>
for SshPublicKeyResourceProperties {
    fn from(value: &SshPublicKeyResourceProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SshPublicKeyResourceProperties {
    fn default() -> Self {
        Self {
            public_key: Default::default(),
        }
    }
}
///Specifies information about the SSH public key.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies information about the SSH public key.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/SshPublicKeyResourceProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SshPublicKeyUpdateResource {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<SshPublicKeyResourceProperties>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&SshPublicKeyUpdateResource> for SshPublicKeyUpdateResource {
    fn from(value: &SshPublicKeyUpdateResource) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SshPublicKeyUpdateResource {
    fn default() -> Self {
        Self {
            properties: Default::default(),
            tags: Default::default(),
        }
    }
}
///The list SSH public keys operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The list SSH public keys operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The URI to fetch the next page of SSH public keys. Call ListNext() with this URI to fetch the next page of SSH public keys.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of SSH public keys.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SshPublicKeyResource"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SshPublicKeysGroupListResult {
    ///The URI to fetch the next page of SSH public keys. Call ListNext() with this URI to fetch the next page of SSH public keys.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of SSH public keys.
    pub value: ::std::vec::Vec<SshPublicKeyResource>,
}
impl ::std::convert::From<&SshPublicKeysGroupListResult>
for SshPublicKeysGroupListResult {
    fn from(value: &SshPublicKeysGroupListResult) -> Self {
        value.clone()
    }
}
///The level code.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The level code.",
///  "type": "string",
///  "enum": [
///    "Info",
///    "Warning",
///    "Error"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "StatusLevelTypes"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum StatusLevelTypes {
    Info,
    Warning,
    Error,
}
impl ::std::convert::From<&Self> for StatusLevelTypes {
    fn from(value: &StatusLevelTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for StatusLevelTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Info => f.write_str("Info"),
            Self::Warning => f.write_str("Warning"),
            Self::Error => f.write_str("Error"),
        }
    }
}
impl ::std::str::FromStr for StatusLevelTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "info" => Ok(Self::Info),
            "warning" => Ok(Self::Warning),
            "error" => Ok(Self::Error),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for StatusLevelTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for StatusLevelTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for StatusLevelTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the storage account type for the managed disk. Managed OS disk storage account type can only be set when you create the scale set. NOTE: UltraSSD_LRS can only be used with data disks. It cannot be used with OS Disk. Standard_LRS uses Standard HDD. StandardSSD_LRS uses Standard SSD. Premium_LRS uses Premium SSD. UltraSSD_LRS uses Ultra disk. Premium_ZRS uses Premium SSD zone redundant storage. StandardSSD_ZRS uses Standard SSD zone redundant storage. For more information regarding disks supported for Windows Virtual Machines, refer to https://docs.microsoft.com/azure/virtual-machines/windows/disks-types and, for Linux Virtual Machines, refer to https://docs.microsoft.com/azure/virtual-machines/linux/disks-types
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the storage account type for the managed disk. Managed OS disk storage account type can only be set when you create the scale set. NOTE: UltraSSD_LRS can only be used with data disks. It cannot be used with OS Disk. Standard_LRS uses Standard HDD. StandardSSD_LRS uses Standard SSD. Premium_LRS uses Premium SSD. UltraSSD_LRS uses Ultra disk. Premium_ZRS uses Premium SSD zone redundant storage. StandardSSD_ZRS uses Standard SSD zone redundant storage. For more information regarding disks supported for Windows Virtual Machines, refer to https://docs.microsoft.com/azure/virtual-machines/windows/disks-types and, for Linux Virtual Machines, refer to https://docs.microsoft.com/azure/virtual-machines/linux/disks-types",
///  "type": "string",
///  "enum": [
///    "Standard_LRS",
///    "Premium_LRS",
///    "StandardSSD_LRS",
///    "UltraSSD_LRS",
///    "Premium_ZRS",
///    "StandardSSD_ZRS",
///    "PremiumV2_LRS"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "StorageAccountTypes",
///    "values": [
///      {
///        "name": "Standard_LRS",
///        "value": "Standard_LRS"
///      },
///      {
///        "name": "Premium_LRS",
///        "value": "Premium_LRS"
///      },
///      {
///        "name": "StandardSSD_LRS",
///        "value": "StandardSSD_LRS"
///      },
///      {
///        "name": "UltraSSD_LRS",
///        "value": "UltraSSD_LRS"
///      },
///      {
///        "name": "Premium_ZRS",
///        "value": "Premium_ZRS"
///      },
///      {
///        "name": "StandardSSD_ZRS",
///        "value": "StandardSSD_ZRS"
///      },
///      {
///        "name": "PremiumV2_LRS",
///        "value": "PremiumV2_LRS"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum StorageAccountTypes {
    #[serde(rename = "Standard_LRS")]
    StandardLrs,
    #[serde(rename = "Premium_LRS")]
    PremiumLrs,
    #[serde(rename = "StandardSSD_LRS")]
    StandardSsdLrs,
    #[serde(rename = "UltraSSD_LRS")]
    UltraSsdLrs,
    #[serde(rename = "Premium_ZRS")]
    PremiumZrs,
    #[serde(rename = "StandardSSD_ZRS")]
    StandardSsdZrs,
    #[serde(rename = "PremiumV2_LRS")]
    PremiumV2Lrs,
}
impl ::std::convert::From<&Self> for StorageAccountTypes {
    fn from(value: &StorageAccountTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for StorageAccountTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::StandardLrs => f.write_str("Standard_LRS"),
            Self::PremiumLrs => f.write_str("Premium_LRS"),
            Self::StandardSsdLrs => f.write_str("StandardSSD_LRS"),
            Self::UltraSsdLrs => f.write_str("UltraSSD_LRS"),
            Self::PremiumZrs => f.write_str("Premium_ZRS"),
            Self::StandardSsdZrs => f.write_str("StandardSSD_ZRS"),
            Self::PremiumV2Lrs => f.write_str("PremiumV2_LRS"),
        }
    }
}
impl ::std::str::FromStr for StorageAccountTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "standard_lrs" => Ok(Self::StandardLrs),
            "premium_lrs" => Ok(Self::PremiumLrs),
            "standardssd_lrs" => Ok(Self::StandardSsdLrs),
            "ultrassd_lrs" => Ok(Self::UltraSsdLrs),
            "premium_zrs" => Ok(Self::PremiumZrs),
            "standardssd_zrs" => Ok(Self::StandardSsdZrs),
            "premiumv2_lrs" => Ok(Self::PremiumV2Lrs),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for StorageAccountTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for StorageAccountTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for StorageAccountTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the storage settings for the virtual machine disks.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the storage settings for the virtual machine disks.",
///  "type": "object",
///  "properties": {
///    "alignRegionalDisksToVMZone": {
///      "description": "Specifies whether the regional disks should be aligned/moved to the VM zone. This is applicable only for VMs with placement property set. Please note that this change is irreversible. Minimum api-version: 2024-11-01.",
///      "type": "boolean"
///    },
///    "dataDisks": {
///      "description": "Specifies the parameters that are used to add a data disk to a virtual machine. For more information about disks, see [About disks and VHDs for Azure virtual machines](https://docs.microsoft.com/azure/virtual-machines/managed-disks-overview).",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DataDisk"
///      },
///      "x-ms-identifiers": [
///        "lun"
///      ]
///    },
///    "diskControllerType": {
///      "$ref": "#/components/schemas/DiskControllerTypes"
///    },
///    "imageReference": {
///      "$ref": "#/components/schemas/ImageReference"
///    },
///    "osDisk": {
///      "$ref": "#/components/schemas/OSDisk"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct StorageProfile {
    ///Specifies whether the regional disks should be aligned/moved to the VM zone. This is applicable only for VMs with placement property set. Please note that this change is irreversible. Minimum api-version: 2024-11-01.
    #[serde(
        rename = "alignRegionalDisksToVMZone",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub align_regional_disks_to_vm_zone: ::std::option::Option<bool>,
    ///Specifies the parameters that are used to add a data disk to a virtual machine. For more information about disks, see [About disks and VHDs for Azure virtual machines](https://docs.microsoft.com/azure/virtual-machines/managed-disks-overview).
    #[serde(
        rename = "dataDisks",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub data_disks: ::std::vec::Vec<DataDisk>,
    #[serde(
        rename = "diskControllerType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_controller_type: ::std::option::Option<DiskControllerTypes>,
    #[serde(
        rename = "imageReference",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub image_reference: ::std::option::Option<ImageReference>,
    #[serde(
        rename = "osDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_disk: ::std::option::Option<OsDisk>,
}
impl ::std::convert::From<&StorageProfile> for StorageProfile {
    fn from(value: &StorageProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for StorageProfile {
    fn default() -> Self {
        Self {
            align_regional_disks_to_vm_zone: Default::default(),
            data_disks: Default::default(),
            disk_controller_type: Default::default(),
            image_reference: Default::default(),
            os_disk: Default::default(),
        }
    }
}
///`SubResource`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "id": {
///      "description": "Resource Id",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SubResource {
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&SubResource> for SubResource {
    fn from(value: &SubResource) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SubResource {
    fn default() -> Self {
        Self { id: Default::default() }
    }
}
///`SubResourceReadOnly`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "id": {
///      "description": "Resource Id",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SubResourceReadOnly {
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&SubResourceReadOnly> for SubResourceReadOnly {
    fn from(value: &SubResourceReadOnly) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SubResourceReadOnly {
    fn default() -> Self {
        Self { id: Default::default() }
    }
}
///`SubResourceWithColocationStatus`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  ],
///  "properties": {
///    "colocationStatus": {
///      "$ref": "#/components/schemas/InstanceViewStatus"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SubResourceWithColocationStatus {
    #[serde(
        rename = "colocationStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub colocation_status: ::std::option::Option<InstanceViewStatus>,
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&SubResourceWithColocationStatus>
for SubResourceWithColocationStatus {
    fn from(value: &SubResourceWithColocationStatus) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SubResourceWithColocationStatus {
    fn default() -> Self {
        Self {
            colocation_status: Default::default(),
            id: Default::default(),
        }
    }
}
///Metadata pertaining to creation and last modification of the resource.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Metadata pertaining to creation and last modification of the resource.",
///  "readOnly": true,
///  "type": "object",
///  "properties": {
///    "createdAt": {
///      "description": "The timestamp of resource creation (UTC).",
///      "type": "string"
///    },
///    "createdBy": {
///      "description": "The identity that created the resource.",
///      "type": "string"
///    },
///    "createdByType": {
///      "description": "The type of identity that created the resource.",
///      "type": "string",
///      "enum": [
///        "User",
///        "Application",
///        "ManagedIdentity",
///        "Key"
///      ],
///      "x-ms-enum": {
///        "modelAsString": true,
///        "name": "createdByType"
///      }
///    },
///    "lastModifiedAt": {
///      "description": "The timestamp of resource last modification (UTC)",
///      "type": "string"
///    },
///    "lastModifiedBy": {
///      "description": "The identity that last modified the resource.",
///      "type": "string"
///    },
///    "lastModifiedByType": {
///      "description": "The type of identity that last modified the resource.",
///      "type": "string",
///      "enum": [
///        "User",
///        "Application",
///        "ManagedIdentity",
///        "Key"
///      ],
///      "x-ms-enum": {
///        "modelAsString": true,
///        "name": "createdByType"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct SystemData {
    ///The timestamp of resource creation (UTC).
    #[serde(
        rename = "createdAt",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub created_at: ::std::option::Option<::std::string::String>,
    ///The identity that created the resource.
    #[serde(
        rename = "createdBy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub created_by: ::std::option::Option<::std::string::String>,
    ///The type of identity that created the resource.
    #[serde(
        rename = "createdByType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub created_by_type: ::std::option::Option<SystemDataCreatedByType>,
    ///The timestamp of resource last modification (UTC)
    #[serde(
        rename = "lastModifiedAt",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_modified_at: ::std::option::Option<::std::string::String>,
    ///The identity that last modified the resource.
    #[serde(
        rename = "lastModifiedBy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_modified_by: ::std::option::Option<::std::string::String>,
    ///The type of identity that last modified the resource.
    #[serde(
        rename = "lastModifiedByType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_modified_by_type: ::std::option::Option<SystemDataLastModifiedByType>,
}
impl ::std::convert::From<&SystemData> for SystemData {
    fn from(value: &SystemData) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for SystemData {
    fn default() -> Self {
        Self {
            created_at: Default::default(),
            created_by: Default::default(),
            created_by_type: Default::default(),
            last_modified_at: Default::default(),
            last_modified_by: Default::default(),
            last_modified_by_type: Default::default(),
        }
    }
}
///The type of identity that created the resource.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The type of identity that created the resource.",
///  "type": "string",
///  "enum": [
///    "User",
///    "Application",
///    "ManagedIdentity",
///    "Key"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "createdByType"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum SystemDataCreatedByType {
    User,
    Application,
    ManagedIdentity,
    Key,
}
impl ::std::convert::From<&Self> for SystemDataCreatedByType {
    fn from(value: &SystemDataCreatedByType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for SystemDataCreatedByType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::User => f.write_str("User"),
            Self::Application => f.write_str("Application"),
            Self::ManagedIdentity => f.write_str("ManagedIdentity"),
            Self::Key => f.write_str("Key"),
        }
    }
}
impl ::std::str::FromStr for SystemDataCreatedByType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "user" => Ok(Self::User),
            "application" => Ok(Self::Application),
            "managedidentity" => Ok(Self::ManagedIdentity),
            "key" => Ok(Self::Key),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for SystemDataCreatedByType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for SystemDataCreatedByType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for SystemDataCreatedByType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The type of identity that last modified the resource.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The type of identity that last modified the resource.",
///  "type": "string",
///  "enum": [
///    "User",
///    "Application",
///    "ManagedIdentity",
///    "Key"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "createdByType"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum SystemDataLastModifiedByType {
    User,
    Application,
    ManagedIdentity,
    Key,
}
impl ::std::convert::From<&Self> for SystemDataLastModifiedByType {
    fn from(value: &SystemDataLastModifiedByType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for SystemDataLastModifiedByType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::User => f.write_str("User"),
            Self::Application => f.write_str("Application"),
            Self::ManagedIdentity => f.write_str("ManagedIdentity"),
            Self::Key => f.write_str("Key"),
        }
    }
}
impl ::std::str::FromStr for SystemDataLastModifiedByType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "user" => Ok(Self::User),
            "application" => Ok(Self::Application),
            "managedidentity" => Ok(Self::ManagedIdentity),
            "key" => Ok(Self::Key),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for SystemDataLastModifiedByType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for SystemDataLastModifiedByType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for SystemDataLastModifiedByType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///`TerminateNotificationProfile`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "enable": {
///      "description": "Specifies whether the Terminate Scheduled event is enabled or disabled.",
///      "type": "boolean"
///    },
///    "notBeforeTimeout": {
///      "description": "Configurable length of time a Virtual Machine being deleted will have to potentially approve the Terminate Scheduled Event before the event is auto approved (timed out). The configuration must be specified in ISO 8601 format, the default value is 5 minutes (PT5M)",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct TerminateNotificationProfile {
    ///Specifies whether the Terminate Scheduled event is enabled or disabled.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable: ::std::option::Option<bool>,
    ///Configurable length of time a Virtual Machine being deleted will have to potentially approve the Terminate Scheduled Event before the event is auto approved (timed out). The configuration must be specified in ISO 8601 format, the default value is 5 minutes (PT5M)
    #[serde(
        rename = "notBeforeTimeout",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub not_before_timeout: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&TerminateNotificationProfile>
for TerminateNotificationProfile {
    fn from(value: &TerminateNotificationProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for TerminateNotificationProfile {
    fn default() -> Self {
        Self {
            enable: Default::default(),
            not_before_timeout: Default::default(),
        }
    }
}
///Api request input for LogAnalytics getThrottledRequests Api.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Api request input for LogAnalytics getThrottledRequests Api.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/LogAnalyticsInputBase"
///    }
///  ]
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(transparent)]
pub struct ThrottledRequestsInput(pub LogAnalyticsInputBase);
impl ::std::ops::Deref for ThrottledRequestsInput {
    type Target = LogAnalyticsInputBase;
    fn deref(&self) -> &LogAnalyticsInputBase {
        &self.0
    }
}
impl ::std::convert::From<ThrottledRequestsInput> for LogAnalyticsInputBase {
    fn from(value: ThrottledRequestsInput) -> Self {
        value.0
    }
}
impl ::std::convert::From<&ThrottledRequestsInput> for ThrottledRequestsInput {
    fn from(value: &ThrottledRequestsInput) -> Self {
        value.clone()
    }
}
impl ::std::convert::From<LogAnalyticsInputBase> for ThrottledRequestsInput {
    fn from(value: LogAnalyticsInputBase) -> Self {
        Self(value)
    }
}
///The resource model definition for an Azure Resource Manager tracked top level resource which has 'tags' and a 'location'
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "title": "Tracked Resource",
///  "description": "The resource model definition for an Azure Resource Manager tracked top level resource which has 'tags' and a 'location'",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/Resource"
///    }
///  ],
///  "required": [
///    "location"
///  ],
///  "properties": {
///    "location": {
///      "description": "The geo-location where the resource lives",
///      "type": "string",
///      "x-ms-mutability": [
///        "read",
///        "create"
///      ]
///    },
///    "tags": {
///      "description": "Resource tags.",
///      "type": "object",
///      "additionalProperties": {
///        "type": "string"
///      },
///      "x-ms-mutability": [
///        "read",
///        "create",
///        "update"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct TrackedResource {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&TrackedResource> for TrackedResource {
    fn from(value: &TrackedResource) -> Self {
        value.clone()
    }
}
///Specifies the security settings like secure boot and vTPM used while creating the virtual machine. Minimum api-version: 2020-12-01.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the security settings like secure boot and vTPM used while creating the virtual machine. Minimum api-version: 2020-12-01.",
///  "type": "object",
///  "properties": {
///    "secureBootEnabled": {
///      "description": "Specifies whether secure boot should be enabled on the virtual machine. Minimum api-version: 2020-12-01.",
///      "type": "boolean"
///    },
///    "vTpmEnabled": {
///      "description": "Specifies whether vTPM should be enabled on the virtual machine. Minimum api-version: 2020-12-01.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct UefiSettings {
    ///Specifies whether secure boot should be enabled on the virtual machine. Minimum api-version: 2020-12-01.
    #[serde(
        rename = "secureBootEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub secure_boot_enabled: ::std::option::Option<bool>,
    ///Specifies whether vTPM should be enabled on the virtual machine. Minimum api-version: 2020-12-01.
    #[serde(
        rename = "vTpmEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub v_tpm_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&UefiSettings> for UefiSettings {
    fn from(value: &UefiSettings) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for UefiSettings {
    fn default() -> Self {
        Self {
            secure_boot_enabled: Default::default(),
            v_tpm_enabled: Default::default(),
        }
    }
}
///The Update Resource model definition.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The Update Resource model definition.",
///  "type": "object",
///  "properties": {
///    "tags": {
///      "description": "Resource tags",
///      "type": "object",
///      "additionalProperties": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct UpdateResource {
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&UpdateResource> for UpdateResource {
    fn from(value: &UpdateResource) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for UpdateResource {
    fn default() -> Self {
        Self { tags: Default::default() }
    }
}
///Specifies the mode of an upgrade to virtual machines in the scale set.<br /><br /> Possible values are:<br /><br /> **Manual** - You  control the application of updates to virtual machines in the scale set. You do this by using the manualUpgrade action.<br /><br /> **Automatic** - All virtual machines in the scale set are  automatically updated at the same time.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the mode of an upgrade to virtual machines in the scale set.<br /><br /> Possible values are:<br /><br /> **Manual** - You  control the application of updates to virtual machines in the scale set. You do this by using the manualUpgrade action.<br /><br /> **Automatic** - All virtual machines in the scale set are  automatically updated at the same time.",
///  "type": "string",
///  "enum": [
///    "Automatic",
///    "Manual",
///    "Rolling"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "UpgradeMode"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum UpgradeMode {
    Automatic,
    Manual,
    Rolling,
}
impl ::std::convert::From<&Self> for UpgradeMode {
    fn from(value: &UpgradeMode) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for UpgradeMode {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Automatic => f.write_str("Automatic"),
            Self::Manual => f.write_str("Manual"),
            Self::Rolling => f.write_str("Rolling"),
        }
    }
}
impl ::std::str::FromStr for UpgradeMode {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "automatic" => Ok(Self::Automatic),
            "manual" => Ok(Self::Manual),
            "rolling" => Ok(Self::Rolling),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for UpgradeMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for UpgradeMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for UpgradeMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Virtual Machine Scale Set OS Upgrade History operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Virtual Machine Scale Set OS Upgrade History operation response.",
///  "type": "object",
///  "properties": {
///    "location": {
///      "description": "Resource location",
///      "readOnly": true,
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/UpgradeOperationHistoricalStatusInfoProperties"
///    },
///    "type": {
///      "description": "Resource type",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct UpgradeOperationHistoricalStatusInfo {
    ///Resource location
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub location: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<
        UpgradeOperationHistoricalStatusInfoProperties,
    >,
    ///Resource type
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&UpgradeOperationHistoricalStatusInfo>
for UpgradeOperationHistoricalStatusInfo {
    fn from(value: &UpgradeOperationHistoricalStatusInfo) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for UpgradeOperationHistoricalStatusInfo {
    fn default() -> Self {
        Self {
            location: Default::default(),
            properties: Default::default(),
            type_: Default::default(),
        }
    }
}
///Describes each OS upgrade on the Virtual Machine Scale Set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes each OS upgrade on the Virtual Machine Scale Set.",
///  "type": "object",
///  "properties": {
///    "error": {
///      "$ref": "#/components/schemas/ApiError"
///    },
///    "progress": {
///      "$ref": "#/components/schemas/RollingUpgradeProgressInfo"
///    },
///    "rollbackInfo": {
///      "$ref": "#/components/schemas/RollbackStatusInfo"
///    },
///    "runningStatus": {
///      "$ref": "#/components/schemas/UpgradeOperationHistoryStatus"
///    },
///    "startedBy": {
///      "$ref": "#/components/schemas/UpgradeOperationInvoker"
///    },
///    "targetImageReference": {
///      "$ref": "#/components/schemas/ImageReference"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct UpgradeOperationHistoricalStatusInfoProperties {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub error: ::std::option::Option<ApiError>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub progress: ::std::option::Option<RollingUpgradeProgressInfo>,
    #[serde(
        rename = "rollbackInfo",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub rollback_info: ::std::option::Option<RollbackStatusInfo>,
    #[serde(
        rename = "runningStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub running_status: ::std::option::Option<UpgradeOperationHistoryStatus>,
    #[serde(
        rename = "startedBy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub started_by: ::std::option::Option<UpgradeOperationInvoker>,
    #[serde(
        rename = "targetImageReference",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub target_image_reference: ::std::option::Option<ImageReference>,
}
impl ::std::convert::From<&UpgradeOperationHistoricalStatusInfoProperties>
for UpgradeOperationHistoricalStatusInfoProperties {
    fn from(value: &UpgradeOperationHistoricalStatusInfoProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for UpgradeOperationHistoricalStatusInfoProperties {
    fn default() -> Self {
        Self {
            error: Default::default(),
            progress: Default::default(),
            rollback_info: Default::default(),
            running_status: Default::default(),
            started_by: Default::default(),
            target_image_reference: Default::default(),
        }
    }
}
///Information about the current running state of the overall upgrade.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Information about the current running state of the overall upgrade.",
///  "type": "object",
///  "properties": {
///    "code": {
///      "$ref": "#/components/schemas/UpgradeState"
///    },
///    "endTime": {
///      "description": "End time of the upgrade.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "startTime": {
///      "description": "Start time of the upgrade.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct UpgradeOperationHistoryStatus {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub code: ::std::option::Option<UpgradeState>,
    ///End time of the upgrade.
    #[serde(
        rename = "endTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub end_time: ::std::option::Option<::std::string::String>,
    ///Start time of the upgrade.
    #[serde(
        rename = "startTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub start_time: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&UpgradeOperationHistoryStatus>
for UpgradeOperationHistoryStatus {
    fn from(value: &UpgradeOperationHistoryStatus) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for UpgradeOperationHistoryStatus {
    fn default() -> Self {
        Self {
            code: Default::default(),
            end_time: Default::default(),
            start_time: Default::default(),
        }
    }
}
///Invoker of the Upgrade Operation
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Invoker of the Upgrade Operation",
///  "type": "string",
///  "enum": [
///    "Unknown",
///    "User",
///    "Platform"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "UpgradeOperationInvoker"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum UpgradeOperationInvoker {
    Unknown,
    User,
    Platform,
}
impl ::std::convert::From<&Self> for UpgradeOperationInvoker {
    fn from(value: &UpgradeOperationInvoker) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for UpgradeOperationInvoker {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Unknown => f.write_str("Unknown"),
            Self::User => f.write_str("User"),
            Self::Platform => f.write_str("Platform"),
        }
    }
}
impl ::std::str::FromStr for UpgradeOperationInvoker {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "unknown" => Ok(Self::Unknown),
            "user" => Ok(Self::User),
            "platform" => Ok(Self::Platform),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for UpgradeOperationInvoker {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for UpgradeOperationInvoker {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for UpgradeOperationInvoker {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes an upgrade policy - automatic, manual, or rolling.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes an upgrade policy - automatic, manual, or rolling.",
///  "type": "object",
///  "properties": {
///    "automaticOSUpgradePolicy": {
///      "$ref": "#/components/schemas/AutomaticOSUpgradePolicy"
///    },
///    "mode": {
///      "$ref": "#/components/schemas/UpgradeMode"
///    },
///    "rollingUpgradePolicy": {
///      "$ref": "#/components/schemas/RollingUpgradePolicy"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct UpgradePolicy {
    #[serde(
        rename = "automaticOSUpgradePolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub automatic_os_upgrade_policy: ::std::option::Option<AutomaticOsUpgradePolicy>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub mode: ::std::option::Option<UpgradeMode>,
    #[serde(
        rename = "rollingUpgradePolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub rolling_upgrade_policy: ::std::option::Option<RollingUpgradePolicy>,
}
impl ::std::convert::From<&UpgradePolicy> for UpgradePolicy {
    fn from(value: &UpgradePolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for UpgradePolicy {
    fn default() -> Self {
        Self {
            automatic_os_upgrade_policy: Default::default(),
            mode: Default::default(),
            rolling_upgrade_policy: Default::default(),
        }
    }
}
///Code indicating the current status of the upgrade.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Code indicating the current status of the upgrade.",
///  "type": "string",
///  "enum": [
///    "RollingForward",
///    "Cancelled",
///    "Completed",
///    "Faulted"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "UpgradeState"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum UpgradeState {
    RollingForward,
    Cancelled,
    Completed,
    Faulted,
}
impl ::std::convert::From<&Self> for UpgradeState {
    fn from(value: &UpgradeState) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for UpgradeState {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::RollingForward => f.write_str("RollingForward"),
            Self::Cancelled => f.write_str("Cancelled"),
            Self::Completed => f.write_str("Completed"),
            Self::Faulted => f.write_str("Faulted"),
        }
    }
}
impl ::std::str::FromStr for UpgradeState {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "rollingforward" => Ok(Self::RollingForward),
            "cancelled" => Ok(Self::Cancelled),
            "completed" => Ok(Self::Completed),
            "faulted" => Ok(Self::Faulted),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for UpgradeState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for UpgradeState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for UpgradeState {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes Compute Resource Usage.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes Compute Resource Usage.",
///  "type": "object",
///  "required": [
///    "currentValue",
///    "limit",
///    "name",
///    "unit"
///  ],
///  "properties": {
///    "currentValue": {
///      "description": "The current usage of the resource.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "limit": {
///      "description": "The maximum permitted usage of the resource.",
///      "type": "integer",
///      "format": "int64"
///    },
///    "name": {
///      "$ref": "#/components/schemas/UsageName"
///    },
///    "unit": {
///      "description": "An enum describing the unit of usage measurement.",
///      "type": "string",
///      "enum": [
///        "Count"
///      ],
///      "x-ms-enum": {
///        "modelAsString": false
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct Usage {
    ///The current usage of the resource.
    #[serde(rename = "currentValue")]
    pub current_value: i32,
    ///The maximum permitted usage of the resource.
    pub limit: i64,
    pub name: UsageName,
    ///An enum describing the unit of usage measurement.
    pub unit: UsageUnit,
}
impl ::std::convert::From<&Usage> for Usage {
    fn from(value: &Usage) -> Self {
        value.clone()
    }
}
///The Usage Names.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The Usage Names.",
///  "type": "object",
///  "properties": {
///    "localizedValue": {
///      "description": "The localized name of the resource.",
///      "type": "string"
///    },
///    "value": {
///      "description": "The name of the resource.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct UsageName {
    ///The localized name of the resource.
    #[serde(
        rename = "localizedValue",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub localized_value: ::std::option::Option<::std::string::String>,
    ///The name of the resource.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub value: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&UsageName> for UsageName {
    fn from(value: &UsageName) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for UsageName {
    fn default() -> Self {
        Self {
            localized_value: Default::default(),
            value: Default::default(),
        }
    }
}
///An enum describing the unit of usage measurement.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "An enum describing the unit of usage measurement.",
///  "type": "string",
///  "enum": [
///    "Count"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum UsageUnit {
    Count,
}
impl ::std::convert::From<&Self> for UsageUnit {
    fn from(value: &UsageUnit) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for UsageUnit {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Count => f.write_str("Count"),
        }
    }
}
impl ::std::str::FromStr for UsageUnit {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "count" => Ok(Self::Count),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for UsageUnit {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for UsageUnit {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for UsageUnit {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///`UserAssignedIdentitiesValue`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "clientId": {
///      "description": "The client id of user assigned identity.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "principalId": {
///      "description": "The principal id of user assigned identity.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct UserAssignedIdentitiesValue {
    ///The client id of user assigned identity.
    #[serde(
        rename = "clientId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub client_id: ::std::option::Option<::std::string::String>,
    ///The principal id of user assigned identity.
    #[serde(
        rename = "principalId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub principal_id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&UserAssignedIdentitiesValue> for UserAssignedIdentitiesValue {
    fn from(value: &UserAssignedIdentitiesValue) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for UserAssignedIdentitiesValue {
    fn default() -> Self {
        Self {
            client_id: Default::default(),
            principal_id: Default::default(),
        }
    }
}
///Specifies Reboot related Scheduled Event related configurations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies Reboot related Scheduled Event related configurations.",
///  "type": "object",
///  "properties": {
///    "automaticallyApprove": {
///      "description": "Specifies Reboot Scheduled Event related configurations.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct UserInitiatedReboot {
    ///Specifies Reboot Scheduled Event related configurations.
    #[serde(
        rename = "automaticallyApprove",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub automatically_approve: ::std::option::Option<bool>,
}
impl ::std::convert::From<&UserInitiatedReboot> for UserInitiatedReboot {
    fn from(value: &UserInitiatedReboot) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for UserInitiatedReboot {
    fn default() -> Self {
        Self {
            automatically_approve: Default::default(),
        }
    }
}
///Specifies Redeploy related Scheduled Event related configurations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies Redeploy related Scheduled Event related configurations.",
///  "type": "object",
///  "properties": {
///    "automaticallyApprove": {
///      "description": "Specifies Redeploy Scheduled Event related configurations.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct UserInitiatedRedeploy {
    ///Specifies Redeploy Scheduled Event related configurations.
    #[serde(
        rename = "automaticallyApprove",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub automatically_approve: ::std::option::Option<bool>,
}
impl ::std::convert::From<&UserInitiatedRedeploy> for UserInitiatedRedeploy {
    fn from(value: &UserInitiatedRedeploy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for UserInitiatedRedeploy {
    fn default() -> Self {
        Self {
            automatically_approve: Default::default(),
        }
    }
}
///Describes a single certificate reference in a Key Vault, and where the certificate should reside on the VM.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a single certificate reference in a Key Vault, and where the certificate should reside on the VM.",
///  "type": "object",
///  "properties": {
///    "certificateStore": {
///      "description": "For Windows VMs, specifies the certificate store on the Virtual Machine to which the certificate should be added. The specified certificate store is implicitly in the LocalMachine account. For Linux VMs, the certificate file is placed under the /var/lib/waagent directory, with the file name &lt;UppercaseThumbprint&gt;.crt for the X509 certificate file and &lt;UppercaseThumbprint&gt;.prv for private key. Both of these files are .pem formatted.",
///      "type": "string"
///    },
///    "certificateUrl": {
///      "description": "This is the URL of a certificate that has been uploaded to Key Vault as a secret. For adding a secret to the Key Vault, see [Add a key or secret to the key vault](https://docs.microsoft.com/azure/key-vault/key-vault-get-started/#add). In this case, your certificate needs to be It is the Base64 encoding of the following JSON Object which is encoded in UTF-8: <br><br> {<br>  \"data\":\"<Base64-encoded-certificate>\",<br>  \"dataType\":\"pfx\",<br>  \"password\":\"<pfx-file-password>\"<br>} <br> To install certificates on a virtual machine it is recommended to use the [Azure Key Vault virtual machine extension for Linux](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-linux) or the [Azure Key Vault virtual machine extension for Windows](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-windows).",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VaultCertificate {
    ///For Windows VMs, specifies the certificate store on the Virtual Machine to which the certificate should be added. The specified certificate store is implicitly in the LocalMachine account. For Linux VMs, the certificate file is placed under the /var/lib/waagent directory, with the file name &lt;UppercaseThumbprint&gt;.crt for the X509 certificate file and &lt;UppercaseThumbprint&gt;.prv for private key. Both of these files are .pem formatted.
    #[serde(
        rename = "certificateStore",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub certificate_store: ::std::option::Option<::std::string::String>,
    ///This is the URL of a certificate that has been uploaded to Key Vault as a secret. For adding a secret to the Key Vault, see [Add a key or secret to the key vault](https://docs.microsoft.com/azure/key-vault/key-vault-get-started/#add). In this case, your certificate needs to be It is the Base64 encoding of the following JSON Object which is encoded in UTF-8: <br><br> {<br>  "data":"<Base64-encoded-certificate>",<br>  "dataType":"pfx",<br>  "password":"<pfx-file-password>"<br>} <br> To install certificates on a virtual machine it is recommended to use the [Azure Key Vault virtual machine extension for Linux](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-linux) or the [Azure Key Vault virtual machine extension for Windows](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-windows).
    #[serde(
        rename = "certificateUrl",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub certificate_url: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VaultCertificate> for VaultCertificate {
    fn from(value: &VaultCertificate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VaultCertificate {
    fn default() -> Self {
        Self {
            certificate_store: Default::default(),
            certificate_url: Default::default(),
        }
    }
}
///Describes a set of certificates which are all in the same Key Vault.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a set of certificates which are all in the same Key Vault.",
///  "type": "object",
///  "properties": {
///    "sourceVault": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "vaultCertificates": {
///      "description": "The list of key vault references in SourceVault which contain certificates.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VaultCertificate"
///      },
///      "x-ms-identifiers": [
///        "certificateUrl"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VaultSecretGroup {
    #[serde(
        rename = "sourceVault",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub source_vault: ::std::option::Option<SubResource>,
    ///The list of key vault references in SourceVault which contain certificates.
    #[serde(
        rename = "vaultCertificates",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vault_certificates: ::std::vec::Vec<VaultCertificate>,
}
impl ::std::convert::From<&VaultSecretGroup> for VaultSecretGroup {
    fn from(value: &VaultSecretGroup) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VaultSecretGroup {
    fn default() -> Self {
        Self {
            source_vault: Default::default(),
            vault_certificates: Default::default(),
        }
    }
}
///Describes the uri of a disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the uri of a disk.",
///  "type": "object",
///  "properties": {
///    "uri": {
///      "description": "Specifies the virtual hard disk's uri.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualHardDisk {
    ///Specifies the virtual hard disk's uri.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub uri: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualHardDisk> for VirtualHardDisk {
    fn from(value: &VirtualHardDisk) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualHardDisk {
    fn default() -> Self {
        Self { uri: Default::default() }
    }
}
///Describes a Virtual Machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "etag": {
///      "description": "Etag is property returned in Create/Update/Get response of the VM, so that customer can supply it in the header to ensure optimistic updates.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "extendedLocation": {
///      "$ref": "#/components/schemas/ExtendedLocation"
///    },
///    "identity": {
///      "$ref": "#/components/schemas/VirtualMachineIdentity"
///    },
///    "managedBy": {
///      "description": "ManagedBy is set to Virtual Machine Scale Set(VMSS) flex ARM resourceID, if the VM is part of the VMSS. This property is used by platform for internal resource group delete optimization.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "placement": {
///      "$ref": "#/components/schemas/Placement"
///    },
///    "plan": {
///      "$ref": "#/components/schemas/Plan"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineProperties"
///    },
///    "resources": {
///      "description": "The virtual machine child extension resources.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineExtension"
///      }
///    },
///    "zones": {
///      "description": "The availability zones.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachine {
    ///Etag is property returned in Create/Update/Get response of the VM, so that customer can supply it in the header to ensure optimistic updates.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub etag: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "extendedLocation",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extended_location: ::std::option::Option<ExtendedLocation>,
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub identity: ::std::option::Option<VirtualMachineIdentity>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///ManagedBy is set to Virtual Machine Scale Set(VMSS) flex ARM resourceID, if the VM is part of the VMSS. This property is used by platform for internal resource group delete optimization.
    #[serde(
        rename = "managedBy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub managed_by: ::std::option::Option<::std::string::String>,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub placement: ::std::option::Option<Placement>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub plan: ::std::option::Option<Plan>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineProperties>,
    ///The virtual machine child extension resources.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub resources: ::std::vec::Vec<VirtualMachineExtension>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///The availability zones.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zones: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachine> for VirtualMachine {
    fn from(value: &VirtualMachine) -> Self {
        value.clone()
    }
}
///The instance view of the VM Agent running on the virtual machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of the VM Agent running on the virtual machine.",
///  "type": "object",
///  "properties": {
///    "extensionHandlers": {
///      "description": "The virtual machine extension handler instance view.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineExtensionHandlerInstanceView"
///      },
///      "x-ms-identifiers": []
///    },
///    "statuses": {
///      "description": "The resource status information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    },
///    "vmAgentVersion": {
///      "description": "The VM Agent full version.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineAgentInstanceView {
    ///The virtual machine extension handler instance view.
    #[serde(
        rename = "extensionHandlers",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extension_handlers: ::std::vec::Vec<VirtualMachineExtensionHandlerInstanceView>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
    ///The VM Agent full version.
    #[serde(
        rename = "vmAgentVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_agent_version: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineAgentInstanceView>
for VirtualMachineAgentInstanceView {
    fn from(value: &VirtualMachineAgentInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineAgentInstanceView {
    fn default() -> Self {
        Self {
            extension_handlers: Default::default(),
            statuses: Default::default(),
            vm_agent_version: Default::default(),
        }
    }
}
///Describes the properties of an AssessPatches result.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of an AssessPatches result.",
///  "type": "object",
///  "properties": {
///    "assessmentActivityId": {
///      "description": "The activity ID of the operation that produced this result. It is used to correlate across CRP and extension logs.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "availablePatches": {
///      "description": "The list of patches that have been detected as available for installation.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineSoftwarePatchProperties"
///      },
///      "x-ms-identifiers": [
///        "patchId"
///      ]
///    },
///    "criticalAndSecurityPatchCount": {
///      "description": "The number of critical or security patches that have been detected as available and not yet installed.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "error": {
///      "$ref": "#/components/schemas/ApiError"
///    },
///    "otherPatchCount": {
///      "description": "The number of all available patches excluding critical and security.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "rebootPending": {
///      "description": "The overall reboot status of the VM. It will be true when partially installed patches require a reboot to complete installation but the reboot has not yet occurred.",
///      "readOnly": true,
///      "type": "boolean"
///    },
///    "startDateTime": {
///      "description": "The UTC timestamp when the operation began.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "status": {
///      "$ref": "#/components/schemas/PatchOperationStatus"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineAssessPatchesResult {
    ///The activity ID of the operation that produced this result. It is used to correlate across CRP and extension logs.
    #[serde(
        rename = "assessmentActivityId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub assessment_activity_id: ::std::option::Option<::std::string::String>,
    ///The list of patches that have been detected as available for installation.
    #[serde(
        rename = "availablePatches",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub available_patches: ::std::vec::Vec<VirtualMachineSoftwarePatchProperties>,
    ///The number of critical or security patches that have been detected as available and not yet installed.
    #[serde(
        rename = "criticalAndSecurityPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub critical_and_security_patch_count: ::std::option::Option<i32>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub error: ::std::option::Option<ApiError>,
    ///The number of all available patches excluding critical and security.
    #[serde(
        rename = "otherPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub other_patch_count: ::std::option::Option<i32>,
    ///The overall reboot status of the VM. It will be true when partially installed patches require a reboot to complete installation but the reboot has not yet occurred.
    #[serde(
        rename = "rebootPending",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub reboot_pending: ::std::option::Option<bool>,
    ///The UTC timestamp when the operation began.
    #[serde(
        rename = "startDateTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub start_date_time: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub status: ::std::option::Option<PatchOperationStatus>,
}
impl ::std::convert::From<&VirtualMachineAssessPatchesResult>
for VirtualMachineAssessPatchesResult {
    fn from(value: &VirtualMachineAssessPatchesResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineAssessPatchesResult {
    fn default() -> Self {
        Self {
            assessment_activity_id: Default::default(),
            available_patches: Default::default(),
            critical_and_security_patch_count: Default::default(),
            error: Default::default(),
            other_patch_count: Default::default(),
            reboot_pending: Default::default(),
            start_date_time: Default::default(),
            status: Default::default(),
        }
    }
}
///Capture Virtual Machine parameters.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Capture Virtual Machine parameters.",
///  "type": "object",
///  "required": [
///    "destinationContainerName",
///    "overwriteVhds",
///    "vhdPrefix"
///  ],
///  "properties": {
///    "destinationContainerName": {
///      "description": "The destination container name.",
///      "type": "string"
///    },
///    "overwriteVhds": {
///      "description": "Specifies whether to overwrite the destination virtual hard disk, in case of conflict.",
///      "type": "boolean"
///    },
///    "vhdPrefix": {
///      "description": "The captured virtual hard disk's name prefix.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineCaptureParameters {
    ///The destination container name.
    #[serde(rename = "destinationContainerName")]
    pub destination_container_name: ::std::string::String,
    ///Specifies whether to overwrite the destination virtual hard disk, in case of conflict.
    #[serde(rename = "overwriteVhds")]
    pub overwrite_vhds: bool,
    ///The captured virtual hard disk's name prefix.
    #[serde(rename = "vhdPrefix")]
    pub vhd_prefix: ::std::string::String,
}
impl ::std::convert::From<&VirtualMachineCaptureParameters>
for VirtualMachineCaptureParameters {
    fn from(value: &VirtualMachineCaptureParameters) -> Self {
        value.clone()
    }
}
///Output of virtual machine capture operation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Output of virtual machine capture operation.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  ],
///  "properties": {
///    "$schema": {
///      "description": "the schema of the captured virtual machine",
///      "readOnly": true,
///      "type": "string",
///      "x-ms-client-name": "schema"
///    },
///    "contentVersion": {
///      "description": "the version of the content",
///      "readOnly": true,
///      "type": "string"
///    },
///    "parameters": {
///      "description": "parameters of the captured virtual machine",
///      "readOnly": true
///    },
///    "resources": {
///      "description": "a list of resource items of the captured virtual machine",
///      "readOnly": true,
///      "type": "array",
///      "items": {}
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineCaptureResult {
    ///the version of the content
    #[serde(
        rename = "contentVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub content_version: ::std::option::Option<::std::string::String>,
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///parameters of the captured virtual machine
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub parameters: ::std::option::Option<::serde_json::Value>,
    ///a list of resource items of the captured virtual machine
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub resources: ::std::vec::Vec<::serde_json::Value>,
    ///the schema of the captured virtual machine
    #[serde(
        rename = "$schema",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub schema: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineCaptureResult> for VirtualMachineCaptureResult {
    fn from(value: &VirtualMachineCaptureResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineCaptureResult {
    fn default() -> Self {
        Self {
            content_version: Default::default(),
            id: Default::default(),
            parameters: Default::default(),
            resources: Default::default(),
            schema: Default::default(),
        }
    }
}
///Specifies the eviction policy for the Azure Spot VM/VMSS
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the eviction policy for the Azure Spot VM/VMSS",
///  "type": "string",
///  "enum": [
///    "Deallocate",
///    "Delete"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "VirtualMachineEvictionPolicyTypes",
///    "values": [
///      {
///        "name": "Deallocate",
///        "value": "Deallocate"
///      },
///      {
///        "name": "Delete",
///        "value": "Delete"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum VirtualMachineEvictionPolicyTypes {
    Deallocate,
    Delete,
}
impl ::std::convert::From<&Self> for VirtualMachineEvictionPolicyTypes {
    fn from(value: &VirtualMachineEvictionPolicyTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for VirtualMachineEvictionPolicyTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Deallocate => f.write_str("Deallocate"),
            Self::Delete => f.write_str("Delete"),
        }
    }
}
impl ::std::str::FromStr for VirtualMachineEvictionPolicyTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "deallocate" => Ok(Self::Deallocate),
            "delete" => Ok(Self::Delete),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for VirtualMachineEvictionPolicyTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for VirtualMachineEvictionPolicyTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for VirtualMachineEvictionPolicyTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes a Virtual Machine Extension.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine Extension.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineExtensionProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineExtension {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineExtensionProperties>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineExtension> for VirtualMachineExtension {
    fn from(value: &VirtualMachineExtension) -> Self {
        value.clone()
    }
}
///The instance view of a virtual machine extension handler.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a virtual machine extension handler.",
///  "type": "object",
///  "properties": {
///    "status": {
///      "$ref": "#/components/schemas/InstanceViewStatus"
///    },
///    "type": {
///      "description": "Specifies the type of the extension; an example is \"CustomScriptExtension\".",
///      "type": "string"
///    },
///    "typeHandlerVersion": {
///      "description": "Specifies the version of the script handler.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineExtensionHandlerInstanceView {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub status: ::std::option::Option<InstanceViewStatus>,
    ///Specifies the type of the extension; an example is "CustomScriptExtension".
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///Specifies the version of the script handler.
    #[serde(
        rename = "typeHandlerVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_handler_version: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineExtensionHandlerInstanceView>
for VirtualMachineExtensionHandlerInstanceView {
    fn from(value: &VirtualMachineExtensionHandlerInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineExtensionHandlerInstanceView {
    fn default() -> Self {
        Self {
            status: Default::default(),
            type_: Default::default(),
            type_handler_version: Default::default(),
        }
    }
}
///Describes a Virtual Machine Extension Image.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine Extension Image.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineExtensionImageProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineExtensionImage {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineExtensionImageProperties>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineExtensionImage>
for VirtualMachineExtensionImage {
    fn from(value: &VirtualMachineExtensionImage) -> Self {
        value.clone()
    }
}
///Describes the properties of a Virtual Machine Extension Image.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Virtual Machine Extension Image.",
///  "type": "object",
///  "required": [
///    "computeRole",
///    "handlerSchema",
///    "operatingSystem"
///  ],
///  "properties": {
///    "computeRole": {
///      "description": "The type of role (IaaS or PaaS) this extension supports.",
///      "type": "string"
///    },
///    "handlerSchema": {
///      "description": "The schema defined by publisher, where extension consumers should provide settings in a matching schema.",
///      "type": "string"
///    },
///    "operatingSystem": {
///      "description": "The operating system this extension supports.",
///      "type": "string"
///    },
///    "supportsMultipleExtensions": {
///      "description": "Whether the handler can support multiple extensions.",
///      "type": "boolean"
///    },
///    "vmScaleSetEnabled": {
///      "description": "Whether the extension can be used on xRP VMScaleSets. By default existing extensions are usable on scalesets, but there might be cases where a publisher wants to explicitly indicate the extension is only enabled for CRP VMs but not VMSS.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineExtensionImageProperties {
    ///The type of role (IaaS or PaaS) this extension supports.
    #[serde(rename = "computeRole")]
    pub compute_role: ::std::string::String,
    ///The schema defined by publisher, where extension consumers should provide settings in a matching schema.
    #[serde(rename = "handlerSchema")]
    pub handler_schema: ::std::string::String,
    ///The operating system this extension supports.
    #[serde(rename = "operatingSystem")]
    pub operating_system: ::std::string::String,
    ///Whether the handler can support multiple extensions.
    #[serde(
        rename = "supportsMultipleExtensions",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub supports_multiple_extensions: ::std::option::Option<bool>,
    ///Whether the extension can be used on xRP VMScaleSets. By default existing extensions are usable on scalesets, but there might be cases where a publisher wants to explicitly indicate the extension is only enabled for CRP VMs but not VMSS.
    #[serde(
        rename = "vmScaleSetEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_scale_set_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineExtensionImageProperties>
for VirtualMachineExtensionImageProperties {
    fn from(value: &VirtualMachineExtensionImageProperties) -> Self {
        value.clone()
    }
}
///The instance view of a virtual machine extension.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a virtual machine extension.",
///  "type": "object",
///  "properties": {
///    "name": {
///      "description": "The virtual machine extension name.",
///      "type": "string"
///    },
///    "statuses": {
///      "description": "The resource status information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    },
///    "substatuses": {
///      "description": "The resource status information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    },
///    "type": {
///      "description": "Specifies the type of the extension; an example is \"CustomScriptExtension\".",
///      "type": "string"
///    },
///    "typeHandlerVersion": {
///      "description": "Specifies the version of the script handler.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineExtensionInstanceView {
    ///The virtual machine extension name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub substatuses: ::std::vec::Vec<InstanceViewStatus>,
    ///Specifies the type of the extension; an example is "CustomScriptExtension".
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///Specifies the version of the script handler.
    #[serde(
        rename = "typeHandlerVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_handler_version: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineExtensionInstanceView>
for VirtualMachineExtensionInstanceView {
    fn from(value: &VirtualMachineExtensionInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineExtensionInstanceView {
    fn default() -> Self {
        Self {
            name: Default::default(),
            statuses: Default::default(),
            substatuses: Default::default(),
            type_: Default::default(),
            type_handler_version: Default::default(),
        }
    }
}
///Describes the properties of a Virtual Machine Extension.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Virtual Machine Extension.",
///  "type": "object",
///  "properties": {
///    "autoUpgradeMinorVersion": {
///      "description": "Indicates whether the extension should use a newer minor version if one is available at deployment time. Once deployed, however, the extension will not upgrade minor versions unless redeployed, even with this property set to true.",
///      "type": "boolean"
///    },
///    "enableAutomaticUpgrade": {
///      "description": "Indicates whether the extension should be automatically upgraded by the platform if there is a newer version of the extension available.",
///      "type": "boolean"
///    },
///    "forceUpdateTag": {
///      "description": "How the extension handler should be forced to update even if the extension configuration has not changed.",
///      "type": "string"
///    },
///    "instanceView": {
///      "$ref": "#/components/schemas/VirtualMachineExtensionInstanceView"
///    },
///    "protectedSettings": {
///      "description": "The extension can contain either protectedSettings or protectedSettingsFromKeyVault or no protected settings at all."
///    },
///    "protectedSettingsFromKeyVault": {
///      "$ref": "#/components/schemas/KeyVaultSecretReference"
///    },
///    "provisionAfterExtensions": {
///      "description": "Collection of extension names after which this extension needs to be provisioned.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "provisioningState": {
///      "description": "The provisioning state, which only appears in the response.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "publisher": {
///      "description": "The name of the extension handler publisher.",
///      "type": "string"
///    },
///    "settings": {
///      "description": "Json formatted public settings for the extension."
///    },
///    "suppressFailures": {
///      "description": "Indicates whether failures stemming from the extension will be suppressed (Operational failures such as not connecting to the VM will not be suppressed regardless of this value). The default is false.",
///      "type": "boolean"
///    },
///    "type": {
///      "description": "Specifies the type of the extension; an example is \"CustomScriptExtension\".",
///      "type": "string"
///    },
///    "typeHandlerVersion": {
///      "description": "Specifies the version of the script handler.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineExtensionProperties {
    ///Indicates whether the extension should use a newer minor version if one is available at deployment time. Once deployed, however, the extension will not upgrade minor versions unless redeployed, even with this property set to true.
    #[serde(
        rename = "autoUpgradeMinorVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub auto_upgrade_minor_version: ::std::option::Option<bool>,
    ///Indicates whether the extension should be automatically upgraded by the platform if there is a newer version of the extension available.
    #[serde(
        rename = "enableAutomaticUpgrade",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_automatic_upgrade: ::std::option::Option<bool>,
    ///How the extension handler should be forced to update even if the extension configuration has not changed.
    #[serde(
        rename = "forceUpdateTag",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub force_update_tag: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "instanceView",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_view: ::std::option::Option<VirtualMachineExtensionInstanceView>,
    ///The extension can contain either protectedSettings or protectedSettingsFromKeyVault or no protected settings at all.
    #[serde(
        rename = "protectedSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub protected_settings: ::std::option::Option<::serde_json::Value>,
    #[serde(
        rename = "protectedSettingsFromKeyVault",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub protected_settings_from_key_vault: ::std::option::Option<
        KeyVaultSecretReference,
    >,
    ///Collection of extension names after which this extension needs to be provisioned.
    #[serde(
        rename = "provisionAfterExtensions",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provision_after_extensions: ::std::vec::Vec<::std::string::String>,
    ///The provisioning state, which only appears in the response.
    #[serde(
        rename = "provisioningState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_state: ::std::option::Option<::std::string::String>,
    ///The name of the extension handler publisher.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub publisher: ::std::option::Option<::std::string::String>,
    ///Json formatted public settings for the extension.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub settings: ::std::option::Option<::serde_json::Value>,
    ///Indicates whether failures stemming from the extension will be suppressed (Operational failures such as not connecting to the VM will not be suppressed regardless of this value). The default is false.
    #[serde(
        rename = "suppressFailures",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub suppress_failures: ::std::option::Option<bool>,
    ///Specifies the type of the extension; an example is "CustomScriptExtension".
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///Specifies the version of the script handler.
    #[serde(
        rename = "typeHandlerVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_handler_version: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineExtensionProperties>
for VirtualMachineExtensionProperties {
    fn from(value: &VirtualMachineExtensionProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineExtensionProperties {
    fn default() -> Self {
        Self {
            auto_upgrade_minor_version: Default::default(),
            enable_automatic_upgrade: Default::default(),
            force_update_tag: Default::default(),
            instance_view: Default::default(),
            protected_settings: Default::default(),
            protected_settings_from_key_vault: Default::default(),
            provision_after_extensions: Default::default(),
            provisioning_state: Default::default(),
            publisher: Default::default(),
            settings: Default::default(),
            suppress_failures: Default::default(),
            type_: Default::default(),
            type_handler_version: Default::default(),
        }
    }
}
///Describes a Virtual Machine Extension.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine Extension.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineExtensionUpdateProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineExtensionUpdate {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineExtensionUpdateProperties>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineExtensionUpdate>
for VirtualMachineExtensionUpdate {
    fn from(value: &VirtualMachineExtensionUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineExtensionUpdate {
    fn default() -> Self {
        Self {
            properties: Default::default(),
            tags: Default::default(),
        }
    }
}
///Describes the properties of a Virtual Machine Extension.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Virtual Machine Extension.",
///  "type": "object",
///  "properties": {
///    "autoUpgradeMinorVersion": {
///      "description": "Indicates whether the extension should use a newer minor version if one is available at deployment time. Once deployed, however, the extension will not upgrade minor versions unless redeployed, even with this property set to true.",
///      "type": "boolean"
///    },
///    "enableAutomaticUpgrade": {
///      "description": "Indicates whether the extension should be automatically upgraded by the platform if there is a newer version of the extension available.",
///      "type": "boolean"
///    },
///    "forceUpdateTag": {
///      "description": "How the extension handler should be forced to update even if the extension configuration has not changed.",
///      "type": "string"
///    },
///    "protectedSettings": {
///      "description": "The extension can contain either protectedSettings or protectedSettingsFromKeyVault or no protected settings at all."
///    },
///    "protectedSettingsFromKeyVault": {
///      "$ref": "#/components/schemas/KeyVaultSecretReference"
///    },
///    "publisher": {
///      "description": "The name of the extension handler publisher.",
///      "type": "string"
///    },
///    "settings": {
///      "description": "Json formatted public settings for the extension."
///    },
///    "suppressFailures": {
///      "description": "Indicates whether failures stemming from the extension will be suppressed (Operational failures such as not connecting to the VM will not be suppressed regardless of this value). The default is false.",
///      "type": "boolean"
///    },
///    "type": {
///      "description": "Specifies the type of the extension; an example is \"CustomScriptExtension\".",
///      "type": "string"
///    },
///    "typeHandlerVersion": {
///      "description": "Specifies the version of the script handler.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineExtensionUpdateProperties {
    ///Indicates whether the extension should use a newer minor version if one is available at deployment time. Once deployed, however, the extension will not upgrade minor versions unless redeployed, even with this property set to true.
    #[serde(
        rename = "autoUpgradeMinorVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub auto_upgrade_minor_version: ::std::option::Option<bool>,
    ///Indicates whether the extension should be automatically upgraded by the platform if there is a newer version of the extension available.
    #[serde(
        rename = "enableAutomaticUpgrade",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_automatic_upgrade: ::std::option::Option<bool>,
    ///How the extension handler should be forced to update even if the extension configuration has not changed.
    #[serde(
        rename = "forceUpdateTag",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub force_update_tag: ::std::option::Option<::std::string::String>,
    ///The extension can contain either protectedSettings or protectedSettingsFromKeyVault or no protected settings at all.
    #[serde(
        rename = "protectedSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub protected_settings: ::std::option::Option<::serde_json::Value>,
    #[serde(
        rename = "protectedSettingsFromKeyVault",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub protected_settings_from_key_vault: ::std::option::Option<
        KeyVaultSecretReference,
    >,
    ///The name of the extension handler publisher.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub publisher: ::std::option::Option<::std::string::String>,
    ///Json formatted public settings for the extension.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub settings: ::std::option::Option<::serde_json::Value>,
    ///Indicates whether failures stemming from the extension will be suppressed (Operational failures such as not connecting to the VM will not be suppressed regardless of this value). The default is false.
    #[serde(
        rename = "suppressFailures",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub suppress_failures: ::std::option::Option<bool>,
    ///Specifies the type of the extension; an example is "CustomScriptExtension".
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///Specifies the version of the script handler.
    #[serde(
        rename = "typeHandlerVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_handler_version: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineExtensionUpdateProperties>
for VirtualMachineExtensionUpdateProperties {
    fn from(value: &VirtualMachineExtensionUpdateProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineExtensionUpdateProperties {
    fn default() -> Self {
        Self {
            auto_upgrade_minor_version: Default::default(),
            enable_automatic_upgrade: Default::default(),
            force_update_tag: Default::default(),
            protected_settings: Default::default(),
            protected_settings_from_key_vault: Default::default(),
            publisher: Default::default(),
            settings: Default::default(),
            suppress_failures: Default::default(),
            type_: Default::default(),
            type_handler_version: Default::default(),
        }
    }
}
///The List Extension operation response
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Extension operation response",
///  "type": "object",
///  "properties": {
///    "value": {
///      "description": "The list of extensions",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineExtension"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineExtensionsListResult {
    ///The list of extensions
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub value: ::std::vec::Vec<VirtualMachineExtension>,
}
impl ::std::convert::From<&VirtualMachineExtensionsListResult>
for VirtualMachineExtensionsListResult {
    fn from(value: &VirtualMachineExtensionsListResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineExtensionsListResult {
    fn default() -> Self {
        Self { value: Default::default() }
    }
}
///The health status of the VM.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The health status of the VM.",
///  "type": "object",
///  "properties": {
///    "status": {
///      "$ref": "#/components/schemas/InstanceViewStatus"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineHealthStatus {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub status: ::std::option::Option<InstanceViewStatus>,
}
impl ::std::convert::From<&VirtualMachineHealthStatus> for VirtualMachineHealthStatus {
    fn from(value: &VirtualMachineHealthStatus) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineHealthStatus {
    fn default() -> Self {
        Self { status: Default::default() }
    }
}
///Identity for the virtual machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Identity for the virtual machine.",
///  "type": "object",
///  "properties": {
///    "principalId": {
///      "description": "The principal id of virtual machine identity. This property will only be provided for a system assigned identity.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "tenantId": {
///      "description": "The tenant id associated with the virtual machine. This property will only be provided for a system assigned identity.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "type": {
///      "$ref": "#/components/schemas/ResourceIdentityType"
///    },
///    "userAssignedIdentities": {
///      "description": "The list of user identities associated with the Virtual Machine. The user identity dictionary key references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'.",
///      "type": "object",
///      "additionalProperties": {
///        "$ref": "#/components/schemas/UserAssignedIdentitiesValue"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineIdentity {
    ///The principal id of virtual machine identity. This property will only be provided for a system assigned identity.
    #[serde(
        rename = "principalId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub principal_id: ::std::option::Option<::std::string::String>,
    ///The tenant id associated with the virtual machine. This property will only be provided for a system assigned identity.
    #[serde(
        rename = "tenantId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tenant_id: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<ResourceIdentityType>,
    ///The list of user identities associated with the Virtual Machine. The user identity dictionary key references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'.
    #[serde(
        rename = "userAssignedIdentities",
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub user_assigned_identities: ::std::collections::HashMap<
        ::std::string::String,
        UserAssignedIdentitiesValue,
    >,
}
impl ::std::convert::From<&VirtualMachineIdentity> for VirtualMachineIdentity {
    fn from(value: &VirtualMachineIdentity) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineIdentity {
    fn default() -> Self {
        Self {
            principal_id: Default::default(),
            tenant_id: Default::default(),
            type_: Default::default(),
            user_assigned_identities: Default::default(),
        }
    }
}
///Describes a Virtual Machine Image.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine Image.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/VirtualMachineImageResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineImageProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineImage {
    #[serde(
        rename = "extendedLocation",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extended_location: ::std::option::Option<ExtendedLocation>,
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The supported Azure location of the resource.
    pub location: ::std::string::String,
    ///The name of the resource.
    pub name: ::std::string::String,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineImageProperties>,
    ///Specifies the tags that are assigned to the virtual machine. For more information about using tags, see [Using tags to organize your Azure resources](https://docs.microsoft.com/azure/azure-resource-manager/resource-group-using-tags.md).
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineImage> for VirtualMachineImage {
    fn from(value: &VirtualMachineImage) -> Self {
        value.clone()
    }
}
///Specifies additional capabilities supported by the image
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies additional capabilities supported by the image",
///  "type": "object",
///  "properties": {
///    "name": {
///      "description": "The name of the feature.",
///      "type": "string"
///    },
///    "value": {
///      "description": "The corresponding value for the feature.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineImageFeature {
    ///The name of the feature.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///The corresponding value for the feature.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub value: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineImageFeature> for VirtualMachineImageFeature {
    fn from(value: &VirtualMachineImageFeature) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineImageFeature {
    fn default() -> Self {
        Self {
            name: Default::default(),
            value: Default::default(),
        }
    }
}
///Describes the properties of a Virtual Machine Image.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Virtual Machine Image.",
///  "type": "object",
///  "properties": {
///    "architecture": {
///      "$ref": "#/components/schemas/ArchitectureTypes"
///    },
///    "automaticOSUpgradeProperties": {
///      "$ref": "#/components/schemas/AutomaticOSUpgradeProperties"
///    },
///    "dataDiskImages": {
///      "description": "The list of data disk images information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DataDiskImage"
///      },
///      "x-ms-identifiers": [
///        "lun"
///      ]
///    },
///    "disallowed": {
///      "$ref": "#/components/schemas/DisallowedConfiguration"
///    },
///    "features": {
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineImageFeature"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "hyperVGeneration": {
///      "$ref": "#/components/schemas/HyperVGenerationTypes"
///    },
///    "imageDeprecationStatus": {
///      "$ref": "#/components/schemas/ImageDeprecationStatus"
///    },
///    "osDiskImage": {
///      "$ref": "#/components/schemas/OSDiskImage"
///    },
///    "plan": {
///      "$ref": "#/components/schemas/PurchasePlan"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineImageProperties {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub architecture: ::std::option::Option<ArchitectureTypes>,
    #[serde(
        rename = "automaticOSUpgradeProperties",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub automatic_os_upgrade_properties: ::std::option::Option<
        AutomaticOsUpgradeProperties,
    >,
    ///The list of data disk images information.
    #[serde(
        rename = "dataDiskImages",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub data_disk_images: ::std::vec::Vec<DataDiskImage>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disallowed: ::std::option::Option<DisallowedConfiguration>,
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub features: ::std::vec::Vec<VirtualMachineImageFeature>,
    #[serde(
        rename = "hyperVGeneration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hyper_v_generation: ::std::option::Option<HyperVGenerationTypes>,
    #[serde(
        rename = "imageDeprecationStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub image_deprecation_status: ::std::option::Option<ImageDeprecationStatus>,
    #[serde(
        rename = "osDiskImage",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_disk_image: ::std::option::Option<OsDiskImage>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub plan: ::std::option::Option<PurchasePlan>,
}
impl ::std::convert::From<&VirtualMachineImageProperties>
for VirtualMachineImageProperties {
    fn from(value: &VirtualMachineImageProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineImageProperties {
    fn default() -> Self {
        Self {
            architecture: Default::default(),
            automatic_os_upgrade_properties: Default::default(),
            data_disk_images: Default::default(),
            disallowed: Default::default(),
            features: Default::default(),
            hyper_v_generation: Default::default(),
            image_deprecation_status: Default::default(),
            os_disk_image: Default::default(),
            plan: Default::default(),
        }
    }
}
///Virtual machine image resource information.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Virtual machine image resource information.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  ],
///  "required": [
///    "location",
///    "name"
///  ],
///  "properties": {
///    "extendedLocation": {
///      "$ref": "#/components/schemas/ExtendedLocation"
///    },
///    "location": {
///      "description": "The supported Azure location of the resource.",
///      "type": "string"
///    },
///    "name": {
///      "description": "The name of the resource.",
///      "type": "string"
///    },
///    "tags": {
///      "description": "Specifies the tags that are assigned to the virtual machine. For more information about using tags, see [Using tags to organize your Azure resources](https://docs.microsoft.com/azure/azure-resource-manager/resource-group-using-tags.md).",
///      "type": "object",
///      "additionalProperties": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineImageResource {
    #[serde(
        rename = "extendedLocation",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extended_location: ::std::option::Option<ExtendedLocation>,
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The supported Azure location of the resource.
    pub location: ::std::string::String,
    ///The name of the resource.
    pub name: ::std::string::String,
    ///Specifies the tags that are assigned to the virtual machine. For more information about using tags, see [Using tags to organize your Azure resources](https://docs.microsoft.com/azure/azure-resource-manager/resource-group-using-tags.md).
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineImageResource> for VirtualMachineImageResource {
    fn from(value: &VirtualMachineImageResource) -> Self {
        value.clone()
    }
}
///Input for InstallPatches as directly received by the API
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Input for InstallPatches as directly received by the API",
///  "type": "object",
///  "required": [
///    "rebootSetting"
///  ],
///  "properties": {
///    "linuxParameters": {
///      "$ref": "#/components/schemas/LinuxParameters"
///    },
///    "maximumDuration": {
///      "description": "Specifies the maximum amount of time that the operation will run. It must be an ISO 8601-compliant duration string such as PT4H (4 hours)",
///      "type": "string",
///      "format": "duration"
///    },
///    "rebootSetting": {
///      "$ref": "#/components/schemas/VMGuestPatchRebootSetting"
///    },
///    "windowsParameters": {
///      "$ref": "#/components/schemas/WindowsParameters"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineInstallPatchesParameters {
    #[serde(
        rename = "linuxParameters",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub linux_parameters: ::std::option::Option<LinuxParameters>,
    ///Specifies the maximum amount of time that the operation will run. It must be an ISO 8601-compliant duration string such as PT4H (4 hours)
    #[serde(
        rename = "maximumDuration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub maximum_duration: ::std::option::Option<::std::string::String>,
    #[serde(rename = "rebootSetting")]
    pub reboot_setting: VmGuestPatchRebootSetting,
    #[serde(
        rename = "windowsParameters",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub windows_parameters: ::std::option::Option<WindowsParameters>,
}
impl ::std::convert::From<&VirtualMachineInstallPatchesParameters>
for VirtualMachineInstallPatchesParameters {
    fn from(value: &VirtualMachineInstallPatchesParameters) -> Self {
        value.clone()
    }
}
///The result summary of an installation operation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The result summary of an installation operation.",
///  "type": "object",
///  "properties": {
///    "error": {
///      "$ref": "#/components/schemas/ApiError"
///    },
///    "excludedPatchCount": {
///      "description": "The number of patches that were not installed due to the user blocking their installation.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "failedPatchCount": {
///      "description": "The number of patches that could not be installed due to some issue. See errors for details.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "installationActivityId": {
///      "description": "The activity ID of the operation that produced this result. It is used to correlate across CRP and extension logs.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "installedPatchCount": {
///      "description": "The number of patches successfully installed.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "maintenanceWindowExceeded": {
///      "description": "Whether the operation ran out of time before it completed all its intended actions.",
///      "readOnly": true,
///      "type": "boolean"
///    },
///    "notSelectedPatchCount": {
///      "description": "The number of patches that were detected as available for install, but did not meet the operation's criteria.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "patches": {
///      "description": "The patches that were installed during the operation.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/PatchInstallationDetail"
///      },
///      "x-ms-identifiers": [
///        "patchId"
///      ]
///    },
///    "pendingPatchCount": {
///      "description": "The number of patches that were identified as meeting the installation criteria, but were not able to be installed. Typically this happens when maintenanceWindowExceeded == true.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    },
///    "rebootStatus": {
///      "$ref": "#/components/schemas/VMGuestPatchRebootStatus"
///    },
///    "startDateTime": {
///      "description": "The UTC timestamp when the operation began.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "status": {
///      "$ref": "#/components/schemas/PatchOperationStatus"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineInstallPatchesResult {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub error: ::std::option::Option<ApiError>,
    ///The number of patches that were not installed due to the user blocking their installation.
    #[serde(
        rename = "excludedPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub excluded_patch_count: ::std::option::Option<i32>,
    ///The number of patches that could not be installed due to some issue. See errors for details.
    #[serde(
        rename = "failedPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub failed_patch_count: ::std::option::Option<i32>,
    ///The activity ID of the operation that produced this result. It is used to correlate across CRP and extension logs.
    #[serde(
        rename = "installationActivityId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub installation_activity_id: ::std::option::Option<::std::string::String>,
    ///The number of patches successfully installed.
    #[serde(
        rename = "installedPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub installed_patch_count: ::std::option::Option<i32>,
    ///Whether the operation ran out of time before it completed all its intended actions.
    #[serde(
        rename = "maintenanceWindowExceeded",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub maintenance_window_exceeded: ::std::option::Option<bool>,
    ///The number of patches that were detected as available for install, but did not meet the operation's criteria.
    #[serde(
        rename = "notSelectedPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub not_selected_patch_count: ::std::option::Option<i32>,
    ///The patches that were installed during the operation.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub patches: ::std::vec::Vec<PatchInstallationDetail>,
    ///The number of patches that were identified as meeting the installation criteria, but were not able to be installed. Typically this happens when maintenanceWindowExceeded == true.
    #[serde(
        rename = "pendingPatchCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub pending_patch_count: ::std::option::Option<i32>,
    #[serde(
        rename = "rebootStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub reboot_status: ::std::option::Option<VmGuestPatchRebootStatus>,
    ///The UTC timestamp when the operation began.
    #[serde(
        rename = "startDateTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub start_date_time: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub status: ::std::option::Option<PatchOperationStatus>,
}
impl ::std::convert::From<&VirtualMachineInstallPatchesResult>
for VirtualMachineInstallPatchesResult {
    fn from(value: &VirtualMachineInstallPatchesResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineInstallPatchesResult {
    fn default() -> Self {
        Self {
            error: Default::default(),
            excluded_patch_count: Default::default(),
            failed_patch_count: Default::default(),
            installation_activity_id: Default::default(),
            installed_patch_count: Default::default(),
            maintenance_window_exceeded: Default::default(),
            not_selected_patch_count: Default::default(),
            patches: Default::default(),
            pending_patch_count: Default::default(),
            reboot_status: Default::default(),
            start_date_time: Default::default(),
            status: Default::default(),
        }
    }
}
///The instance view of a virtual machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a virtual machine.",
///  "type": "object",
///  "properties": {
///    "assignedHost": {
///      "description": "Resource id of the dedicated host, on which the virtual machine is allocated through automatic placement, when the virtual machine is associated with a dedicated host group that has automatic placement enabled. Minimum api-version: 2020-06-01.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "bootDiagnostics": {
///      "$ref": "#/components/schemas/BootDiagnosticsInstanceView"
///    },
///    "computerName": {
///      "description": "The computer name assigned to the virtual machine.",
///      "type": "string"
///    },
///    "disks": {
///      "description": "The virtual machine disk information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DiskInstanceView"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "extensions": {
///      "description": "The extensions information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineExtensionInstanceView"
///      },
///      "x-ms-identifiers": [
///        "name",
///        "type"
///      ]
///    },
///    "hyperVGeneration": {
///      "$ref": "#/components/schemas/HyperVGenerationType"
///    },
///    "isVMInStandbyPool": {
///      "description": "[Preview Feature] Specifies whether the VM is currently in or out of the Standby Pool.",
///      "readOnly": true,
///      "type": "boolean"
///    },
///    "maintenanceRedeployStatus": {
///      "$ref": "#/components/schemas/MaintenanceRedeployStatus"
///    },
///    "osName": {
///      "description": "The Operating System running on the virtual machine.",
///      "type": "string"
///    },
///    "osVersion": {
///      "description": "The version of Operating System running on the virtual machine.",
///      "type": "string"
///    },
///    "patchStatus": {
///      "$ref": "#/components/schemas/VirtualMachinePatchStatus"
///    },
///    "platformFaultDomain": {
///      "description": "Specifies the fault domain of the virtual machine.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "platformUpdateDomain": {
///      "description": "Specifies the update domain of the virtual machine.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "rdpThumbPrint": {
///      "description": "The Remote desktop certificate thumbprint.",
///      "type": "string"
///    },
///    "statuses": {
///      "description": "The resource status information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    },
///    "vmAgent": {
///      "$ref": "#/components/schemas/VirtualMachineAgentInstanceView"
///    },
///    "vmHealth": {
///      "$ref": "#/components/schemas/VirtualMachineHealthStatus"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineInstanceView {
    ///Resource id of the dedicated host, on which the virtual machine is allocated through automatic placement, when the virtual machine is associated with a dedicated host group that has automatic placement enabled. Minimum api-version: 2020-06-01.
    #[serde(
        rename = "assignedHost",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub assigned_host: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "bootDiagnostics",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub boot_diagnostics: ::std::option::Option<BootDiagnosticsInstanceView>,
    ///The computer name assigned to the virtual machine.
    #[serde(
        rename = "computerName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub computer_name: ::std::option::Option<::std::string::String>,
    ///The virtual machine disk information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disks: ::std::vec::Vec<DiskInstanceView>,
    ///The extensions information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extensions: ::std::vec::Vec<VirtualMachineExtensionInstanceView>,
    #[serde(
        rename = "hyperVGeneration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hyper_v_generation: ::std::option::Option<HyperVGenerationType>,
    ///[Preview Feature] Specifies whether the VM is currently in or out of the Standby Pool.
    #[serde(
        rename = "isVMInStandbyPool",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub is_vm_in_standby_pool: ::std::option::Option<bool>,
    #[serde(
        rename = "maintenanceRedeployStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub maintenance_redeploy_status: ::std::option::Option<MaintenanceRedeployStatus>,
    ///The Operating System running on the virtual machine.
    #[serde(
        rename = "osName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_name: ::std::option::Option<::std::string::String>,
    ///The version of Operating System running on the virtual machine.
    #[serde(
        rename = "osVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_version: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "patchStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub patch_status: ::std::option::Option<VirtualMachinePatchStatus>,
    ///Specifies the fault domain of the virtual machine.
    #[serde(
        rename = "platformFaultDomain",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub platform_fault_domain: ::std::option::Option<i32>,
    ///Specifies the update domain of the virtual machine.
    #[serde(
        rename = "platformUpdateDomain",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub platform_update_domain: ::std::option::Option<i32>,
    ///The Remote desktop certificate thumbprint.
    #[serde(
        rename = "rdpThumbPrint",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub rdp_thumb_print: ::std::option::Option<::std::string::String>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
    #[serde(
        rename = "vmAgent",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_agent: ::std::option::Option<VirtualMachineAgentInstanceView>,
    #[serde(
        rename = "vmHealth",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_health: ::std::option::Option<VirtualMachineHealthStatus>,
}
impl ::std::convert::From<&VirtualMachineInstanceView> for VirtualMachineInstanceView {
    fn from(value: &VirtualMachineInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineInstanceView {
    fn default() -> Self {
        Self {
            assigned_host: Default::default(),
            boot_diagnostics: Default::default(),
            computer_name: Default::default(),
            disks: Default::default(),
            extensions: Default::default(),
            hyper_v_generation: Default::default(),
            is_vm_in_standby_pool: Default::default(),
            maintenance_redeploy_status: Default::default(),
            os_name: Default::default(),
            os_version: Default::default(),
            patch_status: Default::default(),
            platform_fault_domain: Default::default(),
            platform_update_domain: Default::default(),
            rdp_thumb_print: Default::default(),
            statuses: Default::default(),
            vm_agent: Default::default(),
            vm_health: Default::default(),
        }
    }
}
///Contains the IP tag associated with the public IP address.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Contains the IP tag associated with the public IP address.",
///  "type": "object",
///  "properties": {
///    "ipTagType": {
///      "description": "IP tag type. Example: FirstPartyUsage.",
///      "type": "string"
///    },
///    "tag": {
///      "description": "IP tag associated with the public IP. Example: SQL, Storage etc.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineIpTag {
    ///IP tag type. Example: FirstPartyUsage.
    #[serde(
        rename = "ipTagType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub ip_tag_type: ::std::option::Option<::std::string::String>,
    ///IP tag associated with the public IP. Example: SQL, Storage etc.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tag: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineIpTag> for VirtualMachineIpTag {
    fn from(value: &VirtualMachineIpTag) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineIpTag {
    fn default() -> Self {
        Self {
            ip_tag_type: Default::default(),
            tag: Default::default(),
        }
    }
}
///The List Virtual Machine operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Virtual Machine operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The URI to fetch the next page of VMs. Call ListNext() with this URI to fetch the next page of Virtual Machines.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of virtual machines.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachine"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineListResult {
    ///The URI to fetch the next page of VMs. Call ListNext() with this URI to fetch the next page of Virtual Machines.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of virtual machines.
    pub value: ::std::vec::Vec<VirtualMachine>,
}
impl ::std::convert::From<&VirtualMachineListResult> for VirtualMachineListResult {
    fn from(value: &VirtualMachineListResult) -> Self {
        value.clone()
    }
}
///Describes a virtual machine network interface configurations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine network interface configurations.",
///  "type": "object",
///  "required": [
///    "name"
///  ],
///  "properties": {
///    "name": {
///      "description": "The network interface configuration name.",
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineNetworkInterfaceConfigurationProperties"
///    },
///    "tags": {
///      "description": "Resource tags applied to the networkInterface address created by this NetworkInterfaceConfiguration",
///      "type": "object",
///      "additionalProperties": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineNetworkInterfaceConfiguration {
    ///The network interface configuration name.
    pub name: ::std::string::String,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<
        VirtualMachineNetworkInterfaceConfigurationProperties,
    >,
    ///Resource tags applied to the networkInterface address created by this NetworkInterfaceConfiguration
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineNetworkInterfaceConfiguration>
for VirtualMachineNetworkInterfaceConfiguration {
    fn from(value: &VirtualMachineNetworkInterfaceConfiguration) -> Self {
        value.clone()
    }
}
///Describes a virtual machine network profile's IP configuration.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine network profile's IP configuration.",
///  "type": "object",
///  "required": [
///    "ipConfigurations"
///  ],
///  "properties": {
///    "auxiliaryMode": {
///      "$ref": "#/components/schemas/NetworkInterfaceAuxiliaryMode"
///    },
///    "auxiliarySku": {
///      "$ref": "#/components/schemas/NetworkInterfaceAuxiliarySku"
///    },
///    "deleteOption": {
///      "$ref": "#/components/schemas/DeleteOptions"
///    },
///    "disableTcpStateTracking": {
///      "description": "Specifies whether the network interface is disabled for tcp state tracking.",
///      "type": "boolean"
///    },
///    "dnsSettings": {
///      "$ref": "#/components/schemas/VirtualMachineNetworkInterfaceDnsSettingsConfiguration"
///    },
///    "dscpConfiguration": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "enableAcceleratedNetworking": {
///      "description": "Specifies whether the network interface is accelerated networking-enabled.",
///      "type": "boolean"
///    },
///    "enableFpga": {
///      "description": "Specifies whether the network interface is FPGA networking-enabled.",
///      "type": "boolean"
///    },
///    "enableIPForwarding": {
///      "description": "Whether IP forwarding enabled on this NIC.",
///      "type": "boolean"
///    },
///    "ipConfigurations": {
///      "description": "Specifies the IP configurations of the network interface.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineNetworkInterfaceIPConfiguration"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "networkSecurityGroup": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "primary": {
///      "description": "Specifies the primary network interface in case the virtual machine has more than 1 network interface.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineNetworkInterfaceConfigurationProperties {
    #[serde(
        rename = "auxiliaryMode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub auxiliary_mode: ::std::option::Option<NetworkInterfaceAuxiliaryMode>,
    #[serde(
        rename = "auxiliarySku",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub auxiliary_sku: ::std::option::Option<NetworkInterfaceAuxiliarySku>,
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DeleteOptions>,
    ///Specifies whether the network interface is disabled for tcp state tracking.
    #[serde(
        rename = "disableTcpStateTracking",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disable_tcp_state_tracking: ::std::option::Option<bool>,
    #[serde(
        rename = "dnsSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub dns_settings: ::std::option::Option<
        VirtualMachineNetworkInterfaceDnsSettingsConfiguration,
    >,
    #[serde(
        rename = "dscpConfiguration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub dscp_configuration: ::std::option::Option<SubResource>,
    ///Specifies whether the network interface is accelerated networking-enabled.
    #[serde(
        rename = "enableAcceleratedNetworking",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_accelerated_networking: ::std::option::Option<bool>,
    ///Specifies whether the network interface is FPGA networking-enabled.
    #[serde(
        rename = "enableFpga",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_fpga: ::std::option::Option<bool>,
    ///Whether IP forwarding enabled on this NIC.
    #[serde(
        rename = "enableIPForwarding",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_ip_forwarding: ::std::option::Option<bool>,
    ///Specifies the IP configurations of the network interface.
    #[serde(rename = "ipConfigurations")]
    pub ip_configurations: ::std::vec::Vec<
        VirtualMachineNetworkInterfaceIpConfiguration,
    >,
    #[serde(
        rename = "networkSecurityGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_security_group: ::std::option::Option<SubResource>,
    ///Specifies the primary network interface in case the virtual machine has more than 1 network interface.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub primary: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineNetworkInterfaceConfigurationProperties>
for VirtualMachineNetworkInterfaceConfigurationProperties {
    fn from(value: &VirtualMachineNetworkInterfaceConfigurationProperties) -> Self {
        value.clone()
    }
}
///Describes a virtual machines network configuration's DNS settings.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machines network configuration's DNS settings.",
///  "type": "object",
///  "properties": {
///    "dnsServers": {
///      "description": "List of DNS servers IP addresses",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineNetworkInterfaceDnsSettingsConfiguration {
    ///List of DNS servers IP addresses
    #[serde(
        rename = "dnsServers",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub dns_servers: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineNetworkInterfaceDnsSettingsConfiguration>
for VirtualMachineNetworkInterfaceDnsSettingsConfiguration {
    fn from(value: &VirtualMachineNetworkInterfaceDnsSettingsConfiguration) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineNetworkInterfaceDnsSettingsConfiguration {
    fn default() -> Self {
        Self {
            dns_servers: Default::default(),
        }
    }
}
///Describes a virtual machine network profile's IP configuration.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine network profile's IP configuration.",
///  "type": "object",
///  "required": [
///    "name"
///  ],
///  "properties": {
///    "name": {
///      "description": "The IP configuration name.",
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineNetworkInterfaceIPConfigurationProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineNetworkInterfaceIpConfiguration {
    ///The IP configuration name.
    pub name: ::std::string::String,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<
        VirtualMachineNetworkInterfaceIpConfigurationProperties,
    >,
}
impl ::std::convert::From<&VirtualMachineNetworkInterfaceIpConfiguration>
for VirtualMachineNetworkInterfaceIpConfiguration {
    fn from(value: &VirtualMachineNetworkInterfaceIpConfiguration) -> Self {
        value.clone()
    }
}
///Describes a virtual machine network interface IP configuration properties.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine network interface IP configuration properties.",
///  "type": "object",
///  "properties": {
///    "applicationGatewayBackendAddressPools": {
///      "description": "Specifies an array of references to backend address pools of application gateways. A virtual machine can reference backend address pools of multiple application gateways. Multiple virtual machines cannot use the same application gateway.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    },
///    "applicationSecurityGroups": {
///      "description": "Specifies an array of references to application security group.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    },
///    "loadBalancerBackendAddressPools": {
///      "description": "Specifies an array of references to backend address pools of load balancers. A virtual machine can reference backend address pools of one public and one internal load balancer. [Multiple virtual machines cannot use the same basic sku load balancer].",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    },
///    "primary": {
///      "description": "Specifies the primary network interface in case the virtual machine has more than 1 network interface.",
///      "type": "boolean"
///    },
///    "privateIPAddressVersion": {
///      "$ref": "#/components/schemas/IPVersions"
///    },
///    "publicIPAddressConfiguration": {
///      "$ref": "#/components/schemas/VirtualMachinePublicIPAddressConfiguration"
///    },
///    "subnet": {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineNetworkInterfaceIpConfigurationProperties {
    ///Specifies an array of references to backend address pools of application gateways. A virtual machine can reference backend address pools of multiple application gateways. Multiple virtual machines cannot use the same application gateway.
    #[serde(
        rename = "applicationGatewayBackendAddressPools",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub application_gateway_backend_address_pools: ::std::vec::Vec<SubResource>,
    ///Specifies an array of references to application security group.
    #[serde(
        rename = "applicationSecurityGroups",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub application_security_groups: ::std::vec::Vec<SubResource>,
    ///Specifies an array of references to backend address pools of load balancers. A virtual machine can reference backend address pools of one public and one internal load balancer. [Multiple virtual machines cannot use the same basic sku load balancer].
    #[serde(
        rename = "loadBalancerBackendAddressPools",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub load_balancer_backend_address_pools: ::std::vec::Vec<SubResource>,
    ///Specifies the primary network interface in case the virtual machine has more than 1 network interface.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub primary: ::std::option::Option<bool>,
    #[serde(
        rename = "privateIPAddressVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub private_ip_address_version: ::std::option::Option<IpVersions>,
    #[serde(
        rename = "publicIPAddressConfiguration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub public_ip_address_configuration: ::std::option::Option<
        VirtualMachinePublicIpAddressConfiguration,
    >,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub subnet: ::std::option::Option<SubResource>,
}
impl ::std::convert::From<&VirtualMachineNetworkInterfaceIpConfigurationProperties>
for VirtualMachineNetworkInterfaceIpConfigurationProperties {
    fn from(value: &VirtualMachineNetworkInterfaceIpConfigurationProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default
for VirtualMachineNetworkInterfaceIpConfigurationProperties {
    fn default() -> Self {
        Self {
            application_gateway_backend_address_pools: Default::default(),
            application_security_groups: Default::default(),
            load_balancer_backend_address_pools: Default::default(),
            primary: Default::default(),
            private_ip_address_version: Default::default(),
            public_ip_address_configuration: Default::default(),
            subnet: Default::default(),
        }
    }
}
///The status of virtual machine patch operations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The status of virtual machine patch operations.",
///  "type": "object",
///  "properties": {
///    "availablePatchSummary": {
///      "$ref": "#/components/schemas/AvailablePatchSummary"
///    },
///    "configurationStatuses": {
///      "description": "The enablement status of the specified patchMode",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    },
///    "lastPatchInstallationSummary": {
///      "$ref": "#/components/schemas/LastPatchInstallationSummary"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachinePatchStatus {
    #[serde(
        rename = "availablePatchSummary",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub available_patch_summary: ::std::option::Option<AvailablePatchSummary>,
    ///The enablement status of the specified patchMode
    #[serde(
        rename = "configurationStatuses",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub configuration_statuses: ::std::vec::Vec<InstanceViewStatus>,
    #[serde(
        rename = "lastPatchInstallationSummary",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_patch_installation_summary: ::std::option::Option<
        LastPatchInstallationSummary,
    >,
}
impl ::std::convert::From<&VirtualMachinePatchStatus> for VirtualMachinePatchStatus {
    fn from(value: &VirtualMachinePatchStatus) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachinePatchStatus {
    fn default() -> Self {
        Self {
            available_patch_summary: Default::default(),
            configuration_statuses: Default::default(),
            last_patch_installation_summary: Default::default(),
        }
    }
}
///Specifies the priority for a standalone virtual machine or the virtual machines in the scale set. 'Low' enum will be deprecated in the future, please use 'Spot' as the enum to deploy Azure Spot VM/VMSS.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the priority for a standalone virtual machine or the virtual machines in the scale set. 'Low' enum will be deprecated in the future, please use 'Spot' as the enum to deploy Azure Spot VM/VMSS.",
///  "type": "string",
///  "enum": [
///    "Regular",
///    "Low",
///    "Spot"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "VirtualMachinePriorityTypes",
///    "values": [
///      {
///        "name": "Regular",
///        "value": "Regular"
///      },
///      {
///        "name": "Low",
///        "value": "Low"
///      },
///      {
///        "name": "Spot",
///        "value": "Spot"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum VirtualMachinePriorityTypes {
    Regular,
    Low,
    Spot,
}
impl ::std::convert::From<&Self> for VirtualMachinePriorityTypes {
    fn from(value: &VirtualMachinePriorityTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for VirtualMachinePriorityTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Regular => f.write_str("Regular"),
            Self::Low => f.write_str("Low"),
            Self::Spot => f.write_str("Spot"),
        }
    }
}
impl ::std::str::FromStr for VirtualMachinePriorityTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "regular" => Ok(Self::Regular),
            "low" => Ok(Self::Low),
            "spot" => Ok(Self::Spot),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for VirtualMachinePriorityTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for VirtualMachinePriorityTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for VirtualMachinePriorityTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes the properties of a Virtual Machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Virtual Machine.",
///  "type": "object",
///  "properties": {
///    "additionalCapabilities": {
///      "$ref": "#/components/schemas/AdditionalCapabilities"
///    },
///    "applicationProfile": {
///      "$ref": "#/components/schemas/ApplicationProfile"
///    },
///    "availabilitySet": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "billingProfile": {
///      "$ref": "#/components/schemas/BillingProfile"
///    },
///    "capacityReservation": {
///      "$ref": "#/components/schemas/CapacityReservationProfile"
///    },
///    "diagnosticsProfile": {
///      "$ref": "#/components/schemas/DiagnosticsProfile"
///    },
///    "evictionPolicy": {
///      "$ref": "#/components/schemas/VirtualMachineEvictionPolicyTypes"
///    },
///    "extensionsTimeBudget": {
///      "description": "Specifies the time alloted for all extensions to start. The time duration should be between 15 minutes and 120 minutes (inclusive) and should be specified in ISO 8601 format. The default value is 90 minutes (PT1H30M). Minimum api-version: 2020-06-01.",
///      "type": "string"
///    },
///    "hardwareProfile": {
///      "$ref": "#/components/schemas/HardwareProfile"
///    },
///    "host": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "hostGroup": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "instanceView": {
///      "$ref": "#/components/schemas/VirtualMachineInstanceView"
///    },
///    "licenseType": {
///      "description": "Specifies that the image or disk that is being used was licensed on-premises. <br><br> Possible values for Windows Server operating system are: <br><br> Windows_Client <br><br> Windows_Server <br><br> Possible values for Linux Server operating system are: <br><br> RHEL_BYOS (for RHEL) <br><br> SLES_BYOS (for SUSE) <br><br> For more information, see [Azure Hybrid Use Benefit for Windows Server](https://docs.microsoft.com/azure/virtual-machines/windows/hybrid-use-benefit-licensing) <br><br> [Azure Hybrid Use Benefit for Linux Server](https://docs.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux) <br><br> Minimum api-version: 2015-06-15",
///      "type": "string"
///    },
///    "networkProfile": {
///      "$ref": "#/components/schemas/NetworkProfile"
///    },
///    "osProfile": {
///      "$ref": "#/components/schemas/OSProfile"
///    },
///    "platformFaultDomain": {
///      "description": "Specifies the scale set logical fault domain into which the Virtual Machine will be created. By default, the Virtual Machine will by automatically assigned to a fault domain that best maintains balance across available fault domains. This is applicable only if the 'virtualMachineScaleSet' property of this Virtual Machine is set. The Virtual Machine Scale Set that is referenced, must have 'platformFaultDomainCount' greater than 1. This property cannot be updated once the Virtual Machine is created. Fault domain assignment can be viewed in the Virtual Machine Instance View. Minimum api‐version: 2020‐12‐01.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "priority": {
///      "$ref": "#/components/schemas/VirtualMachinePriorityTypes"
///    },
///    "provisioningState": {
///      "description": "The provisioning state, which only appears in the response.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "proximityPlacementGroup": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "scheduledEventsPolicy": {
///      "$ref": "#/components/schemas/ScheduledEventsPolicy"
///    },
///    "scheduledEventsProfile": {
///      "$ref": "#/components/schemas/ScheduledEventsProfile"
///    },
///    "securityProfile": {
///      "$ref": "#/components/schemas/SecurityProfile"
///    },
///    "storageProfile": {
///      "$ref": "#/components/schemas/StorageProfile"
///    },
///    "timeCreated": {
///      "description": "Specifies the time at which the Virtual Machine resource was created. Minimum api-version: 2021-11-01.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "userData": {
///      "description": "UserData for the VM, which must be base-64 encoded. Customer should not pass any secrets in here. Minimum api-version: 2021-03-01.",
///      "type": "string"
///    },
///    "virtualMachineScaleSet": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "vmId": {
///      "description": "Specifies the VM unique ID which is a 128-bits identifier that is encoded and stored in all Azure IaaS VMs SMBIOS and can be read using platform BIOS commands.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineProperties {
    #[serde(
        rename = "additionalCapabilities",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub additional_capabilities: ::std::option::Option<AdditionalCapabilities>,
    #[serde(
        rename = "applicationProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub application_profile: ::std::option::Option<ApplicationProfile>,
    #[serde(
        rename = "availabilitySet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub availability_set: ::std::option::Option<SubResource>,
    #[serde(
        rename = "billingProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub billing_profile: ::std::option::Option<BillingProfile>,
    #[serde(
        rename = "capacityReservation",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub capacity_reservation: ::std::option::Option<CapacityReservationProfile>,
    #[serde(
        rename = "diagnosticsProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub diagnostics_profile: ::std::option::Option<DiagnosticsProfile>,
    #[serde(
        rename = "evictionPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub eviction_policy: ::std::option::Option<VirtualMachineEvictionPolicyTypes>,
    ///Specifies the time alloted for all extensions to start. The time duration should be between 15 minutes and 120 minutes (inclusive) and should be specified in ISO 8601 format. The default value is 90 minutes (PT1H30M). Minimum api-version: 2020-06-01.
    #[serde(
        rename = "extensionsTimeBudget",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extensions_time_budget: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "hardwareProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hardware_profile: ::std::option::Option<HardwareProfile>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub host: ::std::option::Option<SubResource>,
    #[serde(
        rename = "hostGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub host_group: ::std::option::Option<SubResource>,
    #[serde(
        rename = "instanceView",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_view: ::std::option::Option<VirtualMachineInstanceView>,
    ///Specifies that the image or disk that is being used was licensed on-premises. <br><br> Possible values for Windows Server operating system are: <br><br> Windows_Client <br><br> Windows_Server <br><br> Possible values for Linux Server operating system are: <br><br> RHEL_BYOS (for RHEL) <br><br> SLES_BYOS (for SUSE) <br><br> For more information, see [Azure Hybrid Use Benefit for Windows Server](https://docs.microsoft.com/azure/virtual-machines/windows/hybrid-use-benefit-licensing) <br><br> [Azure Hybrid Use Benefit for Linux Server](https://docs.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux) <br><br> Minimum api-version: 2015-06-15
    #[serde(
        rename = "licenseType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub license_type: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "networkProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_profile: ::std::option::Option<NetworkProfile>,
    #[serde(
        rename = "osProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_profile: ::std::option::Option<OsProfile>,
    ///Specifies the scale set logical fault domain into which the Virtual Machine will be created. By default, the Virtual Machine will by automatically assigned to a fault domain that best maintains balance across available fault domains. This is applicable only if the 'virtualMachineScaleSet' property of this Virtual Machine is set. The Virtual Machine Scale Set that is referenced, must have 'platformFaultDomainCount' greater than 1. This property cannot be updated once the Virtual Machine is created. Fault domain assignment can be viewed in the Virtual Machine Instance View. Minimum api‐version: 2020‐12‐01.
    #[serde(
        rename = "platformFaultDomain",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub platform_fault_domain: ::std::option::Option<i32>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub priority: ::std::option::Option<VirtualMachinePriorityTypes>,
    ///The provisioning state, which only appears in the response.
    #[serde(
        rename = "provisioningState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_state: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "proximityPlacementGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub proximity_placement_group: ::std::option::Option<SubResource>,
    #[serde(
        rename = "scheduledEventsPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scheduled_events_policy: ::std::option::Option<ScheduledEventsPolicy>,
    #[serde(
        rename = "scheduledEventsProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scheduled_events_profile: ::std::option::Option<ScheduledEventsProfile>,
    #[serde(
        rename = "securityProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub security_profile: ::std::option::Option<SecurityProfile>,
    #[serde(
        rename = "storageProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_profile: ::std::option::Option<StorageProfile>,
    ///Specifies the time at which the Virtual Machine resource was created. Minimum api-version: 2021-11-01.
    #[serde(
        rename = "timeCreated",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub time_created: ::std::option::Option<::std::string::String>,
    ///UserData for the VM, which must be base-64 encoded. Customer should not pass any secrets in here. Minimum api-version: 2021-03-01.
    #[serde(
        rename = "userData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub user_data: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "virtualMachineScaleSet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machine_scale_set: ::std::option::Option<SubResource>,
    ///Specifies the VM unique ID which is a 128-bits identifier that is encoded and stored in all Azure IaaS VMs SMBIOS and can be read using platform BIOS commands.
    #[serde(
        rename = "vmId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineProperties> for VirtualMachineProperties {
    fn from(value: &VirtualMachineProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineProperties {
    fn default() -> Self {
        Self {
            additional_capabilities: Default::default(),
            application_profile: Default::default(),
            availability_set: Default::default(),
            billing_profile: Default::default(),
            capacity_reservation: Default::default(),
            diagnostics_profile: Default::default(),
            eviction_policy: Default::default(),
            extensions_time_budget: Default::default(),
            hardware_profile: Default::default(),
            host: Default::default(),
            host_group: Default::default(),
            instance_view: Default::default(),
            license_type: Default::default(),
            network_profile: Default::default(),
            os_profile: Default::default(),
            platform_fault_domain: Default::default(),
            priority: Default::default(),
            provisioning_state: Default::default(),
            proximity_placement_group: Default::default(),
            scheduled_events_policy: Default::default(),
            scheduled_events_profile: Default::default(),
            security_profile: Default::default(),
            storage_profile: Default::default(),
            time_created: Default::default(),
            user_data: Default::default(),
            virtual_machine_scale_set: Default::default(),
            vm_id: Default::default(),
        }
    }
}
///Describes a virtual machines IP Configuration's PublicIPAddress configuration
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machines IP Configuration's PublicIPAddress configuration",
///  "type": "object",
///  "required": [
///    "name"
///  ],
///  "properties": {
///    "name": {
///      "description": "The publicIP address configuration name.",
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachinePublicIPAddressConfigurationProperties"
///    },
///    "sku": {
///      "$ref": "#/components/schemas/PublicIPAddressSku"
///    },
///    "tags": {
///      "description": "Resource tags applied to the publicIP address created by this PublicIPAddressConfiguration",
///      "type": "object",
///      "additionalProperties": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachinePublicIpAddressConfiguration {
    ///The publicIP address configuration name.
    pub name: ::std::string::String,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<
        VirtualMachinePublicIpAddressConfigurationProperties,
    >,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku: ::std::option::Option<PublicIpAddressSku>,
    ///Resource tags applied to the publicIP address created by this PublicIPAddressConfiguration
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&VirtualMachinePublicIpAddressConfiguration>
for VirtualMachinePublicIpAddressConfiguration {
    fn from(value: &VirtualMachinePublicIpAddressConfiguration) -> Self {
        value.clone()
    }
}
///Describes a virtual machines IP Configuration's PublicIPAddress configuration
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machines IP Configuration's PublicIPAddress configuration",
///  "type": "object",
///  "properties": {
///    "deleteOption": {
///      "$ref": "#/components/schemas/DeleteOptions"
///    },
///    "dnsSettings": {
///      "$ref": "#/components/schemas/VirtualMachinePublicIPAddressDnsSettingsConfiguration"
///    },
///    "idleTimeoutInMinutes": {
///      "description": "The idle timeout of the public IP address.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "ipTags": {
///      "description": "The list of IP tags associated with the public IP address.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineIpTag"
///      },
///      "x-ms-identifiers": []
///    },
///    "publicIPAddressVersion": {
///      "$ref": "#/components/schemas/IPVersions"
///    },
///    "publicIPAllocationMethod": {
///      "$ref": "#/components/schemas/PublicIPAllocationMethod"
///    },
///    "publicIPPrefix": {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachinePublicIpAddressConfigurationProperties {
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DeleteOptions>,
    #[serde(
        rename = "dnsSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub dns_settings: ::std::option::Option<
        VirtualMachinePublicIpAddressDnsSettingsConfiguration,
    >,
    ///The idle timeout of the public IP address.
    #[serde(
        rename = "idleTimeoutInMinutes",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub idle_timeout_in_minutes: ::std::option::Option<i32>,
    ///The list of IP tags associated with the public IP address.
    #[serde(
        rename = "ipTags",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub ip_tags: ::std::vec::Vec<VirtualMachineIpTag>,
    #[serde(
        rename = "publicIPAddressVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub public_ip_address_version: ::std::option::Option<IpVersions>,
    #[serde(
        rename = "publicIPAllocationMethod",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub public_ip_allocation_method: ::std::option::Option<PublicIpAllocationMethod>,
    #[serde(
        rename = "publicIPPrefix",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub public_ip_prefix: ::std::option::Option<SubResource>,
}
impl ::std::convert::From<&VirtualMachinePublicIpAddressConfigurationProperties>
for VirtualMachinePublicIpAddressConfigurationProperties {
    fn from(value: &VirtualMachinePublicIpAddressConfigurationProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachinePublicIpAddressConfigurationProperties {
    fn default() -> Self {
        Self {
            delete_option: Default::default(),
            dns_settings: Default::default(),
            idle_timeout_in_minutes: Default::default(),
            ip_tags: Default::default(),
            public_ip_address_version: Default::default(),
            public_ip_allocation_method: Default::default(),
            public_ip_prefix: Default::default(),
        }
    }
}
///Describes a virtual machines network configuration's DNS settings.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machines network configuration's DNS settings.",
///  "type": "object",
///  "required": [
///    "domainNameLabel"
///  ],
///  "properties": {
///    "domainNameLabel": {
///      "description": "The Domain name label prefix of the PublicIPAddress resources that will be created. The generated name label is the concatenation of the domain name label and vm network profile unique ID.",
///      "type": "string"
///    },
///    "domainNameLabelScope": {
///      "$ref": "#/components/schemas/DomainNameLabelScopeTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachinePublicIpAddressDnsSettingsConfiguration {
    ///The Domain name label prefix of the PublicIPAddress resources that will be created. The generated name label is the concatenation of the domain name label and vm network profile unique ID.
    #[serde(rename = "domainNameLabel")]
    pub domain_name_label: ::std::string::String,
    #[serde(
        rename = "domainNameLabelScope",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub domain_name_label_scope: ::std::option::Option<DomainNameLabelScopeTypes>,
}
impl ::std::convert::From<&VirtualMachinePublicIpAddressDnsSettingsConfiguration>
for VirtualMachinePublicIpAddressDnsSettingsConfiguration {
    fn from(value: &VirtualMachinePublicIpAddressDnsSettingsConfiguration) -> Self {
        value.clone()
    }
}
///Parameters for Reimaging Virtual Machine. NOTE: Virtual Machine OS disk will always be reimaged
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Parameters for Reimaging Virtual Machine. NOTE: Virtual Machine OS disk will always be reimaged",
///  "type": "object",
///  "properties": {
///    "exactVersion": {
///      "description": "Specifies in decimal number, the version the OS disk should be reimaged to. If exact version is not provided, the OS disk is reimaged to the existing version of OS Disk.",
///      "type": "string"
///    },
///    "osProfile": {
///      "$ref": "#/components/schemas/OSProfileProvisioningData"
///    },
///    "tempDisk": {
///      "description": "Specifies whether to reimage temp disk. Default value: false. Note: This temp disk reimage parameter is only supported for VM/VMSS with Ephemeral OS disk.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineReimageParameters {
    ///Specifies in decimal number, the version the OS disk should be reimaged to. If exact version is not provided, the OS disk is reimaged to the existing version of OS Disk.
    #[serde(
        rename = "exactVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub exact_version: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "osProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_profile: ::std::option::Option<OsProfileProvisioningData>,
    ///Specifies whether to reimage temp disk. Default value: false. Note: This temp disk reimage parameter is only supported for VM/VMSS with Ephemeral OS disk.
    #[serde(
        rename = "tempDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub temp_disk: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineReimageParameters>
for VirtualMachineReimageParameters {
    fn from(value: &VirtualMachineReimageParameters) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineReimageParameters {
    fn default() -> Self {
        Self {
            exact_version: Default::default(),
            os_profile: Default::default(),
            temp_disk: Default::default(),
        }
    }
}
///Describes a Virtual Machine run command.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine run command.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineRunCommandProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineRunCommand {
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineRunCommandProperties>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineRunCommand> for VirtualMachineRunCommand {
    fn from(value: &VirtualMachineRunCommand) -> Self {
        value.clone()
    }
}
///The instance view of a virtual machine run command.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a virtual machine run command.",
///  "type": "object",
///  "properties": {
///    "endTime": {
///      "description": "Script end time.",
///      "type": "string"
///    },
///    "error": {
///      "description": "Script error stream.",
///      "type": "string"
///    },
///    "executionMessage": {
///      "description": "Communicate script configuration errors or execution messages.",
///      "type": "string"
///    },
///    "executionState": {
///      "$ref": "#/components/schemas/ExecutionState"
///    },
///    "exitCode": {
///      "description": "Exit code returned from script execution.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "output": {
///      "description": "Script output stream.",
///      "type": "string"
///    },
///    "startTime": {
///      "description": "Script start time.",
///      "type": "string"
///    },
///    "statuses": {
///      "description": "The resource status information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineRunCommandInstanceView {
    ///Script end time.
    #[serde(
        rename = "endTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub end_time: ::std::option::Option<::std::string::String>,
    ///Script error stream.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub error: ::std::option::Option<::std::string::String>,
    ///Communicate script configuration errors or execution messages.
    #[serde(
        rename = "executionMessage",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub execution_message: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "executionState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub execution_state: ::std::option::Option<ExecutionState>,
    ///Exit code returned from script execution.
    #[serde(
        rename = "exitCode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub exit_code: ::std::option::Option<i32>,
    ///Script output stream.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub output: ::std::option::Option<::std::string::String>,
    ///Script start time.
    #[serde(
        rename = "startTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub start_time: ::std::option::Option<::std::string::String>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
}
impl ::std::convert::From<&VirtualMachineRunCommandInstanceView>
for VirtualMachineRunCommandInstanceView {
    fn from(value: &VirtualMachineRunCommandInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineRunCommandInstanceView {
    fn default() -> Self {
        Self {
            end_time: Default::default(),
            error: Default::default(),
            execution_message: Default::default(),
            execution_state: Default::default(),
            exit_code: Default::default(),
            output: Default::default(),
            start_time: Default::default(),
            statuses: Default::default(),
        }
    }
}
///Describes the properties of a Virtual Machine run command.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Virtual Machine run command.",
///  "type": "object",
///  "properties": {
///    "asyncExecution": {
///      "description": "Optional. If set to true, provisioning will complete as soon as the script starts and will not wait for script to complete.",
///      "type": "boolean"
///    },
///    "errorBlobManagedIdentity": {
///      "$ref": "#/components/schemas/RunCommandManagedIdentity"
///    },
///    "errorBlobUri": {
///      "description": "Specifies the Azure storage blob where script error stream will be uploaded. Use a SAS URI with read, append, create, write access OR use managed identity to provide the VM access to the blob. Refer errorBlobManagedIdentity parameter.",
///      "type": "string"
///    },
///    "instanceView": {
///      "$ref": "#/components/schemas/VirtualMachineRunCommandInstanceView"
///    },
///    "outputBlobManagedIdentity": {
///      "$ref": "#/components/schemas/RunCommandManagedIdentity"
///    },
///    "outputBlobUri": {
///      "description": "Specifies the Azure storage blob where script output stream will be uploaded. Use a SAS URI with read, append, create, write access OR use managed identity to provide the VM access to the blob. Refer outputBlobManagedIdentity parameter.",
///      "type": "string"
///    },
///    "parameters": {
///      "description": "The parameters used by the script.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/RunCommandInputParameter"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "protectedParameters": {
///      "description": "The parameters used by the script.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/RunCommandInputParameter"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "provisioningState": {
///      "description": "The provisioning state, which only appears in the response. If treatFailureAsDeploymentFailure set to true, any failure in the script will fail the deployment and ProvisioningState will be marked as Failed. If treatFailureAsDeploymentFailure set to false, ProvisioningState would only reflect whether the run command was run or not by the extensions platform, it would not indicate whether script failed in case of script failures. See instance view of run command in case of script failures to see executionMessage, output, error: https://aka.ms/runcommandmanaged#get-execution-status-and-results",
///      "readOnly": true,
///      "type": "string"
///    },
///    "runAsPassword": {
///      "description": "Specifies the user account password on the VM when executing the run command.",
///      "type": "string"
///    },
///    "runAsUser": {
///      "description": "Specifies the user account on the VM when executing the run command.",
///      "type": "string"
///    },
///    "source": {
///      "$ref": "#/components/schemas/VirtualMachineRunCommandScriptSource"
///    },
///    "timeoutInSeconds": {
///      "description": "The timeout in seconds to execute the run command.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "treatFailureAsDeploymentFailure": {
///      "description": "Optional. If set to true, any failure in the script will fail the deployment and ProvisioningState will be marked as Failed. If set to false, ProvisioningState would only reflect whether the run command was run or not by the extensions platform, it would not indicate whether script failed in case of script failures. See instance view of run command in case of script failures to see executionMessage, output, error: https://aka.ms/runcommandmanaged#get-execution-status-and-results",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineRunCommandProperties {
    ///Optional. If set to true, provisioning will complete as soon as the script starts and will not wait for script to complete.
    #[serde(
        rename = "asyncExecution",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub async_execution: ::std::option::Option<bool>,
    #[serde(
        rename = "errorBlobManagedIdentity",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub error_blob_managed_identity: ::std::option::Option<RunCommandManagedIdentity>,
    ///Specifies the Azure storage blob where script error stream will be uploaded. Use a SAS URI with read, append, create, write access OR use managed identity to provide the VM access to the blob. Refer errorBlobManagedIdentity parameter.
    #[serde(
        rename = "errorBlobUri",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub error_blob_uri: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "instanceView",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_view: ::std::option::Option<VirtualMachineRunCommandInstanceView>,
    #[serde(
        rename = "outputBlobManagedIdentity",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub output_blob_managed_identity: ::std::option::Option<RunCommandManagedIdentity>,
    ///Specifies the Azure storage blob where script output stream will be uploaded. Use a SAS URI with read, append, create, write access OR use managed identity to provide the VM access to the blob. Refer outputBlobManagedIdentity parameter.
    #[serde(
        rename = "outputBlobUri",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub output_blob_uri: ::std::option::Option<::std::string::String>,
    ///The parameters used by the script.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub parameters: ::std::vec::Vec<RunCommandInputParameter>,
    ///The parameters used by the script.
    #[serde(
        rename = "protectedParameters",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub protected_parameters: ::std::vec::Vec<RunCommandInputParameter>,
    ///The provisioning state, which only appears in the response. If treatFailureAsDeploymentFailure set to true, any failure in the script will fail the deployment and ProvisioningState will be marked as Failed. If treatFailureAsDeploymentFailure set to false, ProvisioningState would only reflect whether the run command was run or not by the extensions platform, it would not indicate whether script failed in case of script failures. See instance view of run command in case of script failures to see executionMessage, output, error: https://aka.ms/runcommandmanaged#get-execution-status-and-results
    #[serde(
        rename = "provisioningState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_state: ::std::option::Option<::std::string::String>,
    ///Specifies the user account password on the VM when executing the run command.
    #[serde(
        rename = "runAsPassword",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub run_as_password: ::std::option::Option<::std::string::String>,
    ///Specifies the user account on the VM when executing the run command.
    #[serde(
        rename = "runAsUser",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub run_as_user: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub source: ::std::option::Option<VirtualMachineRunCommandScriptSource>,
    ///The timeout in seconds to execute the run command.
    #[serde(
        rename = "timeoutInSeconds",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub timeout_in_seconds: ::std::option::Option<i32>,
    ///Optional. If set to true, any failure in the script will fail the deployment and ProvisioningState will be marked as Failed. If set to false, ProvisioningState would only reflect whether the run command was run or not by the extensions platform, it would not indicate whether script failed in case of script failures. See instance view of run command in case of script failures to see executionMessage, output, error: https://aka.ms/runcommandmanaged#get-execution-status-and-results
    #[serde(
        rename = "treatFailureAsDeploymentFailure",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub treat_failure_as_deployment_failure: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineRunCommandProperties>
for VirtualMachineRunCommandProperties {
    fn from(value: &VirtualMachineRunCommandProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineRunCommandProperties {
    fn default() -> Self {
        Self {
            async_execution: Default::default(),
            error_blob_managed_identity: Default::default(),
            error_blob_uri: Default::default(),
            instance_view: Default::default(),
            output_blob_managed_identity: Default::default(),
            output_blob_uri: Default::default(),
            parameters: Default::default(),
            protected_parameters: Default::default(),
            provisioning_state: Default::default(),
            run_as_password: Default::default(),
            run_as_user: Default::default(),
            source: Default::default(),
            timeout_in_seconds: Default::default(),
            treat_failure_as_deployment_failure: Default::default(),
        }
    }
}
///Describes the script sources for run command. Use only one of these script sources: script, scriptUri, commandId, galleryScriptReferenceId.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the script sources for run command. Use only one of these script sources: script, scriptUri, commandId, galleryScriptReferenceId.",
///  "type": "object",
///  "properties": {
///    "commandId": {
///      "description": "Specifies a commandId of predefined built-in script. Command IDs available for Linux are listed at https://aka.ms/RunCommandManagedLinux#available-commands, Windows at https://aka.ms/RunCommandManagedWindows#available-commands.",
///      "type": "string"
///    },
///    "galleryScriptReferenceId": {
///      "description": "The resource ID of a Gallery Script version that needs to be executed. Example ID looks like /subscriptions/{subId}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/scripts/{scriptName}/versions/{version}.",
///      "type": "string"
///    },
///    "script": {
///      "description": "Specifies the script content to be executed on the VM.",
///      "type": "string"
///    },
///    "scriptShell": {
///      "$ref": "#/components/schemas/ScriptShellTypes"
///    },
///    "scriptUri": {
///      "description": "Specifies the script download location. It can be either SAS URI of an Azure storage blob with read access or public URI.",
///      "type": "string"
///    },
///    "scriptUriManagedIdentity": {
///      "$ref": "#/components/schemas/RunCommandManagedIdentity"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineRunCommandScriptSource {
    ///Specifies a commandId of predefined built-in script. Command IDs available for Linux are listed at https://aka.ms/RunCommandManagedLinux#available-commands, Windows at https://aka.ms/RunCommandManagedWindows#available-commands.
    #[serde(
        rename = "commandId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub command_id: ::std::option::Option<::std::string::String>,
    ///The resource ID of a Gallery Script version that needs to be executed. Example ID looks like /subscriptions/{subId}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/scripts/{scriptName}/versions/{version}.
    #[serde(
        rename = "galleryScriptReferenceId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub gallery_script_reference_id: ::std::option::Option<::std::string::String>,
    ///Specifies the script content to be executed on the VM.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub script: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "scriptShell",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub script_shell: ::std::option::Option<ScriptShellTypes>,
    ///Specifies the script download location. It can be either SAS URI of an Azure storage blob with read access or public URI.
    #[serde(
        rename = "scriptUri",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub script_uri: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "scriptUriManagedIdentity",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub script_uri_managed_identity: ::std::option::Option<RunCommandManagedIdentity>,
}
impl ::std::convert::From<&VirtualMachineRunCommandScriptSource>
for VirtualMachineRunCommandScriptSource {
    fn from(value: &VirtualMachineRunCommandScriptSource) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineRunCommandScriptSource {
    fn default() -> Self {
        Self {
            command_id: Default::default(),
            gallery_script_reference_id: Default::default(),
            script: Default::default(),
            script_shell: Default::default(),
            script_uri: Default::default(),
            script_uri_managed_identity: Default::default(),
        }
    }
}
///Describes a Virtual Machine run command.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine run command.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineRunCommandProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineRunCommandUpdate {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineRunCommandProperties>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineRunCommandUpdate>
for VirtualMachineRunCommandUpdate {
    fn from(value: &VirtualMachineRunCommandUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineRunCommandUpdate {
    fn default() -> Self {
        Self {
            properties: Default::default(),
            tags: Default::default(),
        }
    }
}
///The List run command operation response
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List run command operation response",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The uri to fetch the next page of run commands.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of run commands.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineRunCommand"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineRunCommandsListResult {
    ///The uri to fetch the next page of run commands.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of run commands.
    pub value: ::std::vec::Vec<VirtualMachineRunCommand>,
}
impl ::std::convert::From<&VirtualMachineRunCommandsListResult>
for VirtualMachineRunCommandsListResult {
    fn from(value: &VirtualMachineRunCommandsListResult) -> Self {
        value.clone()
    }
}
///Describes a Virtual Machine Scale Set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine Scale Set.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "etag": {
///      "description": "Etag is property returned in Create/Update/Get response of the VMSS, so that customer can supply it in the header to ensure optimistic updates",
///      "readOnly": true,
///      "type": "string"
///    },
///    "extendedLocation": {
///      "$ref": "#/components/schemas/ExtendedLocation"
///    },
///    "identity": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetIdentity"
///    },
///    "placement": {
///      "$ref": "#/components/schemas/Placement"
///    },
///    "plan": {
///      "$ref": "#/components/schemas/Plan"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetProperties"
///    },
///    "sku": {
///      "$ref": "#/components/schemas/Sku"
///    },
///    "zones": {
///      "description": "The availability zones.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSet {
    ///Etag is property returned in Create/Update/Get response of the VMSS, so that customer can supply it in the header to ensure optimistic updates
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub etag: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "extendedLocation",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extended_location: ::std::option::Option<ExtendedLocation>,
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub identity: ::std::option::Option<VirtualMachineScaleSetIdentity>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub placement: ::std::option::Option<Placement>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub plan: ::std::option::Option<Plan>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineScaleSetProperties>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku: ::std::option::Option<Sku>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///The availability zones.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zones: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSet> for VirtualMachineScaleSet {
    fn from(value: &VirtualMachineScaleSet) -> Self {
        value.clone()
    }
}
///Describes a virtual machine scale set data disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set data disk.",
///  "type": "object",
///  "required": [
///    "createOption",
///    "lun"
///  ],
///  "properties": {
///    "caching": {
///      "$ref": "#/components/schemas/CachingTypes"
///    },
///    "createOption": {
///      "$ref": "#/components/schemas/DiskCreateOptionTypes"
///    },
///    "deleteOption": {
///      "$ref": "#/components/schemas/DiskDeleteOptionTypes"
///    },
///    "diskIOPSReadWrite": {
///      "description": "Specifies the Read-Write IOPS for the managed disk. Should be used only when StorageAccountType is UltraSSD_LRS. If not specified, a default value would be assigned based on diskSizeGB.",
///      "type": "integer",
///      "format": "int64"
///    },
///    "diskMBpsReadWrite": {
///      "description": "Specifies the bandwidth in MB per second for the managed disk. Should be used only when StorageAccountType is UltraSSD_LRS. If not specified, a default value would be assigned based on diskSizeGB.",
///      "type": "integer",
///      "format": "int64"
///    },
///    "diskSizeGB": {
///      "description": "Specifies the size of an empty data disk in gigabytes. This element can be used to overwrite the size of the disk in a virtual machine image. The property diskSizeGB is the number of bytes x 1024^3 for the disk and the value cannot be larger than 1023.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "lun": {
///      "description": "Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "managedDisk": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetManagedDiskParameters"
///    },
///    "name": {
///      "description": "The disk name.",
///      "type": "string"
///    },
///    "writeAcceleratorEnabled": {
///      "description": "Specifies whether writeAccelerator should be enabled or disabled on the disk.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetDataDisk {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub caching: ::std::option::Option<CachingTypes>,
    #[serde(rename = "createOption")]
    pub create_option: DiskCreateOptionTypes,
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DiskDeleteOptionTypes>,
    ///Specifies the Read-Write IOPS for the managed disk. Should be used only when StorageAccountType is UltraSSD_LRS. If not specified, a default value would be assigned based on diskSizeGB.
    #[serde(
        rename = "diskIOPSReadWrite",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_iops_read_write: ::std::option::Option<i64>,
    ///Specifies the bandwidth in MB per second for the managed disk. Should be used only when StorageAccountType is UltraSSD_LRS. If not specified, a default value would be assigned based on diskSizeGB.
    #[serde(
        rename = "diskMBpsReadWrite",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_m_bps_read_write: ::std::option::Option<i64>,
    ///Specifies the size of an empty data disk in gigabytes. This element can be used to overwrite the size of the disk in a virtual machine image. The property diskSizeGB is the number of bytes x 1024^3 for the disk and the value cannot be larger than 1023.
    #[serde(
        rename = "diskSizeGB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_size_gb: ::std::option::Option<i32>,
    ///Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.
    pub lun: i32,
    #[serde(
        rename = "managedDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub managed_disk: ::std::option::Option<VirtualMachineScaleSetManagedDiskParameters>,
    ///The disk name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///Specifies whether writeAccelerator should be enabled or disabled on the disk.
    #[serde(
        rename = "writeAcceleratorEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub write_accelerator_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineScaleSetDataDisk>
for VirtualMachineScaleSetDataDisk {
    fn from(value: &VirtualMachineScaleSetDataDisk) -> Self {
        value.clone()
    }
}
///Describes a Virtual Machine Scale Set Extension.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine Scale Set Extension.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResourceReadOnly"
///    }
///  ],
///  "properties": {
///    "name": {
///      "description": "Resource name",
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetExtensionProperties"
///    },
///    "type": {
///      "description": "Resource type",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetExtension {
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///Resource name
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineScaleSetExtensionProperties>,
    ///Resource type
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetExtension>
for VirtualMachineScaleSetExtension {
    fn from(value: &VirtualMachineScaleSetExtension) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetExtension {
    fn default() -> Self {
        Self {
            id: Default::default(),
            name: Default::default(),
            properties: Default::default(),
            type_: Default::default(),
        }
    }
}
///The List VM scale set extension operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List VM scale set extension operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The uri to fetch the next page of VM scale set extensions. Call ListNext() with this to fetch the next page of VM scale set extensions.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of VM scale set extensions.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetExtension"
///      },
///      "x-ms-identifiers": [
///        "name",
///        "id"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetExtensionListResult {
    ///The uri to fetch the next page of VM scale set extensions. Call ListNext() with this to fetch the next page of VM scale set extensions.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of VM scale set extensions.
    pub value: ::std::vec::Vec<VirtualMachineScaleSetExtension>,
}
impl ::std::convert::From<&VirtualMachineScaleSetExtensionListResult>
for VirtualMachineScaleSetExtensionListResult {
    fn from(value: &VirtualMachineScaleSetExtensionListResult) -> Self {
        value.clone()
    }
}
///Describes a virtual machine scale set extension profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set extension profile.",
///  "type": "object",
///  "properties": {
///    "extensions": {
///      "description": "The virtual machine scale set child extension resources.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetExtension"
///      },
///      "x-ms-identifiers": [
///        "name",
///        "id"
///      ]
///    },
///    "extensionsTimeBudget": {
///      "description": "Specifies the time alloted for all extensions to start. The time duration should be between 15 minutes and 120 minutes (inclusive) and should be specified in ISO 8601 format. The default value is 90 minutes (PT1H30M). Minimum api-version: 2020-06-01.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetExtensionProfile {
    ///The virtual machine scale set child extension resources.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extensions: ::std::vec::Vec<VirtualMachineScaleSetExtension>,
    ///Specifies the time alloted for all extensions to start. The time duration should be between 15 minutes and 120 minutes (inclusive) and should be specified in ISO 8601 format. The default value is 90 minutes (PT1H30M). Minimum api-version: 2020-06-01.
    #[serde(
        rename = "extensionsTimeBudget",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extensions_time_budget: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetExtensionProfile>
for VirtualMachineScaleSetExtensionProfile {
    fn from(value: &VirtualMachineScaleSetExtensionProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetExtensionProfile {
    fn default() -> Self {
        Self {
            extensions: Default::default(),
            extensions_time_budget: Default::default(),
        }
    }
}
///Describes the properties of a Virtual Machine Scale Set Extension.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Virtual Machine Scale Set Extension.",
///  "type": "object",
///  "properties": {
///    "autoUpgradeMinorVersion": {
///      "description": "Indicates whether the extension should use a newer minor version if one is available at deployment time. Once deployed, however, the extension will not upgrade minor versions unless redeployed, even with this property set to true.",
///      "type": "boolean"
///    },
///    "enableAutomaticUpgrade": {
///      "description": "Indicates whether the extension should be automatically upgraded by the platform if there is a newer version of the extension available.",
///      "type": "boolean"
///    },
///    "forceUpdateTag": {
///      "description": "If a value is provided and is different from the previous value, the extension handler will be forced to update even if the extension configuration has not changed.",
///      "type": "string"
///    },
///    "protectedSettings": {
///      "description": "The extension can contain either protectedSettings or protectedSettingsFromKeyVault or no protected settings at all."
///    },
///    "protectedSettingsFromKeyVault": {
///      "$ref": "#/components/schemas/KeyVaultSecretReference"
///    },
///    "provisionAfterExtensions": {
///      "description": "Collection of extension names after which this extension needs to be provisioned.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "provisioningState": {
///      "description": "The provisioning state, which only appears in the response.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "publisher": {
///      "description": "The name of the extension handler publisher.",
///      "type": "string"
///    },
///    "settings": {
///      "description": "Json formatted public settings for the extension."
///    },
///    "suppressFailures": {
///      "description": "Indicates whether failures stemming from the extension will be suppressed (Operational failures such as not connecting to the VM will not be suppressed regardless of this value). The default is false.",
///      "type": "boolean"
///    },
///    "type": {
///      "description": "Specifies the type of the extension; an example is \"CustomScriptExtension\".",
///      "type": "string"
///    },
///    "typeHandlerVersion": {
///      "description": "Specifies the version of the script handler.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetExtensionProperties {
    ///Indicates whether the extension should use a newer minor version if one is available at deployment time. Once deployed, however, the extension will not upgrade minor versions unless redeployed, even with this property set to true.
    #[serde(
        rename = "autoUpgradeMinorVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub auto_upgrade_minor_version: ::std::option::Option<bool>,
    ///Indicates whether the extension should be automatically upgraded by the platform if there is a newer version of the extension available.
    #[serde(
        rename = "enableAutomaticUpgrade",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_automatic_upgrade: ::std::option::Option<bool>,
    ///If a value is provided and is different from the previous value, the extension handler will be forced to update even if the extension configuration has not changed.
    #[serde(
        rename = "forceUpdateTag",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub force_update_tag: ::std::option::Option<::std::string::String>,
    ///The extension can contain either protectedSettings or protectedSettingsFromKeyVault or no protected settings at all.
    #[serde(
        rename = "protectedSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub protected_settings: ::std::option::Option<::serde_json::Value>,
    #[serde(
        rename = "protectedSettingsFromKeyVault",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub protected_settings_from_key_vault: ::std::option::Option<
        KeyVaultSecretReference,
    >,
    ///Collection of extension names after which this extension needs to be provisioned.
    #[serde(
        rename = "provisionAfterExtensions",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provision_after_extensions: ::std::vec::Vec<::std::string::String>,
    ///The provisioning state, which only appears in the response.
    #[serde(
        rename = "provisioningState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_state: ::std::option::Option<::std::string::String>,
    ///The name of the extension handler publisher.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub publisher: ::std::option::Option<::std::string::String>,
    ///Json formatted public settings for the extension.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub settings: ::std::option::Option<::serde_json::Value>,
    ///Indicates whether failures stemming from the extension will be suppressed (Operational failures such as not connecting to the VM will not be suppressed regardless of this value). The default is false.
    #[serde(
        rename = "suppressFailures",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub suppress_failures: ::std::option::Option<bool>,
    ///Specifies the type of the extension; an example is "CustomScriptExtension".
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///Specifies the version of the script handler.
    #[serde(
        rename = "typeHandlerVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_handler_version: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetExtensionProperties>
for VirtualMachineScaleSetExtensionProperties {
    fn from(value: &VirtualMachineScaleSetExtensionProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetExtensionProperties {
    fn default() -> Self {
        Self {
            auto_upgrade_minor_version: Default::default(),
            enable_automatic_upgrade: Default::default(),
            force_update_tag: Default::default(),
            protected_settings: Default::default(),
            protected_settings_from_key_vault: Default::default(),
            provision_after_extensions: Default::default(),
            provisioning_state: Default::default(),
            publisher: Default::default(),
            settings: Default::default(),
            suppress_failures: Default::default(),
            type_: Default::default(),
            type_handler_version: Default::default(),
        }
    }
}
///Describes a Virtual Machine Scale Set Extension.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine Scale Set Extension.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResourceReadOnly"
///    }
///  ],
///  "properties": {
///    "name": {
///      "description": "The name of the extension.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetExtensionProperties"
///    },
///    "type": {
///      "description": "Resource type",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetExtensionUpdate {
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The name of the extension.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineScaleSetExtensionProperties>,
    ///Resource type
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetExtensionUpdate>
for VirtualMachineScaleSetExtensionUpdate {
    fn from(value: &VirtualMachineScaleSetExtensionUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetExtensionUpdate {
    fn default() -> Self {
        Self {
            id: Default::default(),
            name: Default::default(),
            properties: Default::default(),
            type_: Default::default(),
        }
    }
}
///Specifies the hardware settings for the virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the hardware settings for the virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "vmSizeProperties": {
///      "$ref": "#/components/schemas/VMSizeProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetHardwareProfile {
    #[serde(
        rename = "vmSizeProperties",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_size_properties: ::std::option::Option<VmSizeProperties>,
}
impl ::std::convert::From<&VirtualMachineScaleSetHardwareProfile>
for VirtualMachineScaleSetHardwareProfile {
    fn from(value: &VirtualMachineScaleSetHardwareProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetHardwareProfile {
    fn default() -> Self {
        Self {
            vm_size_properties: Default::default(),
        }
    }
}
///Identity for the virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Identity for the virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "principalId": {
///      "description": "The principal id of virtual machine scale set identity. This property will only be provided for a system assigned identity.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "tenantId": {
///      "description": "The tenant id associated with the virtual machine scale set. This property will only be provided for a system assigned identity.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "type": {
///      "$ref": "#/components/schemas/ResourceIdentityType"
///    },
///    "userAssignedIdentities": {
///      "description": "The list of user identities associated with the virtual machine scale set. The user identity dictionary key references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'.",
///      "type": "object",
///      "additionalProperties": {
///        "$ref": "#/components/schemas/UserAssignedIdentitiesValue"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetIdentity {
    ///The principal id of virtual machine scale set identity. This property will only be provided for a system assigned identity.
    #[serde(
        rename = "principalId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub principal_id: ::std::option::Option<::std::string::String>,
    ///The tenant id associated with the virtual machine scale set. This property will only be provided for a system assigned identity.
    #[serde(
        rename = "tenantId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tenant_id: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<ResourceIdentityType>,
    ///The list of user identities associated with the virtual machine scale set. The user identity dictionary key references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'.
    #[serde(
        rename = "userAssignedIdentities",
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub user_assigned_identities: ::std::collections::HashMap<
        ::std::string::String,
        UserAssignedIdentitiesValue,
    >,
}
impl ::std::convert::From<&VirtualMachineScaleSetIdentity>
for VirtualMachineScaleSetIdentity {
    fn from(value: &VirtualMachineScaleSetIdentity) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetIdentity {
    fn default() -> Self {
        Self {
            principal_id: Default::default(),
            tenant_id: Default::default(),
            type_: Default::default(),
            user_assigned_identities: Default::default(),
        }
    }
}
///The instance view of a virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "extensions": {
///      "description": "The extensions information.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetVMExtensionsSummary"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "orchestrationServices": {
///      "description": "The orchestration services information.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/OrchestrationServiceSummary"
///      },
///      "x-ms-identifiers": [
///        "serviceName"
///      ]
///    },
///    "statuses": {
///      "description": "The resource status information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    },
///    "virtualMachine": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetInstanceViewStatusesSummary"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetInstanceView {
    ///The extensions information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extensions: ::std::vec::Vec<VirtualMachineScaleSetVmExtensionsSummary>,
    ///The orchestration services information.
    #[serde(
        rename = "orchestrationServices",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub orchestration_services: ::std::vec::Vec<OrchestrationServiceSummary>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
    #[serde(
        rename = "virtualMachine",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machine: ::std::option::Option<
        VirtualMachineScaleSetInstanceViewStatusesSummary,
    >,
}
impl ::std::convert::From<&VirtualMachineScaleSetInstanceView>
for VirtualMachineScaleSetInstanceView {
    fn from(value: &VirtualMachineScaleSetInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetInstanceView {
    fn default() -> Self {
        Self {
            extensions: Default::default(),
            orchestration_services: Default::default(),
            statuses: Default::default(),
            virtual_machine: Default::default(),
        }
    }
}
///Instance view statuses summary for virtual machines of a virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Instance view statuses summary for virtual machines of a virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "statusesSummary": {
///      "description": "The extensions information.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineStatusCodeCount"
///      },
///      "x-ms-identifiers": []
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetInstanceViewStatusesSummary {
    ///The extensions information.
    #[serde(
        rename = "statusesSummary",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses_summary: ::std::vec::Vec<VirtualMachineStatusCodeCount>,
}
impl ::std::convert::From<&VirtualMachineScaleSetInstanceViewStatusesSummary>
for VirtualMachineScaleSetInstanceViewStatusesSummary {
    fn from(value: &VirtualMachineScaleSetInstanceViewStatusesSummary) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetInstanceViewStatusesSummary {
    fn default() -> Self {
        Self {
            statuses_summary: Default::default(),
        }
    }
}
///Describes a virtual machine scale set network profile's IP configuration.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set network profile's IP configuration.",
///  "type": "object",
///  "required": [
///    "name"
///  ],
///  "properties": {
///    "name": {
///      "description": "The IP configuration name.",
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetIPConfigurationProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetIpConfiguration {
    ///The IP configuration name.
    pub name: ::std::string::String,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<
        VirtualMachineScaleSetIpConfigurationProperties,
    >,
}
impl ::std::convert::From<&VirtualMachineScaleSetIpConfiguration>
for VirtualMachineScaleSetIpConfiguration {
    fn from(value: &VirtualMachineScaleSetIpConfiguration) -> Self {
        value.clone()
    }
}
///Describes a virtual machine scale set network profile's IP configuration properties.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set network profile's IP configuration properties.",
///  "type": "object",
///  "properties": {
///    "applicationGatewayBackendAddressPools": {
///      "description": "Specifies an array of references to backend address pools of application gateways. A scale set can reference backend address pools of multiple application gateways. Multiple scale sets cannot use the same application gateway.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    },
///    "applicationSecurityGroups": {
///      "description": "Specifies an array of references to application security group.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    },
///    "loadBalancerBackendAddressPools": {
///      "description": "Specifies an array of references to backend address pools of load balancers. A scale set can reference backend address pools of one public and one internal load balancer. Multiple scale sets cannot use the same basic sku load balancer.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    },
///    "loadBalancerInboundNatPools": {
///      "description": "Specifies an array of references to inbound Nat pools of the load balancers. A scale set can reference inbound nat pools of one public and one internal load balancer. Multiple scale sets cannot use the same basic sku load balancer.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    },
///    "primary": {
///      "description": "Specifies the primary network interface in case the virtual machine has more than 1 network interface.",
///      "type": "boolean"
///    },
///    "privateIPAddressVersion": {
///      "$ref": "#/components/schemas/IPVersion"
///    },
///    "publicIPAddressConfiguration": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetPublicIPAddressConfiguration"
///    },
///    "subnet": {
///      "$ref": "#/components/schemas/ApiEntityReference"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetIpConfigurationProperties {
    ///Specifies an array of references to backend address pools of application gateways. A scale set can reference backend address pools of multiple application gateways. Multiple scale sets cannot use the same application gateway.
    #[serde(
        rename = "applicationGatewayBackendAddressPools",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub application_gateway_backend_address_pools: ::std::vec::Vec<SubResource>,
    ///Specifies an array of references to application security group.
    #[serde(
        rename = "applicationSecurityGroups",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub application_security_groups: ::std::vec::Vec<SubResource>,
    ///Specifies an array of references to backend address pools of load balancers. A scale set can reference backend address pools of one public and one internal load balancer. Multiple scale sets cannot use the same basic sku load balancer.
    #[serde(
        rename = "loadBalancerBackendAddressPools",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub load_balancer_backend_address_pools: ::std::vec::Vec<SubResource>,
    ///Specifies an array of references to inbound Nat pools of the load balancers. A scale set can reference inbound nat pools of one public and one internal load balancer. Multiple scale sets cannot use the same basic sku load balancer.
    #[serde(
        rename = "loadBalancerInboundNatPools",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub load_balancer_inbound_nat_pools: ::std::vec::Vec<SubResource>,
    ///Specifies the primary network interface in case the virtual machine has more than 1 network interface.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub primary: ::std::option::Option<bool>,
    #[serde(
        rename = "privateIPAddressVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub private_ip_address_version: ::std::option::Option<IpVersion>,
    #[serde(
        rename = "publicIPAddressConfiguration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub public_ip_address_configuration: ::std::option::Option<
        VirtualMachineScaleSetPublicIpAddressConfiguration,
    >,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub subnet: ::std::option::Option<ApiEntityReference>,
}
impl ::std::convert::From<&VirtualMachineScaleSetIpConfigurationProperties>
for VirtualMachineScaleSetIpConfigurationProperties {
    fn from(value: &VirtualMachineScaleSetIpConfigurationProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetIpConfigurationProperties {
    fn default() -> Self {
        Self {
            application_gateway_backend_address_pools: Default::default(),
            application_security_groups: Default::default(),
            load_balancer_backend_address_pools: Default::default(),
            load_balancer_inbound_nat_pools: Default::default(),
            primary: Default::default(),
            private_ip_address_version: Default::default(),
            public_ip_address_configuration: Default::default(),
            subnet: Default::default(),
        }
    }
}
///Contains the IP tag associated with the public IP address.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Contains the IP tag associated with the public IP address.",
///  "type": "object",
///  "properties": {
///    "ipTagType": {
///      "description": "IP tag type. Example: FirstPartyUsage.",
///      "type": "string"
///    },
///    "tag": {
///      "description": "IP tag associated with the public IP. Example: SQL, Storage etc.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetIpTag {
    ///IP tag type. Example: FirstPartyUsage.
    #[serde(
        rename = "ipTagType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub ip_tag_type: ::std::option::Option<::std::string::String>,
    ///IP tag associated with the public IP. Example: SQL, Storage etc.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tag: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetIpTag> for VirtualMachineScaleSetIpTag {
    fn from(value: &VirtualMachineScaleSetIpTag) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetIpTag {
    fn default() -> Self {
        Self {
            ip_tag_type: Default::default(),
            tag: Default::default(),
        }
    }
}
///List of Virtual Machine Scale Set OS Upgrade History operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "List of Virtual Machine Scale Set OS Upgrade History operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The uri to fetch the next page of OS Upgrade History. Call ListNext() with this to fetch the next page of history of upgrades.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of OS upgrades performed on the virtual machine scale set.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/UpgradeOperationHistoricalStatusInfo"
///      },
///      "x-ms-identifiers": [
///        "location",
///        "type"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetListOsUpgradeHistory {
    ///The uri to fetch the next page of OS Upgrade History. Call ListNext() with this to fetch the next page of history of upgrades.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of OS upgrades performed on the virtual machine scale set.
    pub value: ::std::vec::Vec<UpgradeOperationHistoricalStatusInfo>,
}
impl ::std::convert::From<&VirtualMachineScaleSetListOsUpgradeHistory>
for VirtualMachineScaleSetListOsUpgradeHistory {
    fn from(value: &VirtualMachineScaleSetListOsUpgradeHistory) -> Self {
        value.clone()
    }
}
///The List Virtual Machine operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Virtual Machine operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The uri to fetch the next page of Virtual Machine Scale Sets. Call ListNext() with this to fetch the next page of VMSS.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of virtual machine scale sets.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSet"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetListResult {
    ///The uri to fetch the next page of Virtual Machine Scale Sets. Call ListNext() with this to fetch the next page of VMSS.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of virtual machine scale sets.
    pub value: ::std::vec::Vec<VirtualMachineScaleSet>,
}
impl ::std::convert::From<&VirtualMachineScaleSetListResult>
for VirtualMachineScaleSetListResult {
    fn from(value: &VirtualMachineScaleSetListResult) -> Self {
        value.clone()
    }
}
///The Virtual Machine Scale Set List Skus operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The Virtual Machine Scale Set List Skus operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The uri to fetch the next page of Virtual Machine Scale Set Skus. Call ListNext() with this to fetch the next page of VMSS Skus.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of skus available for the virtual machine scale set.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetSku"
///      },
///      "x-ms-identifiers": [
///        "resourceType",
///        "sku/name"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetListSkusResult {
    ///The uri to fetch the next page of Virtual Machine Scale Set Skus. Call ListNext() with this to fetch the next page of VMSS Skus.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of skus available for the virtual machine scale set.
    pub value: ::std::vec::Vec<VirtualMachineScaleSetSku>,
}
impl ::std::convert::From<&VirtualMachineScaleSetListSkusResult>
for VirtualMachineScaleSetListSkusResult {
    fn from(value: &VirtualMachineScaleSetListSkusResult) -> Self {
        value.clone()
    }
}
///The List Virtual Machine operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Virtual Machine operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The uri to fetch the next page of Virtual Machine Scale Sets. Call ListNext() with this to fetch the next page of Virtual Machine Scale Sets.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of virtual machine scale sets.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSet"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetListWithLinkResult {
    ///The uri to fetch the next page of Virtual Machine Scale Sets. Call ListNext() with this to fetch the next page of Virtual Machine Scale Sets.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of virtual machine scale sets.
    pub value: ::std::vec::Vec<VirtualMachineScaleSet>,
}
impl ::std::convert::From<&VirtualMachineScaleSetListWithLinkResult>
for VirtualMachineScaleSetListWithLinkResult {
    fn from(value: &VirtualMachineScaleSetListWithLinkResult) -> Self {
        value.clone()
    }
}
///Describes the parameters of a ScaleSet managed disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the parameters of a ScaleSet managed disk.",
///  "type": "object",
///  "properties": {
///    "diskEncryptionSet": {
///      "$ref": "#/components/schemas/DiskEncryptionSetParameters"
///    },
///    "securityProfile": {
///      "$ref": "#/components/schemas/VMDiskSecurityProfile"
///    },
///    "storageAccountType": {
///      "$ref": "#/components/schemas/StorageAccountTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetManagedDiskParameters {
    #[serde(
        rename = "diskEncryptionSet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_encryption_set: ::std::option::Option<DiskEncryptionSetParameters>,
    #[serde(
        rename = "securityProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub security_profile: ::std::option::Option<VmDiskSecurityProfile>,
    #[serde(
        rename = "storageAccountType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_account_type: ::std::option::Option<StorageAccountTypes>,
}
impl ::std::convert::From<&VirtualMachineScaleSetManagedDiskParameters>
for VirtualMachineScaleSetManagedDiskParameters {
    fn from(value: &VirtualMachineScaleSetManagedDiskParameters) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetManagedDiskParameters {
    fn default() -> Self {
        Self {
            disk_encryption_set: Default::default(),
            security_profile: Default::default(),
            storage_account_type: Default::default(),
        }
    }
}
///Describes the Availability Set properties related to migration to Flexible Virtual Machine Scale Set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the Availability Set properties related to migration to Flexible Virtual Machine Scale Set.",
///  "type": "object",
///  "properties": {
///    "defaultVirtualMachineScaleSetInfo": {
///      "$ref": "#/components/schemas/DefaultVirtualMachineScaleSetInfo"
///    },
///    "migrateToVirtualMachineScaleSet": {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetMigrationInfo {
    #[serde(
        rename = "defaultVirtualMachineScaleSetInfo",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub default_virtual_machine_scale_set_info: ::std::option::Option<
        DefaultVirtualMachineScaleSetInfo,
    >,
    #[serde(
        rename = "migrateToVirtualMachineScaleSet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub migrate_to_virtual_machine_scale_set: ::std::option::Option<SubResource>,
}
impl ::std::convert::From<&VirtualMachineScaleSetMigrationInfo>
for VirtualMachineScaleSetMigrationInfo {
    fn from(value: &VirtualMachineScaleSetMigrationInfo) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetMigrationInfo {
    fn default() -> Self {
        Self {
            default_virtual_machine_scale_set_info: Default::default(),
            migrate_to_virtual_machine_scale_set: Default::default(),
        }
    }
}
///Describes a virtual machine scale set network profile's network configurations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set network profile's network configurations.",
///  "type": "object",
///  "required": [
///    "name"
///  ],
///  "properties": {
///    "name": {
///      "description": "The network configuration name.",
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetNetworkConfigurationProperties"
///    },
///    "tags": {
///      "description": "Resource tags applied to the networkInterface address created by this NetworkInterfaceConfiguration",
///      "type": "object",
///      "additionalProperties": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetNetworkConfiguration {
    ///The network configuration name.
    pub name: ::std::string::String,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<
        VirtualMachineScaleSetNetworkConfigurationProperties,
    >,
    ///Resource tags applied to the networkInterface address created by this NetworkInterfaceConfiguration
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetNetworkConfiguration>
for VirtualMachineScaleSetNetworkConfiguration {
    fn from(value: &VirtualMachineScaleSetNetworkConfiguration) -> Self {
        value.clone()
    }
}
///Describes a virtual machines scale sets network configuration's DNS settings.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machines scale sets network configuration's DNS settings.",
///  "type": "object",
///  "properties": {
///    "dnsServers": {
///      "description": "List of DNS servers IP addresses",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetNetworkConfigurationDnsSettings {
    ///List of DNS servers IP addresses
    #[serde(
        rename = "dnsServers",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub dns_servers: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetNetworkConfigurationDnsSettings>
for VirtualMachineScaleSetNetworkConfigurationDnsSettings {
    fn from(value: &VirtualMachineScaleSetNetworkConfigurationDnsSettings) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetNetworkConfigurationDnsSettings {
    fn default() -> Self {
        Self {
            dns_servers: Default::default(),
        }
    }
}
///Describes a virtual machine scale set network profile's IP configuration.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set network profile's IP configuration.",
///  "type": "object",
///  "required": [
///    "ipConfigurations"
///  ],
///  "properties": {
///    "auxiliaryMode": {
///      "$ref": "#/components/schemas/NetworkInterfaceAuxiliaryMode"
///    },
///    "auxiliarySku": {
///      "$ref": "#/components/schemas/NetworkInterfaceAuxiliarySku"
///    },
///    "deleteOption": {
///      "$ref": "#/components/schemas/DeleteOptions"
///    },
///    "disableTcpStateTracking": {
///      "description": "Specifies whether the network interface is disabled for tcp state tracking.",
///      "type": "boolean"
///    },
///    "dnsSettings": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetNetworkConfigurationDnsSettings"
///    },
///    "enableAcceleratedNetworking": {
///      "description": "Specifies whether the network interface is accelerated networking-enabled.",
///      "type": "boolean"
///    },
///    "enableFpga": {
///      "description": "Specifies whether the network interface is FPGA networking-enabled.",
///      "type": "boolean"
///    },
///    "enableIPForwarding": {
///      "description": "Whether IP forwarding enabled on this NIC.",
///      "type": "boolean"
///    },
///    "ipConfigurations": {
///      "description": "Specifies the IP configurations of the network interface.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetIPConfiguration"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "networkSecurityGroup": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "primary": {
///      "description": "Specifies the primary network interface in case the virtual machine has more than 1 network interface.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetNetworkConfigurationProperties {
    #[serde(
        rename = "auxiliaryMode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub auxiliary_mode: ::std::option::Option<NetworkInterfaceAuxiliaryMode>,
    #[serde(
        rename = "auxiliarySku",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub auxiliary_sku: ::std::option::Option<NetworkInterfaceAuxiliarySku>,
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DeleteOptions>,
    ///Specifies whether the network interface is disabled for tcp state tracking.
    #[serde(
        rename = "disableTcpStateTracking",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disable_tcp_state_tracking: ::std::option::Option<bool>,
    #[serde(
        rename = "dnsSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub dns_settings: ::std::option::Option<
        VirtualMachineScaleSetNetworkConfigurationDnsSettings,
    >,
    ///Specifies whether the network interface is accelerated networking-enabled.
    #[serde(
        rename = "enableAcceleratedNetworking",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_accelerated_networking: ::std::option::Option<bool>,
    ///Specifies whether the network interface is FPGA networking-enabled.
    #[serde(
        rename = "enableFpga",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_fpga: ::std::option::Option<bool>,
    ///Whether IP forwarding enabled on this NIC.
    #[serde(
        rename = "enableIPForwarding",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_ip_forwarding: ::std::option::Option<bool>,
    ///Specifies the IP configurations of the network interface.
    #[serde(rename = "ipConfigurations")]
    pub ip_configurations: ::std::vec::Vec<VirtualMachineScaleSetIpConfiguration>,
    #[serde(
        rename = "networkSecurityGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_security_group: ::std::option::Option<SubResource>,
    ///Specifies the primary network interface in case the virtual machine has more than 1 network interface.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub primary: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineScaleSetNetworkConfigurationProperties>
for VirtualMachineScaleSetNetworkConfigurationProperties {
    fn from(value: &VirtualMachineScaleSetNetworkConfigurationProperties) -> Self {
        value.clone()
    }
}
///Describes a virtual machine scale set network profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set network profile.",
///  "type": "object",
///  "properties": {
///    "healthProbe": {
///      "$ref": "#/components/schemas/ApiEntityReference"
///    },
///    "networkApiVersion": {
///      "$ref": "#/components/schemas/NetworkApiVersion"
///    },
///    "networkInterfaceConfigurations": {
///      "description": "The list of network configurations.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetNetworkConfiguration"
///      },
///      "x-ms-identifiers": []
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetNetworkProfile {
    #[serde(
        rename = "healthProbe",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub health_probe: ::std::option::Option<ApiEntityReference>,
    #[serde(
        rename = "networkApiVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_api_version: ::std::option::Option<NetworkApiVersion>,
    ///The list of network configurations.
    #[serde(
        rename = "networkInterfaceConfigurations",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_interface_configurations: ::std::vec::Vec<
        VirtualMachineScaleSetNetworkConfiguration,
    >,
}
impl ::std::convert::From<&VirtualMachineScaleSetNetworkProfile>
for VirtualMachineScaleSetNetworkProfile {
    fn from(value: &VirtualMachineScaleSetNetworkProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetNetworkProfile {
    fn default() -> Self {
        Self {
            health_probe: Default::default(),
            network_api_version: Default::default(),
            network_interface_configurations: Default::default(),
        }
    }
}
///Describes a virtual machine scale set operating system disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set operating system disk.",
///  "type": "object",
///  "required": [
///    "createOption"
///  ],
///  "properties": {
///    "caching": {
///      "$ref": "#/components/schemas/CachingTypes"
///    },
///    "createOption": {
///      "$ref": "#/components/schemas/DiskCreateOptionTypes"
///    },
///    "deleteOption": {
///      "$ref": "#/components/schemas/DiskDeleteOptionTypes"
///    },
///    "diffDiskSettings": {
///      "$ref": "#/components/schemas/DiffDiskSettings"
///    },
///    "diskSizeGB": {
///      "description": "Specifies the size of an empty data disk in gigabytes. This element can be used to overwrite the size of the disk in a virtual machine image. The property 'diskSizeGB' is the number of bytes x 1024^3 for the disk and the value cannot be larger than 1023.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "image": {
///      "$ref": "#/components/schemas/VirtualHardDisk"
///    },
///    "managedDisk": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetManagedDiskParameters"
///    },
///    "name": {
///      "description": "The disk name.",
///      "type": "string"
///    },
///    "osType": {
///      "$ref": "#/components/schemas/OperatingSystemTypes"
///    },
///    "vhdContainers": {
///      "description": "Specifies the container urls that are used to store operating system disks for the scale set.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "writeAcceleratorEnabled": {
///      "description": "Specifies whether writeAccelerator should be enabled or disabled on the disk.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetOsDisk {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub caching: ::std::option::Option<CachingTypes>,
    #[serde(rename = "createOption")]
    pub create_option: DiskCreateOptionTypes,
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DiskDeleteOptionTypes>,
    #[serde(
        rename = "diffDiskSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub diff_disk_settings: ::std::option::Option<DiffDiskSettings>,
    ///Specifies the size of an empty data disk in gigabytes. This element can be used to overwrite the size of the disk in a virtual machine image. The property 'diskSizeGB' is the number of bytes x 1024^3 for the disk and the value cannot be larger than 1023.
    #[serde(
        rename = "diskSizeGB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_size_gb: ::std::option::Option<i32>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub image: ::std::option::Option<VirtualHardDisk>,
    #[serde(
        rename = "managedDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub managed_disk: ::std::option::Option<VirtualMachineScaleSetManagedDiskParameters>,
    ///The disk name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "osType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_type: ::std::option::Option<OperatingSystemTypes>,
    ///Specifies the container urls that are used to store operating system disks for the scale set.
    #[serde(
        rename = "vhdContainers",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vhd_containers: ::std::vec::Vec<::std::string::String>,
    ///Specifies whether writeAccelerator should be enabled or disabled on the disk.
    #[serde(
        rename = "writeAcceleratorEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub write_accelerator_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineScaleSetOsDisk>
for VirtualMachineScaleSetOsDisk {
    fn from(value: &VirtualMachineScaleSetOsDisk) -> Self {
        value.clone()
    }
}
///Describes a virtual machine scale set OS profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set OS profile.",
///  "type": "object",
///  "properties": {
///    "adminPassword": {
///      "description": "Specifies the password of the administrator account. <br><br> **Minimum-length (Windows):** 8 characters <br><br> **Minimum-length (Linux):** 6 characters <br><br> **Max-length (Windows):** 123 characters <br><br> **Max-length (Linux):** 72 characters <br><br> **Complexity requirements:** 3 out of 4 conditions below need to be fulfilled <br> Has lower characters <br>Has upper characters <br> Has a digit <br> Has a special character (Regex match [\\W_]) <br><br> **Disallowed values:** \"abc@123\", \"P@$$w0rd\", \"P@ssw0rd\", \"P@ssword123\", \"Pa$$word\", \"pass@word1\", \"Password!\", \"Password1\", \"Password22\", \"iloveyou!\" <br><br> For resetting the password, see [How to reset the Remote Desktop service or its login password in a Windows VM](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/reset-rdp) <br><br> For resetting root password, see [Manage users, SSH, and check or repair disks on Azure Linux VMs using the VMAccess Extension](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/troubleshoot-ssh-connection)",
///      "type": "string",
///      "format": "password",
///      "x-ms-secret": true
///    },
///    "adminUsername": {
///      "description": "Specifies the name of the administrator account. <br><br> **Windows-only restriction:** Cannot end in \".\" <br><br> **Disallowed values:** \"administrator\", \"admin\", \"user\", \"user1\", \"test\", \"user2\", \"test1\", \"user3\", \"admin1\", \"1\", \"123\", \"a\", \"actuser\", \"adm\", \"admin2\", \"aspnet\", \"backup\", \"console\", \"david\", \"guest\", \"john\", \"owner\", \"root\", \"server\", \"sql\", \"support\", \"support_388945a0\", \"sys\", \"test2\", \"test3\", \"user4\", \"user5\". <br><br> **Minimum-length (Linux):** 1  character <br><br> **Max-length (Linux):** 64 characters <br><br> **Max-length (Windows):** 20 characters",
///      "type": "string"
///    },
///    "allowExtensionOperations": {
///      "description": "Specifies whether extension operations should be allowed on the virtual machine scale set. This may only be set to False when no extensions are present on the virtual machine scale set.",
///      "type": "boolean"
///    },
///    "computerNamePrefix": {
///      "description": "Specifies the computer name prefix for all of the virtual machines in the scale set. Computer name prefixes must be 1 to 15 characters long.",
///      "type": "string"
///    },
///    "customData": {
///      "description": "Specifies a base-64 encoded string of custom data. The base-64 encoded string is decoded to a binary array that is saved as a file on the Virtual Machine. The maximum length of the binary array is 65535 bytes. For using cloud-init for your VM, see [Using cloud-init to customize a Linux VM during creation](https://docs.microsoft.com/azure/virtual-machines/linux/using-cloud-init)",
///      "type": "string"
///    },
///    "linuxConfiguration": {
///      "$ref": "#/components/schemas/LinuxConfiguration"
///    },
///    "requireGuestProvisionSignal": {
///      "description": "Optional property which must either be set to True or omitted.",
///      "type": "boolean"
///    },
///    "secrets": {
///      "description": "Specifies set of certificates that should be installed onto the virtual machines in the scale set. To install certificates on a virtual machine it is recommended to use the [Azure Key Vault virtual machine extension for Linux](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-linux) or the [Azure Key Vault virtual machine extension for Windows](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-windows).",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VaultSecretGroup"
///      },
///      "x-ms-identifiers": [
///        "sourceVault/id"
///      ]
///    },
///    "windowsConfiguration": {
///      "$ref": "#/components/schemas/WindowsConfiguration"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetOsProfile {
    ///Specifies the password of the administrator account. <br><br> **Minimum-length (Windows):** 8 characters <br><br> **Minimum-length (Linux):** 6 characters <br><br> **Max-length (Windows):** 123 characters <br><br> **Max-length (Linux):** 72 characters <br><br> **Complexity requirements:** 3 out of 4 conditions below need to be fulfilled <br> Has lower characters <br>Has upper characters <br> Has a digit <br> Has a special character (Regex match [\W_]) <br><br> **Disallowed values:** "abc@123", "P@$$w0rd", "P@ssw0rd", "P@ssword123", "Pa$$word", "pass@word1", "Password!", "Password1", "Password22", "iloveyou!" <br><br> For resetting the password, see [How to reset the Remote Desktop service or its login password in a Windows VM](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/reset-rdp) <br><br> For resetting root password, see [Manage users, SSH, and check or repair disks on Azure Linux VMs using the VMAccess Extension](https://docs.microsoft.com/troubleshoot/azure/virtual-machines/troubleshoot-ssh-connection)
    #[serde(
        rename = "adminPassword",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub admin_password: ::std::option::Option<::std::string::String>,
    ///Specifies the name of the administrator account. <br><br> **Windows-only restriction:** Cannot end in "." <br><br> **Disallowed values:** "administrator", "admin", "user", "user1", "test", "user2", "test1", "user3", "admin1", "1", "123", "a", "actuser", "adm", "admin2", "aspnet", "backup", "console", "david", "guest", "john", "owner", "root", "server", "sql", "support", "support_388945a0", "sys", "test2", "test3", "user4", "user5". <br><br> **Minimum-length (Linux):** 1  character <br><br> **Max-length (Linux):** 64 characters <br><br> **Max-length (Windows):** 20 characters
    #[serde(
        rename = "adminUsername",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub admin_username: ::std::option::Option<::std::string::String>,
    ///Specifies whether extension operations should be allowed on the virtual machine scale set. This may only be set to False when no extensions are present on the virtual machine scale set.
    #[serde(
        rename = "allowExtensionOperations",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub allow_extension_operations: ::std::option::Option<bool>,
    ///Specifies the computer name prefix for all of the virtual machines in the scale set. Computer name prefixes must be 1 to 15 characters long.
    #[serde(
        rename = "computerNamePrefix",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub computer_name_prefix: ::std::option::Option<::std::string::String>,
    ///Specifies a base-64 encoded string of custom data. The base-64 encoded string is decoded to a binary array that is saved as a file on the Virtual Machine. The maximum length of the binary array is 65535 bytes. For using cloud-init for your VM, see [Using cloud-init to customize a Linux VM during creation](https://docs.microsoft.com/azure/virtual-machines/linux/using-cloud-init)
    #[serde(
        rename = "customData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub custom_data: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "linuxConfiguration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub linux_configuration: ::std::option::Option<LinuxConfiguration>,
    ///Optional property which must either be set to True or omitted.
    #[serde(
        rename = "requireGuestProvisionSignal",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub require_guest_provision_signal: ::std::option::Option<bool>,
    ///Specifies set of certificates that should be installed onto the virtual machines in the scale set. To install certificates on a virtual machine it is recommended to use the [Azure Key Vault virtual machine extension for Linux](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-linux) or the [Azure Key Vault virtual machine extension for Windows](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-windows).
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub secrets: ::std::vec::Vec<VaultSecretGroup>,
    #[serde(
        rename = "windowsConfiguration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub windows_configuration: ::std::option::Option<WindowsConfiguration>,
}
impl ::std::convert::From<&VirtualMachineScaleSetOsProfile>
for VirtualMachineScaleSetOsProfile {
    fn from(value: &VirtualMachineScaleSetOsProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetOsProfile {
    fn default() -> Self {
        Self {
            admin_password: Default::default(),
            admin_username: Default::default(),
            allow_extension_operations: Default::default(),
            computer_name_prefix: Default::default(),
            custom_data: Default::default(),
            linux_configuration: Default::default(),
            require_guest_provision_signal: Default::default(),
            secrets: Default::default(),
            windows_configuration: Default::default(),
        }
    }
}
///Describes the properties of a Virtual Machine Scale Set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Virtual Machine Scale Set.",
///  "type": "object",
///  "properties": {
///    "additionalCapabilities": {
///      "$ref": "#/components/schemas/AdditionalCapabilities"
///    },
///    "automaticRepairsPolicy": {
///      "$ref": "#/components/schemas/AutomaticRepairsPolicy"
///    },
///    "constrainedMaximumCapacity": {
///      "description": "Optional property which must either be set to True or omitted.",
///      "type": "boolean"
///    },
///    "doNotRunExtensionsOnOverprovisionedVMs": {
///      "description": "When Overprovision is enabled, extensions are launched only on the requested number of VMs which are finally kept. This property will hence ensure that the extensions do not run on the extra overprovisioned VMs.",
///      "type": "boolean"
///    },
///    "highSpeedInterconnectPlacement": {
///      "$ref": "#/components/schemas/HighSpeedInterconnectPlacement"
///    },
///    "hostGroup": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "orchestrationMode": {
///      "$ref": "#/components/schemas/OrchestrationMode"
///    },
///    "overprovision": {
///      "description": "Specifies whether the Virtual Machine Scale Set should be overprovisioned.",
///      "type": "boolean"
///    },
///    "platformFaultDomainCount": {
///      "description": "Fault Domain count for each placement group.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "priorityMixPolicy": {
///      "$ref": "#/components/schemas/PriorityMixPolicy"
///    },
///    "provisioningState": {
///      "description": "The provisioning state, which only appears in the response.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "proximityPlacementGroup": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "resiliencyPolicy": {
///      "$ref": "#/components/schemas/ResiliencyPolicy"
///    },
///    "scaleInPolicy": {
///      "$ref": "#/components/schemas/ScaleInPolicy"
///    },
///    "scheduledEventsPolicy": {
///      "$ref": "#/components/schemas/ScheduledEventsPolicy"
///    },
///    "singlePlacementGroup": {
///      "description": "When true this limits the scale set to a single placement group, of max size 100 virtual machines. NOTE: If singlePlacementGroup is true, it may be modified to false. However, if singlePlacementGroup is false, it may not be modified to true.",
///      "type": "boolean"
///    },
///    "skuProfile": {
///      "$ref": "#/components/schemas/SkuProfile"
///    },
///    "spotRestorePolicy": {
///      "$ref": "#/components/schemas/SpotRestorePolicy"
///    },
///    "timeCreated": {
///      "description": "Specifies the time at which the Virtual Machine Scale Set resource was created. Minimum api-version: 2021-11-01.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "uniqueId": {
///      "description": "Specifies the ID which uniquely identifies a Virtual Machine Scale Set.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "upgradePolicy": {
///      "$ref": "#/components/schemas/UpgradePolicy"
///    },
///    "virtualMachineProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetVMProfile"
///    },
///    "zonalPlatformFaultDomainAlignMode": {
///      "$ref": "#/components/schemas/ZonalPlatformFaultDomainAlignMode"
///    },
///    "zoneBalance": {
///      "description": "Whether to force strictly even Virtual Machine distribution cross x-zones in case there is zone outage. zoneBalance property can only be set if the zones property of the scale set contains more than one zone. If there are no zones or only one zone specified, then zoneBalance property should not be set.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetProperties {
    #[serde(
        rename = "additionalCapabilities",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub additional_capabilities: ::std::option::Option<AdditionalCapabilities>,
    #[serde(
        rename = "automaticRepairsPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub automatic_repairs_policy: ::std::option::Option<AutomaticRepairsPolicy>,
    ///Optional property which must either be set to True or omitted.
    #[serde(
        rename = "constrainedMaximumCapacity",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub constrained_maximum_capacity: ::std::option::Option<bool>,
    ///When Overprovision is enabled, extensions are launched only on the requested number of VMs which are finally kept. This property will hence ensure that the extensions do not run on the extra overprovisioned VMs.
    #[serde(
        rename = "doNotRunExtensionsOnOverprovisionedVMs",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub do_not_run_extensions_on_overprovisioned_v_ms: ::std::option::Option<bool>,
    #[serde(
        rename = "highSpeedInterconnectPlacement",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub high_speed_interconnect_placement: ::std::option::Option<
        HighSpeedInterconnectPlacement,
    >,
    #[serde(
        rename = "hostGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub host_group: ::std::option::Option<SubResource>,
    #[serde(
        rename = "orchestrationMode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub orchestration_mode: ::std::option::Option<OrchestrationMode>,
    ///Specifies whether the Virtual Machine Scale Set should be overprovisioned.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub overprovision: ::std::option::Option<bool>,
    ///Fault Domain count for each placement group.
    #[serde(
        rename = "platformFaultDomainCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub platform_fault_domain_count: ::std::option::Option<i32>,
    #[serde(
        rename = "priorityMixPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub priority_mix_policy: ::std::option::Option<PriorityMixPolicy>,
    ///The provisioning state, which only appears in the response.
    #[serde(
        rename = "provisioningState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_state: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "proximityPlacementGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub proximity_placement_group: ::std::option::Option<SubResource>,
    #[serde(
        rename = "resiliencyPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub resiliency_policy: ::std::option::Option<ResiliencyPolicy>,
    #[serde(
        rename = "scaleInPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scale_in_policy: ::std::option::Option<ScaleInPolicy>,
    #[serde(
        rename = "scheduledEventsPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scheduled_events_policy: ::std::option::Option<ScheduledEventsPolicy>,
    ///When true this limits the scale set to a single placement group, of max size 100 virtual machines. NOTE: If singlePlacementGroup is true, it may be modified to false. However, if singlePlacementGroup is false, it may not be modified to true.
    #[serde(
        rename = "singlePlacementGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub single_placement_group: ::std::option::Option<bool>,
    #[serde(
        rename = "skuProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku_profile: ::std::option::Option<SkuProfile>,
    #[serde(
        rename = "spotRestorePolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub spot_restore_policy: ::std::option::Option<SpotRestorePolicy>,
    ///Specifies the time at which the Virtual Machine Scale Set resource was created. Minimum api-version: 2021-11-01.
    #[serde(
        rename = "timeCreated",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub time_created: ::std::option::Option<::std::string::String>,
    ///Specifies the ID which uniquely identifies a Virtual Machine Scale Set.
    #[serde(
        rename = "uniqueId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub unique_id: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "upgradePolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub upgrade_policy: ::std::option::Option<UpgradePolicy>,
    #[serde(
        rename = "virtualMachineProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machine_profile: ::std::option::Option<VirtualMachineScaleSetVmProfile>,
    #[serde(
        rename = "zonalPlatformFaultDomainAlignMode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zonal_platform_fault_domain_align_mode: ::std::option::Option<
        ZonalPlatformFaultDomainAlignMode,
    >,
    ///Whether to force strictly even Virtual Machine distribution cross x-zones in case there is zone outage. zoneBalance property can only be set if the zones property of the scale set contains more than one zone. If there are no zones or only one zone specified, then zoneBalance property should not be set.
    #[serde(
        rename = "zoneBalance",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zone_balance: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineScaleSetProperties>
for VirtualMachineScaleSetProperties {
    fn from(value: &VirtualMachineScaleSetProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetProperties {
    fn default() -> Self {
        Self {
            additional_capabilities: Default::default(),
            automatic_repairs_policy: Default::default(),
            constrained_maximum_capacity: Default::default(),
            do_not_run_extensions_on_overprovisioned_v_ms: Default::default(),
            high_speed_interconnect_placement: Default::default(),
            host_group: Default::default(),
            orchestration_mode: Default::default(),
            overprovision: Default::default(),
            platform_fault_domain_count: Default::default(),
            priority_mix_policy: Default::default(),
            provisioning_state: Default::default(),
            proximity_placement_group: Default::default(),
            resiliency_policy: Default::default(),
            scale_in_policy: Default::default(),
            scheduled_events_policy: Default::default(),
            single_placement_group: Default::default(),
            sku_profile: Default::default(),
            spot_restore_policy: Default::default(),
            time_created: Default::default(),
            unique_id: Default::default(),
            upgrade_policy: Default::default(),
            virtual_machine_profile: Default::default(),
            zonal_platform_fault_domain_align_mode: Default::default(),
            zone_balance: Default::default(),
        }
    }
}
///Describes a virtual machines scale set IP Configuration's PublicIPAddress configuration
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machines scale set IP Configuration's PublicIPAddress configuration",
///  "type": "object",
///  "required": [
///    "name"
///  ],
///  "properties": {
///    "name": {
///      "description": "The publicIP address configuration name.",
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetPublicIPAddressConfigurationProperties"
///    },
///    "sku": {
///      "$ref": "#/components/schemas/PublicIPAddressSku"
///    },
///    "tags": {
///      "description": "Resource tags applied to the publicIP address created by this PublicIPAddressConfiguration",
///      "type": "object",
///      "additionalProperties": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetPublicIpAddressConfiguration {
    ///The publicIP address configuration name.
    pub name: ::std::string::String,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<
        VirtualMachineScaleSetPublicIpAddressConfigurationProperties,
    >,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku: ::std::option::Option<PublicIpAddressSku>,
    ///Resource tags applied to the publicIP address created by this PublicIPAddressConfiguration
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetPublicIpAddressConfiguration>
for VirtualMachineScaleSetPublicIpAddressConfiguration {
    fn from(value: &VirtualMachineScaleSetPublicIpAddressConfiguration) -> Self {
        value.clone()
    }
}
///Describes a virtual machines scale sets network configuration's DNS settings.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machines scale sets network configuration's DNS settings.",
///  "type": "object",
///  "required": [
///    "domainNameLabel"
///  ],
///  "properties": {
///    "domainNameLabel": {
///      "description": "The Domain name label.The concatenation of the domain name label and vm index will be the domain name labels of the PublicIPAddress resources that will be created",
///      "type": "string"
///    },
///    "domainNameLabelScope": {
///      "$ref": "#/components/schemas/DomainNameLabelScopeTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetPublicIpAddressConfigurationDnsSettings {
    ///The Domain name label.The concatenation of the domain name label and vm index will be the domain name labels of the PublicIPAddress resources that will be created
    #[serde(rename = "domainNameLabel")]
    pub domain_name_label: ::std::string::String,
    #[serde(
        rename = "domainNameLabelScope",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub domain_name_label_scope: ::std::option::Option<DomainNameLabelScopeTypes>,
}
impl ::std::convert::From<&VirtualMachineScaleSetPublicIpAddressConfigurationDnsSettings>
for VirtualMachineScaleSetPublicIpAddressConfigurationDnsSettings {
    fn from(
        value: &VirtualMachineScaleSetPublicIpAddressConfigurationDnsSettings,
    ) -> Self {
        value.clone()
    }
}
///Describes a virtual machines scale set IP Configuration's PublicIPAddress configuration
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machines scale set IP Configuration's PublicIPAddress configuration",
///  "type": "object",
///  "properties": {
///    "deleteOption": {
///      "$ref": "#/components/schemas/DeleteOptions"
///    },
///    "dnsSettings": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetPublicIPAddressConfigurationDnsSettings"
///    },
///    "idleTimeoutInMinutes": {
///      "description": "The idle timeout of the public IP address.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "ipTags": {
///      "description": "The list of IP tags associated with the public IP address.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetIpTag"
///      },
///      "x-ms-identifiers": []
///    },
///    "publicIPAddressVersion": {
///      "$ref": "#/components/schemas/IPVersion"
///    },
///    "publicIPPrefix": {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetPublicIpAddressConfigurationProperties {
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DeleteOptions>,
    #[serde(
        rename = "dnsSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub dns_settings: ::std::option::Option<
        VirtualMachineScaleSetPublicIpAddressConfigurationDnsSettings,
    >,
    ///The idle timeout of the public IP address.
    #[serde(
        rename = "idleTimeoutInMinutes",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub idle_timeout_in_minutes: ::std::option::Option<i32>,
    ///The list of IP tags associated with the public IP address.
    #[serde(
        rename = "ipTags",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub ip_tags: ::std::vec::Vec<VirtualMachineScaleSetIpTag>,
    #[serde(
        rename = "publicIPAddressVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub public_ip_address_version: ::std::option::Option<IpVersion>,
    #[serde(
        rename = "publicIPPrefix",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub public_ip_prefix: ::std::option::Option<SubResource>,
}
impl ::std::convert::From<&VirtualMachineScaleSetPublicIpAddressConfigurationProperties>
for VirtualMachineScaleSetPublicIpAddressConfigurationProperties {
    fn from(
        value: &VirtualMachineScaleSetPublicIpAddressConfigurationProperties,
    ) -> Self {
        value.clone()
    }
}
impl ::std::default::Default
for VirtualMachineScaleSetPublicIpAddressConfigurationProperties {
    fn default() -> Self {
        Self {
            delete_option: Default::default(),
            dns_settings: Default::default(),
            idle_timeout_in_minutes: Default::default(),
            ip_tags: Default::default(),
            public_ip_address_version: Default::default(),
            public_ip_prefix: Default::default(),
        }
    }
}
///Describes a Virtual Machine Scale Set VM Reimage Parameters.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine Scale Set VM Reimage Parameters.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetVMReimageParameters"
///    }
///  ],
///  "properties": {
///    "instanceIds": {
///      "description": "The virtual machine scale set instance ids. Omitting the virtual machine scale set instance ids will result in the operation being performed on all virtual machines in the virtual machine scale set.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetReimageParameters {
    ///Specifies in decimal number, the version the OS disk should be reimaged to. If exact version is not provided, the OS disk is reimaged to the existing version of OS Disk.
    #[serde(
        rename = "exactVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub exact_version: ::std::option::Option<::std::string::String>,
    ///Parameter to force update ephemeral OS disk for a virtual machine scale set VM
    #[serde(
        rename = "forceUpdateOSDiskForEphemeral",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub force_update_os_disk_for_ephemeral: ::std::option::Option<bool>,
    ///The virtual machine scale set instance ids. Omitting the virtual machine scale set instance ids will result in the operation being performed on all virtual machines in the virtual machine scale set.
    #[serde(
        rename = "instanceIds",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_ids: ::std::vec::Vec<::std::string::String>,
    #[serde(
        rename = "osProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_profile: ::std::option::Option<OsProfileProvisioningData>,
    ///Specifies whether to reimage temp disk. Default value: false. Note: This temp disk reimage parameter is only supported for VM/VMSS with Ephemeral OS disk.
    #[serde(
        rename = "tempDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub temp_disk: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineScaleSetReimageParameters>
for VirtualMachineScaleSetReimageParameters {
    fn from(value: &VirtualMachineScaleSetReimageParameters) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetReimageParameters {
    fn default() -> Self {
        Self {
            exact_version: Default::default(),
            force_update_os_disk_for_ephemeral: Default::default(),
            instance_ids: Default::default(),
            os_profile: Default::default(),
            temp_disk: Default::default(),
        }
    }
}
///`VirtualMachineScaleSetScaleInRules`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "Default",
///    "OldestVM",
///    "NewestVM"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "VirtualMachineScaleSetScaleInRules",
///    "values": [
///      {
///        "name": "Default",
///        "value": "Default"
///      },
///      {
///        "name": "OldestVM",
///        "value": "OldestVM"
///      },
///      {
///        "name": "NewestVM",
///        "value": "NewestVM"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum VirtualMachineScaleSetScaleInRules {
    Default,
    #[serde(rename = "OldestVM")]
    OldestVm,
    #[serde(rename = "NewestVM")]
    NewestVm,
}
impl ::std::convert::From<&Self> for VirtualMachineScaleSetScaleInRules {
    fn from(value: &VirtualMachineScaleSetScaleInRules) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for VirtualMachineScaleSetScaleInRules {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Default => f.write_str("Default"),
            Self::OldestVm => f.write_str("OldestVM"),
            Self::NewestVm => f.write_str("NewestVM"),
        }
    }
}
impl ::std::str::FromStr for VirtualMachineScaleSetScaleInRules {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "default" => Ok(Self::Default),
            "oldestvm" => Ok(Self::OldestVm),
            "newestvm" => Ok(Self::NewestVm),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for VirtualMachineScaleSetScaleInRules {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for VirtualMachineScaleSetScaleInRules {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for VirtualMachineScaleSetScaleInRules {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes an available virtual machine scale set sku.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes an available virtual machine scale set sku.",
///  "type": "object",
///  "properties": {
///    "capacity": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetSkuCapacity"
///    },
///    "resourceType": {
///      "description": "The type of resource the sku applies to.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "sku": {
///      "$ref": "#/components/schemas/Sku"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetSku {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub capacity: ::std::option::Option<VirtualMachineScaleSetSkuCapacity>,
    ///The type of resource the sku applies to.
    #[serde(
        rename = "resourceType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub resource_type: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku: ::std::option::Option<Sku>,
}
impl ::std::convert::From<&VirtualMachineScaleSetSku> for VirtualMachineScaleSetSku {
    fn from(value: &VirtualMachineScaleSetSku) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetSku {
    fn default() -> Self {
        Self {
            capacity: Default::default(),
            resource_type: Default::default(),
            sku: Default::default(),
        }
    }
}
///Describes scaling information of a sku.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes scaling information of a sku.",
///  "type": "object",
///  "properties": {
///    "defaultCapacity": {
///      "description": "The default capacity.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int64"
///    },
///    "maximum": {
///      "description": "The maximum capacity that can be set.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int64"
///    },
///    "minimum": {
///      "description": "The minimum capacity.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int64"
///    },
///    "scaleType": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetSkuScaleType"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetSkuCapacity {
    ///The default capacity.
    #[serde(
        rename = "defaultCapacity",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub default_capacity: ::std::option::Option<i64>,
    ///The maximum capacity that can be set.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub maximum: ::std::option::Option<i64>,
    ///The minimum capacity.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub minimum: ::std::option::Option<i64>,
    #[serde(
        rename = "scaleType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scale_type: ::std::option::Option<VirtualMachineScaleSetSkuScaleType>,
}
impl ::std::convert::From<&VirtualMachineScaleSetSkuCapacity>
for VirtualMachineScaleSetSkuCapacity {
    fn from(value: &VirtualMachineScaleSetSkuCapacity) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetSkuCapacity {
    fn default() -> Self {
        Self {
            default_capacity: Default::default(),
            maximum: Default::default(),
            minimum: Default::default(),
            scale_type: Default::default(),
        }
    }
}
///The scale type applicable to the sku.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The scale type applicable to the sku.",
///  "type": "string",
///  "enum": [
///    "Automatic",
///    "None"
///  ],
///  "x-ms-enum": {
///    "modelAsString": false,
///    "name": "VirtualMachineScaleSetSkuScaleType"
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum VirtualMachineScaleSetSkuScaleType {
    Automatic,
    None,
}
impl ::std::convert::From<&Self> for VirtualMachineScaleSetSkuScaleType {
    fn from(value: &VirtualMachineScaleSetSkuScaleType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for VirtualMachineScaleSetSkuScaleType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Automatic => f.write_str("Automatic"),
            Self::None => f.write_str("None"),
        }
    }
}
impl ::std::str::FromStr for VirtualMachineScaleSetSkuScaleType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "automatic" => Ok(Self::Automatic),
            "none" => Ok(Self::None),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for VirtualMachineScaleSetSkuScaleType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for VirtualMachineScaleSetSkuScaleType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for VirtualMachineScaleSetSkuScaleType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes a virtual machine scale set storage profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set storage profile.",
///  "type": "object",
///  "properties": {
///    "dataDisks": {
///      "description": "Specifies the parameters that are used to add data disks to the virtual machines in the scale set. For more information about disks, see [About disks and VHDs for Azure virtual machines](https://docs.microsoft.com/azure/virtual-machines/managed-disks-overview).",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetDataDisk"
///      },
///      "x-ms-identifiers": [
///        "name",
///        "lun"
///      ]
///    },
///    "diskControllerType": {
///      "$ref": "#/components/schemas/DiskControllerTypes"
///    },
///    "imageReference": {
///      "$ref": "#/components/schemas/ImageReference"
///    },
///    "osDisk": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetOSDisk"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetStorageProfile {
    ///Specifies the parameters that are used to add data disks to the virtual machines in the scale set. For more information about disks, see [About disks and VHDs for Azure virtual machines](https://docs.microsoft.com/azure/virtual-machines/managed-disks-overview).
    #[serde(
        rename = "dataDisks",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub data_disks: ::std::vec::Vec<VirtualMachineScaleSetDataDisk>,
    #[serde(
        rename = "diskControllerType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_controller_type: ::std::option::Option<DiskControllerTypes>,
    #[serde(
        rename = "imageReference",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub image_reference: ::std::option::Option<ImageReference>,
    #[serde(
        rename = "osDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_disk: ::std::option::Option<VirtualMachineScaleSetOsDisk>,
}
impl ::std::convert::From<&VirtualMachineScaleSetStorageProfile>
for VirtualMachineScaleSetStorageProfile {
    fn from(value: &VirtualMachineScaleSetStorageProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetStorageProfile {
    fn default() -> Self {
        Self {
            data_disks: Default::default(),
            disk_controller_type: Default::default(),
            image_reference: Default::default(),
            os_disk: Default::default(),
        }
    }
}
///Describes a Virtual Machine Scale Set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine Scale Set.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "identity": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetIdentity"
///    },
///    "plan": {
///      "$ref": "#/components/schemas/Plan"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetUpdateProperties"
///    },
///    "sku": {
///      "$ref": "#/components/schemas/Sku"
///    },
///    "zones": {
///      "description": "The virtual machine scale set zones.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdate {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub identity: ::std::option::Option<VirtualMachineScaleSetIdentity>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub plan: ::std::option::Option<Plan>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineScaleSetUpdateProperties>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku: ::std::option::Option<Sku>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The virtual machine scale set zones.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zones: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdate>
for VirtualMachineScaleSetUpdate {
    fn from(value: &VirtualMachineScaleSetUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetUpdate {
    fn default() -> Self {
        Self {
            identity: Default::default(),
            plan: Default::default(),
            properties: Default::default(),
            sku: Default::default(),
            tags: Default::default(),
            zones: Default::default(),
        }
    }
}
///Describes a virtual machine scale set network profile's IP configuration. NOTE: The subnet of a scale set may be modified as long as the original subnet and the new subnet are in the same virtual network
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set network profile's IP configuration. NOTE: The subnet of a scale set may be modified as long as the original subnet and the new subnet are in the same virtual network",
///  "type": "object",
///  "properties": {
///    "name": {
///      "description": "The IP configuration name.",
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetUpdateIPConfigurationProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdateIpConfiguration {
    ///The IP configuration name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<
        VirtualMachineScaleSetUpdateIpConfigurationProperties,
    >,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdateIpConfiguration>
for VirtualMachineScaleSetUpdateIpConfiguration {
    fn from(value: &VirtualMachineScaleSetUpdateIpConfiguration) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetUpdateIpConfiguration {
    fn default() -> Self {
        Self {
            name: Default::default(),
            properties: Default::default(),
        }
    }
}
///Describes a virtual machine scale set network profile's IP configuration properties.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set network profile's IP configuration properties.",
///  "type": "object",
///  "properties": {
///    "applicationGatewayBackendAddressPools": {
///      "description": "The application gateway backend address pools.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    },
///    "applicationSecurityGroups": {
///      "description": "Specifies an array of references to application security group.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    },
///    "loadBalancerBackendAddressPools": {
///      "description": "The load balancer backend address pools.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    },
///    "loadBalancerInboundNatPools": {
///      "description": "The load balancer inbound nat pools.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/SubResource"
///      }
///    },
///    "primary": {
///      "description": "Specifies the primary IP Configuration in case the network interface has more than one IP Configuration.",
///      "type": "boolean"
///    },
///    "privateIPAddressVersion": {
///      "$ref": "#/components/schemas/IPVersion"
///    },
///    "publicIPAddressConfiguration": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetUpdatePublicIPAddressConfiguration"
///    },
///    "subnet": {
///      "$ref": "#/components/schemas/ApiEntityReference"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdateIpConfigurationProperties {
    ///The application gateway backend address pools.
    #[serde(
        rename = "applicationGatewayBackendAddressPools",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub application_gateway_backend_address_pools: ::std::vec::Vec<SubResource>,
    ///Specifies an array of references to application security group.
    #[serde(
        rename = "applicationSecurityGroups",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub application_security_groups: ::std::vec::Vec<SubResource>,
    ///The load balancer backend address pools.
    #[serde(
        rename = "loadBalancerBackendAddressPools",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub load_balancer_backend_address_pools: ::std::vec::Vec<SubResource>,
    ///The load balancer inbound nat pools.
    #[serde(
        rename = "loadBalancerInboundNatPools",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub load_balancer_inbound_nat_pools: ::std::vec::Vec<SubResource>,
    ///Specifies the primary IP Configuration in case the network interface has more than one IP Configuration.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub primary: ::std::option::Option<bool>,
    #[serde(
        rename = "privateIPAddressVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub private_ip_address_version: ::std::option::Option<IpVersion>,
    #[serde(
        rename = "publicIPAddressConfiguration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub public_ip_address_configuration: ::std::option::Option<
        VirtualMachineScaleSetUpdatePublicIpAddressConfiguration,
    >,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub subnet: ::std::option::Option<ApiEntityReference>,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdateIpConfigurationProperties>
for VirtualMachineScaleSetUpdateIpConfigurationProperties {
    fn from(value: &VirtualMachineScaleSetUpdateIpConfigurationProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetUpdateIpConfigurationProperties {
    fn default() -> Self {
        Self {
            application_gateway_backend_address_pools: Default::default(),
            application_security_groups: Default::default(),
            load_balancer_backend_address_pools: Default::default(),
            load_balancer_inbound_nat_pools: Default::default(),
            primary: Default::default(),
            private_ip_address_version: Default::default(),
            public_ip_address_configuration: Default::default(),
            subnet: Default::default(),
        }
    }
}
///Describes a virtual machine scale set network profile's network configurations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set network profile's network configurations.",
///  "type": "object",
///  "properties": {
///    "name": {
///      "description": "The network configuration name.",
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetUpdateNetworkConfigurationProperties"
///    },
///    "tags": {
///      "description": "Resource tags applied to the networkInterface address created by this NetworkInterfaceConfiguration",
///      "type": "object",
///      "additionalProperties": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdateNetworkConfiguration {
    ///The network configuration name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<
        VirtualMachineScaleSetUpdateNetworkConfigurationProperties,
    >,
    ///Resource tags applied to the networkInterface address created by this NetworkInterfaceConfiguration
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdateNetworkConfiguration>
for VirtualMachineScaleSetUpdateNetworkConfiguration {
    fn from(value: &VirtualMachineScaleSetUpdateNetworkConfiguration) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetUpdateNetworkConfiguration {
    fn default() -> Self {
        Self {
            name: Default::default(),
            properties: Default::default(),
            tags: Default::default(),
        }
    }
}
///Describes a virtual machine scale set updatable network profile's IP configuration.Use this object for updating network profile's IP Configuration.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set updatable network profile's IP configuration.Use this object for updating network profile's IP Configuration.",
///  "type": "object",
///  "properties": {
///    "auxiliaryMode": {
///      "$ref": "#/components/schemas/NetworkInterfaceAuxiliaryMode"
///    },
///    "auxiliarySku": {
///      "$ref": "#/components/schemas/NetworkInterfaceAuxiliarySku"
///    },
///    "deleteOption": {
///      "$ref": "#/components/schemas/DeleteOptions"
///    },
///    "disableTcpStateTracking": {
///      "description": "Specifies whether the network interface is disabled for tcp state tracking.",
///      "type": "boolean"
///    },
///    "dnsSettings": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetNetworkConfigurationDnsSettings"
///    },
///    "enableAcceleratedNetworking": {
///      "description": "Specifies whether the network interface is accelerated networking-enabled.",
///      "type": "boolean"
///    },
///    "enableFpga": {
///      "description": "Specifies whether the network interface is FPGA networking-enabled.",
///      "type": "boolean"
///    },
///    "enableIPForwarding": {
///      "description": "Whether IP forwarding enabled on this NIC.",
///      "type": "boolean"
///    },
///    "ipConfigurations": {
///      "description": "The virtual machine scale set IP Configuration.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetUpdateIPConfiguration"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "networkSecurityGroup": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "primary": {
///      "description": "Whether this is a primary NIC on a virtual machine.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdateNetworkConfigurationProperties {
    #[serde(
        rename = "auxiliaryMode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub auxiliary_mode: ::std::option::Option<NetworkInterfaceAuxiliaryMode>,
    #[serde(
        rename = "auxiliarySku",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub auxiliary_sku: ::std::option::Option<NetworkInterfaceAuxiliarySku>,
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DeleteOptions>,
    ///Specifies whether the network interface is disabled for tcp state tracking.
    #[serde(
        rename = "disableTcpStateTracking",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disable_tcp_state_tracking: ::std::option::Option<bool>,
    #[serde(
        rename = "dnsSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub dns_settings: ::std::option::Option<
        VirtualMachineScaleSetNetworkConfigurationDnsSettings,
    >,
    ///Specifies whether the network interface is accelerated networking-enabled.
    #[serde(
        rename = "enableAcceleratedNetworking",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_accelerated_networking: ::std::option::Option<bool>,
    ///Specifies whether the network interface is FPGA networking-enabled.
    #[serde(
        rename = "enableFpga",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_fpga: ::std::option::Option<bool>,
    ///Whether IP forwarding enabled on this NIC.
    #[serde(
        rename = "enableIPForwarding",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_ip_forwarding: ::std::option::Option<bool>,
    ///The virtual machine scale set IP Configuration.
    #[serde(
        rename = "ipConfigurations",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub ip_configurations: ::std::vec::Vec<VirtualMachineScaleSetUpdateIpConfiguration>,
    #[serde(
        rename = "networkSecurityGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_security_group: ::std::option::Option<SubResource>,
    ///Whether this is a primary NIC on a virtual machine.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub primary: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdateNetworkConfigurationProperties>
for VirtualMachineScaleSetUpdateNetworkConfigurationProperties {
    fn from(value: &VirtualMachineScaleSetUpdateNetworkConfigurationProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default
for VirtualMachineScaleSetUpdateNetworkConfigurationProperties {
    fn default() -> Self {
        Self {
            auxiliary_mode: Default::default(),
            auxiliary_sku: Default::default(),
            delete_option: Default::default(),
            disable_tcp_state_tracking: Default::default(),
            dns_settings: Default::default(),
            enable_accelerated_networking: Default::default(),
            enable_fpga: Default::default(),
            enable_ip_forwarding: Default::default(),
            ip_configurations: Default::default(),
            network_security_group: Default::default(),
            primary: Default::default(),
        }
    }
}
///Describes a virtual machine scale set network profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set network profile.",
///  "type": "object",
///  "properties": {
///    "healthProbe": {
///      "$ref": "#/components/schemas/ApiEntityReference"
///    },
///    "networkApiVersion": {
///      "$ref": "#/components/schemas/NetworkApiVersion"
///    },
///    "networkInterfaceConfigurations": {
///      "description": "The list of network configurations.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetUpdateNetworkConfiguration"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdateNetworkProfile {
    #[serde(
        rename = "healthProbe",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub health_probe: ::std::option::Option<ApiEntityReference>,
    #[serde(
        rename = "networkApiVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_api_version: ::std::option::Option<NetworkApiVersion>,
    ///The list of network configurations.
    #[serde(
        rename = "networkInterfaceConfigurations",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_interface_configurations: ::std::vec::Vec<
        VirtualMachineScaleSetUpdateNetworkConfiguration,
    >,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdateNetworkProfile>
for VirtualMachineScaleSetUpdateNetworkProfile {
    fn from(value: &VirtualMachineScaleSetUpdateNetworkProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetUpdateNetworkProfile {
    fn default() -> Self {
        Self {
            health_probe: Default::default(),
            network_api_version: Default::default(),
            network_interface_configurations: Default::default(),
        }
    }
}
///Describes virtual machine scale set operating system disk Update Object. This should be used for Updating VMSS OS Disk.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes virtual machine scale set operating system disk Update Object. This should be used for Updating VMSS OS Disk.",
///  "type": "object",
///  "properties": {
///    "caching": {
///      "$ref": "#/components/schemas/CachingTypes"
///    },
///    "deleteOption": {
///      "$ref": "#/components/schemas/DiskDeleteOptionTypes"
///    },
///    "diffDiskSettings": {
///      "$ref": "#/components/schemas/DiffDiskSettings"
///    },
///    "diskSizeGB": {
///      "description": "Specifies the size of an empty data disk in gigabytes. This element can be used to overwrite the size of the disk in a virtual machine image. <br><br> diskSizeGB is the number of bytes x 1024^3 for the disk and the value cannot be larger than 1023",
///      "type": "integer",
///      "format": "int32"
///    },
///    "image": {
///      "$ref": "#/components/schemas/VirtualHardDisk"
///    },
///    "managedDisk": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetManagedDiskParameters"
///    },
///    "vhdContainers": {
///      "description": "The list of virtual hard disk container uris.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "writeAcceleratorEnabled": {
///      "description": "Specifies whether writeAccelerator should be enabled or disabled on the disk.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdateOsDisk {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub caching: ::std::option::Option<CachingTypes>,
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DiskDeleteOptionTypes>,
    #[serde(
        rename = "diffDiskSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub diff_disk_settings: ::std::option::Option<DiffDiskSettings>,
    ///Specifies the size of an empty data disk in gigabytes. This element can be used to overwrite the size of the disk in a virtual machine image. <br><br> diskSizeGB is the number of bytes x 1024^3 for the disk and the value cannot be larger than 1023
    #[serde(
        rename = "diskSizeGB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_size_gb: ::std::option::Option<i32>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub image: ::std::option::Option<VirtualHardDisk>,
    #[serde(
        rename = "managedDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub managed_disk: ::std::option::Option<VirtualMachineScaleSetManagedDiskParameters>,
    ///The list of virtual hard disk container uris.
    #[serde(
        rename = "vhdContainers",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vhd_containers: ::std::vec::Vec<::std::string::String>,
    ///Specifies whether writeAccelerator should be enabled or disabled on the disk.
    #[serde(
        rename = "writeAcceleratorEnabled",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub write_accelerator_enabled: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdateOsDisk>
for VirtualMachineScaleSetUpdateOsDisk {
    fn from(value: &VirtualMachineScaleSetUpdateOsDisk) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetUpdateOsDisk {
    fn default() -> Self {
        Self {
            caching: Default::default(),
            delete_option: Default::default(),
            diff_disk_settings: Default::default(),
            disk_size_gb: Default::default(),
            image: Default::default(),
            managed_disk: Default::default(),
            vhd_containers: Default::default(),
            write_accelerator_enabled: Default::default(),
        }
    }
}
///Describes a virtual machine scale set OS profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set OS profile.",
///  "type": "object",
///  "properties": {
///    "customData": {
///      "description": "A base-64 encoded string of custom data.",
///      "type": "string"
///    },
///    "linuxConfiguration": {
///      "$ref": "#/components/schemas/LinuxConfiguration"
///    },
///    "secrets": {
///      "description": "The List of certificates for addition to the VM.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VaultSecretGroup"
///      },
///      "x-ms-identifiers": [
///        "sourceVault/id"
///      ]
///    },
///    "windowsConfiguration": {
///      "$ref": "#/components/schemas/WindowsConfiguration"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdateOsProfile {
    ///A base-64 encoded string of custom data.
    #[serde(
        rename = "customData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub custom_data: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "linuxConfiguration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub linux_configuration: ::std::option::Option<LinuxConfiguration>,
    ///The List of certificates for addition to the VM.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub secrets: ::std::vec::Vec<VaultSecretGroup>,
    #[serde(
        rename = "windowsConfiguration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub windows_configuration: ::std::option::Option<WindowsConfiguration>,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdateOsProfile>
for VirtualMachineScaleSetUpdateOsProfile {
    fn from(value: &VirtualMachineScaleSetUpdateOsProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetUpdateOsProfile {
    fn default() -> Self {
        Self {
            custom_data: Default::default(),
            linux_configuration: Default::default(),
            secrets: Default::default(),
            windows_configuration: Default::default(),
        }
    }
}
///Describes the properties of a Virtual Machine Scale Set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Virtual Machine Scale Set.",
///  "type": "object",
///  "properties": {
///    "additionalCapabilities": {
///      "$ref": "#/components/schemas/AdditionalCapabilities"
///    },
///    "automaticRepairsPolicy": {
///      "$ref": "#/components/schemas/AutomaticRepairsPolicy"
///    },
///    "doNotRunExtensionsOnOverprovisionedVMs": {
///      "description": "When Overprovision is enabled, extensions are launched only on the requested number of VMs which are finally kept. This property will hence ensure that the extensions do not run on the extra overprovisioned VMs.",
///      "type": "boolean"
///    },
///    "overprovision": {
///      "description": "Specifies whether the Virtual Machine Scale Set should be overprovisioned.",
///      "type": "boolean"
///    },
///    "priorityMixPolicy": {
///      "$ref": "#/components/schemas/PriorityMixPolicy"
///    },
///    "proximityPlacementGroup": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "resiliencyPolicy": {
///      "$ref": "#/components/schemas/ResiliencyPolicy"
///    },
///    "scaleInPolicy": {
///      "$ref": "#/components/schemas/ScaleInPolicy"
///    },
///    "singlePlacementGroup": {
///      "description": "When true this limits the scale set to a single placement group, of max size 100 virtual machines. NOTE: If singlePlacementGroup is true, it may be modified to false. However, if singlePlacementGroup is false, it may not be modified to true.",
///      "type": "boolean"
///    },
///    "skuProfile": {
///      "$ref": "#/components/schemas/SkuProfile"
///    },
///    "spotRestorePolicy": {
///      "$ref": "#/components/schemas/SpotRestorePolicy"
///    },
///    "upgradePolicy": {
///      "$ref": "#/components/schemas/UpgradePolicy"
///    },
///    "virtualMachineProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetUpdateVMProfile"
///    },
///    "zonalPlatformFaultDomainAlignMode": {
///      "$ref": "#/components/schemas/ZonalPlatformFaultDomainAlignMode"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdateProperties {
    #[serde(
        rename = "additionalCapabilities",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub additional_capabilities: ::std::option::Option<AdditionalCapabilities>,
    #[serde(
        rename = "automaticRepairsPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub automatic_repairs_policy: ::std::option::Option<AutomaticRepairsPolicy>,
    ///When Overprovision is enabled, extensions are launched only on the requested number of VMs which are finally kept. This property will hence ensure that the extensions do not run on the extra overprovisioned VMs.
    #[serde(
        rename = "doNotRunExtensionsOnOverprovisionedVMs",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub do_not_run_extensions_on_overprovisioned_v_ms: ::std::option::Option<bool>,
    ///Specifies whether the Virtual Machine Scale Set should be overprovisioned.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub overprovision: ::std::option::Option<bool>,
    #[serde(
        rename = "priorityMixPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub priority_mix_policy: ::std::option::Option<PriorityMixPolicy>,
    #[serde(
        rename = "proximityPlacementGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub proximity_placement_group: ::std::option::Option<SubResource>,
    #[serde(
        rename = "resiliencyPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub resiliency_policy: ::std::option::Option<ResiliencyPolicy>,
    #[serde(
        rename = "scaleInPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scale_in_policy: ::std::option::Option<ScaleInPolicy>,
    ///When true this limits the scale set to a single placement group, of max size 100 virtual machines. NOTE: If singlePlacementGroup is true, it may be modified to false. However, if singlePlacementGroup is false, it may not be modified to true.
    #[serde(
        rename = "singlePlacementGroup",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub single_placement_group: ::std::option::Option<bool>,
    #[serde(
        rename = "skuProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku_profile: ::std::option::Option<SkuProfile>,
    #[serde(
        rename = "spotRestorePolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub spot_restore_policy: ::std::option::Option<SpotRestorePolicy>,
    #[serde(
        rename = "upgradePolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub upgrade_policy: ::std::option::Option<UpgradePolicy>,
    #[serde(
        rename = "virtualMachineProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub virtual_machine_profile: ::std::option::Option<
        VirtualMachineScaleSetUpdateVmProfile,
    >,
    #[serde(
        rename = "zonalPlatformFaultDomainAlignMode",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zonal_platform_fault_domain_align_mode: ::std::option::Option<
        ZonalPlatformFaultDomainAlignMode,
    >,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdateProperties>
for VirtualMachineScaleSetUpdateProperties {
    fn from(value: &VirtualMachineScaleSetUpdateProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetUpdateProperties {
    fn default() -> Self {
        Self {
            additional_capabilities: Default::default(),
            automatic_repairs_policy: Default::default(),
            do_not_run_extensions_on_overprovisioned_v_ms: Default::default(),
            overprovision: Default::default(),
            priority_mix_policy: Default::default(),
            proximity_placement_group: Default::default(),
            resiliency_policy: Default::default(),
            scale_in_policy: Default::default(),
            single_placement_group: Default::default(),
            sku_profile: Default::default(),
            spot_restore_policy: Default::default(),
            upgrade_policy: Default::default(),
            virtual_machine_profile: Default::default(),
            zonal_platform_fault_domain_align_mode: Default::default(),
        }
    }
}
///Describes a virtual machines scale set IP Configuration's PublicIPAddress configuration
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machines scale set IP Configuration's PublicIPAddress configuration",
///  "type": "object",
///  "properties": {
///    "name": {
///      "description": "The publicIP address configuration name.",
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetUpdatePublicIPAddressConfigurationProperties"
///    },
///    "tags": {
///      "description": "Resource tags applied to the publicIP address created by this PublicIPAddressConfiguration",
///      "type": "object",
///      "additionalProperties": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdatePublicIpAddressConfiguration {
    ///The publicIP address configuration name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<
        VirtualMachineScaleSetUpdatePublicIpAddressConfigurationProperties,
    >,
    ///Resource tags applied to the publicIP address created by this PublicIPAddressConfiguration
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdatePublicIpAddressConfiguration>
for VirtualMachineScaleSetUpdatePublicIpAddressConfiguration {
    fn from(value: &VirtualMachineScaleSetUpdatePublicIpAddressConfiguration) -> Self {
        value.clone()
    }
}
impl ::std::default::Default
for VirtualMachineScaleSetUpdatePublicIpAddressConfiguration {
    fn default() -> Self {
        Self {
            name: Default::default(),
            properties: Default::default(),
            tags: Default::default(),
        }
    }
}
///Describes a virtual machines scale set IP Configuration's PublicIPAddress configuration
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machines scale set IP Configuration's PublicIPAddress configuration",
///  "type": "object",
///  "properties": {
///    "deleteOption": {
///      "$ref": "#/components/schemas/DeleteOptions"
///    },
///    "dnsSettings": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetPublicIPAddressConfigurationDnsSettings"
///    },
///    "idleTimeoutInMinutes": {
///      "description": "The idle timeout of the public IP address.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "publicIPPrefix": {
///      "$ref": "#/components/schemas/SubResource"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdatePublicIpAddressConfigurationProperties {
    #[serde(
        rename = "deleteOption",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub delete_option: ::std::option::Option<DeleteOptions>,
    #[serde(
        rename = "dnsSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub dns_settings: ::std::option::Option<
        VirtualMachineScaleSetPublicIpAddressConfigurationDnsSettings,
    >,
    ///The idle timeout of the public IP address.
    #[serde(
        rename = "idleTimeoutInMinutes",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub idle_timeout_in_minutes: ::std::option::Option<i32>,
    #[serde(
        rename = "publicIPPrefix",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub public_ip_prefix: ::std::option::Option<SubResource>,
}
impl ::std::convert::From<
    &VirtualMachineScaleSetUpdatePublicIpAddressConfigurationProperties,
> for VirtualMachineScaleSetUpdatePublicIpAddressConfigurationProperties {
    fn from(
        value: &VirtualMachineScaleSetUpdatePublicIpAddressConfigurationProperties,
    ) -> Self {
        value.clone()
    }
}
impl ::std::default::Default
for VirtualMachineScaleSetUpdatePublicIpAddressConfigurationProperties {
    fn default() -> Self {
        Self {
            delete_option: Default::default(),
            dns_settings: Default::default(),
            idle_timeout_in_minutes: Default::default(),
            public_ip_prefix: Default::default(),
        }
    }
}
///Describes a virtual machine scale set storage profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set storage profile.",
///  "type": "object",
///  "properties": {
///    "dataDisks": {
///      "description": "The data disks.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetDataDisk"
///      },
///      "x-ms-identifiers": [
///        "name",
///        "lun"
///      ]
///    },
///    "diskControllerType": {
///      "$ref": "#/components/schemas/DiskControllerTypes"
///    },
///    "imageReference": {
///      "$ref": "#/components/schemas/ImageReference"
///    },
///    "osDisk": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetUpdateOSDisk"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdateStorageProfile {
    ///The data disks.
    #[serde(
        rename = "dataDisks",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub data_disks: ::std::vec::Vec<VirtualMachineScaleSetDataDisk>,
    #[serde(
        rename = "diskControllerType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_controller_type: ::std::option::Option<DiskControllerTypes>,
    #[serde(
        rename = "imageReference",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub image_reference: ::std::option::Option<ImageReference>,
    #[serde(
        rename = "osDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_disk: ::std::option::Option<VirtualMachineScaleSetUpdateOsDisk>,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdateStorageProfile>
for VirtualMachineScaleSetUpdateStorageProfile {
    fn from(value: &VirtualMachineScaleSetUpdateStorageProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetUpdateStorageProfile {
    fn default() -> Self {
        Self {
            data_disks: Default::default(),
            disk_controller_type: Default::default(),
            image_reference: Default::default(),
            os_disk: Default::default(),
        }
    }
}
///Describes a virtual machine scale set virtual machine profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set virtual machine profile.",
///  "type": "object",
///  "properties": {
///    "billingProfile": {
///      "$ref": "#/components/schemas/BillingProfile"
///    },
///    "diagnosticsProfile": {
///      "$ref": "#/components/schemas/DiagnosticsProfile"
///    },
///    "extensionProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetExtensionProfile"
///    },
///    "hardwareProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetHardwareProfile"
///    },
///    "licenseType": {
///      "description": "The license type, which is for bring your own license scenario.",
///      "type": "string"
///    },
///    "networkProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetUpdateNetworkProfile"
///    },
///    "osProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetUpdateOSProfile"
///    },
///    "scheduledEventsProfile": {
///      "$ref": "#/components/schemas/ScheduledEventsProfile"
///    },
///    "securityPostureReference": {
///      "$ref": "#/components/schemas/SecurityPostureReferenceUpdate"
///    },
///    "securityProfile": {
///      "$ref": "#/components/schemas/SecurityProfile"
///    },
///    "storageProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetUpdateStorageProfile"
///    },
///    "userData": {
///      "description": "UserData for the VM, which must be base-64 encoded. Customer should not pass any secrets in here. <br><br>Minimum api-version: 2021-03-01",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetUpdateVmProfile {
    #[serde(
        rename = "billingProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub billing_profile: ::std::option::Option<BillingProfile>,
    #[serde(
        rename = "diagnosticsProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub diagnostics_profile: ::std::option::Option<DiagnosticsProfile>,
    #[serde(
        rename = "extensionProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extension_profile: ::std::option::Option<VirtualMachineScaleSetExtensionProfile>,
    #[serde(
        rename = "hardwareProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hardware_profile: ::std::option::Option<VirtualMachineScaleSetHardwareProfile>,
    ///The license type, which is for bring your own license scenario.
    #[serde(
        rename = "licenseType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub license_type: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "networkProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_profile: ::std::option::Option<
        VirtualMachineScaleSetUpdateNetworkProfile,
    >,
    #[serde(
        rename = "osProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_profile: ::std::option::Option<VirtualMachineScaleSetUpdateOsProfile>,
    #[serde(
        rename = "scheduledEventsProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scheduled_events_profile: ::std::option::Option<ScheduledEventsProfile>,
    #[serde(
        rename = "securityPostureReference",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub security_posture_reference: ::std::option::Option<
        SecurityPostureReferenceUpdate,
    >,
    #[serde(
        rename = "securityProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub security_profile: ::std::option::Option<SecurityProfile>,
    #[serde(
        rename = "storageProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_profile: ::std::option::Option<
        VirtualMachineScaleSetUpdateStorageProfile,
    >,
    ///UserData for the VM, which must be base-64 encoded. Customer should not pass any secrets in here. <br><br>Minimum api-version: 2021-03-01
    #[serde(
        rename = "userData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub user_data: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetUpdateVmProfile>
for VirtualMachineScaleSetUpdateVmProfile {
    fn from(value: &VirtualMachineScaleSetUpdateVmProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetUpdateVmProfile {
    fn default() -> Self {
        Self {
            billing_profile: Default::default(),
            diagnostics_profile: Default::default(),
            extension_profile: Default::default(),
            hardware_profile: Default::default(),
            license_type: Default::default(),
            network_profile: Default::default(),
            os_profile: Default::default(),
            scheduled_events_profile: Default::default(),
            security_posture_reference: Default::default(),
            security_profile: Default::default(),
            storage_profile: Default::default(),
            user_data: Default::default(),
        }
    }
}
///Describes a virtual machine scale set virtual machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set virtual machine.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/TrackedResource"
///    }
///  ],
///  "properties": {
///    "etag": {
///      "description": "Etag is property returned in Update/Get response of the VMSS VM, so that customer can supply it in the header to ensure optimistic updates.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "identity": {
///      "$ref": "#/components/schemas/VirtualMachineIdentity"
///    },
///    "instanceId": {
///      "description": "The virtual machine instance ID.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "plan": {
///      "$ref": "#/components/schemas/Plan"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetVMProperties"
///    },
///    "resources": {
///      "description": "The virtual machine child extension resources.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineExtension"
///      }
///    },
///    "sku": {
///      "$ref": "#/components/schemas/Sku"
///    },
///    "zones": {
///      "description": "The virtual machine zones.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVm {
    ///Etag is property returned in Update/Get response of the VMSS VM, so that customer can supply it in the header to ensure optimistic updates.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub etag: ::std::option::Option<::std::string::String>,
    ///Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub identity: ::std::option::Option<VirtualMachineIdentity>,
    ///The virtual machine instance ID.
    #[serde(
        rename = "instanceId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_id: ::std::option::Option<::std::string::String>,
    ///The geo-location where the resource lives
    pub location: ::std::string::String,
    ///The name of the resource
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub plan: ::std::option::Option<Plan>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineScaleSetVmProperties>,
    ///The virtual machine child extension resources.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub resources: ::std::vec::Vec<VirtualMachineExtension>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub sku: ::std::option::Option<Sku>,
    #[serde(
        rename = "systemData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub system_data: ::std::option::Option<SystemData>,
    ///Resource tags.
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
    ///The virtual machine zones.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zones: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVm> for VirtualMachineScaleSetVm {
    fn from(value: &VirtualMachineScaleSetVm) -> Self {
        value.clone()
    }
}
///Describes a VMSS VM Extension.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a VMSS VM Extension.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResourceReadOnly"
///    }
///  ],
///  "properties": {
///    "location": {
///      "description": "The location of the extension.",
///      "type": "string",
///      "x-ms-mutability": [
///        "read",
///        "create"
///      ]
///    },
///    "name": {
///      "description": "Resource name",
///      "readOnly": true,
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineExtensionProperties"
///    },
///    "type": {
///      "description": "Resource type",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmExtension {
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The location of the extension.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub location: ::std::option::Option<::std::string::String>,
    ///Resource name
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineExtensionProperties>,
    ///Resource type
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmExtension>
for VirtualMachineScaleSetVmExtension {
    fn from(value: &VirtualMachineScaleSetVmExtension) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetVmExtension {
    fn default() -> Self {
        Self {
            id: Default::default(),
            location: Default::default(),
            name: Default::default(),
            properties: Default::default(),
            type_: Default::default(),
        }
    }
}
///Describes a VMSS VM Extension.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a VMSS VM Extension.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/SubResourceReadOnly"
///    }
///  ],
///  "properties": {
///    "name": {
///      "description": "The name of the extension.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineExtensionUpdateProperties"
///    },
///    "type": {
///      "description": "Resource type",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmExtensionUpdate {
    ///Resource Id
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub id: ::std::option::Option<::std::string::String>,
    ///The name of the extension.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineExtensionUpdateProperties>,
    ///Resource type
    #[serde(
        rename = "type",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub type_: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmExtensionUpdate>
for VirtualMachineScaleSetVmExtensionUpdate {
    fn from(value: &VirtualMachineScaleSetVmExtensionUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetVmExtensionUpdate {
    fn default() -> Self {
        Self {
            id: Default::default(),
            name: Default::default(),
            properties: Default::default(),
            type_: Default::default(),
        }
    }
}
///The List VMSS VM Extension operation response
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List VMSS VM Extension operation response",
///  "type": "object",
///  "properties": {
///    "value": {
///      "description": "The list of VMSS VM extensions",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetVMExtension"
///      },
///      "x-ms-identifiers": [
///        "name",
///        "id"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmExtensionsListResult {
    ///The list of VMSS VM extensions
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub value: ::std::vec::Vec<VirtualMachineScaleSetVmExtension>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmExtensionsListResult>
for VirtualMachineScaleSetVmExtensionsListResult {
    fn from(value: &VirtualMachineScaleSetVmExtensionsListResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetVmExtensionsListResult {
    fn default() -> Self {
        Self { value: Default::default() }
    }
}
///Extensions summary for virtual machines of a virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Extensions summary for virtual machines of a virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "name": {
///      "description": "The extension name.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "statusesSummary": {
///      "description": "The extensions information.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineStatusCodeCount"
///      },
///      "x-ms-identifiers": []
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmExtensionsSummary {
    ///The extension name.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///The extensions information.
    #[serde(
        rename = "statusesSummary",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses_summary: ::std::vec::Vec<VirtualMachineStatusCodeCount>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmExtensionsSummary>
for VirtualMachineScaleSetVmExtensionsSummary {
    fn from(value: &VirtualMachineScaleSetVmExtensionsSummary) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetVmExtensionsSummary {
    fn default() -> Self {
        Self {
            name: Default::default(),
            statuses_summary: Default::default(),
        }
    }
}
///Specifies a list of virtual machine instance IDs from the VM scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies a list of virtual machine instance IDs from the VM scale set.",
///  "type": "object",
///  "properties": {
///    "instanceIds": {
///      "description": "The virtual machine scale set instance ids. Omitting the virtual machine scale set instance ids will result in the operation being performed on all virtual machines in the virtual machine scale set.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmInstanceIDs {
    ///The virtual machine scale set instance ids. Omitting the virtual machine scale set instance ids will result in the operation being performed on all virtual machines in the virtual machine scale set.
    #[serde(
        rename = "instanceIds",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_ids: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmInstanceIDs>
for VirtualMachineScaleSetVmInstanceIDs {
    fn from(value: &VirtualMachineScaleSetVmInstanceIDs) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetVmInstanceIDs {
    fn default() -> Self {
        Self {
            instance_ids: Default::default(),
        }
    }
}
///Specifies a list of virtual machine instance IDs from the VM scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies a list of virtual machine instance IDs from the VM scale set.",
///  "type": "object",
///  "required": [
///    "instanceIds"
///  ],
///  "properties": {
///    "instanceIds": {
///      "description": "The virtual machine scale set instance ids.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmInstanceRequiredIDs {
    ///The virtual machine scale set instance ids.
    #[serde(rename = "instanceIds")]
    pub instance_ids: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmInstanceRequiredIDs>
for VirtualMachineScaleSetVmInstanceRequiredIDs {
    fn from(value: &VirtualMachineScaleSetVmInstanceRequiredIDs) -> Self {
        value.clone()
    }
}
///The instance view of a virtual machine scale set VM.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The instance view of a virtual machine scale set VM.",
///  "type": "object",
///  "properties": {
///    "assignedHost": {
///      "description": "Resource id of the dedicated host, on which the virtual machine is allocated through automatic placement, when the virtual machine is associated with a dedicated host group that has automatic placement enabled. Minimum api-version: 2020-06-01.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "bootDiagnostics": {
///      "$ref": "#/components/schemas/BootDiagnosticsInstanceView"
///    },
///    "computerName": {
///      "description": "Specifies the host OS name of the virtual machine. <br><br> This name cannot be updated after the VM is created. <br><br> **Max-length (Windows):** 15 characters <br><br> **Max-length (Linux):** 64 characters. <br><br> For naming conventions and restrictions see [Azure infrastructure services implementation guidelines](https://docs.microsoft.com/azure/virtual-machines/virtual-machines-linux-infrastructure-subscription-accounts-guidelines?toc=%2fazure%2fvirtual-machines%2flinux%2ftoc.json#1-naming-conventions).",
///      "type": "string"
///    },
///    "disks": {
///      "description": "The disks information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/DiskInstanceView"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    },
///    "extensions": {
///      "description": "The extensions information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineExtensionInstanceView"
///      },
///      "x-ms-identifiers": [
///        "name",
///        "type"
///      ]
///    },
///    "hyperVGeneration": {
///      "$ref": "#/components/schemas/HyperVGeneration"
///    },
///    "maintenanceRedeployStatus": {
///      "$ref": "#/components/schemas/MaintenanceRedeployStatus"
///    },
///    "osName": {
///      "description": "The Operating System running on the hybrid machine.",
///      "type": "string"
///    },
///    "osVersion": {
///      "description": "The version of Operating System running on the hybrid machine.",
///      "type": "string"
///    },
///    "placementGroupId": {
///      "description": "The placement group in which the VM is running. If the VM is deallocated it will not have a placementGroupId.",
///      "type": "string"
///    },
///    "platformFaultDomain": {
///      "description": "The Fault Domain count.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "platformUpdateDomain": {
///      "description": "The Update Domain count.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "rdpThumbPrint": {
///      "description": "The Remote desktop certificate thumbprint.",
///      "type": "string"
///    },
///    "statuses": {
///      "description": "The resource status information.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/InstanceViewStatus"
///      },
///      "x-ms-identifiers": []
///    },
///    "vmAgent": {
///      "$ref": "#/components/schemas/VirtualMachineAgentInstanceView"
///    },
///    "vmHealth": {
///      "$ref": "#/components/schemas/VirtualMachineHealthStatus"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmInstanceView {
    ///Resource id of the dedicated host, on which the virtual machine is allocated through automatic placement, when the virtual machine is associated with a dedicated host group that has automatic placement enabled. Minimum api-version: 2020-06-01.
    #[serde(
        rename = "assignedHost",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub assigned_host: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "bootDiagnostics",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub boot_diagnostics: ::std::option::Option<BootDiagnosticsInstanceView>,
    ///Specifies the host OS name of the virtual machine. <br><br> This name cannot be updated after the VM is created. <br><br> **Max-length (Windows):** 15 characters <br><br> **Max-length (Linux):** 64 characters. <br><br> For naming conventions and restrictions see [Azure infrastructure services implementation guidelines](https://docs.microsoft.com/azure/virtual-machines/virtual-machines-linux-infrastructure-subscription-accounts-guidelines?toc=%2fazure%2fvirtual-machines%2flinux%2ftoc.json#1-naming-conventions).
    #[serde(
        rename = "computerName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub computer_name: ::std::option::Option<::std::string::String>,
    ///The disks information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disks: ::std::vec::Vec<DiskInstanceView>,
    ///The extensions information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extensions: ::std::vec::Vec<VirtualMachineExtensionInstanceView>,
    #[serde(
        rename = "hyperVGeneration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hyper_v_generation: ::std::option::Option<HyperVGeneration>,
    #[serde(
        rename = "maintenanceRedeployStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub maintenance_redeploy_status: ::std::option::Option<MaintenanceRedeployStatus>,
    ///The Operating System running on the hybrid machine.
    #[serde(
        rename = "osName",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_name: ::std::option::Option<::std::string::String>,
    ///The version of Operating System running on the hybrid machine.
    #[serde(
        rename = "osVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_version: ::std::option::Option<::std::string::String>,
    ///The placement group in which the VM is running. If the VM is deallocated it will not have a placementGroupId.
    #[serde(
        rename = "placementGroupId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub placement_group_id: ::std::option::Option<::std::string::String>,
    ///The Fault Domain count.
    #[serde(
        rename = "platformFaultDomain",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub platform_fault_domain: ::std::option::Option<i32>,
    ///The Update Domain count.
    #[serde(
        rename = "platformUpdateDomain",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub platform_update_domain: ::std::option::Option<i32>,
    ///The Remote desktop certificate thumbprint.
    #[serde(
        rename = "rdpThumbPrint",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub rdp_thumb_print: ::std::option::Option<::std::string::String>,
    ///The resource status information.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub statuses: ::std::vec::Vec<InstanceViewStatus>,
    #[serde(
        rename = "vmAgent",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_agent: ::std::option::Option<VirtualMachineAgentInstanceView>,
    #[serde(
        rename = "vmHealth",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_health: ::std::option::Option<VirtualMachineHealthStatus>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmInstanceView>
for VirtualMachineScaleSetVmInstanceView {
    fn from(value: &VirtualMachineScaleSetVmInstanceView) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetVmInstanceView {
    fn default() -> Self {
        Self {
            assigned_host: Default::default(),
            boot_diagnostics: Default::default(),
            computer_name: Default::default(),
            disks: Default::default(),
            extensions: Default::default(),
            hyper_v_generation: Default::default(),
            maintenance_redeploy_status: Default::default(),
            os_name: Default::default(),
            os_version: Default::default(),
            placement_group_id: Default::default(),
            platform_fault_domain: Default::default(),
            platform_update_domain: Default::default(),
            rdp_thumb_print: Default::default(),
            statuses: Default::default(),
            vm_agent: Default::default(),
            vm_health: Default::default(),
        }
    }
}
///The List Virtual Machine Scale Set VMs operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Virtual Machine Scale Set VMs operation response.",
///  "type": "object",
///  "required": [
///    "value"
///  ],
///  "properties": {
///    "nextLink": {
///      "description": "The uri to fetch the next page of Virtual Machine Scale Set VMs. Call ListNext() with this to fetch the next page of VMSS VMs.",
///      "type": "string",
///      "format": "uri"
///    },
///    "value": {
///      "description": "The list of virtual machine scale sets VMs.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetVM"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmListResult {
    ///The uri to fetch the next page of Virtual Machine Scale Set VMs. Call ListNext() with this to fetch the next page of VMSS VMs.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of virtual machine scale sets VMs.
    pub value: ::std::vec::Vec<VirtualMachineScaleSetVm>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmListResult>
for VirtualMachineScaleSetVmListResult {
    fn from(value: &VirtualMachineScaleSetVmListResult) -> Self {
        value.clone()
    }
}
///Describes a virtual machine scale set VM network profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set VM network profile.",
///  "type": "object",
///  "properties": {
///    "networkInterfaceConfigurations": {
///      "description": "The list of network configurations.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineScaleSetNetworkConfiguration"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmNetworkProfileConfiguration {
    ///The list of network configurations.
    #[serde(
        rename = "networkInterfaceConfigurations",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_interface_configurations: ::std::vec::Vec<
        VirtualMachineScaleSetNetworkConfiguration,
    >,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmNetworkProfileConfiguration>
for VirtualMachineScaleSetVmNetworkProfileConfiguration {
    fn from(value: &VirtualMachineScaleSetVmNetworkProfileConfiguration) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetVmNetworkProfileConfiguration {
    fn default() -> Self {
        Self {
            network_interface_configurations: Default::default(),
        }
    }
}
///Describes a virtual machine scale set virtual machine profile.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a virtual machine scale set virtual machine profile.",
///  "type": "object",
///  "properties": {
///    "applicationProfile": {
///      "$ref": "#/components/schemas/ApplicationProfile"
///    },
///    "billingProfile": {
///      "$ref": "#/components/schemas/BillingProfile"
///    },
///    "capacityReservation": {
///      "$ref": "#/components/schemas/CapacityReservationProfile"
///    },
///    "diagnosticsProfile": {
///      "$ref": "#/components/schemas/DiagnosticsProfile"
///    },
///    "evictionPolicy": {
///      "$ref": "#/components/schemas/VirtualMachineEvictionPolicyTypes"
///    },
///    "extensionProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetExtensionProfile"
///    },
///    "hardwareProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetHardwareProfile"
///    },
///    "licenseType": {
///      "description": "Specifies that the image or disk that is being used was licensed on-premises. <br><br> Possible values for Windows Server operating system are: <br><br> Windows_Client <br><br> Windows_Server <br><br> Possible values for Linux Server operating system are: <br><br> RHEL_BYOS (for RHEL) <br><br> SLES_BYOS (for SUSE) <br><br> For more information, see [Azure Hybrid Use Benefit for Windows Server](https://docs.microsoft.com/azure/virtual-machines/windows/hybrid-use-benefit-licensing) <br><br> [Azure Hybrid Use Benefit for Linux Server](https://docs.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux) <br><br> Minimum api-version: 2015-06-15",
///      "type": "string"
///    },
///    "networkProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetNetworkProfile"
///    },
///    "osProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetOSProfile"
///    },
///    "priority": {
///      "$ref": "#/components/schemas/VirtualMachinePriorityTypes"
///    },
///    "scheduledEventsProfile": {
///      "$ref": "#/components/schemas/ScheduledEventsProfile"
///    },
///    "securityPostureReference": {
///      "$ref": "#/components/schemas/SecurityPostureReference"
///    },
///    "securityProfile": {
///      "$ref": "#/components/schemas/SecurityProfile"
///    },
///    "serviceArtifactReference": {
///      "$ref": "#/components/schemas/ServiceArtifactReference"
///    },
///    "storageProfile": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetStorageProfile"
///    },
///    "timeCreated": {
///      "description": "Specifies the time in which this VM profile for the Virtual Machine Scale Set was created. This value will be added to VMSS Flex VM tags when creating/updating the VMSS VM Profile. Minimum API version for this property is 2023-09-01.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "userData": {
///      "description": "UserData for the virtual machines in the scale set, which must be base-64 encoded. Customer should not pass any secrets in here. Minimum api-version: 2021-03-01.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmProfile {
    #[serde(
        rename = "applicationProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub application_profile: ::std::option::Option<ApplicationProfile>,
    #[serde(
        rename = "billingProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub billing_profile: ::std::option::Option<BillingProfile>,
    #[serde(
        rename = "capacityReservation",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub capacity_reservation: ::std::option::Option<CapacityReservationProfile>,
    #[serde(
        rename = "diagnosticsProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub diagnostics_profile: ::std::option::Option<DiagnosticsProfile>,
    #[serde(
        rename = "evictionPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub eviction_policy: ::std::option::Option<VirtualMachineEvictionPolicyTypes>,
    #[serde(
        rename = "extensionProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub extension_profile: ::std::option::Option<VirtualMachineScaleSetExtensionProfile>,
    #[serde(
        rename = "hardwareProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hardware_profile: ::std::option::Option<VirtualMachineScaleSetHardwareProfile>,
    ///Specifies that the image or disk that is being used was licensed on-premises. <br><br> Possible values for Windows Server operating system are: <br><br> Windows_Client <br><br> Windows_Server <br><br> Possible values for Linux Server operating system are: <br><br> RHEL_BYOS (for RHEL) <br><br> SLES_BYOS (for SUSE) <br><br> For more information, see [Azure Hybrid Use Benefit for Windows Server](https://docs.microsoft.com/azure/virtual-machines/windows/hybrid-use-benefit-licensing) <br><br> [Azure Hybrid Use Benefit for Linux Server](https://docs.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux) <br><br> Minimum api-version: 2015-06-15
    #[serde(
        rename = "licenseType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub license_type: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "networkProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_profile: ::std::option::Option<VirtualMachineScaleSetNetworkProfile>,
    #[serde(
        rename = "osProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_profile: ::std::option::Option<VirtualMachineScaleSetOsProfile>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub priority: ::std::option::Option<VirtualMachinePriorityTypes>,
    #[serde(
        rename = "scheduledEventsProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub scheduled_events_profile: ::std::option::Option<ScheduledEventsProfile>,
    #[serde(
        rename = "securityPostureReference",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub security_posture_reference: ::std::option::Option<SecurityPostureReference>,
    #[serde(
        rename = "securityProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub security_profile: ::std::option::Option<SecurityProfile>,
    #[serde(
        rename = "serviceArtifactReference",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub service_artifact_reference: ::std::option::Option<ServiceArtifactReference>,
    #[serde(
        rename = "storageProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_profile: ::std::option::Option<VirtualMachineScaleSetStorageProfile>,
    ///Specifies the time in which this VM profile for the Virtual Machine Scale Set was created. This value will be added to VMSS Flex VM tags when creating/updating the VMSS VM Profile. Minimum API version for this property is 2023-09-01.
    #[serde(
        rename = "timeCreated",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub time_created: ::std::option::Option<::std::string::String>,
    ///UserData for the virtual machines in the scale set, which must be base-64 encoded. Customer should not pass any secrets in here. Minimum api-version: 2021-03-01.
    #[serde(
        rename = "userData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub user_data: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmProfile>
for VirtualMachineScaleSetVmProfile {
    fn from(value: &VirtualMachineScaleSetVmProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetVmProfile {
    fn default() -> Self {
        Self {
            application_profile: Default::default(),
            billing_profile: Default::default(),
            capacity_reservation: Default::default(),
            diagnostics_profile: Default::default(),
            eviction_policy: Default::default(),
            extension_profile: Default::default(),
            hardware_profile: Default::default(),
            license_type: Default::default(),
            network_profile: Default::default(),
            os_profile: Default::default(),
            priority: Default::default(),
            scheduled_events_profile: Default::default(),
            security_posture_reference: Default::default(),
            security_profile: Default::default(),
            service_artifact_reference: Default::default(),
            storage_profile: Default::default(),
            time_created: Default::default(),
            user_data: Default::default(),
        }
    }
}
///Describes the properties of a virtual machine scale set virtual machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a virtual machine scale set virtual machine.",
///  "type": "object",
///  "properties": {
///    "additionalCapabilities": {
///      "$ref": "#/components/schemas/AdditionalCapabilities"
///    },
///    "availabilitySet": {
///      "$ref": "#/components/schemas/SubResource"
///    },
///    "diagnosticsProfile": {
///      "$ref": "#/components/schemas/DiagnosticsProfile"
///    },
///    "hardwareProfile": {
///      "$ref": "#/components/schemas/HardwareProfile"
///    },
///    "instanceView": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetVMInstanceView"
///    },
///    "latestModelApplied": {
///      "description": "Specifies whether the latest model has been applied to the virtual machine.",
///      "readOnly": true,
///      "type": "boolean"
///    },
///    "licenseType": {
///      "description": "Specifies that the image or disk that is being used was licensed on-premises. <br><br> Possible values for Windows Server operating system are: <br><br> Windows_Client <br><br> Windows_Server <br><br> Possible values for Linux Server operating system are: <br><br> RHEL_BYOS (for RHEL) <br><br> SLES_BYOS (for SUSE) <br><br> For more information, see [Azure Hybrid Use Benefit for Windows Server](https://docs.microsoft.com/azure/virtual-machines/windows/hybrid-use-benefit-licensing) <br><br> [Azure Hybrid Use Benefit for Linux Server](https://docs.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux) <br><br> Minimum api-version: 2015-06-15",
///      "type": "string"
///    },
///    "modelDefinitionApplied": {
///      "description": "Specifies whether the model applied to the virtual machine is the model of the virtual machine scale set or the customized model for the virtual machine.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "networkProfile": {
///      "$ref": "#/components/schemas/NetworkProfile"
///    },
///    "networkProfileConfiguration": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetVMNetworkProfileConfiguration"
///    },
///    "osProfile": {
///      "$ref": "#/components/schemas/OSProfile"
///    },
///    "protectionPolicy": {
///      "$ref": "#/components/schemas/VirtualMachineScaleSetVMProtectionPolicy"
///    },
///    "provisioningState": {
///      "description": "The provisioning state, which only appears in the response.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "resilientVMDeletionStatus": {
///      "$ref": "#/components/schemas/ResilientVMDeletionStatus"
///    },
///    "securityProfile": {
///      "$ref": "#/components/schemas/SecurityProfile"
///    },
///    "storageProfile": {
///      "$ref": "#/components/schemas/StorageProfile"
///    },
///    "timeCreated": {
///      "description": "Specifies the time at which the Virtual Machine resource was created. Minimum api-version: 2021-11-01.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "userData": {
///      "description": "UserData for the VM, which must be base-64 encoded. Customer should not pass any secrets in here. Minimum api-version: 2021-03-01",
///      "type": "string"
///    },
///    "vmId": {
///      "description": "Azure VM unique ID.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmProperties {
    #[serde(
        rename = "additionalCapabilities",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub additional_capabilities: ::std::option::Option<AdditionalCapabilities>,
    #[serde(
        rename = "availabilitySet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub availability_set: ::std::option::Option<SubResource>,
    #[serde(
        rename = "diagnosticsProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub diagnostics_profile: ::std::option::Option<DiagnosticsProfile>,
    #[serde(
        rename = "hardwareProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub hardware_profile: ::std::option::Option<HardwareProfile>,
    #[serde(
        rename = "instanceView",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub instance_view: ::std::option::Option<VirtualMachineScaleSetVmInstanceView>,
    ///Specifies whether the latest model has been applied to the virtual machine.
    #[serde(
        rename = "latestModelApplied",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub latest_model_applied: ::std::option::Option<bool>,
    ///Specifies that the image or disk that is being used was licensed on-premises. <br><br> Possible values for Windows Server operating system are: <br><br> Windows_Client <br><br> Windows_Server <br><br> Possible values for Linux Server operating system are: <br><br> RHEL_BYOS (for RHEL) <br><br> SLES_BYOS (for SUSE) <br><br> For more information, see [Azure Hybrid Use Benefit for Windows Server](https://docs.microsoft.com/azure/virtual-machines/windows/hybrid-use-benefit-licensing) <br><br> [Azure Hybrid Use Benefit for Linux Server](https://docs.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux) <br><br> Minimum api-version: 2015-06-15
    #[serde(
        rename = "licenseType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub license_type: ::std::option::Option<::std::string::String>,
    ///Specifies whether the model applied to the virtual machine is the model of the virtual machine scale set or the customized model for the virtual machine.
    #[serde(
        rename = "modelDefinitionApplied",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub model_definition_applied: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "networkProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_profile: ::std::option::Option<NetworkProfile>,
    #[serde(
        rename = "networkProfileConfiguration",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub network_profile_configuration: ::std::option::Option<
        VirtualMachineScaleSetVmNetworkProfileConfiguration,
    >,
    #[serde(
        rename = "osProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_profile: ::std::option::Option<OsProfile>,
    #[serde(
        rename = "protectionPolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub protection_policy: ::std::option::Option<
        VirtualMachineScaleSetVmProtectionPolicy,
    >,
    ///The provisioning state, which only appears in the response.
    #[serde(
        rename = "provisioningState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provisioning_state: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "resilientVMDeletionStatus",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub resilient_vm_deletion_status: ::std::option::Option<ResilientVmDeletionStatus>,
    #[serde(
        rename = "securityProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub security_profile: ::std::option::Option<SecurityProfile>,
    #[serde(
        rename = "storageProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub storage_profile: ::std::option::Option<StorageProfile>,
    ///Specifies the time at which the Virtual Machine resource was created. Minimum api-version: 2021-11-01.
    #[serde(
        rename = "timeCreated",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub time_created: ::std::option::Option<::std::string::String>,
    ///UserData for the VM, which must be base-64 encoded. Customer should not pass any secrets in here. Minimum api-version: 2021-03-01
    #[serde(
        rename = "userData",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub user_data: ::std::option::Option<::std::string::String>,
    ///Azure VM unique ID.
    #[serde(
        rename = "vmId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub vm_id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmProperties>
for VirtualMachineScaleSetVmProperties {
    fn from(value: &VirtualMachineScaleSetVmProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetVmProperties {
    fn default() -> Self {
        Self {
            additional_capabilities: Default::default(),
            availability_set: Default::default(),
            diagnostics_profile: Default::default(),
            hardware_profile: Default::default(),
            instance_view: Default::default(),
            latest_model_applied: Default::default(),
            license_type: Default::default(),
            model_definition_applied: Default::default(),
            network_profile: Default::default(),
            network_profile_configuration: Default::default(),
            os_profile: Default::default(),
            protection_policy: Default::default(),
            provisioning_state: Default::default(),
            resilient_vm_deletion_status: Default::default(),
            security_profile: Default::default(),
            storage_profile: Default::default(),
            time_created: Default::default(),
            user_data: Default::default(),
            vm_id: Default::default(),
        }
    }
}
///The protection policy of a virtual machine scale set VM.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The protection policy of a virtual machine scale set VM.",
///  "type": "object",
///  "properties": {
///    "protectFromScaleIn": {
///      "description": "Indicates that the virtual machine scale set VM shouldn't be considered for deletion during a scale-in operation.",
///      "type": "boolean"
///    },
///    "protectFromScaleSetActions": {
///      "description": "Indicates that model updates or actions (including scale-in) initiated on the virtual machine scale set should not be applied to the virtual machine scale set VM.",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmProtectionPolicy {
    ///Indicates that the virtual machine scale set VM shouldn't be considered for deletion during a scale-in operation.
    #[serde(
        rename = "protectFromScaleIn",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub protect_from_scale_in: ::std::option::Option<bool>,
    ///Indicates that model updates or actions (including scale-in) initiated on the virtual machine scale set should not be applied to the virtual machine scale set VM.
    #[serde(
        rename = "protectFromScaleSetActions",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub protect_from_scale_set_actions: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmProtectionPolicy>
for VirtualMachineScaleSetVmProtectionPolicy {
    fn from(value: &VirtualMachineScaleSetVmProtectionPolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetVmProtectionPolicy {
    fn default() -> Self {
        Self {
            protect_from_scale_in: Default::default(),
            protect_from_scale_set_actions: Default::default(),
        }
    }
}
///Describes a Virtual Machine Scale Set VM Reimage Parameters.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine Scale Set VM Reimage Parameters.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/VirtualMachineReimageParameters"
///    }
///  ],
///  "properties": {
///    "forceUpdateOSDiskForEphemeral": {
///      "description": "Parameter to force update ephemeral OS disk for a virtual machine scale set VM",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineScaleSetVmReimageParameters {
    ///Specifies in decimal number, the version the OS disk should be reimaged to. If exact version is not provided, the OS disk is reimaged to the existing version of OS Disk.
    #[serde(
        rename = "exactVersion",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub exact_version: ::std::option::Option<::std::string::String>,
    ///Parameter to force update ephemeral OS disk for a virtual machine scale set VM
    #[serde(
        rename = "forceUpdateOSDiskForEphemeral",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub force_update_os_disk_for_ephemeral: ::std::option::Option<bool>,
    #[serde(
        rename = "osProfile",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_profile: ::std::option::Option<OsProfileProvisioningData>,
    ///Specifies whether to reimage temp disk. Default value: false. Note: This temp disk reimage parameter is only supported for VM/VMSS with Ephemeral OS disk.
    #[serde(
        rename = "tempDisk",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub temp_disk: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VirtualMachineScaleSetVmReimageParameters>
for VirtualMachineScaleSetVmReimageParameters {
    fn from(value: &VirtualMachineScaleSetVmReimageParameters) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineScaleSetVmReimageParameters {
    fn default() -> Self {
        Self {
            exact_version: Default::default(),
            force_update_os_disk_for_ephemeral: Default::default(),
            os_profile: Default::default(),
            temp_disk: Default::default(),
        }
    }
}
///Describes the properties of a VM size.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a VM size.",
///  "type": "object",
///  "properties": {
///    "maxDataDiskCount": {
///      "description": "The maximum number of data disks that can be attached to the virtual machine size.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "memoryInMB": {
///      "description": "The amount of memory, in MB, supported by the virtual machine size.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "name": {
///      "description": "The name of the virtual machine size.",
///      "type": "string"
///    },
///    "numberOfCores": {
///      "description": "The number of cores supported by the virtual machine size. For Constrained vCPU capable VM sizes, this number represents the total vCPUs of quota that the VM uses. For accurate vCPU count, please refer to https://docs.microsoft.com/azure/virtual-machines/constrained-vcpu or https://docs.microsoft.com/rest/api/compute/resourceskus/list",
///      "type": "integer",
///      "format": "int32"
///    },
///    "osDiskSizeInMB": {
///      "description": "The OS disk size, in MB, allowed by the virtual machine size.",
///      "type": "integer",
///      "format": "int32"
///    },
///    "resourceDiskSizeInMB": {
///      "description": "The resource disk size, in MB, allowed by the virtual machine size.",
///      "type": "integer",
///      "format": "int32"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineSize {
    ///The maximum number of data disks that can be attached to the virtual machine size.
    #[serde(
        rename = "maxDataDiskCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub max_data_disk_count: ::std::option::Option<i32>,
    ///The amount of memory, in MB, supported by the virtual machine size.
    #[serde(
        rename = "memoryInMB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub memory_in_mb: ::std::option::Option<i32>,
    ///The name of the virtual machine size.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///The number of cores supported by the virtual machine size. For Constrained vCPU capable VM sizes, this number represents the total vCPUs of quota that the VM uses. For accurate vCPU count, please refer to https://docs.microsoft.com/azure/virtual-machines/constrained-vcpu or https://docs.microsoft.com/rest/api/compute/resourceskus/list
    #[serde(
        rename = "numberOfCores",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub number_of_cores: ::std::option::Option<i32>,
    ///The OS disk size, in MB, allowed by the virtual machine size.
    #[serde(
        rename = "osDiskSizeInMB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub os_disk_size_in_mb: ::std::option::Option<i32>,
    ///The resource disk size, in MB, allowed by the virtual machine size.
    #[serde(
        rename = "resourceDiskSizeInMB",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub resource_disk_size_in_mb: ::std::option::Option<i32>,
}
impl ::std::convert::From<&VirtualMachineSize> for VirtualMachineSize {
    fn from(value: &VirtualMachineSize) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineSize {
    fn default() -> Self {
        Self {
            max_data_disk_count: Default::default(),
            memory_in_mb: Default::default(),
            name: Default::default(),
            number_of_cores: Default::default(),
            os_disk_size_in_mb: Default::default(),
            resource_disk_size_in_mb: Default::default(),
        }
    }
}
///The List Virtual Machine operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List Virtual Machine operation response.",
///  "type": "object",
///  "properties": {
///    "nextLink": {
///      "description": "The link to the next page of items.",
///      "type": "string"
///    },
///    "value": {
///      "description": "The list of virtual machine sizes.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineSize"
///      },
///      "x-ms-identifiers": [
///        "name"
///      ]
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineSizeListResult {
    ///The link to the next page of items.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of virtual machine sizes.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub value: ::std::vec::Vec<VirtualMachineSize>,
}
impl ::std::convert::From<&VirtualMachineSizeListResult>
for VirtualMachineSizeListResult {
    fn from(value: &VirtualMachineSizeListResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineSizeListResult {
    fn default() -> Self {
        Self {
            next_link: Default::default(),
            value: Default::default(),
        }
    }
}
///Specifies the size of the virtual machine. The enum data type is currently deprecated and will be removed by December 23rd 2023. The recommended way to get the list of available sizes is using these APIs: [List all available virtual machine sizes in an availability set](https://docs.microsoft.com/rest/api/compute/availabilitysets/listavailablesizes), [List all available virtual machine sizes in a region]( https://docs.microsoft.com/rest/api/compute/resourceskus/list), [List all available virtual machine sizes for resizing](https://docs.microsoft.com/rest/api/compute/virtualmachines/listavailablesizes). For more information about virtual machine sizes, see [Sizes for virtual machines](https://docs.microsoft.com/azure/virtual-machines/sizes). The available VM sizes depend on region and availability set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the size of the virtual machine. The enum data type is currently deprecated and will be removed by December 23rd 2023. The recommended way to get the list of available sizes is using these APIs: [List all available virtual machine sizes in an availability set](https://docs.microsoft.com/rest/api/compute/availabilitysets/listavailablesizes), [List all available virtual machine sizes in a region]( https://docs.microsoft.com/rest/api/compute/resourceskus/list), [List all available virtual machine sizes for resizing](https://docs.microsoft.com/rest/api/compute/virtualmachines/listavailablesizes). For more information about virtual machine sizes, see [Sizes for virtual machines](https://docs.microsoft.com/azure/virtual-machines/sizes). The available VM sizes depend on region and availability set.",
///  "type": "string",
///  "enum": [
///    "Basic_A0",
///    "Basic_A1",
///    "Basic_A2",
///    "Basic_A3",
///    "Basic_A4",
///    "Standard_A0",
///    "Standard_A1",
///    "Standard_A2",
///    "Standard_A3",
///    "Standard_A4",
///    "Standard_A5",
///    "Standard_A6",
///    "Standard_A7",
///    "Standard_A8",
///    "Standard_A9",
///    "Standard_A10",
///    "Standard_A11",
///    "Standard_A1_v2",
///    "Standard_A2_v2",
///    "Standard_A4_v2",
///    "Standard_A8_v2",
///    "Standard_A2m_v2",
///    "Standard_A4m_v2",
///    "Standard_A8m_v2",
///    "Standard_B1s",
///    "Standard_B1ms",
///    "Standard_B2s",
///    "Standard_B2ms",
///    "Standard_B4ms",
///    "Standard_B8ms",
///    "Standard_D1",
///    "Standard_D2",
///    "Standard_D3",
///    "Standard_D4",
///    "Standard_D11",
///    "Standard_D12",
///    "Standard_D13",
///    "Standard_D14",
///    "Standard_D1_v2",
///    "Standard_D2_v2",
///    "Standard_D3_v2",
///    "Standard_D4_v2",
///    "Standard_D5_v2",
///    "Standard_D2_v3",
///    "Standard_D4_v3",
///    "Standard_D8_v3",
///    "Standard_D16_v3",
///    "Standard_D32_v3",
///    "Standard_D64_v3",
///    "Standard_D2s_v3",
///    "Standard_D4s_v3",
///    "Standard_D8s_v3",
///    "Standard_D16s_v3",
///    "Standard_D32s_v3",
///    "Standard_D64s_v3",
///    "Standard_D11_v2",
///    "Standard_D12_v2",
///    "Standard_D13_v2",
///    "Standard_D14_v2",
///    "Standard_D15_v2",
///    "Standard_DS1",
///    "Standard_DS2",
///    "Standard_DS3",
///    "Standard_DS4",
///    "Standard_DS11",
///    "Standard_DS12",
///    "Standard_DS13",
///    "Standard_DS14",
///    "Standard_DS1_v2",
///    "Standard_DS2_v2",
///    "Standard_DS3_v2",
///    "Standard_DS4_v2",
///    "Standard_DS5_v2",
///    "Standard_DS11_v2",
///    "Standard_DS12_v2",
///    "Standard_DS13_v2",
///    "Standard_DS14_v2",
///    "Standard_DS15_v2",
///    "Standard_DS13-4_v2",
///    "Standard_DS13-2_v2",
///    "Standard_DS14-8_v2",
///    "Standard_DS14-4_v2",
///    "Standard_E2_v3",
///    "Standard_E4_v3",
///    "Standard_E8_v3",
///    "Standard_E16_v3",
///    "Standard_E32_v3",
///    "Standard_E64_v3",
///    "Standard_E2s_v3",
///    "Standard_E4s_v3",
///    "Standard_E8s_v3",
///    "Standard_E16s_v3",
///    "Standard_E32s_v3",
///    "Standard_E64s_v3",
///    "Standard_E32-16_v3",
///    "Standard_E32-8s_v3",
///    "Standard_E64-32s_v3",
///    "Standard_E64-16s_v3",
///    "Standard_F1",
///    "Standard_F2",
///    "Standard_F4",
///    "Standard_F8",
///    "Standard_F16",
///    "Standard_F1s",
///    "Standard_F2s",
///    "Standard_F4s",
///    "Standard_F8s",
///    "Standard_F16s",
///    "Standard_F2s_v2",
///    "Standard_F4s_v2",
///    "Standard_F8s_v2",
///    "Standard_F16s_v2",
///    "Standard_F32s_v2",
///    "Standard_F64s_v2",
///    "Standard_F72s_v2",
///    "Standard_G1",
///    "Standard_G2",
///    "Standard_G3",
///    "Standard_G4",
///    "Standard_G5",
///    "Standard_GS1",
///    "Standard_GS2",
///    "Standard_GS3",
///    "Standard_GS4",
///    "Standard_GS5",
///    "Standard_GS4-8",
///    "Standard_GS4-4",
///    "Standard_GS5-16",
///    "Standard_GS5-8",
///    "Standard_H8",
///    "Standard_H16",
///    "Standard_H8m",
///    "Standard_H16m",
///    "Standard_H16r",
///    "Standard_H16mr",
///    "Standard_L4s",
///    "Standard_L8s",
///    "Standard_L16s",
///    "Standard_L32s",
///    "Standard_M64s",
///    "Standard_M64ms",
///    "Standard_M128s",
///    "Standard_M128ms",
///    "Standard_M64-32ms",
///    "Standard_M64-16ms",
///    "Standard_M128-64ms",
///    "Standard_M128-32ms",
///    "Standard_NC6",
///    "Standard_NC12",
///    "Standard_NC24",
///    "Standard_NC24r",
///    "Standard_NC6s_v2",
///    "Standard_NC12s_v2",
///    "Standard_NC24s_v2",
///    "Standard_NC24rs_v2",
///    "Standard_NC6s_v3",
///    "Standard_NC12s_v3",
///    "Standard_NC24s_v3",
///    "Standard_NC24rs_v3",
///    "Standard_ND6s",
///    "Standard_ND12s",
///    "Standard_ND24s",
///    "Standard_ND24rs",
///    "Standard_NV6",
///    "Standard_NV12",
///    "Standard_NV24"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "VirtualMachineSizeTypes",
///    "values": [
///      {
///        "name": "Basic_A0",
///        "value": "Basic_A0"
///      },
///      {
///        "name": "Basic_A1",
///        "value": "Basic_A1"
///      },
///      {
///        "name": "Basic_A2",
///        "value": "Basic_A2"
///      },
///      {
///        "name": "Basic_A3",
///        "value": "Basic_A3"
///      },
///      {
///        "name": "Basic_A4",
///        "value": "Basic_A4"
///      },
///      {
///        "name": "Standard_A0",
///        "value": "Standard_A0"
///      },
///      {
///        "name": "Standard_A1",
///        "value": "Standard_A1"
///      },
///      {
///        "name": "Standard_A2",
///        "value": "Standard_A2"
///      },
///      {
///        "name": "Standard_A3",
///        "value": "Standard_A3"
///      },
///      {
///        "name": "Standard_A4",
///        "value": "Standard_A4"
///      },
///      {
///        "name": "Standard_A5",
///        "value": "Standard_A5"
///      },
///      {
///        "name": "Standard_A6",
///        "value": "Standard_A6"
///      },
///      {
///        "name": "Standard_A7",
///        "value": "Standard_A7"
///      },
///      {
///        "name": "Standard_A8",
///        "value": "Standard_A8"
///      },
///      {
///        "name": "Standard_A9",
///        "value": "Standard_A9"
///      },
///      {
///        "name": "Standard_A10",
///        "value": "Standard_A10"
///      },
///      {
///        "name": "Standard_A11",
///        "value": "Standard_A11"
///      },
///      {
///        "name": "Standard_A1_v2",
///        "value": "Standard_A1_v2"
///      },
///      {
///        "name": "Standard_A2_v2",
///        "value": "Standard_A2_v2"
///      },
///      {
///        "name": "Standard_A4_v2",
///        "value": "Standard_A4_v2"
///      },
///      {
///        "name": "Standard_A8_v2",
///        "value": "Standard_A8_v2"
///      },
///      {
///        "name": "Standard_A2m_v2",
///        "value": "Standard_A2m_v2"
///      },
///      {
///        "name": "Standard_A4m_v2",
///        "value": "Standard_A4m_v2"
///      },
///      {
///        "name": "Standard_A8m_v2",
///        "value": "Standard_A8m_v2"
///      },
///      {
///        "name": "Standard_B1s",
///        "value": "Standard_B1s"
///      },
///      {
///        "name": "Standard_B1ms",
///        "value": "Standard_B1ms"
///      },
///      {
///        "name": "Standard_B2s",
///        "value": "Standard_B2s"
///      },
///      {
///        "name": "Standard_B2ms",
///        "value": "Standard_B2ms"
///      },
///      {
///        "name": "Standard_B4ms",
///        "value": "Standard_B4ms"
///      },
///      {
///        "name": "Standard_B8ms",
///        "value": "Standard_B8ms"
///      },
///      {
///        "name": "Standard_D1",
///        "value": "Standard_D1"
///      },
///      {
///        "name": "Standard_D2",
///        "value": "Standard_D2"
///      },
///      {
///        "name": "Standard_D3",
///        "value": "Standard_D3"
///      },
///      {
///        "name": "Standard_D4",
///        "value": "Standard_D4"
///      },
///      {
///        "name": "Standard_D11",
///        "value": "Standard_D11"
///      },
///      {
///        "name": "Standard_D12",
///        "value": "Standard_D12"
///      },
///      {
///        "name": "Standard_D13",
///        "value": "Standard_D13"
///      },
///      {
///        "name": "Standard_D14",
///        "value": "Standard_D14"
///      },
///      {
///        "name": "Standard_D1_v2",
///        "value": "Standard_D1_v2"
///      },
///      {
///        "name": "Standard_D2_v2",
///        "value": "Standard_D2_v2"
///      },
///      {
///        "name": "Standard_D3_v2",
///        "value": "Standard_D3_v2"
///      },
///      {
///        "name": "Standard_D4_v2",
///        "value": "Standard_D4_v2"
///      },
///      {
///        "name": "Standard_D5_v2",
///        "value": "Standard_D5_v2"
///      },
///      {
///        "name": "Standard_D2_v3",
///        "value": "Standard_D2_v3"
///      },
///      {
///        "name": "Standard_D4_v3",
///        "value": "Standard_D4_v3"
///      },
///      {
///        "name": "Standard_D8_v3",
///        "value": "Standard_D8_v3"
///      },
///      {
///        "name": "Standard_D16_v3",
///        "value": "Standard_D16_v3"
///      },
///      {
///        "name": "Standard_D32_v3",
///        "value": "Standard_D32_v3"
///      },
///      {
///        "name": "Standard_D64_v3",
///        "value": "Standard_D64_v3"
///      },
///      {
///        "name": "Standard_D2s_v3",
///        "value": "Standard_D2s_v3"
///      },
///      {
///        "name": "Standard_D4s_v3",
///        "value": "Standard_D4s_v3"
///      },
///      {
///        "name": "Standard_D8s_v3",
///        "value": "Standard_D8s_v3"
///      },
///      {
///        "name": "Standard_D16s_v3",
///        "value": "Standard_D16s_v3"
///      },
///      {
///        "name": "Standard_D32s_v3",
///        "value": "Standard_D32s_v3"
///      },
///      {
///        "name": "Standard_D64s_v3",
///        "value": "Standard_D64s_v3"
///      },
///      {
///        "name": "Standard_D11_v2",
///        "value": "Standard_D11_v2"
///      },
///      {
///        "name": "Standard_D12_v2",
///        "value": "Standard_D12_v2"
///      },
///      {
///        "name": "Standard_D13_v2",
///        "value": "Standard_D13_v2"
///      },
///      {
///        "name": "Standard_D14_v2",
///        "value": "Standard_D14_v2"
///      },
///      {
///        "name": "Standard_D15_v2",
///        "value": "Standard_D15_v2"
///      },
///      {
///        "name": "Standard_DS1",
///        "value": "Standard_DS1"
///      },
///      {
///        "name": "Standard_DS2",
///        "value": "Standard_DS2"
///      },
///      {
///        "name": "Standard_DS3",
///        "value": "Standard_DS3"
///      },
///      {
///        "name": "Standard_DS4",
///        "value": "Standard_DS4"
///      },
///      {
///        "name": "Standard_DS11",
///        "value": "Standard_DS11"
///      },
///      {
///        "name": "Standard_DS12",
///        "value": "Standard_DS12"
///      },
///      {
///        "name": "Standard_DS13",
///        "value": "Standard_DS13"
///      },
///      {
///        "name": "Standard_DS14",
///        "value": "Standard_DS14"
///      },
///      {
///        "name": "Standard_DS1_v2",
///        "value": "Standard_DS1_v2"
///      },
///      {
///        "name": "Standard_DS2_v2",
///        "value": "Standard_DS2_v2"
///      },
///      {
///        "name": "Standard_DS3_v2",
///        "value": "Standard_DS3_v2"
///      },
///      {
///        "name": "Standard_DS4_v2",
///        "value": "Standard_DS4_v2"
///      },
///      {
///        "name": "Standard_DS5_v2",
///        "value": "Standard_DS5_v2"
///      },
///      {
///        "name": "Standard_DS11_v2",
///        "value": "Standard_DS11_v2"
///      },
///      {
///        "name": "Standard_DS12_v2",
///        "value": "Standard_DS12_v2"
///      },
///      {
///        "name": "Standard_DS13_v2",
///        "value": "Standard_DS13_v2"
///      },
///      {
///        "name": "Standard_DS14_v2",
///        "value": "Standard_DS14_v2"
///      },
///      {
///        "name": "Standard_DS15_v2",
///        "value": "Standard_DS15_v2"
///      },
///      {
///        "name": "Standard_DS13-4_v2",
///        "value": "Standard_DS13-4_v2"
///      },
///      {
///        "name": "Standard_DS13-2_v2",
///        "value": "Standard_DS13-2_v2"
///      },
///      {
///        "name": "Standard_DS14-8_v2",
///        "value": "Standard_DS14-8_v2"
///      },
///      {
///        "name": "Standard_DS14-4_v2",
///        "value": "Standard_DS14-4_v2"
///      },
///      {
///        "name": "Standard_E2_v3",
///        "value": "Standard_E2_v3"
///      },
///      {
///        "name": "Standard_E4_v3",
///        "value": "Standard_E4_v3"
///      },
///      {
///        "name": "Standard_E8_v3",
///        "value": "Standard_E8_v3"
///      },
///      {
///        "name": "Standard_E16_v3",
///        "value": "Standard_E16_v3"
///      },
///      {
///        "name": "Standard_E32_v3",
///        "value": "Standard_E32_v3"
///      },
///      {
///        "name": "Standard_E64_v3",
///        "value": "Standard_E64_v3"
///      },
///      {
///        "name": "Standard_E2s_v3",
///        "value": "Standard_E2s_v3"
///      },
///      {
///        "name": "Standard_E4s_v3",
///        "value": "Standard_E4s_v3"
///      },
///      {
///        "name": "Standard_E8s_v3",
///        "value": "Standard_E8s_v3"
///      },
///      {
///        "name": "Standard_E16s_v3",
///        "value": "Standard_E16s_v3"
///      },
///      {
///        "name": "Standard_E32s_v3",
///        "value": "Standard_E32s_v3"
///      },
///      {
///        "name": "Standard_E64s_v3",
///        "value": "Standard_E64s_v3"
///      },
///      {
///        "name": "Standard_E32-16_v3",
///        "value": "Standard_E32-16_v3"
///      },
///      {
///        "name": "Standard_E32-8s_v3",
///        "value": "Standard_E32-8s_v3"
///      },
///      {
///        "name": "Standard_E64-32s_v3",
///        "value": "Standard_E64-32s_v3"
///      },
///      {
///        "name": "Standard_E64-16s_v3",
///        "value": "Standard_E64-16s_v3"
///      },
///      {
///        "name": "Standard_F1",
///        "value": "Standard_F1"
///      },
///      {
///        "name": "Standard_F2",
///        "value": "Standard_F2"
///      },
///      {
///        "name": "Standard_F4",
///        "value": "Standard_F4"
///      },
///      {
///        "name": "Standard_F8",
///        "value": "Standard_F8"
///      },
///      {
///        "name": "Standard_F16",
///        "value": "Standard_F16"
///      },
///      {
///        "name": "Standard_F1s",
///        "value": "Standard_F1s"
///      },
///      {
///        "name": "Standard_F2s",
///        "value": "Standard_F2s"
///      },
///      {
///        "name": "Standard_F4s",
///        "value": "Standard_F4s"
///      },
///      {
///        "name": "Standard_F8s",
///        "value": "Standard_F8s"
///      },
///      {
///        "name": "Standard_F16s",
///        "value": "Standard_F16s"
///      },
///      {
///        "name": "Standard_F2s_v2",
///        "value": "Standard_F2s_v2"
///      },
///      {
///        "name": "Standard_F4s_v2",
///        "value": "Standard_F4s_v2"
///      },
///      {
///        "name": "Standard_F8s_v2",
///        "value": "Standard_F8s_v2"
///      },
///      {
///        "name": "Standard_F16s_v2",
///        "value": "Standard_F16s_v2"
///      },
///      {
///        "name": "Standard_F32s_v2",
///        "value": "Standard_F32s_v2"
///      },
///      {
///        "name": "Standard_F64s_v2",
///        "value": "Standard_F64s_v2"
///      },
///      {
///        "name": "Standard_F72s_v2",
///        "value": "Standard_F72s_v2"
///      },
///      {
///        "name": "Standard_G1",
///        "value": "Standard_G1"
///      },
///      {
///        "name": "Standard_G2",
///        "value": "Standard_G2"
///      },
///      {
///        "name": "Standard_G3",
///        "value": "Standard_G3"
///      },
///      {
///        "name": "Standard_G4",
///        "value": "Standard_G4"
///      },
///      {
///        "name": "Standard_G5",
///        "value": "Standard_G5"
///      },
///      {
///        "name": "Standard_GS1",
///        "value": "Standard_GS1"
///      },
///      {
///        "name": "Standard_GS2",
///        "value": "Standard_GS2"
///      },
///      {
///        "name": "Standard_GS3",
///        "value": "Standard_GS3"
///      },
///      {
///        "name": "Standard_GS4",
///        "value": "Standard_GS4"
///      },
///      {
///        "name": "Standard_GS5",
///        "value": "Standard_GS5"
///      },
///      {
///        "name": "Standard_GS4-8",
///        "value": "Standard_GS4-8"
///      },
///      {
///        "name": "Standard_GS4-4",
///        "value": "Standard_GS4-4"
///      },
///      {
///        "name": "Standard_GS5-16",
///        "value": "Standard_GS5-16"
///      },
///      {
///        "name": "Standard_GS5-8",
///        "value": "Standard_GS5-8"
///      },
///      {
///        "name": "Standard_H8",
///        "value": "Standard_H8"
///      },
///      {
///        "name": "Standard_H16",
///        "value": "Standard_H16"
///      },
///      {
///        "name": "Standard_H8m",
///        "value": "Standard_H8m"
///      },
///      {
///        "name": "Standard_H16m",
///        "value": "Standard_H16m"
///      },
///      {
///        "name": "Standard_H16r",
///        "value": "Standard_H16r"
///      },
///      {
///        "name": "Standard_H16mr",
///        "value": "Standard_H16mr"
///      },
///      {
///        "name": "Standard_L4s",
///        "value": "Standard_L4s"
///      },
///      {
///        "name": "Standard_L8s",
///        "value": "Standard_L8s"
///      },
///      {
///        "name": "Standard_L16s",
///        "value": "Standard_L16s"
///      },
///      {
///        "name": "Standard_L32s",
///        "value": "Standard_L32s"
///      },
///      {
///        "name": "Standard_M64s",
///        "value": "Standard_M64s"
///      },
///      {
///        "name": "Standard_M64ms",
///        "value": "Standard_M64ms"
///      },
///      {
///        "name": "Standard_M128s",
///        "value": "Standard_M128s"
///      },
///      {
///        "name": "Standard_M128ms",
///        "value": "Standard_M128ms"
///      },
///      {
///        "name": "Standard_M64-32ms",
///        "value": "Standard_M64-32ms"
///      },
///      {
///        "name": "Standard_M64-16ms",
///        "value": "Standard_M64-16ms"
///      },
///      {
///        "name": "Standard_M128-64ms",
///        "value": "Standard_M128-64ms"
///      },
///      {
///        "name": "Standard_M128-32ms",
///        "value": "Standard_M128-32ms"
///      },
///      {
///        "name": "Standard_NC6",
///        "value": "Standard_NC6"
///      },
///      {
///        "name": "Standard_NC12",
///        "value": "Standard_NC12"
///      },
///      {
///        "name": "Standard_NC24",
///        "value": "Standard_NC24"
///      },
///      {
///        "name": "Standard_NC24r",
///        "value": "Standard_NC24r"
///      },
///      {
///        "name": "Standard_NC6s_v2",
///        "value": "Standard_NC6s_v2"
///      },
///      {
///        "name": "Standard_NC12s_v2",
///        "value": "Standard_NC12s_v2"
///      },
///      {
///        "name": "Standard_NC24s_v2",
///        "value": "Standard_NC24s_v2"
///      },
///      {
///        "name": "Standard_NC24rs_v2",
///        "value": "Standard_NC24rs_v2"
///      },
///      {
///        "name": "Standard_NC6s_v3",
///        "value": "Standard_NC6s_v3"
///      },
///      {
///        "name": "Standard_NC12s_v3",
///        "value": "Standard_NC12s_v3"
///      },
///      {
///        "name": "Standard_NC24s_v3",
///        "value": "Standard_NC24s_v3"
///      },
///      {
///        "name": "Standard_NC24rs_v3",
///        "value": "Standard_NC24rs_v3"
///      },
///      {
///        "name": "Standard_ND6s",
///        "value": "Standard_ND6s"
///      },
///      {
///        "name": "Standard_ND12s",
///        "value": "Standard_ND12s"
///      },
///      {
///        "name": "Standard_ND24s",
///        "value": "Standard_ND24s"
///      },
///      {
///        "name": "Standard_ND24rs",
///        "value": "Standard_ND24rs"
///      },
///      {
///        "name": "Standard_NV6",
///        "value": "Standard_NV6"
///      },
///      {
///        "name": "Standard_NV12",
///        "value": "Standard_NV12"
///      },
///      {
///        "name": "Standard_NV24",
///        "value": "Standard_NV24"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum VirtualMachineSizeTypes {
    #[serde(rename = "Basic_A0")]
    BasicA0,
    #[serde(rename = "Basic_A1")]
    BasicA1,
    #[serde(rename = "Basic_A2")]
    BasicA2,
    #[serde(rename = "Basic_A3")]
    BasicA3,
    #[serde(rename = "Basic_A4")]
    BasicA4,
    #[serde(rename = "Standard_A0")]
    StandardA0,
    #[serde(rename = "Standard_A1")]
    StandardA1,
    #[serde(rename = "Standard_A2")]
    StandardA2,
    #[serde(rename = "Standard_A3")]
    StandardA3,
    #[serde(rename = "Standard_A4")]
    StandardA4,
    #[serde(rename = "Standard_A5")]
    StandardA5,
    #[serde(rename = "Standard_A6")]
    StandardA6,
    #[serde(rename = "Standard_A7")]
    StandardA7,
    #[serde(rename = "Standard_A8")]
    StandardA8,
    #[serde(rename = "Standard_A9")]
    StandardA9,
    #[serde(rename = "Standard_A10")]
    StandardA10,
    #[serde(rename = "Standard_A11")]
    StandardA11,
    #[serde(rename = "Standard_A1_v2")]
    StandardA1V2,
    #[serde(rename = "Standard_A2_v2")]
    StandardA2V2,
    #[serde(rename = "Standard_A4_v2")]
    StandardA4V2,
    #[serde(rename = "Standard_A8_v2")]
    StandardA8V2,
    #[serde(rename = "Standard_A2m_v2")]
    StandardA2mV2,
    #[serde(rename = "Standard_A4m_v2")]
    StandardA4mV2,
    #[serde(rename = "Standard_A8m_v2")]
    StandardA8mV2,
    #[serde(rename = "Standard_B1s")]
    StandardB1s,
    #[serde(rename = "Standard_B1ms")]
    StandardB1ms,
    #[serde(rename = "Standard_B2s")]
    StandardB2s,
    #[serde(rename = "Standard_B2ms")]
    StandardB2ms,
    #[serde(rename = "Standard_B4ms")]
    StandardB4ms,
    #[serde(rename = "Standard_B8ms")]
    StandardB8ms,
    #[serde(rename = "Standard_D1")]
    StandardD1,
    #[serde(rename = "Standard_D2")]
    StandardD2,
    #[serde(rename = "Standard_D3")]
    StandardD3,
    #[serde(rename = "Standard_D4")]
    StandardD4,
    #[serde(rename = "Standard_D11")]
    StandardD11,
    #[serde(rename = "Standard_D12")]
    StandardD12,
    #[serde(rename = "Standard_D13")]
    StandardD13,
    #[serde(rename = "Standard_D14")]
    StandardD14,
    #[serde(rename = "Standard_D1_v2")]
    StandardD1V2,
    #[serde(rename = "Standard_D2_v2")]
    StandardD2V2,
    #[serde(rename = "Standard_D3_v2")]
    StandardD3V2,
    #[serde(rename = "Standard_D4_v2")]
    StandardD4V2,
    #[serde(rename = "Standard_D5_v2")]
    StandardD5V2,
    #[serde(rename = "Standard_D2_v3")]
    StandardD2V3,
    #[serde(rename = "Standard_D4_v3")]
    StandardD4V3,
    #[serde(rename = "Standard_D8_v3")]
    StandardD8V3,
    #[serde(rename = "Standard_D16_v3")]
    StandardD16V3,
    #[serde(rename = "Standard_D32_v3")]
    StandardD32V3,
    #[serde(rename = "Standard_D64_v3")]
    StandardD64V3,
    #[serde(rename = "Standard_D2s_v3")]
    StandardD2sV3,
    #[serde(rename = "Standard_D4s_v3")]
    StandardD4sV3,
    #[serde(rename = "Standard_D8s_v3")]
    StandardD8sV3,
    #[serde(rename = "Standard_D16s_v3")]
    StandardD16sV3,
    #[serde(rename = "Standard_D32s_v3")]
    StandardD32sV3,
    #[serde(rename = "Standard_D64s_v3")]
    StandardD64sV3,
    #[serde(rename = "Standard_D11_v2")]
    StandardD11V2,
    #[serde(rename = "Standard_D12_v2")]
    StandardD12V2,
    #[serde(rename = "Standard_D13_v2")]
    StandardD13V2,
    #[serde(rename = "Standard_D14_v2")]
    StandardD14V2,
    #[serde(rename = "Standard_D15_v2")]
    StandardD15V2,
    #[serde(rename = "Standard_DS1")]
    StandardDs1,
    #[serde(rename = "Standard_DS2")]
    StandardDs2,
    #[serde(rename = "Standard_DS3")]
    StandardDs3,
    #[serde(rename = "Standard_DS4")]
    StandardDs4,
    #[serde(rename = "Standard_DS11")]
    StandardDs11,
    #[serde(rename = "Standard_DS12")]
    StandardDs12,
    #[serde(rename = "Standard_DS13")]
    StandardDs13,
    #[serde(rename = "Standard_DS14")]
    StandardDs14,
    #[serde(rename = "Standard_DS1_v2")]
    StandardDs1V2,
    #[serde(rename = "Standard_DS2_v2")]
    StandardDs2V2,
    #[serde(rename = "Standard_DS3_v2")]
    StandardDs3V2,
    #[serde(rename = "Standard_DS4_v2")]
    StandardDs4V2,
    #[serde(rename = "Standard_DS5_v2")]
    StandardDs5V2,
    #[serde(rename = "Standard_DS11_v2")]
    StandardDs11V2,
    #[serde(rename = "Standard_DS12_v2")]
    StandardDs12V2,
    #[serde(rename = "Standard_DS13_v2")]
    StandardDs13V2,
    #[serde(rename = "Standard_DS14_v2")]
    StandardDs14V2,
    #[serde(rename = "Standard_DS15_v2")]
    StandardDs15V2,
    #[serde(rename = "Standard_DS13-4_v2")]
    StandardDs134V2,
    #[serde(rename = "Standard_DS13-2_v2")]
    StandardDs132V2,
    #[serde(rename = "Standard_DS14-8_v2")]
    StandardDs148V2,
    #[serde(rename = "Standard_DS14-4_v2")]
    StandardDs144V2,
    #[serde(rename = "Standard_E2_v3")]
    StandardE2V3,
    #[serde(rename = "Standard_E4_v3")]
    StandardE4V3,
    #[serde(rename = "Standard_E8_v3")]
    StandardE8V3,
    #[serde(rename = "Standard_E16_v3")]
    StandardE16V3,
    #[serde(rename = "Standard_E32_v3")]
    StandardE32V3,
    #[serde(rename = "Standard_E64_v3")]
    StandardE64V3,
    #[serde(rename = "Standard_E2s_v3")]
    StandardE2sV3,
    #[serde(rename = "Standard_E4s_v3")]
    StandardE4sV3,
    #[serde(rename = "Standard_E8s_v3")]
    StandardE8sV3,
    #[serde(rename = "Standard_E16s_v3")]
    StandardE16sV3,
    #[serde(rename = "Standard_E32s_v3")]
    StandardE32sV3,
    #[serde(rename = "Standard_E64s_v3")]
    StandardE64sV3,
    #[serde(rename = "Standard_E32-16_v3")]
    StandardE3216V3,
    #[serde(rename = "Standard_E32-8s_v3")]
    StandardE328sV3,
    #[serde(rename = "Standard_E64-32s_v3")]
    StandardE6432sV3,
    #[serde(rename = "Standard_E64-16s_v3")]
    StandardE6416sV3,
    #[serde(rename = "Standard_F1")]
    StandardF1,
    #[serde(rename = "Standard_F2")]
    StandardF2,
    #[serde(rename = "Standard_F4")]
    StandardF4,
    #[serde(rename = "Standard_F8")]
    StandardF8,
    #[serde(rename = "Standard_F16")]
    StandardF16,
    #[serde(rename = "Standard_F1s")]
    StandardF1s,
    #[serde(rename = "Standard_F2s")]
    StandardF2s,
    #[serde(rename = "Standard_F4s")]
    StandardF4s,
    #[serde(rename = "Standard_F8s")]
    StandardF8s,
    #[serde(rename = "Standard_F16s")]
    StandardF16s,
    #[serde(rename = "Standard_F2s_v2")]
    StandardF2sV2,
    #[serde(rename = "Standard_F4s_v2")]
    StandardF4sV2,
    #[serde(rename = "Standard_F8s_v2")]
    StandardF8sV2,
    #[serde(rename = "Standard_F16s_v2")]
    StandardF16sV2,
    #[serde(rename = "Standard_F32s_v2")]
    StandardF32sV2,
    #[serde(rename = "Standard_F64s_v2")]
    StandardF64sV2,
    #[serde(rename = "Standard_F72s_v2")]
    StandardF72sV2,
    #[serde(rename = "Standard_G1")]
    StandardG1,
    #[serde(rename = "Standard_G2")]
    StandardG2,
    #[serde(rename = "Standard_G3")]
    StandardG3,
    #[serde(rename = "Standard_G4")]
    StandardG4,
    #[serde(rename = "Standard_G5")]
    StandardG5,
    #[serde(rename = "Standard_GS1")]
    StandardGs1,
    #[serde(rename = "Standard_GS2")]
    StandardGs2,
    #[serde(rename = "Standard_GS3")]
    StandardGs3,
    #[serde(rename = "Standard_GS4")]
    StandardGs4,
    #[serde(rename = "Standard_GS5")]
    StandardGs5,
    #[serde(rename = "Standard_GS4-8")]
    StandardGs48,
    #[serde(rename = "Standard_GS4-4")]
    StandardGs44,
    #[serde(rename = "Standard_GS5-16")]
    StandardGs516,
    #[serde(rename = "Standard_GS5-8")]
    StandardGs58,
    #[serde(rename = "Standard_H8")]
    StandardH8,
    #[serde(rename = "Standard_H16")]
    StandardH16,
    #[serde(rename = "Standard_H8m")]
    StandardH8m,
    #[serde(rename = "Standard_H16m")]
    StandardH16m,
    #[serde(rename = "Standard_H16r")]
    StandardH16r,
    #[serde(rename = "Standard_H16mr")]
    StandardH16mr,
    #[serde(rename = "Standard_L4s")]
    StandardL4s,
    #[serde(rename = "Standard_L8s")]
    StandardL8s,
    #[serde(rename = "Standard_L16s")]
    StandardL16s,
    #[serde(rename = "Standard_L32s")]
    StandardL32s,
    #[serde(rename = "Standard_M64s")]
    StandardM64s,
    #[serde(rename = "Standard_M64ms")]
    StandardM64ms,
    #[serde(rename = "Standard_M128s")]
    StandardM128s,
    #[serde(rename = "Standard_M128ms")]
    StandardM128ms,
    #[serde(rename = "Standard_M64-32ms")]
    StandardM6432ms,
    #[serde(rename = "Standard_M64-16ms")]
    StandardM6416ms,
    #[serde(rename = "Standard_M128-64ms")]
    StandardM12864ms,
    #[serde(rename = "Standard_M128-32ms")]
    StandardM12832ms,
    #[serde(rename = "Standard_NC6")]
    StandardNc6,
    #[serde(rename = "Standard_NC12")]
    StandardNc12,
    #[serde(rename = "Standard_NC24")]
    StandardNc24,
    #[serde(rename = "Standard_NC24r")]
    StandardNc24r,
    #[serde(rename = "Standard_NC6s_v2")]
    StandardNc6sV2,
    #[serde(rename = "Standard_NC12s_v2")]
    StandardNc12sV2,
    #[serde(rename = "Standard_NC24s_v2")]
    StandardNc24sV2,
    #[serde(rename = "Standard_NC24rs_v2")]
    StandardNc24rsV2,
    #[serde(rename = "Standard_NC6s_v3")]
    StandardNc6sV3,
    #[serde(rename = "Standard_NC12s_v3")]
    StandardNc12sV3,
    #[serde(rename = "Standard_NC24s_v3")]
    StandardNc24sV3,
    #[serde(rename = "Standard_NC24rs_v3")]
    StandardNc24rsV3,
    #[serde(rename = "Standard_ND6s")]
    StandardNd6s,
    #[serde(rename = "Standard_ND12s")]
    StandardNd12s,
    #[serde(rename = "Standard_ND24s")]
    StandardNd24s,
    #[serde(rename = "Standard_ND24rs")]
    StandardNd24rs,
    #[serde(rename = "Standard_NV6")]
    StandardNv6,
    #[serde(rename = "Standard_NV12")]
    StandardNv12,
    #[serde(rename = "Standard_NV24")]
    StandardNv24,
}
impl ::std::convert::From<&Self> for VirtualMachineSizeTypes {
    fn from(value: &VirtualMachineSizeTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for VirtualMachineSizeTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::BasicA0 => f.write_str("Basic_A0"),
            Self::BasicA1 => f.write_str("Basic_A1"),
            Self::BasicA2 => f.write_str("Basic_A2"),
            Self::BasicA3 => f.write_str("Basic_A3"),
            Self::BasicA4 => f.write_str("Basic_A4"),
            Self::StandardA0 => f.write_str("Standard_A0"),
            Self::StandardA1 => f.write_str("Standard_A1"),
            Self::StandardA2 => f.write_str("Standard_A2"),
            Self::StandardA3 => f.write_str("Standard_A3"),
            Self::StandardA4 => f.write_str("Standard_A4"),
            Self::StandardA5 => f.write_str("Standard_A5"),
            Self::StandardA6 => f.write_str("Standard_A6"),
            Self::StandardA7 => f.write_str("Standard_A7"),
            Self::StandardA8 => f.write_str("Standard_A8"),
            Self::StandardA9 => f.write_str("Standard_A9"),
            Self::StandardA10 => f.write_str("Standard_A10"),
            Self::StandardA11 => f.write_str("Standard_A11"),
            Self::StandardA1V2 => f.write_str("Standard_A1_v2"),
            Self::StandardA2V2 => f.write_str("Standard_A2_v2"),
            Self::StandardA4V2 => f.write_str("Standard_A4_v2"),
            Self::StandardA8V2 => f.write_str("Standard_A8_v2"),
            Self::StandardA2mV2 => f.write_str("Standard_A2m_v2"),
            Self::StandardA4mV2 => f.write_str("Standard_A4m_v2"),
            Self::StandardA8mV2 => f.write_str("Standard_A8m_v2"),
            Self::StandardB1s => f.write_str("Standard_B1s"),
            Self::StandardB1ms => f.write_str("Standard_B1ms"),
            Self::StandardB2s => f.write_str("Standard_B2s"),
            Self::StandardB2ms => f.write_str("Standard_B2ms"),
            Self::StandardB4ms => f.write_str("Standard_B4ms"),
            Self::StandardB8ms => f.write_str("Standard_B8ms"),
            Self::StandardD1 => f.write_str("Standard_D1"),
            Self::StandardD2 => f.write_str("Standard_D2"),
            Self::StandardD3 => f.write_str("Standard_D3"),
            Self::StandardD4 => f.write_str("Standard_D4"),
            Self::StandardD11 => f.write_str("Standard_D11"),
            Self::StandardD12 => f.write_str("Standard_D12"),
            Self::StandardD13 => f.write_str("Standard_D13"),
            Self::StandardD14 => f.write_str("Standard_D14"),
            Self::StandardD1V2 => f.write_str("Standard_D1_v2"),
            Self::StandardD2V2 => f.write_str("Standard_D2_v2"),
            Self::StandardD3V2 => f.write_str("Standard_D3_v2"),
            Self::StandardD4V2 => f.write_str("Standard_D4_v2"),
            Self::StandardD5V2 => f.write_str("Standard_D5_v2"),
            Self::StandardD2V3 => f.write_str("Standard_D2_v3"),
            Self::StandardD4V3 => f.write_str("Standard_D4_v3"),
            Self::StandardD8V3 => f.write_str("Standard_D8_v3"),
            Self::StandardD16V3 => f.write_str("Standard_D16_v3"),
            Self::StandardD32V3 => f.write_str("Standard_D32_v3"),
            Self::StandardD64V3 => f.write_str("Standard_D64_v3"),
            Self::StandardD2sV3 => f.write_str("Standard_D2s_v3"),
            Self::StandardD4sV3 => f.write_str("Standard_D4s_v3"),
            Self::StandardD8sV3 => f.write_str("Standard_D8s_v3"),
            Self::StandardD16sV3 => f.write_str("Standard_D16s_v3"),
            Self::StandardD32sV3 => f.write_str("Standard_D32s_v3"),
            Self::StandardD64sV3 => f.write_str("Standard_D64s_v3"),
            Self::StandardD11V2 => f.write_str("Standard_D11_v2"),
            Self::StandardD12V2 => f.write_str("Standard_D12_v2"),
            Self::StandardD13V2 => f.write_str("Standard_D13_v2"),
            Self::StandardD14V2 => f.write_str("Standard_D14_v2"),
            Self::StandardD15V2 => f.write_str("Standard_D15_v2"),
            Self::StandardDs1 => f.write_str("Standard_DS1"),
            Self::StandardDs2 => f.write_str("Standard_DS2"),
            Self::StandardDs3 => f.write_str("Standard_DS3"),
            Self::StandardDs4 => f.write_str("Standard_DS4"),
            Self::StandardDs11 => f.write_str("Standard_DS11"),
            Self::StandardDs12 => f.write_str("Standard_DS12"),
            Self::StandardDs13 => f.write_str("Standard_DS13"),
            Self::StandardDs14 => f.write_str("Standard_DS14"),
            Self::StandardDs1V2 => f.write_str("Standard_DS1_v2"),
            Self::StandardDs2V2 => f.write_str("Standard_DS2_v2"),
            Self::StandardDs3V2 => f.write_str("Standard_DS3_v2"),
            Self::StandardDs4V2 => f.write_str("Standard_DS4_v2"),
            Self::StandardDs5V2 => f.write_str("Standard_DS5_v2"),
            Self::StandardDs11V2 => f.write_str("Standard_DS11_v2"),
            Self::StandardDs12V2 => f.write_str("Standard_DS12_v2"),
            Self::StandardDs13V2 => f.write_str("Standard_DS13_v2"),
            Self::StandardDs14V2 => f.write_str("Standard_DS14_v2"),
            Self::StandardDs15V2 => f.write_str("Standard_DS15_v2"),
            Self::StandardDs134V2 => f.write_str("Standard_DS13-4_v2"),
            Self::StandardDs132V2 => f.write_str("Standard_DS13-2_v2"),
            Self::StandardDs148V2 => f.write_str("Standard_DS14-8_v2"),
            Self::StandardDs144V2 => f.write_str("Standard_DS14-4_v2"),
            Self::StandardE2V3 => f.write_str("Standard_E2_v3"),
            Self::StandardE4V3 => f.write_str("Standard_E4_v3"),
            Self::StandardE8V3 => f.write_str("Standard_E8_v3"),
            Self::StandardE16V3 => f.write_str("Standard_E16_v3"),
            Self::StandardE32V3 => f.write_str("Standard_E32_v3"),
            Self::StandardE64V3 => f.write_str("Standard_E64_v3"),
            Self::StandardE2sV3 => f.write_str("Standard_E2s_v3"),
            Self::StandardE4sV3 => f.write_str("Standard_E4s_v3"),
            Self::StandardE8sV3 => f.write_str("Standard_E8s_v3"),
            Self::StandardE16sV3 => f.write_str("Standard_E16s_v3"),
            Self::StandardE32sV3 => f.write_str("Standard_E32s_v3"),
            Self::StandardE64sV3 => f.write_str("Standard_E64s_v3"),
            Self::StandardE3216V3 => f.write_str("Standard_E32-16_v3"),
            Self::StandardE328sV3 => f.write_str("Standard_E32-8s_v3"),
            Self::StandardE6432sV3 => f.write_str("Standard_E64-32s_v3"),
            Self::StandardE6416sV3 => f.write_str("Standard_E64-16s_v3"),
            Self::StandardF1 => f.write_str("Standard_F1"),
            Self::StandardF2 => f.write_str("Standard_F2"),
            Self::StandardF4 => f.write_str("Standard_F4"),
            Self::StandardF8 => f.write_str("Standard_F8"),
            Self::StandardF16 => f.write_str("Standard_F16"),
            Self::StandardF1s => f.write_str("Standard_F1s"),
            Self::StandardF2s => f.write_str("Standard_F2s"),
            Self::StandardF4s => f.write_str("Standard_F4s"),
            Self::StandardF8s => f.write_str("Standard_F8s"),
            Self::StandardF16s => f.write_str("Standard_F16s"),
            Self::StandardF2sV2 => f.write_str("Standard_F2s_v2"),
            Self::StandardF4sV2 => f.write_str("Standard_F4s_v2"),
            Self::StandardF8sV2 => f.write_str("Standard_F8s_v2"),
            Self::StandardF16sV2 => f.write_str("Standard_F16s_v2"),
            Self::StandardF32sV2 => f.write_str("Standard_F32s_v2"),
            Self::StandardF64sV2 => f.write_str("Standard_F64s_v2"),
            Self::StandardF72sV2 => f.write_str("Standard_F72s_v2"),
            Self::StandardG1 => f.write_str("Standard_G1"),
            Self::StandardG2 => f.write_str("Standard_G2"),
            Self::StandardG3 => f.write_str("Standard_G3"),
            Self::StandardG4 => f.write_str("Standard_G4"),
            Self::StandardG5 => f.write_str("Standard_G5"),
            Self::StandardGs1 => f.write_str("Standard_GS1"),
            Self::StandardGs2 => f.write_str("Standard_GS2"),
            Self::StandardGs3 => f.write_str("Standard_GS3"),
            Self::StandardGs4 => f.write_str("Standard_GS4"),
            Self::StandardGs5 => f.write_str("Standard_GS5"),
            Self::StandardGs48 => f.write_str("Standard_GS4-8"),
            Self::StandardGs44 => f.write_str("Standard_GS4-4"),
            Self::StandardGs516 => f.write_str("Standard_GS5-16"),
            Self::StandardGs58 => f.write_str("Standard_GS5-8"),
            Self::StandardH8 => f.write_str("Standard_H8"),
            Self::StandardH16 => f.write_str("Standard_H16"),
            Self::StandardH8m => f.write_str("Standard_H8m"),
            Self::StandardH16m => f.write_str("Standard_H16m"),
            Self::StandardH16r => f.write_str("Standard_H16r"),
            Self::StandardH16mr => f.write_str("Standard_H16mr"),
            Self::StandardL4s => f.write_str("Standard_L4s"),
            Self::StandardL8s => f.write_str("Standard_L8s"),
            Self::StandardL16s => f.write_str("Standard_L16s"),
            Self::StandardL32s => f.write_str("Standard_L32s"),
            Self::StandardM64s => f.write_str("Standard_M64s"),
            Self::StandardM64ms => f.write_str("Standard_M64ms"),
            Self::StandardM128s => f.write_str("Standard_M128s"),
            Self::StandardM128ms => f.write_str("Standard_M128ms"),
            Self::StandardM6432ms => f.write_str("Standard_M64-32ms"),
            Self::StandardM6416ms => f.write_str("Standard_M64-16ms"),
            Self::StandardM12864ms => f.write_str("Standard_M128-64ms"),
            Self::StandardM12832ms => f.write_str("Standard_M128-32ms"),
            Self::StandardNc6 => f.write_str("Standard_NC6"),
            Self::StandardNc12 => f.write_str("Standard_NC12"),
            Self::StandardNc24 => f.write_str("Standard_NC24"),
            Self::StandardNc24r => f.write_str("Standard_NC24r"),
            Self::StandardNc6sV2 => f.write_str("Standard_NC6s_v2"),
            Self::StandardNc12sV2 => f.write_str("Standard_NC12s_v2"),
            Self::StandardNc24sV2 => f.write_str("Standard_NC24s_v2"),
            Self::StandardNc24rsV2 => f.write_str("Standard_NC24rs_v2"),
            Self::StandardNc6sV3 => f.write_str("Standard_NC6s_v3"),
            Self::StandardNc12sV3 => f.write_str("Standard_NC12s_v3"),
            Self::StandardNc24sV3 => f.write_str("Standard_NC24s_v3"),
            Self::StandardNc24rsV3 => f.write_str("Standard_NC24rs_v3"),
            Self::StandardNd6s => f.write_str("Standard_ND6s"),
            Self::StandardNd12s => f.write_str("Standard_ND12s"),
            Self::StandardNd24s => f.write_str("Standard_ND24s"),
            Self::StandardNd24rs => f.write_str("Standard_ND24rs"),
            Self::StandardNv6 => f.write_str("Standard_NV6"),
            Self::StandardNv12 => f.write_str("Standard_NV12"),
            Self::StandardNv24 => f.write_str("Standard_NV24"),
        }
    }
}
impl ::std::str::FromStr for VirtualMachineSizeTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "basic_a0" => Ok(Self::BasicA0),
            "basic_a1" => Ok(Self::BasicA1),
            "basic_a2" => Ok(Self::BasicA2),
            "basic_a3" => Ok(Self::BasicA3),
            "basic_a4" => Ok(Self::BasicA4),
            "standard_a0" => Ok(Self::StandardA0),
            "standard_a1" => Ok(Self::StandardA1),
            "standard_a2" => Ok(Self::StandardA2),
            "standard_a3" => Ok(Self::StandardA3),
            "standard_a4" => Ok(Self::StandardA4),
            "standard_a5" => Ok(Self::StandardA5),
            "standard_a6" => Ok(Self::StandardA6),
            "standard_a7" => Ok(Self::StandardA7),
            "standard_a8" => Ok(Self::StandardA8),
            "standard_a9" => Ok(Self::StandardA9),
            "standard_a10" => Ok(Self::StandardA10),
            "standard_a11" => Ok(Self::StandardA11),
            "standard_a1_v2" => Ok(Self::StandardA1V2),
            "standard_a2_v2" => Ok(Self::StandardA2V2),
            "standard_a4_v2" => Ok(Self::StandardA4V2),
            "standard_a8_v2" => Ok(Self::StandardA8V2),
            "standard_a2m_v2" => Ok(Self::StandardA2mV2),
            "standard_a4m_v2" => Ok(Self::StandardA4mV2),
            "standard_a8m_v2" => Ok(Self::StandardA8mV2),
            "standard_b1s" => Ok(Self::StandardB1s),
            "standard_b1ms" => Ok(Self::StandardB1ms),
            "standard_b2s" => Ok(Self::StandardB2s),
            "standard_b2ms" => Ok(Self::StandardB2ms),
            "standard_b4ms" => Ok(Self::StandardB4ms),
            "standard_b8ms" => Ok(Self::StandardB8ms),
            "standard_d1" => Ok(Self::StandardD1),
            "standard_d2" => Ok(Self::StandardD2),
            "standard_d3" => Ok(Self::StandardD3),
            "standard_d4" => Ok(Self::StandardD4),
            "standard_d11" => Ok(Self::StandardD11),
            "standard_d12" => Ok(Self::StandardD12),
            "standard_d13" => Ok(Self::StandardD13),
            "standard_d14" => Ok(Self::StandardD14),
            "standard_d1_v2" => Ok(Self::StandardD1V2),
            "standard_d2_v2" => Ok(Self::StandardD2V2),
            "standard_d3_v2" => Ok(Self::StandardD3V2),
            "standard_d4_v2" => Ok(Self::StandardD4V2),
            "standard_d5_v2" => Ok(Self::StandardD5V2),
            "standard_d2_v3" => Ok(Self::StandardD2V3),
            "standard_d4_v3" => Ok(Self::StandardD4V3),
            "standard_d8_v3" => Ok(Self::StandardD8V3),
            "standard_d16_v3" => Ok(Self::StandardD16V3),
            "standard_d32_v3" => Ok(Self::StandardD32V3),
            "standard_d64_v3" => Ok(Self::StandardD64V3),
            "standard_d2s_v3" => Ok(Self::StandardD2sV3),
            "standard_d4s_v3" => Ok(Self::StandardD4sV3),
            "standard_d8s_v3" => Ok(Self::StandardD8sV3),
            "standard_d16s_v3" => Ok(Self::StandardD16sV3),
            "standard_d32s_v3" => Ok(Self::StandardD32sV3),
            "standard_d64s_v3" => Ok(Self::StandardD64sV3),
            "standard_d11_v2" => Ok(Self::StandardD11V2),
            "standard_d12_v2" => Ok(Self::StandardD12V2),
            "standard_d13_v2" => Ok(Self::StandardD13V2),
            "standard_d14_v2" => Ok(Self::StandardD14V2),
            "standard_d15_v2" => Ok(Self::StandardD15V2),
            "standard_ds1" => Ok(Self::StandardDs1),
            "standard_ds2" => Ok(Self::StandardDs2),
            "standard_ds3" => Ok(Self::StandardDs3),
            "standard_ds4" => Ok(Self::StandardDs4),
            "standard_ds11" => Ok(Self::StandardDs11),
            "standard_ds12" => Ok(Self::StandardDs12),
            "standard_ds13" => Ok(Self::StandardDs13),
            "standard_ds14" => Ok(Self::StandardDs14),
            "standard_ds1_v2" => Ok(Self::StandardDs1V2),
            "standard_ds2_v2" => Ok(Self::StandardDs2V2),
            "standard_ds3_v2" => Ok(Self::StandardDs3V2),
            "standard_ds4_v2" => Ok(Self::StandardDs4V2),
            "standard_ds5_v2" => Ok(Self::StandardDs5V2),
            "standard_ds11_v2" => Ok(Self::StandardDs11V2),
            "standard_ds12_v2" => Ok(Self::StandardDs12V2),
            "standard_ds13_v2" => Ok(Self::StandardDs13V2),
            "standard_ds14_v2" => Ok(Self::StandardDs14V2),
            "standard_ds15_v2" => Ok(Self::StandardDs15V2),
            "standard_ds13-4_v2" => Ok(Self::StandardDs134V2),
            "standard_ds13-2_v2" => Ok(Self::StandardDs132V2),
            "standard_ds14-8_v2" => Ok(Self::StandardDs148V2),
            "standard_ds14-4_v2" => Ok(Self::StandardDs144V2),
            "standard_e2_v3" => Ok(Self::StandardE2V3),
            "standard_e4_v3" => Ok(Self::StandardE4V3),
            "standard_e8_v3" => Ok(Self::StandardE8V3),
            "standard_e16_v3" => Ok(Self::StandardE16V3),
            "standard_e32_v3" => Ok(Self::StandardE32V3),
            "standard_e64_v3" => Ok(Self::StandardE64V3),
            "standard_e2s_v3" => Ok(Self::StandardE2sV3),
            "standard_e4s_v3" => Ok(Self::StandardE4sV3),
            "standard_e8s_v3" => Ok(Self::StandardE8sV3),
            "standard_e16s_v3" => Ok(Self::StandardE16sV3),
            "standard_e32s_v3" => Ok(Self::StandardE32sV3),
            "standard_e64s_v3" => Ok(Self::StandardE64sV3),
            "standard_e32-16_v3" => Ok(Self::StandardE3216V3),
            "standard_e32-8s_v3" => Ok(Self::StandardE328sV3),
            "standard_e64-32s_v3" => Ok(Self::StandardE6432sV3),
            "standard_e64-16s_v3" => Ok(Self::StandardE6416sV3),
            "standard_f1" => Ok(Self::StandardF1),
            "standard_f2" => Ok(Self::StandardF2),
            "standard_f4" => Ok(Self::StandardF4),
            "standard_f8" => Ok(Self::StandardF8),
            "standard_f16" => Ok(Self::StandardF16),
            "standard_f1s" => Ok(Self::StandardF1s),
            "standard_f2s" => Ok(Self::StandardF2s),
            "standard_f4s" => Ok(Self::StandardF4s),
            "standard_f8s" => Ok(Self::StandardF8s),
            "standard_f16s" => Ok(Self::StandardF16s),
            "standard_f2s_v2" => Ok(Self::StandardF2sV2),
            "standard_f4s_v2" => Ok(Self::StandardF4sV2),
            "standard_f8s_v2" => Ok(Self::StandardF8sV2),
            "standard_f16s_v2" => Ok(Self::StandardF16sV2),
            "standard_f32s_v2" => Ok(Self::StandardF32sV2),
            "standard_f64s_v2" => Ok(Self::StandardF64sV2),
            "standard_f72s_v2" => Ok(Self::StandardF72sV2),
            "standard_g1" => Ok(Self::StandardG1),
            "standard_g2" => Ok(Self::StandardG2),
            "standard_g3" => Ok(Self::StandardG3),
            "standard_g4" => Ok(Self::StandardG4),
            "standard_g5" => Ok(Self::StandardG5),
            "standard_gs1" => Ok(Self::StandardGs1),
            "standard_gs2" => Ok(Self::StandardGs2),
            "standard_gs3" => Ok(Self::StandardGs3),
            "standard_gs4" => Ok(Self::StandardGs4),
            "standard_gs5" => Ok(Self::StandardGs5),
            "standard_gs4-8" => Ok(Self::StandardGs48),
            "standard_gs4-4" => Ok(Self::StandardGs44),
            "standard_gs5-16" => Ok(Self::StandardGs516),
            "standard_gs5-8" => Ok(Self::StandardGs58),
            "standard_h8" => Ok(Self::StandardH8),
            "standard_h16" => Ok(Self::StandardH16),
            "standard_h8m" => Ok(Self::StandardH8m),
            "standard_h16m" => Ok(Self::StandardH16m),
            "standard_h16r" => Ok(Self::StandardH16r),
            "standard_h16mr" => Ok(Self::StandardH16mr),
            "standard_l4s" => Ok(Self::StandardL4s),
            "standard_l8s" => Ok(Self::StandardL8s),
            "standard_l16s" => Ok(Self::StandardL16s),
            "standard_l32s" => Ok(Self::StandardL32s),
            "standard_m64s" => Ok(Self::StandardM64s),
            "standard_m64ms" => Ok(Self::StandardM64ms),
            "standard_m128s" => Ok(Self::StandardM128s),
            "standard_m128ms" => Ok(Self::StandardM128ms),
            "standard_m64-32ms" => Ok(Self::StandardM6432ms),
            "standard_m64-16ms" => Ok(Self::StandardM6416ms),
            "standard_m128-64ms" => Ok(Self::StandardM12864ms),
            "standard_m128-32ms" => Ok(Self::StandardM12832ms),
            "standard_nc6" => Ok(Self::StandardNc6),
            "standard_nc12" => Ok(Self::StandardNc12),
            "standard_nc24" => Ok(Self::StandardNc24),
            "standard_nc24r" => Ok(Self::StandardNc24r),
            "standard_nc6s_v2" => Ok(Self::StandardNc6sV2),
            "standard_nc12s_v2" => Ok(Self::StandardNc12sV2),
            "standard_nc24s_v2" => Ok(Self::StandardNc24sV2),
            "standard_nc24rs_v2" => Ok(Self::StandardNc24rsV2),
            "standard_nc6s_v3" => Ok(Self::StandardNc6sV3),
            "standard_nc12s_v3" => Ok(Self::StandardNc12sV3),
            "standard_nc24s_v3" => Ok(Self::StandardNc24sV3),
            "standard_nc24rs_v3" => Ok(Self::StandardNc24rsV3),
            "standard_nd6s" => Ok(Self::StandardNd6s),
            "standard_nd12s" => Ok(Self::StandardNd12s),
            "standard_nd24s" => Ok(Self::StandardNd24s),
            "standard_nd24rs" => Ok(Self::StandardNd24rs),
            "standard_nv6" => Ok(Self::StandardNv6),
            "standard_nv12" => Ok(Self::StandardNv12),
            "standard_nv24" => Ok(Self::StandardNv24),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for VirtualMachineSizeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for VirtualMachineSizeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for VirtualMachineSizeTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes the properties of a Virtual Machine software patch.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the properties of a Virtual Machine software patch.",
///  "type": "object",
///  "properties": {
///    "activityId": {
///      "description": "The activity ID of the operation that produced this result. It is used to correlate across CRP and extension logs.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "assessmentState": {
///      "$ref": "#/components/schemas/PatchAssessmentState"
///    },
///    "classifications": {
///      "description": "The classification(s) of the patch as provided by the patch publisher.",
///      "readOnly": true,
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "kbId": {
///      "description": "The KBID of the patch. Only applies to Windows patches.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "lastModifiedDateTime": {
///      "description": "The UTC timestamp of the last update to this patch record.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "name": {
///      "description": "The friendly name of the patch.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "patchId": {
///      "description": "A unique identifier for the patch.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "publishedDate": {
///      "description": "The UTC timestamp when the repository published this patch.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "rebootBehavior": {
///      "$ref": "#/components/schemas/VMGuestPatchRebootBehavior"
///    },
///    "version": {
///      "description": "The version number of the patch. This property applies only to Linux patches.",
///      "readOnly": true,
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineSoftwarePatchProperties {
    ///The activity ID of the operation that produced this result. It is used to correlate across CRP and extension logs.
    #[serde(
        rename = "activityId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub activity_id: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "assessmentState",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub assessment_state: ::std::option::Option<PatchAssessmentState>,
    ///The classification(s) of the patch as provided by the patch publisher.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub classifications: ::std::vec::Vec<::std::string::String>,
    ///The KBID of the patch. Only applies to Windows patches.
    #[serde(
        rename = "kbId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub kb_id: ::std::option::Option<::std::string::String>,
    ///The UTC timestamp of the last update to this patch record.
    #[serde(
        rename = "lastModifiedDateTime",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub last_modified_date_time: ::std::option::Option<::std::string::String>,
    ///The friendly name of the patch.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub name: ::std::option::Option<::std::string::String>,
    ///A unique identifier for the patch.
    #[serde(
        rename = "patchId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub patch_id: ::std::option::Option<::std::string::String>,
    ///The UTC timestamp when the repository published this patch.
    #[serde(
        rename = "publishedDate",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub published_date: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "rebootBehavior",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub reboot_behavior: ::std::option::Option<VmGuestPatchRebootBehavior>,
    ///The version number of the patch. This property applies only to Linux patches.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub version: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineSoftwarePatchProperties>
for VirtualMachineSoftwarePatchProperties {
    fn from(value: &VirtualMachineSoftwarePatchProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineSoftwarePatchProperties {
    fn default() -> Self {
        Self {
            activity_id: Default::default(),
            assessment_state: Default::default(),
            classifications: Default::default(),
            kb_id: Default::default(),
            last_modified_date_time: Default::default(),
            name: Default::default(),
            patch_id: Default::default(),
            published_date: Default::default(),
            reboot_behavior: Default::default(),
            version: Default::default(),
        }
    }
}
///The status code and count of the virtual machine scale set instance view status summary.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The status code and count of the virtual machine scale set instance view status summary.",
///  "type": "object",
///  "properties": {
///    "code": {
///      "description": "The instance view status code.",
///      "readOnly": true,
///      "type": "string"
///    },
///    "count": {
///      "description": "The number of instances having a particular status code.",
///      "readOnly": true,
///      "type": "integer",
///      "format": "int32"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineStatusCodeCount {
    ///The instance view status code.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub code: ::std::option::Option<::std::string::String>,
    ///The number of instances having a particular status code.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub count: ::std::option::Option<i32>,
}
impl ::std::convert::From<&VirtualMachineStatusCodeCount>
for VirtualMachineStatusCodeCount {
    fn from(value: &VirtualMachineStatusCodeCount) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineStatusCodeCount {
    fn default() -> Self {
        Self {
            code: Default::default(),
            count: Default::default(),
        }
    }
}
///Describes a Virtual Machine Update.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes a Virtual Machine Update.",
///  "type": "object",
///  "allOf": [
///    {
///      "$ref": "#/components/schemas/UpdateResource"
///    }
///  ],
///  "properties": {
///    "identity": {
///      "$ref": "#/components/schemas/VirtualMachineIdentity"
///    },
///    "plan": {
///      "$ref": "#/components/schemas/Plan"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VirtualMachineProperties"
///    },
///    "zones": {
///      "description": "The virtual machine zones.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VirtualMachineUpdate {
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub identity: ::std::option::Option<VirtualMachineIdentity>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub plan: ::std::option::Option<Plan>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VirtualMachineProperties>,
    ///Resource tags
    #[serde(
        default,
        skip_serializing_if = ":: std :: collections :: HashMap::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
    ///The virtual machine zones.
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zones: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&VirtualMachineUpdate> for VirtualMachineUpdate {
    fn from(value: &VirtualMachineUpdate) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VirtualMachineUpdate {
    fn default() -> Self {
        Self {
            identity: Default::default(),
            plan: Default::default(),
            properties: Default::default(),
            tags: Default::default(),
            zones: Default::default(),
        }
    }
}
///Specifies the security profile settings for the managed disk. **Note:** It can only be set for Confidential VMs.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the security profile settings for the managed disk. **Note:** It can only be set for Confidential VMs.",
///  "type": "object",
///  "properties": {
///    "diskEncryptionSet": {
///      "$ref": "#/components/schemas/DiskEncryptionSetParameters"
///    },
///    "securityEncryptionType": {
///      "$ref": "#/components/schemas/SecurityEncryptionTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VmDiskSecurityProfile {
    #[serde(
        rename = "diskEncryptionSet",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub disk_encryption_set: ::std::option::Option<DiskEncryptionSetParameters>,
    #[serde(
        rename = "securityEncryptionType",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub security_encryption_type: ::std::option::Option<SecurityEncryptionTypes>,
}
impl ::std::convert::From<&VmDiskSecurityProfile> for VmDiskSecurityProfile {
    fn from(value: &VmDiskSecurityProfile) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VmDiskSecurityProfile {
    fn default() -> Self {
        Self {
            disk_encryption_set: Default::default(),
            security_encryption_type: Default::default(),
        }
    }
}
///VM disk types which are disallowed.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "VM disk types which are disallowed.",
///  "type": "string",
///  "enum": [
///    "None",
///    "Unmanaged"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "VmDiskTypes",
///    "values": [
///      {
///        "name": "None",
///        "value": "None"
///      },
///      {
///        "name": "Unmanaged",
///        "value": "Unmanaged"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum VmDiskTypes {
    None,
    Unmanaged,
}
impl ::std::convert::From<&Self> for VmDiskTypes {
    fn from(value: &VmDiskTypes) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for VmDiskTypes {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::None => f.write_str("None"),
            Self::Unmanaged => f.write_str("Unmanaged"),
        }
    }
}
impl ::std::str::FromStr for VmDiskTypes {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "none" => Ok(Self::None),
            "unmanaged" => Ok(Self::Unmanaged),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for VmDiskTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for VmDiskTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for VmDiskTypes {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the required information to reference a compute gallery application version
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the required information to reference a compute gallery application version",
///  "type": "object",
///  "required": [
///    "packageReferenceId"
///  ],
///  "properties": {
///    "configurationReference": {
///      "description": "Optional, Specifies the uri to an azure blob that will replace the default configuration for the package if provided",
///      "type": "string"
///    },
///    "enableAutomaticUpgrade": {
///      "description": "If set to true, when a new Gallery Application version is available in PIR/SIG, it will be automatically updated for the VM/VMSS",
///      "type": "boolean"
///    },
///    "order": {
///      "description": "Optional, Specifies the order in which the packages have to be installed",
///      "type": "integer",
///      "format": "int32"
///    },
///    "packageReferenceId": {
///      "description": "Specifies the GalleryApplicationVersion resource id on the form of /subscriptions/{SubscriptionId}/resourceGroups/{ResourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/applications/{application}/versions/{version}",
///      "type": "string"
///    },
///    "tags": {
///      "description": "Optional, Specifies a passthrough value for more generic context.",
///      "type": "string"
///    },
///    "treatFailureAsDeploymentFailure": {
///      "description": "Optional, If true, any failure for any operation in the VmApplication will fail the deployment",
///      "type": "boolean"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VmGalleryApplication {
    ///Optional, Specifies the uri to an azure blob that will replace the default configuration for the package if provided
    #[serde(
        rename = "configurationReference",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub configuration_reference: ::std::option::Option<::std::string::String>,
    ///If set to true, when a new Gallery Application version is available in PIR/SIG, it will be automatically updated for the VM/VMSS
    #[serde(
        rename = "enableAutomaticUpgrade",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_automatic_upgrade: ::std::option::Option<bool>,
    ///Optional, Specifies the order in which the packages have to be installed
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub order: ::std::option::Option<i32>,
    ///Specifies the GalleryApplicationVersion resource id on the form of /subscriptions/{SubscriptionId}/resourceGroups/{ResourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/applications/{application}/versions/{version}
    #[serde(rename = "packageReferenceId")]
    pub package_reference_id: ::std::string::String,
    ///Optional, Specifies a passthrough value for more generic context.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub tags: ::std::option::Option<::std::string::String>,
    ///Optional, If true, any failure for any operation in the VmApplication will fail the deployment
    #[serde(
        rename = "treatFailureAsDeploymentFailure",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub treat_failure_as_deployment_failure: ::std::option::Option<bool>,
}
impl ::std::convert::From<&VmGalleryApplication> for VmGalleryApplication {
    fn from(value: &VmGalleryApplication) -> Self {
        value.clone()
    }
}
///`VmGuestPatchClassificationLinux`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "Critical",
///    "Security",
///    "Other"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "VMGuestPatchClassificationLinux",
///    "values": [
///      {
///        "name": "Critical",
///        "value": "Critical"
///      },
///      {
///        "name": "Security",
///        "value": "Security"
///      },
///      {
///        "name": "Other",
///        "value": "Other"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum VmGuestPatchClassificationLinux {
    Critical,
    Security,
    Other,
}
impl ::std::convert::From<&Self> for VmGuestPatchClassificationLinux {
    fn from(value: &VmGuestPatchClassificationLinux) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for VmGuestPatchClassificationLinux {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Critical => f.write_str("Critical"),
            Self::Security => f.write_str("Security"),
            Self::Other => f.write_str("Other"),
        }
    }
}
impl ::std::str::FromStr for VmGuestPatchClassificationLinux {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "critical" => Ok(Self::Critical),
            "security" => Ok(Self::Security),
            "other" => Ok(Self::Other),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for VmGuestPatchClassificationLinux {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for VmGuestPatchClassificationLinux {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for VmGuestPatchClassificationLinux {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///`VmGuestPatchClassificationWindows`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "string",
///  "enum": [
///    "Critical",
///    "Security",
///    "UpdateRollUp",
///    "FeaturePack",
///    "ServicePack",
///    "Definition",
///    "Tools",
///    "Updates"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "VMGuestPatchClassificationWindows",
///    "values": [
///      {
///        "name": "Critical",
///        "value": "Critical"
///      },
///      {
///        "name": "Security",
///        "value": "Security"
///      },
///      {
///        "name": "UpdateRollUp",
///        "value": "UpdateRollUp"
///      },
///      {
///        "name": "FeaturePack",
///        "value": "FeaturePack"
///      },
///      {
///        "name": "ServicePack",
///        "value": "ServicePack"
///      },
///      {
///        "name": "Definition",
///        "value": "Definition"
///      },
///      {
///        "name": "Tools",
///        "value": "Tools"
///      },
///      {
///        "name": "Updates",
///        "value": "Updates"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum VmGuestPatchClassificationWindows {
    Critical,
    Security,
    UpdateRollUp,
    FeaturePack,
    ServicePack,
    Definition,
    Tools,
    Updates,
}
impl ::std::convert::From<&Self> for VmGuestPatchClassificationWindows {
    fn from(value: &VmGuestPatchClassificationWindows) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for VmGuestPatchClassificationWindows {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Critical => f.write_str("Critical"),
            Self::Security => f.write_str("Security"),
            Self::UpdateRollUp => f.write_str("UpdateRollUp"),
            Self::FeaturePack => f.write_str("FeaturePack"),
            Self::ServicePack => f.write_str("ServicePack"),
            Self::Definition => f.write_str("Definition"),
            Self::Tools => f.write_str("Tools"),
            Self::Updates => f.write_str("Updates"),
        }
    }
}
impl ::std::str::FromStr for VmGuestPatchClassificationWindows {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "critical" => Ok(Self::Critical),
            "security" => Ok(Self::Security),
            "updaterollup" => Ok(Self::UpdateRollUp),
            "featurepack" => Ok(Self::FeaturePack),
            "servicepack" => Ok(Self::ServicePack),
            "definition" => Ok(Self::Definition),
            "tools" => Ok(Self::Tools),
            "updates" => Ok(Self::Updates),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for VmGuestPatchClassificationWindows {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for VmGuestPatchClassificationWindows {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for VmGuestPatchClassificationWindows {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Describes the reboot requirements of the patch.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes the reboot requirements of the patch.",
///  "type": "string",
///  "enum": [
///    "Unknown",
///    "NeverReboots",
///    "AlwaysRequiresReboot",
///    "CanRequestReboot"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "VMGuestPatchRebootBehavior",
///    "values": [
///      {
///        "name": "Unknown",
///        "value": "Unknown"
///      },
///      {
///        "name": "NeverReboots",
///        "value": "NeverReboots"
///      },
///      {
///        "name": "AlwaysRequiresReboot",
///        "value": "AlwaysRequiresReboot"
///      },
///      {
///        "name": "CanRequestReboot",
///        "value": "CanRequestReboot"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum VmGuestPatchRebootBehavior {
    Unknown,
    NeverReboots,
    AlwaysRequiresReboot,
    CanRequestReboot,
}
impl ::std::convert::From<&Self> for VmGuestPatchRebootBehavior {
    fn from(value: &VmGuestPatchRebootBehavior) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for VmGuestPatchRebootBehavior {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Unknown => f.write_str("Unknown"),
            Self::NeverReboots => f.write_str("NeverReboots"),
            Self::AlwaysRequiresReboot => f.write_str("AlwaysRequiresReboot"),
            Self::CanRequestReboot => f.write_str("CanRequestReboot"),
        }
    }
}
impl ::std::str::FromStr for VmGuestPatchRebootBehavior {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "unknown" => Ok(Self::Unknown),
            "neverreboots" => Ok(Self::NeverReboots),
            "alwaysrequiresreboot" => Ok(Self::AlwaysRequiresReboot),
            "canrequestreboot" => Ok(Self::CanRequestReboot),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for VmGuestPatchRebootBehavior {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for VmGuestPatchRebootBehavior {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for VmGuestPatchRebootBehavior {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Defines when it is acceptable to reboot a VM during a software update operation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Defines when it is acceptable to reboot a VM during a software update operation.",
///  "type": "string",
///  "enum": [
///    "IfRequired",
///    "Never",
///    "Always"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "VMGuestPatchRebootSetting",
///    "values": [
///      {
///        "name": "IfRequired",
///        "value": "IfRequired"
///      },
///      {
///        "name": "Never",
///        "value": "Never"
///      },
///      {
///        "name": "Always",
///        "value": "Always"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum VmGuestPatchRebootSetting {
    IfRequired,
    Never,
    Always,
}
impl ::std::convert::From<&Self> for VmGuestPatchRebootSetting {
    fn from(value: &VmGuestPatchRebootSetting) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for VmGuestPatchRebootSetting {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::IfRequired => f.write_str("IfRequired"),
            Self::Never => f.write_str("Never"),
            Self::Always => f.write_str("Always"),
        }
    }
}
impl ::std::str::FromStr for VmGuestPatchRebootSetting {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "ifrequired" => Ok(Self::IfRequired),
            "never" => Ok(Self::Never),
            "always" => Ok(Self::Always),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for VmGuestPatchRebootSetting {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for VmGuestPatchRebootSetting {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for VmGuestPatchRebootSetting {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The reboot state of the VM following completion of the operation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The reboot state of the VM following completion of the operation.",
///  "type": "string",
///  "enum": [
///    "Unknown",
///    "NotNeeded",
///    "Required",
///    "Started",
///    "Failed",
///    "Completed"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "VMGuestPatchRebootStatus",
///    "values": [
///      {
///        "name": "Unknown",
///        "value": "Unknown"
///      },
///      {
///        "name": "NotNeeded",
///        "value": "NotNeeded"
///      },
///      {
///        "name": "Required",
///        "value": "Required"
///      },
///      {
///        "name": "Started",
///        "value": "Started"
///      },
///      {
///        "name": "Failed",
///        "value": "Failed"
///      },
///      {
///        "name": "Completed",
///        "value": "Completed"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum VmGuestPatchRebootStatus {
    Unknown,
    NotNeeded,
    Required,
    Started,
    Failed,
    Completed,
}
impl ::std::convert::From<&Self> for VmGuestPatchRebootStatus {
    fn from(value: &VmGuestPatchRebootStatus) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for VmGuestPatchRebootStatus {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Unknown => f.write_str("Unknown"),
            Self::NotNeeded => f.write_str("NotNeeded"),
            Self::Required => f.write_str("Required"),
            Self::Started => f.write_str("Started"),
            Self::Failed => f.write_str("Failed"),
            Self::Completed => f.write_str("Completed"),
        }
    }
}
impl ::std::str::FromStr for VmGuestPatchRebootStatus {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "unknown" => Ok(Self::Unknown),
            "notneeded" => Ok(Self::NotNeeded),
            "required" => Ok(Self::Required),
            "started" => Ok(Self::Started),
            "failed" => Ok(Self::Failed),
            "completed" => Ok(Self::Completed),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for VmGuestPatchRebootStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for VmGuestPatchRebootStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for VmGuestPatchRebootStatus {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The List VmImages in EdgeZone operation response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The List VmImages in EdgeZone operation response.",
///  "type": "object",
///  "properties": {
///    "nextLink": {
///      "description": "The URI to fetch the next page of VMImages in EdgeZone. Call ListNext() with this URI to fetch the next page of VmImages.",
///      "type": "string"
///    },
///    "value": {
///      "description": "The list of VMImages in EdgeZone",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VirtualMachineImageResource"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VmImagesInEdgeZoneListResult {
    ///The URI to fetch the next page of VMImages in EdgeZone. Call ListNext() with this URI to fetch the next page of VmImages.
    #[serde(
        rename = "nextLink",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub next_link: ::std::option::Option<::std::string::String>,
    ///The list of VMImages in EdgeZone
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub value: ::std::vec::Vec<VirtualMachineImageResource>,
}
impl ::std::convert::From<&VmImagesInEdgeZoneListResult>
for VmImagesInEdgeZoneListResult {
    fn from(value: &VmImagesInEdgeZoneListResult) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VmImagesInEdgeZoneListResult {
    fn default() -> Self {
        Self {
            next_link: Default::default(),
            value: Default::default(),
        }
    }
}
///`VmScaleSetConvertToSinglePlacementGroupInput`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "type": "object",
///  "properties": {
///    "activePlacementGroupId": {
///      "description": "Id of the placement group in which you want future virtual machine instances to be placed. To query placement group Id, please use Virtual Machine Scale Set VMs - Get API. If not provided, the platform will choose one with maximum number of virtual machine instances.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VmScaleSetConvertToSinglePlacementGroupInput {
    ///Id of the placement group in which you want future virtual machine instances to be placed. To query placement group Id, please use Virtual Machine Scale Set VMs - Get API. If not provided, the platform will choose one with maximum number of virtual machine instances.
    #[serde(
        rename = "activePlacementGroupId",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub active_placement_group_id: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VmScaleSetConvertToSinglePlacementGroupInput>
for VmScaleSetConvertToSinglePlacementGroupInput {
    fn from(value: &VmScaleSetConvertToSinglePlacementGroupInput) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VmScaleSetConvertToSinglePlacementGroupInput {
    fn default() -> Self {
        Self {
            active_placement_group_id: Default::default(),
        }
    }
}
///The input for ScaleOut
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The input for ScaleOut",
///  "type": "object",
///  "required": [
///    "capacity"
///  ],
///  "properties": {
///    "capacity": {
///      "description": "Specifies the number of virtual machines in the scale set.",
///      "type": "integer",
///      "format": "int64"
///    },
///    "properties": {
///      "$ref": "#/components/schemas/VMScaleSetScaleOutInputProperties"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VmScaleSetScaleOutInput {
    ///Specifies the number of virtual machines in the scale set.
    pub capacity: i64,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub properties: ::std::option::Option<VmScaleSetScaleOutInputProperties>,
}
impl ::std::convert::From<&VmScaleSetScaleOutInput> for VmScaleSetScaleOutInput {
    fn from(value: &VmScaleSetScaleOutInput) -> Self {
        value.clone()
    }
}
///The input properties for ScaleOut
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The input properties for ScaleOut",
///  "type": "object",
///  "properties": {
///    "zone": {
///      "description": "The zone in which the scale out is requested for the virtual machine scale set.",
///      "type": "string"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VmScaleSetScaleOutInputProperties {
    ///The zone in which the scale out is requested for the virtual machine scale set.
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub zone: ::std::option::Option<::std::string::String>,
}
impl ::std::convert::From<&VmScaleSetScaleOutInputProperties>
for VmScaleSetScaleOutInputProperties {
    fn from(value: &VmScaleSetScaleOutInputProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VmScaleSetScaleOutInputProperties {
    fn default() -> Self {
        Self { zone: Default::default() }
    }
}
///Specifies VM Size Property settings on the virtual machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies VM Size Property settings on the virtual machine.",
///  "type": "object",
///  "properties": {
///    "vCPUsAvailable": {
///      "description": "Specifies the number of vCPUs available for the VM. When this property is not specified in the request body the default behavior is to set it to the value of vCPUs available for that VM size exposed in api response of [List all available virtual machine sizes in a region](https://docs.microsoft.com/en-us/rest/api/compute/resource-skus/list).",
///      "type": "integer",
///      "format": "int32"
///    },
///    "vCPUsPerCore": {
///      "description": "Specifies the vCPU to physical core ratio. When this property is not specified in the request body the default behavior is set to the value of vCPUsPerCore for the VM Size exposed in api response of [List all available virtual machine sizes in a region](https://docs.microsoft.com/en-us/rest/api/compute/resource-skus/list). **Setting this property to 1 also means that hyper-threading is disabled.**",
///      "type": "integer",
///      "format": "int32"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct VmSizeProperties {
    ///Specifies the number of vCPUs available for the VM. When this property is not specified in the request body the default behavior is to set it to the value of vCPUs available for that VM size exposed in api response of [List all available virtual machine sizes in a region](https://docs.microsoft.com/en-us/rest/api/compute/resource-skus/list).
    #[serde(
        rename = "vCPUsAvailable",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub v_cp_us_available: ::std::option::Option<i32>,
    ///Specifies the vCPU to physical core ratio. When this property is not specified in the request body the default behavior is set to the value of vCPUsPerCore for the VM Size exposed in api response of [List all available virtual machine sizes in a region](https://docs.microsoft.com/en-us/rest/api/compute/resource-skus/list). **Setting this property to 1 also means that hyper-threading is disabled.**
    #[serde(
        rename = "vCPUsPerCore",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub v_cp_us_per_core: ::std::option::Option<i32>,
}
impl ::std::convert::From<&VmSizeProperties> for VmSizeProperties {
    fn from(value: &VmSizeProperties) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for VmSizeProperties {
    fn default() -> Self {
        Self {
            v_cp_us_available: Default::default(),
            v_cp_us_per_core: Default::default(),
        }
    }
}
///Describes Windows Remote Management configuration of the VM
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes Windows Remote Management configuration of the VM",
///  "type": "object",
///  "properties": {
///    "listeners": {
///      "description": "The list of Windows Remote Management listeners",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/WinRMListener"
///      },
///      "x-ms-identifiers": []
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct WinRmConfiguration {
    ///The list of Windows Remote Management listeners
    #[serde(
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub listeners: ::std::vec::Vec<WinRmListener>,
}
impl ::std::convert::From<&WinRmConfiguration> for WinRmConfiguration {
    fn from(value: &WinRmConfiguration) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for WinRmConfiguration {
    fn default() -> Self {
        Self {
            listeners: Default::default(),
        }
    }
}
///Describes Protocol and thumbprint of Windows Remote Management listener
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Describes Protocol and thumbprint of Windows Remote Management listener",
///  "type": "object",
///  "properties": {
///    "certificateUrl": {
///      "description": "This is the URL of a certificate that has been uploaded to Key Vault as a secret. For adding a secret to the Key Vault, see [Add a key or secret to the key vault](https://docs.microsoft.com/azure/key-vault/key-vault-get-started/#add). In this case, your certificate needs to be the Base64 encoding of the following JSON Object which is encoded in UTF-8: <br><br> {<br>  \"data\":\"<Base64-encoded-certificate>\",<br>  \"dataType\":\"pfx\",<br>  \"password\":\"<pfx-file-password>\"<br>} <br> To install certificates on a virtual machine it is recommended to use the [Azure Key Vault virtual machine extension for Linux](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-linux) or the [Azure Key Vault virtual machine extension for Windows](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-windows).",
///      "type": "string"
///    },
///    "protocol": {
///      "$ref": "#/components/schemas/ProtocolTypes"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct WinRmListener {
    ///This is the URL of a certificate that has been uploaded to Key Vault as a secret. For adding a secret to the Key Vault, see [Add a key or secret to the key vault](https://docs.microsoft.com/azure/key-vault/key-vault-get-started/#add). In this case, your certificate needs to be the Base64 encoding of the following JSON Object which is encoded in UTF-8: <br><br> {<br>  "data":"<Base64-encoded-certificate>",<br>  "dataType":"pfx",<br>  "password":"<pfx-file-password>"<br>} <br> To install certificates on a virtual machine it is recommended to use the [Azure Key Vault virtual machine extension for Linux](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-linux) or the [Azure Key Vault virtual machine extension for Windows](https://docs.microsoft.com/azure/virtual-machines/extensions/key-vault-windows).
    #[serde(
        rename = "certificateUrl",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub certificate_url: ::std::option::Option<::std::string::String>,
    #[serde(
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub protocol: ::std::option::Option<ProtocolTypes>,
}
impl ::std::convert::From<&WinRmListener> for WinRmListener {
    fn from(value: &WinRmListener) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for WinRmListener {
    fn default() -> Self {
        Self {
            certificate_url: Default::default(),
            protocol: Default::default(),
        }
    }
}
///Specifies Windows operating system settings on the virtual machine.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies Windows operating system settings on the virtual machine.",
///  "type": "object",
///  "properties": {
///    "additionalUnattendContent": {
///      "description": "Specifies additional base-64 encoded XML formatted information that can be included in the Unattend.xml file, which is used by Windows Setup.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/AdditionalUnattendContent"
///      },
///      "x-ms-identifiers": []
///    },
///    "enableAutomaticUpdates": {
///      "description": "Indicates whether Automatic Updates is enabled for the Windows virtual machine. Default value is true. For virtual machine scale sets, this property can be updated and updates will take effect on OS reprovisioning.",
///      "type": "boolean"
///    },
///    "enableVMAgentPlatformUpdates": {
///      "description": "Indicates whether VMAgent Platform Updates are enabled for the Windows Virtual Machine.",
///      "readOnly": true,
///      "type": "boolean"
///    },
///    "patchSettings": {
///      "$ref": "#/components/schemas/PatchSettings"
///    },
///    "provisionVMAgent": {
///      "description": "Indicates whether virtual machine agent should be provisioned on the virtual machine. When this property is not specified in the request body, it is set to true by default. This will ensure that VM Agent is installed on the VM so that extensions can be added to the VM later.",
///      "type": "boolean"
///    },
///    "timeZone": {
///      "description": "Specifies the time zone of the virtual machine. e.g. \"Pacific Standard Time\". Possible values can be [TimeZoneInfo.Id](https://docs.microsoft.com/dotnet/api/system.timezoneinfo.id?#System_TimeZoneInfo_Id) value from time zones returned by [TimeZoneInfo.GetSystemTimeZones](https://docs.microsoft.com/dotnet/api/system.timezoneinfo.getsystemtimezones).",
///      "type": "string"
///    },
///    "winRM": {
///      "$ref": "#/components/schemas/WinRMConfiguration"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct WindowsConfiguration {
    ///Specifies additional base-64 encoded XML formatted information that can be included in the Unattend.xml file, which is used by Windows Setup.
    #[serde(
        rename = "additionalUnattendContent",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub additional_unattend_content: ::std::vec::Vec<AdditionalUnattendContent>,
    ///Indicates whether Automatic Updates is enabled for the Windows virtual machine. Default value is true. For virtual machine scale sets, this property can be updated and updates will take effect on OS reprovisioning.
    #[serde(
        rename = "enableAutomaticUpdates",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_automatic_updates: ::std::option::Option<bool>,
    ///Indicates whether VMAgent Platform Updates are enabled for the Windows Virtual Machine.
    #[serde(
        rename = "enableVMAgentPlatformUpdates",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub enable_vm_agent_platform_updates: ::std::option::Option<bool>,
    #[serde(
        rename = "patchSettings",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub patch_settings: ::std::option::Option<PatchSettings>,
    ///Indicates whether virtual machine agent should be provisioned on the virtual machine. When this property is not specified in the request body, it is set to true by default. This will ensure that VM Agent is installed on the VM so that extensions can be added to the VM later.
    #[serde(
        rename = "provisionVMAgent",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub provision_vm_agent: ::std::option::Option<bool>,
    ///Specifies the time zone of the virtual machine. e.g. "Pacific Standard Time". Possible values can be [TimeZoneInfo.Id](https://docs.microsoft.com/dotnet/api/system.timezoneinfo.id?#System_TimeZoneInfo_Id) value from time zones returned by [TimeZoneInfo.GetSystemTimeZones](https://docs.microsoft.com/dotnet/api/system.timezoneinfo.getsystemtimezones).
    #[serde(
        rename = "timeZone",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub time_zone: ::std::option::Option<::std::string::String>,
    #[serde(
        rename = "winRM",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub win_rm: ::std::option::Option<WinRmConfiguration>,
}
impl ::std::convert::From<&WindowsConfiguration> for WindowsConfiguration {
    fn from(value: &WindowsConfiguration) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for WindowsConfiguration {
    fn default() -> Self {
        Self {
            additional_unattend_content: Default::default(),
            enable_automatic_updates: Default::default(),
            enable_vm_agent_platform_updates: Default::default(),
            patch_settings: Default::default(),
            provision_vm_agent: Default::default(),
            time_zone: Default::default(),
            win_rm: Default::default(),
        }
    }
}
///Input for InstallPatches on a Windows VM, as directly received by the API
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Input for InstallPatches on a Windows VM, as directly received by the API",
///  "type": "object",
///  "properties": {
///    "classificationsToInclude": {
///      "description": "The update classifications to select when installing patches for Windows.",
///      "type": "array",
///      "items": {
///        "$ref": "#/components/schemas/VMGuestPatchClassificationWindows"
///      }
///    },
///    "excludeKbsRequiringReboot": {
///      "description": "Filters out Kbs that don't have an InstallationRebootBehavior of 'NeverReboots' when this is set to true.",
///      "type": "boolean"
///    },
///    "kbNumbersToExclude": {
///      "description": "Kbs to exclude in the patch operation",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "kbNumbersToInclude": {
///      "description": "Kbs to include in the patch operation",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "maxPatchPublishDate": {
///      "description": "This is used to install patches that were published on or before this given max published date.",
///      "type": "string"
///    },
///    "patchNameMasksToExclude": {
///      "description": "This is used to exclude patches that match the given patch name masks. Alphanumeric strings and wildcard expressions consisting of * and ? are only supported as input values in the list. Null, empty and only whitespaces strings as inputs values are not supported.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    },
///    "patchNameMasksToInclude": {
///      "description": "This is used to include patches that match the given patch name masks. Alphanumeric strings and wildcard expressions consisting of * and ? are only supported as input values in the list. Null, empty and only whitespaces strings as inputs values are not supported.",
///      "type": "array",
///      "items": {
///        "type": "string"
///      }
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct WindowsParameters {
    ///The update classifications to select when installing patches for Windows.
    #[serde(
        rename = "classificationsToInclude",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub classifications_to_include: ::std::vec::Vec<VmGuestPatchClassificationWindows>,
    ///Filters out Kbs that don't have an InstallationRebootBehavior of 'NeverReboots' when this is set to true.
    #[serde(
        rename = "excludeKbsRequiringReboot",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub exclude_kbs_requiring_reboot: ::std::option::Option<bool>,
    ///Kbs to exclude in the patch operation
    #[serde(
        rename = "kbNumbersToExclude",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub kb_numbers_to_exclude: ::std::vec::Vec<::std::string::String>,
    ///Kbs to include in the patch operation
    #[serde(
        rename = "kbNumbersToInclude",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub kb_numbers_to_include: ::std::vec::Vec<::std::string::String>,
    ///This is used to install patches that were published on or before this given max published date.
    #[serde(
        rename = "maxPatchPublishDate",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub max_patch_publish_date: ::std::option::Option<::std::string::String>,
    ///This is used to exclude patches that match the given patch name masks. Alphanumeric strings and wildcard expressions consisting of * and ? are only supported as input values in the list. Null, empty and only whitespaces strings as inputs values are not supported.
    #[serde(
        rename = "patchNameMasksToExclude",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub patch_name_masks_to_exclude: ::std::vec::Vec<::std::string::String>,
    ///This is used to include patches that match the given patch name masks. Alphanumeric strings and wildcard expressions consisting of * and ? are only supported as input values in the list. Null, empty and only whitespaces strings as inputs values are not supported.
    #[serde(
        rename = "patchNameMasksToInclude",
        default,
        skip_serializing_if = "::std::vec::Vec::is_empty",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub patch_name_masks_to_include: ::std::vec::Vec<::std::string::String>,
}
impl ::std::convert::From<&WindowsParameters> for WindowsParameters {
    fn from(value: &WindowsParameters) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for WindowsParameters {
    fn default() -> Self {
        Self {
            classifications_to_include: Default::default(),
            exclude_kbs_requiring_reboot: Default::default(),
            kb_numbers_to_exclude: Default::default(),
            kb_numbers_to_include: Default::default(),
            max_patch_publish_date: Default::default(),
            patch_name_masks_to_exclude: Default::default(),
            patch_name_masks_to_include: Default::default(),
        }
    }
}
///Specifies the mode of VM Guest patch assessment for the IaaS virtual machine.<br /><br /> Possible values are:<br /><br /> **ImageDefault** - You control the timing of patch assessments on a virtual machine.<br /><br /> **AutomaticByPlatform** - The platform will trigger periodic patch assessments. The property provisionVMAgent must be true.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the mode of VM Guest patch assessment for the IaaS virtual machine.<br /><br /> Possible values are:<br /><br /> **ImageDefault** - You control the timing of patch assessments on a virtual machine.<br /><br /> **AutomaticByPlatform** - The platform will trigger periodic patch assessments. The property provisionVMAgent must be true.",
///  "type": "string",
///  "enum": [
///    "ImageDefault",
///    "AutomaticByPlatform"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "WindowsPatchAssessmentMode",
///    "values": [
///      {
///        "name": "ImageDefault",
///        "value": "ImageDefault"
///      },
///      {
///        "name": "AutomaticByPlatform",
///        "value": "AutomaticByPlatform"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum WindowsPatchAssessmentMode {
    ImageDefault,
    AutomaticByPlatform,
}
impl ::std::convert::From<&Self> for WindowsPatchAssessmentMode {
    fn from(value: &WindowsPatchAssessmentMode) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for WindowsPatchAssessmentMode {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::ImageDefault => f.write_str("ImageDefault"),
            Self::AutomaticByPlatform => f.write_str("AutomaticByPlatform"),
        }
    }
}
impl ::std::str::FromStr for WindowsPatchAssessmentMode {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "imagedefault" => Ok(Self::ImageDefault),
            "automaticbyplatform" => Ok(Self::AutomaticByPlatform),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for WindowsPatchAssessmentMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for WindowsPatchAssessmentMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for WindowsPatchAssessmentMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the reboot setting for all AutomaticByPlatform patch installation operations.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the reboot setting for all AutomaticByPlatform patch installation operations.",
///  "type": "string",
///  "enum": [
///    "Unknown",
///    "IfRequired",
///    "Never",
///    "Always"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "WindowsVMGuestPatchAutomaticByPlatformRebootSetting",
///    "values": [
///      {
///        "name": "Unknown",
///        "value": "Unknown"
///      },
///      {
///        "name": "IfRequired",
///        "value": "IfRequired"
///      },
///      {
///        "name": "Never",
///        "value": "Never"
///      },
///      {
///        "name": "Always",
///        "value": "Always"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum WindowsVmGuestPatchAutomaticByPlatformRebootSetting {
    Unknown,
    IfRequired,
    Never,
    Always,
}
impl ::std::convert::From<&Self>
for WindowsVmGuestPatchAutomaticByPlatformRebootSetting {
    fn from(value: &WindowsVmGuestPatchAutomaticByPlatformRebootSetting) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for WindowsVmGuestPatchAutomaticByPlatformRebootSetting {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Unknown => f.write_str("Unknown"),
            Self::IfRequired => f.write_str("IfRequired"),
            Self::Never => f.write_str("Never"),
            Self::Always => f.write_str("Always"),
        }
    }
}
impl ::std::str::FromStr for WindowsVmGuestPatchAutomaticByPlatformRebootSetting {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "unknown" => Ok(Self::Unknown),
            "ifrequired" => Ok(Self::IfRequired),
            "never" => Ok(Self::Never),
            "always" => Ok(Self::Always),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str>
for WindowsVmGuestPatchAutomaticByPlatformRebootSetting {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for WindowsVmGuestPatchAutomaticByPlatformRebootSetting {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for WindowsVmGuestPatchAutomaticByPlatformRebootSetting {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies additional settings to be applied when patch mode AutomaticByPlatform is selected in Windows patch settings.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies additional settings to be applied when patch mode AutomaticByPlatform is selected in Windows patch settings.",
///  "type": "object",
///  "properties": {
///    "bypassPlatformSafetyChecksOnUserSchedule": {
///      "description": "Enables customer to schedule patching without accidental upgrades",
///      "type": "boolean"
///    },
///    "rebootSetting": {
///      "$ref": "#/components/schemas/WindowsVMGuestPatchAutomaticByPlatformRebootSetting"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct WindowsVmGuestPatchAutomaticByPlatformSettings {
    ///Enables customer to schedule patching without accidental upgrades
    #[serde(
        rename = "bypassPlatformSafetyChecksOnUserSchedule",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub bypass_platform_safety_checks_on_user_schedule: ::std::option::Option<bool>,
    #[serde(
        rename = "rebootSetting",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub reboot_setting: ::std::option::Option<
        WindowsVmGuestPatchAutomaticByPlatformRebootSetting,
    >,
}
impl ::std::convert::From<&WindowsVmGuestPatchAutomaticByPlatformSettings>
for WindowsVmGuestPatchAutomaticByPlatformSettings {
    fn from(value: &WindowsVmGuestPatchAutomaticByPlatformSettings) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for WindowsVmGuestPatchAutomaticByPlatformSettings {
    fn default() -> Self {
        Self {
            bypass_platform_safety_checks_on_user_schedule: Default::default(),
            reboot_setting: Default::default(),
        }
    }
}
///Specifies the mode of VM Guest Patching to IaaS virtual machine or virtual machines associated to virtual machine scale set with OrchestrationMode as Flexible.<br /><br /> Possible values are:<br /><br /> **Manual** - You  control the application of patches to a virtual machine. You do this by applying patches manually inside the VM. In this mode, automatic updates are disabled; the property WindowsConfiguration.enableAutomaticUpdates must be false<br /><br /> **AutomaticByOS** - The virtual machine will automatically be updated by the OS. The property WindowsConfiguration.enableAutomaticUpdates must be true. <br /><br /> **AutomaticByPlatform** - the virtual machine will automatically updated by the platform. The properties provisionVMAgent and WindowsConfiguration.enableAutomaticUpdates must be true
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the mode of VM Guest Patching to IaaS virtual machine or virtual machines associated to virtual machine scale set with OrchestrationMode as Flexible.<br /><br /> Possible values are:<br /><br /> **Manual** - You  control the application of patches to a virtual machine. You do this by applying patches manually inside the VM. In this mode, automatic updates are disabled; the property WindowsConfiguration.enableAutomaticUpdates must be false<br /><br /> **AutomaticByOS** - The virtual machine will automatically be updated by the OS. The property WindowsConfiguration.enableAutomaticUpdates must be true. <br /><br /> **AutomaticByPlatform** - the virtual machine will automatically updated by the platform. The properties provisionVMAgent and WindowsConfiguration.enableAutomaticUpdates must be true",
///  "type": "string",
///  "enum": [
///    "Manual",
///    "AutomaticByOS",
///    "AutomaticByPlatform"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "WindowsVMGuestPatchMode",
///    "values": [
///      {
///        "name": "Manual",
///        "value": "Manual"
///      },
///      {
///        "name": "AutomaticByOS",
///        "value": "AutomaticByOS"
///      },
///      {
///        "name": "AutomaticByPlatform",
///        "value": "AutomaticByPlatform"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum WindowsVmGuestPatchMode {
    Manual,
    #[serde(rename = "AutomaticByOS")]
    AutomaticByOs,
    AutomaticByPlatform,
}
impl ::std::convert::From<&Self> for WindowsVmGuestPatchMode {
    fn from(value: &WindowsVmGuestPatchMode) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for WindowsVmGuestPatchMode {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Manual => f.write_str("Manual"),
            Self::AutomaticByOs => f.write_str("AutomaticByOS"),
            Self::AutomaticByPlatform => f.write_str("AutomaticByPlatform"),
        }
    }
}
impl ::std::str::FromStr for WindowsVmGuestPatchMode {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "manual" => Ok(Self::Manual),
            "automaticbyos" => Ok(Self::AutomaticByOs),
            "automaticbyplatform" => Ok(Self::AutomaticByPlatform),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for WindowsVmGuestPatchMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for WindowsVmGuestPatchMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for WindowsVmGuestPatchMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///Specifies the align mode between Virtual Machine Scale Set compute and storage Fault Domain count.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the align mode between Virtual Machine Scale Set compute and storage Fault Domain count.",
///  "type": "string",
///  "enum": [
///    "Aligned",
///    "Unaligned"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ZonalPlatformFaultDomainAlignMode",
///    "values": [
///      {
///        "name": "Aligned",
///        "value": "Aligned"
///      },
///      {
///        "name": "Unaligned",
///        "value": "Unaligned"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ZonalPlatformFaultDomainAlignMode {
    Aligned,
    Unaligned,
}
impl ::std::convert::From<&Self> for ZonalPlatformFaultDomainAlignMode {
    fn from(value: &ZonalPlatformFaultDomainAlignMode) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ZonalPlatformFaultDomainAlignMode {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Aligned => f.write_str("Aligned"),
            Self::Unaligned => f.write_str("Unaligned"),
        }
    }
}
impl ::std::str::FromStr for ZonalPlatformFaultDomainAlignMode {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "aligned" => Ok(Self::Aligned),
            "unaligned" => Ok(Self::Unaligned),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ZonalPlatformFaultDomainAlignMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String>
for ZonalPlatformFaultDomainAlignMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String>
for ZonalPlatformFaultDomainAlignMode {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
///The configuration parameters for zone allocation of a virtual machine scale set.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "The configuration parameters for zone allocation of a virtual machine scale set.",
///  "type": "object",
///  "properties": {
///    "maxInstancePercentPerZonePolicy": {
///      "$ref": "#/components/schemas/MaxInstancePercentPerZonePolicy"
///    },
///    "maxZoneCount": {
///      "description": "The maximum number of availability zones to use if the ZonePlacementPolicy is 'Auto'. If not specified, all availability zones will be used.",
///      "type": "integer",
///      "format": "int32"
///    }
///  }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
pub struct ZoneAllocationPolicy {
    #[serde(
        rename = "maxInstancePercentPerZonePolicy",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub max_instance_percent_per_zone_policy: ::std::option::Option<
        MaxInstancePercentPerZonePolicy,
    >,
    ///The maximum number of availability zones to use if the ZonePlacementPolicy is 'Auto'. If not specified, all availability zones will be used.
    #[serde(
        rename = "maxZoneCount",
        default,
        skip_serializing_if = "::std::option::Option::is_none",
        deserialize_with = "serde_aux::field_attributes::deserialize_default_from_null"
    )]
    pub max_zone_count: ::std::option::Option<i32>,
}
impl ::std::convert::From<&ZoneAllocationPolicy> for ZoneAllocationPolicy {
    fn from(value: &ZoneAllocationPolicy) -> Self {
        value.clone()
    }
}
impl ::std::default::Default for ZoneAllocationPolicy {
    fn default() -> Self {
        Self {
            max_instance_percent_per_zone_policy: Default::default(),
            max_zone_count: Default::default(),
        }
    }
}
///Specifies the policy for resource's placement in availability zone. Possible values are: **Any** (used for Virtual Machines), **Auto** (used for Virtual Machine Scale Sets) - An availability zone will be automatically picked by system as part of resource creation.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
///  "description": "Specifies the policy for resource's placement in availability zone. Possible values are: **Any** (used for Virtual Machines), **Auto** (used for Virtual Machine Scale Sets) - An availability zone will be automatically picked by system as part of resource creation.",
///  "type": "string",
///  "enum": [
///    "Any",
///    "Auto"
///  ],
///  "x-ms-enum": {
///    "modelAsString": true,
///    "name": "ZonePlacementPolicyType",
///    "values": [
///      {
///        "name": "Any",
///        "value": "Any"
///      },
///      {
///        "description": "Automatic zone placement in a Virtual Machine Scale Set.",
///        "name": "Auto",
///        "value": "Auto"
///      }
///    ]
///  }
///}
/// ```
/// </details>
#[derive(
    ::serde::Deserialize,
    ::serde::Serialize,
    Clone,
    Copy,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd
)]
#[serde(try_from = "String")]
pub enum ZonePlacementPolicyType {
    Any,
    Auto,
}
impl ::std::convert::From<&Self> for ZonePlacementPolicyType {
    fn from(value: &ZonePlacementPolicyType) -> Self {
        value.clone()
    }
}
impl ::std::fmt::Display for ZonePlacementPolicyType {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        match *self {
            Self::Any => f.write_str("Any"),
            Self::Auto => f.write_str("Auto"),
        }
    }
}
impl ::std::str::FromStr for ZonePlacementPolicyType {
    type Err = self::error::ConversionError;
    fn from_str(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        match value.to_ascii_lowercase().as_str() {
            "any" => Ok(Self::Any),
            "auto" => Ok(Self::Auto),
            _ => Err("invalid value".into()),
        }
    }
}
impl ::std::convert::TryFrom<&str> for ZonePlacementPolicyType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &str,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<&::std::string::String> for ZonePlacementPolicyType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: &::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
impl ::std::convert::TryFrom<::std::string::String> for ZonePlacementPolicyType {
    type Error = self::error::ConversionError;
    fn try_from(
        value: ::std::string::String,
    ) -> ::std::result::Result<Self, self::error::ConversionError> {
        value.parse()
    }
}
