package storsimple8000series

// Copyright (c) Microsoft and contributors.  All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Code generated by Microsoft (R) AutoRest Code Generator.
// Changes may cause incorrect behavior and will be lost if the code is regenerated.

import (
	"github.com/Azure/go-autorest/autorest"
	"github.com/Azure/go-autorest/autorest/date"
	"github.com/Azure/go-autorest/autorest/to"
	"net/http"
)

// AlertEmailNotificationStatus enumerates the values for alert email notification status.
type AlertEmailNotificationStatus string

const (
	// Disabled specifies the disabled state for alert email notification status.
	Disabled AlertEmailNotificationStatus = "Disabled"
	// Enabled specifies the enabled state for alert email notification status.
	Enabled AlertEmailNotificationStatus = "Enabled"
)

// AlertScope enumerates the values for alert scope.
type AlertScope string

const (
	// AlertScopeDevice specifies the alert scope device state for alert scope.
	AlertScopeDevice AlertScope = "Device"
	// AlertScopeResource specifies the alert scope resource state for alert scope.
	AlertScopeResource AlertScope = "Resource"
)

// AlertSeverity enumerates the values for alert severity.
type AlertSeverity string

const (
	// Critical specifies the critical state for alert severity.
	Critical AlertSeverity = "Critical"
	// Informational specifies the informational state for alert severity.
	Informational AlertSeverity = "Informational"
	// Warning specifies the warning state for alert severity.
	Warning AlertSeverity = "Warning"
)

// AlertSourceType enumerates the values for alert source type.
type AlertSourceType string

const (
	// AlertSourceTypeDevice specifies the alert source type device state for alert source type.
	AlertSourceTypeDevice AlertSourceType = "Device"
	// AlertSourceTypeResource specifies the alert source type resource state for alert source type.
	AlertSourceTypeResource AlertSourceType = "Resource"
)

// AlertStatus enumerates the values for alert status.
type AlertStatus string

const (
	// Active specifies the active state for alert status.
	Active AlertStatus = "Active"
	// Cleared specifies the cleared state for alert status.
	Cleared AlertStatus = "Cleared"
)

// AuthenticationType enumerates the values for authentication type.
type AuthenticationType string

const (
	// Basic specifies the basic state for authentication type.
	Basic AuthenticationType = "Basic"
	// Invalid specifies the invalid state for authentication type.
	Invalid AuthenticationType = "Invalid"
	// None specifies the none state for authentication type.
	None AuthenticationType = "None"
	// NTLM specifies the ntlm state for authentication type.
	NTLM AuthenticationType = "NTLM"
)

// AuthorizationEligibility enumerates the values for authorization eligibility.
type AuthorizationEligibility string

const (
	// Eligible specifies the eligible state for authorization eligibility.
	Eligible AuthorizationEligibility = "Eligible"
	// InEligible specifies the in eligible state for authorization eligibility.
	InEligible AuthorizationEligibility = "InEligible"
)

// AuthorizationStatus enumerates the values for authorization status.
type AuthorizationStatus string

const (
	// AuthorizationStatusDisabled specifies the authorization status disabled state for authorization status.
	AuthorizationStatusDisabled AuthorizationStatus = "Disabled"
	// AuthorizationStatusEnabled specifies the authorization status enabled state for authorization status.
	AuthorizationStatusEnabled AuthorizationStatus = "Enabled"
)

// BackupJobCreationType enumerates the values for backup job creation type.
type BackupJobCreationType string

const (
	// Adhoc specifies the adhoc state for backup job creation type.
	Adhoc BackupJobCreationType = "Adhoc"
	// BySchedule specifies the by schedule state for backup job creation type.
	BySchedule BackupJobCreationType = "BySchedule"
	// BySSM specifies the by ssm state for backup job creation type.
	BySSM BackupJobCreationType = "BySSM"
)

// BackupPolicyCreationType enumerates the values for backup policy creation type.
type BackupPolicyCreationType string

const (
	// BackupPolicyCreationTypeBySaaS specifies the backup policy creation type by saa s state for backup policy creation
	// type.
	BackupPolicyCreationTypeBySaaS BackupPolicyCreationType = "BySaaS"
	// BackupPolicyCreationTypeBySSM specifies the backup policy creation type by ssm state for backup policy creation
	// type.
	BackupPolicyCreationTypeBySSM BackupPolicyCreationType = "BySSM"
)

// BackupStatus enumerates the values for backup status.
type BackupStatus string

const (
	// BackupStatusDisabled specifies the backup status disabled state for backup status.
	BackupStatusDisabled BackupStatus = "Disabled"
	// BackupStatusEnabled specifies the backup status enabled state for backup status.
	BackupStatusEnabled BackupStatus = "Enabled"
)

// BackupType enumerates the values for backup type.
type BackupType string

const (
	// CloudSnapshot specifies the cloud snapshot state for backup type.
	CloudSnapshot BackupType = "CloudSnapshot"
	// LocalSnapshot specifies the local snapshot state for backup type.
	LocalSnapshot BackupType = "LocalSnapshot"
)

// ControllerID enumerates the values for controller id.
type ControllerID string

const (
	// ControllerIDController0 specifies the controller id controller 0 state for controller id.
	ControllerIDController0 ControllerID = "Controller0"
	// ControllerIDController1 specifies the controller id controller 1 state for controller id.
	ControllerIDController1 ControllerID = "Controller1"
	// ControllerIDNone specifies the controller id none state for controller id.
	ControllerIDNone ControllerID = "None"
	// ControllerIDUnknown specifies the controller id unknown state for controller id.
	ControllerIDUnknown ControllerID = "Unknown"
)

// ControllerPowerStateAction enumerates the values for controller power state action.
type ControllerPowerStateAction string

const (
	// Restart specifies the restart state for controller power state action.
	Restart ControllerPowerStateAction = "Restart"
	// Shutdown specifies the shutdown state for controller power state action.
	Shutdown ControllerPowerStateAction = "Shutdown"
	// Start specifies the start state for controller power state action.
	Start ControllerPowerStateAction = "Start"
)

// ControllerStatus enumerates the values for controller status.
type ControllerStatus string

const (
	// ControllerStatusFailure specifies the controller status failure state for controller status.
	ControllerStatusFailure ControllerStatus = "Failure"
	// ControllerStatusNotPresent specifies the controller status not present state for controller status.
	ControllerStatusNotPresent ControllerStatus = "NotPresent"
	// ControllerStatusOk specifies the controller status ok state for controller status.
	ControllerStatusOk ControllerStatus = "Ok"
	// ControllerStatusPoweredOff specifies the controller status powered off state for controller status.
	ControllerStatusPoweredOff ControllerStatus = "PoweredOff"
	// ControllerStatusRecovering specifies the controller status recovering state for controller status.
	ControllerStatusRecovering ControllerStatus = "Recovering"
	// ControllerStatusWarning specifies the controller status warning state for controller status.
	ControllerStatusWarning ControllerStatus = "Warning"
)

// DayOfWeek enumerates the values for day of week.
type DayOfWeek string

const (
	// Friday specifies the friday state for day of week.
	Friday DayOfWeek = "Friday"
	// Monday specifies the monday state for day of week.
	Monday DayOfWeek = "Monday"
	// Saturday specifies the saturday state for day of week.
	Saturday DayOfWeek = "Saturday"
	// Sunday specifies the sunday state for day of week.
	Sunday DayOfWeek = "Sunday"
	// Thursday specifies the thursday state for day of week.
	Thursday DayOfWeek = "Thursday"
	// Tuesday specifies the tuesday state for day of week.
	Tuesday DayOfWeek = "Tuesday"
	// Wednesday specifies the wednesday state for day of week.
	Wednesday DayOfWeek = "Wednesday"
)

// DeviceConfigurationStatus enumerates the values for device configuration status.
type DeviceConfigurationStatus string

const (
	// Complete specifies the complete state for device configuration status.
	Complete DeviceConfigurationStatus = "Complete"
	// Pending specifies the pending state for device configuration status.
	Pending DeviceConfigurationStatus = "Pending"
)

// DeviceStatus enumerates the values for device status.
type DeviceStatus string

const (
	// Creating specifies the creating state for device status.
	Creating DeviceStatus = "Creating"
	// Deactivated specifies the deactivated state for device status.
	Deactivated DeviceStatus = "Deactivated"
	// Deactivating specifies the deactivating state for device status.
	Deactivating DeviceStatus = "Deactivating"
	// Deleted specifies the deleted state for device status.
	Deleted DeviceStatus = "Deleted"
	// MaintenanceMode specifies the maintenance mode state for device status.
	MaintenanceMode DeviceStatus = "MaintenanceMode"
	// Offline specifies the offline state for device status.
	Offline DeviceStatus = "Offline"
	// Online specifies the online state for device status.
	Online DeviceStatus = "Online"
	// Provisioning specifies the provisioning state for device status.
	Provisioning DeviceStatus = "Provisioning"
	// ReadyToSetup specifies the ready to setup state for device status.
	ReadyToSetup DeviceStatus = "ReadyToSetup"
	// RequiresAttention specifies the requires attention state for device status.
	RequiresAttention DeviceStatus = "RequiresAttention"
	// Unknown specifies the unknown state for device status.
	Unknown DeviceStatus = "Unknown"
)

// DeviceType enumerates the values for device type.
type DeviceType string

const (
	// DeviceTypeInvalid specifies the device type invalid state for device type.
	DeviceTypeInvalid DeviceType = "Invalid"
	// DeviceTypeSeries8000PhysicalAppliance specifies the device type series 8000 physical appliance state for device
	// type.
	DeviceTypeSeries8000PhysicalAppliance DeviceType = "Series8000PhysicalAppliance"
	// DeviceTypeSeries8000VirtualAppliance specifies the device type series 8000 virtual appliance state for device type.
	DeviceTypeSeries8000VirtualAppliance DeviceType = "Series8000VirtualAppliance"
)

// EncryptionAlgorithm enumerates the values for encryption algorithm.
type EncryptionAlgorithm string

