// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
// Code generated by Microsoft (R) AutoRest Code Generator.

package com.azure.resourcemanager.recoveryservicessiterecovery.models;

import com.azure.core.annotation.Fluent;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Map;

/** InMageAzureV2 provider specific settings. */
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "instanceType")
@JsonTypeName("InMageAzureV2")
@Fluent
public final class InMageAzureV2ReplicationDetails extends ReplicationProviderSpecificSettings {
    /*
     * The infrastructure VM Id.
     */
    @JsonProperty(value = "infrastructureVmId")
    private String infrastructureVmId;

    /*
     * The vCenter infrastructure Id.
     */
    @JsonProperty(value = "vCenterInfrastructureId")
    private String vCenterInfrastructureId;

    /*
     * The protection stage.
     */
    @JsonProperty(value = "protectionStage")
    private String protectionStage;

    /*
     * The virtual machine Id.
     */
    @JsonProperty(value = "vmId")
    private String vmId;

    /*
     * The protection state for the vm.
     */
    @JsonProperty(value = "vmProtectionState")
    private String vmProtectionState;

    /*
     * The protection state description for the vm.
     */
    @JsonProperty(value = "vmProtectionStateDescription")
    private String vmProtectionStateDescription;

    /*
     * The resync progress percentage.
     */
    @JsonProperty(value = "resyncProgressPercentage")
    private Integer resyncProgressPercentage;

    /*
     * The RPO in seconds.
     */
    @JsonProperty(value = "rpoInSeconds")
    private Long rpoInSeconds;

    /*
     * The compressed data change rate in MB.
     */
    @JsonProperty(value = "compressedDataRateInMB")
    private Double compressedDataRateInMB;

    /*
     * The uncompressed data change rate in MB.
     */
    @JsonProperty(value = "uncompressedDataRateInMB")
    private Double uncompressedDataRateInMB;

    /*
     * The source IP address.
     */
    @JsonProperty(value = "ipAddress")
    private String ipAddress;

    /*
     * The agent version.
     */
    @JsonProperty(value = "agentVersion")
    private String agentVersion;

    /*
     * Agent expiry date.
     */
    @JsonProperty(value = "agentExpiryDate")
    private OffsetDateTime agentExpiryDate;

    /*
     * A value indicating whether installed agent needs to be updated.
     */
    @JsonProperty(value = "isAgentUpdateRequired")
    private String isAgentUpdateRequired;

    /*
     * A value indicating whether the source server requires a restart after update.
     */
    @JsonProperty(value = "isRebootAfterUpdateRequired")
    private String isRebootAfterUpdateRequired;

    /*
     * The last heartbeat received from the source server.
     */
    @JsonProperty(value = "lastHeartbeat")
    private OffsetDateTime lastHeartbeat;

    /*
     * The process server Id.
     */
    @JsonProperty(value = "processServerId")
    private String processServerId;

    /*
     * The process server name.
     */
    @JsonProperty(value = "processServerName")
    private String processServerName;

    /*
     * The multi vm group Id.
     */
    @JsonProperty(value = "multiVmGroupId")
    private String multiVmGroupId;

    /*
     * The multi vm group name.
     */
    @JsonProperty(value = "multiVmGroupName")
    private String multiVmGroupName;

    /*
     * A value indicating whether multi vm sync is enabled or disabled.
     */
    @JsonProperty(value = "multiVmSyncStatus")
    private String multiVmSyncStatus;

    /*
     * The list of protected disks.
     */
    @JsonProperty(value = "protectedDisks")
    private List<InMageAzureV2ProtectedDiskDetails> protectedDisks;

    /*
     * A value indicating whether any disk is resized for this VM.
     */
    @JsonProperty(value = "diskResized")
    private String diskResized;

    /*
     * The master target Id.
     */
    @JsonProperty(value = "masterTargetId")
    private String masterTargetId;

    /*
     * The CPU count of the VM on the primary side.
     */
    @JsonProperty(value = "sourceVmCpuCount")
    private Integer sourceVmCpuCount;

    /*
     * The RAM size of the VM on the primary side.
     */
    @JsonProperty(value = "sourceVmRamSizeInMB")
    private Integer sourceVmRamSizeInMB;

    /*
     * The type of the OS on the VM.
     */
    @JsonProperty(value = "osType")
    private String osType;

    /*
     * The OS disk VHD name.
     */
    @JsonProperty(value = "vhdName")
    private String vhdName;

    /*
     * The id of the disk containing the OS.
     */
    @JsonProperty(value = "osDiskId")
    private String osDiskId;

    /*
     * Azure VM Disk details.
     */
    @JsonProperty(value = "azureVMDiskDetails")
    private List<AzureVmDiskDetails> azureVMDiskDetails;

    /*
     * Recovery Azure given name.
     */
    @JsonProperty(value = "recoveryAzureVMName")
    private String recoveryAzureVMName;

    /*
     * The Recovery Azure VM size.
     */
    @JsonProperty(value = "recoveryAzureVMSize")
    private String recoveryAzureVMSize;

    /*
     * The recovery Azure storage account.
     */
    @JsonProperty(value = "recoveryAzureStorageAccount")
    private String recoveryAzureStorageAccount;

    /*
     * The ARM id of the log storage account used for replication. This will be set to null if no log storage account
     * was provided during enable protection.
     */
    @JsonProperty(value = "recoveryAzureLogStorageAccountId")
    private String recoveryAzureLogStorageAccountId;

    /*
     * The PE Network details.
     */
    @JsonProperty(value = "vmNics")
    private List<VMNicDetails> vmNics;

    /*
     * The selected recovery azure network Id.
     */
    @JsonProperty(value = "selectedRecoveryAzureNetworkId")
    private String selectedRecoveryAzureNetworkId;

    /*
     * The test failover virtual network.
     */
    @JsonProperty(value = "selectedTfoAzureNetworkId")
    private String selectedTfoAzureNetworkId;

