1: using Ia.Ngn.Cl.Model.Data;
2: using System;
3: using System.Collections;
4: using System.Collections.Generic;
5: using System.Configuration;
6: using System.Data;
7: using System.Linq;
8: using System.Text.RegularExpressions;
9:
10: namespace Ia.Ngn.Cl.Model.Business.Nokia
11: {
12: ////////////////////////////////////////////////////////////////////////////
13:
14: /// <summary publish="true">
15: /// Access Management System (AMS) support class for Nokia's Optical Fiber Network (OFN) business model.
16: /// </summary>
17: ///
18: /// <value>
19: /// <appSettings>
20: /// <add key="amsServerHost" value="*" />
21: /// <add key="amsServerPort" value="*" />
22: /// <add key="amsServerActUser" value="ACT-USER:{amsName}:*:::*;" />
23: /// <add key="amsServerCancUser" value="CANC-USER:{amsName}:*:;" />
24: /// </appSettings>
25: /// </value>
26: ///
27: /// <remarks>
28: /// Copyright © 2007-2019 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
29: ///
30: /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
31: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
32: ///
33: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
34: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
35: ///
36: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
37: ///
38: /// Copyright notice: This notice may not be removed or altered from any source distribution.
39: /// </remarks>
40: public class Ams
41: {
42: // below: access data for Nokia AMS
43: private const string textToSkipInTelnetEndReceive = "IP 0\r\n<";
44: private static string lastSentCommand, receiveString;
45: private static string keepAliveCurrentAmsName = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltAmsNameList.PickRandom();
46:
47: private static readonly Procedure serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure = new Ia.Ngn.Cl.Model.Business.Procedure(24, Ia.Ngn.Cl.Model.Business.Provision._ServiceOntToCreateAndToDeleteInEmsOntSipInfoOrVoipPstnUserListFromThePastNHourList);
48: private static readonly Procedure serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure = new Ia.Ngn.Cl.Model.Business.Procedure(0, Ia.Ngn.Cl.Model.Business.Provision._ServiceOntToCreateAndToDeleteInEmsOntSipInfoOrVoipPstnUserListFromThePastNHourList);
49:
50: private static readonly Dictionary<string, int> associateServiceIdAndPortBetweenCreateAndReadDictionary = new Dictionary<string, int>();
51:
52: private static Dictionary<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont, bool> eventDictionary = new Dictionary<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont, bool>();
53:
54: private static readonly Queue<string> priorityAmsCommandQueue = new Queue<string>();
55: private static Queue<string> amsCommandQueue = new Queue<string>();
56: private static readonly Queue<string> amsCreateOntCommandQueue = new Queue<string>();
57:
58: private static Ia.Ngn.Cl.Model.Client.Nokia.Ams ams = new Ia.Ngn.Cl.Model.Client.Nokia.Ams();
59:
60: private static List<string> priorityServiceList = new List<string>();
61:
62: /// <summary/>
63: public enum AmsOpcode
64: {
65: RtrvHdr, RtrvOnt, InitSys, RtrvServiceVoip, RtrvOntPots, RtrvAlmPon, EdOntDesc1, EdOntDesc1Annul, EdOntPotsCustinfo
66: }
67:
68: /// <summary/>
69: public enum BellcoreState { Undefined = 0, IsNr = 1, OosAu, OosMa, OosAuma };
70:
71: /// <summary/>
72: public static string Host { get { return ConfigurationManager.AppSettings["amsServerHost"].ToString(); } }
73:
74: /// <summary/>
75: public static int Port { get { return int.Parse(ConfigurationManager.AppSettings["amsServerPort"].ToString()); } }
76:
77: /// <summary/>
78: public static string ActUser(string amsName)
79: {
80: return PrepareCtaggedCommand(ConfigurationManager.AppSettings["amsServerActUser"].ToString().Replace("{amsName}", amsName));
81: }
82:
83: /// <summary/>
84: public static string CancUser(string amsName)
85: {
86: return PrepareCtaggedCommand(ConfigurationManager.AppSettings["amsServerCancUser"].ToString().Replace("{amsName}", amsName));
87: }
88:
89: /// <summary/>
90: public static string TextToSkipInTelnetEndReceive { get { return textToSkipInTelnetEndReceive; } }
91:
92: ////////////////////////////////////////////////////////////////////////////
93:
94: /// <summary>
95: ///
96: /// </summary>
97: public Ams()
98: {
99: }
100:
101: ////////////////////////////////////////////////////////////////////////////
102:
103: /// <summary>
104: ///
105: /// </summary>
106: public static void Connect(out Ia.Cl.Model.Result result)
107: {
108: if (ams != null && !ams.IsConnected)
109: {
110: ams.Connect(out result);
111: }
112: else
113: {
114: result = new Ia.Cl.Model.Result();
115:
116: result.AddWarning("Warning: ams is already connected.");
117: }
118: }
119:
120: ////////////////////////////////////////////////////////////////////////////
121:
122: /// <summary>
123: ///
124: /// </summary>
125: public static void Disconnect(out Ia.Cl.Model.Result result)
126: {
127: if (ams != null && ams.IsConnected)
128: {
129: ams.Disconnect(out result);
130: }
131: else
132: {
133: result = new Ia.Cl.Model.Result();
134:
135: result.AddWarning("Warning: ams is already disconnected.");
136: }
137: }
138:
139: ////////////////////////////////////////////////////////////////////////////
140:
141: /// <summary>
142: ///
143: /// </summary>
144: public static void Login()
145: {
146: foreach (string amsName in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltAmsNameList)
147: {
148: ams.SendQueue.Enqueue(Ia.Ngn.Cl.Model.Business.Nokia.Ams.ActUser(amsName));
149: }
150: }
151:
152: ////////////////////////////////////////////////////////////////////////////
153:
154: /// <summary>
155: ///
156: /// </summary>
157: public static void Logout()
158: {
159: foreach (string amsName in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltAmsNameList)
160: {
161: ams.SendQueue.Enqueue(Ia.Ngn.Cl.Model.Business.Nokia.Ams.CancUser(amsName));
162: }
163: }
164:
165: ////////////////////////////////////////////////////////////////////////////
166:
167: /// <summary>
168: ///
169: /// </summary>
170: public static Queue<string> ReceiveQueue
171: {
172: get
173: {
174: return ams.ReceiveQueue;
175: }
176: }
177:
178: ////////////////////////////////////////////////////////////////////////////
179:
180: /// <summary>
181: ///
182: /// </summary>
183: public static Queue<string> SendQueue
184: {
185: get
186: {
187: return ams.SendQueue;
188: }
189: }
190:
191: ////////////////////////////////////////////////////////////////////////////
192:
193: /// <summary>
194: ///
195: /// </summary>
196: public static bool IsConnected
197: {
198: get
199: {
200: return ams != null && ams.IsConnected;
201: }
202: }
203:
204: ////////////////////////////////////////////////////////////////////////////
205:
206: /// <summary>
207: ///
208: /// </summary>
209: public static bool IsLoggedIn
210: {
211: get
212: {
213: return ams.IsLoggedIn;
214: }
215: }
216:
217: ////////////////////////////////////////////////////////////////////////////
218:
219: /// <summary>
220: ///
221: /// </summary>
222: public static void Dispose()
223: {
224: ams.Dispose();
225: }
226:
227: ////////////////////////////////////////////////////////////////////////////
228: ////////////////////////////////////////////////////////////////////////////
229:
230: /// <summary>
231: ///
232: /// </summary>
233: public static Ia.Cl.Model.Result ManageReceiveQueue()
234: {
235: bool isUpdated;
236: string rowString, formattedString;
237: Ia.Cl.Model.Result updateDatabaseWithAmsCommandOutputResult;
238:
239: var result = new Ia.Cl.Model.Result();
240:
241: try
242: {
243: while (ReceiveQueue.Count > 0)
244: {
245: rowString = ReceiveQueue.Dequeue();
246:
247: formattedString = Ia.Cl.Model.Telnet.FormatAndCleanData(rowString);
248:
249: isUpdated = Ia.Ngn.Cl.Model.Business.Nokia.Ams.UpdateDatabaseWithAmsCommandOutput(formattedString, out updateDatabaseWithAmsCommandOutputResult);
250:
251: if (updateDatabaseWithAmsCommandOutputResult.IsSuccessful && !updateDatabaseWithAmsCommandOutputResult.HasWarning)
252: {
253: result.AddSuccess(updateDatabaseWithAmsCommandOutputResult.Message + ": formattedString: [" + formattedString + "]");
254: }
255: else
256: {
257: result.AddError("ManageReceiveQueue(): formattedString: [" + formattedString + "]");
258: }
259:
260: if (result.IsSuccessful)
261: {
262: AnalyzeReceivedData(formattedString);
263: }
264: else
265: {
266: }
267: }
268: }
269: catch (Exception ex)
270: {
271: result.AddError("ManageReceiveQueue: Exception: " + ex.Message);
272: }
273:
274: return result;
275: }
276:
277: ////////////////////////////////////////////////////////////////////////////
278:
279: /// <summary>
280: ///
281: /// </summary>
282: private static void AnalyzeReceivedData(string data)
283: {
284: string lastSentCommandWithoutSemiColon;
285:
286: //lastCommandEchoedBack = true;
287:
288: if (data.Contains("COMPLD"))
289: {
290: if (lastSentCommand != null)
291: {
292: lastSentCommandWithoutSemiColon = lastSentCommand.Replace(";", "");
293:
294: // below: detect the activation of user
295: // debug
296: //activated = true;
297: //if (lastSentCommand == Ia.Ngn.Cl.Model.Business.Nokia.Ams.ActUser(olt.AmsName)) activated = true;
298: //else if (lastSentCommand == Ia.Ngn.Cl.Model.Business.Nokia.Ams.CancUser(olt.AmsName)) activated = false;
299:
300: /*
301: if (data.Contains(lastSentCommandWithoutSemiColon)) lastCommandEchoedBack = true;
302: else
303: {
304: //lastCommandEchoBackCounter = 5;
305: lastCommandEchoedBack = false;
306: }
307: */
308: }
309: }
310: else if (data.Contains("DENY")) { }
311: else if (data.Contains(Ia.Ngn.Cl.Model.Business.Nokia.Ams.TextToSkipInTelnetEndReceive)) { }
312: else if (data == "\r\n<") { }
313: /*
314: else
315: {
316: lastCommandEchoBackCounter = 5;
317: lastCommandEchoedBack = false;
318: }
319: */
320: }
321:
322: ////////////////////////////////////////////////////////////////////////////
323:
324: /// <summary>
325: ///
326: /// </summary>
327: public static string ManageSendQueue(out Ia.Cl.Model.Result result)
328: {
329: var command = string.Empty;
330: result = new Ia.Cl.Model.Result();
331:
332: try
333: {
334: if (ams.SendQueue.Count > 0)
335: {
336: command = ams.SendQueue.Dequeue();
337:
338: ams.Send(command, out Ia.Cl.Model.Result r);
339:
340: if (r.IsSuccessful) result.AddSuccess(r.Message);
341: else result.AddError(r.Message);
342: }
343: }
344: catch (Exception ex)
345: {
346: result.AddError("ManageSendQueue(): Exception: " + ex.Message);
347: }
348:
349: return result.IsSuccessful ? command : string.Empty;
350: }
351:
352: ////////////////////////////////////////////////////////////////////////////
353:
354: /// <summary>
355: ///
356: /// </summary>
357: public static Ia.Cl.Model.Result ManageSynchronizationBetweenAccessAndSwitchPast24Hours()
358: {
359: // See: ManageSynchronizationBetweenAccessAndSwitchPastHour(), ManageSynchronizationBetweenAccessAndSwitchPast24Hours(), ManageSynchronizationBetweenAccessAndSwitch()
360:
361: Ia.Ngn.Cl.Model.Business.Procedure.Process process;
362:
363: var result = new Ia.Cl.Model.Result();
364:
365: process = serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.NextProcess(priorityServiceList);
366:
367: if (priorityServiceList.Count > 50) priorityServiceList.Clear();
368:
369: if (process.Type != Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.None)
370: {
371: if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Create)
372: {
373: result.AddSuccess("create: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.ProgressCounterString);
374:
375: //CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
376: }
377: else if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Read)
378: {
379: result.AddSuccess("read: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.ProgressCounterString);
380:
381: //ReadOntSipInfoOrVoipPstnUser(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
382: }
383: else if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Delete)
384: {
385: result.AddSuccess("delete: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.ProgressCounterString);
386:
387: //_ = VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
388: }
389: else result.AddError("sync: undefined procedure. ");
390:
391: // Ia.Ngn.Cl.Model.Data.Msmq.SecretaryApplication.Updated() is in Ia.Ngn.Cl.Model.Business.Nokia.Ams.UpdateDatabaseWithEmsCommandOutput();
392: }
393: else result.AddWarning("sync: undefined"); // nothing to create or delete");
394:
395: return result;
396: }
397:
398: ////////////////////////////////////////////////////////////////////////////
399:
400: /// <summary>
401: ///
402: /// </summary>
403: public static Ia.Cl.Model.Result ManageSynchronizationBetweenAccessAndSwitch()
404: {
405: // See: ManageSynchronizationBetweenAccessAndSwitchPastHour(), ManageSynchronizationBetweenAccessAndSwitchPast24Hours(), ManageSynchronizationBetweenAccessAndSwitch()
406:
407: Ia.Ngn.Cl.Model.Business.Procedure.Process process;
408:
409: var result = new Ia.Cl.Model.Result();
410:
411: // problem: I have put empty new List<string>() here because there is an exception: System.Exception: Undefined function
412: process = serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.NextProcess(new List<string>());
413:
414: if (process.Type != Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.None)
415: {
416: if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Create)
417: {
418: result.AddSuccess("create: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.ProgressCounterString);
419:
420: //CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
421: }
422: else if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Read)
423: {
424: result.AddSuccess("read: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.ProgressCounterString);
425:
426: //ReadOntSipInfoOrVoipPstnUser(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
427: }
428: else if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Delete)
429: {
430: result.AddSuccess("delete: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.ProgressCounterString);
431:
432: //_ = VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
433: }
434: else result.AddError("sync: undefined procedure. ");
435:
436: // Ia.Ngn.Cl.Model.Data.Msmq.SecretaryApplication.Updated() is in Ia.Ngn.Cl.Model.Business.Nokia.Ams.UpdateDatabaseWithEmsCommandOutput();
437: }
438: else result.AddWarning("sync: undefined"); // nothing to create or delete");
439:
440: return result;
441: }
442:
443: ////////////////////////////////////////////////////////////////////////////
444: ////////////////////////////////////////////////////////////////////////////
445:
446: /*
447: ////////////////////////////////////////////////////////////////////////////
448: ////////////////////////////////////////////////////////////////////////////
449:
450: /// <summary>
451: ///
452: /// </summary>
453: public static void CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, string accessName, int port, out Ia.Cl.Model.Result result)
454: {
455: int serviceType;
456: string serviceId;
457: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
458:
459: result = new Ia.Cl.Model.Result();
460:
461: serviceType = Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService;
462:
463: try
464: {
465: if (!string.IsNullOrEmpty(service))
466: {
467: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
468: {
469: serviceId = Ia.Ngn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
470:
471: if (!string.IsNullOrEmpty(accessName))
472: {
473: nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
474:
475: if (nddOnt != null)
476: {
477: Ia.Ngn.Cl.Model.Business.Nokia.Ams.CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, nddOnt, port, ref result);
478: }
479: else result.AddError("NDD ONT is null for access name: " + accessName + ".");
480: }
481: else result.AddError("AccessName null or empty.");
482: }
483: else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
484: }
485: else result.AddError("Service null or empty.");
486: }
487: catch (Exception ex)
488: {
489: result.AddError("Exception: " + ex.ToString() + ".");
490: }
491: }
492:
493: ////////////////////////////////////////////////////////////////////////////
494:
495: /// <summary>
496: ///
497: /// </summary>
498: public static void CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, int port, ref Ia.Cl.Model.Result result)
499: {
500: Ia.Ngn.Cl.Model.Business.Nokia.Default.FnSnPnPort fnSnPnPort;
501: Ia.Ngn.Cl.Model.Business.Nokia.Dev.MduDev mduDev;
502: Ia.Ngn.Cl.Model.Ont ont;
503:
504: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
505: {
506: if (nddOnt != null)
507: {
508: if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
509: {
510: ont = Ia.Ngn.Cl.Model.Data.Nokia.Ont.ReadIncludeAccess(nddOnt.Id);
511:
512: if (ont != null)
513: {
514: if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
515: {
516: if (ont.FamilyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
517: {
518: var accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
519:
520: if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
521: {
522: mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
523:
524: var vacantFnSnPnList = Ia.Ngn.Cl.Model.Data.Nokia.Ams.VacantMduFnSnPnForOntList(mduDev, ont);
525:
526: if (vacantFnSnPnList.Count > 0)
527: {
528: if (port != Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
529: {
530: fnSnPnPort = vacantFnSnPnList.Where(f => f.Port == port).SingleOrDefault();
531: }
532: else fnSnPnPort = Ia.Ngn.Cl.Model.Data.Nokia.Ams.NextVacantMduFnSnPnForOnt(mduDev, ont);
533:
534: if (fnSnPnPort != null)
535: {
536: var emsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
537:
538: if (emsVoipPstnUserList.Count == 0)
539: {
540: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendCreateVoipPstnUser(ems, mduDev, nddOnt, service, fnSnPnPort.Sn, fnSnPnPort.Pn);
541:
542: if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
543: {
544: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendCreateVoipPstnAccount(ems, mduDev, nddOnt, service, fnSnPnPort.Sn, fnSnPnPort.Pn);
545: }
546:
547: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, mduDev);
548:
549: associateServiceIdAndPortBetweenCreateAndReadDictionary[service] = fnSnPnPort.Port;
550:
551: result.AddSuccess("command(s) sent...");
552: }
553: else result.AddError("emsVoipPstnUserList count != 0. Value must be zero before the operation is executed for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
554: }
555: else result.AddError("MDU sn and/or tel is invalid or does not exist.");
556: }
557: else result.AddError("vacantFnSnPnList.Count is 0. There are no vacant ports in MDU.");
558: }
559: else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
560: }
561: else // SFU
562: {
563: var vacantList = Ia.Ngn.Cl.Model.Data.Nokia.Ams.VacantTelForOntList(ont);
564:
565: if (port != Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
566: {
567: port = vacantList.Contains(port) ? port : Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown;
568: }
569: else port = Ia.Ngn.Cl.Model.Data.Nokia.Ams.NextVacantTelForOnt(ont);
570:
571: if (port != Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
572: {
573: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendCreateOntSipInfo(ems, nddOnt, service, port);
574:
575: // Don't use SAVE-DEV here
576: //Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, ont.EmsPort.EmsBoard.EmsDev);
577:
578: associateServiceIdAndPortBetweenCreateAndReadDictionary[service] = port;
579:
580: result.AddSuccess("command(s) sent...");
581: }
582: else result.AddError("port is invalid or does not exist.");
583: }
584: }
585: else result.AddError("OLT is not SIP, its H.248.");
586: }
587: else result.AddError("ont is null, does not exist for access: " + nddOnt.Access.Name + ".");
588: }
589: else result.AddError("access is not in an allowed to be provisioned OLT: " + nddOnt.Access.Name + ".");
590: }
591: else result.AddError("nddOnt is null, does not exist for service: " + service + ".");
592: }
593: else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
594: }
595:
596: ////////////////////////////////////////////////////////////////////////////
597:
598: /// <summary>
599: ///
600: /// </summary>
601: public static void ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, out Ia.Cl.Model.Result result)
602: {
603: ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, string.Empty, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, out result);
604: }
605:
606: ////////////////////////////////////////////////////////////////////////////
607:
608: /// <summary>
609: ///
610: /// </summary>
611: public static void ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, string accessName, int port, out Ia.Cl.Model.Result result)
612: {
613: int serviceType;
614: string serviceId;
615:
616: result = new Ia.Cl.Model.Result();
617:
618: serviceType = Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService;
619:
620: try
621: {
622: if (!string.IsNullOrEmpty(service))
623: {
624: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
625: {
626: serviceId = Ia.Ngn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
627:
628: if (!string.IsNullOrEmpty(accessName))
629: {
630: var nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
631:
632: if (nddOnt != null)
633: {
634: Ia.Ngn.Cl.Model.Business.Nokia.Ams.ReadOntSipInfoOrVoipPstnUser(service, nddOnt, port, ref result);
635: }
636: else result.AddError("NDD ONT is null for access name: " + accessName + ".");
637: }
638: else
639: {
640: Ia.Ngn.Cl.Model.Business.Nokia.Ams.ReadOntSipInfoOrVoipPstnUser(service, null, port, ref result);
641: }
642: }
643: else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
644: }
645: else result.AddError("Service null or empty.");
646: }
647: catch (Exception ex)
648: {
649: result.AddError("Exception: " + ex.ToString() + ".");
650: }
651: }
652:
653: ////////////////////////////////////////////////////////////////////////////
654:
655: /// <summary>
656: ///
657: /// </summary>
658: public static void ReadOntSipInfoOrVoipPstnUser(string service, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, int port, ref Ia.Cl.Model.Result result)
659: {
660: Ia.Ngn.Cl.Model.Business.Nokia.Dev.MduDev mduDev;
661: Ia.Ngn.Cl.Model.Ont ont;
662:
663: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
664: {
665: if (nddOnt != null)
666: {
667: ont = Ia.Ngn.Cl.Model.Data.Nokia.Ont.Read(nddOnt.Id);
668:
669: if (ont != null)
670: {
671: if (ont.FamilyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
672: {
673: var accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
674:
675: if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
676: {
677: mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
678:
679: if (port != Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
680: {
681: var fnSnPnPort = mduDev.PossibleFnSnPnPortList.Where(f => f.Port == port).SingleOrDefault();
682:
683: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
684: }
685: else if (associateServiceIdAndPortBetweenCreateAndReadDictionary.ContainsKey(service))
686: {
687: port = associateServiceIdAndPortBetweenCreateAndReadDictionary[service];
688:
689: var fnSnPnPort = mduDev.PossibleFnSnPnPortList.Where(f => f.Port == port).SingleOrDefault();
690:
691: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
692: }
693: else
694: {
695: foreach (var fnSnPnPort in mduDev.PossibleFnSnPnPortList)
696: {
697: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
698: }
699: }
700:
701: result.AddSuccess("command(s) sent...");
702: }
703: else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
704: }
705: else // SFU
706: {
707: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadOntSipInfo(ems, nddOnt);
708:
709: result.AddSuccess("command(s) sent...");
710: }
711: }
712: else result.AddError("ont is null, does not exist for access: " + nddOnt.Access.Name + ".");
713: }
714: else
715: {
716: var emsOntSipInfoList = Ia.Ngn.Cl.Model.Data.Nokia.OntSipInfo.ReadByServiceIncludeEmsOntAndAccess(service);
717:
718: if (emsOntSipInfoList.Count > 0)
719: {
720: // SFU
721:
722: foreach (var emsOntSipInfo in emsOntSipInfoList)
723: {
724: ont = emsOntSipInfo.EmsOnt;
725:
726: if (ont.Access != null)
727: {
728: nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
729:
730: if (nddOnt != null)
731: {
732: if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
733: {
734: if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
735: {
736: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadOntSipInfo(ems, nddOnt);
737:
738: result.AddSuccess("command(s) sent...");
739: }
740: else result.AddError("OLT is not SIP, its H.248.");
741: }
742: else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
743: }
744: else result.AddError("nddOnt is null, does not exist for service " + service + ".");
745: }
746: else result.AddError("ont.Access is null for service " + service + ".");
747: }
748: }
749:
750:
751: var emsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
752:
753: if (emsVoipPstnUserList.Count > 0)
754: {
755: // MDU
756:
757: foreach (var emsVoipPstnUser in emsVoipPstnUserList)
758: {
759: ont = emsVoipPstnUser.EmsOnt;
760:
761: if (ont.Access != null)
762: {
763: nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
764:
765: if (nddOnt != null)
766: {
767: if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
768: {
769: if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
770: {
771: if (ont.FamilyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
772: {
773: var accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
774:
775: if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
776: {
777: mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
778:
779: foreach (var fnSnPnPort in mduDev.PossibleFnSnPnPortList)
780: {
781: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
782:
783: result.AddSuccess("command(s) sent...");
784: }
785: }
786: else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
787: }
788: else result.AddError("ONT family type is not MDU.");
789: }
790: else result.AddError("OLT is not SIP, its H.248.");
791: }
792: else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
793: }
794: else result.AddError("nddOnt is null, does not exist for service " + service + ".");
795: }
796: else result.AddError("ont.Access is null for service " + service + ".");
797: }
798:
799:
800: var msanEmsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByMsanService(service);
801:
802: if (msanEmsVoipPstnUserList.Count > 0)
803: {
804: // MSAN
805:
806: foreach (var emsVoipPstnUser in msanEmsVoipPstnUserList)
807: {
808: ReadVoipPstnUser(emsVoipPstnUser.DID, emsVoipPstnUser.FN, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
809: }
810:
811: result.AddSuccess("command(s) sent...");
812: }
813: }
814: }
815: }
816: else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
817: }
818:
819: ////////////////////////////////////////////////////////////////////////////
820:
821: /// <summary>
822: ///
823: /// </summary>
824: public static string DeleteOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, string accessName, int port, out Ia.Cl.Model.Result result)
825: {
826: int serviceType;
827: string serviceId, vacatedAccessName;
828: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont vacatedNddOnt;
829:
830: result = new Ia.Cl.Model.Result();
831:
832: serviceType = Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService;
833:
834: vacatedAccessName = string.Empty;
835:
836: try
837: {
838: if (!string.IsNullOrEmpty(service))
839: {
840: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
841: {
842: serviceId = Ia.Ngn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
843:
844: if (!string.IsNullOrEmpty(accessName))
845: {
846: var nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
847:
848: if (nddOnt != null)
849: {
850: vacatedNddOnt = Ia.Ngn.Cl.Model.Business.Nokia.Ams.VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(service, nddOnt, port, ref result);
851:
852: vacatedAccessName = (vacatedNddOnt != null) ? vacatedNddOnt.Access.Name : string.Empty;
853: }
854: else result.AddError("NDD ONT is null for access name: " + accessName + ".");
855: }
856: else if (port == Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
857: {
858: vacatedNddOnt = Ia.Ngn.Cl.Model.Business.Nokia.Ams.VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(service, null, port, ref result);
859:
860: vacatedAccessName = (vacatedNddOnt != null) ? vacatedNddOnt.Access.Name : string.Empty;
861: }
862: else result.AddError("accessName is empty or null and port is not PortUndefinedOrInvalidOrUnknown. NCE does not know how to handle vacation where nddOnt is null and port is defined.");
863: }
864: else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
865: }
866: else result.AddError("Service null or empty.");
867: }
868: catch (Exception ex)
869: {
870: result.AddError("Exception: " + ex.ToString() + ".");
871: }
872:
873: return vacatedAccessName;
874: }
875:
876: ////////////////////////////////////////////////////////////////////////////
877:
878: /// <summary>
879: ///
880: /// </summary>
881: public static Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(string service, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, int port, ref Ia.Cl.Model.Result result)
882: {
883: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont vacatedNddOnt;
884: Ia.Ngn.Cl.Model.Business.Nokia.Dev.MduDev mduDev;
885: Ia.Ngn.Cl.Model.Ont ont;
886:
887: vacatedNddOnt = nddOnt;
888:
889: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
890: {
891: if (nddOnt != null)
892: {
893: if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
894: {
895: if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
896: {
897: ont = Ia.Ngn.Cl.Model.Data.Nokia.Ont.ReadIncludeAccess(nddOnt.Id);
898:
899: if (ont.FamilyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
900: {
901: var accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
902:
903: if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
904: {
905: mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
906:
907: if (port == Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
908: {
909: var emsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
910:
911: foreach (var emsVoipPstnUser in emsVoipPstnUserList)
912: {
913: if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
914: {
915: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
916: }
917:
918: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
919:
920: result.AddSuccess("command(s) sent...");
921: }
922: }
923: else
924: {
925: var fnSnPnPort = mduDev.PossibleFnSnPnPortList.Where(f => f.Port == port).SingleOrDefault();
926:
927: if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
928: {
929: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, mduDev, nddOnt, service, mduDev.FirstFnSnPnPort.Sn, fnSnPnPort.Pn);
930: }
931:
932: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, mduDev, nddOnt, service, mduDev.FirstFnSnPnPort.Sn, fnSnPnPort.Pn);
933:
934: result.AddSuccess("command(s) sent...");
935: }
936:
937: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, mduDev);
938: }
939: else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service " + service + " and access " + nddOnt.Access.Name + ".");
940: }
941: else // SFU
942: {
943: if (port == Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
944: {
945: var emsOntSipInfoList = Ia.Ngn.Cl.Model.Data.Nokia.OntSipInfo.ReadByService(service);
946:
947: foreach (var emsOntSipInfo in emsOntSipInfoList)
948: {
949: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateOntSipInfo(ems, nddOnt, service, emsOntSipInfo.TEL);
950: }
951:
952: result.AddSuccess("command(s) sent...");
953: }
954: else
955: {
956: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateOntSipInfo(ems, nddOnt, service, port);
957:
958: result.AddSuccess("command(s) sent...");
959: }
960: }
961: }
962: else result.AddError("OLT is not SIP, its H.248.");
963: }
964: else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
965: }
966: else
967: {
968: var emsOntSipInfoList = Ia.Ngn.Cl.Model.Data.Nokia.OntSipInfo.ReadByServiceIncludeEmsOntAndAccess(service);
969:
970: if (emsOntSipInfoList.Count > 0)
971: {
972: // SFU
973:
974: foreach (var emsOntSipInfo in emsOntSipInfoList)
975: {
976: ont = emsOntSipInfo.EmsOnt;
977:
978: if (ont.Access != null)
979: {
980: nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
981:
982: if (nddOnt != null)
983: {
984: if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
985: {
986: if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
987: {
988: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateOntSipInfo(ems, nddOnt, service, emsOntSipInfo.TEL);
989:
990: result.AddSuccess("command(s) sent...");
991: }
992: else result.AddError("OLT is not SIP, its H.248.");
993: }
994: else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
995: }
996: else result.AddError("nddOnt is null, does not exist for service " + service + ".");
997:
998: vacatedNddOnt = nddOnt;
999: }
1000: else result.AddError("ont.Access is null for service " + service + ".");
1001: }
1002: }
1003:
1004:
1005: var emsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
1006:
1007: if (emsVoipPstnUserList.Count > 0)
1008: {
1009: // MDU
1010:
1011: foreach (var emsVoipPstnUser in emsVoipPstnUserList)
1012: {
1013: ont = emsVoipPstnUser.EmsOnt;
1014:
1015: if (ont.Access != null)
1016: {
1017: nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
1018:
1019: if (nddOnt != null)
1020: {
1021: if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
1022: {
1023: if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
1024: {
1025: if (ont.FamilyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
1026: {
1027: var accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
1028:
1029: if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
1030: {
1031: mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
1032:
1033: if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
1034: {
1035: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
1036: }
1037:
1038: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
1039:
1040: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, mduDev);
1041:
1042: result.AddSuccess("command(s) sent...");
1043: }
1044: else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
1045: }
1046: else result.AddError("ONT family type is not MDU.");
1047: }
1048: else result.AddError("OLT is not SIP, its H.248.");
1049: }
1050: else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
1051: }
1052: else result.AddError("nddOnt is null, does not exist for service " + service + ".");
1053:
1054: vacatedNddOnt = nddOnt;
1055: }
1056: else result.AddError("ont.Access is null for service " + service + ".");
1057: }
1058: }
1059: else
1060: {
1061: var msanEmsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByMsanService(service);
1062:
1063: if (msanEmsVoipPstnUserList.Count > 0)
1064: {
1065: // MSAN
1066:
1067: foreach (var emsVoipPstnUser in msanEmsVoipPstnUserList)
1068: {
1069: DeleteVoipPstnUserAndOrVacateVoipPstnAccount(emsVoipPstnUser.DID, emsVoipPstnUser.FN, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
1070: }
1071:
1072: result.AddSuccess("command(s) sent...");
1073: }
1074: else result.AddWarning("Could not find service " + service + ".");
1075: }
1076: }
1077: }
1078: else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
1079:
1080: return vacatedNddOnt;
1081: }
1082:
1083: ////////////////////////////////////////////////////////////////////////////
1084:
1085: /// <summary>
1086: ///
1087: /// </summary>
1088: public static List<Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic> DeleteMsanVoipPstnUser2(string service, out Ia.Cl.Model.Result result)
1089: {
1090: Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic lic;
1091:
1092: result = new Ia.Cl.Model.Result();
1093:
1094: var licList = new List<Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic>();
1095:
1096: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
1097: {
1098: var msanEmsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByMsanService(service);
1099:
1100: if (msanEmsVoipPstnUserList.Count > 0)
1101: {
1102: // MSAN
1103:
1104: foreach (var emsVoipPstnUser in msanEmsVoipPstnUserList)
1105: {
1106: DeleteVoipPstnUserAndOrVacateVoipPstnAccount(emsVoipPstnUser.DID, emsVoipPstnUser.FN, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
1107:
1108: lic = Ia.Ngn.Cl.Model.Data.Nokia.Default.MsanDevLicByEmsVoipPstnUserId(emsVoipPstnUser.Id);
1109:
1110: licList.Add(lic);
1111: }
1112:
1113: result.AddSuccess("command(s) sent...");
1114: }
1115: else result.AddWarning("Could not find service " + service + ".");
1116: }
1117: else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
1118:
1119: return licList;
1120: }
1121:
1122: ////////////////////////////////////////////////////////////////////////////
1123:
1124: /// <summary>
1125: ///
1126: /// </summary>
1127: public static void DeleteVoipPstnUserAndOrVacateVoipPstnAccount(string dev, int fn, int sn, int pn)
1128: {
1129: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, dev, fn, sn, pn);
1130:
1131: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, dev, fn, sn, pn);
1132:
1133: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, dev);
1134: }
1135:
1136: ////////////////////////////////////////////////////////////////////////////
1137:
1138: /// <summary>
1139: ///
1140: /// </summary>
1141: private static void DeleteVoipPstnUserAndOrVacateVoipPstnAccount(int did, int fn, int sn, int pn)
1142: {
1143: var dev = Ia.Ngn.Cl.Model.Data.Nokia.Dev.DidToDevDictionary[did];
1144:
1145: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, dev, fn, sn, pn);
1146:
1147: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, dev, fn, sn, pn);
1148:
1149: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, dev);
1150: }
1151:
1152: ////////////////////////////////////////////////////////////////////////////
1153: ////////////////////////////////////////////////////////////////////////////
1154:
1155: /// <summary>
1156: ///
1157: /// </summary>
1158: public static Ia.Cl.Model.Result CreateMsanVoipPstnUser(string msanDevId, int fn, int sn, int pn, string service)
1159: {
1160: Ia.Ngn.Cl.Model.Business.Nokia.Default.FnSnPnPort fnSnPn;
1161:
1162: var result = new Ia.Cl.Model.Result();
1163:
1164: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
1165: {
1166: var msanDev = (from m in Ia.Ngn.Cl.Model.Data.Nokia.Default.MsanDevList where m.Id == msanDevId select m).Single();
1167:
1168: var vacantFnSnPnList = Ia.Ngn.Cl.Model.Data.Nokia.Ams.VacantMsanFnSnPnListForMsanDev(msanDev);
1169:
1170: if (vacantFnSnPnList.Count > 0)
1171: {
1172: fnSnPn = vacantFnSnPnList.Where(f => f.Fn == fn && f.Sn == sn && f.Pn == pn).SingleOrDefault();
1173:
1174: if (fnSnPn == null) fnSnPn = Ia.Ngn.Cl.Model.Data.Nokia.Ams.NextVacantMsanFnSnPnForMsanDev(msanDev);
1175:
1176: if (fnSnPn != null)
1177: {
1178: var emsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
1179:
1180: if (emsVoipPstnUserList.Count == 0)
1181: {
1182: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendCreateMsanVoipPstnUser(ems, msanDev, fnSnPn.Fn, fnSnPn.Sn, fnSnPn.Pn, service);
1183:
1184: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, msanDev);
1185:
1186: result.AddSuccess("command(s) sent...");
1187: }
1188: else result.AddError("emsVoipPstnUserList count != 0. Value must be zero before the operation is executed for service: " + service + ".");
1189: }
1190: else result.AddError("MDU sn and/or tel is invalid or does not exist.");
1191: }
1192: else result.AddError("vacantFnSnPnList.Count is 0. There are no vacant ports in MSAN.");
1193: }
1194: else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
1195:
1196: return result;
1197: }
1198:
1199: ////////////////////////////////////////////////////////////////////////////
1200:
1201: /// <summary>
1202: ///
1203: /// </summary>
1204: public static void ReadVoipPstnUser(string dev, int fn, int sn, int pn)
1205: {
1206: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, dev, sn, pn);
1207: }
1208:
1209: ////////////////////////////////////////////////////////////////////////////
1210:
1211: /// <summary>
1212: ///
1213: /// </summary>
1214: public static void ReadMsanVoipPstnUser(Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic lic)
1215: {
1216: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, lic.MsanDevDev, lic.Sn, lic.Pn);
1217: }
1218:
1219: ////////////////////////////////////////////////////////////////////////////
1220:
1221: /// <summary>
1222: ///
1223: /// </summary>
1224: public static void ReadVoipPstnUser(string service)
1225: {
1226: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, service);
1227: }
1228:
1229: ////////////////////////////////////////////////////////////////////////////
1230:
1231: /// <summary>
1232: ///
1233: /// </summary>
1234: private static void ReadVoipPstnUser(int did, int fn, int sn, int pn)
1235: {
1236: var dev = Ia.Ngn.Cl.Model.Data.Nokia.Dev.DidToDevDictionary[did];
1237:
1238: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, dev, sn, pn);
1239: }
1240:
1241: ////////////////////////////////////////////////////////////////////////////
1242:
1243: /// <summary>
1244: ///
1245: /// </summary>
1246: public static void DeleteVoipPstnUser(string dev, int fn, int sn, int pn)
1247: {
1248: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, dev, fn, sn, pn);
1249:
1250: Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, dev);
1251: }
1252:
1253: ////////////////////////////////////////////////////////////////////////////
1254:
1255: /// <summary>
1256: ///
1257: /// </summary>
1258: public static List<Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic> DeleteMsanVoipPstnUser(string service, out Ia.Cl.Model.Result result)
1259: {
1260: var licList = new List<Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic>();
1261:
1262: result = new Ia.Cl.Model.Result();
1263:
1264: try
1265: {
1266: if (!string.IsNullOrEmpty(service))
1267: {
1268: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
1269: {
1270: licList = Ia.Ngn.Cl.Model.Business.Nokia.Nce.DeleteMsanVoipPstnUser2(service, out result);
1271: }
1272: else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
1273: }
1274: else result.AddError("Service null or empty.");
1275: }
1276: catch (Exception ex)
1277: {
1278: result.AddError("Exception: " + ex.ToString() + ".");
1279: }
1280:
1281: return licList;
1282: }
1283: */
1284:
1285: ////////////////////////////////////////////////////////////////////////////
1286: ////////////////////////////////////////////////////////////////////////////
1287:
1288: /// <summary>
1289: ///
1290: /// </summary>
1291: public static Ia.Cl.Model.Result ResetOntInEventsWithClassOntAndCauseInactAndSeverityNotClInLast24HoursList()
1292: {
1293: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont;
1294: List<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> ontResetSentList;
1295: Dictionary<string, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> ontIdToOntDictionary;
1296:
1297: var result = new Ia.Cl.Model.Result();
1298:
1299: ontResetSentList = new List<Cl.Model.Business.NetworkDesignDocument.Ont>();
1300:
1301: var events = Ia.Ngn.Cl.Model.Data.Event.EventWithClassOntAndCauseInactAndLastRecordSeverityNotClAndOntAccessNotNullInLast24HoursList();
1302: ontIdToOntDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdToOntDictionary;
1303:
1304: if (events.Count > 0)
1305: {
1306: foreach (var @event in events)
1307: {
1308: if (ontIdToOntDictionary.ContainsKey(@event.Ont.Id))
1309: {
1310: ont = ontIdToOntDictionary[@event.Ont.Id];
1311:
1312: if (!eventDictionary.ContainsKey(ont))
1313: {
1314: eventDictionary[ont] = false;
1315: }
1316: }
1317: }
1318: }
1319: else
1320: {
1321:
1322: }
1323:
1324: foreach (KeyValuePair<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont, bool> kvp in eventDictionary)
1325: {
1326: if (!kvp.Value)
1327: {
1328: ams.SendQueue.Enqueue(Ia.Ngn.Cl.Model.Business.Nokia.Ams.ResetOntCommand(kvp.Key));
1329:
1330: if (result.IsSuccessful) ontResetSentList.Add(kvp.Key);
1331: }
1332: }
1333:
1334: return result;
1335: }
1336:
1337: ////////////////////////////////////////////////////////////////////////////
1338:
1339: /// <summary>
1340: /// Enqueue all ONTs within the eventDictionary to make sure we read their state after the reset
1341: /// </summary>
1342: public static void EnqueueOntWithinEventDictionary()
1343: {
1344: foreach (KeyValuePair<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont, bool> kvp in eventDictionary)
1345: {
1346: //if (!kvp.Value)
1347: //{
1348: // this will read all reset ONT all day until eventDictionary is cleared.
1349: // eventDictionary[kvp.Value] = true;
1350:
1351: Ia.Ngn.Cl.Model.Data.Msmq.SecretaryApplication.Enqueue(Ia.Ngn.Cl.Model.Business.Msmq.Application.AmsApplication, Ia.Ngn.Cl.Model.Business.Msmq.Process.ReadAccess, kvp.Key.Access.Name);
1352: //}
1353: }
1354:
1355: // reset events dictionary
1356: eventDictionary.Clear();
1357: }
1358:
1359: ////////////////////////////////////////////////////////////////////////////
1360:
1361: /// <summary>
1362: ///
1363: /// </summary>
1364: public static Ia.Cl.Model.Result ManageMsmqQueue()
1365: {
1366: var result = new Ia.Cl.Model.Result();
1367:
1368: var queueCount = Ia.Ngn.Cl.Model.Data.Msmq.AmsApplication.Count;
1369:
1370: if (queueCount > 0)
1371: {
1372: var message = Ia.Ngn.Cl.Model.Data.Msmq.AmsApplication.Dequeue;
1373:
1374: if (message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.ReadAccess)
1375: {
1376: SendQueueEnqueueReadOnt(message.AccessName, out result);
1377: }
1378: else if (message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.ResetAccess)
1379: {
1380: SendQueueEnqueueResetOnt(message.AccessName, out result);
1381: }
1382: else if (message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.CreateReadServiceAccessPort || message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.CreateReadNceOrAmsServiceAccessPort)
1383: {
1384: var service = message.Service;
1385: var accessName = message.AccessName;
1386: var port = (message.Port > 0) ? message.Port : Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown;
1387:
1388: var nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
1389:
1390: if (nddOnt != null)
1391: {
1392: if (nddOnt.Pon.PonGroup.Olt.Odf.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
1393: {
1394: //Ia.Ngn.Cl.Model.Business.Nokia.Nce.CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, accessName, port, out Ia.Cl.Model.Result createResult);
1395:
1396: //Ia.Ngn.Cl.Model.Business.Nokia.Nce.ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, accessName, port, out Ia.Cl.Model.Result readResult);
1397:
1398: result.AddSuccess("Create/Read: " + service + "|" + accessName + "|" + port + ": " + " Hu-No SIP undefined"); // createResult.Message + "," + readResult.Message);
1399:
1400: if (!priorityServiceList.Contains(service)) priorityServiceList.Add(service);
1401: }
1402: else result.AddError("Access vendor is not Nokia. Access name: " + accessName + ".");
1403: }
1404: else result.AddError("NDD ONT is null for access name: " + accessName + ".");
1405: }
1406: else if (message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.DeleteReadServiceAccess || message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.DeleteReadNceOrAmsServiceAccessPort)
1407: {
1408: var service = message.Service;
1409: var accessName = message.AccessName;
1410: var port = (message.Port > 0) ? message.Port : Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown;
1411:
1412: var nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
1413:
1414: if (nddOnt != null)
1415: {
1416: if (nddOnt.Pon.PonGroup.Olt.Odf.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
1417: {
1418: //var vacatedAccessName = Ia.Ngn.Cl.Model.Business.Nokia.Nce.DeleteOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, accessName, port, out Ia.Cl.Model.Result deleteResult);
1419:
1420: //Ia.Ngn.Cl.Model.Business.Nokia.Nce.ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, vacatedAccessName, port, out Ia.Cl.Model.Result readResult);
1421:
1422: result.AddSuccess("Delete/Read: " + service + "|" + accessName + "|" + port + ": " + " Hu-No SIP undefined"); // + deleteResult.Message + "," + readResult.Message);
1423:
1424: if (!priorityServiceList.Contains(service)) priorityServiceList.Add(service);
1425: }
1426: else result.AddError("Access vendor is not Nokia. Access name: " + accessName + ".");
1427: }
1428: else result.AddError("NDD ONT is null for access name: " + accessName + ".");
1429: }
1430: else if (message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.ActiveApplicationRunningPermissionState)
1431: {
1432: Ia.Ngn.Cl.Model.Business.Default.PermitActiveApplicationsToRun = message.State;
1433:
1434: result.AddSuccess("PermitActiveApplicationsToRun: " + message.State);
1435: }
1436: else
1437: {
1438: throw new ArgumentOutOfRangeException("MSMQ process " + message.Process.ToString() + " is undefined");
1439: }
1440:
1441: result.AddSuccess(message.AccessName);
1442: }
1443:
1444: return result;
1445: }
1446:
1447: ////////////////////////////////////////////////////////////////////////////
1448:
1449: /// <summary>
1450: ///
1451: /// </summary>
1452: public static string ManageProperly()
1453: {
1454: var command = Ia.Ngn.Cl.Model.Business.Nokia.Ams.ProperlySelectedSingleAmsCommandToManageOntVoipPotsNetworkElements();
1455:
1456: ams.SendQueue.Enqueue(command);
1457:
1458: return command;
1459: }
1460:
1461: ////////////////////////////////////////////////////////////////////////////
1462:
1463: /// <summary>
1464: ///
1465: /// </summary>
1466: public static void KeepAliveOltAmsNameListItem()
1467: {
1468: keepAliveCurrentAmsName = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltAmsNameList.NextOf(keepAliveCurrentAmsName);
1469:
1470: ams.SendQueue.Enqueue(Ia.Ngn.Cl.Model.Business.Nokia.Ams.AmsKeepAliveCommand(keepAliveCurrentAmsName));
1471:
1472: /*
1473: foreach (string amsName in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.IsNrNokiaOltAmsNameList)
1474: {
1475: sendQueue.Enqueue(Ia.Ngn.Cl.Model.Business.Nokia.Ams.AmsKeepAliveCommand(amsName));
1476: }
1477: */
1478: }
1479:
1480: ////////////////////////////////////////////////////////////////////////////
1481: ////////////////////////////////////////////////////////////////////////////
1482:
1483: /// <summary>
1484: ///
1485: /// </summary>
1486: public static void SendQueueEnqueueReadOnt(string input, out Ia.Cl.Model.Result result)
1487: {
1488: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor accessVendor;
1489: List<string> amsCommandList;
1490:
1491: result = new Ia.Cl.Model.Result();
1492:
1493: if (!string.IsNullOrEmpty(input))
1494: {
1495: if (input.Length > 0)
1496: {
1497: input = input.Trim();
1498: input = input.ToUpper();
1499:
1500: if (Regex.IsMatch(input, @"^[a-zA-Z]{3}\s+\d{1,3}\s+\d{1,3}$") || Regex.IsMatch(input, @"^[a-zA-Z]{3}\.\d{1,3}\.\d{1,3}$") || Regex.IsMatch(input, @"^[a-zA-Z]{3}\/\d{1,3}\/\d{1,3}$"))
1501: {
1502: if (Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.AccessNameIsWithinAllowedOntList(input, out string accessName))
1503: {
1504: accessVendor = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.AccessVendorByAccessName(accessName);
1505:
1506: if (accessVendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
1507: {
1508: amsCommandList = Ia.Ngn.Cl.Model.Business.Nokia.Ams.AmsCommandsToRetrieveOntVoipPotsForASingleOntWithDefinedFamilyTypeAndForItIfThisSingleOntDefinedInNddDocumentList(accessName);
1509:
1510: if (amsCommandList != null && amsCommandList.Count > 0)
1511: {
1512: if (Ia.Ngn.Cl.Model.Business.Nokia.Ams.IsConnected /*&& activated && !receivingData*/)
1513: {
1514: foreach (string s in amsCommandList)
1515: {
1516: //telnet.Send(s);
1517: ams.SendQueue.Enqueue(s);
1518: }
1519: }
1520:
1521: result.AddSuccess(accessName);
1522: }
1523: }
1524: else
1525: {
1526: result.AddError("SendQueueEnqueueReadOnt(): Error: access [" + accessName + "] is not a valid Nokia access ONT.");
1527: }
1528: }
1529: else
1530: {
1531: result.AddError("SendQueueEnqueueReadOnt(): Error: input AccessName [" + accessName + "] is not within allowed ONT list.");
1532: }
1533: }
1534: else
1535: {
1536: result.AddError("SendQueueEnqueueReadOnt(): Error: input: [" + input + "] is not a valid OntName or AccessName.");
1537: }
1538: }
1539: else
1540: {
1541: result.AddError("SendQueueEnqueueReadOnt(): Error: input is empty.");
1542: }
1543: }
1544: else
1545: {
1546: result.AddError("SendQueueEnqueueReadOnt(): Error: input is null or empty.");
1547: }
1548: }
1549:
1550: ////////////////////////////////////////////////////////////////////////////
1551:
1552: /// <summary>
1553: ///
1554: /// </summary>
1555: public static void SendQueueEnqueueResetOnt(string input, out Ia.Cl.Model.Result result)
1556: {
1557: string amsCommand;
1558: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor accessVendor;
1559: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
1560: //List<string> amsCommandList;
1561:
1562: result = new Ia.Cl.Model.Result();
1563:
1564: if (!string.IsNullOrEmpty(input))
1565: {
1566: if (input.Length > 0)
1567: {
1568: input = input.Trim();
1569: input = input.ToUpper();
1570:
1571: if (Regex.IsMatch(input, @"^[a-zA-Z]{3}\s+\d{1,3}\s+\d{1,3}$") || Regex.IsMatch(input, @"^[a-zA-Z]{3}\.\d{1,3}\.\d{1,3}$") || Regex.IsMatch(input, @"^[a-zA-Z]{3}\/\d{1,3}\/\d{1,3}$"))
1572: {
1573: if (Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.AccessNameIsWithinAllowedOntList(input, out string accessName))
1574: {
1575: accessVendor = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.AccessVendorByAccessName(accessName);
1576:
1577: nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
1578:
1579: if (accessVendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
1580: {
1581: amsCommand = Ia.Ngn.Cl.Model.Business.Nokia.Ams.ResetOntCommand(nddOnt);
1582:
1583: if (!string.IsNullOrEmpty(amsCommand))
1584: {
1585: ams.SendQueue.Enqueue(amsCommand);
1586: result.AddSuccess(accessName);
1587: }
1588: }
1589: else
1590: {
1591: result.AddError("SendQueueEnqueueResetOnt(): Error: access [" + accessName + "] is not a valid Nokia access ONT.");
1592: }
1593: }
1594: else
1595: {
1596: result.AddError("SendQueueEnqueueResetOnt(): Error: input AccessName [" + accessName + "] is not within allowed ONT list.");
1597: }
1598: }
1599: else
1600: {
1601: result.AddError("SendQueueEnqueueResetOnt(): Error: input: [" + input + "] is not a valid OntName or AccessName.");
1602: }
1603: }
1604: else
1605: {
1606: result.AddError("SendQueueEnqueueResetOnt(): Error: input is empty.");
1607: }
1608: }
1609: else
1610: {
1611: result.AddError("SendQueueEnqueueResetOnt(): Error: input is null or empty.");
1612: }
1613: }
1614:
1615: ////////////////////////////////////////////////////////////////////////////
1616: ////////////////////////////////////////////////////////////////////////////
1617:
1618: /// <summary>
1619: ///
1620: /// </summary>
1621: private static List<string> PrepareCtaggedCommand(List<string> commandList)
1622: {
1623: List<string> ctaggedCommandList;
1624:
1625: if (commandList.Count > 0)
1626: {
1627: ctaggedCommandList = new List<string>(commandList.Count);
1628:
1629: foreach (string command in commandList)
1630: {
1631: ctaggedCommandList.Add(PrepareCtaggedCommand(command));
1632: }
1633: }
1634: else ctaggedCommandList = new List<string>();
1635:
1636: return ctaggedCommandList;
1637: }
1638:
1639: ////////////////////////////////////////////////////////////////////////////
1640:
1641: /// <summary>
1642: ///
1643: /// </summary>
1644: private static string PrepareCtaggedCommand(string command)
1645: {
1646: string ctaggedCommand, ctag;
1647:
1648: if (command.Contains("{ctag}"))
1649: {
1650: ctag = Ia.Cl.Model.Default.RandomNumber(6);
1651: // CTAG: The value of the CTAG is a non-zero integer of up to six characters.
1652: // CTAG comes before ; or ::
1653:
1654: Ia.Ngn.Cl.Model.Data.Nokia.Ams.CorrelationTagDictionary[ctag] = command;
1655:
1656: ctaggedCommand = command.Replace("{ctag}", ctag);
1657: }
1658: else
1659: {
1660: ctaggedCommand = string.Empty;
1661: }
1662:
1663: return ctaggedCommand;
1664: }
1665:
1666: ////////////////////////////////////////////////////////////////////////////
1667: ////////////////////////////////////////////////////////////////////////////
1668:
1669: /// <summary>
1670: ///
1671: /// </summary>
1672: public static string AmsKeepAliveCommand(string amsName)
1673: {
1674: return FormatAmsCommand(AmsOpcode.RtrvHdr, amsName);
1675: }
1676:
1677: ////////////////////////////////////////////////////////////////////////////
1678:
1679: /// <summary>
1680: ///
1681: /// </summary>
1682: public static string ResetOntCommand(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont)
1683: {
1684: return FormatAmsOntCommand(AmsOpcode.InitSys, ont);
1685: }
1686:
1687: ////////////////////////////////////////////////////////////////////////////
1688:
1689: /// <summary>
1690: ///
1691: /// </summary>
1692: public static string AmsCommandOfARandomAmsKeepAlive()
1693: {
1694: var amsName = (from o in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OltList
1695: where o.Odf.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia
1696: select o.AmsName).ToList().PickRandom();
1697:
1698: var command = FormatAmsCommand(AmsOpcode.RtrvHdr, amsName);
1699:
1700: return command;
1701: }
1702:
1703: ////////////////////////////////////////////////////////////////////////////
1704:
1705: /// <summary>
1706: ///
1707: /// </summary>
1708: public static void EnqueuePriorityAmsCommandQueue(string command)
1709: {
1710: priorityAmsCommandQueue.Enqueue(command);
1711: }
1712:
1713: ////////////////////////////////////////////////////////////////////////////
1714:
1715: /// <summary>
1716: ///
1717: /// </summary>
1718: public static void EnqueuePriorityAmsCommandQueue(List<string> amsCommandList)
1719: {
1720: if (amsCommandList != null && amsCommandList.Count > 0)
1721: {
1722: foreach (string s in amsCommandList) priorityAmsCommandQueue.Enqueue(s);
1723: }
1724: }
1725:
1726: ////////////////////////////////////////////////////////////////////////////
1727:
1728: /// <summary>
1729: ///
1730: /// </summary>
1731: public static string ProperlySelectedSingleAmsCommandToManageOntVoipPotsNetworkElements()
1732: {
1733: string command;
1734: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt;
1735: List<string> list;
1736:
1737: command = null;
1738:
1739: if (priorityAmsCommandQueue.Count > 0)
1740: {
1741: command = priorityAmsCommandQueue.Dequeue();
1742: }
1743: else
1744: {
1745: /*
1746: if (false && command == null && randomPercent < 60)
1747: {
1748: if (amsCreateOntCommandQueue.Count == 0)
1749: {
1750: olt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltList.Where(o => o.StateId == (int)Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.BellcoreState.IsNr).PickRandom();
1751:
1752: list = AmsCommandsToPreprovisionOntThatAreNotProvisionedAsDefinedInNddDocumentWithinAnOltList(olt, true, false, out count);
1753:
1754: amsCreateOntCommandQueue = new Queue<string>(list);
1755: }
1756:
1757: if (amsCreateOntCommandQueue.Count > 0) command = amsCreateOntCommandQueue.Dequeue();
1758: }
1759: */
1760:
1761: if (amsCommandQueue.Count == 0)
1762: {
1763: //olt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltList.Where(o => o.StateId == (int)Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.BellcoreState.IsNr).PickRandom();
1764: olt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltList.PickRandom();
1765:
1766: list = Ia.Ngn.Cl.Model.Business.Nokia.Ams.AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyType_AmsCommandsToRetrieveOntsDefinedInNddDocument_AmsCommandsToUpdateAndDisplayOntDescriptionWithItsAccessName_AmsCommandsToUpdateOntOntPotsCustomerWithItsConnectedServiceNumberList(olt);
1767:
1768: amsCommandQueue = new Queue<string>(list);
1769: }
1770:
1771: if (amsCommandQueue.Count > 0) command = amsCommandQueue.Dequeue();
1772:
1773: if (command == null) command = AmsCommandOfARandomAmsKeepAlive();
1774: }
1775:
1776: return command;
1777: }
1778:
1779: ////////////////////////////////////////////////////////////////////////////
1780:
1781: /// <summary>
1782: ///
1783: /// </summary>
1784: private static List<string> FormatAmsRtrvCommand(AmsOpcode amsOpcode, string position)
1785: {
1786: return FormatAmsRtrvCommand(amsOpcode, 0, position);
1787: }
1788:
1789: ////////////////////////////////////////////////////////////////////////////
1790:
1791: /// <summary>
1792: ///
1793: /// </summary>
1794: private static List<string> FormatAmsRtrvCommand(AmsOpcode amsOpcode, Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType, string position)
1795: {
1796: // Use this command with variable number of parameters
1797: string command, amsName;
1798: List<string> list;
1799:
1800: command = null;
1801:
1802: list = new List<string>(10);
1803:
1804: if (!string.IsNullOrEmpty(position))
1805: {
1806: AmsNameAndCardPortOntSquenceFromOntPosition(position, out amsName, out string pon);
1807:
1808: if (amsOpcode == AmsOpcode.RtrvOnt)
1809: {
1810: command = "RTRV-ONT:" + amsName + ":ONT-1-1-" + pon + ";";
1811: list.Add(command);
1812: }
1813: else if (amsOpcode == AmsOpcode.RtrvServiceVoip)
1814: {
1815: command = "RTRV-SERVICE-VOIP:" + amsName + ":VOIP-1-1-" + pon + "-1;";
1816: list.Add(command);
1817: }
1818: else if (amsOpcode == AmsOpcode.RtrvOntPots)
1819: {
1820: foreach (string ontPotsCardPort in Ia.Ngn.Cl.Model.Business.Nokia.Ont.PossiblePotsCardPortConfigurationForOntFamilyTypeList(familyType))
1821: {
1822: command = "RTRV-ONTPOTS:" + amsName + ":ONTPOTS-1-1-" + pon + "-" + ontPotsCardPort + ";";
1823: list.Add(command);
1824: }
1825: }
1826: }
1827:
1828: return list;
1829: }
1830:
1831: ////////////////////////////////////////////////////////////////////////////
1832:
1833: /// <summary>
1834: ///
1835: /// </summary>
1836: private static string FormatAmsOntCommand(AmsOpcode amsOpcode, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont)
1837: {
1838: string command;
1839:
1840: command = string.Empty;
1841:
1842: if (!string.IsNullOrEmpty(ont.Position))
1843: {
1844: AmsNameAndCardPortOntSquenceFromOntPosition(ont.Position, out string amsName, out string pon);
1845:
1846: if (amsOpcode == AmsOpcode.EdOntDesc1)
1847: {
1848: command = "ED-ONT:" + amsName + @":ONT-1-1-" + pon + "::::DESC1=" + ont.Access.Name + @":;";
1849: // ED-ONT:ESH-1-1:ONT-1-1-2-2-26::::DESC1=ESH.4.26:;
1850: }
1851: else if (amsOpcode == AmsOpcode.EdOntDesc1Annul)
1852: {
1853: //command = "ED-ONT:" + amsName + @":ONT-1-1-" + pon + "::::DESC1=:;"; // this has no effect on ONT DESC1
1854: // ED-ONT:ESH-1-1:ONT-1-1-2-2-26::::DESC1=:;
1855:
1856: command = "ED-ONT:" + amsName + @":ONT-1-1-" + pon + "::::DESC1=NULL:;"; // you must send NULL to change ONT DESC1
1857: // ED-ONT:ESH-1-1:ONT-1-1-2-2-26::::DESC1=NULL:;
1858: }
1859: else if (amsOpcode == AmsOpcode.InitSys)
1860: {
1861: command = "INIT-SYS:" + amsName + @":ONT-1-1-" + pon + ":::6;";
1862: // INIT-SYS:SHD-SUR-LAG17:ONT-1-1-1-1-1:::6;
1863: }
1864: }
1865:
1866: return command;
1867: }
1868:
1869: ////////////////////////////////////////////////////////////////////////////
1870:
1871: /// <summary>
1872: ///
1873: /// </summary>
1874: private static List<string> FormatAmsOntOntPotsCommandList(AmsOpcode amsOpcode, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont, Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType, string termination, string customerInformation)
1875: {
1876: string command;
1877: List<string> list;
1878:
1879: list = new List<string>(10);
1880:
1881: if (!string.IsNullOrEmpty(ont.Position))
1882: {
1883: AmsNameAndCardPortOntSquenceFromOntPosition(ont.Position, out string amsName, out string pon);
1884:
1885: termination = termination.Replace("td", "");
1886:
1887: if (int.TryParse(termination, out int td))
1888: {
1889: Ia.Ngn.Cl.Model.Business.Nokia.Ont.ReturnOntPotsCardAndPortFromFamilyTypeAndTd(familyType, td, out int card, out int port);
1890:
1891: if (amsOpcode == AmsOpcode.EdOntPotsCustinfo)
1892: {
1893: if (!string.IsNullOrEmpty(customerInformation))
1894: {
1895: command = "ED-ONTPOTS:" + amsName + @":ONTPOTS-1-1-" + pon + "-" + card + "-" + port + "::::CUSTINFO=" + customerInformation + @":;";
1896: // ED-ONTPOTS:ESH-1-1:ONTPOTS-1-1-1-1-1-2-1::::CUSTINFO=23632222:;\n";
1897: }
1898: else
1899: {
1900: command = "ED-ONTPOTS:" + amsName + @":ONTPOTS-1-1-" + pon + "-" + card + "-" + port + "::::CUSTINFO=NULL:;";
1901: // ED-ONTPOTS:ESH-1-1:ONTPOTS-1-1-1-1-1-2-1::::CUSTINFO=NULL:;\n";
1902: }
1903:
1904: list.Add(command);
1905: }
1906: }
1907: }
1908:
1909: return list;
1910: }
1911:
1912: ////////////////////////////////////////////////////////////////////////////
1913:
1914: /// <summary>
1915: ///
1916: /// </summary>
1917: private static string FormatAmsCommand(AmsOpcode amsOpcode, string amsName)
1918: {
1919: string command;
1920:
1921: if (amsOpcode == AmsOpcode.RtrvAlmPon)
1922: {
1923: command = "RTRV-ALM-PON:" + amsName + ":ALL:::MN,,NSA;";
1924:
1925: }
1926: else if (amsOpcode == AmsOpcode.RtrvHdr)
1927: {
1928: command = "RTRV-HDR:" + amsName + ":;";
1929: }
1930: else command = null;
1931:
1932: return command;
1933: }
1934:
1935: ////////////////////////////////////////////////////////////////////////////
1936:
1937: /// <summary>
1938: ///
1939: /// </summary>
1940: private static void AmsNameAndCardPortOntSquenceFromOntServiceHsiPosition(string ontPosition, out string amsName, out string cardPortOntCardPortServiceSequence)
1941: {
1942: Match match;
1943:
1944: // SUR-1-1-1-1-1-1-1-1;
1945: match = Regex.Match(ontPosition, @"([a-zA-Z]{3}\-\d{1,2}\-\d{1,2})\-(\d{1,2}\-\d{1,2}\-\d{1,2}\-\d{1,2}\-\d{1,2}\-\d{1,2})");
1946:
1947: amsName = match.Groups[1].Value;
1948: cardPortOntCardPortServiceSequence = match.Groups[2].Value;
1949: }
1950:
1951: ////////////////////////////////////////////////////////////////////////////
1952:
1953: /// <summary>
1954: ///
1955: /// </summary>
1956: private static void AmsNameAndCardPortOntSquenceFromOntPosition(string ontPosition, out string amsName, out string pon)
1957: {
1958: Match match;
1959:
1960: if (!string.IsNullOrEmpty(ontPosition))
1961: {
1962: // SBN-ARD-Lag1-1-1-1;
1963: match = Regex.Match(ontPosition, @"^([\w\d\-]+)\-(\d{1,2}\-\d{1,2}\-\d{1,2})$");
1964:
1965: if (match.Success)
1966: {
1967: amsName = match.Groups[1].Value;
1968: pon = match.Groups[2].Value;
1969: }
1970: else
1971: {
1972: amsName = string.Empty;
1973: pon = string.Empty;
1974: }
1975: }
1976: else
1977: {
1978: amsName = string.Empty;
1979: pon = string.Empty;
1980: }
1981: }
1982:
1983: ////////////////////////////////////////////////////////////////////////////
1984:
1985: /// <summary>
1986: /// Extract OLT Id, Card, Port, and ONT from ONT Position
1987: /// </summary>
1988: [Obsolete]
1989: public static void OltIdCardPortOntFromOntPosition(string ontPosition, out int oltId, out int card, out int port, out int ont)
1990: {
1991: string amsName;
1992: Match match;
1993:
1994: if (!string.IsNullOrEmpty(ontPosition))
1995: {
1996: // SBN-ARD-Lag1-1-1-1;
1997: match = Regex.Match(ontPosition, @"^([\w\d\-]+)\-(\d{1,2})\-(\d{1,2})\-(\d{1,2})$");
1998:
1999: if (match.Success)
2000: {
2001: amsName = match.Groups[1].Value;
2002: card = int.Parse(match.Groups[2].Value);
2003: port = int.Parse(match.Groups[3].Value);
2004: ont = int.Parse(match.Groups[4].Value);
2005:
2006: oltId = (from o in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OltList
2007: where o.AmsName == amsName
2008: select o.Id).FirstOrDefault();
2009: }
2010: else
2011: {
2012: amsName = string.Empty;
2013: card = port = ont = 0;
2014:
2015: oltId = 0;
2016: }
2017: }
2018: else
2019: {
2020: amsName = string.Empty;
2021: card = port = ont = 0;
2022:
2023: oltId = 0;
2024: }
2025: }
2026:
2027: ////////////////////////////////////////////////////////////////////////////
2028:
2029: /// <summary>
2030: ///
2031: /// </summary>
2032: public static string OntPositionFromAmsNameAndCardPortOntSquence(string amsName, string cardPortOnt)
2033: {
2034: string ontPosition;
2035:
2036: ontPosition = amsName + "-" + cardPortOnt;
2037:
2038: return ontPosition;
2039: }
2040:
2041: ////////////////////////////////////////////////////////////////////////////
2042:
2043: /// <summary>
2044: ///
2045: /// </summary>
2046: public static List<string> AmsCommandsToUpdateOntDescriptionWithItsAccessNameList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
2047: {
2048: string accessName, ontId, ontDescription1;
2049: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
2050: List<string> list;
2051:
2052: var ontIdToOntAccessNameDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdToOntAccessNameDictionary;
2053:
2054: var ontIdToDescription1ForNonNullAccessDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Ont.IdToDescription1ForNonNullAccessDictionary;
2055:
2056: var ontIdToDescription1ForNullAccessDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Ont.IdToDescription1ForNullAccessDictionary;
2057:
2058: //var ontIdWithNullAccessHashtable = Ia.Ngn.Cl.Model.Data.Nokia.Ont.IdWithNullAccessHashtable;
2059:
2060: var ontIdToOntDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdToOntDictionary;
2061:
2062: list = new List<string>();
2063:
2064: // insert descriptions for missing entries
2065: if (ontIdToDescription1ForNonNullAccessDictionary.Count > 0)
2066: {
2067: foreach (KeyValuePair<string, string> kvp in ontIdToDescription1ForNonNullAccessDictionary) //Ia.Ngn.Cl.Model.Ont ont in ontList)
2068: {
2069: ontId = kvp.Key;
2070: ontDescription1 = kvp.Value;
2071:
2072: if (ontIdToOntAccessNameDictionary.ContainsKey(ontId))
2073: {
2074: accessName = ontIdToOntAccessNameDictionary[ontId];
2075:
2076: if (ontDescription1 != accessName)
2077: {
2078: nddOnt = ontIdToOntDictionary[ontId];
2079:
2080: if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
2081: {
2082: list.Add(Ia.Ngn.Cl.Model.Business.Nokia.Ams.FormatAmsOntCommand(AmsOpcode.EdOntDesc1, nddOnt));
2083: }
2084: }
2085: else
2086: {
2087: }
2088: }
2089: }
2090: }
2091:
2092: // delete descriptions ONTs with missing access info
2093: if (ontIdToDescription1ForNullAccessDictionary.Count > 0)
2094: {
2095: foreach (KeyValuePair<string, string> kvp in ontIdToDescription1ForNullAccessDictionary)
2096: {
2097: ontId = kvp.Key;
2098: ontDescription1 = kvp.Value;
2099:
2100: if (!string.IsNullOrEmpty(ontDescription1))
2101: {
2102: if (ontIdToOntDictionary.ContainsKey(ontId))
2103: {
2104: nddOnt = ontIdToOntDictionary[ontId];
2105:
2106: if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
2107: {
2108: list.Add(Ia.Ngn.Cl.Model.Business.Nokia.Ams.FormatAmsOntCommand(AmsOpcode.EdOntDesc1Annul, nddOnt));
2109: }
2110: }
2111: }
2112: }
2113: }
2114:
2115: return list.ToList();
2116: }
2117:
2118: ////////////////////////////////////////////////////////////////////////////
2119:
2120: /// <summary>
2121: ///
2122: /// </summary>
2123: public static List<string> AmsCommandsToUpdateCustInfoWithServiceNumberInOntOntPotsList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
2124: {
2125: List<string> list;
2126: Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType;
2127: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
2128:
2129: var ontIdToOntDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdToOntDictionary;
2130:
2131: var ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList = Ia.Ngn.Cl.Model.Data.Nokia.Ams.OntOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList();
2132:
2133: list = new List<string>(ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList.Count);
2134:
2135: // insert descriptions for missing entries
2136: if (ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList.Count > 0)
2137: {
2138: foreach (var ontOntPotsService in ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList)
2139: {
2140: if (ontIdToOntDictionary.ContainsKey(ontOntPotsService.OntId))
2141: {
2142: nddOnt = ontIdToOntDictionary[ontOntPotsService.OntId];
2143:
2144: if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
2145: {
2146: familyType = (Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType)ontOntPotsService.OntFamilyTypeId;
2147:
2148: list.AddRange(Ia.Ngn.Cl.Model.Business.Nokia.Ams.FormatAmsOntOntPotsCommandList(AmsOpcode.EdOntPotsCustinfo, nddOnt, familyType, ontOntPotsService.Termination, ontOntPotsService.Service));
2149: }
2150: }
2151: }
2152: }
2153:
2154: var ontOntPotsCustomerExistsButSubPartyIsNullServiceList = Ia.Ngn.Cl.Model.Data.Nokia.Ams.OntOntPotsCustomerExistsButSubPartyIsNullServiceList();
2155:
2156: // delete descriptions of non existant entries
2157: if (ontOntPotsCustomerExistsButSubPartyIsNullServiceList.Count > 0)
2158: {
2159: foreach (var oops in ontOntPotsCustomerExistsButSubPartyIsNullServiceList)
2160: {
2161: if (ontIdToOntDictionary.ContainsKey(oops.OntId))
2162: {
2163: nddOnt = ontIdToOntDictionary[oops.OntId];
2164:
2165: if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
2166: {
2167: list.Add(Ia.Ngn.Cl.Model.Business.Nokia.Ams.FormatAmsOntCommand(AmsOpcode.EdOntDesc1Annul, nddOnt));
2168: }
2169: }
2170: }
2171: }
2172:
2173: return list;
2174: }
2175:
2176: ////////////////////////////////////////////////////////////////////////////
2177:
2178: /// <summary>
2179: ///
2180: /// </summary>
2181: public static List<string> AmsCommandsToPreprovisionAllOntsAsDefinedInNddDocumentWithinOltList(int oltId, bool edServiceVoipIsOos, out int count)
2182: {
2183: List<string> l, list;
2184: List<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> nddOntList;
2185:
2186: count = 0;
2187: list = null;
2188:
2189: nddOntList = (from o in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntList where o.Pon.PonGroup.Olt.Id == oltId select o).ToList();
2190:
2191: if (nddOntList != null && nddOntList.Count > 0)
2192: {
2193: list = new List<string>(nddOntList.Count);
2194:
2195: foreach (Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt in nddOntList)
2196: {
2197: l = Ia.Ngn.Cl.Model.Business.Nokia.Ams.CommandsToPreprovisionOntWithinOlt(nddOnt, edServiceVoipIsOos);
2198:
2199: list.AddRange(l);
2200: count++;
2201: }
2202: }
2203: else
2204: {
2205: }
2206:
2207: return list;
2208: }
2209:
2210: ////////////////////////////////////////////////////////////////////////////
2211:
2212: /// <summary>
2213: ///
2214: /// </summary>
2215: public static List<string> AmsCommandsToPreprovisionOntThatAreNotProvisionedAsDefinedInNddDocumentWithinAnOltList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt, bool includeDisplayCommand, bool edServiceVoipIsOos, out int count)
2216: {
2217: List<string> l, list;
2218: List<string> ontIdList;
2219: List<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> nddOntList;
2220:
2221: count = 0;
2222: list = null;
2223:
2224: using (var db = new Ia.Ngn.Cl.Model.Ngn())
2225: {
2226: nddOntList = (from o in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntList where o.Pon.PonGroup.Olt.Id == olt.Id select o).ToList();
2227:
2228: ontIdList = Ia.Ngn.Cl.Model.Data.Nokia.Ont.IdList(olt.Id); //.ReadListByOltId(olt.Id);
2229:
2230: if (nddOntList != null && nddOntList.Count > 0)
2231: {
2232: list = new List<string>(nddOntList.Count);
2233:
2234: foreach (Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt in nddOntList)
2235: {
2236: if (!ontIdList.Contains(nddOnt.Id))
2237: {
2238: l = Ia.Ngn.Cl.Model.Business.Nokia.Ams.CommandsToPreprovisionOntWithinOlt(nddOnt, edServiceVoipIsOos);
2239: list.AddRange(l);
2240:
2241: if (includeDisplayCommand)
2242: {
2243: l = Ia.Ngn.Cl.Model.Business.Nokia.Ams.AmsCommandsToRetrieveOntVoipPotsForSingleOntsWithDefinedFamilyTypeList(nddOnt.Access.Name);
2244: list.AddRange(l);
2245: }
2246:
2247: count++;
2248: }
2249: }
2250: }
2251: }
2252:
2253: return list;
2254: }
2255:
2256: ////////////////////////////////////////////////////////////////////////////
2257:
2258: /// <summary>
2259: ///
2260: /// </summary>
2261: public static List<string> AmsCommandsToRetrieveOntVoipPotsForASingleOntWithDefinedFamilyTypeAndForItIfThisSingleOntDefinedInNddDocumentList(string accessName)
2262: {
2263: //Random r;
2264: List<string> l1, l2, list;
2265:
2266: //r = new Random();
2267:
2268: l1 = AmsCommandToRetrieveSingleOntDefinedInNddDocumentList(accessName);
2269:
2270: l2 = AmsCommandsToRetrieveOntVoipPotsForSingleOntsWithDefinedFamilyTypeList(accessName);
2271:
2272: list = new List<string>(l1.Count + l2.Count);
2273:
2274: foreach (var item in l1) list.Add(item);
2275: foreach (var item in l2) list.Add(item);
2276:
2277: return list.Distinct().ToList();
2278: }
2279:
2280: ////////////////////////////////////////////////////////////////////////////
2281:
2282: /// <summary>
2283: ///
2284: /// </summary>
2285: public static List<string> AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeAndForOtherOntsDefinedInNddDocumentList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
2286: {
2287: List<string> l1, l2, list;
2288:
2289: l1 = AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeList(olt);
2290:
2291: l2 = AmsCommandsToRetrieveOntsDefinedInNddDocumentList(olt);
2292:
2293: list = new List<string>(l1.Count + l2.Count);
2294:
2295: foreach (var item in l1) list.Add(item);
2296: foreach (var item in l2) list.Add(item);
2297:
2298: return list.Distinct().Shuffle().ToList();
2299: }
2300:
2301: ////////////////////////////////////////////////////////////////////////////
2302:
2303: /// <summary>
2304: ///
2305: /// </summary>
2306: public static List<string> AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyType_AmsCommandsToRetrieveOntsDefinedInNddDocument_AmsCommandsToUpdateAndDisplayOntDescriptionWithItsAccessName_AmsCommandsToUpdateOntOntPotsCustomerWithItsConnectedServiceNumberList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
2307: {
2308: HashSet<string> hashSet1, hashSet2, hashSet3, hashSet4, hashSet;
2309:
2310: hashSet1 = new HashSet<string>(AmsCommandsToUpdateOntDescriptionWithItsAccessNameList(olt));
2311:
2312: hashSet2 = new HashSet<string>(AmsCommandsToUpdateCustInfoWithServiceNumberInOntOntPotsList(olt));
2313:
2314: hashSet3 = new HashSet<string>(AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeList(olt));
2315:
2316: hashSet4 = new HashSet<string>(AmsCommandsToRetrieveOntsDefinedInNddDocumentList(olt));
2317:
2318: hashSet = new HashSet<string>(hashSet1);
2319: hashSet.UnionWith(hashSet2);
2320: hashSet.UnionWith(hashSet3);
2321: hashSet.UnionWith(hashSet4);
2322:
2323: return hashSet.ToList(); //.Shuffle().ToList();
2324: }
2325:
2326: ////////////////////////////////////////////////////////////////////////////
2327:
2328: /// <summary>
2329: ///
2330: /// </summary>
2331: private static List<string> AmsCommandToRetrieveSingleOntDefinedInNddDocumentList(string accessName)
2332: {
2333: List<string> list;
2334: Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType;
2335: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
2336:
2337: list = new List<string>(5); // 5 is max number of commands from this function
2338:
2339: if (!string.IsNullOrEmpty(accessName))
2340: {
2341: nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
2342:
2343: if (nddOnt != null)
2344: {
2345: familyType = Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Sfu;
2346:
2347: list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, nddOnt.Position));
2348: }
2349: }
2350:
2351: return list;
2352: }
2353:
2354: ////////////////////////////////////////////////////////////////////////////
2355:
2356: /// <summary>
2357: ///
2358: /// </summary>
2359: private static List<string> AmsCommandsToRetrieveOntsDefinedInNddDocumentList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
2360: {
2361: Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType;
2362: List<string> list;
2363: List<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> ontList;
2364:
2365: ontList = (from o in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntList where o.Pon.PonGroup.Olt.Id == olt.Id select o).ToList();
2366:
2367: familyType = Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Sfu;
2368:
2369: list = new List<string>(ontList.Count);
2370:
2371: foreach (Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont in ontList)
2372: {
2373: list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, ont.Position));
2374: }
2375:
2376: return list;
2377: }
2378:
2379: ////////////////////////////////////////////////////////////////////////////
2380:
2381: /// <summary>
2382: ///
2383: /// </summary>
2384: private static List<string> AmsCommandsToRetrieveOntVoipPotsForSingleOntsWithDefinedFamilyTypeList(string accessName)
2385: {
2386: List<string> list;
2387: Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType;
2388: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
2389: Ia.Ngn.Cl.Model.Ont ont;
2390:
2391: list = new List<string>(5); // 5 is max number of commands from this function
2392:
2393: if (!string.IsNullOrEmpty(accessName))
2394: {
2395: nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
2396:
2397: if (nddOnt != null)
2398: {
2399: ont = Ia.Ngn.Cl.Model.Data.Nokia.Ont.Read(nddOnt.Id);
2400:
2401: if (ont != null)
2402: {
2403: familyType = (Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType)ont.FamilyTypeId;
2404:
2405: list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, nddOnt.Position));
2406: list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvServiceVoip, familyType, nddOnt.Position));
2407: list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOntPots, familyType, nddOnt.Position));
2408: }
2409: }
2410: }
2411:
2412: return list;
2413: }
2414:
2415: ////////////////////////////////////////////////////////////////////////////
2416:
2417: /// <summary>
2418: ///
2419: /// </summary>
2420: private static List<string> AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
2421: {
2422: Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType;
2423: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
2424: List<string> list;
2425: Dictionary<string, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> ontIdToOntDictionary;
2426: List<Ia.Ngn.Cl.Model.Ont> ontList;
2427:
2428: ontList = Ia.Ngn.Cl.Model.Data.Nokia.Ont.NonNullAccessList(olt.Id);
2429:
2430: ontIdToOntDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdToOntDictionary;
2431:
2432: list = new List<string>(ontList.Count);
2433:
2434: foreach (Ia.Ngn.Cl.Model.Ont ont in ontList)
2435: {
2436: familyType = (Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType)ont.FamilyTypeId;
2437:
2438: if (ontIdToOntDictionary.ContainsKey(ont.Id))
2439: {
2440: nddOnt = ontIdToOntDictionary[ont.Id];
2441:
2442: //if (ont.Access != null) access is already non null
2443: //{
2444: list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, nddOnt.Position));
2445: list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvServiceVoip, familyType, nddOnt.Position));
2446: list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOntPots, familyType, nddOnt.Position));
2447: //}
2448: }
2449: }
2450:
2451: return list;
2452: }
2453:
2454: ////////////////////////////////////////////////////////////////////////////
2455:
2456: /// <summary>
2457: ///
2458: /// </summary>
2459: public static ArrayList AmsCommandsToRetrieveNewOntAlarmsForOltArrayList()
2460: {
2461: ArrayList amsCommandArrayList;
2462:
2463: amsCommandArrayList = new ArrayList(Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OltList.Count);
2464:
2465: foreach (var olt in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OltList)
2466: {
2467: amsCommandArrayList.Add(FormatAmsCommand(AmsOpcode.RtrvAlmPon, olt.AmsName));
2468: }
2469:
2470: return amsCommandArrayList;
2471: }
2472:
2473: ////////////////////////////////////////////////////////////////////////////
2474:
2475: /// <summary>
2476: ///
2477: /// </summary>
2478: public static ArrayList AmsCommandsToUpdateOntServiceDescriptionWithItsIspNameArrayList()
2479: {
2480: ArrayList amsCommandArrayList;
2481:
2482: amsCommandArrayList = new ArrayList(100);
2483:
2484: return amsCommandArrayList;
2485: }
2486:
2487: /*
2488: ////////////////////////////////////////////////////////////////////////////
2489:
2490: /// <summary>
2491: ///
2492: /// </summary>
2493: public static int PositionOfHsiServiceForCardAndPortAndOntFamilyType(int card, int port, Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType)
2494: {
2495: int position;
2496:
2497: if (familyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Sfu || familyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Gfu || familyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Soho)
2498: {
2499: position = port;
2500: }
2501: else if (familyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
2502: {
2503: position = (card - 1) * 4 + port;
2504: }
2505: else position = 0;
2506:
2507: return position;
2508: }
2509: */
2510:
2511: ////////////////////////////////////////////////////////////////////////////
2512:
2513: /// <summary>
2514: ///
2515: /// </summary>
2516: public static bool UpdateDatabaseWithAmsCommandOutput(string rowData, out Ia.Cl.Model.Result result)
2517: {
2518: bool isUpdated;
2519: int readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount;
2520: string accessId, ontId, ontPosition;
2521: string line, amsName, cardPortOnt;
2522: DateTime eventTime;
2523: Match match;
2524: MatchCollection matchCollection;
2525: Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState state;
2526:
2527: //ponNameToPonIdHashtable = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.PonNameToPonIdHashtable;
2528:
2529: isUpdated = false;
2530: readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
2531: result = new Ia.Cl.Model.Result();
2532: //result.Content = rowData;
2533:
2534: // below: remove all '\' characters from rowData and reset NULL comments to ""
2535: rowData = rowData.Replace(@"\", "");
2536: rowData = rowData.Replace(@"NULL", "");
2537:
2538: if (rowData.Contains("RTRV-ONT:"))
2539: {
2540: #region RTRV-ONT
2541: Ia.Ngn.Cl.Model.Ont ont, dataOnt;
2542:
2543: /*
2544: SUR-1-1 08-07-10 09:35:07
2545: M 0 COMPLD
2546: / * RTRV-ONT:SUR-1-1:ONT-1-1-1-1-1&ONT-1-1-1-1-10&ONT-1-1-1-1-2&ONT-1-1-1 * /
2547: / * -1-3&ONT-1-1-1-1-4&ONT-1-1-1-1-5&ONT-1-1-1-1-6&ONT-1-1-1-1-7&ONT-1-1- * /
2548: / * 1-1-8&ONT-1-1-1-1-9 * /
2549: "ONT-1-1-1-1-1::BTRYBKUP=NO,BERINT=8000,DESC1="SLA.1.1",
2550: DESC2="all is well",PROVVERSION="*",SERNUM=ALCLA0A1A5F8,
2551: SUBSLOCID="WILDCARD",SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,
2552: SCHEDPROFID=1,SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,
2553: POWERSHEDPROFNM="NULL",ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,
2554: SWVERACT=3FE50853AFMA07,SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,
2555: EQUIPID=BVM3G00CRAO420EB ,NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:
2556: IS-NR"
2557: "ONT-1-1-1-1-10::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
2558: PROVVERSION="*",SERNUM=ALCLA0A1A479,SUBSLOCID="WILDCARD",
2559: SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
2560: SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
2561: ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
2562: SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB ,
2563: NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
2564: "ONT-1-1-1-1-2::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
2565: PROVVERSION="*",SERNUM=ALCLA0A261BB,SUBSLOCID="WILDCARD",
2566: SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
2567: SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
2568: ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
2569: SWVERPSV=3FE50853AAAA22,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB ,
2570: NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
2571: */
2572:
2573: // below: information from the definition of "RTRV-ONT" in "AMS TL1 Commands Reference"
2574:
2575: /*
2576: IP 0
2577: <
2578:
2579: SUR-1-1 08-07-10 09:35:07
2580: M 0 COMPLD
2581: / * RTRV-ONT:SUR-1-1:ONT-1-1-1-1-1&ONT-1-1-1-1-10&ONT-1-1-1-1-2&ONT-1-1-1 * /
2582: / * -1-3&ONT-1-1-1-1-4&ONT-1-1-1-1-5&ONT-1-1-1-1-6&ONT-1-1-1-1-7&ONT-1-1- * /
2583: / * 1-1-8&ONT-1-1-1-1-9 * /
2584: "ONT-1-1-1-1-1::BTRYBKUP=NO,BERINT=8000,DESC1="SLA.1.1",
2585: DESC2="all is well",PROVVERSION="*",SERNUM=ALCLA0A1A5F8,
2586: SUBSLOCID="WILDCARD",SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,
2587: SCHEDPROFID=1,SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,
2588: POWERSHEDPROFNM="NULL",ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,
2589: SWVERACT=3FE50853AFMA07,SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,
2590: EQUIPID=BVM3G00CRAO420EB ,NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:
2591: IS-NR"
2592: "ONT-1-1-1-1-10::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
2593: PROVVERSION="*",SERNUM=ALCLA0A1A479,SUBSLOCID="WILDCARD",
2594: SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
2595: SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
2596: ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
2597: SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB ,
2598: NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
2599: "ONT-1-1-1-1-2::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
2600: PROVVERSION="*",SERNUM=ALCLA0A261BB,SUBSLOCID="WILDCARD",
2601: SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
2602: SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
2603: ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
2604: SWVERPSV=3FE50853AAAA22,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB ,
2605: NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
2606:
2607: / * More Output Follows * /
2608: >
2609:
2610: SUR-1-1 08-07-10 09:35:07
2611: M 0 COMPLD
2612: / * RTRV-ONT:SUR-1-1:ONT-1-1-1-1-1&ONT-1-1-1-1-10&ONT-1-1-1-1-2&ONT-1-1-1-1-3&ONT-1-1-1-1-4&ONT-1-1-1-1-5&ONT-1-1-1-1-6&ONT-1-1-1-1-7&ONT-1-1-1-1-8&ONT-1-1-1-1-9 * /
2613: "ONT-1-1-1-1-3::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
2614: PROVVERSION="*",SERNUM=ALCLA0A1C9BC,SUBSLOCID="WILDCARD",
2615: SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
2616: SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
2617: ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
2618: SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB ,
2619: NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
2620: "ONT-1-1-1-1-4::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
2621: PROVVERSION="*",SERNUM=ALCLA0A1A47A,SUBSLOCID="WILDCARD",
2622: SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
2623: SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
2624: ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
2625: SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB ,
2626: NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
2627: "ONT-1-1-1-1-5::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
2628: PROVVERSION="*",SERNUM=ALCLA0A1AE44,SUBSLOCID="WILDCARD",
2629: SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
2630: SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
2631: ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
2632: SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB ,
2633: NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
2634:
2635: / * More Output Follows * /
2636: >
2637:
2638: SUR-1-1 08-07-10 09:35:08
2639: M 0 COMPLD
2640: / * RTRV-ONT:SUR-1-1:ONT-1-1-1-1-1&ONT-1-1-1-1-10&ONT-1-1-1-1-2&ONT-1-1-1-1-3&ONT-1-1-1-1-4&ONT-1-1-1-1-5&ONT-1-1-1-1-6&ONT-1-1-1-1-7&ONT-1-1-1-1-8&ONT-1-1-1-1-9 * /
2641: "ONT-1-1-1-1-6::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
2642: PROVVERSION="*",SERNUM=ALCLA0A1BE26,SUBSLOCID="WILDCARD",
2643: SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
2644: SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
2645: ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
2646: SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB ,
2647: NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
2648: "ONT-1-1-1-1-7::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
2649: PROVVERSION="*",SERNUM=ALCLA0A1C94B,SUBSLOCID="WILDCARD",
2650: SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
2651: SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
2652: ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
2653: SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB ,
2654: NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
2655: "ONT-1-1-1-1-8::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
2656: PROVVERSION="*",SERNUM=ALCLA0A1A484,SUBSLOCID="WILDCARD",
2657: SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
2658: SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
2659: ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
2660: SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB ,
2661: NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
2662:
2663: / * More Output Follows * /
2664: >
2665:
2666: SUR-1-1 08-07-10 09:35:08
2667: M 0 COMPLD
2668: / * RTRV-ONT:SUR-1-1:ONT-1-1-1-1-1&ONT-1-1-1-1-10&ONT-1-1-1-1-2&ONT-1-1-1-1-3&ONT-1-1-1-1-4&ONT-1-1-1-1-5&ONT-1-1-1-1-6&ONT-1-1-1-1-7&ONT-1-1-1-1-8&ONT-1-1-1-1-9 * /
2669: "ONT-1-1-1-1-9::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
2670: PROVVERSION="*",SERNUM=ALCLA0A1A43E,SUBSLOCID="WILDCARD",
2671: SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
2672: SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
2673: ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
2674: SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB ,
2675: NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
2676: ;
2677: */
2678:
2679: // below: read OntPosition
2680: match = Regex.Match(rowData, @"RTRV-ONT:([\w\d\-]+)", RegexOptions.Singleline);
2681:
2682: amsName = match.Groups[1].Value;
2683:
2684: match = Regex.Match(rowData, @"ONT-1-1-(\d{1,2}-\d{1,2}-\d{1,2})::(.+?):\s*(IS-NR|OOS-AU|OOS-MA|OOS-AUMA)", RegexOptions.Singleline);
2685:
2686: if (match.Success)
2687: {
2688: cardPortOnt = match.Groups[1].Value;
2689:
2690: line = match.Groups[2].Value;
2691:
2692: ontId = Ia.Ngn.Cl.Model.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
2693:
2694: if (!string.IsNullOrEmpty(ontId))
2695: {
2696: dataOnt = new Ia.Ngn.Cl.Model.Ont();
2697:
2698: dataOnt.Id = ontId;
2699: dataOnt.BatteryBackupAvailable = (Ia.Cl.Model.Default.Match(line, @"BTRYBKUP=(\w+)") == "YES") ? true : false;
2700: dataOnt.Description1 = Ia.Cl.Model.Default.Match(line, @"DESC1=""([^""]{1,64})""");
2701: dataOnt.Description2 = Ia.Cl.Model.Default.Match(line, @"DESC2=""([^""]{1,64})""");
2702: dataOnt.Serial = Ia.Cl.Model.Default.Match(line, @"SERNUM=(\w{12})");
2703: dataOnt.PlannedSoftware = Ia.Cl.Model.Default.Match(line, @"SWVERPLND=""(auto|AUTO|\w{14})""");
2704: dataOnt.ActiveSoftware = Ia.Cl.Model.Default.Match(line, @"SWVERACT=(\w{14})");
2705: dataOnt.PassiveSoftware = Ia.Cl.Model.Default.Match(line, @"SWVERPSV=(\w{14})");
2706: dataOnt.FamilyTypeId = (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyTypeIdFromActiveSoftwareAndPlannedSoftware(dataOnt.ActiveSoftware, dataOnt.PlannedSoftware);
2707: dataOnt.VendorId = Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.VendorIdFromName(Ia.Cl.Model.Default.Match(line, @"VENDORID=(\w+)"));
2708: dataOnt.EquipmentId = Ia.Cl.Model.Default.Match(line, @"EQUIPID=(\w{16})");
2709:
2710: switch (match.Groups[3].Value)
2711: {
2712: case "IS-NR": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.IsNr; break;
2713: case "OOS-AU": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAu; break;
2714: case "OOS-MA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosMa; break;
2715: case "OOS-AUMA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAuma; break;
2716: default: state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.Undefined; break;
2717: }
2718:
2719: dataOnt.StateId = (int)state;
2720:
2721: using (var db = new Ia.Ngn.Cl.Model.Ngn())
2722: {
2723: accessId = Ia.Ngn.Cl.Model.Business.Access.AccessId(ontId);
2724:
2725: if (accessId != null) dataOnt.Access = (from a in db.Accesses where a.Id == accessId select a).SingleOrDefault();
2726:
2727: ont = (from o in db.Onts where o.Id == dataOnt.Id select o).SingleOrDefault();
2728:
2729: if (ont == null)
2730: {
2731: dataOnt.Created = dataOnt.Updated = DateTime.UtcNow.AddHours(3);
2732:
2733: db.Onts.Add(dataOnt);
2734:
2735: insertedItemCount++;
2736: }
2737: else
2738: {
2739: existingItemCount++;
2740:
2741: if (ont.Update(dataOnt))
2742: {
2743: db.Onts.Attach(ont);
2744: db.Entry(ont).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
2745:
2746: updatedItemCount++;
2747: }
2748: }
2749:
2750: db.SaveChanges();
2751: }
2752: }
2753: else
2754: {
2755: result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
2756: }
2757: }
2758: else
2759: {
2760: result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
2761: }
2762: #endregion
2763: }
2764: else if (rowData.Contains("ED-ONT:"))
2765: {
2766: #region ED-ONT
2767: Ia.Ngn.Cl.Model.Ont ont, dataOnt;
2768:
2769: /*
2770: SUR-5-2 14-11-23 05:22:08
2771: M 0 COMPLD
2772: / * ED-ONT:SUR-5-2:ONT-1-1-1-2-6::::DESC1=ZAH.2.6: * /
2773:
2774: M 0 COMPLD
2775: / * ED-ONT:QRW-SLB-LAG2:ONT-1-1-3-2-10:98499:::DESC1=QRW.33.10: * /
2776: ;
2777: */
2778:
2779: // below: read OntPosition
2780: match = Regex.Match(rowData, @"ED-ONT:([\w\d\-]+)", RegexOptions.Singleline);
2781:
2782: amsName = match.Groups[1].Value;
2783:
2784: match = Regex.Match(rowData, @"ONT-1-1-(\d{1,2}-\d{1,2}-\d{1,2}):\d{0,6}:::(.+?):", RegexOptions.Singleline);
2785:
2786: if (match.Success)
2787: {
2788: cardPortOnt = match.Groups[1].Value;
2789:
2790: line = match.Groups[2].Value;
2791:
2792: ontId = Ia.Ngn.Cl.Model.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
2793:
2794: if (!string.IsNullOrEmpty(ontId))
2795: {
2796: dataOnt = new Ia.Ngn.Cl.Model.Ont();
2797:
2798: dataOnt.Id = ontId;
2799: dataOnt.Description1 = Ia.Cl.Model.Default.Match(line, @"DESC1=(.{1,64})");
2800: dataOnt.Description2 = Ia.Cl.Model.Default.Match(line, @"DESC2=(.{1,64})");
2801:
2802: using (var db = new Ia.Ngn.Cl.Model.Ngn())
2803: {
2804: ont = (from o in db.Onts where o.Id == dataOnt.Id select o).SingleOrDefault();
2805:
2806: if (ont == null)
2807: {
2808: // below: Don't create a new ONT in this ED-ONT function
2809: //dataOnt.Created = dataOnt.Updated = DateTime.UtcNow.AddHours(3);
2810:
2811: //db.Onts.Add(dataOnt);
2812:
2813: insertedItemCount++;
2814: }
2815: else
2816: {
2817: existingItemCount++;
2818:
2819: if (ont.Update(dataOnt))
2820: {
2821: db.Onts.Attach(ont);
2822: db.Entry(ont).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
2823:
2824: updatedItemCount++;
2825: }
2826: }
2827:
2828: db.SaveChanges();
2829: }
2830: }
2831: else
2832: {
2833: result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
2834: }
2835: }
2836: else
2837: {
2838: result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
2839: }
2840: #endregion
2841: }
2842: else if (rowData.Contains("RTRV-SERVICE-VOIP:"))
2843: {
2844: #region RTRV-SERVICE-VOIP
2845:
2846: string ontServiceVoipId;
2847: int card;
2848: Ia.Ngn.Cl.Model.OntServiceVoip ontServiceVoip, dataOntServiceVoip;
2849:
2850: // below: information from the definition of "RTRV-SERVICE-VOIP" in "AMS TL1 Commands Reference"
2851:
2852: /*
2853:
2854: SUR-1-1 08-07-09 09:43:13
2855: M 0 COMPLD
2856: / * RTRV-SERVICE-VOIP:SUR-1-1:VOIP-1-1-1-1-1-1&VOIP-1-1-1-1-10-1&VOIP-1-1 * /
2857: / * -1-1-2-1&VOIP-1-1-1-1-3-1&VOIP-1-1-1-1-4-1&VOIP-1-1-1-1-5-1&VOIP-1-1- * /
2858: / * 1-1-6-1&VOIP-1-1-1-1-7-1&VOIP-1-1-1-1-8-1&VOIP-1-1-1-1-9-1 * /
2859: "VOIP-1-1-1-1-1-1::BWPROFUPID=1,BWPROFUPNM=VOIP,BWPROFDNID=1,
2860: BWPROFDNNM=VOIP,PQPROFID=1,PQPROFNM=VOIPPQ,AESENABLE=DISABLE,SVLAN=10,
2861: IPADDRLOC=10.3.144.1,NETMASKLOC=255.255.248.0,DEFROUTER=10.3.151.254,
2862: IPADDRMGC=10.255.251.5,IPADDRFTP=0.0.0.0,DHCP=DISABLE,PORTMGC=2944,
2863: VOIPDSCP=24,VOIPMODE=SSH248,CONFIGFILE=kuwait.xml,CLIENTID="",
2864: CUSTOMERID="",SECRETID=,SECRETK=,IPSECENABLE=DISABLED,CONFMETH=FTPSERVER,
2865: SPGPROFID=0,SPGPROFNM="",SPGUNAME="",SPGPWD="",SPGREALM="",
2866: SRCVLANID=0:IS-NR"
2867: "VOIP-1-1-1-1-10-1::BWPROFUPID=1,BWPROFUPNM=VOIP,BWPROFDNID=1,
2868: BWPROFDNNM=VOIP,PQPROFID=1,PQPROFNM=VOIPPQ,AESENABLE=DISABLE,SVLAN=10,
2869: IPADDRLOC=10.3.144.10,NETMASKLOC=255.255.248.0,DEFROUTER=10.3.151.254,
2870: IPADDRMGC=10.255.251.5,IPADDRFTP=0.0.0.0,DHCP=DISABLE,PORTMGC=2944,
2871: VOIPDSCP=24,VOIPMODE=SSH248,CONFIGFILE=kuwait.xml,CLIENTID="",
2872: CUSTOMERID="",SECRETID=,SECRETK=,IPSECENABLE=DISABLED,CONFMETH=FTPSERVER,
2873: SPGPROFID=0,SPGPROFNM="",SPGUNAME="",SPGPWD="",SPGREALM="",
2874: SRCVLANID=0:IS-NR"
2875: "VOIP-1-1-1-1-2-1::BWPROFUPID=1,BWPROFUPNM=VOIP,BWPROFDNID=1,
2876: BWPROFDNNM=VOIP,PQPROFID=1,PQPROFNM=VOIPPQ,AESENABLE=DISABLE,SVLAN=10,
2877: IPADDRLOC=10.3.144.2,NETMASKLOC=255.255.248.0,DEFROUTER=10.3.151.254,
2878: IPADDRMGC=10.255.251.5,IPADDRFTP=0.0.0.0,DHCP=DISABLE,PORTMGC=2944,
2879: VOIPDSCP=24,VOIPMODE=SSH248,CONFIGFILE=kuwait.xml,CLIENTID="",
2880: CUSTOMERID="",SECRETID=,SECRETK=,IPSECENABLE=DISABLED,CONFMETH=FTPSERVER,
2881: SPGPROFID=0,SPGPROFNM="",SPGUNAME="",SPGPWD="",SPGREALM="",
2882: SRCVLANID=0:IS-NR"
2883:
2884: / * More Output Follows * /
2885: >
2886: */
2887:
2888: // below: read OntPosition
2889: match = Regex.Match(rowData, @"RTRV-SERVICE-VOIP:([\w\d\-]+)", RegexOptions.Singleline);
2890:
2891: amsName = match.Groups[1].Value;
2892:
2893: match = Regex.Match(rowData, @"VOIP-1-1-(\d{1,2}-\d{1,2}-\d{1,2})-(\d{1,2})::(.+?):\s*(IS-NR|OOS-AU|OOS-MA|OOS-AUMA)", RegexOptions.Singleline);
2894:
2895: if (match.Success)
2896: {
2897: cardPortOnt = match.Groups[1].Value;
2898: card = int.Parse(match.Groups[2].Value);
2899:
2900: line = match.Groups[3].Value;
2901:
2902: ontId = Ia.Ngn.Cl.Model.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
2903:
2904: if (!string.IsNullOrEmpty(ontId))
2905: {
2906: ontServiceVoipId = Ia.Ngn.Cl.Model.Business.Nokia.OntServiceVoip.OntServiceVoipId(ontId, card);
2907:
2908: dataOntServiceVoip = new Ia.Ngn.Cl.Model.OntServiceVoip();
2909:
2910: dataOntServiceVoip.Id = ontServiceVoipId;
2911:
2912: dataOntServiceVoip.ConfiguratinFile = Ia.Cl.Model.Default.Match(line, @"CONFIGFILE=(\w{1,}\.xml)");
2913: dataOntServiceVoip.Customer = Ia.Cl.Model.Default.Match(line, @"CUSTOMERID=""([^""]{1,62})""");
2914: dataOntServiceVoip.FtpIp = Ia.Cl.Model.Default.Match(line, @"IPADDRFTP=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
2915: dataOntServiceVoip.Ip = Ia.Cl.Model.Default.Match(line, @"IPADDRLOC=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
2916: dataOntServiceVoip.Label = Ia.Cl.Model.Default.Match(line, @"LABEL=""([^""]{1,80})""");
2917: dataOntServiceVoip.MgcIp = Ia.Cl.Model.Default.Match(line, @"IPADDRMGC=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
2918: dataOntServiceVoip.MgcSecondaryIp = Ia.Cl.Model.Default.Match(line, @"IPADDRMGCSEC=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
2919:
2920: switch (match.Groups[4].Value)
2921: {
2922: case "IS-NR": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.IsNr; break;
2923: case "OOS-AU": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAu; break;
2924: case "OOS-MA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosMa; break;
2925: case "OOS-AUMA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAuma; break;
2926: default: state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.Undefined; break;
2927: }
2928:
2929: dataOntServiceVoip.StateId = (int)state;
2930:
2931: dataOntServiceVoip.Svlan = int.Parse(Ia.Cl.Model.Default.Match(line, @"SVLAN=(\d{1,3})"));
2932:
2933: using (var db = new Ia.Ngn.Cl.Model.Ngn())
2934: {
2935: dataOntServiceVoip.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
2936:
2937: ontServiceVoip = (from osv in db.OntServiceVoips where osv.Id == dataOntServiceVoip.Id select osv).SingleOrDefault();
2938:
2939: if (ontServiceVoip == null)
2940: {
2941: dataOntServiceVoip.Created = dataOntServiceVoip.Updated = DateTime.UtcNow.AddHours(3);
2942:
2943: db.OntServiceVoips.Add(dataOntServiceVoip);
2944:
2945: insertedItemCount++;
2946: }
2947: else
2948: {
2949: existingItemCount++;
2950:
2951: if (ontServiceVoip.Update(dataOntServiceVoip))
2952: {
2953: db.OntServiceVoips.Attach(ontServiceVoip);
2954: db.Entry(ontServiceVoip).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
2955:
2956: updatedItemCount++;
2957: }
2958: }
2959:
2960: db.SaveChanges();
2961: }
2962: }
2963: else
2964: {
2965: result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
2966: }
2967: }
2968: else
2969: {
2970: result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
2971: }
2972: #endregion
2973: }
2974: else if (rowData.Contains("RTRV-ONTPOTS:"))
2975: {
2976: #region RTRV-ONTPOTS
2977:
2978: string ontOntPotsId;
2979: int card, port, svlan;
2980: Ia.Ngn.Cl.Model.OntOntPots ontOntPots, dataOntOntPots;
2981:
2982: // below: information from the definition of "RTRV-ONTPOTS" in "AMS TL1 Commands Reference"
2983:
2984: /*
2985: * ;RTRV-ONTPOTS:SUR-1-1:ONTPOTS-1-1-1-1-1-2-1;
2986:
2987: SUR-1-1 14-03-13 08:15:46
2988: M 0 COMPLD
2989: /* RTRV-ONTPOTS:SUR-1-1:ONTPOTS-1-1-1-1-1-2-1 * /
2990: "ONTPOTS-1-1-1-1-1-2-1::VOIPSERV=1,TERMID=td1,POTSDSCP=46,POTSPWR=0,
2991: CALLHIST=DISABLED,PWROVERRIDE=FALSE,SIPMSGTOTH=0,BRRPKTLOSSTH=0,XJTTRTH=0,
2992: RXGAIN=0,TXGAIN=0:IS-NR"
2993: ;
2994: */
2995:
2996: // below: read OntPosition
2997: match = Regex.Match(rowData, @"RTRV-ONTPOTS:([\w\d\-]+)", RegexOptions.Singleline);
2998:
2999: amsName = match.Groups[1].Value;
3000:
3001: match = Regex.Match(rowData, @"ONTPOTS-1-1-(\d{1,2}-\d{1,2}-\d{1,2})-(\d{1,2})-(\d{1,2})::(.+?):\s*(IS-NR|OOS-AU|OOS-MA|OOS-AUMA)", RegexOptions.Singleline);
3002:
3003: if (match.Success)
3004: {
3005: cardPortOnt = match.Groups[1].Value;
3006: card = int.Parse(match.Groups[2].Value);
3007: port = int.Parse(match.Groups[3].Value);
3008:
3009: line = match.Groups[4].Value;
3010:
3011: ontId = Ia.Ngn.Cl.Model.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
3012:
3013: if (!string.IsNullOrEmpty(ontId))
3014: {
3015: if (card >= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MinimumCardValue && card <= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MaximumCardValue && port >= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MinimumPortValue && port <= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MaximumPortValue)
3016: {
3017: ontOntPotsId = Ia.Ngn.Cl.Model.Business.Nokia.OntOntPots.OntOntPotsId(ontId, card, port);
3018:
3019: dataOntOntPots = new Ia.Ngn.Cl.Model.OntOntPots();
3020:
3021: dataOntOntPots.Id = ontOntPotsId;
3022:
3023: dataOntOntPots.Card = card;
3024: dataOntOntPots.Customer = Ia.Cl.Model.Default.Match(line, @"CUSTINFO=(\w{1,80})");
3025: dataOntOntPots.Port = port;
3026:
3027: switch (match.Groups[5].Value)
3028: {
3029: case "IS-NR": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.IsNr; break;
3030: case "OOS-AU": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAu; break;
3031: case "OOS-MA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosMa; break;
3032: case "OOS-AUMA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAuma; break;
3033: default: state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.Undefined; break;
3034: }
3035:
3036: dataOntOntPots.StateId = (int)state;
3037:
3038: if (int.TryParse(Ia.Cl.Model.Default.Match(line, @"SVLAN=(\d{1,3})"), out svlan)) dataOntOntPots.Svlan = svlan;
3039:
3040: dataOntOntPots.Termination = Ia.Cl.Model.Default.Match(line, @"TERMID=(\w{1,20})");
3041: dataOntOntPots.Tn = Ia.Cl.Model.Default.Match(line, @"TN=(\w{1,16})");
3042: dataOntOntPots.VoipClientIp = Ia.Cl.Model.Default.Match(line, @"VOIPCLIENTADDR=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
3043:
3044: using (var db = new Ia.Ngn.Cl.Model.Ngn())
3045: {
3046: dataOntOntPots.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
3047:
3048: ontOntPots = (from oop in db.OntOntPots where oop.Id == dataOntOntPots.Id select oop).SingleOrDefault();
3049:
3050: if (ontOntPots == null)
3051: {
3052: dataOntOntPots.Created = dataOntOntPots.Updated = DateTime.UtcNow.AddHours(3);
3053:
3054: db.OntOntPots.Add(dataOntOntPots);
3055:
3056: insertedItemCount++;
3057: }
3058: else
3059: {
3060: existingItemCount++;
3061:
3062: if (ontOntPots.Update(dataOntOntPots))
3063: {
3064: db.OntOntPots.Attach(ontOntPots);
3065: db.Entry(ontOntPots).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
3066:
3067: updatedItemCount++;
3068: }
3069: }
3070:
3071: db.SaveChanges();
3072: }
3073: }
3074: else
3075: {
3076: result.AddError(@"Card and/or port value is invalid: card:" + card + ", port:" + port);
3077: }
3078: }
3079: else
3080: {
3081: result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
3082: }
3083: }
3084: else
3085: {
3086: result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
3087: }
3088:
3089: #endregion
3090: }
3091: else if (rowData.Contains("ED-ONTPOTS:"))
3092: {
3093: #region ED-ONTPOTS
3094:
3095: string ontOntPotsId;
3096: int card, port;
3097: Ia.Ngn.Cl.Model.OntOntPots ontOntPots, dataOntOntPots;
3098:
3099: /* ED-ONTPOTS:SUL-1-1:ONTPOTS-1-1-9-1-1-2-1:14614:::CUSTINFO=24977777: */
3100: /* ED-ONTPOTS:SJA-JHR-LAG14:ONTPOTS-1-1-1-6-4-0-0:2425:::CUSTINFO=24531914: */
3101:
3102: // below: read OntPosition
3103: match = Regex.Match(rowData, @"ED-ONTPOTS:([\w\d\-]+)", RegexOptions.Singleline);
3104:
3105: amsName = match.Groups[1].Value;
3106:
3107: match = Regex.Match(rowData, @"ONTPOTS-1-1-(\d{1,2}-\d{1,2}-\d{1,2})-(\d{1,2})-(\d{1,2}):(.+?):", RegexOptions.Singleline);
3108:
3109: if (match.Success)
3110: {
3111: cardPortOnt = match.Groups[1].Value;
3112: card = int.Parse(match.Groups[2].Value);
3113: port = int.Parse(match.Groups[3].Value);
3114:
3115: line = match.Groups[4].Value;
3116:
3117: ontId = Ia.Ngn.Cl.Model.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
3118:
3119: if (!string.IsNullOrEmpty(ontId))
3120: {
3121: if (card >= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MinimumCardValue && card <= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MaximumCardValue && port >= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MinimumPortValue && port <= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MaximumPortValue)
3122: {
3123: ontOntPotsId = Ia.Ngn.Cl.Model.Business.Nokia.OntOntPots.OntOntPotsId(ontId, card, port);
3124:
3125: dataOntOntPots = new Ia.Ngn.Cl.Model.OntOntPots();
3126:
3127: dataOntOntPots.Id = ontOntPotsId;
3128:
3129: dataOntOntPots.Card = card;
3130: dataOntOntPots.Customer = Ia.Cl.Model.Default.Match(line, @"CUSTINFO=(\w{1,80})");
3131: dataOntOntPots.Port = port;
3132:
3133: using (var db = new Ia.Ngn.Cl.Model.Ngn())
3134: {
3135: dataOntOntPots.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
3136:
3137: ontOntPots = (from oop in db.OntOntPots where oop.Id == dataOntOntPots.Id select oop).SingleOrDefault();
3138:
3139: if (ontOntPots == null)
3140: {
3141: dataOntOntPots.Created = dataOntOntPots.Updated = DateTime.UtcNow.AddHours(3);
3142:
3143: db.OntOntPots.Add(dataOntOntPots);
3144:
3145: insertedItemCount++;
3146: }
3147: else
3148: {
3149: existingItemCount++;
3150:
3151: if (ontOntPots.Update(dataOntOntPots))
3152: {
3153: db.OntOntPots.Attach(ontOntPots);
3154: db.Entry(ontOntPots).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
3155:
3156: updatedItemCount++;
3157: }
3158: }
3159:
3160: db.SaveChanges();
3161: }
3162: }
3163: else
3164: {
3165: result.AddError(@"Card and/or port value is invalid: card:" + card + ", port:" + port);
3166: }
3167: }
3168: else
3169: {
3170: result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
3171: }
3172: }
3173: else
3174: {
3175: result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
3176: }
3177:
3178: #endregion
3179: }
3180: else if (rowData.Contains("RTRV-ALM-PON:"))
3181: {
3182: // Note: this RTRV-ALM-PON: commnad is never issued by code actally. New ONTs are detected below (see "REPT ALM") as part of regular events
3183: #region RTRV-ALM-PON
3184:
3185: Ia.Ngn.Cl.Model.Event @event;
3186:
3187: // below: important, remove all ''' char from string
3188: rowData = rowData.Replace(@"'", "");
3189:
3190: // below: read eventTime and amsName
3191: // QRW-1-1 14-03-31 06:15:20
3192: match = Regex.Match(rowData, @"([\w\d\-]+) ((\d{2})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}))", RegexOptions.Singleline);
3193:
3194: amsName = match.Groups[1].Value;
3195: eventTime = DateTime.ParseExact(match.Groups[2].Captures[0].Value, "yy-MM-dd HH:mm:ss", null);
3196:
3197: // old "PON-1-1-9-2,PON:MN,NEWONT,NSA,,,,: \"SERNUM =ALCLA0A2D17A, SLID =DEFAULT,\""
3198: // old matchCollection = Regex.Matches(rowData, @"""(PON-\d{1,2}-\d{1,2}-\d{1,2}-\d{1,2}),PON:MN,NEWONT,NSA,,,,:\s*\r\n\s*""(SERNUM\s*=\s*(ALCL\w{8}), SLID\s*=\s*DEFAULT,)""""", RegexOptions.Singleline);
3199:
3200: /*
3201: "PON-1-1-10-3:CL,NEWONT,NSA,5-26,23-8-36,,:,
3202: "SERNUM =ALCLA0A22564, SLID =DEFAULT ,
3203: LOID = , USRATE =1.25g""
3204: */
3205:
3206: matchCollection = Regex.Matches(rowData, @"""(PON-\d{1,2}-\d{1,2}-\d{1,2}-\d{1,2}):(CL|MN),NEWONT,NSA,\d{1,2}-\d{1,2},\d{1,2}-\d{1,2}-\d{1,2},,:,\s*\r\n\s*""(SERNUM\s*=\s*(ALCL\w{8}),\s*SLID\s*=\s*DEFAULT\s*,)\s*\r\n\s*.+?""""", RegexOptions.Singleline);
3207:
3208: if (matchCollection.Count > 0)
3209: {
3210: using (var db = new Ia.Ngn.Cl.Model.Ngn())
3211: {
3212: foreach (Match m in matchCollection)
3213: {
3214: if (m.Success)
3215: {
3216: @event = new Ia.Ngn.Cl.Model.Event();
3217:
3218: @event.Aid = m.Groups[1].Value;
3219: @event.Cause = "NEWONT";
3220: @event.Class = "ONT";
3221: @event.Detail = m.Groups[3].Value;
3222: @event.EventTime = eventTime;
3223: @event.NodeTime = null;
3224: @event.Number = 0;
3225: @event.SeverityEffect = "NSA";
3226: @event.Severity = m.Groups[2].Value;
3227: @event.System = amsName;
3228: @event.TypeId = 0;
3229:
3230: @event.Created = @event.Updated = DateTime.UtcNow.AddHours(3);
3231: db.Events.Add(@event);
3232:
3233: insertedItemCount++;
3234: }
3235: }
3236:
3237: db.SaveChanges();
3238: }
3239: }
3240: else
3241: {
3242: result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
3243: }
3244:
3245: #endregion
3246: }
3247: else if (rowData.Contains("REPT ALM"))
3248: {
3249: #region REPT ALM
3250:
3251: string _class, aid;
3252: Ia.Ngn.Cl.Model.Event @event;
3253:
3254: // below: important, remove all ''' char from string
3255: rowData = rowData.Replace(@"'", "");
3256:
3257: // SUR-1-2 08-07-18 11:24:06 * 491 REPT ALM ONT "ONT-1-1-9-2-5:MN,INACT,SA,7-18,11-24-6:\"ONT is inactive\"" ;
3258:
3259: /*
3260: SLA-SUR-LAG16 18-06-24 18:21:01
3261: A 37211 REPT ALM ONT
3262: "ONT-1-1-5-9-20:CL,DG,SA,6-24,18-21-1:
3263: "Received Dying Gasp indication from ONT","
3264: ; */
3265: // old: match = Regex.Match(rowData, @"([\w\d\-]+) ((\d{2})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}))\r\n(.{1,10})\s+(\d{1,6}) REPT (ALM|EVT|ALM ENV|SW) (\w{1,20})\r\n\s+""(\w{1,20})-(\d{1,2})-(\d{1,2})-([^:]+?):(CR|MJ|MN|CL),(\w{1,20}),(SA|NSA|NR|Ind NR),((\d{1,2})-(\d{1,2})),((\d{1,2})-(\d{1,2})-(\d{1,2})).*:[\r\n\s]*""(.+?)""[,]{0,1}""\r\n;", RegexOptions.Singleline);
3266: match = Regex.Match(rowData, @"([\w\d\-]+) ((\d{2})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}))\r\n(.{1,10})\s+(\d{1,6}) REPT (ALM|EVT|ALM ENV|SW) (\w{1,20})\r\n\s+""(\w{1,20})-(\d{1,2})-(\d{1,2})-([^:]+?):(CR|MJ|MN|CL),(\w{1,20}),(SA|NSA|NR|Ind NR),((\d{1,2})-(\d{1,2})),((\d{1,2})-(\d{1,2})-(\d{1,2})).*:.*[\r\n\s]*""(.+?)""[,]{0,1}""\r\n;", RegexOptions.Singleline);
3267:
3268: if (match.Success)
3269: {
3270: amsName = match.Groups[1].Value;
3271:
3272: _class = match.Groups[12].Captures[0].Value;
3273: aid = match.Groups[13].Captures[0].Value + "-" + match.Groups[14].Captures[0].Value + "-" + match.Groups[15].Captures[0].Value + "-" + match.Groups[16].Captures[0].Value;
3274:
3275: ontPosition = CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(amsName, _class, aid);
3276: ontId = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdByPosition(ontPosition);
3277:
3278: @event = new Ia.Ngn.Cl.Model.Event();
3279:
3280: @event.Aid = aid;
3281: @event.Cause = match.Groups[18].Captures[0].Value;
3282: @event.Class = _class;
3283: @event.Detail = match.Groups[27].Captures[0].Value.Replace(@"""", "");
3284: @event.EventTime = DateTime.ParseExact(match.Groups[2].Captures[0].Value, "yy-MM-dd HH:mm:ss", null);
3285: @event.NodeTime = DateTime.ParseExact(match.Groups[3].Captures[0].Value + "-" + match.Groups[21].Captures[0].Value.PadLeft(2, '0') + "-" + match.Groups[22].Captures[0].Value.PadLeft(2, '0') + " " + match.Groups[24].Captures[0].Value.PadLeft(2, '0') + ":" + match.Groups[25].Captures[0].Value.PadLeft(2, '0') + ":" + match.Groups[26].Captures[0].Value.PadLeft(2, '0'), "yy-MM-dd HH:mm:ss", null);
3286: @event.Number = int.Parse(match.Groups[10].Captures[0].Value);
3287: @event.SeverityEffect = match.Groups[19].Captures[0].Value;
3288: @event.Severity = match.Groups[17].Captures[0].Value;
3289: @event.System = amsName;
3290: @event.TypeId = 0;
3291:
3292: using (var db = new Ia.Ngn.Cl.Model.Ngn())
3293: {
3294: if (ontId != null) @event.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
3295:
3296: @event.Created = @event.Updated = DateTime.UtcNow.AddHours(3);
3297: db.Events.Add(@event);
3298:
3299: insertedItemCount++;
3300:
3301: db.SaveChanges();
3302: }
3303: }
3304: else
3305: {
3306: result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: REPT ALM [" + rowData + "] was not matched.");
3307: }
3308:
3309: #endregion
3310: }
3311:
3312: if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
3313: else isUpdated = false;
3314:
3315: result.AddSuccess("(" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
3316:
3317: return isUpdated;
3318: }
3319:
3320: ////////////////////////////////////////////////////////////////////////////
3321:
3322: /// <summary>
3323: ///
3324: /// </summary>
3325: private static string CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(string amsName, string _class, string aid)
3326: {
3327: /*
3328: --BRGPORT BRGPORT-1-1-11-2-6-1-1
3329: --PON PON-1-1-13-1
3330: --EQPT LT-1-1-14
3331: --ONTPOTS ONTPOTS-1-1-8-1-17-2-2
3332: --ONTVOIP VOIP-1-1-13-2-22-1
3333: --ONT ONT-1-1-13-1-10
3334: --ONTENET ONTENET-1-1-2-1-20-1-1
3335: --ONTCARD ONTCARD-1-1-9-2-8-1
3336: --ONTHSI HSI-1-1-2-1-8-1-2-2
3337: */
3338:
3339: string ontPosition;
3340: Match match;
3341:
3342: ontPosition = string.Empty;
3343:
3344: if (!string.IsNullOrEmpty(aid) && !string.IsNullOrEmpty(_class))
3345: {
3346: if (_class == "BRGPORT")
3347: {
3348: // BRGPORT BRGPORT-1-1-11-2-6-1-1
3349: match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
3350:
3351: if (match.Success)
3352: {
3353: ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
3354: }
3355: else
3356: {
3357: throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
3358: }
3359: }
3360: else if (_class == "PON")
3361: {
3362: // PON PON-1-1-13-1
3363: match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
3364:
3365: if (match.Success)
3366: {
3367: ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-1"; // I will assign the first ONT in the PON as indication to the PON
3368: }
3369: else
3370: {
3371: throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
3372: }
3373: }
3374: else if (_class == "EQPT")
3375: {
3376: // EQPT LT-1-1-14
3377: match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
3378:
3379: if (match.Success)
3380: {
3381: ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-1"; // I will assign the first PON ONT in the PON as indication to the PON
3382: }
3383: else
3384: {
3385: throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
3386: }
3387: }
3388: else if (_class == "ONTPOTS")
3389: {
3390: // ONTPOTS ONTPOTS-1-1-8-1-17-2-2
3391: match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
3392:
3393: if (match.Success)
3394: {
3395: ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
3396: }
3397: else
3398: {
3399: throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
3400: }
3401: }
3402: else if (_class == "ONTVOIP")
3403: {
3404: // ONTVOIP VOIP-1-1-13-2-22-1
3405: match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
3406:
3407: if (match.Success)
3408: {
3409: ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
3410: }
3411: else
3412: {
3413: throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
3414: }
3415: }
3416: else if (_class == "ONT")
3417: {
3418: // ONT ONT-1-1-13-1-10
3419: match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
3420:
3421: if (match.Success)
3422: {
3423: ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
3424: }
3425: else
3426: {
3427: throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
3428: }
3429: }
3430: else if (_class == "ONTENET")
3431: {
3432: // ONTENET ONTENET-1-1-2-1-20-1-1
3433: match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
3434:
3435: if (match.Success)
3436: {
3437: ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
3438: }
3439: else
3440: {
3441: throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
3442: }
3443: }
3444: else if (_class == "ONTCARD")
3445: {
3446: // ONTCARD ONTCARD-1-1-9-2-8-1
3447: match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
3448:
3449: if (match.Success)
3450: {
3451: ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
3452: }
3453: else
3454: {
3455: throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
3456: }
3457: }
3458: else if (_class == "ONTHSI")
3459: {
3460: // ONTHSI HSI-1-1-2-1-8-1-2-2
3461: match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
3462:
3463: if (match.Success)
3464: {
3465: ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
3466: }
3467: else
3468: {
3469: throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
3470: }
3471: }
3472: else
3473: {
3474: throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + ". Class is unknown.") { };
3475: }
3476: }
3477: else
3478: {
3479: throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): aid and/or class are null.") { };
3480: }
3481:
3482: return ontPosition;
3483: }
3484:
3485: ////////////////////////////////////////////////////////////////////////////
3486:
3487: /// <summary>
3488: ///
3489: /// </summary>
3490: public bool AddPot(string td)
3491: {
3492: bool b;
3493:
3494: b = true;
3495:
3496:
3497: return b;
3498: }
3499:
3500: ////////////////////////////////////////////////////////////////////////////
3501:
3502: /// <summary>
3503: ///
3504: /// </summary>
3505: public static string CommandsToDeleteAndCreateServiceVoipUsingNdd(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt, Ia.Ngn.Cl.Model.Ont ont, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
3506: {
3507: string sa, cardPortOnt, voipServiceState;
3508:
3509: sa = string.Empty;
3510:
3511: foreach (Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.PonGroup ponGroup in olt.PonGroupList)
3512: {
3513: cardPortOnt = nddOnt.CardSlot + "-" + nddOnt.Port + "-" + nddOnt.InternalNumber;
3514:
3515: if (edServiceVoipIsOos) voipServiceState = "OOS";
3516: else voipServiceState = "IS";
3517:
3518: sa = @"
3519: # Delete then create VOIP and associated ONTPOTS: " + nddOnt.Access.Name + @" " + nddOnt.Position;
3520:
3521: if (ont != null)
3522: {
3523: if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Sfu || ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Gfu || ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Undefined)
3524: {
3525: sa += @"
3526:
3527: # Delete ONTPOTS
3528: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4:::::OOS;
3529: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4::;
3530:
3531: # Delete VOIP
3532: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
3533: DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
3534:
3535: # Create VOIP
3536: ENT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1::::BWPROFUPID=1,BWPROFDNID=1,PQPROFID=1,LABEL=" + nddOnt.Access.Name + @",SVLAN=" /*+ ponGroup.Olt.Vlan*/ + @",IPADDRLOC=" + nddOnt.Ip + @",NETMASKLOC=" + nddOnt.MgcSubnetMask + @",DEFROUTER=" + ponGroup.GatewayIp + @",IPADDRMGC=" + nddOnt.MgcIp + @",IPADDRMGCSEC=" + nddOnt.MgcSecondaryIp + @",VOIPMODE=SSH248,CONFIGFILE=" + olt.Odf.Router.Oams.FirstOrDefault().ConfigFile + @":IS;
3537:
3538: # Create ONTPOTS
3539: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
3540: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
3541: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
3542: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
3543:
3544: # VOIP service state
3545: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
3546:
3547:
3548: ";
3549: }
3550: else if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Soho)
3551: {
3552: sa += @"
3553:
3554: # Delete ONTPOTS
3555: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8:::::OOS;
3556: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8::;
3557:
3558: # Delete VOIP
3559: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
3560: DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
3561:
3562: # Create VOIP
3563: ENT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1::::BWPROFUPID=1,BWPROFDNID=1,PQPROFID=1,LABEL=" + nddOnt.Access.Name + @",SVLAN=" /*+ ponGroup.Vlan*/ + @",IPADDRLOC=" + nddOnt.Ip + @",NETMASKLOC=" + nddOnt.MgcSubnetMask + @",DEFROUTER=" + ponGroup.GatewayIp + @",IPADDRMGC=" + nddOnt.MgcIp + @",IPADDRMGCSEC=" + nddOnt.MgcSecondaryIp + @",VOIPMODE=SSH248,CONFIGFILE=" + olt.Odf.Router.Oams.FirstOrDefault().ConfigFile + @":IS;
3564:
3565: # Create ONTPOTS
3566: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
3567: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
3568: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
3569: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
3570: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td5:IS;
3571: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td6:IS;
3572: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td7:IS;
3573: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td8:IS;
3574:
3575: # VOIP service state
3576: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
3577:
3578:
3579: ";
3580: }
3581: else if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu || ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Gmdu)
3582: {
3583: sa += @"
3584:
3585: # Delete ONTPOTS
3586: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1&&-8:::::OOS;
3587: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8:::::OOS;
3588: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1&&-8:::::OOS;
3589: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1&&-8::;
3590: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8::;
3591: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1&&-8::;
3592:
3593: # Delete VOIP
3594: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
3595: DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
3596:
3597: # Create VOIP
3598: ENT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1::::BWPROFUPID=8,BWPROFDNID=8,PQPROFID=1,AESENABLE=DISABLE,LABEL=" + nddOnt.Access.Name + @",SVLAN=" /*+ ponGroup.Vlan*/ + @",IPADDRLOC=" + nddOnt.Ip + @",NETMASKLOC=" + nddOnt.MgcSubnetMask + @",DEFROUTER=" + ponGroup.GatewayIp + @",IPADDRMGC=" + nddOnt.MgcIp + @",IPADDRMGCSEC=" + nddOnt.MgcSecondaryIp + @",IPADDRFTP=0.0.0.0,DHCP=DISABLE,PORTMGC=2944,VOIPDSCP=24,VOIPMODE=SSH248,CONFIGFILE=" + olt.Odf.Router.Oams.FirstOrDefault().ConfigFile + @":IS;
3599:
3600: # Create ONTPOTS
3601: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1::::VOIPSERV=1,TERMID=td1:IS;
3602: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-2::::VOIPSERV=1,TERMID=td2:IS;
3603: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-3::::VOIPSERV=1,TERMID=td3:IS;
3604: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-4::::VOIPSERV=1,TERMID=td4:IS;
3605: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-5::::VOIPSERV=1,TERMID=td13:IS;
3606: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-6::::VOIPSERV=1,TERMID=td14:IS;
3607: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-7::::VOIPSERV=1,TERMID=td15:IS;
3608: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-8::::VOIPSERV=1,TERMID=td16:IS;
3609:
3610: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td5:IS;
3611: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td6:IS;
3612: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td7:IS;
3613: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td8:IS;
3614: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td17:IS;
3615: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td18:IS;
3616: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td19:IS;
3617: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td20:IS;
3618:
3619: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1::::VOIPSERV=1,TERMID=td9:IS;
3620: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-2::::VOIPSERV=1,TERMID=td10:IS;
3621: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-3::::VOIPSERV=1,TERMID=td11:IS;
3622: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-4::::VOIPSERV=1,TERMID=td12:IS;
3623: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-5::::VOIPSERV=1,TERMID=td21:IS;
3624: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-6::::VOIPSERV=1,TERMID=td22:IS;
3625: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-7::::VOIPSERV=1,TERMID=td23:IS;
3626: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-8::::VOIPSERV=1,TERMID=td24:IS;
3627:
3628: # VOIP service state
3629: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
3630:
3631:
3632: ";
3633: }
3634: else
3635: {
3636: throw new Exception("Unknown familyType") { };
3637: }
3638: }
3639: else
3640: {
3641:
3642: sa = @"
3643: # Delete then create VOIP and associated ONTPOTS: " + nddOnt.Access.Name + @" " + nddOnt.Position;
3644:
3645: sa += @"
3646: # ONT does not have an associated Access to it.";
3647:
3648: sa += @"
3649:
3650: # Delete ONTPOTS
3651: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4:::::OOS;
3652: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4::;
3653:
3654: # Delete VOIP
3655: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
3656: DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
3657:
3658: # Create VOIP
3659: ENT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1::::BWPROFUPID=1,BWPROFDNID=1,PQPROFID=1,LABEL=" + nddOnt.Access.Name + @",SVLAN=" /*+ ponGroup.Vlan*/ + @",IPADDRLOC=" + nddOnt.Ip + @",NETMASKLOC=" + nddOnt.MgcSubnetMask + @",DEFROUTER=" + ponGroup.GatewayIp + @",IPADDRMGC=" + nddOnt.MgcIp + @",IPADDRMGCSEC=" + nddOnt.MgcSecondaryIp + @",VOIPMODE=SSH248,CONFIGFILE=" + olt.Odf.Router.Oams.FirstOrDefault().ConfigFile + @":IS;
3660:
3661: # Create ONTPOTS
3662: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
3663: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
3664: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
3665: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
3666:
3667: # VOIP service state
3668: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
3669:
3670:
3671: ";
3672: }
3673: }
3674:
3675: return sa;
3676: }
3677:
3678: ////////////////////////////////////////////////////////////////////////////
3679:
3680: /// <summary>
3681: ///
3682: /// </summary>
3683: public static string CommandsToCreateOntPots(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt, Ia.Ngn.Cl.Model.Ont ont, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
3684: {
3685: string sa, cardPortOnt, voipServiceState;
3686:
3687: cardPortOnt = nddOnt.CardSlot + "-" + nddOnt.Port + "-" + nddOnt.InternalNumber;
3688:
3689: if (edServiceVoipIsOos) voipServiceState = "OOS";
3690: else voipServiceState = "IS";
3691:
3692: sa = @"
3693: # Create ONTPOTS: " + ont.Access.Name + @" " + ont.Access.Position;
3694:
3695: if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Sfu || ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Gfu)
3696: {
3697: sa += @"
3698:
3699: # Create ONTPOTS
3700: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
3701: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
3702: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
3703: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
3704:
3705: # VOIP service state
3706: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
3707:
3708:
3709: ";
3710: }
3711: else if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Soho)
3712: {
3713: sa += @"
3714:
3715: # Create ONTPOTS
3716: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
3717: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
3718: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
3719: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
3720: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td5:IS;
3721: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td6:IS;
3722: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td7:IS;
3723: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td8:IS;
3724:
3725: # VOIP service state
3726: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
3727:
3728:
3729: ";
3730: }
3731: else if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu || ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Gmdu)
3732: {
3733: sa += @"
3734:
3735: # Create ONTPOTS
3736: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1::::VOIPSERV=1,TERMID=td1:IS;
3737: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-2::::VOIPSERV=1,TERMID=td2:IS;
3738: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-3::::VOIPSERV=1,TERMID=td3:IS;
3739: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-4::::VOIPSERV=1,TERMID=td4:IS;
3740: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-5::::VOIPSERV=1,TERMID=td13:IS;
3741: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-6::::VOIPSERV=1,TERMID=td14:IS;
3742: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-7::::VOIPSERV=1,TERMID=td15:IS;
3743: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-8::::VOIPSERV=1,TERMID=td16:IS;
3744:
3745: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td5:IS;
3746: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td6:IS;
3747: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td7:IS;
3748: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td8:IS;
3749: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td17:IS;
3750: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td18:IS;
3751: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td19:IS;
3752: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td20:IS;
3753:
3754: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1::::VOIPSERV=1,TERMID=td9:IS;
3755: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-2::::VOIPSERV=1,TERMID=td10:IS;
3756: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-3::::VOIPSERV=1,TERMID=td11:IS;
3757: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-4::::VOIPSERV=1,TERMID=td12:IS;
3758: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-5::::VOIPSERV=1,TERMID=td21:IS;
3759: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-6::::VOIPSERV=1,TERMID=td22:IS;
3760: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-7::::VOIPSERV=1,TERMID=td23:IS;
3761: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-8::::VOIPSERV=1,TERMID=td24:IS;
3762:
3763: # VOIP service state
3764: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
3765:
3766:
3767: ";
3768: }
3769: else
3770: {
3771: sa += @"
3772:
3773: # Unknown FamilyType
3774:
3775:
3776: ";
3777: }
3778:
3779: return sa;
3780: }
3781:
3782: ////////////////////////////////////////////////////////////////////////////
3783:
3784: /// <summary>
3785: ///
3786: /// </summary>
3787: public static List<string> CommandsToPreprovisionOntWithinOlt(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
3788: {
3789: string cardPortOnt, voipServiceState;
3790: List<string> list;
3791:
3792: list = new List<string>();
3793:
3794: if (edServiceVoipIsOos) voipServiceState = "OOS";
3795: else voipServiceState = "IS";
3796:
3797: cardPortOnt = nddOnt.CardSlot + "-" + nddOnt.Port + "-" + nddOnt.InternalNumber;
3798:
3799: //list.Add("# Preprovision an empty ONT on the network: " + nddOnt.Access.Name + @" " + nddOnt.Position + " (" + nddOnt.Ip + @");");
3800: list.Add("ENT-ONT:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONT-1-1-" + cardPortOnt + @"::::SWVERPLND=" + Ia.Ngn.Cl.Model.Data.Nokia.Ams.PlannedSoftware + @",DESC1=" + nddOnt.Access.Name + @",DESC2=""NULL"":OOS;");
3801:
3802: //list.Add("# Provision the VOIP service;");
3803: list.Add("ENT-ONTCARD:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTCARD-1-1-" + cardPortOnt + @"-2:::POTS::IS;");
3804: list.Add("ENT-ONTCARD:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTCARD-1-1-" + cardPortOnt + @"-1:::10_100BASET::IS;");
3805: list.Add("ENT-ONTENET:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTENET-1-1-" + cardPortOnt + @"-1-1::::SESSPROFID=1,MAXMACNUM=4:IS;");
3806: list.Add("ENT-ONTENET:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTENET-1-1-" + cardPortOnt + @"-1-2::::SESSPROFID=1,MAXMACNUM=4:IS;");
3807: list.Add("ENT-SERVICE-VOIP:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1::::BWPROFUPID=1,BWPROFDNID=1,PQPROFID=1,SVLAN=" /*+ nddOnt.Pon.PonGroup.Olt.Vlan*/ + @",IPADDRLOC=" + nddOnt.Ip + @",NETMASKLOC=" + nddOnt.MgcSubnetMask + @",DEFROUTER=" + nddOnt.Pon.PonGroup.GatewayIp + @",IPADDRMGC=" + nddOnt.MgcIp + @",IPADDRMGCSEC=" + nddOnt.MgcSecondaryIp + @",VOIPMODE=SSH248,CONFIGFILE=kuwait.xml:IS;");
3808: list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;");
3809: list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;");
3810: list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;");
3811: list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;");
3812:
3813: //list.Add("# VOIP service state");
3814: list.Add("ED-SERVICE-VOIP:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";");
3815:
3816: return list;
3817: }
3818:
3819: ////////////////////////////////////////////////////////////////////////////
3820:
3821: /// <summary>
3822: ///
3823: /// </summary>
3824: public static string CommandsToPreprovisionOntWithinOltUsingConfigureCommand(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
3825: {
3826: string sa, rackSubCardPortOnt;//, voipServiceState;
3827:
3828: //if (edServiceVoipIsOos) voipServiceState = "OOS";
3829: //else voipServiceState = "IS";
3830:
3831: rackSubCardPortOnt = nddOnt.Rack + "/" + nddOnt.Sub + "/" + nddOnt.CardSlot + "/" + nddOnt.Port + "/" + nddOnt.InternalNumber;
3832:
3833: sa = @"
3834: configure equipment ont slot " + rackSubCardPortOnt + @"/1 planned-card-type 10_100base plndnumdataports 2 plndnumvoiceports 0
3835: configure equipment ont slot " + rackSubCardPortOnt + @"/2 planned-card-type pots plndnumdataports 0 plndnumvoiceports 4
3836: configure qos interface ont:" + rackSubCardPortOnt + @" us-num-queue 8
3837: configure qos interface " + rackSubCardPortOnt + @"/voip upstream-queue 5 bandwidth-profile name:VOICE bandwidth-sharing ont-sharing
3838: configure bridge port " + rackSubCardPortOnt + @"/voip max-unicast-mac 8
3839: configure bridge port " + rackSubCardPortOnt + @"/voip vlan-id " /*+ nddOnt.Pon.PonGroup.Olt.Vlan*/ + @"
3840: configure bridge port " + rackSubCardPortOnt + @"/voip pvid " /*+ nddOnt.Pon.PonGroup.Olt.Vlan*/ + @"
3841: configure voice ont service " + rackSubCardPortOnt + @"/1 voip-mode softswitch-h248 mgc-ip-addr " + nddOnt.MgcIp + @" sec-mgc-ip-addr " + nddOnt.MgcSecondaryIp + @" conf-file-name " + nddOnt.Pon.PonGroup.Olt.Odf.Router.Oams.First().ConfigFile + @" ip-address " + nddOnt.Ip + @" net-mask 255.255.248.0 default-router " + nddOnt.Pon.PonGroup.GatewayIp + @" vlan " /*+ nddOnt.Pon.PonGroup.Olt.Vlan*/ + @"
3842:
3843: ";
3844:
3845: return sa;
3846: }
3847:
3848: ////////////////////////////////////////////////////////////////////////////
3849: ////////////////////////////////////////////////////////////////////////////
3850: }
3851:
3852: ////////////////////////////////////////////////////////////////////////////
3853: ////////////////////////////////////////////////////////////////////////////
3854: }