const (
	// EncryptionAlgorithmAES256 specifies the encryption algorithm aes256 state for encryption algorithm.
	EncryptionAlgorithmAES256 EncryptionAlgorithm = "AES256"
	// EncryptionAlgorithmNone specifies the encryption algorithm none state for encryption algorithm.
	EncryptionAlgorithmNone EncryptionAlgorithm = "None"
	// EncryptionAlgorithmRSAESPKCS1V15 specifies the encryption algorithm rsaespkcs1v15 state for encryption algorithm.
	EncryptionAlgorithmRSAESPKCS1V15 EncryptionAlgorithm = "RSAES_PKCS1_v_1_5"
)

// EncryptionStatus enumerates the values for encryption status.
type EncryptionStatus string

const (
	// EncryptionStatusDisabled specifies the encryption status disabled state for encryption status.
	EncryptionStatusDisabled EncryptionStatus = "Disabled"
	// EncryptionStatusEnabled specifies the encryption status enabled state for encryption status.
	EncryptionStatusEnabled EncryptionStatus = "Enabled"
)

// FeatureSupportStatus enumerates the values for feature support status.
type FeatureSupportStatus string

const (
	// NotAvailable specifies the not available state for feature support status.
	NotAvailable FeatureSupportStatus = "NotAvailable"
	// Supported specifies the supported state for feature support status.
	Supported FeatureSupportStatus = "Supported"
	// UnsupportedDeviceVersion specifies the unsupported device version state for feature support status.
	UnsupportedDeviceVersion FeatureSupportStatus = "UnsupportedDeviceVersion"
)

// HardwareComponentStatus enumerates the values for hardware component status.
type HardwareComponentStatus string

const (
	// HardwareComponentStatusFailure specifies the hardware component status failure state for hardware component status.
	HardwareComponentStatusFailure HardwareComponentStatus = "Failure"
	// HardwareComponentStatusNotPresent specifies the hardware component status not present state for hardware component
	// status.
	HardwareComponentStatusNotPresent HardwareComponentStatus = "NotPresent"
	// HardwareComponentStatusOk specifies the hardware component status ok state for hardware component status.
	HardwareComponentStatusOk HardwareComponentStatus = "Ok"
	// HardwareComponentStatusPoweredOff specifies the hardware component status powered off state for hardware component
	// status.
	HardwareComponentStatusPoweredOff HardwareComponentStatus = "PoweredOff"
	// HardwareComponentStatusRecovering specifies the hardware component status recovering state for hardware component
	// status.
	HardwareComponentStatusRecovering HardwareComponentStatus = "Recovering"
	// HardwareComponentStatusUnknown specifies the hardware component status unknown state for hardware component status.
	HardwareComponentStatusUnknown HardwareComponentStatus = "Unknown"
	// HardwareComponentStatusWarning specifies the hardware component status warning state for hardware component status.
	HardwareComponentStatusWarning HardwareComponentStatus = "Warning"
)

// InEligibilityCategory enumerates the values for in eligibility category.
type InEligibilityCategory string

const (
	// DeviceNotOnline specifies the device not online state for in eligibility category.
	DeviceNotOnline InEligibilityCategory = "DeviceNotOnline"
	// NotSupportedAppliance specifies the not supported appliance state for in eligibility category.
	NotSupportedAppliance InEligibilityCategory = "NotSupportedAppliance"
	// RolloverPending specifies the rollover pending state for in eligibility category.
	RolloverPending InEligibilityCategory = "RolloverPending"
)

// ISCSIAndCloudStatus enumerates the values for iscsi and cloud status.
type ISCSIAndCloudStatus string

const (
	// ISCSIAndCloudStatusCloudEnabled specifies the iscsi and cloud status cloud enabled state for iscsi and cloud status.
	ISCSIAndCloudStatusCloudEnabled ISCSIAndCloudStatus = "CloudEnabled"
	// ISCSIAndCloudStatusDisabled specifies the iscsi and cloud status disabled state for iscsi and cloud status.
	ISCSIAndCloudStatusDisabled ISCSIAndCloudStatus = "Disabled"
	// ISCSIAndCloudStatusIscsiAndCloudEnabled specifies the iscsi and cloud status iscsi and cloud enabled state for iscsi
	// and cloud status.
	ISCSIAndCloudStatusIscsiAndCloudEnabled ISCSIAndCloudStatus = "IscsiAndCloudEnabled"
	// ISCSIAndCloudStatusIscsiEnabled specifies the iscsi and cloud status iscsi enabled state for iscsi and cloud status.
	ISCSIAndCloudStatusIscsiEnabled ISCSIAndCloudStatus = "IscsiEnabled"
)

// JobStatus enumerates the values for job status.
type JobStatus string

const (
	// Canceled specifies the canceled state for job status.
	Canceled JobStatus = "Canceled"
	// Failed specifies the failed state for job status.
	Failed JobStatus = "Failed"
	// Running specifies the running state for job status.
	Running JobStatus = "Running"
	// Succeeded specifies the succeeded state for job status.
	Succeeded JobStatus = "Succeeded"
)

// JobType enumerates the values for job type.
type JobType string

const (
	// CloneVolume specifies the clone volume state for job type.
	CloneVolume JobType = "CloneVolume"
	// CreateCloudAppliance specifies the create cloud appliance state for job type.
	CreateCloudAppliance JobType = "CreateCloudAppliance"
	// CreateLocallyPinnedVolume specifies the create locally pinned volume state for job type.
	CreateLocallyPinnedVolume JobType = "CreateLocallyPinnedVolume"
	// FailoverVolumeContainers specifies the failover volume containers state for job type.
	FailoverVolumeContainers JobType = "FailoverVolumeContainers"
	// InstallUpdates specifies the install updates state for job type.
	InstallUpdates JobType = "InstallUpdates"
	// ManualBackup specifies the manual backup state for job type.
	ManualBackup JobType = "ManualBackup"
	// ModifyVolume specifies the modify volume state for job type.
	ModifyVolume JobType = "ModifyVolume"
	// RestoreBackup specifies the restore backup state for job type.
	RestoreBackup JobType = "RestoreBackup"
	// ScheduledBackup specifies the scheduled backup state for job type.
	ScheduledBackup JobType = "ScheduledBackup"
	// SupportPackageLogs specifies the support package logs state for job type.
	SupportPackageLogs JobType = "SupportPackageLogs"
)

// KeyRolloverStatus enumerates the values for key rollover status.
type KeyRolloverStatus string

const (
	// NotRequired specifies the not required state for key rollover status.
	NotRequired KeyRolloverStatus = "NotRequired"
	// Required specifies the required state for key rollover status.
	Required KeyRolloverStatus = "Required"
)

// Kind enumerates the values for kind.
type Kind string

const (
	// Series8000 specifies the series 8000 state for kind.
	Series8000 Kind = "Series8000"
)

// ManagerType enumerates the values for manager type.
type ManagerType string

const (
	// GardaV1 specifies the garda v1 state for manager type.
	GardaV1 ManagerType = "GardaV1"
	// HelsinkiV1 specifies the helsinki v1 state for manager type.
	HelsinkiV1 ManagerType = "HelsinkiV1"
)

// MetricAggregationType enumerates the values for metric aggregation type.
type MetricAggregationType string

const (
	// MetricAggregationTypeAverage specifies the metric aggregation type average state for metric aggregation type.
	MetricAggregationTypeAverage MetricAggregationType = "Average"
	// MetricAggregationTypeLast specifies the metric aggregation type last state for metric aggregation type.
	MetricAggregationTypeLast MetricAggregationType = "Last"
	// MetricAggregationTypeMaximum specifies the metric aggregation type maximum state for metric aggregation type.
	MetricAggregationTypeMaximum MetricAggregationType = "Maximum"
	// MetricAggregationTypeMinimum specifies the metric aggregation type minimum state for metric aggregation type.
	MetricAggregationTypeMinimum MetricAggregationType = "Minimum"
	// MetricAggregationTypeNone specifies the metric aggregation type none state for metric aggregation type.
	MetricAggregationTypeNone MetricAggregationType = "None"
	// MetricAggregationTypeTotal specifies the metric aggregation type total state for metric aggregation type.
	MetricAggregationTypeTotal MetricAggregationType = "Total"
)

// MetricUnit enumerates the values for metric unit.
type MetricUnit string

const (
	// Bytes specifies the bytes state for metric unit.
	Bytes MetricUnit = "Bytes"
	// BytesPerSecond specifies the bytes per second state for metric unit.
	BytesPerSecond MetricUnit = "BytesPerSecond"
	// Count specifies the count state for metric unit.
	Count MetricUnit = "Count"
	// CountPerSecond specifies the count per second state for metric unit.
	CountPerSecond MetricUnit = "CountPerSecond"
	// Percent specifies the percent state for metric unit.
	Percent MetricUnit = "Percent"
	// Seconds specifies the seconds state for metric unit.
	Seconds MetricUnit = "Seconds"
)

// MonitoringStatus enumerates the values for monitoring status.
type MonitoringStatus string

const (
	// MonitoringStatusDisabled specifies the monitoring status disabled state for monitoring status.
	MonitoringStatusDisabled MonitoringStatus = "Disabled"
	// MonitoringStatusEnabled specifies the monitoring status enabled state for monitoring status.
	MonitoringStatusEnabled MonitoringStatus = "Enabled"
)

// NetInterfaceID enumerates the values for net interface id.
type NetInterfaceID string

const (
	// NetInterfaceIDData0 specifies the net interface id data 0 state for net interface id.
	NetInterfaceIDData0 NetInterfaceID = "Data0"
	// NetInterfaceIDData1 specifies the net interface id data 1 state for net interface id.
	NetInterfaceIDData1 NetInterfaceID = "Data1"
	// NetInterfaceIDData2 specifies the net interface id data 2 state for net interface id.
	NetInterfaceIDData2 NetInterfaceID = "Data2"
	// NetInterfaceIDData3 specifies the net interface id data 3 state for net interface id.
	NetInterfaceIDData3 NetInterfaceID = "Data3"
	// NetInterfaceIDData4 specifies the net interface id data 4 state for net interface id.
	NetInterfaceIDData4 NetInterfaceID = "Data4"
	// NetInterfaceIDData5 specifies the net interface id data 5 state for net interface id.
	NetInterfaceIDData5 NetInterfaceID = "Data5"
	// NetInterfaceIDInvalid specifies the net interface id invalid state for net interface id.
	NetInterfaceIDInvalid NetInterfaceID = "Invalid"
)