    /*
     * The selected source nic Id which will be used as the primary nic during failover.
     */
    @JsonProperty(value = "selectedSourceNicId")
    private String selectedSourceNicId;

    /*
     * A value indicating the discovery type of the machine. Value can be vCenter or physical.
     */
    @JsonProperty(value = "discoveryType")
    private String discoveryType;

    /*
     * The selected option to enable RDP\SSH on target vm after failover. String value of
     * SrsDataContract.EnableRDPOnTargetOption enum.
     */
    @JsonProperty(value = "enableRdpOnTargetOption")
    private String enableRdpOnTargetOption;

    /*
     * The datastores of the on-premise machine. Value can be list of strings that contain datastore names.
     */
    @JsonProperty(value = "datastores")
    private List<String> datastores;

    /*
     * The ARM Id of the target Azure VM. This value will be null until the VM is failed over. Only after failure it
     * will be populated with the ARM Id of the Azure VM.
     */
    @JsonProperty(value = "targetVmId")
    private String targetVmId;

    /*
     * The target resource group Id.
     */
    @JsonProperty(value = "recoveryAzureResourceGroupId")
    private String recoveryAzureResourceGroupId;

    /*
     * The recovery availability set Id.
     */
    @JsonProperty(value = "recoveryAvailabilitySetId")
    private String recoveryAvailabilitySetId;

    /*
     * The target availability zone.
     */
    @JsonProperty(value = "targetAvailabilityZone")
    private String targetAvailabilityZone;

    /*
     * The target proximity placement group Id.
     */
    @JsonProperty(value = "targetProximityPlacementGroupId")
    private String targetProximityPlacementGroupId;

    /*
     * A value indicating whether managed disks should be used during failover.
     */
    @JsonProperty(value = "useManagedDisks")
    private String useManagedDisks;

    /*
     * License Type of the VM to be used.
     */
    @JsonProperty(value = "licenseType")
    private String licenseType;

    /*
     * The SQL Server license type.
     */
    @JsonProperty(value = "sqlServerLicenseType")
    private String sqlServerLicenseType;

    /*
     * The validation errors of the on-premise machine Value can be list of validation errors.
     */
    @JsonProperty(value = "validationErrors")
    private List<HealthError> validationErrors;

    /*
     * The last RPO calculated time.
     */
    @JsonProperty(value = "lastRpoCalculatedTime")
    private OffsetDateTime lastRpoCalculatedTime;

    /*
     * The last update time received from on-prem components.
     */
    @JsonProperty(value = "lastUpdateReceivedTime")
    private OffsetDateTime lastUpdateReceivedTime;

    /*
     * The replica id of the protected item.
     */
    @JsonProperty(value = "replicaId")
    private String replicaId;

    /*
     * The OS Version of the protected item.
     */
    @JsonProperty(value = "osVersion")
    private String osVersion;

    /*
     * The list of protected managed disks.
     */
    @JsonProperty(value = "protectedManagedDisks")
    private List<InMageAzureV2ManagedDiskDetails> protectedManagedDisks;

    /*
     * The last recovery point received time.
     */
    @JsonProperty(value = "lastRecoveryPointReceived", access = JsonProperty.Access.WRITE_ONLY)
    private OffsetDateTime lastRecoveryPointReceived;

    /*
     * The firmware type of this protected item.
     */
    @JsonProperty(value = "firmwareType")
    private String firmwareType;

    /*
     * The target generation for this protected item.
     */
    @JsonProperty(value = "azureVmGeneration")
    private String azureVmGeneration;

    /*
     * A value indicating whether additional IR stats are available or not.
     */
    @JsonProperty(value = "isAdditionalStatsAvailable")
    private Boolean isAdditionalStatsAvailable;

    /*
     * The total transferred data in bytes.
     */
    @JsonProperty(value = "totalDataTransferred")
    private Long totalDataTransferred;

    /*
     * The progress health.
     */
    @JsonProperty(value = "totalProgressHealth")
    private String totalProgressHealth;

    /*
     * The target VM tags.
     */
    @JsonProperty(value = "targetVmTags")
    @JsonInclude(value = JsonInclude.Include.NON_NULL, content = JsonInclude.Include.ALWAYS)
    private Map<String, String> targetVmTags;

    /*
     * The tags for the seed managed disks.
     */
    @JsonProperty(value = "seedManagedDiskTags")
    @JsonInclude(value = JsonInclude.Include.NON_NULL, content = JsonInclude.Include.ALWAYS)
    private Map<String, String> seedManagedDiskTags;

    /*
     * The tags for the target managed disks.
     */
    @JsonProperty(value = "targetManagedDiskTags")
    @JsonInclude(value = JsonInclude.Include.NON_NULL, content = JsonInclude.Include.ALWAYS)
    private Map<String, String> targetManagedDiskTags;

    /*
     * The tags for the target NICs.
     */
    @JsonProperty(value = "targetNicTags")
    @JsonInclude(value = JsonInclude.Include.NON_NULL, content = JsonInclude.Include.ALWAYS)
    private Map<String, String> targetNicTags;

    /*
     * The switch provider blocking error information.
     */
    @JsonProperty(value = "switchProviderBlockingErrorDetails")
    private List<InMageAzureV2SwitchProviderBlockingErrorDetails> switchProviderBlockingErrorDetails;

    /*
     * The switch provider blocking error information.
     */
    @JsonProperty(value = "switchProviderDetails")
    private InMageAzureV2SwitchProviderDetails switchProviderDetails;

    /** Creates an instance of InMageAzureV2ReplicationDetails class. */
    public InMageAzureV2ReplicationDetails() {
    }

    /**
     * Get the infrastructureVmId property: The infrastructure VM Id.
     *
     * @return the infrastructureVmId value.
     */
    public String infrastructureVmId() {
        return this.infrastructureVmId;
    }

