public ASRRecoveryPlanGroup(
            RecoveryPlanGroup recoveryPlanGroup,
            IList <ReplicationProtectedItem> replicationProtectedItems = null)
        {
            if (recoveryPlanGroup != null)
            {
                this.GroupType         = recoveryPlanGroup.GroupType.ToString(); //TODO
                this.StartGroupActions = recoveryPlanGroup.StartGroupActions;
                this.EndGroupActions   = recoveryPlanGroup.EndGroupActions;

                if (replicationProtectedItems != null)
                {
                    var replicationProtectedItemList =
                        recoveryPlanGroup.ReplicationProtectedItems.Select(
                            item => item.Id.ToLower());
                    this.ReplicationProtectedItems = replicationProtectedItems.Where(
                        rpi => replicationProtectedItemList.Contains(rpi.Id.ToLower()))
                                                     .ToList();
                }
                else
                {
                    this.ReplicationProtectedItems = new List <ReplicationProtectedItem>();
                }
            }
        }
 public ASRRecoveryPlanGroup(
     string groupName,
     RecoveryPlanGroup recoveryPlanGroup,
     IList <ReplicationProtectedItem> replicationProtectedItems = null) : this(
         recoveryPlanGroup,
         replicationProtectedItems)
 {
     this.Name = groupName;
 }
        /// <summary>
        /// Creates Replication Plan Legacy.
        /// </summary>
        private void CreateRecoveryPlanLegacy()
        {
            CreateRecoveryPlanInputProperties createRecoveryPlanInputProperties = new CreateRecoveryPlanInputProperties()
            {
                FailoverDeploymentModel = failoverDeploymentModel,
                Groups           = new List <RecoveryPlanGroup>(),
                PrimaryFabricId  = this.primaryserver,
                RecoveryFabricId = this.recoveryserver
            };

            RecoveryPlanGroup recoveryPlanGroup = new RecoveryPlanGroup()
            {
                GroupType = Constants.Boot,
                ReplicationProtectedItems = new List <RecoveryPlanProtectedItem>(),
                StartGroupActions         = new List <RecoveryPlanAction>(),
                EndGroupActions           = new List <RecoveryPlanAction>()
            };

            foreach (ASRProtectionEntity pe in ProtectionEntityList)
            {
                string fabricName = Utilities.GetValueFromArmId(pe.ID, ARMResourceTypeConstants.ReplicationFabrics);
                // fetch the latest PE object
                ProtectableItemResponse protectableItemResponse =
                    RecoveryServicesClient.GetAzureSiteRecoveryProtectableItem(fabricName,
                                                                               pe.ProtectionContainerId, pe.Name);

                ReplicationProtectedItemResponse replicationProtectedItemResponse =
                    RecoveryServicesClient.GetAzureSiteRecoveryReplicationProtectedItem(fabricName,
                                                                                        pe.ProtectionContainerId, Utilities.GetValueFromArmId(protectableItemResponse.ProtectableItem.Properties.ReplicationProtectedItemId, ARMResourceTypeConstants.ReplicationProtectedItems));

                string VmId = null;

                if (replicationProtectedItemResponse.ReplicationProtectedItem.Properties.ProviderSpecificDetails.GetType() == typeof(HyperVReplicaAzureReplicationDetails))
                {
                    VmId = ((HyperVReplicaAzureReplicationDetails)replicationProtectedItemResponse.ReplicationProtectedItem.Properties.ProviderSpecificDetails).VmId;
                }
                else if (replicationProtectedItemResponse.ReplicationProtectedItem.Properties.ProviderSpecificDetails.GetType() == typeof(HyperVReplica2012ReplicationDetails))
                {
                    VmId = ((HyperVReplica2012ReplicationDetails)replicationProtectedItemResponse.ReplicationProtectedItem.Properties.ProviderSpecificDetails).VmId;
                }

                RecoveryPlanProtectedItem recoveryPlanProtectedItem = new RecoveryPlanProtectedItem();
                recoveryPlanProtectedItem.Id = replicationProtectedItemResponse.ReplicationProtectedItem.Id;
                recoveryPlanProtectedItem.VirtualMachineId = VmId;
                recoveryPlanGroup.ReplicationProtectedItems.Add(recoveryPlanProtectedItem);
            }

            createRecoveryPlanInputProperties.Groups.Add(recoveryPlanGroup);

            CreateRecoveryPlanInput createRecoveryPlanInput = new CreateRecoveryPlanInput()
            {
                Properties = createRecoveryPlanInputProperties
            };

            CreateRecoveryPlan(this.Name, createRecoveryPlanInput);
        }