// NetInterfaceStatus enumerates the values for net interface status.
type NetInterfaceStatus string

const (
	// NetInterfaceStatusDisabled specifies the net interface status disabled state for net interface status.
	NetInterfaceStatusDisabled NetInterfaceStatus = "Disabled"
	// NetInterfaceStatusEnabled specifies the net interface status enabled state for net interface status.
	NetInterfaceStatusEnabled NetInterfaceStatus = "Enabled"
)

// NetworkMode enumerates the values for network mode.
type NetworkMode string

const (
	// NetworkModeBOTH specifies the network mode both state for network mode.
	NetworkModeBOTH NetworkMode = "BOTH"
	// NetworkModeInvalid specifies the network mode invalid state for network mode.
	NetworkModeInvalid NetworkMode = "Invalid"
	// NetworkModeIPV4 specifies the network mode ipv4 state for network mode.
	NetworkModeIPV4 NetworkMode = "IPV4"
	// NetworkModeIPV6 specifies the network mode ipv6 state for network mode.
	NetworkModeIPV6 NetworkMode = "IPV6"
)

// OperationStatus enumerates the values for operation status.
type OperationStatus string

const (
	// OperationStatusDeleting specifies the operation status deleting state for operation status.
	OperationStatusDeleting OperationStatus = "Deleting"
	// OperationStatusNone specifies the operation status none state for operation status.
	OperationStatusNone OperationStatus = "None"
	// OperationStatusRestoring specifies the operation status restoring state for operation status.
	OperationStatusRestoring OperationStatus = "Restoring"
	// OperationStatusUpdating specifies the operation status updating state for operation status.
	OperationStatusUpdating OperationStatus = "Updating"
)

// OwnerShipStatus enumerates the values for owner ship status.
type OwnerShipStatus string

const (
	// NotOwned specifies the not owned state for owner ship status.
	NotOwned OwnerShipStatus = "NotOwned"
	// Owned specifies the owned state for owner ship status.
	Owned OwnerShipStatus = "Owned"
)

// RecurrenceType enumerates the values for recurrence type.
type RecurrenceType string

const (
	// Daily specifies the daily state for recurrence type.
	Daily RecurrenceType = "Daily"
	// Hourly specifies the hourly state for recurrence type.
	Hourly RecurrenceType = "Hourly"
	// Minutes specifies the minutes state for recurrence type.
	Minutes RecurrenceType = "Minutes"
	// Weekly specifies the weekly state for recurrence type.
	Weekly RecurrenceType = "Weekly"
)

// RemoteManagementModeConfiguration enumerates the values for remote management mode configuration.
type RemoteManagementModeConfiguration string

const (
	// RemoteManagementModeConfigurationDisabled specifies the remote management mode configuration disabled state for
	// remote management mode configuration.
	RemoteManagementModeConfigurationDisabled RemoteManagementModeConfiguration = "Disabled"
	// RemoteManagementModeConfigurationHTTPSAndHTTPEnabled specifies the remote management mode configuration https and
	// http enabled state for remote management mode configuration.
	RemoteManagementModeConfigurationHTTPSAndHTTPEnabled RemoteManagementModeConfiguration = "HttpsAndHttpEnabled"
	// RemoteManagementModeConfigurationHTTPSEnabled specifies the remote management mode configuration https enabled state
	// for remote management mode configuration.
	RemoteManagementModeConfigurationHTTPSEnabled RemoteManagementModeConfiguration = "HttpsEnabled"
	// RemoteManagementModeConfigurationUnknown specifies the remote management mode configuration unknown state for remote
	// management mode configuration.
	RemoteManagementModeConfigurationUnknown RemoteManagementModeConfiguration = "Unknown"
)

// ScheduledBackupStatus enumerates the values for scheduled backup status.
type ScheduledBackupStatus string

const (
	// ScheduledBackupStatusDisabled specifies the scheduled backup status disabled state for scheduled backup status.
	ScheduledBackupStatusDisabled ScheduledBackupStatus = "Disabled"
	// ScheduledBackupStatusEnabled specifies the scheduled backup status enabled state for scheduled backup status.
	ScheduledBackupStatusEnabled ScheduledBackupStatus = "Enabled"
)

// ScheduleStatus enumerates the values for schedule status.
type ScheduleStatus string

const (
	// ScheduleStatusDisabled specifies the schedule status disabled state for schedule status.
	ScheduleStatusDisabled ScheduleStatus = "Disabled"
	// ScheduleStatusEnabled specifies the schedule status enabled state for schedule status.
	ScheduleStatusEnabled ScheduleStatus = "Enabled"
)

// SslStatus enumerates the values for ssl status.
type SslStatus string

const (
	// SslStatusDisabled specifies the ssl status disabled state for ssl status.
	SslStatusDisabled SslStatus = "Disabled"
	// SslStatusEnabled specifies the ssl status enabled state for ssl status.
	SslStatusEnabled SslStatus = "Enabled"
)

// TargetEligibilityResultCode enumerates the values for target eligibility result code.
type TargetEligibilityResultCode string

const (
	// LocalToTieredVolumesConversionWarning specifies the local to tiered volumes conversion warning state for target
	// eligibility result code.
	LocalToTieredVolumesConversionWarning TargetEligibilityResultCode = "LocalToTieredVolumesConversionWarning"
	// TargetAndSourceCannotBeSameError specifies the target and source cannot be same error state for target eligibility
	// result code.
	TargetAndSourceCannotBeSameError TargetEligibilityResultCode = "TargetAndSourceCannotBeSameError"
	// TargetInsufficientCapacityError specifies the target insufficient capacity error state for target eligibility result
	// code.
	TargetInsufficientCapacityError TargetEligibilityResultCode = "TargetInsufficientCapacityError"
	// TargetInsufficientLocalVolumeMemoryError specifies the target insufficient local volume memory error state for
	// target eligibility result code.
	TargetInsufficientLocalVolumeMemoryError TargetEligibilityResultCode = "TargetInsufficientLocalVolumeMemoryError"
	// TargetInsufficientTieredVolumeMemoryError specifies the target insufficient tiered volume memory error state for
	// target eligibility result code.
	TargetInsufficientTieredVolumeMemoryError TargetEligibilityResultCode = "TargetInsufficientTieredVolumeMemoryError"
	// TargetIsNotOnlineError specifies the target is not online error state for target eligibility result code.
	TargetIsNotOnlineError TargetEligibilityResultCode = "TargetIsNotOnlineError"
	// TargetSourceIncompatibleVersionError specifies the target source incompatible version error state for target
	// eligibility result code.
	TargetSourceIncompatibleVersionError TargetEligibilityResultCode = "TargetSourceIncompatibleVersionError"
)

// TargetEligibilityStatus enumerates the values for target eligibility status.
type TargetEligibilityStatus string

const (
	// TargetEligibilityStatusEligible specifies the target eligibility status eligible state for target eligibility
	// status.
	TargetEligibilityStatusEligible TargetEligibilityStatus = "Eligible"
	// TargetEligibilityStatusNotEligible specifies the target eligibility status not eligible state for target eligibility
	// status.
	TargetEligibilityStatusNotEligible TargetEligibilityStatus = "NotEligible"
)

// VirtualMachineAPIType enumerates the values for virtual machine api type.
type VirtualMachineAPIType string

const (
	// Arm specifies the arm state for virtual machine api type.
	Arm VirtualMachineAPIType = "Arm"
	// Classic specifies the classic state for virtual machine api type.
	Classic VirtualMachineAPIType = "Classic"
)

// VolumeStatus enumerates the values for volume status.
type VolumeStatus string

const (
	// VolumeStatusOffline specifies the volume status offline state for volume status.
	VolumeStatusOffline VolumeStatus = "Offline"
	// VolumeStatusOnline specifies the volume status online state for volume status.
	VolumeStatusOnline VolumeStatus = "Online"
)

// VolumeType enumerates the values for volume type.
type VolumeType string

const (
	// Archival specifies the archival state for volume type.
	Archival VolumeType = "Archival"
	// LocallyPinned specifies the locally pinned state for volume type.
	LocallyPinned VolumeType = "LocallyPinned"
	// Tiered specifies the tiered state for volume type.
	Tiered VolumeType = "Tiered"
)

// AccessControlRecord is the access control record.
type AccessControlRecord struct {
	autorest.Response              `json:"-"`
	ID                             *string `json:"id,omitempty"`
	Name                           *string `json:"name,omitempty"`
	Type                           *string `json:"type,omitempty"`
	Kind                           Kind    `json:"kind,omitempty"`
	*AccessControlRecordProperties `json:"properties,omitempty"`
}

// AccessControlRecordList is the collection of access control records.
type AccessControlRecordList struct {
	autorest.Response `json:"-"`
	Value             *[]AccessControlRecord `json:"value,omitempty"`
}

// AccessControlRecordProperties is the properties of access control record.
type AccessControlRecordProperties struct {
	InitiatorName *string `json:"initiatorName,omitempty"`
	VolumeCount   *int32  `json:"volumeCount,omitempty"`
}

// AcsConfiguration is the ACS configuration.
type AcsConfiguration struct {
	Namespace  *string `json:"namespace,omitempty"`
	Realm      *string `json:"realm,omitempty"`
	ServiceURL *string `json:"serviceUrl,omitempty"`
}

// Alert is the alert.
type Alert struct {
	ID               *string `json:"id,omitempty"`
	Name             *string `json:"name,omitempty"`
	Type             *string `json:"type,omitempty"`
	Kind             Kind    `json:"kind,omitempty"`
	*AlertProperties `json:"properties,omitempty"`
}