    /**
     * Set the infrastructureVmId property: The infrastructure VM Id.
     *
     * @param infrastructureVmId the infrastructureVmId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withInfrastructureVmId(String infrastructureVmId) {
        this.infrastructureVmId = infrastructureVmId;
        return this;
    }

    /**
     * Get the vCenterInfrastructureId property: The vCenter infrastructure Id.
     *
     * @return the vCenterInfrastructureId value.
     */
    public String vCenterInfrastructureId() {
        return this.vCenterInfrastructureId;
    }

    /**
     * Set the vCenterInfrastructureId property: The vCenter infrastructure Id.
     *
     * @param vCenterInfrastructureId the vCenterInfrastructureId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withVCenterInfrastructureId(String vCenterInfrastructureId) {
        this.vCenterInfrastructureId = vCenterInfrastructureId;
        return this;
    }

    /**
     * Get the protectionStage property: The protection stage.
     *
     * @return the protectionStage value.
     */
    public String protectionStage() {
        return this.protectionStage;
    }

    /**
     * Set the protectionStage property: The protection stage.
     *
     * @param protectionStage the protectionStage value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withProtectionStage(String protectionStage) {
        this.protectionStage = protectionStage;
        return this;
    }

    /**
     * Get the vmId property: The virtual machine Id.
     *
     * @return the vmId value.
     */
    public String vmId() {
        return this.vmId;
    }

    /**
     * Set the vmId property: The virtual machine Id.
     *
     * @param vmId the vmId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withVmId(String vmId) {
        this.vmId = vmId;
        return this;
    }

    /**
     * Get the vmProtectionState property: The protection state for the vm.
     *
     * @return the vmProtectionState value.
     */
    public String vmProtectionState() {
        return this.vmProtectionState;
    }

    /**
     * Set the vmProtectionState property: The protection state for the vm.
     *
     * @param vmProtectionState the vmProtectionState value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withVmProtectionState(String vmProtectionState) {
        this.vmProtectionState = vmProtectionState;
        return this;
    }

    /**
     * Get the vmProtectionStateDescription property: The protection state description for the vm.
     *
     * @return the vmProtectionStateDescription value.
     */
    public String vmProtectionStateDescription() {
        return this.vmProtectionStateDescription;
    }

    /**
     * Set the vmProtectionStateDescription property: The protection state description for the vm.
     *
     * @param vmProtectionStateDescription the vmProtectionStateDescription value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withVmProtectionStateDescription(String vmProtectionStateDescription) {
        this.vmProtectionStateDescription = vmProtectionStateDescription;
        return this;
    }

    /**
     * Get the resyncProgressPercentage property: The resync progress percentage.
     *
     * @return the resyncProgressPercentage value.
     */
    public Integer resyncProgressPercentage() {
        return this.resyncProgressPercentage;
    }

    /**
     * Set the resyncProgressPercentage property: The resync progress percentage.
     *
     * @param resyncProgressPercentage the resyncProgressPercentage value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withResyncProgressPercentage(Integer resyncProgressPercentage) {
        this.resyncProgressPercentage = resyncProgressPercentage;
        return this;
    }

    /**
     * Get the rpoInSeconds property: The RPO in seconds.
     *
     * @return the rpoInSeconds value.
     */
    public Long rpoInSeconds() {
        return this.rpoInSeconds;
    }

    /**
     * Set the rpoInSeconds property: The RPO in seconds.
     *
     * @param rpoInSeconds the rpoInSeconds value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withRpoInSeconds(Long rpoInSeconds) {
        this.rpoInSeconds = rpoInSeconds;
        return this;
    }

    /**
     * Get the compressedDataRateInMB property: The compressed data change rate in MB.
     *
     * @return the compressedDataRateInMB value.
     */
    public Double compressedDataRateInMB() {
        return this.compressedDataRateInMB;
    }

    /**
     * Set the compressedDataRateInMB property: The compressed data change rate in MB.
     *
     * @param compressedDataRateInMB the compressedDataRateInMB value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withCompressedDataRateInMB(Double compressedDataRateInMB) {
        this.compressedDataRateInMB = compressedDataRateInMB;
        return this;
    }

    /**
     * Get the uncompressedDataRateInMB property: The uncompressed data change rate in MB.
     *
     * @return the uncompressedDataRateInMB value.
     */
    public Double uncompressedDataRateInMB() {
        return this.uncompressedDataRateInMB;
    }

    /**
     * Set the uncompressedDataRateInMB property: The uncompressed data change rate in MB.
     *
     * @param uncompressedDataRateInMB the uncompressedDataRateInMB value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withUncompressedDataRateInMB(Double uncompressedDataRateInMB) {
        this.uncompressedDataRateInMB = uncompressedDataRateInMB;
        return this;
    }

    /**
     * Get the ipAddress property: The source IP address.
     *
     * @return the ipAddress value.
     */
    public String ipAddress() {
        return this.ipAddress;
    }

    /**
     * Set the ipAddress property: The source IP address.
     *
     * @param ipAddress the ipAddress value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withIpAddress(String ipAddress) {
        this.ipAddress = ipAddress;
        return this;
    }

    /**
     * Get the agentVersion property: The agent version.
     *
     * @return the agentVersion value.
     */
    public String agentVersion() {
        return this.agentVersion;
    }

    /**
     * Set the agentVersion property: The agent version.
     *
     * @param agentVersion the agentVersion value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withAgentVersion(String agentVersion) {
        this.agentVersion = agentVersion;
        return this;
    }

    /**
     * Get the agentExpiryDate property: Agent expiry date.
     *
     * @return the agentExpiryDate value.
     */
    public OffsetDateTime agentExpiryDate() {
        return this.agentExpiryDate;
    }

    /**
     * Set the agentExpiryDate property: Agent expiry date.
     *
     * @param agentExpiryDate the agentExpiryDate value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withAgentExpiryDate(OffsetDateTime agentExpiryDate) {
        this.agentExpiryDate = agentExpiryDate;
        return this;
    }

    /**
     * Get the isAgentUpdateRequired property: A value indicating whether installed agent needs to be updated.
     *
     * @return the isAgentUpdateRequired value.
     */
    public String isAgentUpdateRequired() {
        return this.isAgentUpdateRequired;
    }