Esempio n. 4
0
        /// <summary>
        /// Update Recovery Plan: By powerShell Recovery Plan object
        /// </summary>
        private void UpdateRecoveryPlan(ASRRecoveryPlan asrRecoveryPlan)
        {
            UpdateRecoveryPlanInputProperties updateRecoveryPlanInputProperties = new UpdateRecoveryPlanInputProperties()
            {
                Groups = new List <RecoveryPlanGroup>(),
            };

            foreach (ASRRecoveryPlanGroup asrRecoveryPlanGroup in asrRecoveryPlan.Groups)
            {
                RecoveryPlanGroup recoveryPlanGroup = new RecoveryPlanGroup()
                {
                    GroupType = asrRecoveryPlanGroup.GroupType,

                    // Initialize ReplicationProtectedItems with empty List if asrRecoveryPlanGroup.ReplicationProtectedItems is null
                    // otherwise assign respective values
                    ReplicationProtectedItems = asrRecoveryPlanGroup.ReplicationProtectedItems == null ? new List <RecoveryPlanProtectedItem>() :
                                                asrRecoveryPlanGroup.ReplicationProtectedItems.Select(item =>
                    {
                        var newItem = new RecoveryPlanProtectedItem(item.Id);

                        string VmId = null;

                        if (item.Properties.ProviderSpecificDetails.GetType() == typeof(HyperVReplicaAzureReplicationDetails))
                        {
                            VmId = ((HyperVReplicaAzureReplicationDetails)item.Properties.ProviderSpecificDetails).VmId;
                        }
                        else if (item.Properties.ProviderSpecificDetails.GetType() == typeof(HyperVReplica2012ReplicationDetails))
                        {
                            VmId = ((HyperVReplica2012ReplicationDetails)item.Properties.ProviderSpecificDetails).VmId;
                        }

                        newItem.VirtualMachineId = VmId;

                        return(newItem);
                    }).ToList(),
                    StartGroupActions = asrRecoveryPlanGroup.StartGroupActions,
                    EndGroupActions   = asrRecoveryPlanGroup.EndGroupActions
                };

                updateRecoveryPlanInputProperties.Groups.Add(recoveryPlanGroup);
            }

            UpdateRecoveryPlanInput updateRecoveryPlanInput = new UpdateRecoveryPlanInput()
            {
                Properties = updateRecoveryPlanInputProperties
            };

            UpdateRecoveryPlan(asrRecoveryPlan.Name, updateRecoveryPlanInput);
        }