// AlertErrorDetails is the details of the error for which the alert was raised
type AlertErrorDetails struct {
	ErrorCode    *string `json:"errorCode,omitempty"`
	ErrorMessage *string `json:"errorMessage,omitempty"`
	Occurences   *int32  `json:"occurences,omitempty"`
}

// AlertFilter is the OData filters to be used for Alert
type AlertFilter struct {
	Status         AlertStatus     `json:"status,omitempty"`
	Severity       AlertSeverity   `json:"severity,omitempty"`
	SourceType     AlertSourceType `json:"sourceType,omitempty"`
	SourceName     *string         `json:"sourceName,omitempty"`
	AppearedOnTime *date.Time      `json:"appearedOnTime,omitempty"`
}

// AlertList is the collection of alerts.
type AlertList struct {
	autorest.Response `json:"-"`
	Value             *[]Alert `json:"value,omitempty"`
	NextLink          *string  `json:"nextLink,omitempty"`
}

// AlertListPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client AlertList) AlertListPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// AlertNotificationProperties is the properties of the alert notification settings.
type AlertNotificationProperties struct {
	EmailNotification            AlertEmailNotificationStatus `json:"emailNotification,omitempty"`
	AlertNotificationCulture     *string                      `json:"alertNotificationCulture,omitempty"`
	NotificationToServiceOwners  AlertEmailNotificationStatus `json:"notificationToServiceOwners,omitempty"`
	AdditionalRecipientEmailList *[]string                    `json:"additionalRecipientEmailList,omitempty"`
}

// AlertProperties is the properties of alert
type AlertProperties struct {
	Title                *string             `json:"title,omitempty"`
	Scope                AlertScope          `json:"scope,omitempty"`
	AlertType            *string             `json:"alertType,omitempty"`
	AppearedAtTime       *date.Time          `json:"appearedAtTime,omitempty"`
	AppearedAtSourceTime *date.Time          `json:"appearedAtSourceTime,omitempty"`
	ClearedAtTime        *date.Time          `json:"clearedAtTime,omitempty"`
	ClearedAtSourceTime  *date.Time          `json:"clearedAtSourceTime,omitempty"`
	Source               *AlertSource        `json:"source,omitempty"`
	Recommendation       *string             `json:"recommendation,omitempty"`
	ResolutionReason     *string             `json:"resolutionReason,omitempty"`
	Severity             AlertSeverity       `json:"severity,omitempty"`
	Status               AlertStatus         `json:"status,omitempty"`
	ErrorDetails         *AlertErrorDetails  `json:"errorDetails,omitempty"`
	DetailedInformation  *map[string]*string `json:"detailedInformation,omitempty"`
}

// AlertSettings is the alert settings.
type AlertSettings struct {
	autorest.Response            `json:"-"`
	ID                           *string `json:"id,omitempty"`
	Name                         *string `json:"name,omitempty"`
	Type                         *string `json:"type,omitempty"`
	Kind                         Kind    `json:"kind,omitempty"`
	*AlertNotificationProperties `json:"properties,omitempty"`
}

// AlertSource is the source details at which the alert was raised
type AlertSource struct {
	Name            *string         `json:"name,omitempty"`
	TimeZone        *string         `json:"timeZone,omitempty"`
	AlertSourceType AlertSourceType `json:"alertSourceType,omitempty"`
}

// AsymmetricEncryptedSecret is represent the secrets intended for encryption with asymmetric key pair.
type AsymmetricEncryptedSecret struct {
	Value                    *string             `json:"value,omitempty"`
	EncryptionCertThumbprint *string             `json:"encryptionCertThumbprint,omitempty"`
	EncryptionAlgorithm      EncryptionAlgorithm `json:"encryptionAlgorithm,omitempty"`
}

// AvailableProviderOperation is represents available provider operation.
type AvailableProviderOperation struct {
	Name       *string                            `json:"name,omitempty"`
	Display    *AvailableProviderOperationDisplay `json:"display,omitempty"`
	Origin     *string                            `json:"origin,omitempty"`
	Properties *map[string]interface{}            `json:"properties,omitempty"`
}

// AvailableProviderOperationDisplay is contains the localized display information for this particular
// operation/action. These value will be used by several clients for (a) custom role definitions for RBAC, (b) complex
// query filters for the event service and (c) audit history/records for management operations.
type AvailableProviderOperationDisplay struct {
	Provider    *string `json:"provider,omitempty"`
	Resource    *string `json:"resource,omitempty"`
	Operation   *string `json:"operation,omitempty"`
	Description *string `json:"description,omitempty"`
}

// AvailableProviderOperationList is list of available provider operations.
type AvailableProviderOperationList struct {
	autorest.Response `json:"-"`
	Value             *[]AvailableProviderOperation `json:"value,omitempty"`
	NextLink          *string                       `json:"nextLink,omitempty"`
}

// AvailableProviderOperationListPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client AvailableProviderOperationList) AvailableProviderOperationListPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// Backup is the backup.
type Backup struct {
	ID                *string `json:"id,omitempty"`
	Name              *string `json:"name,omitempty"`
	Type              *string `json:"type,omitempty"`
	Kind              Kind    `json:"kind,omitempty"`
	*BackupProperties `json:"properties,omitempty"`
}

// BackupElement is the backup element.
type BackupElement struct {
	ElementID         *string    `json:"elementId,omitempty"`
	ElementName       *string    `json:"elementName,omitempty"`
	ElementType       *string    `json:"elementType,omitempty"`
	SizeInBytes       *int64     `json:"sizeInBytes,omitempty"`
	VolumeName        *string    `json:"volumeName,omitempty"`
	VolumeContainerID *string    `json:"volumeContainerId,omitempty"`
	VolumeType        VolumeType `json:"volumeType,omitempty"`
}

// BackupFilter is the OData filters to be used for backups.
type BackupFilter struct {
	BackupPolicyID *string    `json:"backupPolicyId,omitempty"`
	VolumeID       *string    `json:"volumeId,omitempty"`
	CreatedTime    *date.Time `json:"createdTime,omitempty"`
}

// BackupList is the collection of backups.
type BackupList struct {
	autorest.Response `json:"-"`
	Value             *[]Backup `json:"value,omitempty"`
	NextLink          *string   `json:"nextLink,omitempty"`
}

// BackupListPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client BackupList) BackupListPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// BackupPolicy is the backup policy.
type BackupPolicy struct {
	autorest.Response       `json:"-"`
	ID                      *string `json:"id,omitempty"`
	Name                    *string `json:"name,omitempty"`
	Type                    *string `json:"type,omitempty"`
	Kind                    Kind    `json:"kind,omitempty"`
	*BackupPolicyProperties `json:"properties,omitempty"`
}

// BackupPolicyList is the collection of backup policies.
type BackupPolicyList struct {
	autorest.Response `json:"-"`
	Value             *[]BackupPolicy `json:"value,omitempty"`
}

// BackupPolicyProperties is the properties of the backup policy.
type BackupPolicyProperties struct {
	VolumeIds                *[]string                `json:"volumeIds,omitempty"`
	NextBackupTime           *date.Time               `json:"nextBackupTime,omitempty"`
	LastBackupTime           *date.Time               `json:"lastBackupTime,omitempty"`
	SchedulesCount           *int64                   `json:"schedulesCount,omitempty"`
	ScheduledBackupStatus    ScheduledBackupStatus    `json:"scheduledBackupStatus,omitempty"`
	BackupPolicyCreationType BackupPolicyCreationType `json:"backupPolicyCreationType,omitempty"`
	SsmHostName              *string                  `json:"ssmHostName,omitempty"`
}

// BackupProperties is the properties of the backup.
type BackupProperties struct {
	CreatedOn             *date.Time            `json:"createdOn,omitempty"`
	SizeInBytes           *int64                `json:"sizeInBytes,omitempty"`
	BackupType            BackupType            `json:"backupType,omitempty"`
	BackupJobCreationType BackupJobCreationType `json:"backupJobCreationType,omitempty"`
	BackupPolicyID        *string               `json:"backupPolicyId,omitempty"`
	SsmHostName           *string               `json:"ssmHostName,omitempty"`
	Elements              *[]BackupElement      `json:"elements,omitempty"`
}

// BackupSchedule is the backup schedule.
type BackupSchedule struct {
	autorest.Response         `json:"-"`
	ID                        *string `json:"id,omitempty"`
	Name                      *string `json:"name,omitempty"`
	Type                      *string `json:"type,omitempty"`
	Kind                      Kind    `json:"kind,omitempty"`
	*BackupScheduleProperties `json:"properties,omitempty"`
}

// BackupScheduleList is the backup schedule list.
type BackupScheduleList struct {
	autorest.Response `json:"-"`
	Value             *[]BackupSchedule `json:"value,omitempty"`
}

// BackupScheduleProperties is the properties of the backup schedule.
type BackupScheduleProperties struct {
	ScheduleRecurrence *ScheduleRecurrence `json:"scheduleRecurrence,omitempty"`
	BackupType         BackupType          `json:"backupType,omitempty"`
	RetentionCount     *int64              `json:"retentionCount,omitempty"`
	StartTime          *date.Time          `json:"startTime,omitempty"`
	ScheduleStatus     ScheduleStatus      `json:"scheduleStatus,omitempty"`
	LastSuccessfulRun  *date.Time          `json:"lastSuccessfulRun,omitempty"`
}

// BandwidthRateSettingProperties is the properties of the bandwidth setting.
type BandwidthRateSettingProperties struct {
	Schedules   *[]BandwidthSchedule `json:"schedules,omitempty"`
	VolumeCount *int32               `json:"volumeCount,omitempty"`
}

// BandwidthSchedule is the schedule for bandwidth setting.
type BandwidthSchedule struct {
	Start      *Time        `json:"start,omitempty"`
	Stop       *Time        `json:"stop,omitempty"`
	RateInMbps *int32       `json:"rateInMbps,omitempty"`
	Days       *[]DayOfWeek `json:"days,omitempty"`
}