    /**
     * Set the isAgentUpdateRequired property: A value indicating whether installed agent needs to be updated.
     *
     * @param isAgentUpdateRequired the isAgentUpdateRequired value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withIsAgentUpdateRequired(String isAgentUpdateRequired) {
        this.isAgentUpdateRequired = isAgentUpdateRequired;
        return this;
    }

    /**
     * Get the isRebootAfterUpdateRequired property: A value indicating whether the source server requires a restart
     * after update.
     *
     * @return the isRebootAfterUpdateRequired value.
     */
    public String isRebootAfterUpdateRequired() {
        return this.isRebootAfterUpdateRequired;
    }

    /**
     * Set the isRebootAfterUpdateRequired property: A value indicating whether the source server requires a restart
     * after update.
     *
     * @param isRebootAfterUpdateRequired the isRebootAfterUpdateRequired value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withIsRebootAfterUpdateRequired(String isRebootAfterUpdateRequired) {
        this.isRebootAfterUpdateRequired = isRebootAfterUpdateRequired;
        return this;
    }

    /**
     * Get the lastHeartbeat property: The last heartbeat received from the source server.
     *
     * @return the lastHeartbeat value.
     */
    public OffsetDateTime lastHeartbeat() {
        return this.lastHeartbeat;
    }

    /**
     * Set the lastHeartbeat property: The last heartbeat received from the source server.
     *
     * @param lastHeartbeat the lastHeartbeat value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withLastHeartbeat(OffsetDateTime lastHeartbeat) {
        this.lastHeartbeat = lastHeartbeat;
        return this;
    }

    /**
     * Get the processServerId property: The process server Id.
     *
     * @return the processServerId value.
     */
    public String processServerId() {
        return this.processServerId;
    }

    /**
     * Set the processServerId property: The process server Id.
     *
     * @param processServerId the processServerId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withProcessServerId(String processServerId) {
        this.processServerId = processServerId;
        return this;
    }

    /**
     * Get the processServerName property: The process server name.
     *
     * @return the processServerName value.
     */
    public String processServerName() {
        return this.processServerName;
    }

    /**
     * Set the processServerName property: The process server name.
     *
     * @param processServerName the processServerName value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withProcessServerName(String processServerName) {
        this.processServerName = processServerName;
        return this;
    }

    /**
     * Get the multiVmGroupId property: The multi vm group Id.
     *
     * @return the multiVmGroupId value.
     */
    public String multiVmGroupId() {
        return this.multiVmGroupId;
    }

    /**
     * Set the multiVmGroupId property: The multi vm group Id.
     *
     * @param multiVmGroupId the multiVmGroupId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withMultiVmGroupId(String multiVmGroupId) {
        this.multiVmGroupId = multiVmGroupId;
        return this;
    }

    /**
     * Get the multiVmGroupName property: The multi vm group name.
     *
     * @return the multiVmGroupName value.
     */
    public String multiVmGroupName() {
        return this.multiVmGroupName;
    }

    /**
     * Set the multiVmGroupName property: The multi vm group name.
     *
     * @param multiVmGroupName the multiVmGroupName value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withMultiVmGroupName(String multiVmGroupName) {
        this.multiVmGroupName = multiVmGroupName;
        return this;
    }

    /**
     * Get the multiVmSyncStatus property: A value indicating whether multi vm sync is enabled or disabled.
     *
     * @return the multiVmSyncStatus value.
     */
    public String multiVmSyncStatus() {
        return this.multiVmSyncStatus;
    }

    /**
     * Set the multiVmSyncStatus property: A value indicating whether multi vm sync is enabled or disabled.
     *
     * @param multiVmSyncStatus the multiVmSyncStatus value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withMultiVmSyncStatus(String multiVmSyncStatus) {
        this.multiVmSyncStatus = multiVmSyncStatus;
        return this;
    }

    /**
     * Get the protectedDisks property: The list of protected disks.
     *
     * @return the protectedDisks value.
     */
    public List<InMageAzureV2ProtectedDiskDetails> protectedDisks() {
        return this.protectedDisks;
    }

    /**
     * Set the protectedDisks property: The list of protected disks.
     *
     * @param protectedDisks the protectedDisks value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withProtectedDisks(List<InMageAzureV2ProtectedDiskDetails> protectedDisks) {
        this.protectedDisks = protectedDisks;
        return this;
    }

    /**
     * Get the diskResized property: A value indicating whether any disk is resized for this VM.
     *
     * @return the diskResized value.
     */
    public String diskResized() {
        return this.diskResized;
    }

    /**
     * Set the diskResized property: A value indicating whether any disk is resized for this VM.
     *
     * @param diskResized the diskResized value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withDiskResized(String diskResized) {
        this.diskResized = diskResized;
        return this;
    }

    /**
     * Get the masterTargetId property: The master target Id.
     *
     * @return the masterTargetId value.
     */
    public String masterTargetId() {
        return this.masterTargetId;
    }

    /**
     * Set the masterTargetId property: The master target Id.
     *
     * @param masterTargetId the masterTargetId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withMasterTargetId(String masterTargetId) {
        this.masterTargetId = masterTargetId;
        return this;
    }

    /**
     * Get the sourceVmCpuCount property: The CPU count of the VM on the primary side.
     *
     * @return the sourceVmCpuCount value.
     */
    public Integer sourceVmCpuCount() {
        return this.sourceVmCpuCount;
    }

    /**
     * Set the sourceVmCpuCount property: The CPU count of the VM on the primary side.
     *
     * @param sourceVmCpuCount the sourceVmCpuCount value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withSourceVmCpuCount(Integer sourceVmCpuCount) {
        this.sourceVmCpuCount = sourceVmCpuCount;
        return this;
    }

    /**
     * Get the sourceVmRamSizeInMB property: The RAM size of the VM on the primary side.
     *
     * @return the sourceVmRamSizeInMB value.
     */
    public Integer sourceVmRamSizeInMB() {
        return this.sourceVmRamSizeInMB;
    }

