public AzureContainer(ProtectionContainerResource protectionContainer)
     : base(protectionContainer)
 {
     ResourceGroupName = IdUtils.GetResourceGroupName(protectionContainer.Id);
     FriendlyName      = protectionContainer.Properties.FriendlyName;
     Status            = EnumUtils.GetEnum <ContainerRegistrationStatus>(protectionContainer.Properties.RegistrationStatus);
 }
        public void RegisterContainer(string storageAccountName,
                                      ProtectionContainerResource protectionContainerResource,
                                      string vaultName, string vaultResourceGroupName)
        {
            var registerResponse = ServiceClientAdapter.RegisterContainer(
                storageAccountName,
                protectionContainerResource,
                vaultName,
                vaultResourceGroupName);

            var operationStatus = TrackingHelpers.GetOperationResult(
                registerResponse,
                operationId =>
                ServiceClientAdapter.GetRegisterContainerOperationResult(
                    operationId,
                    storageAccountName,
                    vaultName: vaultName,
                    resourceGroupName: vaultResourceGroupName));

            //Now wait for the operation to Complete
            if (registerResponse.Response.StatusCode
                != SystemNet.HttpStatusCode.NoContent)
            {
                string errorMessage = string.Format(Resources.RegisterFailureErrorCode,
                                                    registerResponse.Response.StatusCode);
                Logger.Instance.WriteDebug(errorMessage);
            }
        }
        /// <summary>
        /// Constructor. Takes the service client object representing the container
        /// and converts it in to the PS container model
        /// </summary>
        /// <param name="protectionContainerResource">Service client object representing the container</param>
        public AzureVmWorkloadContainer(ProtectionContainerResource protectionContainerResource)
            : base(protectionContainerResource)
        {
            AzureVMAppContainerProtectionContainer protectionContainer = (AzureVMAppContainerProtectionContainer)protectionContainerResource.Properties;

            Id = protectionContainerResource.Id;
            SourceResourceId = protectionContainer.SourceResourceId;
            HealthStatus     = protectionContainer.HealthStatus;

            if (protectionContainer.ExtendedInfo != null)
            {
                ServerName = protectionContainer.ExtendedInfo.HostServerName;
            }

            ExtendedInfo     = new List <AzureVmWorkloadContainerExtendedInfo>();
            WorkloadsPresent = "";
            foreach (var inquiryDetail in protectionContainer.ExtendedInfo.InquiryInfo.InquiryDetails)
            {
                ExtendedInfo.Add(new AzureVmWorkloadContainerExtendedInfo()
                {
                    InquiryStatus = inquiryDetail.InquiryValidation.Status,
                    WorkloadItems = inquiryDetail.ItemCount,
                    WorkloadType  = inquiryDetail.Type
                });
                WorkloadsPresent += inquiryDetail.Type + ",";
            }
            WorkloadsPresent = WorkloadsPresent.Remove(WorkloadsPresent.Length - 1);
        }
        public MabContainer(ProtectionContainerResource protectionContainer)
            : base(protectionContainer)
        {
            MabProtectionContainer mabProtectionContainer = (MabProtectionContainer)protectionContainer.Properties;

            FriendlyName = mabProtectionContainer.FriendlyName;
            Status       = EnumUtils.GetEnum <ContainerRegistrationStatus>(mabProtectionContainer.RegistrationStatus);
        }
Beispiel #5
0
        /// <summary>
        /// Constructor. Takes the service client object representing the container
        /// and converts it in to the PS container model
        /// </summary>
        /// <param name="protectionContainer">Service client object representing the container</param>
        public AzureVmContainer(ProtectionContainerResource protectionContainer)
            : base(protectionContainer)
        {
            AzureIaaSVMProtectionContainer iaasVmProtectionContainer = (AzureIaaSVMProtectionContainer)protectionContainer.Properties;

            ResourceGroupName = IdUtils.GetResourceGroupName(protectionContainer.Id);
            FriendlyName      = iaasVmProtectionContainer.FriendlyName;
            Status            = EnumUtils.GetEnum <ContainerRegistrationStatus>(iaasVmProtectionContainer.RegistrationStatus);
        }
        // <summary>
        /// Constructor. Takes the service client object representing the container
        /// and converts it in to the PS container model
        /// </summary>
        /// <param name="protectionContainer">Service client object representing the container</param>
        public AzureSqlContainer(ProtectionContainerResource protectionContainer)
            : base(protectionContainer)
        {
            AzureSqlProtectionContainer sqlProtectionContainer =
                (AzureSqlProtectionContainer)protectionContainer.Properties;

            Status = EnumUtils.GetEnum <ContainerRegistrationStatus>(
                sqlProtectionContainer.RegistrationStatus);
        }
