private void FixCrossReferencesWithLegacyApplianceConfig(LegacyApplianceConfig config)
        {
            List <BandwidthSetting>         bandwidthSettingList = (List <BandwidthSetting>)config.BandwidthSettings;
            List <StorageAccountCredential> sacList = (List <StorageAccountCredential>)config.StorageAccountCredentials;

            foreach (MigrationDataContainer dataContainer in config.CloudConfigurations)
            {
                dataContainer.BandwidthSetting = bandwidthSettingList.Find(bwSetting => bwSetting.InstanceId == dataContainer.BandwidthSetting.InstanceId);
                dataContainer.PrimaryStorageAccountCredential = sacList.Find(sac => sac.InstanceId == dataContainer.PrimaryStorageAccountCredential.InstanceId);
                dataContainer.BackupStorageAccountCredential  = sacList.Find(sac => sac.InstanceId == dataContainer.BackupStorageAccountCredential.InstanceId);
            }

            List <AccessControlRecord> acrList = (List <AccessControlRecord>)config.AccessControlRecords;

            foreach (VirtualDisk virtualDisk in config.Volumes)
            {
                MigrationDataContainer dataContainer = ((List <MigrationDataContainer>)config.CloudConfigurations).Find(dc => dc.InstanceId == virtualDisk.DataContainerId);
                virtualDisk.DataContainer = this.ConvertToDataContainer(dataContainer);
                virtualDisk.DataContainer.VolumeCount++;
                virtualDisk.AcrList = acrList.FindAll(acr => virtualDisk.AcrIdList.Contains(acr.InstanceId));
                foreach (AccessControlRecord acr in virtualDisk.AcrList)
                {
                    acr.VolumeCount++;
                }
            }
        }
        private DataContainer ConvertToDataContainer(MigrationDataContainer dataContainer)
        {
            DataContainer dc = new DataContainer();

            dc.BandwidthRate       = dataContainer.BandwidthSetting.Schedules[0].Rate;
            dc.EncryptionKey       = dataContainer.EncryptionKey;
            dc.InstanceId          = dataContainer.InstanceId;
            dc.IsDefault           = dataContainer.IsDefault;
            dc.IsEncryptionEnabled = !string.IsNullOrEmpty(dataContainer.EncryptionKey);
            dc.Name = dataContainer.Name;
            dc.OperationInProgress = dataContainer.OperationInProgress;
            dc.Owned = dataContainer.Owned;
            dc.PrimaryStorageAccountCredential = this.ConvertToSACResponse(dataContainer.PrimaryStorageAccountCredential);
            dc.VolumeCount = 0;
            return(dc);
        }
        private List <MigrationDataContainer> ParseVolumeContainer(XmlDocument document)
        {
            List <MigrationDataContainer> dataContainerList = new List <MigrationDataContainer>();
            XmlNodeList nodeList = document.SelectNodes(@"//VolumeContainer");

            foreach (XmlNode node in nodeList)
            {
                MigrationDataContainer volumeContainer = new MigrationDataContainer();
                volumeContainer.Name             = node.Attributes["Name"].Value;
                volumeContainer.InstanceId       = node.Attributes["Id"].Value;
                volumeContainer.BandwidthSetting = new BandwidthSetting()
                {
                    InstanceId = node.Attributes["BandwidthTempateId"].Value
                };

                volumeContainer.EncryptionKey = node.Attributes["EncryptionKey"].Value;
                volumeContainer.SecretsEncryptionThumbprint = node.Attributes["SecretEncryptionThumbPrint"].Value;
                foreach (XmlNode childNode in node.ChildNodes)
                {
                    if ("PrimaryBucket" == childNode.Name)
                    {
                        volumeContainer.PrimaryBucket = childNode.Attributes["Name"].Value;
                        volumeContainer.PrimaryStorageAccountCredential = new StorageAccountCredential()
                        {
                            InstanceId = childNode.Attributes["CredentialId"].Value
                        };
                    }
                    else if ("BackupBucket" == childNode.Name)
                    {
                        volumeContainer.BackupBucket = childNode.Attributes["Name"].Value;
                        volumeContainer.BackupStorageAccountCredential = new StorageAccountCredential()
                        {
                            InstanceId = childNode.Attributes["CredentialId"].Value
                        };
                    }
                }

                dataContainerList.Add(volumeContainer);
            }

            return(dataContainerList);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Computes the list of volume containers to be migrated together
        /// </summary>
        /// <returns>list of related volume container(s) which needs to be migrated together</returns>
        private List <List <MigrationDataContainer> > ComputedRelatedVolumeContainers()
        {
            var dcDict = new Dictionary <string, DataContainerInfo>();

            foreach (var virtualDiskGroup in this.VolumeGroups)
            {
                List <string> diskIDList  = virtualDiskGroup.VirtualDiskList.ToList();
                string        vDGIdentity = Guid.NewGuid().ToString();
                foreach (string virtualDiskId in diskIDList)
                {
                    VirtualDisk            virtualDisk   = this.Volumes.FirstOrDefault(volume => (volume.InstanceId == virtualDiskId));
                    MigrationDataContainer dataContainer =
                        this.CloudConfigurations.FirstOrDefault(
                            volumeContainer => (volumeContainer.InstanceId == virtualDisk.DataContainerId));
                    if (null != dataContainer)
                    {
                        if (!dcDict.ContainsKey(dataContainer.InstanceId))
                        {
                            DataContainerInfo newDc = new DataContainerInfo()
                            {
                                DcInfo            = dataContainer,
                                VirtualDiskGroups = new List <string>()
                                {
                                    vDGIdentity
                                },
                                Visited = false
                            };

                            dcDict.Add(dataContainer.InstanceId, newDc);
                        }
                        else if (!dcDict[dataContainer.InstanceId].VirtualDiskGroups.Contains(vDGIdentity))
                        {
                            dcDict[dataContainer.InstanceId].VirtualDiskGroups.Add(vDGIdentity);
                        }
                    }
                    else
                    {
                        throw new MissingMemberException(
                                  string.Format(Resources.MigrationVolumeToVolumeContainerMapNotFound,
                                                virtualDisk.DataContainerId, virtualDisk.InstanceId));
                    }
                }
            }

            foreach (var dataContainer in this.CloudConfigurations)
            {
                if (!dcDict.Keys.Contains(dataContainer.InstanceId))
                {
                    dcDict.Add(dataContainer.InstanceId,
                               new DataContainerInfo()
                    {
                        DcInfo            = dataContainer,
                        VirtualDiskGroups = new List <string>(),
                        Visited           = false
                    });
                }
            }

            DataContainerInfo[] dcArray = dcDict.Values.ToArray();

            // create an adjacency matrix of DCs
            bool[,] dcGraph = new bool[dcDict.Count, dcDict.Count];
            for (int row = 0; row < dcDict.Count; row++)
            {
                for (int col = 0; col < dcDict.Count; col++)
                {
                    dcGraph[row, col] = false;
                }
            }

            for (int row = 0; row < dcArray.Count(); row++)
            {
                DataContainerInfo currDc = dcArray[row];
                foreach (string groupInstanceID in currDc.VirtualDiskGroups)
                {
                    for (int col = 0; col < dcArray.Count(); col++)
                    {
                        DataContainerInfo otherDc = dcArray[col];
                        if (!currDc.DcInfo.InstanceId.Equals(otherDc.DcInfo.InstanceId) &&
                            // we're looking at the same vertex
                            !(dcGraph[row, col] && dcGraph[col, row])) // or the vertices are already known neighbours
                        {
                            if (otherDc.VirtualDiskGroups.Contains(groupInstanceID))
                            {
                                dcGraph[row, col] = true;
                                dcGraph[col, row] = true;
                            }
                        }
                    }
                }
            }

            // evaluate DCs connected by policies
            List <List <MigrationDataContainer> > connectedDCs = new List <List <MigrationDataContainer> >();

            for (int index = 0; index < dcArray.Count(); index++)
            {
                if (dcArray[index].Visited == false)
                {
                    connectedDCs.Add(RunDFS(dcGraph, dcArray, index, new List <MigrationDataContainer>()));
                }
            }

            return(connectedDCs);
        }