    /**
     * Set the sourceVmRamSizeInMB property: The RAM size of the VM on the primary side.
     *
     * @param sourceVmRamSizeInMB the sourceVmRamSizeInMB value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withSourceVmRamSizeInMB(Integer sourceVmRamSizeInMB) {
        this.sourceVmRamSizeInMB = sourceVmRamSizeInMB;
        return this;
    }

    /**
     * Get the osType property: The type of the OS on the VM.
     *
     * @return the osType value.
     */
    public String osType() {
        return this.osType;
    }

    /**
     * Set the osType property: The type of the OS on the VM.
     *
     * @param osType the osType value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withOsType(String osType) {
        this.osType = osType;
        return this;
    }

    /**
     * Get the vhdName property: The OS disk VHD name.
     *
     * @return the vhdName value.
     */
    public String vhdName() {
        return this.vhdName;
    }

    /**
     * Set the vhdName property: The OS disk VHD name.
     *
     * @param vhdName the vhdName value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withVhdName(String vhdName) {
        this.vhdName = vhdName;
        return this;
    }

    /**
     * Get the osDiskId property: The id of the disk containing the OS.
     *
     * @return the osDiskId value.
     */
    public String osDiskId() {
        return this.osDiskId;
    }

    /**
     * Set the osDiskId property: The id of the disk containing the OS.
     *
     * @param osDiskId the osDiskId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withOsDiskId(String osDiskId) {
        this.osDiskId = osDiskId;
        return this;
    }

    /**
     * Get the azureVMDiskDetails property: Azure VM Disk details.
     *
     * @return the azureVMDiskDetails value.
     */
    public List<AzureVmDiskDetails> azureVMDiskDetails() {
        return this.azureVMDiskDetails;
    }

    /**
     * Set the azureVMDiskDetails property: Azure VM Disk details.
     *
     * @param azureVMDiskDetails the azureVMDiskDetails value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withAzureVMDiskDetails(List<AzureVmDiskDetails> azureVMDiskDetails) {
        this.azureVMDiskDetails = azureVMDiskDetails;
        return this;
    }

    /**
     * Get the recoveryAzureVMName property: Recovery Azure given name.
     *
     * @return the recoveryAzureVMName value.
     */
    public String recoveryAzureVMName() {
        return this.recoveryAzureVMName;
    }

    /**
     * Set the recoveryAzureVMName property: Recovery Azure given name.
     *
     * @param recoveryAzureVMName the recoveryAzureVMName value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withRecoveryAzureVMName(String recoveryAzureVMName) {
        this.recoveryAzureVMName = recoveryAzureVMName;
        return this;
    }

    /**
     * Get the recoveryAzureVMSize property: The Recovery Azure VM size.
     *
     * @return the recoveryAzureVMSize value.
     */
    public String recoveryAzureVMSize() {
        return this.recoveryAzureVMSize;
    }

    /**
     * Set the recoveryAzureVMSize property: The Recovery Azure VM size.
     *
     * @param recoveryAzureVMSize the recoveryAzureVMSize value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withRecoveryAzureVMSize(String recoveryAzureVMSize) {
        this.recoveryAzureVMSize = recoveryAzureVMSize;
        return this;
    }

    /**
     * Get the recoveryAzureStorageAccount property: The recovery Azure storage account.
     *
     * @return the recoveryAzureStorageAccount value.
     */
    public String recoveryAzureStorageAccount() {
        return this.recoveryAzureStorageAccount;
    }

    /**
     * Set the recoveryAzureStorageAccount property: The recovery Azure storage account.
     *
     * @param recoveryAzureStorageAccount the recoveryAzureStorageAccount value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withRecoveryAzureStorageAccount(String recoveryAzureStorageAccount) {
        this.recoveryAzureStorageAccount = recoveryAzureStorageAccount;
        return this;
    }

    /**
     * Get the recoveryAzureLogStorageAccountId property: The ARM id of the log storage account used for replication.
     * This will be set to null if no log storage account was provided during enable protection.
     *
     * @return the recoveryAzureLogStorageAccountId value.
     */
    public String recoveryAzureLogStorageAccountId() {
        return this.recoveryAzureLogStorageAccountId;
    }

    /**
     * Set the recoveryAzureLogStorageAccountId property: The ARM id of the log storage account used for replication.
     * This will be set to null if no log storage account was provided during enable protection.
     *
     * @param recoveryAzureLogStorageAccountId the recoveryAzureLogStorageAccountId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withRecoveryAzureLogStorageAccountId(
        String recoveryAzureLogStorageAccountId) {
        this.recoveryAzureLogStorageAccountId = recoveryAzureLogStorageAccountId;
        return this;
    }

    /**
     * Get the vmNics property: The PE Network details.
     *
     * @return the vmNics value.
     */
    public List<VMNicDetails> vmNics() {
        return this.vmNics;
    }

    /**
     * Set the vmNics property: The PE Network details.
     *
     * @param vmNics the vmNics value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withVmNics(List<VMNicDetails> vmNics) {
        this.vmNics = vmNics;
        return this;
    }

    /**
     * Get the selectedRecoveryAzureNetworkId property: The selected recovery azure network Id.
     *
     * @return the selectedRecoveryAzureNetworkId value.
     */
    public String selectedRecoveryAzureNetworkId() {
        return this.selectedRecoveryAzureNetworkId;
    }

    /**
     * Set the selectedRecoveryAzureNetworkId property: The selected recovery azure network Id.
     *
     * @param selectedRecoveryAzureNetworkId the selectedRecoveryAzureNetworkId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withSelectedRecoveryAzureNetworkId(String selectedRecoveryAzureNetworkId) {
        this.selectedRecoveryAzureNetworkId = selectedRecoveryAzureNetworkId;
        return this;
    }

    /**
     * Get the selectedTfoAzureNetworkId property: The test failover virtual network.
     *
     * @return the selectedTfoAzureNetworkId value.
     */
    public String selectedTfoAzureNetworkId() {
        return this.selectedTfoAzureNetworkId;
    }

