通过AlarmIRP接口从OSS获取警报列表

你好 由于该主题仅在狭窄的圈子中引起关注,因此在Web上很少公开该主题。 为了填补这个空白,在我看来这个地方是最合适的。

我必须处理的设备制造商的所有控制系统中都存在CORBA AlarmIRP接口,因为它是3GPP 3G TS 32.106-2标准规定的。 以OSS-RC Ericsson为例,在其文档中至少以某种方式描述了该过程。 对于NetAct诺基亚和华为M-2000,代码将大致相同,只是在执行一个标准的细微差别上有所不同。 我将尝试尽可能清晰地描述创建用于读取警报消息列表的应用程序的过程,但是由于我以前从未用Java编写过任何东西,也没有使用过CORBA,因此我将允许自己保留一些细节,不在本文范围之内。

整个应用程序可以分为3部分:

  1. 获取IOR接口
  2. 创建引用接口的对象
  3. 调用接口方法

因此,根据文档,IOR存储在两个位置:在文件中
/var/opt/ericsson/blkcm/data/bulkcm.nameservice
并在网络服务器上
HTTP://“ masterhost ip”:80 / ior / ExternalNameService.ior
我们将使用第一种方法:

private String readIOR() { String mastersvc = "/var/opt/ericsson/blkcm/data/bulkcm.nameservice"; File f = new File(mastersvc); BufferedReader br; String iorContents = null; try { br = new BufferedReader(new FileReader(f)); iorContents = br.readLine(); br.close(); } catch (IOException e) { e.printStackTrace(); } return iorContents; } 

确切地说,上述方法将返回的不是IOR,而是指向NameService的链接(CORBA术语),可以从Web服务器上的IOR文件获得该链接。 如果更简单:我们将使用结果来初始化连接。

