/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 * 
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is
 * regenerated.
// TODO: Include PageTemplateModels here too?? Probably
 */


/**
 * @class
 * Initializes a new instance of the InstanceViewStatus class.
 * @constructor
 * Instance view status.
 * @member {string} [code] the status Code.
 * 
 * @member {string} [level] the level Code. Possible values include: 'Info',
 * 'Warning', 'Error'
 * 
 * @member {string} [displayStatus] the short localizable label for the status.
 * 
 * @member {string} [message] the detailed Message, including for alerts and
 * error messages.
 * 
 * @member {date} [time] the time of the status.
 * 
 */
export interface InstanceViewStatus {
    code?: string;
    level?: string;
    displayStatus?: string;
    message?: string;
    time?: Date;
}

/**
 * @class
 * Initializes a new instance of the SubResource class.
 * @constructor
 * @member {string} [id] Resource Id
 * 
 */
export interface SubResource extends BaseResource {
    id?: string;
}

/**
 * @class
 * Initializes a new instance of the Resource class.
 * @constructor
 * @member {string} [id] Resource Id
 * 
 * @member {string} [name] Resource name
 * 
 * @member {string} [type] Resource type
 * 
 * @member {string} location Resource location
 * 
 * @member {object} [tags] Resource tags
 * 
 */
export interface Resource extends BaseResource {
    id?: string;
    name?: string;
    type?: string;
    location: string;
    tags?: { [propertyName: string]: string };
}

/**
 * @class
 * Initializes a new instance of the AvailabilitySet class.
 * @constructor
 * Create or update Availability Set parameters.
 * @member {number} [platformUpdateDomainCount] Update Domain count.
 * 
 * @member {number} [platformFaultDomainCount] Fault Domain count.
 * 
 * @member {array} [virtualMachines] a list containing reference to all
 * Virtual Machines created under this Availability Set.
 * 
 * @member {array} [statuses] the resource status information.
 * 
 */