    /**
     * Set the selectedTfoAzureNetworkId property: The test failover virtual network.
     *
     * @param selectedTfoAzureNetworkId the selectedTfoAzureNetworkId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withSelectedTfoAzureNetworkId(String selectedTfoAzureNetworkId) {
        this.selectedTfoAzureNetworkId = selectedTfoAzureNetworkId;
        return this;
    }

    /**
     * Get the selectedSourceNicId property: The selected source nic Id which will be used as the primary nic during
     * failover.
     *
     * @return the selectedSourceNicId value.
     */
    public String selectedSourceNicId() {
        return this.selectedSourceNicId;
    }

    /**
     * Set the selectedSourceNicId property: The selected source nic Id which will be used as the primary nic during
     * failover.
     *
     * @param selectedSourceNicId the selectedSourceNicId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withSelectedSourceNicId(String selectedSourceNicId) {
        this.selectedSourceNicId = selectedSourceNicId;
        return this;
    }

    /**
     * Get the discoveryType property: A value indicating the discovery type of the machine. Value can be vCenter or
     * physical.
     *
     * @return the discoveryType value.
     */
    public String discoveryType() {
        return this.discoveryType;
    }

    /**
     * Set the discoveryType property: A value indicating the discovery type of the machine. Value can be vCenter or
     * physical.
     *
     * @param discoveryType the discoveryType value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withDiscoveryType(String discoveryType) {
        this.discoveryType = discoveryType;
        return this;
    }

    /**
     * Get the enableRdpOnTargetOption property: The selected option to enable RDP\SSH on target vm after failover.
     * String value of SrsDataContract.EnableRDPOnTargetOption enum.
     *
     * @return the enableRdpOnTargetOption value.
     */
    public String enableRdpOnTargetOption() {
        return this.enableRdpOnTargetOption;
    }

    /**
     * Set the enableRdpOnTargetOption property: The selected option to enable RDP\SSH on target vm after failover.
     * String value of SrsDataContract.EnableRDPOnTargetOption enum.
     *
     * @param enableRdpOnTargetOption the enableRdpOnTargetOption value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withEnableRdpOnTargetOption(String enableRdpOnTargetOption) {
        this.enableRdpOnTargetOption = enableRdpOnTargetOption;
        return this;
    }

    /**
     * Get the datastores property: The datastores of the on-premise machine. Value can be list of strings that contain
     * datastore names.
     *
     * @return the datastores value.
     */
    public List<String> datastores() {
        return this.datastores;
    }

    /**
     * Set the datastores property: The datastores of the on-premise machine. Value can be list of strings that contain
     * datastore names.
     *
     * @param datastores the datastores value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withDatastores(List<String> datastores) {
        this.datastores = datastores;
        return this;
    }

    /**
     * Get the targetVmId property: The ARM Id of the target Azure VM. This value will be null until the VM is failed
     * over. Only after failure it will be populated with the ARM Id of the Azure VM.
     *
     * @return the targetVmId value.
     */
    public String targetVmId() {
        return this.targetVmId;
    }

    /**
     * Set the targetVmId property: The ARM Id of the target Azure VM. This value will be null until the VM is failed
     * over. Only after failure it will be populated with the ARM Id of the Azure VM.
     *
     * @param targetVmId the targetVmId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withTargetVmId(String targetVmId) {
        this.targetVmId = targetVmId;
        return this;
    }

    /**
     * Get the recoveryAzureResourceGroupId property: The target resource group Id.
     *
     * @return the recoveryAzureResourceGroupId value.
     */
    public String recoveryAzureResourceGroupId() {
        return this.recoveryAzureResourceGroupId;
    }

    /**
     * Set the recoveryAzureResourceGroupId property: The target resource group Id.
     *
     * @param recoveryAzureResourceGroupId the recoveryAzureResourceGroupId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withRecoveryAzureResourceGroupId(String recoveryAzureResourceGroupId) {
        this.recoveryAzureResourceGroupId = recoveryAzureResourceGroupId;
        return this;
    }

    /**
     * Get the recoveryAvailabilitySetId property: The recovery availability set Id.
     *
     * @return the recoveryAvailabilitySetId value.
     */
    public String recoveryAvailabilitySetId() {
        return this.recoveryAvailabilitySetId;
    }

    /**
     * Set the recoveryAvailabilitySetId property: The recovery availability set Id.
     *
     * @param recoveryAvailabilitySetId the recoveryAvailabilitySetId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withRecoveryAvailabilitySetId(String recoveryAvailabilitySetId) {
        this.recoveryAvailabilitySetId = recoveryAvailabilitySetId;
        return this;
    }

    /**
     * Get the targetAvailabilityZone property: The target availability zone.
     *
     * @return the targetAvailabilityZone value.
     */
    public String targetAvailabilityZone() {
        return this.targetAvailabilityZone;
    }

    /**
     * Set the targetAvailabilityZone property: The target availability zone.
     *
     * @param targetAvailabilityZone the targetAvailabilityZone value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withTargetAvailabilityZone(String targetAvailabilityZone) {
        this.targetAvailabilityZone = targetAvailabilityZone;
        return this;
    }

    /**
     * Get the targetProximityPlacementGroupId property: The target proximity placement group Id.
     *
     * @return the targetProximityPlacementGroupId value.
     */
    public String targetProximityPlacementGroupId() {
        return this.targetProximityPlacementGroupId;
    }

