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