Beispiel #7
0
        public void FetchNodesListAndAutoProtectionPolicy(List <ProtectableItemBase> itemModels, string vaultName, string resourceGroupName)
        {
            foreach (var itemModel in itemModels)
            {
                AzureWorkloadProtectableItem protectableItem = ((AzureWorkloadProtectableItem)itemModel);

                string itemType             = "";
                string itemName             = "";
                string containerUri         = "";
                string backupManagementType = "";

                Dictionary <UriEnums, string> keyValueDict = HelperUtils.ParseUri(protectableItem.Id);

                itemType     = HelperUtils.GetProtectableItemUri(keyValueDict, protectableItem.Id).Split(';')[0];
                itemName     = HelperUtils.GetProtectableItemUri(keyValueDict, protectableItem.Id).Split(';')[1];
                containerUri = HelperUtils.GetContainerUri(keyValueDict, protectableItem.Id);

                // fetch AutoProtectionPolicy for non DBs
                if (protectableItem.ProtectableItemType != "SQLDataBase")
                {
                    // fetch the policy using backup intent
                    ODataQuery <ServiceClientModel.ProtectionIntentQueryObject> queryParams = null;
                    backupManagementType = ServiceClientModel.BackupManagementType.AzureWorkload;

                    queryParams = new ODataQuery <ServiceClientModel.ProtectionIntentQueryObject>(
                        q => q.ItemType == itemType &&
                        q.ItemName == itemName &&
                        q.ParentName == containerUri &&
                        q.BackupManagementType == backupManagementType);

                    var intentList = ServiceClientAdapter.ListProtectionIntent(
                        queryParams,
                        vaultName: vaultName,
                        resourceGroupName: resourceGroupName);

                    foreach (var intent in intentList)
                    {
                        protectableItem.AutoProtectionPolicy = intent.Properties.PolicyId;
                    }
                }

                //  fetch Nodelist for SQLAGs
                if (protectableItem.ProtectableItemType == "SQLAvailabilityGroup")
                {
                    // add the NodeList
                    ProtectionContainerResource cont = ServiceClientAdapter.GetContainer(vaultName, resourceGroupName, containerUri);
                    AzureSQLAGWorkloadContainerProtectionContainer protectionContainer = (AzureSQLAGWorkloadContainerProtectionContainer)cont.Properties;

                    if (protectionContainer.ExtendedInfo != null)
                    {
                        protectableItem.NodesList = protectionContainer.ExtendedInfo.NodesList;
                    }
                }
            }
        }