// BandwidthSetting is the bandwidth setting.
type BandwidthSetting struct {
	autorest.Response               `json:"-"`
	ID                              *string `json:"id,omitempty"`
	Name                            *string `json:"name,omitempty"`
	Type                            *string `json:"type,omitempty"`
	Kind                            Kind    `json:"kind,omitempty"`
	*BandwidthRateSettingProperties `json:"properties,omitempty"`
}

// BandwidthSettingList is the collection of bandwidth setting entities.
type BandwidthSettingList struct {
	autorest.Response `json:"-"`
	Value             *[]BandwidthSetting `json:"value,omitempty"`
}

// BaseModel is represents the base class for all other ARM object models
type BaseModel struct {
	ID   *string `json:"id,omitempty"`
	Name *string `json:"name,omitempty"`
	Type *string `json:"type,omitempty"`
	Kind Kind    `json:"kind,omitempty"`
}

// ChapSettings is the Challenge-Handshake Authentication Protocol (CHAP) settings.
type ChapSettings struct {
	InitiatorUser   *string                    `json:"initiatorUser,omitempty"`
	InitiatorSecret *AsymmetricEncryptedSecret `json:"initiatorSecret,omitempty"`
	TargetUser      *string                    `json:"targetUser,omitempty"`
	TargetSecret    *AsymmetricEncryptedSecret `json:"targetSecret,omitempty"`
}

// ClearAlertRequest is the request for clearing the alert
type ClearAlertRequest struct {
	ResolutionMessage *string   `json:"resolutionMessage,omitempty"`
	Alerts            *[]string `json:"alerts,omitempty"`
}

// CloneRequest is the clone job request.
type CloneRequest struct {
	TargetDeviceID               *string        `json:"targetDeviceId,omitempty"`
	TargetVolumeName             *string        `json:"targetVolumeName,omitempty"`
	TargetAccessControlRecordIds *[]string      `json:"targetAccessControlRecordIds,omitempty"`
	BackupElement                *BackupElement `json:"backupElement,omitempty"`
}

// CloudAppliance is the cloud appliance.
type CloudAppliance struct {
	Name                    *string `json:"name,omitempty"`
	VnetName                *string `json:"vnetName,omitempty"`
	VnetRegion              *string `json:"vnetRegion,omitempty"`
	IsVnetDNSConfigured     *bool   `json:"isVnetDnsConfigured,omitempty"`
	IsVnetExpressConfigured *bool   `json:"isVnetExpressConfigured,omitempty"`
	SubnetName              *string `json:"subnetName,omitempty"`
	StorageAccountName      *string `json:"storageAccountName,omitempty"`
	StorageAccountType      *string `json:"storageAccountType,omitempty"`
	VMType                  *string `json:"vmType,omitempty"`
	VMImageName             *string `json:"vmImageName,omitempty"`
	ModelNumber             *string `json:"modelNumber,omitempty"`
}

// CloudApplianceConfiguration is the cloud appliance configuration
type CloudApplianceConfiguration struct {
	ID                                     *string `json:"id,omitempty"`
	Name                                   *string `json:"name,omitempty"`
	Type                                   *string `json:"type,omitempty"`
	Kind                                   Kind    `json:"kind,omitempty"`
	*CloudApplianceConfigurationProperties `json:"properties,omitempty"`
}

// CloudApplianceConfigurationList is the cloud appliance configuration list
type CloudApplianceConfigurationList struct {
	autorest.Response `json:"-"`
	Value             *[]CloudApplianceConfiguration `json:"value,omitempty"`
}

// CloudApplianceConfigurationProperties is the properties of cloud appliance configuration.
type CloudApplianceConfigurationProperties struct {
	ModelNumber                  *string           `json:"modelNumber,omitempty"`
	CloudPlatform                *string           `json:"cloudPlatform,omitempty"`
	AcsConfiguration             *AcsConfiguration `json:"acsConfiguration,omitempty"`
	SupportedStorageAccountTypes *[]string         `json:"supportedStorageAccountTypes,omitempty"`
	SupportedRegions             *[]string         `json:"supportedRegions,omitempty"`
	SupportedVMTypes             *[]string         `json:"supportedVmTypes,omitempty"`
	SupportedVMImages            *[]VMImage        `json:"supportedVmImages,omitempty"`
}

// CloudApplianceSettings is the cloud appliance settings.
type CloudApplianceSettings struct {
	ServiceDataEncryptionKey *AsymmetricEncryptedSecret `json:"serviceDataEncryptionKey,omitempty"`
	ChannelIntegrityKey      *AsymmetricEncryptedSecret `json:"channelIntegrityKey,omitempty"`
}

// ConfigureDeviceRequest is the mandatory device configuration request.
type ConfigureDeviceRequest struct {
	ID                                *string `json:"id,omitempty"`
	Name                              *string `json:"name,omitempty"`
	Type                              *string `json:"type,omitempty"`
	Kind                              Kind    `json:"kind,omitempty"`
	*ConfigureDeviceRequestProperties `json:"properties,omitempty"`
}

// ConfigureDeviceRequestProperties is the properties of the configure device request.
type ConfigureDeviceRequestProperties struct {
	FriendlyName                  *string                        `json:"friendlyName,omitempty"`
	CurrentDeviceName             *string                        `json:"currentDeviceName,omitempty"`
	TimeZone                      *string                        `json:"timeZone,omitempty"`
	DNSSettings                   *SecondaryDNSSettings          `json:"dnsSettings,omitempty"`
	NetworkInterfaceData0Settings *NetworkInterfaceData0Settings `json:"networkInterfaceData0Settings,omitempty"`
}

// ControllerPowerStateChangeRequest is the controller power state change request.
type ControllerPowerStateChangeRequest struct {
	ID                                           *string `json:"id,omitempty"`
	Name                                         *string `json:"name,omitempty"`
	Type                                         *string `json:"type,omitempty"`
	Kind                                         Kind    `json:"kind,omitempty"`
	*ControllerPowerStateChangeRequestProperties `json:"properties,omitempty"`
}

// ControllerPowerStateChangeRequestProperties is the properties of the controller power state change request.
type ControllerPowerStateChangeRequestProperties struct {
	Action           ControllerPowerStateAction `json:"action,omitempty"`
	ActiveController ControllerID               `json:"activeController,omitempty"`
	Controller0State ControllerStatus           `json:"controller0State,omitempty"`
	Controller1State ControllerStatus           `json:"controller1State,omitempty"`
}

// DataStatistics is the additional details related to the data related statistics of a job. Currently applicable only
// for Backup, Clone and Restore jobs.
type DataStatistics struct {
	TotalData     *int64 `json:"totalData,omitempty"`
	ProcessedData *int64 `json:"processedData,omitempty"`
	CloudData     *int64 `json:"cloudData,omitempty"`
	Throughput    *int64 `json:"throughput,omitempty"`
}

// Device is the StorSimple device.
type Device struct {
	autorest.Response `json:"-"`
	ID                *string `json:"id,omitempty"`
	Name              *string `json:"name,omitempty"`
	Type              *string `json:"type,omitempty"`
	Kind              Kind    `json:"kind,omitempty"`
	*DeviceProperties `json:"properties,omitempty"`
}

// DeviceDetails is the additional device details regarding the end point count and volume container count.
type DeviceDetails struct {
	EndpointCount        *int32 `json:"endpointCount,omitempty"`
	VolumeContainerCount *int32 `json:"volumeContainerCount,omitempty"`
}

// DeviceList is the collection of devices.
type DeviceList struct {
	autorest.Response `json:"-"`
	Value             *[]Device `json:"value,omitempty"`
}

// DevicePatch is the device patch.
type DevicePatch struct {
	*DevicePatchProperties `json:"properties,omitempty"`
}

// DevicePatchProperties is the properties of the device patch.
type DevicePatchProperties struct {
	DeviceDescription *string `json:"deviceDescription,omitempty"`
}

// DeviceProperties is the properties of the StorSimple device.
type DeviceProperties struct {
	FriendlyName                    *string                   `json:"friendlyName,omitempty"`
	ActivationTime                  *date.Time                `json:"activationTime,omitempty"`
	Culture                         *string                   `json:"culture,omitempty"`
	DeviceDescription               *string                   `json:"deviceDescription,omitempty"`
	DeviceSoftwareVersion           *string                   `json:"deviceSoftwareVersion,omitempty"`
	FriendlySoftwareName            *string                   `json:"friendlySoftwareName,omitempty"`
	DeviceConfigurationStatus       DeviceConfigurationStatus `json:"deviceConfigurationStatus,omitempty"`
	TargetIqn                       *string                   `json:"targetIqn,omitempty"`
	ModelDescription                *string                   `json:"modelDescription,omitempty"`
	Status                          DeviceStatus              `json:"status,omitempty"`
	SerialNumber                    *string                   `json:"serialNumber,omitempty"`
	DeviceType                      DeviceType                `json:"deviceType,omitempty"`
	ActiveController                ControllerID              `json:"activeController,omitempty"`
	FriendlySoftwareVersion         *string                   `json:"friendlySoftwareVersion,omitempty"`
	AvailableLocalStorageInBytes    *int64                    `json:"availableLocalStorageInBytes,omitempty"`
	AvailableTieredStorageInBytes   *int64                    `json:"availableTieredStorageInBytes,omitempty"`
	ProvisionedTieredStorageInBytes *int64                    `json:"provisionedTieredStorageInBytes,omitempty"`
	ProvisionedLocalStorageInBytes  *int64                    `json:"provisionedLocalStorageInBytes,omitempty"`
	ProvisionedVolumeSizeInBytes    *int64                    `json:"provisionedVolumeSizeInBytes,omitempty"`
	UsingStorageInBytes             *int64                    `json:"usingStorageInBytes,omitempty"`
	TotalTieredStorageInBytes       *int64                    `json:"totalTieredStorageInBytes,omitempty"`
	AgentGroupVersion               *int32                    `json:"agentGroupVersion,omitempty"`
	NetworkInterfaceCardCount       *int32                    `json:"networkInterfaceCardCount,omitempty"`
	DeviceLocation                  *string                   `json:"deviceLocation,omitempty"`
	VirtualMachineAPIType           VirtualMachineAPIType     `json:"virtualMachineApiType,omitempty"`
	Details                         *DeviceDetails            `json:"details,omitempty"`
	RolloverDetails                 *DeviceRolloverDetails    `json:"rolloverDetails,omitempty"`
}

