00001 #ifndef EVMS_ACCESS_H 00002 #define EVMS_ACCESS_H 00003 00004 extern "C" 00005 { 00006 #define bool boolean 00007 #include <appAPI.h> 00008 #undef bool 00009 #undef min 00010 #undef max 00011 #undef _ 00012 } 00013 00014 #include <list> 00015 #include <ostream> 00016 00017 using std::string; 00018 00019 namespace storage 00020 { 00021 00022 typedef enum { EVMS_UNKNOWN, EVMS_DISK, EVMS_SEGMENT, EVMS_REGION, EVMS_PLUGIN, 00023 EVMS_CONTAINER, EVMS_VOLUME, EVMS_OBJ } ObjType; 00024 00025 class EvmsAccess; 00026 00027 class EvmsObject 00028 { 00029 public: 00030 EvmsObject() { init(); }; 00031 EvmsObject( object_handle_t id ); 00032 virtual ~EvmsObject(); 00033 00034 ObjType type() const { return typ; }; 00035 const string& name() const { return nam; }; 00036 const object_handle_t id() const { return idt; }; 00037 00038 void disownPtr() { own_ptr = false; }; 00039 void output( std::ostream& Stream ) const; 00040 unsigned long long sizeK() const { return size; }; 00041 bool isDataType() const; 00042 bool isData() const { return is_data; }; 00043 bool isFreespace() const { return is_freespace; }; 00044 virtual void addRelation( EvmsAccess* Acc ) {}; 00045 00046 protected: 00047 void init(); 00048 00049 bool own_ptr; 00050 bool is_data; 00051 bool is_freespace; 00052 unsigned long long size; 00053 ObjType typ; 00054 object_handle_t idt; 00055 string nam; 00056 handle_object_info_t *info_p; 00057 }; 00058 00059 class EvmsDataObject : public EvmsObject 00060 { 00061 public: 00062 EvmsDataObject( EvmsObject *const obj ); 00063 EvmsDataObject( object_handle_t id ); 00064 const EvmsObject *const consumedBy() const { return consumed; }; 00065 const EvmsObject *const volume() const { return vol; }; 00066 void output( std::ostream& Stream ) const; 00067 virtual void addRelation( EvmsAccess* Acc ); 00068 00069 protected: 00070 void init(); 00071 storage_object_info_t* getInfop(); 00072 00073 EvmsObject * consumed; 00074 EvmsObject * vol; 00075 }; 00076 00077 class EvmsContainerObject : public EvmsObject 00078 { 00079 public: 00080 struct peinfo 00081 { 00082 EvmsObject * obj; 00083 unsigned long long size; 00084 unsigned long long free; 00085 string uuid; 00086 }; 00087 00088 EvmsContainerObject( EvmsObject *const obj ); 00089 EvmsContainerObject( object_handle_t id ); 00090 unsigned long long freeK() const { return free; }; 00091 unsigned long long peSize() const { return pe_size; }; 00092 const std::list<peinfo>& consumes() const { return cons; }; 00093 const std::list<EvmsObject *>& creates() const { return creat; }; 00094 const string& typeName() const { return ctype; }; 00095 void output( std::ostream& Stream ) const; 00096 virtual void addRelation( EvmsAccess* Acc ); 00097 bool isLvm() const { return lvm; } 00098 bool isLvm1() const { return lvm1; } 00099 00100 protected: 00101 void init(); 00102 storage_container_info_t* getInfop(); 00103 00104 unsigned long long free; 00105 unsigned long long pe_size; 00106 string uuid; 00107 std::list<peinfo> cons; 00108 std::list<EvmsObject *> creat; 00109 string ctype; 00110 bool lvm1; 00111 bool lvm; 00112 }; 00113 00114 class EvmsVolumeObject : public EvmsObject 00115 { 00116 public: 00117 EvmsVolumeObject( EvmsObject *const obj ); 00118 EvmsVolumeObject( object_handle_t id ); 00119 const EvmsObject * consumedBy() const { return consumed; }; 00120 EvmsObject * consumes() const { return cons; }; 00121 const EvmsObject * assVol() const { return assc; }; 00122 bool native() const { return nat; }; 00123 bool active() const { return act; }; 00124 const string& device() const { return dev; }; 00125 void output( std::ostream& Stream ) const; 00126 void setConsumedBy( EvmsObject* Obj ); 00127 virtual void addRelation( EvmsAccess* Acc ); 00128 00129 protected: 00130 void init(); 00131 logical_volume_info_s* getInfop(); 00132 00133 bool nat; 00134 bool act; 00135 EvmsObject * consumed; 00136 EvmsObject * cons; 00137 EvmsObject * assc; 00138 string dev; 00139 }; 00140 00141 class EvmsAccess 00142 { 00143 public: 00144 EvmsObject *const addObject( object_handle_t id ); 00145 EvmsObject *const find( object_handle_t id ); 00146 EvmsAccess(); 00147 ~EvmsAccess(); 00148 void output( std::ostream &Stream ) const; 00149 void listLibstorage( std::ostream &Stream ) const; 00150 void listVolumes( std::list<const EvmsVolumeObject*>& l ) const; 00151 void listContainer(std::list<const EvmsContainerObject*>& l ) const; 00152 const string& getErrorText() {return Error_C;}; 00153 const string& getCmdLine() {return CmdLine_C;}; 00154 int activate(); 00155 int deleteCo( const string& Container_Cv ); 00156 int extendCo( const string& Container_Cv, const string& PvName_Cv ); 00157 int shrinkCo( const string& Container_Cv, const string& PvName_Cv ); 00158 int createCo( const string& Container_Cv, unsigned long long PeSizeK_lv, 00159 bool NewMeta_bv, const std::list<string>& Devices_Cv ); 00160 int createLv( const string& LvName_Cv, const string& Container_Cv, 00161 unsigned long long SizeK_lv, unsigned long Stripe_lv, 00162 unsigned long long StripeSizeK_lv ); 00163 int changeLvSize( const string& LvName_Cv, const string& Container_Cv, 00164 unsigned long long SizeK_lv ); 00165 int deleteLv( const string& LvName_Cv, const string& Container_Cv ); 00166 int createCompatVol( const string& Volume_Cv ); 00167 00168 protected: 00169 void addObjectRelations(); 00170 void rereadAllObjects(); 00171 plugin_handle_t getLvmPlugin( bool lvm2=false ); 00172 object_handle_t findUsingVolume( object_handle_t id ); 00173 debug_level_t logLevel; 00174 const EvmsContainerObject* findContainer( const string& name ); 00175 const EvmsDataObject* findRegion( const string& container, 00176 const string& name ); 00177 const EvmsDataObject* findSegment( const string& name ); 00178 const EvmsVolumeObject* findVolume( const string& name ); 00179 bool endEvmsCommand(); 00180 static int pluginFilterFunction( const char* plugin ); 00181 00182 std::list<EvmsObject*> objects; 00183 bool EvmsOpen_b; 00184 string Error_C; 00185 string CmdLine_C; 00186 }; 00187 00188 extern std::ostream& operator<<( std::ostream &Stream, const ObjType Obj ); 00189 extern std::ostream& operator<<( std::ostream &Stream, const EvmsAccess& Obj ); 00190 extern std::ostream& operator<<( std::ostream &Stream, const EvmsObject& Obj ); 00191 extern std::ostream& operator<<( std::ostream &Stream, const EvmsDataObject& Obj ); 00192 extern std::ostream& operator<<( std::ostream &Stream, const EvmsContainerObject& Obj ); 00193 extern std::ostream& operator<<( std::ostream &Stream, const EvmsVolumeObject& Obj ); 00194 00195 } 00196 00197 #endif