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