// DeviceRolloverDetails is the additional device details for the service data encryption key rollover.
type DeviceRolloverDetails struct {
	AuthorizationEligibility AuthorizationEligibility `json:"authorizationEligibility,omitempty"`
	AuthorizationStatus      AuthorizationStatus      `json:"authorizationStatus,omitempty"`
	InEligibilityReason      InEligibilityCategory    `json:"inEligibilityReason,omitempty"`
}

// DimensionFilter is the dimension filter.
type DimensionFilter struct {
	Name   *string `json:"name,omitempty"`
	Values *string `json:"values,omitempty"`
}

// DNSSettings is the DNS(Domain Name Server) settings of a device.
type DNSSettings struct {
	PrimaryDNSServer        *string   `json:"primaryDnsServer,omitempty"`
	PrimaryIpv6DNSServer    *string   `json:"primaryIpv6DnsServer,omitempty"`
	SecondaryDNSServers     *[]string `json:"secondaryDnsServers,omitempty"`
	SecondaryIpv6DNSServers *[]string `json:"secondaryIpv6DnsServers,omitempty"`
}

// EncryptionSettings is the encryption settings.
type EncryptionSettings struct {
	autorest.Response             `json:"-"`
	ID                            *string `json:"id,omitempty"`
	Name                          *string `json:"name,omitempty"`
	Type                          *string `json:"type,omitempty"`
	Kind                          Kind    `json:"kind,omitempty"`
	*EncryptionSettingsProperties `json:"properties,omitempty"`
}

// EncryptionSettingsProperties is the properties of encryption settings.
type EncryptionSettingsProperties struct {
	EncryptionStatus  EncryptionStatus  `json:"encryptionStatus,omitempty"`
	KeyRolloverStatus KeyRolloverStatus `json:"keyRolloverStatus,omitempty"`
}

// FailoverRequest is the request object for triggering a failover of volume containers, from a source device to a
// target device.
type FailoverRequest struct {
	TargetDeviceID   *string   `json:"targetDeviceId,omitempty"`
	VolumeContainers *[]string `json:"volumeContainers,omitempty"`
}

// FailoverSet is the failover set on a device.
type FailoverSet struct {
	VolumeContainers  *[]VolumeContainerFailoverMetadata `json:"volumeContainers,omitempty"`
	EligibilityResult *FailoverSetEligibilityResult      `json:"eligibilityResult,omitempty"`
}

// FailoverSetEligibilityResult is the eligibility result of failover set, for failover.
type FailoverSetEligibilityResult struct {
	IsEligibleForFailover *bool   `json:"isEligibleForFailover,omitempty"`
	ErrorMessage          *string `json:"errorMessage,omitempty"`
}

// FailoverSetsList is the list of failover sets.
type FailoverSetsList struct {
	autorest.Response `json:"-"`
	Value             *[]FailoverSet `json:"value,omitempty"`
}

// FailoverTarget is represents the eligibility of a device as a failover target device.
type FailoverTarget struct {
	DeviceID                      *string                  `json:"deviceId,omitempty"`
	DeviceStatus                  DeviceStatus             `json:"deviceStatus,omitempty"`
	ModelDescription              *string                  `json:"modelDescription,omitempty"`
	DeviceSoftwareVersion         *string                  `json:"deviceSoftwareVersion,omitempty"`
	DataContainersCount           *int32                   `json:"dataContainersCount,omitempty"`
	VolumesCount                  *int32                   `json:"volumesCount,omitempty"`
	AvailableLocalStorageInBytes  *int64                   `json:"availableLocalStorageInBytes,omitempty"`
	AvailableTieredStorageInBytes *int64                   `json:"availableTieredStorageInBytes,omitempty"`
	DeviceLocation                *string                  `json:"deviceLocation,omitempty"`
	FriendlyDeviceSoftwareVersion *string                  `json:"friendlyDeviceSoftwareVersion,omitempty"`
	EligibilityResult             *TargetEligibilityResult `json:"eligibilityResult,omitempty"`
}

// FailoverTargetsList is the list of all devices in a resource and their eligibility status as a failover target
// device.
type FailoverTargetsList struct {
	autorest.Response `json:"-"`
	Value             *[]FailoverTarget `json:"value,omitempty"`
}

// Feature is the feature.
type Feature struct {
	Name   *string              `json:"name,omitempty"`
	Status FeatureSupportStatus `json:"status,omitempty"`
}

// FeatureFilter is the OData filter to be used for features.
type FeatureFilter struct {
	DeviceID *string `json:"deviceId,omitempty"`
}

// FeatureList is the collections of features.
type FeatureList struct {
	autorest.Response `json:"-"`
	Value             *[]Feature `json:"value,omitempty"`
}

// HardwareComponent is the hardware component.
type HardwareComponent struct {
	ComponentID       *string                 `json:"componentId,omitempty"`
	DisplayName       *string                 `json:"displayName,omitempty"`
	Status            HardwareComponentStatus `json:"status,omitempty"`
	StatusDisplayName *string                 `json:"statusDisplayName,omitempty"`
}

// HardwareComponentGroup is the hardware component group.
type HardwareComponentGroup struct {
	ID                                *string `json:"id,omitempty"`
	Name                              *string `json:"name,omitempty"`
	Type                              *string `json:"type,omitempty"`
	Kind                              Kind    `json:"kind,omitempty"`
	*HardwareComponentGroupProperties `json:"properties,omitempty"`
}

// HardwareComponentGroupList is the collection of hardware component groups.
type HardwareComponentGroupList struct {
	autorest.Response `json:"-"`
	Value             *[]HardwareComponentGroup `json:"value,omitempty"`
}

// HardwareComponentGroupProperties is the properties of hardware component group.
type HardwareComponentGroupProperties struct {
	DisplayName     *string              `json:"displayName,omitempty"`
	LastUpdatedTime *date.Time           `json:"lastUpdatedTime,omitempty"`
	Components      *[]HardwareComponent `json:"components,omitempty"`
}

// Job is the job.
type Job struct {
	autorest.Response `json:"-"`
	ID                *string          `json:"id,omitempty"`
	Name              *string          `json:"name,omitempty"`
	Type              *string          `json:"type,omitempty"`
	Kind              Kind             `json:"kind,omitempty"`
	Status            JobStatus        `json:"status,omitempty"`
	StartTime         *date.Time       `json:"startTime,omitempty"`
	EndTime           *date.Time       `json:"endTime,omitempty"`
	PercentComplete   *int32           `json:"percentComplete,omitempty"`
	Error             *JobErrorDetails `json:"error,omitempty"`
	*JobProperties    `json:"properties,omitempty"`
}

// JobErrorDetails is the job error details. Contains list of job error items.
type JobErrorDetails struct {
	ErrorDetails *[]JobErrorItem `json:"errorDetails,omitempty"`
	Code         *string         `json:"code,omitempty"`
	Message      *string         `json:"message,omitempty"`
}

// JobErrorItem is the job error items.
type JobErrorItem struct {
	Recommendations *[]string `json:"recommendations,omitempty"`
	Code            *string   `json:"code,omitempty"`
	Message         *string   `json:"message,omitempty"`
}

// JobFilter is the OData filter to be used for jobs.
type JobFilter struct {
	Status    *string    `json:"status,omitempty"`
	JobType   *string    `json:"jobType,omitempty"`
	StartTime *date.Time `json:"startTime,omitempty"`
}

// JobList is the collection of jobs.
type JobList struct {
	autorest.Response `json:"-"`
	Value             *[]Job  `json:"value,omitempty"`
	NextLink          *string `json:"nextLink,omitempty"`
}

// JobListPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client JobList) JobListPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// JobProperties is the properties of the job.
type JobProperties struct {
	JobType           JobType         `json:"jobType,omitempty"`
	DataStats         *DataStatistics `json:"dataStats,omitempty"`
	EntityLabel       *string         `json:"entityLabel,omitempty"`
	EntityType        *string         `json:"entityType,omitempty"`
	JobStages         *[]JobStage     `json:"jobStages,omitempty"`
	DeviceID          *string         `json:"deviceId,omitempty"`
	IsCancellable     *bool           `json:"isCancellable,omitempty"`
	BackupType        BackupType      `json:"backupType,omitempty"`
	SourceDeviceID    *string         `json:"sourceDeviceId,omitempty"`
	BackupPointInTime *date.Time      `json:"backupPointInTime,omitempty"`
}

// JobStage is the details about the specific stage of a job.
type JobStage struct {
	Message     *string   `json:"message,omitempty"`
	StageStatus JobStatus `json:"stageStatus,omitempty"`
	Detail      *string   `json:"detail,omitempty"`
	ErrorCode   *string   `json:"errorCode,omitempty"`
}

// Key is the key.
type Key struct {
	autorest.Response `json:"-"`
	ActivationKey     *string `json:"activationKey,omitempty"`
}

// ListFailoverTargetsRequest is the request object for fetching the list of failover targets (eligible devices for
// failover).
type ListFailoverTargetsRequest struct {
	VolumeContainers *[]string `json:"volumeContainers,omitempty"`
}

// Manager is the StorSimple Manager.
type Manager struct {
	autorest.Response  `json:"-"`
	ID                 *string             `json:"id,omitempty"`
	Name               *string             `json:"name,omitempty"`
	Type               *string             `json:"type,omitempty"`
	Location           *string             `json:"location,omitempty"`
	Tags               *map[string]*string `json:"tags,omitempty"`
	*ManagerProperties `json:"properties,omitempty"`
	Etag               *string `json:"etag,omitempty"`
}

// ManagerExtendedInfo is the extended info of the manager.
type ManagerExtendedInfo struct {
	autorest.Response              `json:"-"`
	ID                             *string `json:"id,omitempty"`
	Name                           *string `json:"name,omitempty"`
	Type                           *string `json:"type,omitempty"`
	Kind                           Kind    `json:"kind,omitempty"`
	*ManagerExtendedInfoProperties `json:"properties,omitempty"`
	Etag                           *string `json:"etag,omitempty"`
}

