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 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 * consumedBy() const { return consumed; };
00065 const EvmsObject * 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 * addObject( object_handle_t id );
00145 EvmsObject * 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