public Flow( Endpoint c, Endpoint h, string inputRecord, string[] inputTokens, int inputTokensLastHeaderIndex, OktofsRateController rateController) { if (c == null && h == null) throw new ArgumentOutOfRangeException(String.Format("Flow: both endpoints cannot be null.")); this.flowId = newFlowId++; this.vmName = (c != null ? c.SidOrAccount.ToLower() : h.SidOrAccount.ToLower()); this.hypervName = (c != null ? c.FilterServer.ToLower() : h.HyperVserver.ToLower()); this.shareName = (c != null ? c.ShareOrVolume.ToLower() : null); this.storageServerName = (h != null ? h.FilterServer.ToLower() : null); this.volumeName = (h != null ? h.ShareOrVolume.ToLower() : null); this.endpointC = c; this.endpointH = h; this.inputRecord = inputRecord; this.inputTokens = inputTokens; this.inputTokensLastHeaderIndex = inputTokensLastHeaderIndex; if (String.IsNullOrEmpty(vmName) || String.IsNullOrWhiteSpace(vmName)) throw new ArgumentOutOfRangeException(String.Format("Invalid arg vmName={0}", vmName)); if (String.IsNullOrEmpty(hypervName) || String.IsNullOrWhiteSpace(hypervName)) throw new ArgumentOutOfRangeException(String.Format("Invalid arg hypervName={0}", hypervName)); if (endpointC != null && (String.IsNullOrEmpty(shareName) || String.IsNullOrWhiteSpace(shareName))) throw new ArgumentOutOfRangeException(String.Format("Invalid arg shareName={0}", shareName)); if (endpointH != null && (String.IsNullOrEmpty(storageServerName) || String.IsNullOrWhiteSpace(storageServerName))) throw new ArgumentOutOfRangeException(String.Format("Invalid arg storageServerName={0}", storageServerName)); if (endpointH != null && (String.IsNullOrEmpty(volumeName) || String.IsNullOrWhiteSpace(volumeName))) throw new ArgumentOutOfRangeException(String.Format("Invalid arg volumeName={0}", volumeName)); if (inputTokensLastHeaderIndex < 4) throw new ArgumentOutOfRangeException(String.Format("Invalid arg inputTokensLastHeaderIndex too small {0}", inputTokensLastHeaderIndex)); }
/// <summary> /// Parses config file and returns list of Enpoints. /// </summary> /// <param name="fileName">Name of input file.</param> /// <param name="validTags">Acceptable input record types.</param> /// <returns>List containing one Endpoint for each input record.</returns> public List<Endpoint> ParseConfigFile(string fileName, string[] validTags) { List<Endpoint> listEndpoints = null; StreamReader streamIn = new StreamReader(fileName); string inputRecord; string[] separators = new string[] { " ", "\t" }; ValidateState(RateControllerState.Init, "ParseConfigFile"); while ((inputRecord = streamIn.ReadLine()) != null) { string[] inputTokens = inputRecord.Split(separators, StringSplitOptions.RemoveEmptyEntries); if (inputTokens.Length == 0) continue; else if (inputTokens[0].StartsWith(@"#") || inputTokens[0].StartsWith(@"//")) continue; else if (inputTokens[0].ToLower().Equals(Parameters.VOLNAME_ALIAS_REC_HEADER)) continue; else if (inputTokens.Length > 4 && IsValidTag(inputTokens[0], validTags) && !inputTokens[0].StartsWith("-") && (inputTokens[0].ToLower().Contains("-vm-share-vol") || inputTokens[0].ToLower().Contains("-vm-file-vol"))) { // // Parse records. // Each such record generates a Flow containing one or more queue : e.g. one at C and one at H. // string tag = inputTokens[0].ToLower(); string StageIds = tag.Substring(0, tag.IndexOf("-")); bool isOktofsC = StageIds.Contains("c"); bool isOktofsH = StageIds.Contains("h"); bool isIoFlowD = StageIds.Contains("d"); Endpoint endpointC = null; Endpoint endpointH = null; if (listEndpoints == null) listEndpoints = new List<Endpoint>(); string vmName = inputTokens[1]; string hypervName = inputTokens[2]; string shareName = inputTokens[3]; string volName = inputTokens[4]; // Windows keeps breaking our conf files by changing the volume names at H. // Provide an optional alias func based on share name to avoid admin chaos. volName = GetVolumeNameFromShareName(shareName, volName); if (!StageIds.Replace("c", "").Replace("h", "").Replace("d", "").Equals("")) { streamIn.Close(); streamIn = null; throw new ApplicationException(String.Format("input rec illegal prefix {0}", tag)); } if (vmName.Length > Parameters.OKTO_VM_NAME_MAX_CHARS) { streamIn.Close(); streamIn = null; throw new ApplicationException(String.Format("VmName too long {0}", vmName)); } if (shareName.Length > Parameters.OKTO_SHARE_NAME_MAX_CHARS) { streamIn.Close(); streamIn = null; throw new ApplicationException(String.Format("ShareName too long {0}", shareName)); } if (volName.Length > Parameters.OKTO_SHARE_NAME_MAX_CHARS) { streamIn.Close(); streamIn = null; throw new ApplicationException(String.Format("VolumeName too long {0}", volName)); } string storageServer = GetHostNameFromShareName(shareName); const int LastHeaderIndex = 4; // Index of last std header field in "ch-vm-share-vol" record. if (isOktofsC || isIoFlowD) { endpointC = new Endpoint(tag, hypervName, hypervName, vmName, shareName, NextEndpointKey++); listEndpoints.Add(endpointC); } if (isOktofsH) { endpointH = new Endpoint(tag, storageServer, hypervName, vmName, volName, NextEndpointKey++); listEndpoints.Add(endpointH); } Flow flow = new Flow(endpointC, endpointH, inputRecord, inputTokens, LastHeaderIndex, this); if (ListFlows == null) ListFlows = new List<Flow>(); ListFlows.Add(flow); } else if (IsValidTag(inputTokens[0], validTags)) { // Silently ignore tags that we don't understand if caller said they are valid. } else { string msg = String.Format("Illegal config file line: {0}", inputRecord); streamIn.Close(); streamIn = null; throw new ApplicationException(msg); } } streamIn.Close(); // // Plumb index values into ordered list of Endpoints. // if (listEndpoints != null) for (int i = 0; i < listEndpoints.Count; i++) listEndpoints[i].SetIndex(i); return listEndpoints; }
public static Endpoint[] ArrayEndpoints(SortedList<UInt64, Endpoint> listEndpoints) { Endpoint[] arrayEndpoints = new Endpoint[listEndpoints.Count]; int i = 0; foreach (Endpoint endpoint in listEndpoints.Values) arrayEndpoints[i++] = endpoint; return arrayEndpoints; }
private OktoQueue queue = null; // Queue attached to this entry. #endregion Fields #region Constructors internal RAP( Endpoint locEndpointDetails, Endpoint remEndpointDetails) { this.locEndpointDetails = locEndpointDetails; }