// ManagerExtendedInfoProperties is the properties of the manager extended info.
type ManagerExtendedInfoProperties struct {
	Version                     *string `json:"version,omitempty"`
	IntegrityKey                *string `json:"integrityKey,omitempty"`
	EncryptionKey               *string `json:"encryptionKey,omitempty"`
	EncryptionKeyThumbprint     *string `json:"encryptionKeyThumbprint,omitempty"`
	PortalCertificateThumbprint *string `json:"portalCertificateThumbprint,omitempty"`
	Algorithm                   *string `json:"algorithm,omitempty"`
}

// ManagerIntrinsicSettings is intrinsic settings which refers to the type of the Storsimple Manager.
type ManagerIntrinsicSettings struct {
	Type ManagerType `json:"type,omitempty"`
}

// ManagerList is the list of StorSimple Managers.
type ManagerList struct {
	autorest.Response `json:"-"`
	Value             *[]Manager `json:"value,omitempty"`
}

// ManagerPatch is the StorSimple Manager patch.
type ManagerPatch struct {
	Tags *map[string]*string `json:"tags,omitempty"`
}

// ManagerProperties is the properties of the StorSimple Manager.
type ManagerProperties struct {
	CisIntrinsicSettings *ManagerIntrinsicSettings `json:"cisIntrinsicSettings,omitempty"`
	Sku                  *ManagerSku               `json:"sku,omitempty"`
	ProvisioningState    *string                   `json:"provisioningState,omitempty"`
}

// ManagerSku is the Sku.
type ManagerSku struct {
	Name *string `json:"name,omitempty"`
}

// MetricAvailablity is the metric availability.
type MetricAvailablity struct {
	TimeGrain *string `json:"timeGrain,omitempty"`
	Retention *string `json:"retention,omitempty"`
}

// MetricData is the metric data.
type MetricData struct {
	TimeStamp *date.Time `json:"timeStamp,omitempty"`
	Sum       *float64   `json:"sum,omitempty"`
	Count     *int32     `json:"count,omitempty"`
	Average   *float64   `json:"average,omitempty"`
	Minimum   *float64   `json:"minimum,omitempty"`
	Maximum   *float64   `json:"maximum,omitempty"`
}

// MetricDefinition is the monitoring metric definition.
type MetricDefinition struct {
	Name                   *MetricName           `json:"name,omitempty"`
	Unit                   MetricUnit            `json:"unit,omitempty"`
	PrimaryAggregationType MetricAggregationType `json:"primaryAggregationType,omitempty"`
	ResourceID             *string               `json:"resourceId,omitempty"`
	MetricAvailabilities   *[]MetricAvailablity  `json:"metricAvailabilities,omitempty"`
	Dimensions             *[]MetricDimension    `json:"dimensions,omitempty"`
	Category               *string               `json:"category,omitempty"`
	Type                   *string               `json:"type,omitempty"`
}

// MetricDefinitionList is the list of metric definitions.
type MetricDefinitionList struct {
	autorest.Response `json:"-"`
	Value             *[]MetricDefinition `json:"value,omitempty"`
}

// MetricDimension is the metric dimension. It indicates the source of the metric.
type MetricDimension struct {
	Name  *string `json:"name,omitempty"`
	Value *string `json:"value,omitempty"`
}

// MetricFilter is the OData filters to be used for metrics.
type MetricFilter struct {
	Name       *MetricNameFilter `json:"name,omitempty"`
	StartTime  *date.Time        `json:"startTime,omitempty"`
	EndTime    *date.Time        `json:"endTime,omitempty"`
	TimeGrain  *string           `json:"timeGrain,omitempty"`
	Category   *string           `json:"category,omitempty"`
	Dimensions *DimensionFilter  `json:"dimensions,omitempty"`
}

// MetricList is the metric list.
type MetricList struct {
	autorest.Response `json:"-"`
	Value             *[]Metrics `json:"value,omitempty"`
}

// MetricName is the metric name.
type MetricName struct {
	Value          *string `json:"value,omitempty"`
	LocalizedValue *string `json:"localizedValue,omitempty"`
}

// MetricNameFilter is the metric name filter, specifying the name of the metric to be filtered on.
type MetricNameFilter struct {
	Value *string `json:"value,omitempty"`
}

// Metrics is the monitoring metric.
type Metrics struct {
	ResourceID         *string               `json:"resourceId,omitempty"`
	StartTime          *date.Time            `json:"startTime,omitempty"`
	EndTime            *date.Time            `json:"endTime,omitempty"`
	TimeGrain          *string               `json:"timeGrain,omitempty"`
	PrimaryAggregation MetricAggregationType `json:"primaryAggregation,omitempty"`
	Name               *MetricName           `json:"name,omitempty"`
	Dimensions         *[]MetricDimension    `json:"dimensions,omitempty"`
	Unit               MetricUnit            `json:"unit,omitempty"`
	Type               *string               `json:"type,omitempty"`
	Values             *[]MetricData         `json:"values,omitempty"`
}

// NetworkAdapterList is the collection of network adapters on the device.
type NetworkAdapterList struct {
	Value *[]NetworkAdapters `json:"value,omitempty"`
}

// NetworkAdapters is represents the network adapter on device.
type NetworkAdapters struct {
	InterfaceID         NetInterfaceID      `json:"interfaceId,omitempty"`
	NetInterfaceStatus  NetInterfaceStatus  `json:"netInterfaceStatus,omitempty"`
	IsDefault           *bool               `json:"isDefault,omitempty"`
	IscsiAndCloudStatus ISCSIAndCloudStatus `json:"iscsiAndCloudStatus,omitempty"`
	Speed               *int64              `json:"speed,omitempty"`
	Mode                NetworkMode         `json:"mode,omitempty"`
	NicIpv4Settings     *NicIPv4            `json:"nicIpv4Settings,omitempty"`
	NicIpv6Settings     *NicIPv6            `json:"nicIpv6Settings,omitempty"`
}

// NetworkInterfaceData0Settings is the 'Data 0' network interface card settings.
type NetworkInterfaceData0Settings struct {
	ControllerZeroIP *string `json:"controllerZeroIp,omitempty"`
	ControllerOneIP  *string `json:"controllerOneIp,omitempty"`
}

// NetworkSettings is represents the network settings of a device.
type NetworkSettings struct {
	autorest.Response          `json:"-"`
	ID                         *string `json:"id,omitempty"`
	Name                       *string `json:"name,omitempty"`
	Type                       *string `json:"type,omitempty"`
	Kind                       Kind    `json:"kind,omitempty"`
	*NetworkSettingsProperties `json:"properties,omitempty"`
}

// NetworkSettingsPatch is represents the patch request for the network settings of a device.
type NetworkSettingsPatch struct {
	*NetworkSettingsPatchProperties `json:"properties,omitempty"`
}

// NetworkSettingsPatchProperties is the properties of the network settings patch.
type NetworkSettingsPatchProperties struct {
	DNSSettings     *DNSSettings        `json:"dnsSettings,omitempty"`
	NetworkAdapters *NetworkAdapterList `json:"networkAdapters,omitempty"`
}

// NetworkSettingsProperties is the properties of the network settings of device.
type NetworkSettingsProperties struct {
	DNSSettings      *DNSSettings        `json:"dnsSettings,omitempty"`
	NetworkAdapters  *NetworkAdapterList `json:"networkAdapters,omitempty"`
	WebproxySettings *WebproxySettings   `json:"webproxySettings,omitempty"`
}

// NicIPv4 is details related to the IPv4 address configuration.
type NicIPv4 struct {
	Ipv4Address            *string `json:"ipv4Address,omitempty"`
	Ipv4Netmask            *string `json:"ipv4Netmask,omitempty"`
	Ipv4Gateway            *string `json:"ipv4Gateway,omitempty"`
	Controller0Ipv4Address *string `json:"controller0Ipv4Address,omitempty"`
	Controller1Ipv4Address *string `json:"controller1Ipv4Address,omitempty"`
}

// NicIPv6 is details related to the IPv6 address configuration.
type NicIPv6 struct {
	Ipv6Address            *string `json:"ipv6Address,omitempty"`
	Ipv6Prefix             *string `json:"ipv6Prefix,omitempty"`
	Ipv6Gateway            *string `json:"ipv6Gateway,omitempty"`
	Controller0Ipv6Address *string `json:"controller0Ipv6Address,omitempty"`
	Controller1Ipv6Address *string `json:"controller1Ipv6Address,omitempty"`
}

// PublicKey is the public key.
type PublicKey struct {
	autorest.Response `json:"-"`
	Key               *string `json:"key,omitempty"`
}

// RemoteManagementSettings is the settings for remote management of a device.
type RemoteManagementSettings struct {
	RemoteManagementMode        RemoteManagementModeConfiguration `json:"remoteManagementMode,omitempty"`
	RemoteManagementCertificate *string                           `json:"remoteManagementCertificate,omitempty"`
}

// RemoteManagementSettingsPatch is the settings for updating remote management mode of the device.
type RemoteManagementSettingsPatch struct {
	RemoteManagementMode RemoteManagementModeConfiguration `json:"remoteManagementMode,omitempty"`
}

// Resource is the Azure Resource.
type Resource struct {
	ID       *string             `json:"id,omitempty"`
	Name     *string             `json:"name,omitempty"`
	Type     *string             `json:"type,omitempty"`
	Location *string             `json:"location,omitempty"`
	Tags     *map[string]*string `json:"tags,omitempty"`
}

// ScheduleRecurrence is the schedule recurrence.
type ScheduleRecurrence struct {
	RecurrenceType  RecurrenceType `json:"recurrenceType,omitempty"`
	RecurrenceValue *int32         `json:"recurrenceValue,omitempty"`
	WeeklyDaysList  *[]DayOfWeek   `json:"weeklyDaysList,omitempty"`
}

// SecondaryDNSSettings is the secondary DNS settings.
type SecondaryDNSSettings struct {
	SecondaryDNSServers *[]string `json:"secondaryDnsServers,omitempty"`
}