Beispiel #8
0
        /// <summary>
        /// Fetches a particular protection container in the vault
        /// </summary>
        /// <param name="vaultName"></param>
        /// <param name="resourceGroupName"></param>
        /// <param name="containerName"></param>
        /// <returns></returns>
        public ProtectionContainerResource GetContainer(
            string vaultName         = null,
            string resourceGroupName = null,
            string containerName     = null)
        {
            ProtectionContainerResource container = BmsAdapter.Client.ProtectionContainers.GetWithHttpMessagesAsync(
                vaultName ?? BmsAdapter.GetResourceName(),
                resourceGroupName ?? BmsAdapter.GetResourceGroupName(),
                AzureFabricName,
                containerName,
                cancellationToken: BmsAdapter.CmdletCancellationToken).Result.Body;

            return(container);
        }
        public void RegisterContainer()
        {
            string        vaultName = (string)ProviderData[VaultParams.VaultName];
            string        vaultResourceGroupName = (string)ProviderData[VaultParams.ResourceGroupName];
            string        containerName          = (string)ProviderData[ContainerParams.Name];
            string        backupManagementType   = (string)ProviderData[ContainerParams.BackupManagementType];
            string        workloadType           = (string)ProviderData[ContainerParams.ContainerType];
            ContainerBase containerBase          =
                (ContainerBase)ProviderData[ContainerParams.Container];
            AzureVmWorkloadContainer container = (AzureVmWorkloadContainer)ProviderData[ContainerParams.Container];

            ProtectionContainerResource protectionContainerResource = null;

            //Trigger Discovery
            ODataQuery <BMSRefreshContainersQueryObject> queryParam = new ODataQuery <BMSRefreshContainersQueryObject>(
                q => q.BackupManagementType
                == ServiceClientModel.BackupManagementType.AzureWorkload);

            AzureWorkloadProviderHelper.RefreshContainer(vaultName, vaultResourceGroupName, queryParam);

            List <ProtectableContainerResource> unregisteredVmContainers =
                GetUnRegisteredVmContainers(vaultName, vaultResourceGroupName);
            ProtectableContainerResource unregisteredVmContainer = unregisteredVmContainers.Find(
                vmContainer => string.Compare(vmContainer.Name.Split(';').Last(),
                                              containerName, true) == 0);

            if (unregisteredVmContainer != null || container != null)
            {
                protectionContainerResource =
                    new ProtectionContainerResource(container != null ? container.Id : unregisteredVmContainer.Id,
                                                    container != null ? container.Name : unregisteredVmContainer.Name);
                AzureVMAppContainerProtectionContainer azureVMContainer = new AzureVMAppContainerProtectionContainer(
                    friendlyName: containerName,
                    backupManagementType: backupManagementType,
                    sourceResourceId: container != null ? container.SourceResourceId : unregisteredVmContainer.Properties.ContainerId,
                    workloadType: workloadType.ToString(),
                    operationType: container != null ? OperationType.Reregister : OperationType.Register);
                protectionContainerResource.Properties = azureVMContainer;
                AzureWorkloadProviderHelper.RegisterContainer(container != null ? container.Name : unregisteredVmContainer.Name,
                                                              protectionContainerResource,
                                                              vaultName,
                                                              vaultResourceGroupName);
            }
            else
            {
                throw new ArgumentException(string.Format(Resources.AzureWorkloadAlreadyRegisteredException));
            }
        }
Beispiel #10
0
        /// <summary>
        /// Triggers register of container in service
        /// </summary>
        /// <returns>Response of the job created in the service</returns>
        public RestAzureNS.AzureOperationResponse <ProtectionContainerResource> RegisterContainer(
            string containerName,
            ProtectionContainerResource parameters,
            string vaultName         = null,
            string resourceGroupName = null)
        {
            var response = BmsAdapter.Client.ProtectionContainers.RegisterWithHttpMessagesAsync(
                vaultName ?? BmsAdapter.GetResourceName(),
                resourceGroupName ?? BmsAdapter.GetResourceGroupName(),
                AzureFabricName,
                containerName,
                parameters,
                cancellationToken: BmsAdapter.CmdletCancellationToken).Result;

            return(response);
        }
 /// <summary>
 /// Registers the container with Recovery Services vault.
 /// This is an asynchronous operation. To track the operation status, use
 /// location header to call get latest status of
 /// the operation.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='vaultName'>
 /// The name of the recovery services vault.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group where the recovery services vault is
 /// present.
 /// </param>
 /// <param name='fabricName'>
 /// Fabric name associated with the container.
 /// </param>
 /// <param name='containerName'>
 /// Name of the container to be registered.
 /// </param>
 /// <param name='parameters'>
 /// Request body for operation
 /// </param>
 /// <param name='cancellationToken'>
 /// The cancellation token.
 /// </param>
 public static async Task <ProtectionContainerResource> RegisterAsync(this IProtectionContainersOperations operations, string vaultName, string resourceGroupName, string fabricName, string containerName, ProtectionContainerResource parameters, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var _result = await operations.RegisterWithHttpMessagesAsync(vaultName, resourceGroupName, fabricName, containerName, parameters, null, cancellationToken).ConfigureAwait(false))
     {
         return(_result.Body);
     }
 }
 /// <summary>
 /// Registers the container with Recovery Services vault.
 /// This is an asynchronous operation. To track the operation status, use
 /// location header to call get latest status of
 /// the operation.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='vaultName'>
 /// The name of the recovery services vault.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group where the recovery services vault is
 /// present.
 /// </param>
 /// <param name='fabricName'>
 /// Fabric name associated with the container.
 /// </param>
 /// <param name='containerName'>
 /// Name of the container to be registered.
 /// </param>
 /// <param name='parameters'>
 /// Request body for operation
 /// </param>
 public static ProtectionContainerResource Register(this IProtectionContainersOperations operations, string vaultName, string resourceGroupName, string fabricName, string containerName, ProtectionContainerResource parameters)
 {
     return(operations.RegisterAsync(vaultName, resourceGroupName, fabricName, containerName, parameters).GetAwaiter().GetResult());
 }
