2G - Olyan osztályok, melyekből van példány

+1 vote
asked Apr 11, 2016 in IRF tantárgy by kalmant (46 points)  

A feladatban (analyze_instances.py) ha nincs megadva osztály -c paraméterként, akkor véletlenszerűen kell néhány alapján statisztikát készíteni.
Ehhez jó lenne tudni, hogy melyik osztályokból van példány. Ennek megvalósítása problémát okoz, eddig a következőre jutottam:

  • Lekérhetem az összes osztály nevét (EnumerateClassNames), és a lista összes elemével meghívok egy EnumerateInstanceNames-et és amelyik nem dob hibát, abból van példány. Ez több ezer hívást jelentene.
  • Próbálkoztam ExecQuery-vel is, ahol a query "SELECT * FROM CIMManagedElement". Ebben az esetben a visszakapott CIMInstance-k classname-jeit listába rendezve megkapom a példányok CreationClassName-jeit. Így viszont pl. LMIProcessorCacheMemory és LMIMemory szerepel a listán, a példák közt szereplő CIMMemory (ami a másik kettő superlass-a) helyett.

Nyilván minél kevesebbszer szeretnék lekérni adatokat, mi lenne egy jobb/jó megoldás?

2 Answers

+1 vote
answered Apr 13, 2016 by AbL (60 points)  
selected Apr 13, 2016 by kalmant
 
Best answer

Én találtam egy viszonylag "gyors" megoldást:
Az összes osztály nevet lekérdezed a már említett EnumerateClassNames metódussal, majd a listájukból random elemet kiválasztva megnézed hogy annak van-e példánya. Ezt addig folytatod amíg nem találsz kellő számú, példánnyal rendelkező osztályt.
Nekem átlagosan 2-5 másodperc alatt meg van az a max 5 osztály, ami a 3 perchez képes egész jó (addig tartott az összes osztályról lekérdezni hogy van-e példányuk)

commented Apr 13, 2016 by kalmant (46 points)  
Igen, végül én is erre a megoldásra jutottam. Nem tudom, hogy van-e ennél jobb vagy gazdaságosabb, de amíg jobb eszembe nem jut (amit kétlek, mert már elég sok lehetőséget végiggondoltam), addig ezt fogom benne hagyni.
commented Apr 13, 2016 by kovari (2,221 points)  
Hát igen, de eddig is ez volt az egyik opció :) Nem rossz, de ezzel még sok fölösleges lekérdezés lesz, mert a legtöbb osztálynak nincs példánya.
commented Apr 13, 2016 by kalmant (46 points)  
A potenciális osztályok listáját lehet szűkíteni (pl. a korábban felvetett nem CIM-el kezdődő feltétellel), viszont így elveszítjük pl. a CIM_Memory-t is. A feladat megoldásának szempontjából jobb ilyen szűréseket elvégezni (hiszen ekkor nagy valószínűséggel kevesebb fölösleges lekérdezés lesz) vagy nem (hiszen ekkor nem veszítünk el "jó" osztályokat)?
commented Apr 17, 2016 by Mayer Krisztián (24 points)  
És azt min keresztül tudom megnézni, hogy van-e példánya?
commented Apr 17, 2016 by AbL (60 points)  
Az EnumerateInstances / EnumerateInstanceNames függvénnyel. Ha hibát dob vagy üres listát ad vissza akkor nincs példánya az osztálynak.
+2 votes
answered Apr 11, 2016 by kovari (2,221 points)  

Nem rossz a ManagedElement példányait lekérdezni, bár ez is elég költséges (főleg, ha select * van). Az viszont nem probléma, ha egy példányról a konkrét osztálya alapján készítesz statisztikát, tehát nem az absztrakt CIM osztály alapján. Például, nyugodtan lehet az LMIMemory attribútumai alapján vizsgálni a példányokat, a CIMMemory helyett.

Ennek fényében az első opció is járható (EnumerateClassNames). Ha például a CIM absztrakt osztályoknak nem is próbálod lekérdezni a példányait, akkor sok lekérdezést meg tudsz spórolni.

commented Apr 11, 2016 by kalmant (46 points)  
Az ExecQuery nem igazán akar a select *-nál kevesebb eredménnyel visszatérni (pl. select classname is ugyanazzal tér vissza), így ez az út talán rosszabbnak tűnik.

EnumerateClassNames esetén hogy tudom egyértelműen eldönteni, hogy absztrakt osztály-e egy osztály a név alapján? Ha LMI_ -vel vagy PG_ -vel kezdődik és a CIM_ManagedElement alatt van akkor és csak akkor nem absztrakt?
commented Apr 11, 2016 by kovari (2,221 points)  
Attribútumokat pedig jól lehet vele szűrni, tehát ez működik: "Select Name from CIM_Account". Ettől függetlenül hülyeséget írtam, hiszen pont, hogy ennél a feladatnál kell minden attribútum nekünk, tehát itt nem szűrhetünk :)

A CIM kezdetű osztálynév mindig absztrakt, ezeket nem kell lekérdeznünk. A ManagementElementtel nem igazán kell foglalkozni.
commented Apr 11, 2016 by kalmant (46 points)  
Az nem tűnik elégnek, hogy nem CIM-el kezdődik az osztály neve, pl. PRS_Expression-t is visszaadja az EnumerateClassNames root/cimv2-ben. Ezért gondoltam, hogy CIM_ManagedElement-en "belül" kéne EnumerateClassNames-t hívni.
commented Apr 11, 2016 by kovari (2,221 points)  
Az is jó, mindkettőt elfogadnám.
...