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); }
/// <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); }