export interface AvailabilitySet extends Resource {
    platformUpdateDomainCount?: number;
    platformFaultDomainCount?: number;
    virtualMachines?: SubResource[];
    statuses?: InstanceViewStatus[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineSize class.
 * @constructor
 * Describes the properties of a VM size.
 * @member {string} [name] the VM size name.
 * 
 * @member {number} [numberOfCores] the Number of cores supported by a VM size.
 * 
 * @member {number} [osDiskSizeInMB] the OS disk size allowed by a VM size.
 * 
 * @member {number} [resourceDiskSizeInMB] the Resource disk size allowed by a
 * VM size.
 * 
 * @member {number} [memoryInMB] the Memory size supported by a VM size.
 * 
 * @member {number} [maxDataDiskCount] the Maximum number of data disks
 * allowed by a VM size.
 * 
 */
export interface VirtualMachineSize {
    name?: string;
    numberOfCores?: number;
    osDiskSizeInMB?: number;
    resourceDiskSizeInMB?: number;
    memoryInMB?: number;
    maxDataDiskCount?: number;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineExtensionImage class.
 * @constructor
 * Describes a Virtual Machine Extension Image.
 * @member {string} operatingSystem the operating system this extension
 * supports.
 * 
 * @member {string} computeRole the type of role (IaaS or PaaS) this extension
 * supports.
 * 
 * @member {string} handlerSchema the schema defined by publisher, where
 * extension consumers should provide settings in a matching schema.
 * 
 * @member {boolean} [vmScaleSetEnabled] 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.
 * 
 * @member {boolean} [supportsMultipleExtensions] whether the handler can
 * support multiple extensions.
 * 
 */
export interface VirtualMachineExtensionImage extends Resource {
    operatingSystem: string;
    computeRole: string;
    handlerSchema: string;
    vmScaleSetEnabled?: boolean;
    supportsMultipleExtensions?: boolean;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineImageResource class.
 * @constructor
 * Virtual machine image resource information.
 * @member {string} name the name of the resource.
 * 
 * @member {string} location the location of the resource.
 * 
 * @member {object} [tags] the tags attached to the resource.
 * 
 */
export interface VirtualMachineImageResource extends SubResource {
    name: string;
    location: string;
    tags?: { [propertyName: string]: string };
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineExtensionInstanceView class.
 * @constructor
 * The instance view of a virtual machine extension.
 * @member {string} [name] the virtual machine extension name.
 * 
 * @member {string} [type] the full type of the extension handler which
 * includes both publisher and type.
 * 
 * @member {string} [typeHandlerVersion] the type version of the extension
 * handler.
 * 
 * @member {array} [substatuses] the resource status information.
 * 
 * @member {array} [statuses] the resource status information.
 * 
 */
export interface VirtualMachineExtensionInstanceView {
    name?: string;
    type?: string;
    typeHandlerVersion?: string;
    substatuses?: InstanceViewStatus[];
    statuses?: InstanceViewStatus[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineExtension class.
 * @constructor
 * Describes a Virtual Machine Extension.
 * @member {string} [forceUpdateTag] how the extension handler should be
 * forced to update even if the extension configuration has not changed.
 * 
 * @member {string} [publisher] the name of the extension handler publisher.
 * 
 * @member {string} [virtualMachineExtensionType] the type of the extension
 * handler.
 * 
 * @member {string} [typeHandlerVersion] the type version of the extension
 * handler.
 * 
 * @member {boolean} [autoUpgradeMinorVersion] whether the extension handler
 * should be automatically upgraded across minor versions.
 * 
 * @member {object} [settings] Json formatted public settings for the
 * extension.
 * 
 * @member {object} [protectedSettings] Json formatted protected settings for
 * the extension.
 * 
 * @member {string} [provisioningState] the provisioning state, which only
 * appears in the response.
 * 
 * @member {object} [instanceView] the virtual machine extension instance view.
 * 
 * @member {string} [instanceView.name] the virtual machine extension name.
 * 
 * @member {string} [instanceView.type] the full type of the extension handler
 * which includes both publisher and type.
 * 
 * @member {string} [instanceView.typeHandlerVersion] the type version of the
 * extension handler.
 * 
 * @member {array} [instanceView.substatuses] the resource status information.
 * 
 * @member {array} [instanceView.statuses] the resource status information.
 * 
 */
export interface VirtualMachineExtension extends Resource {
    forceUpdateTag?: string;
    publisher?: string;
    virtualMachineExtensionType?: string;
    typeHandlerVersion?: string;
    autoUpgradeMinorVersion?: boolean;
    settings?: any;
    protectedSettings?: any;
    provisioningState?: string;
    instanceView?: VirtualMachineExtensionInstanceView;
}

/**
 * @class
 * Initializes a new instance of the PurchasePlan class.
 * @constructor
 * Used for establishing the purchase context of any 3rd Party artifact
 * through MarketPlace.
 * @member {string} publisher the publisher ID.
 * 
 * @member {string} name the plan ID.
 * 
 * @member {string} product the product ID.
 * 
 */
export interface PurchasePlan {
    publisher: string;
    name: string;
    product: string;
}

/**
 * @class
 * Initializes a new instance of the OSDiskImage class.
 * @constructor
 * Contains the os disk image information.
 * @member {string} operatingSystem the operating system of the osDiskImage.
 * Possible values include: 'Windows', 'Linux'
 * 
 */
export interface OSDiskImage {
    operatingSystem: string;
}

/**
 * @class
 * Initializes a new instance of the DataDiskImage class.
 * @constructor
 * Contains the data disk images information.
 * @member {number} [lun] the LUN number for a data disk.This value is used to
 * identify data disk image inside the VMImage therefore it must be unique
 * for each data disk.The allowed character for the value is digit.
 * 
 */
export interface DataDiskImage {
    lun?: number;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineImage class.
 * @constructor
 * Describes a Virtual Machine Image.
 * @member {object} [plan]
 * 
 * @member {string} [plan.publisher] the publisher ID.
 * 
 * @member {string} [plan.name] the plan ID.
 * 
 * @member {string} [plan.product] the product ID.
 * 
 * @member {object} [osDiskImage]
 * 
 * @member {string} [osDiskImage.operatingSystem] the operating system of the
 * osDiskImage. Possible values include: 'Windows', 'Linux'
 * 
 * @member {array} [dataDiskImages]
 * 
 */
export interface VirtualMachineImage extends VirtualMachineImageResource {
    plan?: PurchasePlan;
    osDiskImage?: OSDiskImage;
    dataDiskImages?: DataDiskImage[];
}

/**
 * @class
 * Initializes a new instance of the UsageName class.
 * @constructor
 * The Usage Names.
 * @member {string} [value] a string describing the resource name.
 * 
 * @member {string} [localizedValue] a localized string describing the
 * resource name.
 * 
 */
export interface UsageName {
    value?: string;
    localizedValue?: string;
}

/**
 * @class
 * Initializes a new instance of the Usage class.
 * @constructor
 * Describes Compute Resource Usage.
 * @member {number} currentValue the current value of the usage.
 * 
 * @member {number} limit the limit of usage.
 * 
 * @member {object} name the name of the type of usage.
 * 
 * @member {string} [name.value] a string describing the resource name.
 * 
 * @member {string} [name.localizedValue] a localized string describing the
 * resource name.
 * 
 */
export interface Usage {
    currentValue: number;
    limit: number;
    name: UsageName;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineCaptureParameters class.
 * @constructor
 * Capture Virtual Machine parameters.
 * @member {string} vhdPrefix the captured VirtualHardDisk's name prefix.
 * 
 * @member {string} destinationContainerName the destination container name.
 * 
 * @member {boolean} overwriteVhds whether it overwrites destination
 * VirtualHardDisk if true, in case of conflict.
 * 
 */
export interface VirtualMachineCaptureParameters {
    vhdPrefix: string;
    destinationContainerName: string;
    overwriteVhds: boolean;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineCaptureResult class.
 * @constructor
 * Resource Id.
 * @member {object} [output] Operation output data (raw JSON)
 * 
 */
export interface VirtualMachineCaptureResult extends SubResource {
    output?: any;
}

/**
 * @class
 * Initializes a new instance of the Plan class.
 * @constructor
 * Plan for the resource.
 * @member {string} [name] the plan ID.
 * 
 * @member {string} [publisher] the publisher ID.
 * 
 * @member {string} [product] the offer ID.
 * 
 * @member {string} [promotionCode] the promotion code.
 * 
 */
export interface Plan {
    name?: string;
    publisher?: string;
    product?: string;
    promotionCode?: string;
}

/**
 * @class
 * Initializes a new instance of the HardwareProfile class.
 * @constructor
 * Describes a hardware profile.
 * @member {string} [vmSize] The virtual machine size name. Possible values
 * include: '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_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_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_G1', 'Standard_G2', 'Standard_G3',
 * 'Standard_G4', 'Standard_G5', 'Standard_GS1', 'Standard_GS2',
 * 'Standard_GS3', 'Standard_GS4', 'Standard_GS5'
 * 
 */
export interface HardwareProfile {
    vmSize?: string;
}

/**
 * @class
 * Initializes a new instance of the ImageReference class.
 * @constructor
 * The image reference.
 * @member {string} [publisher] the image publisher.
 * 
 * @member {string} [offer] the image offer.
 * 
 * @member {string} [sku] the image sku.
 * 
 * @member {string} [version] the image version. The allowed formats are
 * Major.Minor.Build or 'latest'. Major, Minor and Build being decimal
 * numbers. Specify 'latest' to use the latest version of image.
 * 
 */
export interface ImageReference {
    publisher?: string;
    offer?: string;
    sku?: string;
    version?: string;
}

/**
 * @class
 * Initializes a new instance of the KeyVaultSecretReference class.
 * @constructor
 * Describes a reference to Key Vault Secret
 * @member {string} secretUrl the URL referencing a secret in a Key Vault.
 * 
 * @member {object} sourceVault the Relative URL of the Key Vault containing
 * the secret.
 * 
 * @member {string} [sourceVault.id] Resource Id
 * 
 */
export interface KeyVaultSecretReference {
    secretUrl: string;
    sourceVault: SubResource;
}

/**
 * @class
 * Initializes a new instance of the KeyVaultKeyReference class.
 * @constructor
 * Describes a reference to Key Vault Key
 * @member {string} keyUrl the URL referencing a key in a Key Vault.
 * 
 * @member {object} sourceVault the Relative URL of the Key Vault containing
 * the key
 * 
 * @member {string} [sourceVault.id] Resource Id
 * 
 */
export interface KeyVaultKeyReference {
    keyUrl: string;
    sourceVault: SubResource;
}

/**
 * @class
 * Initializes a new instance of the DiskEncryptionSettings class.
 * @constructor
 * Describes a Encryption Settings for a Disk
 * @member {object} [diskEncryptionKey] the disk encryption key which is a
 * KeyVault Secret.
 * 
 * @member {string} [diskEncryptionKey.secretUrl] the URL referencing a secret
 * in a Key Vault.
 * 
 * @member {object} [diskEncryptionKey.sourceVault] the Relative URL of the
 * Key Vault containing the secret.
 * 
 * @member {string} [diskEncryptionKey.sourceVault.id] Resource Id
 * 
 * @member {object} [keyEncryptionKey] the key encryption key which is
 * KeyVault Key.
 * 
 * @member {string} [keyEncryptionKey.keyUrl] the URL referencing a key in a
 * Key Vault.
 * 
 * @member {object} [keyEncryptionKey.sourceVault] the Relative URL of the Key
 * Vault containing the key
 * 
 * @member {string} [keyEncryptionKey.sourceVault.id] Resource Id
 * 
 * @member {boolean} [enabled] whether disk encryption should be enabled on
 * the Virtual Machine.
 * 
 */
export interface DiskEncryptionSettings {
    diskEncryptionKey?: KeyVaultSecretReference;
    keyEncryptionKey?: KeyVaultKeyReference;
    enabled?: boolean;
}

/**
 * @class
 * Initializes a new instance of the VirtualHardDisk class.
 * @constructor
 * Describes the uri of a disk.
 * @member {string} [uri] the virtual hard disk's uri. It should be a valid
 * Uri to a virtual hard disk.
 * 
 */
export interface VirtualHardDisk {
    uri?: string;
}

/**
 * @class
 * Initializes a new instance of the OSDisk class.
 * @constructor
 * Describes an Operating System disk.
 * @member {string} [osType] the Operating System type. Possible values
 * include: 'Windows', 'Linux'
 * 
 * @member {object} [encryptionSettings] the disk encryption settings.
 * 
 * @member {object} [encryptionSettings.diskEncryptionKey] the disk encryption
 * key which is a KeyVault Secret.
 * 
 * @member {string} [encryptionSettings.diskEncryptionKey.secretUrl] the URL
 * referencing a secret in a Key Vault.
 * 
 * @member {object} [encryptionSettings.diskEncryptionKey.sourceVault] the
 * Relative URL of the Key Vault containing the secret.
 * 
 * @member {string} [encryptionSettings.diskEncryptionKey.sourceVault.id]
 * Resource Id
 * 
 * @member {object} [encryptionSettings.keyEncryptionKey] the key encryption
 * key which is KeyVault Key.
 * 
 * @member {string} [encryptionSettings.keyEncryptionKey.keyUrl] the URL
 * referencing a key in a Key Vault.
 * 
 * @member {object} [encryptionSettings.keyEncryptionKey.sourceVault] the
 * Relative URL of the Key Vault containing the key
 * 
 * @member {string} [encryptionSettings.keyEncryptionKey.sourceVault.id]
 * Resource Id
 * 
 * @member {boolean} [encryptionSettings.enabled] whether disk encryption
 * should be enabled on the Virtual Machine.
 * 
 * @member {string} name the disk name.
 * 
 * @member {object} vhd the Virtual Hard Disk.
 * 
 * @member {string} [vhd.uri] the virtual hard disk's uri. It should be a
 * valid Uri to a virtual hard disk.
 * 
 * @member {object} [image] the Source User Image VirtualHardDisk. This
 * VirtualHardDisk will be copied before using it to attach to the Virtual
 * Machine.If SourceImage is provided, the destination VirtualHardDisk should
 * not exist.
 * 
 * @member {string} [image.uri] the virtual hard disk's uri. It should be a
 * valid Uri to a virtual hard disk.
 * 
 * @member {string} [caching] the caching type. Possible values include:
 * 'None', 'ReadOnly', 'ReadWrite'
 * 
 * @member {string} createOption the create option. Possible values include:
 * 'fromImage', 'empty', 'attach'
 * 
 * @member {number} [diskSizeGB] the initial disk size in GB for blank data
 * disks, and the new desired size for existing OS and Data disks.
 * 
 */
export interface OSDisk {
    osType?: string;
    encryptionSettings?: DiskEncryptionSettings;
    name: string;
    vhd: VirtualHardDisk;
    image?: VirtualHardDisk;
    caching?: string;
    createOption: string;
    diskSizeGB?: number;
}

/**
 * @class
 * Initializes a new instance of the DataDisk class.
 * @constructor
 * Describes a data disk.
 * @member {number} lun the logical unit number.
 * 
 * @member {string} name the disk name.
 * 
 * @member {object} vhd the Virtual Hard Disk.
 * 
 * @member {string} [vhd.uri] the virtual hard disk's uri. It should be a
 * valid Uri to a virtual hard disk.
 * 
 * @member {object} [image] the Source User Image VirtualHardDisk. This
 * VirtualHardDisk will be copied before using it to attach to the Virtual
 * Machine.If SourceImage is provided, the destination VirtualHardDisk should
 * not exist.
 * 
 * @member {string} [image.uri] the virtual hard disk's uri. It should be a
 * valid Uri to a virtual hard disk.
 * 
 * @member {string} [caching] the caching type. Possible values include:
 * 'None', 'ReadOnly', 'ReadWrite'
 * 
 * @member {string} createOption the create option. Possible values include:
 * 'fromImage', 'empty', 'attach'
 * 
 * @member {number} [diskSizeGB] the initial disk size in GB for blank data
 * disks, and the new desired size for existing OS and Data disks.
 * 
 */
export interface DataDisk {
    lun: number;
    name: string;
    vhd: VirtualHardDisk;
    image?: VirtualHardDisk;
    caching?: string;
    createOption: string;
    diskSizeGB?: number;
}

/**
 * @class
 * Initializes a new instance of the StorageProfile class.
 * @constructor
 * Describes a storage profile.
 * @member {object} [imageReference] the image reference.
 * 
 * @member {string} [imageReference.publisher] the image publisher.
 * 
 * @member {string} [imageReference.offer] the image offer.
 * 
 * @member {string} [imageReference.sku] the image sku.
 * 
 * @member {string} [imageReference.version] the image version. The allowed
 * formats are Major.Minor.Build or 'latest'. Major, Minor and Build being
 * decimal numbers. Specify 'latest' to use the latest version of image.
 * 
 * @member {object} [osDisk] the OS disk.
 * 
 * @member {string} [osDisk.osType] the Operating System type. Possible values
 * include: 'Windows', 'Linux'
 * 
 * @member {object} [osDisk.encryptionSettings] the disk encryption settings.
 * 
 * @member {object} [osDisk.encryptionSettings.diskEncryptionKey] the disk
 * encryption key which is a KeyVault Secret.
 * 
 * @member {string} [osDisk.encryptionSettings.diskEncryptionKey.secretUrl]
 * the URL referencing a secret in a Key Vault.
 * 
 * @member {object} [osDisk.encryptionSettings.diskEncryptionKey.sourceVault]
 * the Relative URL of the Key Vault containing the secret.
 * 
 * @member {string}
 * [osDisk.encryptionSettings.diskEncryptionKey.sourceVault.id] Resource Id
 * 
 * @member {object} [osDisk.encryptionSettings.keyEncryptionKey] the key
 * encryption key which is KeyVault Key.
 * 
 * @member {string} [osDisk.encryptionSettings.keyEncryptionKey.keyUrl] the
 * URL referencing a key in a Key Vault.
 * 
 * @member {object} [osDisk.encryptionSettings.keyEncryptionKey.sourceVault]
 * the Relative URL of the Key Vault containing the key
 * 
 * @member {string}
 * [osDisk.encryptionSettings.keyEncryptionKey.sourceVault.id] Resource Id
 * 
 * @member {boolean} [osDisk.encryptionSettings.enabled] whether disk
 * encryption should be enabled on the Virtual Machine.
 * 
 * @member {string} [osDisk.name] the disk name.
 * 
 * @member {object} [osDisk.vhd] the Virtual Hard Disk.
 * 
 * @member {string} [osDisk.vhd.uri] the virtual hard disk's uri. It should be
 * a valid Uri to a virtual hard disk.
 * 
 * @member {object} [osDisk.image] the Source User Image VirtualHardDisk. This
 * VirtualHardDisk will be copied before using it to attach to the Virtual
 * Machine.If SourceImage is provided, the destination VirtualHardDisk should
 * not exist.
 * 
 * @member {string} [osDisk.image.uri] the virtual hard disk's uri. It should
 * be a valid Uri to a virtual hard disk.
 * 
 * @member {string} [osDisk.caching] the caching type. Possible values
 * include: 'None', 'ReadOnly', 'ReadWrite'
 * 
 * @member {string} [osDisk.createOption] the create option. Possible values
 * include: 'fromImage', 'empty', 'attach'
 * 
 * @member {number} [osDisk.diskSizeGB] the initial disk size in GB for blank
 * data disks, and the new desired size for existing OS and Data disks.
 * 
 * @member {array} [dataDisks] the data disks.
 * 
 */
export interface StorageProfile {
    imageReference?: ImageReference;
    osDisk?: OSDisk;
    dataDisks?: DataDisk[];
}

/**
 * @class
 * Initializes a new instance of the AdditionalUnattendContent class.
 * @constructor
 * 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 a
 * applied.
 * @member {string} [passName] the pass name. Currently, the only allowable
 * value is oobeSystem. Possible values include: 'oobeSystem'
 * 
 * @member {string} [componentName] the component name. Currently, the only
 * allowable value is Microsoft-Windows-Shell-Setup. Possible values include:
 * 'Microsoft-Windows-Shell-Setup'
 * 
 * @member {string} [settingName] setting name (e.g. FirstLogonCommands,
 * AutoLogon ). Possible values include: 'AutoLogon', 'FirstLogonCommands'
 * 
 * @member {string} [content] XML formatted content that is added to the
 * unattend.xml file in the specified pass and component.The XML must be less
 * than 4 KB and must include the root element for the setting or feature
 * that is being inserted.
 * 
 */
export interface AdditionalUnattendContent {
    passName?: string;
    componentName?: string;
    settingName?: string;
    content?: string;
}

/**
 * @class
 * Initializes a new instance of the WinRMListener class.
 * @constructor
 * Describes Protocol and thumbprint of Windows Remote Management listener
 * @member {string} [protocol] the Protocol used by WinRM listener. Currently
 * only Http and Https are supported. Possible values include: 'Http', 'Https'
 * 
 * @member {string} [certificateUrl] the Certificate URL in KMS for Https
 * listeners. Should be null for Http listeners.
 * 
 */
export interface WinRMListener {
    protocol?: string;
    certificateUrl?: string;
}

/**
 * @class
 * Initializes a new instance of the WinRMConfiguration class.
 * @constructor
 * Describes Windows Remote Management configuration of the VM
 * @member {array} [listeners] the list of Windows Remote Management listeners
 * 
 */
export interface WinRMConfiguration {
    listeners?: WinRMListener[];
}

/**
 * @class
 * Initializes a new instance of the WindowsConfiguration class.
 * @constructor
 * Describes Windows Configuration of the OS Profile.
 * @member {boolean} [provisionVMAgent] whether VM Agent should be provisioned
 * on the Virtual Machine.
 * 
 * @member {boolean} [enableAutomaticUpdates] whether Windows updates are
 * automatically installed on the VM
 * 
 * @member {string} [timeZone] the Time Zone of the VM
 * 
 * @member {array} [additionalUnattendContent] the additional base-64 encoded
 * XML formatted information that can be included in the Unattend.xml file.
 * 
 * @member {object} [winRM] the Windows Remote Management configuration of the
 * VM
 * 
 * @member {array} [winRM.listeners] the list of Windows Remote Management
 * listeners
 * 
 */
export interface WindowsConfiguration {
    provisionVMAgent?: boolean;
    enableAutomaticUpdates?: boolean;
    timeZone?: string;
    additionalUnattendContent?: AdditionalUnattendContent[];
    winRM?: WinRMConfiguration;
}

/**
 * @class
 * Initializes a new instance of the SshPublicKey class.
 * @constructor
 * Contains information about SSH certificate public key and the path on the
 * Linux VM where the public key is placed.
 * @member {string} [path] 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.
 * 
 * @member {string} [keyData] Certificate public key used to authenticate with
 * VM through SSH.The certificate must be in Pem format with or without
 * headers.
 * 
 */
export interface SshPublicKey {
    path?: string;
    keyData?: string;
}

/**
 * @class
 * Initializes a new instance of the SshConfiguration class.
 * @constructor
 * SSH configuration for Linux based VMs running on Azure
 * @member {array} [publicKeys] the list of SSH public keys used to
 * authenticate with linux based VMs
 * 
 */
export interface SshConfiguration {
    publicKeys?: SshPublicKey[];
}

/**
 * @class
 * Initializes a new instance of the LinuxConfiguration class.
 * @constructor
 * Describes Windows Configuration of the OS Profile.
 * @member {boolean} [disablePasswordAuthentication] whether Authentication
 * using user name and password is allowed or not
 * 
 * @member {object} [ssh] the SSH configuration for linux VMs
 * 
 * @member {array} [ssh.publicKeys] the list of SSH public keys used to
 * authenticate with linux based VMs
 * 
 */
export interface LinuxConfiguration {
    disablePasswordAuthentication?: boolean;
    ssh?: SshConfiguration;
}

/**
 * @class
 * Initializes a new instance of the VaultCertificate class.
 * @constructor
 * Describes a single certificate reference in a Key Vault, and where the
 * certificate should reside on the VM.
 * @member {string} [certificateUrl] the URL referencing a secret in a Key
 * Vault which contains a properly formatted certificate.
 * 
 * @member {string} [certificateStore] the Certificate store in LocalMachine
 * to add the certificate to on Windows, leave empty on Linux.
 * 
 */
export interface VaultCertificate {
    certificateUrl?: string;
    certificateStore?: string;
}

/**
 * @class
 * Initializes a new instance of the VaultSecretGroup class.
 * @constructor
 * Describes a set of certificates which are all in the same Key Vault.
 * @member {object} [sourceVault] the Relative URL of the Key Vault containing
 * all of the certificates in VaultCertificates.
 * 
 * @member {string} [sourceVault.id] Resource Id
 * 
 * @member {array} [vaultCertificates] the list of key vault references in
 * SourceVault which contain certificates
 * 
 */
export interface VaultSecretGroup {
    sourceVault?: SubResource;
    vaultCertificates?: VaultCertificate[];
}

/**
 * @class
 * Initializes a new instance of the OSProfile class.
 * @constructor
 * Describes an OS profile.
 * @member {string} [computerName] the computer name.
 * 
 * @member {string} [adminUsername] the admin user name.
 * 
 * @member {string} [adminPassword] the admin user password.
 * 
 * @member {string} [customData] a base-64 encoded string of custom data.
 * 
 * @member {object} [windowsConfiguration] the Windows Configuration of the OS
 * profile.
 * 
 * @member {boolean} [windowsConfiguration.provisionVMAgent] whether VM Agent
 * should be provisioned on the Virtual Machine.
 * 
 * @member {boolean} [windowsConfiguration.enableAutomaticUpdates] whether
 * Windows updates are automatically installed on the VM
 * 
 * @member {string} [windowsConfiguration.timeZone] the Time Zone of the VM
 * 
 * @member {array} [windowsConfiguration.additionalUnattendContent] the
 * additional base-64 encoded XML formatted information that can be included
 * in the Unattend.xml file.
 * 
 * @member {object} [windowsConfiguration.winRM] the Windows Remote Management
 * configuration of the VM
 * 
 * @member {array} [windowsConfiguration.winRM.listeners] the list of Windows
 * Remote Management listeners
 * 
 * @member {object} [linuxConfiguration] the Linux Configuration of the OS
 * profile.
 * 
 * @member {boolean} [linuxConfiguration.disablePasswordAuthentication]
 * whether Authentication using user name and password is allowed or not
 * 
 * @member {object} [linuxConfiguration.ssh] the SSH configuration for linux
 * VMs
 * 
 * @member {array} [linuxConfiguration.ssh.publicKeys] the list of SSH public
 * keys used to authenticate with linux based VMs
 * 
 * @member {array} [secrets] the List of certificates for addition to the VM.
 * 
 */
export interface OSProfile {
    computerName?: string;
    adminUsername?: string;
    adminPassword?: string;
    customData?: string;
    windowsConfiguration?: WindowsConfiguration;
    linuxConfiguration?: LinuxConfiguration;
    secrets?: VaultSecretGroup[];
}

/**
 * @class
 * Initializes a new instance of the NetworkInterfaceReference class.
 * @constructor
 * Describes a network interface reference.
 * @member {boolean} [primary] whether this is a primary NIC on a virtual
 * machine
 * 
 */
export interface NetworkInterfaceReference extends SubResource {
    primary?: boolean;
}

/**
 * @class
 * Initializes a new instance of the NetworkProfile class.
 * @constructor
 * Describes a network profile.
 * @member {array} [networkInterfaces] the network interfaces.
 * 
 */
export interface NetworkProfile {
    networkInterfaces?: NetworkInterfaceReference[];
}

/**
 * @class
 * Initializes a new instance of the BootDiagnostics class.
 * @constructor
 * Describes Boot Diagnostics.
 * @member {boolean} [enabled] whether boot diagnostics should be enabled on
 * the Virtual Machine.
 * 
 * @member {string} [storageUri] the boot diagnostics storage Uri. It should
 * be a valid Uri
 * 
 */
export interface BootDiagnostics {
    enabled?: boolean;
    storageUri?: string;
}

/**
 * @class
 * Initializes a new instance of the DiagnosticsProfile class.
 * @constructor
 * Describes a diagnostics profile.
 * @member {object} [bootDiagnostics] the boot diagnostics.
 * 
 * @member {boolean} [bootDiagnostics.enabled] whether boot diagnostics should
 * be enabled on the Virtual Machine.
 * 
 * @member {string} [bootDiagnostics.storageUri] the boot diagnostics storage
 * Uri. It should be a valid Uri
 * 
 */
export interface DiagnosticsProfile {
    bootDiagnostics?: BootDiagnostics;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineExtensionHandlerInstanceView class.
 * @constructor
 * The instance view of a virtual machine extension handler.
 * @member {string} [type] full type of the extension handler which includes
 * both publisher and type.
 * 
 * @member {string} [typeHandlerVersion] the type version of the extension
 * handler.
 * 
 * @member {object} [status] the extension handler status.
 * 
 * @member {string} [status.code] the status Code.
 * 
 * @member {string} [status.level] the level Code. Possible values include:
 * 'Info', 'Warning', 'Error'
 * 
 * @member {string} [status.displayStatus] the short localizable label for the
 * status.
 * 
 * @member {string} [status.message] the detailed Message, including for
 * alerts and error messages.
 * 
 * @member {date} [status.time] the time of the status.
 * 
 */
export interface VirtualMachineExtensionHandlerInstanceView {
    type?: string;
    typeHandlerVersion?: string;
    status?: InstanceViewStatus;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineAgentInstanceView class.
 * @constructor
 * The instance view of the VM Agent running on the virtual machine.
 * @member {string} [vmAgentVersion] the VM Agent full version.
 * 
 * @member {array} [extensionHandlers] the virtual machine extension handler
 * instance view.
 * 
 * @member {array} [statuses] the resource status information.
 * 
 */
export interface VirtualMachineAgentInstanceView {
    vmAgentVersion?: string;
    extensionHandlers?: VirtualMachineExtensionHandlerInstanceView[];
    statuses?: InstanceViewStatus[];
}

/**
 * @class
 * Initializes a new instance of the DiskInstanceView class.
 * @constructor
 * The instance view of the disk.
 * @member {string} [name] the disk name.
 * 
 * @member {array} [statuses] the resource status information.
 * 
 */
export interface DiskInstanceView {
    name?: string;
    statuses?: InstanceViewStatus[];
}

/**
 * @class
 * Initializes a new instance of the BootDiagnosticsInstanceView class.
 * @constructor
 * The instance view of a virtual machine boot diagnostics.
 * @member {string} [consoleScreenshotBlobUri] the console screenshot blob Uri.
 * 
 * @member {string} [serialConsoleLogBlobUri] the Linux serial console log
 * blob Uri.
 * 
 */
export interface BootDiagnosticsInstanceView {
    consoleScreenshotBlobUri?: string;
    serialConsoleLogBlobUri?: string;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineInstanceView class.
 * @constructor
 * The instance view of a virtual machine.
 * @member {number} [platformUpdateDomain] the Update Domain count.
 * 
 * @member {number} [platformFaultDomain] the Fault Domain count.
 * 
 * @member {string} [rdpThumbPrint] the Remote desktop certificate thumbprint.
 * 
 * @member {object} [vmAgent] the VM Agent running on the virtual machine.
 * 
 * @member {string} [vmAgent.vmAgentVersion] the VM Agent full version.
 * 
 * @member {array} [vmAgent.extensionHandlers] the virtual machine extension
 * handler instance view.
 * 
 * @member {array} [vmAgent.statuses] the resource status information.
 * 
 * @member {array} [disks] the disks information.
 * 
 * @member {array} [extensions] the extensions information.
 * 
 * @member {object} [bootDiagnostics] the boot diagnostics.
 * 
 * @member {string} [bootDiagnostics.consoleScreenshotBlobUri] the console
 * screenshot blob Uri.
 * 
 * @member {string} [bootDiagnostics.serialConsoleLogBlobUri] the Linux serial
 * console log blob Uri.
 * 
 * @member {array} [statuses] the resource status information.
 * 
 */
export interface VirtualMachineInstanceView {
    platformUpdateDomain?: number;
    platformFaultDomain?: number;
    rdpThumbPrint?: string;
    vmAgent?: VirtualMachineAgentInstanceView;
    disks?: DiskInstanceView[];
    extensions?: VirtualMachineExtensionInstanceView[];
    bootDiagnostics?: BootDiagnosticsInstanceView;
    statuses?: InstanceViewStatus[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachine class.
 * @constructor
 * Describes a Virtual Machine.
 * @member {object} [plan] the purchase plan when deploying virtual machine
 * from VM Marketplace images.
 * 
 * @member {string} [plan.name] the plan ID.
 * 
 * @member {string} [plan.publisher] the publisher ID.
 * 
 * @member {string} [plan.product] the offer ID.
 * 
 * @member {string} [plan.promotionCode] the promotion code.
 * 
 * @member {object} [hardwareProfile] the hardware profile.
 * 
 * @member {string} [hardwareProfile.vmSize] The virtual machine size name.
 * Possible values include: '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_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_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_G1', 'Standard_G2',
 * 'Standard_G3', 'Standard_G4', 'Standard_G5', 'Standard_GS1',
 * 'Standard_GS2', 'Standard_GS3', 'Standard_GS4', 'Standard_GS5'
 * 
 * @member {object} [storageProfile] the storage profile.
 * 
 * @member {object} [storageProfile.imageReference] the image reference.
 * 
 * @member {string} [storageProfile.imageReference.publisher] the image
 * publisher.
 * 
 * @member {string} [storageProfile.imageReference.offer] the image offer.
 * 
 * @member {string} [storageProfile.imageReference.sku] the image sku.
 * 
 * @member {string} [storageProfile.imageReference.version] the image version.
 * The allowed formats are Major.Minor.Build or 'latest'. Major, Minor and
 * Build being decimal numbers. Specify 'latest' to use the latest version of
 * image.
 * 
 * @member {object} [storageProfile.osDisk] the OS disk.
 * 
 * @member {string} [storageProfile.osDisk.osType] the Operating System type.
 * Possible values include: 'Windows', 'Linux'
 * 
 * @member {object} [storageProfile.osDisk.encryptionSettings] the disk
 * encryption settings.
 * 
 * @member {object}
 * [storageProfile.osDisk.encryptionSettings.diskEncryptionKey] the disk
 * encryption key which is a KeyVault Secret.
 * 
 * @member {string}
 * [storageProfile.osDisk.encryptionSettings.diskEncryptionKey.secretUrl] the
 * URL referencing a secret in a Key Vault.
 * 
 * @member {object}
 * [storageProfile.osDisk.encryptionSettings.diskEncryptionKey.sourceVault]
 * the Relative URL of the Key Vault containing the secret.
 * 
 * @member {string}
 * [storageProfile.osDisk.encryptionSettings.diskEncryptionKey.sourceVault.id]
 * Resource Id
 * 
 * @member {object}
 * [storageProfile.osDisk.encryptionSettings.keyEncryptionKey] the key
 * encryption key which is KeyVault Key.
 * 
 * @member {string}
 * [storageProfile.osDisk.encryptionSettings.keyEncryptionKey.keyUrl] the URL
 * referencing a key in a Key Vault.
 * 
 * @member {object}
 * [storageProfile.osDisk.encryptionSettings.keyEncryptionKey.sourceVault]
 * the Relative URL of the Key Vault containing the key
 * 
 * @member {string}
 * [storageProfile.osDisk.encryptionSettings.keyEncryptionKey.sourceVault.id]
 * Resource Id
 * 
 * @member {boolean} [storageProfile.osDisk.encryptionSettings.enabled]
 * whether disk encryption should be enabled on the Virtual Machine.
 * 
 * @member {string} [storageProfile.osDisk.name] the disk name.
 * 
 * @member {object} [storageProfile.osDisk.vhd] the Virtual Hard Disk.
 * 
 * @member {string} [storageProfile.osDisk.vhd.uri] the virtual hard disk's
 * uri. It should be a valid Uri to a virtual hard disk.
 * 
 * @member {object} [storageProfile.osDisk.image] the Source User Image
 * VirtualHardDisk. This VirtualHardDisk will be copied before using it to
 * attach to the Virtual Machine.If SourceImage is provided, the destination
 * VirtualHardDisk should not exist.
 * 
 * @member {string} [storageProfile.osDisk.image.uri] the virtual hard disk's
 * uri. It should be a valid Uri to a virtual hard disk.
 * 
 * @member {string} [storageProfile.osDisk.caching] the caching type. Possible
 * values include: 'None', 'ReadOnly', 'ReadWrite'
 * 
 * @member {string} [storageProfile.osDisk.createOption] the create option.
 * Possible values include: 'fromImage', 'empty', 'attach'
 * 
 * @member {number} [storageProfile.osDisk.diskSizeGB] the initial disk size
 * in GB for blank data disks, and the new desired size for existing OS and
 * Data disks.
 * 
 * @member {array} [storageProfile.dataDisks] the data disks.
 * 
 * @member {object} [osProfile] the OS profile.
 * 
 * @member {string} [osProfile.computerName] the computer name.
 * 
 * @member {string} [osProfile.adminUsername] the admin user name.
 * 
 * @member {string} [osProfile.adminPassword] the admin user password.
 * 
 * @member {string} [osProfile.customData] a base-64 encoded string of custom
 * data.
 * 
 * @member {object} [osProfile.windowsConfiguration] the Windows Configuration
 * of the OS profile.
 * 
 * @member {boolean} [osProfile.windowsConfiguration.provisionVMAgent] whether
 * VM Agent should be provisioned on the Virtual Machine.
 * 
 * @member {boolean} [osProfile.windowsConfiguration.enableAutomaticUpdates]
 * whether Windows updates are automatically installed on the VM
 * 
 * @member {string} [osProfile.windowsConfiguration.timeZone] the Time Zone of
 * the VM
 * 
 * @member {array} [osProfile.windowsConfiguration.additionalUnattendContent]
 * the additional base-64 encoded XML formatted information that can be
 * included in the Unattend.xml file.
 * 
 * @member {object} [osProfile.windowsConfiguration.winRM] the Windows Remote
 * Management configuration of the VM
 * 
 * @member {array} [osProfile.windowsConfiguration.winRM.listeners] the list
 * of Windows Remote Management listeners
 * 
 * @member {object} [osProfile.linuxConfiguration] the Linux Configuration of
 * the OS profile.
 * 
 * @member {boolean}
 * [osProfile.linuxConfiguration.disablePasswordAuthentication] whether
 * Authentication using user name and password is allowed or not
 * 
 * @member {object} [osProfile.linuxConfiguration.ssh] the SSH configuration
 * for linux VMs
 * 
 * @member {array} [osProfile.linuxConfiguration.ssh.publicKeys] the list of
 * SSH public keys used to authenticate with linux based VMs
 * 
 * @member {array} [osProfile.secrets] the List of certificates for addition
 * to the VM.
 * 
 * @member {object} [networkProfile] the network profile.
 * 
 * @member {array} [networkProfile.networkInterfaces] the network interfaces.
 * 
 * @member {object} [diagnosticsProfile] the diagnostics profile.
 * 
 * @member {object} [diagnosticsProfile.bootDiagnostics] the boot diagnostics.
 * 
 * @member {boolean} [diagnosticsProfile.bootDiagnostics.enabled] whether boot
 * diagnostics should be enabled on the Virtual Machine.
 * 
 * @member {string} [diagnosticsProfile.bootDiagnostics.storageUri] the boot
 * diagnostics storage Uri. It should be a valid Uri
 * 
 * @member {object} [availabilitySet] the reference Id of the availability set
 * to which this virtual machine belongs.
 * 
 * @member {string} [availabilitySet.id] Resource Id
 * 
 * @member {string} [provisioningState] the provisioning state, which only
 * appears in the response.
 * 
 * @member {object} [instanceView] the virtual machine instance view.
 * 
 * @member {number} [instanceView.platformUpdateDomain] the Update Domain
 * count.
 * 
 * @member {number} [instanceView.platformFaultDomain] the Fault Domain count.
 * 
 * @member {string} [instanceView.rdpThumbPrint] the Remote desktop
 * certificate thumbprint.
 * 
 * @member {object} [instanceView.vmAgent] the VM Agent running on the virtual
 * machine.
 * 
 * @member {string} [instanceView.vmAgent.vmAgentVersion] the VM Agent full
 * version.
 * 
 * @member {array} [instanceView.vmAgent.extensionHandlers] the virtual
 * machine extension handler instance view.
 * 
 * @member {array} [instanceView.vmAgent.statuses] the resource status
 * information.
 * 
 * @member {array} [instanceView.disks] the disks information.
 * 
 * @member {array} [instanceView.extensions] the extensions information.
 * 
 * @member {object} [instanceView.bootDiagnostics] the boot diagnostics.
 * 
 * @member {string} [instanceView.bootDiagnostics.consoleScreenshotBlobUri]
 * the console screenshot blob Uri.
 * 
 * @member {string} [instanceView.bootDiagnostics.serialConsoleLogBlobUri] the
 * Linux serial console log blob Uri.
 * 
 * @member {array} [instanceView.statuses] the resource status information.
 * 
 * @member {string} [licenseType] the license type, which is for bring your
 * own license scenario.
 * 
 * @member {string} [vmId] the virtual machine unique id.
 * 
 * @member {array} [resources] the virtual machine child extension resources.
 * 
 */
export interface VirtualMachine extends Resource {
    plan?: Plan;
    hardwareProfile?: HardwareProfile;
    storageProfile?: StorageProfile;
    osProfile?: OSProfile;
    networkProfile?: NetworkProfile;
    diagnosticsProfile?: DiagnosticsProfile;
    availabilitySet?: SubResource;
    provisioningState?: string;
    instanceView?: VirtualMachineInstanceView;
    licenseType?: string;
    vmId?: string;
    resources?: VirtualMachineExtension[];
}

/**
 * @class
 * Initializes a new instance of the Sku class.
 * @constructor
 * Describes a virtual machine scale set sku.
 * @member {string} [name] the sku name.
 * 
 * @member {string} [tier] the sku tier.
 * 
 * @member {number} [capacity] the sku capacity.
 * 
 */
export interface Sku {
    name?: string;
    tier?: string;
    capacity?: number;
}

/**
 * @class
 * Initializes a new instance of the UpgradePolicy class.
 * @constructor
 * Describes an upgrade policy - automatic or manual.
 * @member {string} [mode] the upgrade mode. Possible values include:
 * 'Automatic', 'Manual'
 * 
 */
export interface UpgradePolicy {
    mode?: string;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetOSProfile class.
 * @constructor
 * Describes a virtual machine scale set OS profile.
 * @member {string} [computerNamePrefix] the computer name prefix.
 * 
 * @member {string} [adminUsername] the admin user name.
 * 
 * @member {string} [adminPassword] the admin user password.
 * 
 * @member {string} [customData] a base-64 encoded string of custom data.
 * 
 * @member {object} [windowsConfiguration] the Windows Configuration of the OS
 * profile.
 * 
 * @member {boolean} [windowsConfiguration.provisionVMAgent] whether VM Agent
 * should be provisioned on the Virtual Machine.
 * 
 * @member {boolean} [windowsConfiguration.enableAutomaticUpdates] whether
 * Windows updates are automatically installed on the VM
 * 
 * @member {string} [windowsConfiguration.timeZone] the Time Zone of the VM
 * 
 * @member {array} [windowsConfiguration.additionalUnattendContent] the
 * additional base-64 encoded XML formatted information that can be included
 * in the Unattend.xml file.
 * 
 * @member {object} [windowsConfiguration.winRM] the Windows Remote Management
 * configuration of the VM
 * 
 * @member {array} [windowsConfiguration.winRM.listeners] the list of Windows
 * Remote Management listeners
 * 
 * @member {object} [linuxConfiguration] the Linux Configuration of the OS
 * profile.
 * 
 * @member {boolean} [linuxConfiguration.disablePasswordAuthentication]
 * whether Authentication using user name and password is allowed or not
 * 
 * @member {object} [linuxConfiguration.ssh] the SSH configuration for linux
 * VMs
 * 
 * @member {array} [linuxConfiguration.ssh.publicKeys] the list of SSH public
 * keys used to authenticate with linux based VMs
 * 
 * @member {array} [secrets] the List of certificates for addition to the VM.
 * 
 */
export interface VirtualMachineScaleSetOSProfile {
    computerNamePrefix?: string;
    adminUsername?: string;
    adminPassword?: string;
    customData?: string;
    windowsConfiguration?: WindowsConfiguration;
    linuxConfiguration?: LinuxConfiguration;
    secrets?: VaultSecretGroup[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetOSDisk class.
 * @constructor
 * Describes a virtual machine scale set operating system disk.
 * @member {string} name the disk name.
 * 
 * @member {string} [caching] the caching type. Possible values include:
 * 'None', 'ReadOnly', 'ReadWrite'
 * 
 * @member {string} createOption the create option. Possible values include:
 * 'fromImage', 'empty', 'attach'
 * 
 * @member {string} [osType] the Operating System type. Possible values
 * include: 'Windows', 'Linux'
 * 
 * @member {object} [image] the Source User Image VirtualHardDisk. This
 * VirtualHardDisk will be copied before using it to attach to the Virtual
 * Machine.If SourceImage is provided, the destination VirtualHardDisk should
 * not exist.
 * 
 * @member {string} [image.uri] the virtual hard disk's uri. It should be a
 * valid Uri to a virtual hard disk.
 * 
 * @member {array} [vhdContainers] the list of virtual hard disk container
 * uris.
 * 
 */
export interface VirtualMachineScaleSetOSDisk {
    name: string;
    caching?: string;
    createOption: string;
    osType?: string;
    image?: VirtualHardDisk;
    vhdContainers?: string[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetStorageProfile class.
 * @constructor
 * Describes a virtual machine scale set storage profile.
 * @member {object} [imageReference] the image reference.
 * 
 * @member {string} [imageReference.publisher] the image publisher.
 * 
 * @member {string} [imageReference.offer] the image offer.
 * 
 * @member {string} [imageReference.sku] the image sku.
 * 
 * @member {string} [imageReference.version] the image version. The allowed
 * formats are Major.Minor.Build or 'latest'. Major, Minor and Build being
 * decimal numbers. Specify 'latest' to use the latest version of image.
 * 
 * @member {object} [osDisk] the OS disk.
 * 
 * @member {string} [osDisk.name] the disk name.
 * 
 * @member {string} [osDisk.caching] the caching type. Possible values
 * include: 'None', 'ReadOnly', 'ReadWrite'
 * 
 * @member {string} [osDisk.createOption] the create option. Possible values
 * include: 'fromImage', 'empty', 'attach'
 * 
 * @member {string} [osDisk.osType] the Operating System type. Possible values
 * include: 'Windows', 'Linux'
 * 
 * @member {object} [osDisk.image] the Source User Image VirtualHardDisk. This
 * VirtualHardDisk will be copied before using it to attach to the Virtual
 * Machine.If SourceImage is provided, the destination VirtualHardDisk should
 * not exist.
 * 
 * @member {string} [osDisk.image.uri] the virtual hard disk's uri. It should
 * be a valid Uri to a virtual hard disk.
 * 
 * @member {array} [osDisk.vhdContainers] the list of virtual hard disk
 * container uris.
 * 
 */
export interface VirtualMachineScaleSetStorageProfile {
    imageReference?: ImageReference;
    osDisk?: VirtualMachineScaleSetOSDisk;
}

/**
 * @class
 * Initializes a new instance of the ApiEntityReference class.
 * @constructor
 * The API entity reference.
 * @member {string} [id] the ARM resource id in the form of
 * /subscriptions/{SubcriptionId}/resourceGroups/{ResourceGroupName}/...
 * 
 */
export interface ApiEntityReference {
    id?: string;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetIPConfiguration class.
 * @constructor
 * Describes a virtual machine scale set network profile's IP configuration.
 * @member {string} name the IP configuration name.
 * 
 * @member {object} subnet the subnet.
 * 
 * @member {string} [subnet.id] the ARM resource id in the form of
 * /subscriptions/{SubcriptionId}/resourceGroups/{ResourceGroupName}/...
 * 
 * @member {array} [applicationGatewayBackendAddressPools] the application
 * gateway backend address pools.
 * 
 * @member {array} [loadBalancerBackendAddressPools] the load balancer backend
 * address pools.
 * 
 * @member {array} [loadBalancerInboundNatPools] the load balancer inbound nat
 * pools.
 * 
 */
export interface VirtualMachineScaleSetIPConfiguration extends SubResource {
    name: string;
    subnet: ApiEntityReference;
    applicationGatewayBackendAddressPools?: SubResource[];
    loadBalancerBackendAddressPools?: SubResource[];
    loadBalancerInboundNatPools?: SubResource[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetNetworkConfiguration class.
 * @constructor
 * Describes a virtual machine scale set network profile's network
 * configurations.
 * @member {string} name the network configuration name.
 * 
 * @member {boolean} [primary] whether this is a primary NIC on a virtual
 * machine.
 * 
 * @member {array} ipConfigurations the virtual machine scale set IP
 * Configuration.
 * 
 */
export interface VirtualMachineScaleSetNetworkConfiguration extends SubResource {
    name: string;
    primary?: boolean;
    ipConfigurations: VirtualMachineScaleSetIPConfiguration[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetNetworkProfile class.
 * @constructor
 * Describes a virtual machine scale set network profile.
 * @member {array} [networkInterfaceConfigurations] the list of network
 * configurations.
 * 
 */
export interface VirtualMachineScaleSetNetworkProfile {
    networkInterfaceConfigurations?: VirtualMachineScaleSetNetworkConfiguration[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetExtension class.
 * @constructor
 * Describes a Virtual Machine Scale Set Extension.
 * @member {string} [name] the name of the extension.
 * 
 * @member {string} [publisher] the name of the extension handler publisher.
 * 
 * @member {string} [type] the type of the extension handler.
 * 
 * @member {string} [typeHandlerVersion] the type version of the extension
 * handler.
 * 
 * @member {boolean} [autoUpgradeMinorVersion] whether the extension handler
 * should be automatically upgraded across minor versions.
 * 
 * @member {object} [settings] Json formatted public settings for the
 * extension.
 * 
 * @member {object} [protectedSettings] Json formatted protected settings for
 * the extension.
 * 
 * @member {string} [provisioningState] the provisioning state, which only
 * appears in the response.
 * 
 */
export interface VirtualMachineScaleSetExtension extends SubResource {
    name?: string;
    publisher?: string;
    type?: string;
    typeHandlerVersion?: string;
    autoUpgradeMinorVersion?: boolean;
    settings?: any;
    protectedSettings?: any;
    provisioningState?: string;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetExtensionProfile class.
 * @constructor
 * Describes a virtual machine scale set extension profile.
 * @member {array} [extensions] the virtual machine scale set child extension
 * resources.
 * 
 */
export interface VirtualMachineScaleSetExtensionProfile {
    extensions?: VirtualMachineScaleSetExtension[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetVMProfile class.
 * @constructor
 * Describes a virtual machine scale set virtual machine profile.
 * @member {object} [osProfile] the virtual machine scale set OS profile.
 * 
 * @member {string} [osProfile.computerNamePrefix] the computer name prefix.
 * 
 * @member {string} [osProfile.adminUsername] the admin user name.
 * 
 * @member {string} [osProfile.adminPassword] the admin user password.
 * 
 * @member {string} [osProfile.customData] a base-64 encoded string of custom
 * data.
 * 
 * @member {object} [osProfile.windowsConfiguration] the Windows Configuration
 * of the OS profile.
 * 
 * @member {boolean} [osProfile.windowsConfiguration.provisionVMAgent] whether
 * VM Agent should be provisioned on the Virtual Machine.
 * 
 * @member {boolean} [osProfile.windowsConfiguration.enableAutomaticUpdates]
 * whether Windows updates are automatically installed on the VM
 * 
 * @member {string} [osProfile.windowsConfiguration.timeZone] the Time Zone of
 * the VM
 * 
 * @member {array} [osProfile.windowsConfiguration.additionalUnattendContent]
 * the additional base-64 encoded XML formatted information that can be
 * included in the Unattend.xml file.
 * 
 * @member {object} [osProfile.windowsConfiguration.winRM] the Windows Remote
 * Management configuration of the VM
 * 
 * @member {array} [osProfile.windowsConfiguration.winRM.listeners] the list
 * of Windows Remote Management listeners
 * 
 * @member {object} [osProfile.linuxConfiguration] the Linux Configuration of
 * the OS profile.
 * 
 * @member {boolean}
 * [osProfile.linuxConfiguration.disablePasswordAuthentication] whether
 * Authentication using user name and password is allowed or not
 * 
 * @member {object} [osProfile.linuxConfiguration.ssh] the SSH configuration
 * for linux VMs
 * 
 * @member {array} [osProfile.linuxConfiguration.ssh.publicKeys] the list of
 * SSH public keys used to authenticate with linux based VMs
 * 
 * @member {array} [osProfile.secrets] the List of certificates for addition
 * to the VM.
 * 
 * @member {object} [storageProfile] the virtual machine scale set storage
 * profile.
 * 
 * @member {object} [storageProfile.imageReference] the image reference.
 * 
 * @member {string} [storageProfile.imageReference.publisher] the image
 * publisher.
 * 
 * @member {string} [storageProfile.imageReference.offer] the image offer.
 * 
 * @member {string} [storageProfile.imageReference.sku] the image sku.
 * 
 * @member {string} [storageProfile.imageReference.version] the image version.
 * The allowed formats are Major.Minor.Build or 'latest'. Major, Minor and
 * Build being decimal numbers. Specify 'latest' to use the latest version of
 * image.
 * 
 * @member {object} [storageProfile.osDisk] the OS disk.
 * 
 * @member {string} [storageProfile.osDisk.name] the disk name.
 * 
 * @member {string} [storageProfile.osDisk.caching] the caching type. Possible
 * values include: 'None', 'ReadOnly', 'ReadWrite'
 * 
 * @member {string} [storageProfile.osDisk.createOption] the create option.
 * Possible values include: 'fromImage', 'empty', 'attach'
 * 
 * @member {string} [storageProfile.osDisk.osType] the Operating System type.
 * Possible values include: 'Windows', 'Linux'
 * 
 * @member {object} [storageProfile.osDisk.image] the Source User Image
 * VirtualHardDisk. This VirtualHardDisk will be copied before using it to
 * attach to the Virtual Machine.If SourceImage is provided, the destination
 * VirtualHardDisk should not exist.
 * 
 * @member {string} [storageProfile.osDisk.image.uri] the virtual hard disk's
 * uri. It should be a valid Uri to a virtual hard disk.
 * 
 * @member {array} [storageProfile.osDisk.vhdContainers] the list of virtual
 * hard disk container uris.
 * 
 * @member {object} [networkProfile] the virtual machine scale set network
 * profile.
 * 
 * @member {array} [networkProfile.networkInterfaceConfigurations] the list of
 * network configurations.
 * 
 * @member {object} [extensionProfile] the virtual machine scale set extension
 * profile.
 * 
 * @member {array} [extensionProfile.extensions] the virtual machine scale set
 * child extension resources.
 * 
 */
export interface VirtualMachineScaleSetVMProfile {
    osProfile?: VirtualMachineScaleSetOSProfile;
    storageProfile?: VirtualMachineScaleSetStorageProfile;
    networkProfile?: VirtualMachineScaleSetNetworkProfile;
    extensionProfile?: VirtualMachineScaleSetExtensionProfile;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSet class.
 * @constructor
 * Describes a Virtual Machine Scale Set.
 * @member {object} [sku] the virtual machine scale set sku.
 * 
 * @member {string} [sku.name] the sku name.
 * 
 * @member {string} [sku.tier] the sku tier.
 * 
 * @member {number} [sku.capacity] the sku capacity.
 * 
 * @member {object} [upgradePolicy] the upgrade policy.
 * 
 * @member {string} [upgradePolicy.mode] the upgrade mode. Possible values
 * include: 'Automatic', 'Manual'
 * 
 * @member {object} [virtualMachineProfile] the virtual machine profile.
 * 
 * @member {object} [virtualMachineProfile.osProfile] the virtual machine
 * scale set OS profile.
 * 
 * @member {string} [virtualMachineProfile.osProfile.computerNamePrefix] the
 * computer name prefix.
 * 
 * @member {string} [virtualMachineProfile.osProfile.adminUsername] the admin
 * user name.
 * 
 * @member {string} [virtualMachineProfile.osProfile.adminPassword] the admin
 * user password.
 * 
 * @member {string} [virtualMachineProfile.osProfile.customData] a base-64
 * encoded string of custom data.
 * 
 * @member {object} [virtualMachineProfile.osProfile.windowsConfiguration] the
 * Windows Configuration of the OS profile.
 * 
 * @member {boolean}
 * [virtualMachineProfile.osProfile.windowsConfiguration.provisionVMAgent]
 * whether VM Agent should be provisioned on the Virtual Machine.
 * 
 * @member {boolean}
 * [virtualMachineProfile.osProfile.windowsConfiguration.enableAutomaticUpdates]
 * whether Windows updates are automatically installed on the VM
 * 
 * @member {string}
 * [virtualMachineProfile.osProfile.windowsConfiguration.timeZone] the Time
 * Zone of the VM
 * 
 * @member {array}
 * [virtualMachineProfile.osProfile.windowsConfiguration.additionalUnattendContent]
 * the additional base-64 encoded XML formatted information that can be
 * included in the Unattend.xml file.
 * 
 * @member {object}
 * [virtualMachineProfile.osProfile.windowsConfiguration.winRM] the Windows
 * Remote Management configuration of the VM
 * 
 * @member {array}
 * [virtualMachineProfile.osProfile.windowsConfiguration.winRM.listeners] the
 * list of Windows Remote Management listeners
 * 
 * @member {object} [virtualMachineProfile.osProfile.linuxConfiguration] the
 * Linux Configuration of the OS profile.
 * 
 * @member {boolean}
 * [virtualMachineProfile.osProfile.linuxConfiguration.disablePasswordAuthentication]
 * whether Authentication using user name and password is allowed or not
 * 
 * @member {object} [virtualMachineProfile.osProfile.linuxConfiguration.ssh]
 * the SSH configuration for linux VMs
 * 
 * @member {array}
 * [virtualMachineProfile.osProfile.linuxConfiguration.ssh.publicKeys] the
 * list of SSH public keys used to authenticate with linux based VMs
 * 
 * @member {array} [virtualMachineProfile.osProfile.secrets] the List of
 * certificates for addition to the VM.
 * 
 * @member {object} [virtualMachineProfile.storageProfile] the virtual machine
 * scale set storage profile.
 * 
 * @member {object} [virtualMachineProfile.storageProfile.imageReference] the
 * image reference.
 * 
 * @member {string}
 * [virtualMachineProfile.storageProfile.imageReference.publisher] the image
 * publisher.
 * 
 * @member {string}
 * [virtualMachineProfile.storageProfile.imageReference.offer] the image
 * offer.
 * 
 * @member {string} [virtualMachineProfile.storageProfile.imageReference.sku]
 * the image sku.
 * 
 * @member {string}
 * [virtualMachineProfile.storageProfile.imageReference.version] the image
 * version. The allowed formats are Major.Minor.Build or 'latest'. Major,
 * Minor and Build being decimal numbers. Specify 'latest' to use the latest
 * version of image.
 * 
 * @member {object} [virtualMachineProfile.storageProfile.osDisk] the OS disk.
 * 
 * @member {string} [virtualMachineProfile.storageProfile.osDisk.name] the
 * disk name.
 * 
 * @member {string} [virtualMachineProfile.storageProfile.osDisk.caching] the
 * caching type. Possible values include: 'None', 'ReadOnly', 'ReadWrite'
 * 
 * @member {string} [virtualMachineProfile.storageProfile.osDisk.createOption]
 * the create option. Possible values include: 'fromImage', 'empty', 'attach'
 * 
 * @member {string} [virtualMachineProfile.storageProfile.osDisk.osType] the
 * Operating System type. Possible values include: 'Windows', 'Linux'
 * 
 * @member {object} [virtualMachineProfile.storageProfile.osDisk.image] the
 * Source User Image VirtualHardDisk. This VirtualHardDisk will be copied
 * before using it to attach to the Virtual Machine.If SourceImage is
 * provided, the destination VirtualHardDisk should not exist.
 * 
 * @member {string} [virtualMachineProfile.storageProfile.osDisk.image.uri]
 * the virtual hard disk's uri. It should be a valid Uri to a virtual hard
 * disk.
 * 
 * @member {array} [virtualMachineProfile.storageProfile.osDisk.vhdContainers]
 * the list of virtual hard disk container uris.
 * 
 * @member {object} [virtualMachineProfile.networkProfile] the virtual machine
 * scale set network profile.
 * 
 * @member {array}
 * [virtualMachineProfile.networkProfile.networkInterfaceConfigurations] the
 * list of network configurations.
 * 
 * @member {object} [virtualMachineProfile.extensionProfile] the virtual
 * machine scale set extension profile.
 * 
 * @member {array} [virtualMachineProfile.extensionProfile.extensions] the
 * virtual machine scale set child extension resources.
 * 
 * @member {string} [provisioningState] the provisioning state, which only
 * appears in the response.
 * 
 * @member {boolean} [overProvision] Specifies whether the Virtual Machine
 * Scale Set should be overprovisioned.
 * 
 */
export interface VirtualMachineScaleSet extends Resource {
    sku?: Sku;
    upgradePolicy?: UpgradePolicy;
    virtualMachineProfile?: VirtualMachineScaleSetVMProfile;
    provisioningState?: string;
    overProvision?: boolean;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetVMInstanceIDs class.
 * @constructor
 * Specifies the list of virtual machine scale set instance IDs.
 * @member {array} [instanceIds] the virtual machine scale set instance ids.
 * 
 */
export interface VirtualMachineScaleSetVMInstanceIDs {
    instanceIds?: string[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetVMInstanceRequiredIDs class.
 * @constructor
 * Specifies the list of virtual machine scale set instance IDs.
 * @member {array} instanceIds the virtual machine scale set instance ids.
 * 
 */
export interface VirtualMachineScaleSetVMInstanceRequiredIDs {
    instanceIds: string[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineStatusCodeCount class.
 * @constructor
 * The status code and count of the virtual machine scale set instance view
 * status summary.
 * @member {string} [code] the instance view status code.
 * 
 * @member {number} [count] the number of instances having a particular status
 * code.
 * 
 */
export interface VirtualMachineStatusCodeCount {
    code?: string;
    count?: number;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetInstanceViewStatusesSummary class.
 * @constructor
 * Instance view statuses summary for virtual machines of a virtual machine
 * scale set.
 * @member {array} [statusesSummary] the extensions information.
 * 
 */
export interface VirtualMachineScaleSetInstanceViewStatusesSummary {
    statusesSummary?: VirtualMachineStatusCodeCount[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetVMExtensionsSummary class.
 * @constructor
 * Extensions summary for virtual machines of a virtual machine scale set.
 * @member {string} [name] the extension name.
 * 
 * @member {array} [statusesSummary] the extensions information.
 * 
 */
export interface VirtualMachineScaleSetVMExtensionsSummary {
    name?: string;
    statusesSummary?: VirtualMachineStatusCodeCount[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetInstanceView class.
 * @constructor
 * The instance view of a virtual machine scale set.
 * @member {object} [virtualMachine] the instance view status summary for the
 * virtual machine scale set.
 * 
 * @member {array} [virtualMachine.statusesSummary] the extensions information.
 * 
 * @member {array} [extensions] the extensions information.
 * 
 * @member {array} [statuses] the resource status information.
 * 
 */
export interface VirtualMachineScaleSetInstanceView {
    virtualMachine?: VirtualMachineScaleSetInstanceViewStatusesSummary;
    extensions?: VirtualMachineScaleSetVMExtensionsSummary[];
    statuses?: InstanceViewStatus[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetSkuCapacity class.
 * @constructor
 * Describes scaling information of a sku.
 * @member {number} [minimum] the minimum capacity.
 * 
 * @member {number} [maximum] the maximum capacity that can be set.
 * 
 * @member {number} [defaultCapacity] the default capacity.
 * 
 * @member {string} [scaleType] the scale type applicable to the sku. Possible
 * values include: 'Automatic', 'None'
 * 
 */
export interface VirtualMachineScaleSetSkuCapacity {
    minimum?: number;
    maximum?: number;
    defaultCapacity?: number;
    scaleType?: string;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetSku class.
 * @constructor
 * Describes an available virtual machine scale set sku.
 * @member {string} [resourceType] the type of resource the sku applies to.
 * 
 * @member {object} [sku] the Sku.
 * 
 * @member {string} [sku.name] the sku name.
 * 
 * @member {string} [sku.tier] the sku tier.
 * 
 * @member {number} [sku.capacity] the sku capacity.
 * 
 * @member {object} [capacity] available scaling information.
 * 
 * @member {number} [capacity.minimum] the minimum capacity.
 * 
 * @member {number} [capacity.maximum] the maximum capacity that can be set.
 * 
 * @member {number} [capacity.defaultCapacity] the default capacity.
 * 
 * @member {string} [capacity.scaleType] the scale type applicable to the sku.
 * Possible values include: 'Automatic', 'None'
 * 
 */
export interface VirtualMachineScaleSetSku {
    resourceType?: string;
    sku?: Sku;
    capacity?: VirtualMachineScaleSetSkuCapacity;
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetVM class.
 * @constructor
 * Describes a virtual machine scale set virtual machine.
 * @member {string} [instanceId] the virtual machine instance id.
 * 
 * @member {object} [sku] the virtual machine sku.
 * 
 * @member {string} [sku.name] the sku name.
 * 
 * @member {string} [sku.tier] the sku tier.
 * 
 * @member {number} [sku.capacity] the sku capacity.
 * 
 * @member {boolean} [latestModelApplied] Specifies whether the latest model
 * has been applied to the virtual machine.
 * 
 * @member {object} [instanceView] the virtual machine instance view.
 * 
 * @member {number} [instanceView.platformUpdateDomain] the Update Domain
 * count.
 * 
 * @member {number} [instanceView.platformFaultDomain] the Fault Domain count.
 * 
 * @member {string} [instanceView.rdpThumbPrint] the Remote desktop
 * certificate thumbprint.
 * 
 * @member {object} [instanceView.vmAgent] the VM Agent running on the virtual
 * machine.
 * 
 * @member {string} [instanceView.vmAgent.vmAgentVersion] the VM Agent full
 * version.
 * 
 * @member {array} [instanceView.vmAgent.extensionHandlers] the virtual
 * machine extension handler instance view.
 * 
 * @member {array} [instanceView.vmAgent.statuses] the resource status
 * information.
 * 
 * @member {array} [instanceView.disks] the disks information.
 * 
 * @member {array} [instanceView.extensions] the extensions information.
 * 
 * @member {object} [instanceView.bootDiagnostics] the boot diagnostics.
 * 
 * @member {string} [instanceView.bootDiagnostics.consoleScreenshotBlobUri]
 * the console screenshot blob Uri.
 * 
 * @member {string} [instanceView.bootDiagnostics.serialConsoleLogBlobUri] the
 * Linux serial console log blob Uri.
 * 
 * @member {array} [instanceView.statuses] the resource status information.
 * 
 * @member {object} [hardwareProfile] the hardware profile.
 * 
 * @member {string} [hardwareProfile.vmSize] The virtual machine size name.
 * Possible values include: '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_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_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_G1', 'Standard_G2',
 * 'Standard_G3', 'Standard_G4', 'Standard_G5', 'Standard_GS1',
 * 'Standard_GS2', 'Standard_GS3', 'Standard_GS4', 'Standard_GS5'
 * 
 * @member {object} [storageProfile] the storage profile.
 * 
 * @member {object} [storageProfile.imageReference] the image reference.
 * 
 * @member {string} [storageProfile.imageReference.publisher] the image
 * publisher.
 * 
 * @member {string} [storageProfile.imageReference.offer] the image offer.
 * 
 * @member {string} [storageProfile.imageReference.sku] the image sku.
 * 
 * @member {string} [storageProfile.imageReference.version] the image version.
 * The allowed formats are Major.Minor.Build or 'latest'. Major, Minor and
 * Build being decimal numbers. Specify 'latest' to use the latest version of
 * image.
 * 
 * @member {object} [storageProfile.osDisk] the OS disk.
 * 
 * @member {string} [storageProfile.osDisk.osType] the Operating System type.
 * Possible values include: 'Windows', 'Linux'
 * 
 * @member {object} [storageProfile.osDisk.encryptionSettings] the disk
 * encryption settings.
 * 
 * @member {object}
 * [storageProfile.osDisk.encryptionSettings.diskEncryptionKey] the disk
 * encryption key which is a KeyVault Secret.
 * 
 * @member {string}
 * [storageProfile.osDisk.encryptionSettings.diskEncryptionKey.secretUrl] the
 * URL referencing a secret in a Key Vault.
 * 
 * @member {object}
 * [storageProfile.osDisk.encryptionSettings.diskEncryptionKey.sourceVault]
 * the Relative URL of the Key Vault containing the secret.
 * 
 * @member {string}
 * [storageProfile.osDisk.encryptionSettings.diskEncryptionKey.sourceVault.id]
 * Resource Id
 * 
 * @member {object}
 * [storageProfile.osDisk.encryptionSettings.keyEncryptionKey] the key
 * encryption key which is KeyVault Key.
 * 
 * @member {string}
 * [storageProfile.osDisk.encryptionSettings.keyEncryptionKey.keyUrl] the URL
 * referencing a key in a Key Vault.
 * 
 * @member {object}
 * [storageProfile.osDisk.encryptionSettings.keyEncryptionKey.sourceVault]
 * the Relative URL of the Key Vault containing the key
 * 
 * @member {string}
 * [storageProfile.osDisk.encryptionSettings.keyEncryptionKey.sourceVault.id]
 * Resource Id
 * 
 * @member {boolean} [storageProfile.osDisk.encryptionSettings.enabled]
 * whether disk encryption should be enabled on the Virtual Machine.
 * 
 * @member {string} [storageProfile.osDisk.name] the disk name.
 * 
 * @member {object} [storageProfile.osDisk.vhd] the Virtual Hard Disk.
 * 
 * @member {string} [storageProfile.osDisk.vhd.uri] the virtual hard disk's
 * uri. It should be a valid Uri to a virtual hard disk.
 * 
 * @member {object} [storageProfile.osDisk.image] the Source User Image
 * VirtualHardDisk. This VirtualHardDisk will be copied before using it to
 * attach to the Virtual Machine.If SourceImage is provided, the destination
 * VirtualHardDisk should not exist.
 * 
 * @member {string} [storageProfile.osDisk.image.uri] the virtual hard disk's
 * uri. It should be a valid Uri to a virtual hard disk.
 * 
 * @member {string} [storageProfile.osDisk.caching] the caching type. Possible
 * values include: 'None', 'ReadOnly', 'ReadWrite'
 * 
 * @member {string} [storageProfile.osDisk.createOption] the create option.
 * Possible values include: 'fromImage', 'empty', 'attach'
 * 
 * @member {number} [storageProfile.osDisk.diskSizeGB] the initial disk size
 * in GB for blank data disks, and the new desired size for existing OS and
 * Data disks.
 * 
 * @member {array} [storageProfile.dataDisks] the data disks.
 * 
 * @member {object} [osProfile] the OS profile.
 * 
 * @member {string} [osProfile.computerName] the computer name.
 * 
 * @member {string} [osProfile.adminUsername] the admin user name.
 * 
 * @member {string} [osProfile.adminPassword] the admin user password.
 * 
 * @member {string} [osProfile.customData] a base-64 encoded string of custom
 * data.
 * 
 * @member {object} [osProfile.windowsConfiguration] the Windows Configuration
 * of the OS profile.
 * 
 * @member {boolean} [osProfile.windowsConfiguration.provisionVMAgent] whether
 * VM Agent should be provisioned on the Virtual Machine.
 * 
 * @member {boolean} [osProfile.windowsConfiguration.enableAutomaticUpdates]
 * whether Windows updates are automatically installed on the VM
 * 
 * @member {string} [osProfile.windowsConfiguration.timeZone] the Time Zone of
 * the VM
 * 
 * @member {array} [osProfile.windowsConfiguration.additionalUnattendContent]
 * the additional base-64 encoded XML formatted information that can be
 * included in the Unattend.xml file.
 * 
 * @member {object} [osProfile.windowsConfiguration.winRM] the Windows Remote
 * Management configuration of the VM
 * 
 * @member {array} [osProfile.windowsConfiguration.winRM.listeners] the list
 * of Windows Remote Management listeners
 * 
 * @member {object} [osProfile.linuxConfiguration] the Linux Configuration of
 * the OS profile.
 * 
 * @member {boolean}
 * [osProfile.linuxConfiguration.disablePasswordAuthentication] whether
 * Authentication using user name and password is allowed or not
 * 
 * @member {object} [osProfile.linuxConfiguration.ssh] the SSH configuration
 * for linux VMs
 * 
 * @member {array} [osProfile.linuxConfiguration.ssh.publicKeys] the list of
 * SSH public keys used to authenticate with linux based VMs
 * 
 * @member {array} [osProfile.secrets] the List of certificates for addition
 * to the VM.
 * 
 * @member {object} [networkProfile] the network profile.
 * 
 * @member {array} [networkProfile.networkInterfaces] the network interfaces.
 * 
 * @member {object} [diagnosticsProfile] the diagnostics profile.
 * 
 * @member {object} [diagnosticsProfile.bootDiagnostics] the boot diagnostics.
 * 
 * @member {boolean} [diagnosticsProfile.bootDiagnostics.enabled] whether boot
 * diagnostics should be enabled on the Virtual Machine.
 * 
 * @member {string} [diagnosticsProfile.bootDiagnostics.storageUri] the boot
 * diagnostics storage Uri. It should be a valid Uri
 * 
 * @member {object} [availabilitySet] the reference Id of the availability set
 * to which this virtual machine belongs.
 * 
 * @member {string} [availabilitySet.id] Resource Id
 * 
 * @member {string} [provisioningState] the provisioning state, which only
 * appears in the response.
 * 
 * @member {string} [licenseType] the license type, which is for bring your
 * own license scenario.
 * 
 * @member {object} [plan] the purchase plan when deploying virtual machine
 * from VM Marketplace images.
 * 
 * @member {string} [plan.name] the plan ID.
 * 
 * @member {string} [plan.publisher] the publisher ID.
 * 
 * @member {string} [plan.product] the offer ID.
 * 
 * @member {string} [plan.promotionCode] the promotion code.
 * 
 * @member {array} [resources] the virtual machine child extension resources.
 * 
 */
export interface VirtualMachineScaleSetVM extends Resource {
    instanceId?: string;
    sku?: Sku;
    latestModelApplied?: boolean;
    instanceView?: VirtualMachineInstanceView;
    hardwareProfile?: HardwareProfile;
    storageProfile?: StorageProfile;
    osProfile?: OSProfile;
    networkProfile?: NetworkProfile;
    diagnosticsProfile?: DiagnosticsProfile;
    availabilitySet?: SubResource;
    provisioningState?: string;
    licenseType?: string;
    plan?: Plan;
    resources?: VirtualMachineExtension[];
}

/**
 * @class
 * Initializes a new instance of the VirtualMachineScaleSetVMInstanceView class.
 * @constructor
 * The instance view of a virtual machine scale set VM.
 * @member {number} [platformUpdateDomain] the Update Domain count.
 * 
 * @member {number} [platformFaultDomain] the Fault Domain count.
 * 
 * @member {string} [rdpThumbPrint] the Remote desktop certificate thumbprint.
 * 
 * @member {object} [vmAgent] the VM Agent running on the virtual machine.
 * 
 * @member {string} [vmAgent.vmAgentVersion] the VM Agent full version.
 * 
 * @member {array} [vmAgent.extensionHandlers] the virtual machine extension
 * handler instance view.
 * 
 * @member {array} [vmAgent.statuses] the resource status information.
 * 
 * @member {array} [disks] the disks information.
 * 
 * @member {array} [extensions] the extensions information.
 * 
 * @member {object} [bootDiagnostics] the boot diagnostics.
 * 
 * @member {string} [bootDiagnostics.consoleScreenshotBlobUri] the console
 * screenshot blob Uri.
 * 
 * @member {string} [bootDiagnostics.serialConsoleLogBlobUri] the Linux serial
 * console log blob Uri.
 * 
 * @member {array} [statuses] the resource status information.
 * 
 */
export interface VirtualMachineScaleSetVMInstanceView {
    platformUpdateDomain?: number;
    platformFaultDomain?: number;
    rdpThumbPrint?: string;
    vmAgent?: VirtualMachineAgentInstanceView;
    disks?: DiskInstanceView[];
    extensions?: VirtualMachineExtensionInstanceView[];
    bootDiagnostics?: BootDiagnosticsInstanceView;
    statuses?: InstanceViewStatus[];
}

/**
 * @class
 * Initializes a new instance of the ApiErrorBase class.
 * @constructor
 * Api error base.
 * @member {string} [code] the error code.
 * 
 * @member {string} [target] the target of the particular error.
 * 
 * @member {string} [message] the error message.
 * 
 */
export interface ApiErrorBase {
    code?: string;
    target?: string;
    message?: string;
}

/**
 * @class
 * Initializes a new instance of the InnerError class.
 * @constructor
 * Inner error details.
 * @member {string} [exceptiontype] the exception type.
 * 
 * @member {string} [errordetail] the internal error message or exception dump.
 * 
 */
export interface InnerError {
    exceptiontype?: string;
    errordetail?: string;
}

/**
 * @class
 * Initializes a new instance of the ApiError class.
 * @constructor
 * Api error.
 * @member {array} [details] the Api error details
 * 
 * @member {object} [innererror] the Api inner error
 * 
 * @member {string} [innererror.exceptiontype] the exception type.
 * 
 * @member {string} [innererror.errordetail] the internal error message or
 * exception dump.
 * 
 * @member {string} [code] the error code.
 * 
 * @member {string} [target] the target of the particular error.
 * 
 * @member {string} [message] the error message.
 * 
 */
export interface ApiError {
    details?: ApiErrorBase[];
    innererror?: InnerError;
    code?: string;
    target?: string;
    message?: string;
}

/**
 * @class
 * Initializes a new instance of the ComputeLongRunningOperationProperties class.
 * @constructor
 * Compute-specific operation properties, including output
 * @member {object} [output] Operation output data (raw JSON)
 * 
 */
export interface ComputeLongRunningOperationProperties {
    output?: any;
}

/**
 * @class
 * Initializes a new instance of the ContainerServiceOrchestratorProfile class.
 * @constructor
 * Profile for Orchestrator
 * @member {string} [orchestratorType] Specifies what orchestrator will be
 * used to manage container cluster resources. Possible values include:
 * 'Swarm', 'DCOS'
 * 
 */
export interface ContainerServiceOrchestratorProfile {
    orchestratorType?: string;
}

/**
 * @class
 * Initializes a new instance of the ContainerServiceMasterProfile class.
 * @constructor
 * Profile for container service master
 * @member {number} [count] Number of masters (VMs) in the container cluster
 * 
 * @member {string} dnsPrefix DNS prefix to be used to create FQDN for master
 * 
 * @member {string} [fqdn] FDQN for the master
 * 
 */
export interface ContainerServiceMasterProfile {
    count?: number;
    dnsPrefix: string;
    fqdn?: string;
}

/**
 * @class
 * Initializes a new instance of the ContainerServiceAgentPoolProfile class.
 * @constructor
 * Profile for container service agent pool
 * @member {string} name Unique name of the agent pool profile within the
 * context of the subscription and resource group
 * 
 * @member {number} [count] No. of agents (VMs) that will host docker
 * containers
 * 
 * @member {string} [vmSize] Size of agent VMs. Possible values include:
 * '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_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_D11_v2',
 * 'Standard_D12_v2', 'Standard_D13_v2', 'Standard_D14_v2', 'Standard_G1',
 * 'Standard_G2', 'Standard_G3', 'Standard_G4', 'Standard_G5',
 * 'Standard_DS1', 'Standard_DS2', 'Standard_DS3', 'Standard_DS4',
 * 'Standard_DS11', 'Standard_DS12', 'Standard_DS13', 'Standard_DS14',
 * 'Standard_GS1', 'Standard_GS2', 'Standard_GS3', 'Standard_GS4',
 * 'Standard_GS5'
 * 
 * @member {string} dnsPrefix DNS prefix to be used to create FQDN for this
 * agent pool
 * 
 * @member {string} [fqdn] FDQN for the agent pool
 * 
 */
export interface ContainerServiceAgentPoolProfile {
    name: string;
    count?: number;
    vmSize?: string;
    dnsPrefix: string;
    fqdn?: string;
}

/**
 * @class
 * Initializes a new instance of the ContainerServiceWindowsProfile class.
 * @constructor
 * Profile for Windows VMs
 * @member {string} adminUsername The administrator username to use for
 * Windows VMs
 * 
 * @member {string} adminPassword The administrator password to use for
 * Windows VMs
 * 
 */
export interface ContainerServiceWindowsProfile {
    adminUsername: string;
    adminPassword: string;
}

/**
 * @class
 * Initializes a new instance of the ContainerServiceLinuxProfile class.
 * @constructor
 * Profile for Linux VMs
 * @member {string} adminUsername The administrator username to use for all
 * Linux VMs
 * 
 * @member {object} ssh Specifies the ssh key configuration for Linux VMs
 * 
 * @member {array} [ssh.publicKeys] the list of SSH public keys used to
 * authenticate with Linux based VMs
 * 
 */
export interface ContainerServiceLinuxProfile {
    adminUsername: string;
    ssh: ContainerServiceSshConfiguration;
}

/**
 * @class
 * Initializes a new instance of the ContainerServiceSshConfiguration class.
 * @constructor
 * SSH configuration for Linux based VMs running on Azure
 * @member {array} [publicKeys] the list of SSH public keys used to
 * authenticate with Linux based VMs
 * 
 */
export interface ContainerServiceSshConfiguration {
    publicKeys?: ContainerServiceSshPublicKey[];
}

/**
 * @class
 * Initializes a new instance of the ContainerServiceSshPublicKey class.
 * @constructor
 * Contains information about SSH certificate public key data.
 * @member {string} keyData Certificate public key used to authenticate with
 * VM through SSH. The certificate must be in Pem format with or without
 * headers.
 * 
 */
export interface ContainerServiceSshPublicKey {
    keyData: string;
}

/**
 * @class
 * Initializes a new instance of the ContainerServiceDiagnosticsProfile class.
 * @constructor
 * @member {object} [vmDiagnostics] Profile for container service VM
 * diagnostic agent
 * 
 * @member {boolean} [vmDiagnostics.enabled] whether VM Diagnostic Agent
 * should be provisioned on the Virtual Machine.
 * 
 * @member {string} [vmDiagnostics.storageUri] whether VM Diagnostic Agent
 * should be provisioned on the Virtual Machine.
 * 
 */
export interface ContainerServiceDiagnosticsProfile {
    vmDiagnostics?: ContainerServiceVMDiagnostics;
}

/**
 * @class
 * Initializes a new instance of the ContainerServiceVMDiagnostics class.
 * @constructor
 * Describes VM Diagnostics.
 * @member {boolean} [enabled] whether VM Diagnostic Agent should be
 * provisioned on the Virtual Machine.
 * 
 * @member {string} [storageUri] whether VM Diagnostic Agent should be
 * provisioned on the Virtual Machine.
 * 
 */
export interface ContainerServiceVMDiagnostics {
    enabled?: boolean;
    storageUri?: string;
}

/**
 * @class
 * Initializes a new instance of the ContainerService class.
 * @constructor
 * Container service
 * @member {string} [provisioningState] the provisioning state, which only
 * appears in the response.
 * 
 * @member {object} [orchestratorProfile] Properties of orchestrator
 * 
 * @member {string} [orchestratorProfile.orchestratorType] Specifies what
 * orchestrator will be used to manage container cluster resources. Possible
 * values include: 'Swarm', 'DCOS'
 * 
 * @member {object} masterProfile Properties of master agents
 * 
 * @member {number} [masterProfile.count] Number of masters (VMs) in the
 * container cluster
 * 
 * @member {string} [masterProfile.dnsPrefix] DNS prefix to be used to create
 * FQDN for master
 * 
 * @member {string} [masterProfile.fqdn] FDQN for the master
 * 
 * @member {array} agentPoolProfiles Properties of agent pools
 * 
 * @member {object} [windowsProfile] Properties of Windows VMs
 * 
 * @member {string} [windowsProfile.adminUsername] The administrator username
 * to use for Windows VMs
 * 
 * @member {string} [windowsProfile.adminPassword] The administrator password
 * to use for Windows VMs
 * 
 * @member {object} linuxProfile Properties for Linux VMs
 * 
 * @member {string} [linuxProfile.adminUsername] The administrator username to
 * use for all Linux VMs
 * 
 * @member {object} [linuxProfile.ssh] Specifies the ssh key configuration for
 * Linux VMs
 * 
 * @member {array} [linuxProfile.ssh.publicKeys] the list of SSH public keys
 * used to authenticate with Linux based VMs
 * 
 * @member {object} [diagnosticsProfile] Properties for Diagnostic Agent
 * 
 * @member {object} [diagnosticsProfile.vmDiagnostics] Profile for container
 * service VM diagnostic agent
 * 
 * @member {boolean} [diagnosticsProfile.vmDiagnostics.enabled] whether VM
 * Diagnostic Agent should be provisioned on the Virtual Machine.
 * 
 * @member {string} [diagnosticsProfile.vmDiagnostics.storageUri] whether VM
 * Diagnostic Agent should be provisioned on the Virtual Machine.
 * 
 */
export interface ContainerService extends Resource {
    provisioningState?: string;
    orchestratorProfile?: ContainerServiceOrchestratorProfile;
    masterProfile: ContainerServiceMasterProfile;
    agentPoolProfiles: ContainerServiceAgentPoolProfile[];
    windowsProfile?: ContainerServiceWindowsProfile;
    linuxProfile: ContainerServiceLinuxProfile;
    diagnosticsProfile?: ContainerServiceDiagnosticsProfile;
}
