Mendapatkan daftar alarm dari OSS melalui antarmuka AlarmIRP

Halo Topik ini diungkapkan dengan sangat buruk di Web karena hanya menarik di kalangan sempit. Untuk mengisi celah ini sedikit, tempat ini menurut saya paling cocok.

Antarmuka CORBA AlarmIRP hadir di semua sistem kontrol produsen peralatan yang harus saya tangani, karena itu ditentukan oleh 3GPP 3G TS 32.106-2 standar. Pertimbangkan OSS-RC Ericsson sebagai contoh, yang dalam dokumentasinya prosesnya setidaknya dijelaskan. Untuk NetAct Nokia dan Huawei M-2000, kodenya akan kurang lebih sama, dengan perbedaan dalam nuansa implementasi satu standar. Saya akan mencoba menjelaskan sejelas mungkin proses membuat aplikasi untuk membaca daftar pesan alarm, tetapi karena saya belum pernah menulis apa pun di Jawa sebelumnya dan belum bekerja dengan CORBA, saya akan membiarkan diri saya meninggalkan beberapa detail di luar ruang lingkup artikel ini.

Seluruh aplikasi dapat dibagi menjadi 3 bagian:

  1. mendapatkan antarmuka IOR
  2. membuat objek referensi antarmuka
  3. memanggil metode antarmuka

Jadi, menurut dokumentasi, IOR disimpan di dua tempat: di file
/var/opt/ericsson/blkcm/data/bulkcm.nameservice
dan di server web
http: // "masterhost ip": 80 / ior / ExternalNameService.ior
Kami akan menggunakan metode pertama:

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

Lebih tepatnya, metode di atas akan mengembalikan kita bukan IOR, tetapi tautan ke NameService (terminologi CORBA), yang bisa kita dapatkan dari file IOR di server web. Jika lebih sederhana: kami akan menggunakan hasilnya untuk menginisialisasi koneksi.

Tahap kedua adalah inisialisasi objek koneksi 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(); } } 

Sekarang kita memiliki tautan ke objek yang dapat kita akses dengan memanggil metode-metodenya. Secara khusus, metode get_alarm_list mengembalikan daftar yang kita butuhkan. Ini tulisannya dari 3GPP:
Metode ini mengembalikan Informasi Alarm. Jika bendera
BENAR, semua Informasi Alarm yang dikembalikan harus dalam AlarmInformationSeq
yang mengandung 0,1 atau lebih Informasi Alarm. Parameter output iter
akan menjadi tidak berguna. Jika flag FALSE, tidak ada Informasi Alarm
di AlarmInformationSeq. IRPAgent perlu menggunakannya untuk mengambilnya.

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

Metode ini menerima iterator yang berisi daftar alarm dalam bentuk objek bertipe StructuredEvent yang kemudian menampilkan alarmPrint (alarm) di konsol. Entri StructuredEvent berisi header dan, pada kenyataannya, data filterable_data . Data juga merupakan catatan dengan nama nama dan nilai nilai . Deskripsi bidang juga dalam standar:
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";
const string NV_MANAGED_OBJECT_INSTANCE = "f";
const string NV_SPECIFIC_PROBLEM = "i";
...

Sekarang kita akan mengumpulkan semua ini bersama-sama dan memperoleh contoh dan spesifik_problem misalnya :

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

Akhirnya, kode lengkap untuk konsep yang dihasilkan:

Kode lengkap
 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); } } 


Peluncuran dilakukan dengan perintah:
java -cp .: / opt / ericsson / fm_core / classes / alarmirp.jar AlarmClient

Apa hasilnya: selain "kipas", saya belum menggunakan aplikasi lain. Di masa depan ada NotificationIRP - menerima acara segera setelah penampilan mereka, BulkCmIRP - konfigurasi dari sistem eksternal, dll. Teknologi ini mirip, tetapi jika perlu, Anda dapat menulis artikel terpisah. Mungkin, itu saja tentang masalah ini. Saya bisa menjawab pertanyaan di komentar. Terima kasih

Source: https://habr.com/ru/post/id422293/


All Articles