    /**
     * Set the targetProximityPlacementGroupId property: The target proximity placement group Id.
     *
     * @param targetProximityPlacementGroupId the targetProximityPlacementGroupId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withTargetProximityPlacementGroupId(String targetProximityPlacementGroupId) {
        this.targetProximityPlacementGroupId = targetProximityPlacementGroupId;
        return this;
    }

    /**
     * Get the useManagedDisks property: A value indicating whether managed disks should be used during failover.
     *
     * @return the useManagedDisks value.
     */
    public String useManagedDisks() {
        return this.useManagedDisks;
    }

    /**
     * Set the useManagedDisks property: A value indicating whether managed disks should be used during failover.
     *
     * @param useManagedDisks the useManagedDisks value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withUseManagedDisks(String useManagedDisks) {
        this.useManagedDisks = useManagedDisks;
        return this;
    }

    /**
     * Get the licenseType property: License Type of the VM to be used.
     *
     * @return the licenseType value.
     */
    public String licenseType() {
        return this.licenseType;
    }

    /**
     * Set the licenseType property: License Type of the VM to be used.
     *
     * @param licenseType the licenseType value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withLicenseType(String licenseType) {
        this.licenseType = licenseType;
        return this;
    }

    /**
     * Get the sqlServerLicenseType property: The SQL Server license type.
     *
     * @return the sqlServerLicenseType value.
     */
    public String sqlServerLicenseType() {
        return this.sqlServerLicenseType;
    }

    /**
     * Set the sqlServerLicenseType property: The SQL Server license type.
     *
     * @param sqlServerLicenseType the sqlServerLicenseType value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withSqlServerLicenseType(String sqlServerLicenseType) {
        this.sqlServerLicenseType = sqlServerLicenseType;
        return this;
    }

    /**
     * Get the validationErrors property: The validation errors of the on-premise machine Value can be list of
     * validation errors.
     *
     * @return the validationErrors value.
     */
    public List<HealthError> validationErrors() {
        return this.validationErrors;
    }

    /**
     * Set the validationErrors property: The validation errors of the on-premise machine Value can be list of
     * validation errors.
     *
     * @param validationErrors the validationErrors value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withValidationErrors(List<HealthError> validationErrors) {
        this.validationErrors = validationErrors;
        return this;
    }

    /**
     * Get the lastRpoCalculatedTime property: The last RPO calculated time.
     *
     * @return the lastRpoCalculatedTime value.
     */
    public OffsetDateTime lastRpoCalculatedTime() {
        return this.lastRpoCalculatedTime;
    }

    /**
     * Set the lastRpoCalculatedTime property: The last RPO calculated time.
     *
     * @param lastRpoCalculatedTime the lastRpoCalculatedTime value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withLastRpoCalculatedTime(OffsetDateTime lastRpoCalculatedTime) {
        this.lastRpoCalculatedTime = lastRpoCalculatedTime;
        return this;
    }

    /**
     * Get the lastUpdateReceivedTime property: The last update time received from on-prem components.
     *
     * @return the lastUpdateReceivedTime value.
     */
    public OffsetDateTime lastUpdateReceivedTime() {
        return this.lastUpdateReceivedTime;
    }

    /**
     * Set the lastUpdateReceivedTime property: The last update time received from on-prem components.
     *
     * @param lastUpdateReceivedTime the lastUpdateReceivedTime value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withLastUpdateReceivedTime(OffsetDateTime lastUpdateReceivedTime) {
        this.lastUpdateReceivedTime = lastUpdateReceivedTime;
        return this;
    }

    /**
     * Get the replicaId property: The replica id of the protected item.
     *
     * @return the replicaId value.
     */
    public String replicaId() {
        return this.replicaId;
    }

    /**
     * Set the replicaId property: The replica id of the protected item.
     *
     * @param replicaId the replicaId value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withReplicaId(String replicaId) {
        this.replicaId = replicaId;
        return this;
    }

    /**
     * Get the osVersion property: The OS Version of the protected item.
     *
     * @return the osVersion value.
     */
    public String osVersion() {
        return this.osVersion;
    }

    /**
     * Set the osVersion property: The OS Version of the protected item.
     *
     * @param osVersion the osVersion value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withOsVersion(String osVersion) {
        this.osVersion = osVersion;
        return this;
    }

    /**
     * Get the protectedManagedDisks property: The list of protected managed disks.
     *
     * @return the protectedManagedDisks value.
     */
    public List<InMageAzureV2ManagedDiskDetails> protectedManagedDisks() {
        return this.protectedManagedDisks;
    }

    /**
     * Set the protectedManagedDisks property: The list of protected managed disks.
     *
     * @param protectedManagedDisks the protectedManagedDisks value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withProtectedManagedDisks(
        List<InMageAzureV2ManagedDiskDetails> protectedManagedDisks) {
        this.protectedManagedDisks = protectedManagedDisks;
        return this;
    }

    /**
     * Get the lastRecoveryPointReceived property: The last recovery point received time.
     *
     * @return the lastRecoveryPointReceived value.
     */
    public OffsetDateTime lastRecoveryPointReceived() {
        return this.lastRecoveryPointReceived;
    }

    /**
     * Get the firmwareType property: The firmware type of this protected item.
     *
     * @return the firmwareType value.
     */
    public String firmwareType() {
        return this.firmwareType;
    }

    /**
     * Set the firmwareType property: The firmware type of this protected item.
     *
     * @param firmwareType the firmwareType value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withFirmwareType(String firmwareType) {
        this.firmwareType = firmwareType;
        return this;
    }

    /**
     * Get the azureVmGeneration property: The target generation for this protected item.
     *
     * @return the azureVmGeneration value.
     */
    public String azureVmGeneration() {
        return this.azureVmGeneration;
    }

    /**
     * Set the azureVmGeneration property: The target generation for this protected item.
     *
     * @param azureVmGeneration the azureVmGeneration value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withAzureVmGeneration(String azureVmGeneration) {
        this.azureVmGeneration = azureVmGeneration;
        return this;
    }

    /**
     * Get the isAdditionalStatsAvailable property: A value indicating whether additional IR stats are available or not.
     *
     * @return the isAdditionalStatsAvailable value.
     */
    public Boolean isAdditionalStatsAvailable() {
        return this.isAdditionalStatsAvailable;
    }