// SecuritySettings is the security settings of a device.
type SecuritySettings struct {
	autorest.Response           `json:"-"`
	ID                          *string `json:"id,omitempty"`
	Name                        *string `json:"name,omitempty"`
	Type                        *string `json:"type,omitempty"`
	Kind                        Kind    `json:"kind,omitempty"`
	*SecuritySettingsProperties `json:"properties,omitempty"`
}

// SecuritySettingsPatch is represents the patch request for the security settings of a device.
type SecuritySettingsPatch struct {
	*SecuritySettingsPatchProperties `json:"properties,omitempty"`
}

// SecuritySettingsPatchProperties is the properties of the security settings patch.
type SecuritySettingsPatchProperties struct {
	RemoteManagementSettings *RemoteManagementSettingsPatch `json:"remoteManagementSettings,omitempty"`
	DeviceAdminPassword      *AsymmetricEncryptedSecret     `json:"deviceAdminPassword,omitempty"`
	SnapshotPassword         *AsymmetricEncryptedSecret     `json:"snapshotPassword,omitempty"`
	ChapSettings             *ChapSettings                  `json:"chapSettings,omitempty"`
	CloudApplianceSettings   *CloudApplianceSettings        `json:"cloudApplianceSettings,omitempty"`
}

// SecuritySettingsProperties is the properties of security settings of a device.
type SecuritySettingsProperties struct {
	RemoteManagementSettings *RemoteManagementSettings `json:"remoteManagementSettings,omitempty"`
	ChapSettings             *ChapSettings             `json:"chapSettings,omitempty"`
}

// SendTestAlertEmailRequest is the request for sending test alert email
type SendTestAlertEmailRequest struct {
	EmailList *[]string `json:"emailList,omitempty"`
}

// StorageAccountCredential is the storage account credential.
type StorageAccountCredential struct {
	autorest.Response                   `json:"-"`
	ID                                  *string `json:"id,omitempty"`
	Name                                *string `json:"name,omitempty"`
	Type                                *string `json:"type,omitempty"`
	Kind                                Kind    `json:"kind,omitempty"`
	*StorageAccountCredentialProperties `json:"properties,omitempty"`
}

// StorageAccountCredentialList is the collection of storage account credential entities.
type StorageAccountCredentialList struct {
	autorest.Response `json:"-"`
	Value             *[]StorageAccountCredential `json:"value,omitempty"`
}

// StorageAccountCredentialProperties is the storage account credential properties.
type StorageAccountCredentialProperties struct {
	EndPoint     *string                    `json:"endPoint,omitempty"`
	SslStatus    SslStatus                  `json:"sslStatus,omitempty"`
	AccessKey    *AsymmetricEncryptedSecret `json:"accessKey,omitempty"`
	VolumesCount *int32                     `json:"volumesCount,omitempty"`
}

// SymmetricEncryptedSecret is represents the secrets encrypted using Symmetric Encryption Key.
type SymmetricEncryptedSecret struct {
	autorest.Response          `json:"-"`
	Value                      *string             `json:"value,omitempty"`
	ValueCertificateThumbprint *string             `json:"valueCertificateThumbprint,omitempty"`
	EncryptionAlgorithm        EncryptionAlgorithm `json:"encryptionAlgorithm,omitempty"`
}

// TargetEligibilityErrorMessage is the error/warning message due to which the device is ineligible as a failover
// target device.
type TargetEligibilityErrorMessage struct {
	Message    *string                     `json:"message,omitempty"`
	Resolution *string                     `json:"resolution,omitempty"`
	ResultCode TargetEligibilityResultCode `json:"resultCode,omitempty"`
}

// TargetEligibilityResult is the eligibility result of device, as a failover target device.
type TargetEligibilityResult struct {
	EligibilityStatus TargetEligibilityStatus          `json:"eligibilityStatus,omitempty"`
	Messages          *[]TargetEligibilityErrorMessage `json:"messages,omitempty"`
}

// Time is the time.
type Time struct {
	Hours   *int32 `json:"hours,omitempty"`
	Minutes *int32 `json:"minutes,omitempty"`
	Seconds *int32 `json:"seconds,omitempty"`
}

// TimeSettings is the time settings of a device.
type TimeSettings struct {
	autorest.Response       `json:"-"`
	ID                      *string `json:"id,omitempty"`
	Name                    *string `json:"name,omitempty"`
	Type                    *string `json:"type,omitempty"`
	Kind                    Kind    `json:"kind,omitempty"`
	*TimeSettingsProperties `json:"properties,omitempty"`
}

// TimeSettingsProperties is the properties of time settings of a device.
type TimeSettingsProperties struct {
	TimeZone            *string   `json:"timeZone,omitempty"`
	PrimaryTimeServer   *string   `json:"primaryTimeServer,omitempty"`
	SecondaryTimeServer *[]string `json:"secondaryTimeServer,omitempty"`
}

// Updates is the updates profile of a device.
type Updates struct {
	autorest.Response  `json:"-"`
	ID                 *string `json:"id,omitempty"`
	Name               *string `json:"name,omitempty"`
	Type               *string `json:"type,omitempty"`
	Kind               Kind    `json:"kind,omitempty"`
	*UpdatesProperties `json:"properties,omitempty"`
}

// UpdatesProperties is the properties of the updates profile.
type UpdatesProperties struct {
	RegularUpdatesAvailable         *bool      `json:"regularUpdatesAvailable,omitempty"`
	MaintenanceModeUpdatesAvailable *bool      `json:"maintenanceModeUpdatesAvailable,omitempty"`
	IsUpdateInProgress              *bool      `json:"isUpdateInProgress,omitempty"`
	LastUpdatedTime                 *date.Time `json:"lastUpdatedTime,omitempty"`
}

// VMImage is the virtual machine image.
type VMImage struct {
	Name      *string `json:"name,omitempty"`
	Version   *string `json:"version,omitempty"`
	Offer     *string `json:"offer,omitempty"`
	Publisher *string `json:"publisher,omitempty"`
	Sku       *string `json:"sku,omitempty"`
}

// Volume is the volume.
type Volume struct {
	autorest.Response `json:"-"`
	ID                *string `json:"id,omitempty"`
	Name              *string `json:"name,omitempty"`
	Type              *string `json:"type,omitempty"`
	Kind              Kind    `json:"kind,omitempty"`
	*VolumeProperties `json:"properties,omitempty"`
}

// VolumeContainer is the volume container.
type VolumeContainer struct {
	autorest.Response          `json:"-"`
	ID                         *string `json:"id,omitempty"`
	Name                       *string `json:"name,omitempty"`
	Type                       *string `json:"type,omitempty"`
	Kind                       Kind    `json:"kind,omitempty"`
	*VolumeContainerProperties `json:"properties,omitempty"`
}

// VolumeContainerFailoverMetadata is the metadata of the volume container, that is being considered as part of a
// failover set.
type VolumeContainerFailoverMetadata struct {
	VolumeContainerID *string                   `json:"volumeContainerId,omitempty"`
	Volumes           *[]VolumeFailoverMetadata `json:"volumes,omitempty"`
}

// VolumeContainerList is the collection of volume container entities.
type VolumeContainerList struct {
	autorest.Response `json:"-"`
	Value             *[]VolumeContainer `json:"value,omitempty"`
}

// VolumeContainerProperties is the properties of volume container.
type VolumeContainerProperties struct {
	EncryptionKey                 *AsymmetricEncryptedSecret `json:"encryptionKey,omitempty"`
	EncryptionStatus              EncryptionStatus           `json:"encryptionStatus,omitempty"`
	VolumeCount                   *int32                     `json:"volumeCount,omitempty"`
	StorageAccountCredentialID    *string                    `json:"storageAccountCredentialId,omitempty"`
	OwnerShipStatus               OwnerShipStatus            `json:"ownerShipStatus,omitempty"`
	BandWidthRateInMbps           *int32                     `json:"bandWidthRateInMbps,omitempty"`
	BandwidthSettingID            *string                    `json:"bandwidthSettingId,omitempty"`
	TotalCloudStorageUsageInBytes *int64                     `json:"totalCloudStorageUsageInBytes,omitempty"`
}

// VolumeFailoverMetadata is the metadata of a volume that has valid cloud snapshot.
type VolumeFailoverMetadata struct {
	VolumeID          *string    `json:"volumeId,omitempty"`
	VolumeType        VolumeType `json:"volumeType,omitempty"`
	SizeInBytes       *int64     `json:"sizeInBytes,omitempty"`
	BackupCreatedDate *date.Time `json:"backupCreatedDate,omitempty"`
	BackupElementID   *string    `json:"backupElementId,omitempty"`
	BackupID          *string    `json:"backupId,omitempty"`
	BackupPolicyID    *string    `json:"backupPolicyId,omitempty"`
}

// VolumeList is the collection of volumes.
type VolumeList struct {
	autorest.Response `json:"-"`
	Value             *[]Volume `json:"value,omitempty"`
}

// VolumeProperties is the properties of volume.
type VolumeProperties struct {
	SizeInBytes            *int64           `json:"sizeInBytes,omitempty"`
	VolumeType             VolumeType       `json:"volumeType,omitempty"`
	VolumeContainerID      *string          `json:"volumeContainerId,omitempty"`
	AccessControlRecordIds *[]string        `json:"accessControlRecordIds,omitempty"`
	VolumeStatus           VolumeStatus     `json:"volumeStatus,omitempty"`
	OperationStatus        OperationStatus  `json:"operationStatus,omitempty"`
	BackupStatus           BackupStatus     `json:"backupStatus,omitempty"`
	MonitoringStatus       MonitoringStatus `json:"monitoringStatus,omitempty"`
	BackupPolicyIds        *[]string        `json:"backupPolicyIds,omitempty"`
}

// WebproxySettings is the web proxy settings on the device.
type WebproxySettings struct {
	ConnectionURI  *string            `json:"connectionUri,omitempty"`
	Authentication AuthenticationType `json:"authentication,omitempty"`
	Username       *string            `json:"username,omitempty"`
}