Beispiel #13
0
        private WorkloadProtectableItemResource GetAzureFileShareProtectableObject(
            string azureFileShareName,
            string storageAccountName,
            string vaultName = null,
            string vaultResourceGroupName = null)
        {
            //Trigger Discovery
            ODataQuery <BMSRefreshContainersQueryObject> queryParam = new ODataQuery <BMSRefreshContainersQueryObject>(
                q => q.BackupManagementType
                == ServiceClientModel.BackupManagementType.AzureStorage);

            AzureWorkloadProviderHelper.RefreshContainer(vaultName, vaultResourceGroupName, queryParam);

            //get registered storage accounts
            bool   isRegistered         = false;
            string storageContainerName = null;
            List <ContainerBase> registeredStorageAccounts = GetRegisteredStorageAccounts(vaultName, vaultResourceGroupName);
            ContainerBase        registeredStorageAccount  = registeredStorageAccounts.Find(
                storageAccount => string.Compare(storageAccount.Name.Split(';').Last(),
                                                 storageAccountName, true) == 0);

            if (registeredStorageAccount != null)
            {
                isRegistered         = true;
                storageContainerName = "StorageContainer;" + registeredStorageAccount.Name;
            }

            //get unregistered storage account
            if (!isRegistered)
            {
                List <ProtectableContainerResource> unregisteredStorageAccounts =
                    GetUnRegisteredStorageAccounts(vaultName, vaultResourceGroupName);
                ProtectableContainerResource unregisteredStorageAccount = unregisteredStorageAccounts.Find(
                    storageAccount => string.Compare(storageAccount.Name.Split(';').Last(),
                                                     storageAccountName, true) == 0);
                if (unregisteredStorageAccount != null)
                {
                    //unregistered
                    //check for source Id for storageAccountId in ProtectionContainerResource
                    storageContainerName = unregisteredStorageAccount.Name;
                    ProtectionContainerResource protectionContainerResource =
                        new ProtectionContainerResource(unregisteredStorageAccount.Id,
                                                        unregisteredStorageAccount.Name);
                    AzureStorageContainer azureStorageContainer = new AzureStorageContainer(
                        friendlyName: storageAccountName,
                        backupManagementType: ServiceClientModel.BackupManagementType.AzureStorage,
                        sourceResourceId: unregisteredStorageAccount.Properties.ContainerId,
                        resourceGroup: vaultResourceGroupName);
                    protectionContainerResource.Properties = azureStorageContainer;
                    AzureWorkloadProviderHelper.RegisterContainer(unregisteredStorageAccount.Name,
                                                                  protectionContainerResource,
                                                                  vaultName,
                                                                  vaultResourceGroupName);
                }
            }

            //inquiry
            AzureWorkloadProviderHelper.TriggerInquiry(vaultName, vaultResourceGroupName,
                                                       storageContainerName, ServiceClientModel.WorkloadType.AzureFileShare);

            //get protectable item
            WorkloadProtectableItemResource protectableObjectResource = null;

            protectableObjectResource = GetProtectableItem(vaultName, vaultResourceGroupName, azureFileShareName, storageAccountName);

            if (protectableObjectResource == null)
            {
                // Container is not discovered. Throw exception
                string errorMessage = string.Format(
                    Resources.AFSDiscoveryFailure,
                    azureFileShareName,
                    vaultResourceGroupName);
                Logger.Instance.WriteDebug(errorMessage);
                Logger.Instance.WriteError(
                    new ErrorRecord(new Exception(Resources.FileShareNotDiscovered),
                                    string.Empty, ErrorCategory.InvalidArgument, null));
            }

            return(protectableObjectResource);
        }
Beispiel #14
0
 /// <summary>
 /// Constructor. Takes the service client object representing the container
 /// and converts it in to the PS container model
 /// </summary>
 /// <param name="protectionContainer">Service client object representing the container</param>
 public AzureVmContainer(ProtectionContainerResource protectionContainer)
     : base(protectionContainer)
 {
 }
Beispiel #15
0
 /// <summary>
 /// Constructor. Takes the service client object representing the container
 /// and converts it in to the PS container model
 /// </summary>
 /// <param name="protectionContainerResource">Service client object representing the container</param>
 public AzureFileShareContainer(ProtectionContainerResource protectionContainerResource)
     : base(protectionContainerResource)
 {
 }