00001 #ifndef EVMS_ACCESS_H 00002 #define EVMS_ACCESS_H 00003 00004 #include <iostream> 00005 #include <list> 00006 00007 extern "C" 00008 { 00009 #define bool boolean 00010 #include <appAPI.h> 00011 #undef bool 00012 } 00013 00014 using namespace std; 00015 00016 typedef enum { EVMS_UNKNOWN, EVMS_DISK, EVMS_SEGMENT, EVMS_REGION, EVMS_PLUGIN, 00017 EVMS_CONTAINER, EVMS_VOLUME, EVMS_OBJ } ObjType; 00018 00019 class EvmsAccess; 00020 00021 class EvmsObject 00022 { 00023 public: 00024 EvmsObject() { Init(); }; 00025 EvmsObject( object_handle_t id ); 00026 virtual ~EvmsObject(); 00027 00028 ObjType Type() const { return type; }; 00029 const string& Name() const { return name; }; 00030 const object_handle_t Id() const { return id; }; 00031 00032 void DisownPtr() { own_ptr = false; }; 00033 void Output( ostream& Stream ) const; 00034 unsigned long long SizeK() const { return size; }; 00035 bool IsDataType() const; 00036 bool IsData() const { return is_data; }; 00037 bool IsFreespace() const { return is_freespace; }; 00038 virtual void AddRelation( EvmsAccess* Acc ) {}; 00039 00040 protected: 00041 void Init(); 00042 bool own_ptr; 00043 bool is_data; 00044 bool is_freespace; 00045 unsigned long long size; 00046 ObjType type; 00047 object_handle_t id; 00048 string name; 00049 handle_object_info_t *info_p; 00050 }; 00051 00052 class EvmsDataObject : public EvmsObject 00053 { 00054 public: 00055 EvmsDataObject( EvmsObject *const obj ); 00056 EvmsDataObject( object_handle_t id ); 00057 const EvmsObject *const ConsumedBy() const { return consumed; }; 00058 const EvmsObject *const Volume() const { return volume; }; 00059 void Output( ostream& Stream ) const; 00060 virtual void AddRelation( EvmsAccess* Acc ); 00061 00062 protected: 00063 void Init(); 00064 storage_object_info_t* GetInfop(); 00065 EvmsObject * consumed; 00066 EvmsObject * volume; 00067 }; 00068 00069 class EvmsContainerObject : public EvmsObject 00070 { 00071 public: 00072 EvmsContainerObject( EvmsObject *const obj ); 00073 EvmsContainerObject( object_handle_t id ); 00074 unsigned long long FreeK() const { return free; }; 00075 unsigned long long PeSize() const { return pe_size; }; 00076 const list<EvmsObject *>& Consumes() const { return consumes; }; 00077 const list<EvmsObject *>& Creates() const { return creates; }; 00078 const string& TypeName() const { return ctype; }; 00079 void Output( ostream& Stream ) const; 00080 virtual void AddRelation( EvmsAccess* Acc ); 00081 00082 protected: 00083 void Init(); 00084 storage_container_info_t* GetInfop(); 00085 unsigned long long free; 00086 unsigned long long pe_size; 00087 list<EvmsObject *> consumes; 00088 list<EvmsObject *> creates; 00089 string ctype; 00090 }; 00091 00092 class EvmsVolumeObject : public EvmsObject 00093 { 00094 public: 00095 EvmsVolumeObject( EvmsObject *const obj ); 00096 EvmsVolumeObject( object_handle_t id ); 00097 const EvmsObject * ConsumedBy() const { return consumed; }; 00098 EvmsObject * Consumes() const { return consumes; }; 00099 const EvmsObject * AssVol() const { return assc; }; 00100 bool Native() const { return native; }; 00101 const string& Device() const { return device; }; 00102 void Output( ostream& Stream ) const; 00103 void SetConsumedBy( EvmsObject* Obj ); 00104 virtual void AddRelation( EvmsAccess* Acc ); 00105 00106 protected: 00107 void Init(); 00108 logical_volume_info_s* GetInfop(); 00109 bool native; 00110 EvmsObject * consumed; 00111 EvmsObject * consumes; 00112 EvmsObject * assc; 00113 string device; 00114 }; 00115 00116 class EvmsAccess 00117 { 00118 public: 00119 EvmsObject *const AddObject( object_handle_t id ); 00120 EvmsObject *const Find( object_handle_t id ); 00121 EvmsAccess(); 00122 ~EvmsAccess(); 00123 void Output( ostream &Stream ) const; 00124 void ListVolumes( list<const EvmsVolumeObject*>& l ) const; 00125 void ListContainer(list<const EvmsContainerObject*>& l ) const; 00126 string GetErrorText() {return Error_C;}; 00127 string GetCmdLine() {return CmdLine_C;}; 00128 bool ChangeActive( const string& Name_Cv, bool Active_bv ); 00129 bool DeleteCo( const string& Container_Cv ); 00130 bool ExtendCo( const string& Container_Cv, const string& PvName_Cv ); 00131 bool ShrinkCo( const string& Container_Cv, const string& PvName_Cv ); 00132 bool CreateCo( const string& Container_Cv, unsigned long PeSize_lv, 00133 bool NewMeta_bv, list<string>& Devices_Cv ); 00134 bool CreateLv( const string& LvName_Cv, const string& Container_Cv, 00135 unsigned long Size_lv, unsigned long Stripe_lv, 00136 unsigned long StripeSize_lv ); 00137 bool ChangeLvSize( const string& LvName_Cv, const string& Container_Cv, 00138 unsigned long Size_lv ); 00139 bool DeleteLv( const string& LvName_Cv, const string& Container_Cv ); 00140 bool CreateCompatVol( const string& Volume_Cv ); 00141 00142 protected: 00143 void AddObjectRelations(); 00144 void RereadAllObjects(); 00145 plugin_handle_t GetLvmPlugin(); 00146 object_handle_t FindUsingVolume( object_handle_t id ); 00147 const EvmsContainerObject* FindContainer( const string& name ); 00148 const EvmsDataObject* FindRegion( const string& container, 00149 const string& name ); 00150 const EvmsDataObject* FindSegment( const string& name ); 00151 const EvmsVolumeObject* FindVolume( const string& name ); 00152 static int PluginFilterFunction( const char* plugin ); 00153 00154 list<EvmsObject*> objects; 00155 boolean EndEvmsCommand(); 00156 boolean EvmsOpen_b; 00157 string Error_C; 00158 string CmdLine_C; 00159 }; 00160 00161 extern ostream& operator<<( ostream &Stream, const ObjType Obj ); 00162 extern ostream& operator<<( ostream &Stream, const EvmsAccess& Obj ); 00163 extern ostream& operator<<( ostream &Stream, const EvmsObject& Obj ); 00164 extern ostream& operator<<( ostream &Stream, const EvmsDataObject& Obj ); 00165 extern ostream& operator<<( ostream &Stream, const EvmsContainerObject& Obj ); 00166 extern ostream& operator<<( ostream &Stream, const EvmsVolumeObject& Obj ); 00167 00168 #endif