第二阶段是ORB连接对象的初始化:

 public void createAlarmObj(){ org.omg.CORBA.Object rootObj = null; NamingContextExt rootNameCon = null; Properties props = new Properties(); props.put("org.omg.CORBA.ORBInitRef", "NameService=" + readIOR()); org.omg.CORBA.ORB orb = ORB.init(new String[0], props); // Resolve the CORBA Naming Service try { rootObj = orb.resolve_initial_references("NameService"); rootNameCon = NamingContextExtHelper.narrow(rootObj); String s = "com/ericsson/nms/fm_cirpagent/AlarmIRP"; //Locate Alarm IRP rootObj = rootNameCon.resolve(rootNameCon.to_name(s)); _alarmIrp = com.ericsson.irp.AlarmIRPSystem._AlarmIRPOperationsHelper.narrow(rootObj); } catch (InvalidName | NotFound | CannotProceed | org.omg.CosNaming.NamingContextPackage.InvalidName e) { e.printStackTrace(); } } 

现在,我们有了一个对象的链接,可以通过调用其方法来访问该对象。 特别是, get_alarm_list方法返回我们需要的列表。 这是他在3GPP中的经文:
此方法返回警报信息。 如果标志是
正确,所有返回的警报信息应在AlarmInformationSeq中
包含0.1或更多警报信息。 输出参数迭代
应该没用。 如果标志为FALSE,则不应显示任何警报信息
在AlarmInformationSeq中。 IRPAgent需要使用iter来检索它们。

 public void getActiveAlarms(){ BooleanHolder flag = new BooleanHolder(false); // false for iteration com.ericsson.irp.AlarmIRPSystem.AlarmInformationIteratorHolder iter = new com.ericsson.irp.AlarmIRPSystem.AlarmInformationIteratorHolder(); try { _alarmIrp.get_alarm_list(alarmFilter, flag, iter); EventBatchHolder alarmInformation = new EventBatchHolder(); short alarmSize = 100; List<StructuredEvent> alarms = new ArrayList<StructuredEvent>(); boolean haveMoreAlarms = false; do{ if (iter.value != null) { haveMoreAlarms = iter.value.next_alarmInformations(alarmSize, alarmInformation); alarms.addAll(Arrays.asList(alarmInformation.value)); } }while (haveMoreAlarms); for (StructuredEvent alarm: alarms) { alarmPrint(alarm); } } } catch (GetAlarmList | ParameterNotSupported | InvalidParameter | NextAlarmInformations e) { e.printStackTrace(); } } 

此方法接收一个迭代器,该迭代器包含类型为StructuredEvent的对象形式的警报列表,然后在控制台中显示alarmPrint(警报)StructuredEvent条目包含标题,并且实际上包含filterable_data数据。 数据也是具有名称和值value的记录 。 字段的描述也在标准中:
const string NV_NOTIFICATION_ID =“ a”;
const string NV_CORRELATED_NOTIFICATIONS =“ b”;
const string NV_EVENT_TIME =“ c”;
const string NV_SYSTEM_DN =“ d”;
const string NV_MANAGED_OBJECT_CLASS =“ e”;
常量字符串NV_MANAGED_OBJECT_INSTANCE =“ f”;
const string NV_SPECIFIC_PROBLEM =“ i”;
...

现在,我们将所有这些收集在一起,并导出例如instancespecific_problem

 private void alarmPrint(StructuredEvent alarm){ String result = "" if (alarm.filterable_data != null) { for (Property filterableData: alarm.filterable_data) { String fieldName = filterableData.name; switch (fieldName){ case "f": result = result + filterableData.value.extract_string() + ";"; break; case "i": result = result + filterableData.value.extract_string(); break; } } } System.out.println(result); } 

最后,生成的草稿的完整代码为:

完整代码
 import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import org.omg.CORBA.*; import org.omg.CORBA.ORBPackage.InvalidName; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.CosNaming.NamingContextPackage.CannotProceed; import org.omg.CosNaming.NamingContextPackage.NotFound; import org.omg.CosNotification.EventBatchHolder; import org.omg.CosNotification.Property; import org.omg.CosNotification.StructuredEvent; import com.ericsson.irp.AlarmIRPSystem.GetAlarmList; import com.ericsson.irp.AlarmIRPSystem.InvalidParameter; import com.ericsson.irp.AlarmIRPSystem.NextAlarmInformations; import com.ericsson.irp.AlarmIRPSystem.ParameterNotSupported; public class AlarmClient { private com.ericsson.irp.AlarmIRPSystem._AlarmIRPOperations _alarmIrp = null; public static void main(String[] args) { AlarmClient ac = new AlarmClient(); ac.createAlarmObj(); ac.getActiveAlarms(); } private String readIOR() { File f = new File("/var/opt/ericsson/blkcm/data/bulkcm.nameservice"); BufferedReader br; String iorContents = null; try { br = new BufferedReader(new FileReader(f)); iorContents = br.readLine(); br.close(); } catch (IOException e) { e.printStackTrace(); } return iorContents; } public void createAlarmObj(){ org.omg.CORBA.Object rootObj = null; NamingContextExt rootNameCon = null; Properties props = new Properties(); props.put("org.omg.CORBA.ORBInitRef", "NameService=" + readIOR()); org.omg.CORBA.ORB orb = ORB.init(new String[0], props); // Resolve the CORBA Naming Service try { rootObj = orb.resolve_initial_references("NameService"); rootNameCon = NamingContextExtHelper.narrow(rootObj); String s = "com/ericsson/nms/fm_cirpagent/AlarmIRP"; //Locate Alarm IRP rootObj = rootNameCon.resolve(rootNameCon.to_name(s)); _alarmIrp = com.ericsson.irp.AlarmIRPSystem._AlarmIRPOperationsHelper.narrow(rootObj); //System.out.println(_alarmIrp); } catch (InvalidName | NotFound | CannotProceed | org.omg.CosNaming.NamingContextPackage.InvalidName e) { e.printStackTrace(); } } public void getActiveAlarms(){ BooleanHolder flag = new BooleanHolder(false); // false for iteration com.ericsson.irp.AlarmIRPSystem.AlarmInformationIteratorHolder iter = new com.ericsson.irp.AlarmIRPSystem.AlarmInformationIteratorHolder(); try { _alarmIrp.get_alarm_list("", flag, iter); EventBatchHolder alarmInformation = new EventBatchHolder(); short alarmSize = 100; List<StructuredEvent> alarms = new ArrayList<StructuredEvent>(); boolean haveMoreAlarms = false; do{ if (iter.value != null) { haveMoreAlarms = iter.value.next_alarmInformations(alarmSize, alarmInformation); alarms.addAll(Arrays.asList(alarmInformation.value)); } }while (haveMoreAlarms); if (iter.value != null) { for (StructuredEvent alarm: alarms) { alarmPrint(alarm); } } } catch (GetAlarmList | ParameterNotSupported | InvalidParameter | NextAlarmInformations e) { e.printStackTrace(); } } private void alarmPrint(StructuredEvent alarm){ String result = ""; if (alarm.filterable_data != null) { for (Property filterableData: alarm.filterable_data) { String fieldName = filterableData.name; switch (fieldName){ case "f": result = result + filterableData.value.extract_string() + ";"; break; case "i": result = result + filterableData.value.extract_string(); break; } } } System.out.println(result); } } 


通过以下命令执行启动:
java -cp.:/opt/ericsson/fm_core/classes/alarmirp.jar AlarmClient

结果是什么:除了“风扇”,我还没有使用其他应用程序。 将来会有NotificationIRP-在事件出现后立即接收事件, BulkCmIRP-从外部系统进行配置等。 该技术与之类似,但如有必要,您可以撰写另一篇文章。 也许,这就是这个主题的全部。 我可以在评论中回答问题。 谢谢你

Source: https://habr.com/ru/post/zh-CN422293/


All Articles