Esempio n. 5
0
        public ASRRecoveryPlanGroup(
            RecoveryPlanGroup recoveryPlanGroup,
            IList <ReplicationProtectedItem> replicationProtectedItems = null)
        {
            if (recoveryPlanGroup != null)
            {
                this.GroupType = recoveryPlanGroup.GroupType.ToString();
                if (recoveryPlanGroup.StartGroupActions != null)
                {
                    this.StartGroupActions = recoveryPlanGroup.StartGroupActions.ToList().
                                             ConvertAll(startGroupAction => new ASRRecoveryPlanAction(startGroupAction));
                }

                if (recoveryPlanGroup.EndGroupActions != null)
                {
                    this.EndGroupActions = recoveryPlanGroup.EndGroupActions.ToList().
                                           ConvertAll(endGroupActions => new ASRRecoveryPlanAction(endGroupActions));
                }

                if (replicationProtectedItems != null)
                {
                    var replicationProtectedItemList =
                        recoveryPlanGroup.ReplicationProtectedItems.Select(
                            item => item.Id.ToLower());
                    var replicationProtectedItemsTemp = replicationProtectedItems.Where(
                        rpi => replicationProtectedItemList.Contains(rpi.Id.ToLower()))
                                                        .ToList();
                    if (replicationProtectedItemsTemp != null)
                    {
                        this.ReplicationProtectedItems = replicationProtectedItemsTemp.ConvertAll(
                            temp => new ASRReplicationProtectedItem(temp));
                    }
                }
                else
                {
                    this.ReplicationProtectedItems = new List <ASRReplicationProtectedItem>();
                }
            }
        }
        /// <summary>
        ///     Creates Replication Plan
        /// </summary>
        private void CreateRecoveryPlan()
        {
            var createRecoveryPlanInputProperties = new CreateRecoveryPlanInputProperties
            {
                FailoverDeploymentModel = (FailoverDeploymentModel)Enum.Parse(
                    typeof(FailoverDeploymentModel),
                    this.failoverDeploymentModel),
                Groups           = new List <RecoveryPlanGroup>(),
                PrimaryFabricId  = this.primaryserver,
                RecoveryFabricId = this.recoveryserver
            };

            var recoveryPlanGroup = new RecoveryPlanGroup
            {
                GroupType = RecoveryPlanGroupType.Boot,
                ReplicationProtectedItems = new List <RecoveryPlanProtectedItem>(),
                StartGroupActions         = new List <RecoveryPlanAction>(),
                EndGroupActions           = new List <RecoveryPlanAction>()
            };

            foreach (var rpi in this.ReplicationProtectedItem)
            {
                var fabricName = Utilities.GetValueFromArmId(
                    rpi.ID,
                    ARMResourceTypeConstants.ReplicationFabrics);

                var replicationProtectedItemResponse = this.RecoveryServicesClient
                                                       .GetAzureSiteRecoveryReplicationProtectedItem(
                    fabricName,
                    Utilities.GetValueFromArmId(
                        rpi.ID,
                        ARMResourceTypeConstants.ReplicationProtectionContainers),
                    rpi.Name);

                string VmId = null;

                if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails.GetType() ==
                    typeof(HyperVReplicaAzureReplicationDetails))
                {
                    VmId = ((HyperVReplicaAzureReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).VmId;
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails
                         .GetType() ==
                         typeof(HyperVReplicaReplicationDetails))
                {
                    VmId = ((HyperVReplicaReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).VmId;
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails
                         .GetType() ==
                         typeof(HyperVReplicaBlueReplicationDetails))
                {
                    VmId = ((HyperVReplicaBlueReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).VmId;
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails
                         .GetType() ==
                         typeof(InMageAzureV2ReplicationDetails))
                {
                    VmId = ((InMageAzureV2ReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).VmId;
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails
                         .GetType() ==
                         typeof(InMageReplicationDetails))
                {
                    VmId = ((InMageReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).VmId;
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails.GetType() == typeof(A2AReplicationDetails))
                {
                    A2AReplicationDetails a2aReplicationDetails =
                        ((A2AReplicationDetails)replicationProtectedItemResponse
                         .Properties
                         .ProviderSpecificDetails);
                    if (a2aReplicationDetails.FabricObjectId.IndexOf(
                            Constants.ClassicCompute,
                            StringComparison.OrdinalIgnoreCase) >= 0)
                    {
                        createRecoveryPlanInputProperties.FailoverDeploymentModel =
                            Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.Classic;
                    }
                    else if (a2aReplicationDetails.FabricObjectId.IndexOf(
                                 Constants.Compute,
                                 StringComparison.OrdinalIgnoreCase) >= 0)
                    {
                        createRecoveryPlanInputProperties.FailoverDeploymentModel =
                            Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.ResourceManager;
                    }
                }

                var recoveryPlanProtectedItem = new RecoveryPlanProtectedItem();
                recoveryPlanProtectedItem.Id = replicationProtectedItemResponse.Id;
                recoveryPlanProtectedItem.VirtualMachineId = VmId;
                recoveryPlanGroup.ReplicationProtectedItems.Add(recoveryPlanProtectedItem);
            }

            createRecoveryPlanInputProperties.Groups.Add(recoveryPlanGroup);

            var createRecoveryPlanInput =
                new CreateRecoveryPlanInput {
                Properties = createRecoveryPlanInputProperties
            };

            this.CreateRecoveryPlan(
                this.Name,
                createRecoveryPlanInput);
        }
        /// <summary>
        ///     Creates Replication Plan
        /// </summary>
        private void CreateRecoveryPlan()
        {
            var createRecoveryPlanInputProperties = new CreateRecoveryPlanInputProperties
            {
                FailoverDeploymentModel = this.failoverDeploymentModel,
                Groups           = new List <RecoveryPlanGroup>(),
                PrimaryFabricId  = this.primaryserver,
                RecoveryFabricId = this.recoveryserver
            };

            var recoveryPlanGroup = new RecoveryPlanGroup
            {
                GroupType = RecoveryPlanGroupType.Boot,
                ReplicationProtectedItems = new List <RecoveryPlanProtectedItem>(),
                StartGroupActions         = new List <RecoveryPlanAction>(),
                EndGroupActions           = new List <RecoveryPlanAction>()
            };

            foreach (var rpi in this.ReplicationProtectedItem)
            {
                var fabricName = Utilities.GetValueFromArmId(
                    rpi.ID,
                    ARMResourceTypeConstants.ReplicationFabrics);

                var replicationProtectedItemResponse = this.RecoveryServicesClient
                                                       .GetAzureSiteRecoveryReplicationProtectedItem(
                    fabricName,
                    Utilities.GetValueFromArmId(
                        rpi.ID,
                        ARMResourceTypeConstants.ReplicationProtectionContainers),
                    rpi.Name);

                string VmId = null;

                if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails.GetType() ==
                    typeof(HyperVReplicaAzureReplicationDetails))
                {
                    VmId = ((HyperVReplicaAzureReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).VmId;
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails
                         .GetType() ==
                         typeof(HyperVReplicaReplicationDetails))
                {
                    VmId = ((HyperVReplicaReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).VmId;
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails
                         .GetType() ==
                         typeof(HyperVReplicaBlueReplicationDetails))
                {
                    VmId = ((HyperVReplicaBlueReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).VmId;
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails
                         .GetType() ==
                         typeof(InMageAzureV2ReplicationDetails))
                {
                    VmId = ((InMageAzureV2ReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).VmId;
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails
                         .GetType() ==
                         typeof(InMageReplicationDetails))
                {
                    VmId = ((InMageReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).VmId;
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails.GetType() == typeof(A2AReplicationDetails))
                {
                    A2AReplicationDetails a2aReplicationDetails =
                        ((A2AReplicationDetails)replicationProtectedItemResponse
                         .Properties
                         .ProviderSpecificDetails);
                    if (a2aReplicationDetails.FabricObjectId.IndexOf(
                            Constants.ClassicCompute,
                            StringComparison.OrdinalIgnoreCase) >= 0)
                    {
                        createRecoveryPlanInputProperties.FailoverDeploymentModel =
                            Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.Classic;
                    }
                    else if (a2aReplicationDetails.FabricObjectId.IndexOf(
                                 Constants.Compute,
                                 StringComparison.OrdinalIgnoreCase) >= 0)
                    {
                        createRecoveryPlanInputProperties.FailoverDeploymentModel =
                            Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.ResourceManager;
                    }
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails
                         .GetType() ==
                         typeof(InMageRcmReplicationDetails))
                {
                    VmId = ((InMageRcmReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).InternalIdentifier;
                    createRecoveryPlanInputProperties.FailoverDeploymentModel =
                        Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.ResourceManager;
                }
                else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails
                         .GetType() ==
                         typeof(InMageRcmFailbackReplicationDetails))
                {
                    VmId = ((InMageRcmFailbackReplicationDetails)replicationProtectedItemResponse
                            .Properties.ProviderSpecificDetails).InternalIdentifier;
                    createRecoveryPlanInputProperties.FailoverDeploymentModel =
                        Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.ResourceManager;
                }

                var recoveryPlanProtectedItem = new RecoveryPlanProtectedItem();
                recoveryPlanProtectedItem.Id = replicationProtectedItemResponse.Id;
                recoveryPlanProtectedItem.VirtualMachineId = VmId;
                recoveryPlanGroup.ReplicationProtectedItems.Add(recoveryPlanProtectedItem);
            }

            createRecoveryPlanInputProperties.Groups.Add(recoveryPlanGroup);

            // Add zone to zone details.
            if (this.ParameterSetName == ASRParameterSets.AzureZoneToZone)
            {
                var recoveryPlanA2AInput = new RecoveryPlanA2AInput
                {
                    PrimaryZone             = this.PrimaryZone,
                    RecoveryZone            = this.RecoveryZone,
                    PrimaryExtendedLocation = this.IsParameterBound(c => c.PrimaryEdgeZone) ? new ExtendedLocation
                    {
                        Name = this.PrimaryEdgeZone
                    } : null,
                    RecoveryExtendedLocation = this.IsParameterBound(c => c.RecoveryEdgeZone) ? new ExtendedLocation
                    {
                        Name = this.RecoveryEdgeZone
                    } : null
                };

                createRecoveryPlanInputProperties.ProviderSpecificInput = new List <RecoveryPlanProviderSpecificInput>();
                createRecoveryPlanInputProperties.ProviderSpecificInput.Add(recoveryPlanA2AInput);
            }


            var createRecoveryPlanInput =
                new CreateRecoveryPlanInput {
                Properties = createRecoveryPlanInputProperties
            };

            this.CreateRecoveryPlan(
                this.Name,
                createRecoveryPlanInput);
        }
        /// <summary>
        ///     ProcessRecord of the command.
        /// </summary>
        public override void ExecuteSiteRecoveryCmdlet()
        {
            base.ExecuteSiteRecoveryCmdlet();

            if (this.ShouldProcess(
                    this.InputObject.FriendlyName,
                    VerbsData.Edit))
            {
                ASRRecoveryPlanGroup tempGroup;

                switch (this.ParameterSetName)
                {
                case ASRParameterSets.AppendGroup:
                    var recoveryPlanGroup = new RecoveryPlanGroup
                    {
                        GroupType = RecoveryPlanGroupType.Boot,
                        ReplicationProtectedItems = new List <RecoveryPlanProtectedItem>(),
                        StartGroupActions         = new List <RecoveryPlanAction>(),
                        EndGroupActions           = new List <RecoveryPlanAction>()
                    };

                    this.InputObject.Groups.Add(
                        new ASRRecoveryPlanGroup(
                            "Group " + (this.InputObject.Groups.Count - 1),
                            recoveryPlanGroup));
                    break;

                case ASRParameterSets.RemoveGroup:
                    tempGroup = this.InputObject.Groups.FirstOrDefault(
                        g => string.Compare(
                            g.Name,
                            this.RemoveGroup.Name,
                            StringComparison.OrdinalIgnoreCase) ==
                        0);

                    if (tempGroup != null)
                    {
                        this.InputObject.Groups.Remove(tempGroup);
                        this.InputObject = this.InputObject.RefreshASRRecoveryPlanGroupNames();
                    }
                    else
                    {
                        throw new PSArgumentException(
                                  string.Format(
                                      Resources.GroupNotFoundInRecoveryPlan,
                                      this.RemoveGroup.Name,
                                      this.InputObject.FriendlyName));
                    }

                    break;

                case ASRParameterSets.AddReplicationProtectedItems:
                    foreach (var rpi in this.AddProtectedItem)
                    {
                        var fabricName = Utilities.GetValueFromArmId(
                            rpi.ID,
                            ARMResourceTypeConstants.ReplicationFabrics);

                        var replicationProtectedItemResponse = this.RecoveryServicesClient
                                                               .GetAzureSiteRecoveryReplicationProtectedItem(
                            fabricName,
                            Utilities.GetValueFromArmId(
                                rpi.ID,
                                ARMResourceTypeConstants.ReplicationProtectionContainers),
                            rpi.Name);

                        tempGroup = this.InputObject.Groups.FirstOrDefault(
                            g => string.Compare(
                                g.Name,
                                this.Group.Name,
                                StringComparison.OrdinalIgnoreCase) ==
                            0);

                        if (tempGroup != null)
                        {
                            foreach (var gp in this.InputObject.Groups)
                            {
                                if (gp.ReplicationProtectedItems == null)
                                {
                                    continue;
                                }

                                if (gp.ReplicationProtectedItems.Any(
                                        pi => string.Compare(
                                            pi.Id,
                                            replicationProtectedItemResponse.Id,
                                            StringComparison.OrdinalIgnoreCase) ==
                                        0))
                                {
                                    throw new PSArgumentException(
                                              string.Format(
                                                  Resources.VMAlreadyPartOfGroup,
                                                  rpi.FriendlyName,
                                                  gp.Name,
                                                  this.InputObject.FriendlyName));
                                }
                            }

                            this.InputObject.Groups[this.InputObject.Groups.IndexOf(tempGroup)]
                            .ReplicationProtectedItems
                            .Add(new ReplicationProtectedItem_2016_08_10(replicationProtectedItemResponse));
                        }
                        else
                        {
                            throw new PSArgumentException(
                                      string.Format(
                                          Resources.GroupNotFoundInRecoveryPlan,
                                          this.Group.Name,
                                          this.InputObject.FriendlyName));
                        }
                    }

                    break;

                case ASRParameterSets.RemoveReplicationProtectedItems:
                    foreach (var rpi in this.RemoveProtectedItem)
                    {
                        var fabricName = Utilities.GetValueFromArmId(
                            rpi.ID,
                            ARMResourceTypeConstants.ReplicationFabrics);

                        tempGroup = this.InputObject.Groups.FirstOrDefault(
                            g => string.Compare(
                                g.Name,
                                this.Group.Name,
                                StringComparison.OrdinalIgnoreCase) ==
                            0);

                        if (tempGroup != null)
                        {
                            var ReplicationProtectedItem = this.InputObject
                                                           .Groups[this.InputObject.Groups.IndexOf(tempGroup)]
                                                           .ReplicationProtectedItems.FirstOrDefault(
                                pi => string.Compare(
                                    pi.Id,
                                    rpi.ID,
                                    StringComparison.OrdinalIgnoreCase) ==
                                0);

                            if (ReplicationProtectedItem != null)
                            {
                                this.InputObject
                                .Groups[this.InputObject.Groups.IndexOf(tempGroup)]
                                .ReplicationProtectedItems.Remove(ReplicationProtectedItem);
                            }
                            else
                            {
                                throw new PSArgumentException(
                                          string.Format(
                                              Resources.VMNotFoundInGroup,
                                              rpi.FriendlyName,
                                              this.Group.Name,
                                              this.InputObject.FriendlyName));
                            }
                        }
                        else
                        {
                            throw new PSArgumentException(
                                      string.Format(
                                          Resources.GroupNotFoundInRecoveryPlan,
                                          this.Group.Name,
                                          this.InputObject.FriendlyName));
                        }
                    }

                    break;
                }

                this.WriteObject(this.InputObject);
            }
        }
        /// <summary>
        ///     Update Recovery Plan: By powerShell Recovery Plan object
        /// </summary>
        private void UpdateRecoveryPlan(
            ASRRecoveryPlan asrRecoveryPlan)
        {
            var updateRecoveryPlanInputProperties =
                new UpdateRecoveryPlanInputProperties {
                Groups = new List <RecoveryPlanGroup>()
            };

            foreach (var asrRecoveryPlanGroup in asrRecoveryPlan.Groups)
            {
                var recoveryPlanGroup = new RecoveryPlanGroup
                {
                    GroupType = asrRecoveryPlanGroup.GroupType,

                    // Initialize ReplicationProtectedItems with empty List if asrRecoveryPlanGroup.ReplicationProtectedItems is null
                    // otherwise assign respective values
                    ReplicationProtectedItems =
                        asrRecoveryPlanGroup.ReplicationProtectedItems == null
                            ? new List <RecoveryPlanProtectedItem>() : asrRecoveryPlanGroup
                        .ReplicationProtectedItems.Select(
                            item =>
                    {
                        var newItem = new RecoveryPlanProtectedItem(item.ID);

                        string VmId = null;

                        if (item.ProviderSpecificDetails.GetType() ==
                            typeof(ASRHyperVReplicaAzureSpecificRPIDetails))
                        {
                            VmId = ((ASRHyperVReplicaAzureSpecificRPIDetails)item.ProviderSpecificDetails).VmId;
                        }
                        else if (item.ProviderSpecificDetails.GetType() == typeof(ASRHyperVReplicaRPIDetails))
                        {
                            VmId = ((ASRHyperVReplicaRPIDetails)item.ProviderSpecificDetails).VmId;
                        }
                        else if (item.ProviderSpecificDetails.GetType() == typeof(ASRHyperVReplicaBlueRPIDetails))
                        {
                            VmId = ((ASRHyperVReplicaBlueRPIDetails)item.ProviderSpecificDetails).VmId;
                        }
                        else if (item.ProviderSpecificDetails.GetType() == typeof(ASRInMageSpecificRPIDetails))
                        {
                            VmId = ((ASRInMageSpecificRPIDetails)item.ProviderSpecificDetails).VmId;
                        }
                        else if (item.ProviderSpecificDetails.GetType() == typeof(ASRInMageSpecificRPIDetails))
                        {
                            VmId = ((ASRInMageSpecificRPIDetails)item.ProviderSpecificDetails).VmId;
                        }

                        newItem.VirtualMachineId = VmId;

                        return(newItem);
                    })
                        .ToList(),
                    StartGroupActions = asrRecoveryPlanGroup.StartGroupActions == null ?
                                        null : asrRecoveryPlanGroup.StartGroupActions.ToList().ConvertAll(
                        action => ASRRecoveryPlanAction.GetSrsRecoveryPlanAction(action)),
                    EndGroupActions = asrRecoveryPlanGroup.EndGroupActions == null ?
                                      null : asrRecoveryPlanGroup.EndGroupActions.ToList().ConvertAll(
                        action => ASRRecoveryPlanAction.GetSrsRecoveryPlanAction(action)),
                };

                updateRecoveryPlanInputProperties.Groups.Add(recoveryPlanGroup);
            }

            var updateRecoveryPlanInput =
                new UpdateRecoveryPlanInput {
                Properties = updateRecoveryPlanInputProperties
            };

            this.UpdateRecoveryPlan(
                asrRecoveryPlan.Name,
                updateRecoveryPlanInput);
        }
Esempio n. 10
0
        /// <summary>
        /// ProcessRecord of the command.
        /// </summary>
        public override void ExecuteSiteRecoveryCmdlet()
        {
            base.ExecuteSiteRecoveryCmdlet();

            ASRRecoveryPlanGroup tempGroup;

            switch (this.ParameterSetName)
            {
            case ASRParameterSets.AppendGroup:
                RecoveryPlanGroup recoveryPlanGroup = new RecoveryPlanGroup()
                {
                    GroupType = Constants.Boot,
                    ReplicationProtectedItems = new List <RecoveryPlanProtectedItem>(),
                    StartGroupActions         = new List <RecoveryPlanAction>(),
                    EndGroupActions           = new List <RecoveryPlanAction>()
                };

                this.RecoveryPlan.Groups.Add(new ASRRecoveryPlanGroup("Group " + (RecoveryPlan.Groups.Count - 1).ToString(), recoveryPlanGroup));
                break;

            case ASRParameterSets.RemoveGroup:
                tempGroup = this.RecoveryPlan.Groups.FirstOrDefault(g => String.Compare(g.Name, RemoveGroup.Name, StringComparison.OrdinalIgnoreCase) == 0);

                if (tempGroup != null)
                {
                    this.RecoveryPlan.Groups.Remove(tempGroup);
                    this.RecoveryPlan = this.RecoveryPlan.RefreshASRRecoveryPlanGroupNames();
                }
                else
                {
                    throw new PSArgumentException(string.Format(Properties.Resources.GroupNotFoundInRecoveryPlan, this.RemoveGroup.Name, this.RecoveryPlan.FriendlyName));
                }

                break;

            case ASRParameterSets.AddProtectedEntities:
                foreach (ASRProtectionEntity pe in AddProtectedEntities)
                {
                    string fabricName = Utilities.GetValueFromArmId(pe.ID, ARMResourceTypeConstants.ReplicationFabrics);
                    // fetch the latest PE object
                    ProtectableItemResponse protectableItemResponse =
                        RecoveryServicesClient.GetAzureSiteRecoveryProtectableItem(fabricName,
                                                                                   pe.ProtectionContainerId, pe.Name);

                    ReplicationProtectedItemResponse replicationProtectedItemResponse =
                        RecoveryServicesClient.GetAzureSiteRecoveryReplicationProtectedItem(fabricName,
                                                                                            pe.ProtectionContainerId, Utilities.GetValueFromArmId(protectableItemResponse.ProtectableItem.Properties.ReplicationProtectedItemId,
                                                                                                                                                  ARMResourceTypeConstants.ReplicationProtectedItems));

                    tempGroup = this.RecoveryPlan.Groups.FirstOrDefault(g => String.Compare(g.Name, Group.Name, StringComparison.OrdinalIgnoreCase) == 0);

                    if (tempGroup != null)
                    {
                        foreach (ASRRecoveryPlanGroup gp in this.RecoveryPlan.Groups)
                        {
                            if (gp.ReplicationProtectedItems == null)
                            {
                                continue;
                            }

                            if (gp.ReplicationProtectedItems.Any(pi => String.Compare(pi.Id, replicationProtectedItemResponse.ReplicationProtectedItem.Id, StringComparison.OrdinalIgnoreCase) == 0))
                            {
                                throw new PSArgumentException(string.Format(Properties.Resources.VMAlreadyPartOfGroup, pe.FriendlyName, gp.Name, this.RecoveryPlan.FriendlyName));
                            }
                        }

                        this.RecoveryPlan.Groups[RecoveryPlan.Groups.IndexOf(tempGroup)].ReplicationProtectedItems.Add(replicationProtectedItemResponse.ReplicationProtectedItem);
                    }
                    else
                    {
                        throw new PSArgumentException(string.Format(Properties.Resources.GroupNotFoundInRecoveryPlan, this.Group.Name, this.RecoveryPlan.FriendlyName));
                    }
                }
                break;

            case ASRParameterSets.RemoveProtectedEntities:
                foreach (ASRProtectionEntity pe in RemoveProtectedEntities)
                {
                    string fabricName = Utilities.GetValueFromArmId(pe.ID, ARMResourceTypeConstants.ReplicationFabrics);
                    // fetch the latest PE object
                    ProtectableItemResponse protectableItemResponse =
                        RecoveryServicesClient.GetAzureSiteRecoveryProtectableItem(fabricName,
                                                                                   pe.ProtectionContainerId, pe.Name);

                    tempGroup = this.RecoveryPlan.Groups.FirstOrDefault(g => String.Compare(g.Name, Group.Name, StringComparison.OrdinalIgnoreCase) == 0);

                    if (tempGroup != null)
                    {
                        var ReplicationProtectedItem =
                            this.RecoveryPlan.Groups[RecoveryPlan.Groups.IndexOf(tempGroup)].
                            ReplicationProtectedItems.
                            FirstOrDefault(pi => String.Compare(pi.Id,
                                                                protectableItemResponse.ProtectableItem.Properties.ReplicationProtectedItemId,
                                                                StringComparison.OrdinalIgnoreCase) == 0);

                        if (ReplicationProtectedItem != null)
                        {
                            this.RecoveryPlan.Groups[RecoveryPlan.Groups.IndexOf(tempGroup)].ReplicationProtectedItems.Remove(ReplicationProtectedItem);
                        }
                        else
                        {
                            throw new PSArgumentException(string.Format(Properties.Resources.VMNotFoundInGroup, pe.FriendlyName, this.Group.Name, this.RecoveryPlan.FriendlyName));
                        }
                    }
                    else
                    {
                        throw new PSArgumentException(string.Format(Properties.Resources.GroupNotFoundInRecoveryPlan, this.Group.Name, this.RecoveryPlan.FriendlyName));
                    }
                }
                break;
            }
            ;

            this.WriteObject(this.RecoveryPlan);
        }