    /**
     * Set the isAdditionalStatsAvailable property: A value indicating whether additional IR stats are available or not.
     *
     * @param isAdditionalStatsAvailable the isAdditionalStatsAvailable value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withIsAdditionalStatsAvailable(Boolean isAdditionalStatsAvailable) {
        this.isAdditionalStatsAvailable = isAdditionalStatsAvailable;
        return this;
    }

    /**
     * Get the totalDataTransferred property: The total transferred data in bytes.
     *
     * @return the totalDataTransferred value.
     */
    public Long totalDataTransferred() {
        return this.totalDataTransferred;
    }

    /**
     * Set the totalDataTransferred property: The total transferred data in bytes.
     *
     * @param totalDataTransferred the totalDataTransferred value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withTotalDataTransferred(Long totalDataTransferred) {
        this.totalDataTransferred = totalDataTransferred;
        return this;
    }

    /**
     * Get the totalProgressHealth property: The progress health.
     *
     * @return the totalProgressHealth value.
     */
    public String totalProgressHealth() {
        return this.totalProgressHealth;
    }

    /**
     * Set the totalProgressHealth property: The progress health.
     *
     * @param totalProgressHealth the totalProgressHealth value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withTotalProgressHealth(String totalProgressHealth) {
        this.totalProgressHealth = totalProgressHealth;
        return this;
    }

    /**
     * Get the targetVmTags property: The target VM tags.
     *
     * @return the targetVmTags value.
     */
    public Map<String, String> targetVmTags() {
        return this.targetVmTags;
    }

    /**
     * Set the targetVmTags property: The target VM tags.
     *
     * @param targetVmTags the targetVmTags value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withTargetVmTags(Map<String, String> targetVmTags) {
        this.targetVmTags = targetVmTags;
        return this;
    }

    /**
     * Get the seedManagedDiskTags property: The tags for the seed managed disks.
     *
     * @return the seedManagedDiskTags value.
     */
    public Map<String, String> seedManagedDiskTags() {
        return this.seedManagedDiskTags;
    }

    /**
     * Set the seedManagedDiskTags property: The tags for the seed managed disks.
     *
     * @param seedManagedDiskTags the seedManagedDiskTags value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withSeedManagedDiskTags(Map<String, String> seedManagedDiskTags) {
        this.seedManagedDiskTags = seedManagedDiskTags;
        return this;
    }

    /**
     * Get the targetManagedDiskTags property: The tags for the target managed disks.
     *
     * @return the targetManagedDiskTags value.
     */
    public Map<String, String> targetManagedDiskTags() {
        return this.targetManagedDiskTags;
    }

    /**
     * Set the targetManagedDiskTags property: The tags for the target managed disks.
     *
     * @param targetManagedDiskTags the targetManagedDiskTags value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withTargetManagedDiskTags(Map<String, String> targetManagedDiskTags) {
        this.targetManagedDiskTags = targetManagedDiskTags;
        return this;
    }

    /**
     * Get the targetNicTags property: The tags for the target NICs.
     *
     * @return the targetNicTags value.
     */
    public Map<String, String> targetNicTags() {
        return this.targetNicTags;
    }

    /**
     * Set the targetNicTags property: The tags for the target NICs.
     *
     * @param targetNicTags the targetNicTags value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withTargetNicTags(Map<String, String> targetNicTags) {
        this.targetNicTags = targetNicTags;
        return this;
    }

    /**
     * Get the switchProviderBlockingErrorDetails property: The switch provider blocking error information.
     *
     * @return the switchProviderBlockingErrorDetails value.
     */
    public List<InMageAzureV2SwitchProviderBlockingErrorDetails> switchProviderBlockingErrorDetails() {
        return this.switchProviderBlockingErrorDetails;
    }

    /**
     * Set the switchProviderBlockingErrorDetails property: The switch provider blocking error information.
     *
     * @param switchProviderBlockingErrorDetails the switchProviderBlockingErrorDetails value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withSwitchProviderBlockingErrorDetails(
        List<InMageAzureV2SwitchProviderBlockingErrorDetails> switchProviderBlockingErrorDetails) {
        this.switchProviderBlockingErrorDetails = switchProviderBlockingErrorDetails;
        return this;
    }

    /**
     * Get the switchProviderDetails property: The switch provider blocking error information.
     *
     * @return the switchProviderDetails value.
     */
    public InMageAzureV2SwitchProviderDetails switchProviderDetails() {
        return this.switchProviderDetails;
    }

    /**
     * Set the switchProviderDetails property: The switch provider blocking error information.
     *
     * @param switchProviderDetails the switchProviderDetails value to set.
     * @return the InMageAzureV2ReplicationDetails object itself.
     */
    public InMageAzureV2ReplicationDetails withSwitchProviderDetails(
        InMageAzureV2SwitchProviderDetails switchProviderDetails) {
        this.switchProviderDetails = switchProviderDetails;
        return this;
    }

    /**
     * Validates the instance.
     *
     * @throws IllegalArgumentException thrown if the instance is not valid.
     */
    @Override
    public void validate() {
        super.validate();
        if (protectedDisks() != null) {
            protectedDisks().forEach(e -> e.validate());
        }
        if (azureVMDiskDetails() != null) {
            azureVMDiskDetails().forEach(e -> e.validate());
        }
        if (vmNics() != null) {
            vmNics().forEach(e -> e.validate());
        }
        if (validationErrors() != null) {
            validationErrors().forEach(e -> e.validate());
        }
        if (protectedManagedDisks() != null) {
            protectedManagedDisks().forEach(e -> e.validate());
        }
        if (switchProviderBlockingErrorDetails() != null) {
            switchProviderBlockingErrorDetails().forEach(e -> e.validate());
        }
        if (switchProviderDetails() != null) {
            switchProviderDetails().validate();
        }
    }
}
