storage_conf.h 17.1 KB
Newer Older
1 2 3
/*
 * storage_conf.h: config handling for storage driver
 *
E
Eric Blake 已提交
4
 * Copyright (C) 2006-2008, 2010-2012 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17
 * Copyright (C) 2006-2008 Daniel P. Berrange
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
O
Osier Yang 已提交
18 19
 * License along with this library;  If not, see
 * <http://www.gnu.org/licenses/>.
20 21 22 23 24
 *
 * Author: Daniel P. Berrange <berrange@redhat.com>
 */

#ifndef __VIR_STORAGE_CONF_H__
25
# define __VIR_STORAGE_CONF_H__
26

27 28 29 30
# include "internal.h"
# include "util.h"
# include "storage_encryption_conf.h"
# include "threads.h"
31

32
# include <libxml/tree.h>
33

34 35 36 37 38 39 40
/* Shared structs */



typedef struct _virStoragePerms virStoragePerms;
typedef virStoragePerms *virStoragePermsPtr;
struct _virStoragePerms {
41 42 43
    mode_t mode;
    uid_t uid;
    gid_t gid;
44 45 46 47 48
    char *label;
};

/* Storage volumes */

49 50 51 52 53 54 55 56 57 58 59 60
typedef struct _virStorageTimestamps virStorageTimestamps;
typedef virStorageTimestamps *virStorageTimestampsPtr;
struct _virStorageTimestamps {
    struct timespec atime;
    /* if btime.tv_nsec == -1 then
     * birth time is unknown
     */
    struct timespec btime;
    struct timespec ctime;
    struct timespec mtime;
};

61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91

/*
 * How the volume's data is stored on underlying
 * physical devices - can potentially span many
 * devices in LVM case.
 */
typedef struct _virStorageVolSourceExtent virStorageVolSourceExtent;
typedef virStorageVolSourceExtent *virStorageVolSourceExtentPtr;
struct _virStorageVolSourceExtent {
    char *path;
    unsigned long long start;
    unsigned long long end;
};

typedef struct _virStorageVolSource virStorageVolSource;
typedef virStorageVolSource *virStorageVolSourcePtr;
struct _virStorageVolSource {
    int nextent;
    virStorageVolSourceExtentPtr extents;
};


/*
 * How the volume appears on the host
 */
typedef struct _virStorageVolTarget virStorageVolTarget;
typedef virStorageVolTarget *virStorageVolTargetPtr;
struct _virStorageVolTarget {
    char *path;
    int format;
    virStoragePerms perms;
92
    virStorageTimestampsPtr timestamps;
93
    int type; /* only used by disk backend for partition type */
94 95
    /* Currently used only in virStorageVolDef.target, not in .backingstore. */
    virStorageEncryptionPtr encryption;
96 97 98 99 100 101 102 103
};


typedef struct _virStorageVolDef virStorageVolDef;
typedef virStorageVolDef *virStorageVolDefPtr;
struct _virStorageVolDef {
    char *name;
    char *key;
104
    int type; /* virStorageVolType enum */
105

106 107
    unsigned int building;

E
Eric Blake 已提交
108 109
    unsigned long long allocation; /* bytes */
    unsigned long long capacity; /* bytes */
110 111 112

    virStorageVolSource source;
    virStorageVolTarget target;
113
    virStorageVolTarget backingStore;
114 115
};

116 117 118 119 120 121
typedef struct _virStorageVolDefList virStorageVolDefList;
typedef virStorageVolDefList *virStorageVolDefListPtr;
struct _virStorageVolDefList {
    unsigned int count;
    virStorageVolDefPtr *objs;
};
122 123 124 125 126 127



/* Storage pools */

enum virStoragePoolType {
128
    VIR_STORAGE_POOL_DIR,      /* Local directory */
129 130 131 132 133 134
    VIR_STORAGE_POOL_FS,       /* Local filesystem */
    VIR_STORAGE_POOL_NETFS,    /* Networked filesystem - eg NFS, GFS, etc */
    VIR_STORAGE_POOL_LOGICAL,  /* Logical volume groups / volumes */
    VIR_STORAGE_POOL_DISK,     /* Disk partitions */
    VIR_STORAGE_POOL_ISCSI,    /* iSCSI targets */
    VIR_STORAGE_POOL_SCSI,     /* SCSI HBA */
D
Dave Allan 已提交
135
    VIR_STORAGE_POOL_MPATH,    /* Multipath devices */
136
    VIR_STORAGE_POOL_RBD,      /* RADOS Block Device */
137
    VIR_STORAGE_POOL_SHEEPDOG, /* Sheepdog device */
138 139

    VIR_STORAGE_POOL_LAST,
140 141
};

142
VIR_ENUM_DECL(virStoragePool)
143

144 145 146 147 148 149 150
enum virStoragePoolDeviceType {
    VIR_STORAGE_DEVICE_TYPE_DISK = 0x00,
    VIR_STORAGE_DEVICE_TYPE_ROM = 0x05,

    VIR_STORAGE_DEVICE_TYPE_LAST,
};

151 152 153 154

enum virStoragePoolAuthType {
    VIR_STORAGE_POOL_AUTH_NONE,
    VIR_STORAGE_POOL_AUTH_CHAP,
155
    VIR_STORAGE_POOL_AUTH_CEPHX,
156 157 158 159 160 161 162 163 164
};

typedef struct _virStoragePoolAuthChap virStoragePoolAuthChap;
typedef virStoragePoolAuthChap *virStoragePoolAuthChapPtr;
struct _virStoragePoolAuthChap {
    char *login;
    char *passwd;
};

165 166 167 168 169 170 171 172 173
typedef struct _virStoragePoolAuthCephx virStoragePoolAuthCephx;
typedef virStoragePoolAuthCephx *virStoragePoolAuthCephxPtr;
struct _virStoragePoolAuthCephx {
    char *username;
    struct {
            unsigned char uuid[VIR_UUID_BUFLEN];
            char *usage;
    } secret;
};
174 175 176 177 178 179 180 181 182 183 184 185

/*
 * For remote pools, info on how to reach the host
 */
typedef struct _virStoragePoolSourceHost virStoragePoolSourceHost;
typedef virStoragePoolSourceHost *virStoragePoolSourceHostPtr;
struct _virStoragePoolSourceHost {
    char *name;
    int port;
};


186 187 188 189 190 191 192 193 194 195 196 197
/*
 * For MSDOS partitions, the free area
 * is important when creating
 * logical partitions
 */
enum virStorageFreeType {
    VIR_STORAGE_FREE_NONE = 0,
    VIR_STORAGE_FREE_NORMAL,
    VIR_STORAGE_FREE_LOGICAL,
    VIR_STORAGE_FREE_LAST
};

198 199 200 201 202 203 204 205
/*
 * Available extents on the underlying storage
 */
typedef struct _virStoragePoolSourceDeviceExtent virStoragePoolSourceDeviceExtent;
typedef virStoragePoolSourceDeviceExtent *virStoragePoolSourceDeviceExtentPtr;
struct _virStoragePoolSourceDeviceExtent {
    unsigned long long start;
    unsigned long long end;
206
    int type;  /* free space type */
207 208
};

D
David Allan 已提交
209 210 211 212 213 214
typedef struct _virStoragePoolSourceInitiatorAttr virStoragePoolSourceInitiatorAttr;
struct _virStoragePoolSourceInitiatorAttr {
    /* Initiator IQN */
    char *iqn;
};

215 216 217 218 219 220 221 222 223 224 225
/*
 * Pools can be backed by one or more devices, and some
 * allow us to track free space on underlying devices.
 */
typedef struct _virStoragePoolSourceDevice virStoragePoolSourceDevice;
typedef virStoragePoolSourceDevice *virStoragePoolSourceDevicePtr;
struct _virStoragePoolSourceDevice {
    int nfreeExtent;
    virStoragePoolSourceDeviceExtentPtr freeExtents;
    char *path;
    int format;     /* Pool specific source format */
226 227 228 229 230 231 232
    /* When the source device is a physical disk,
       the geometry data is needed */
    struct _geometry {
        int cyliders;
        int heads;
        int sectors;
    } geometry;
233 234 235 236 237 238 239
};



typedef struct _virStoragePoolSource virStoragePoolSource;
typedef virStoragePoolSource *virStoragePoolSourcePtr;
struct _virStoragePoolSource {
240 241 242
    /* An optional (maybe multiple) host(s) */
    size_t nhost;
    virStoragePoolSourceHostPtr hosts;
243 244 245 246 247 248 249 250 251 252 253

    /* And either one or more devices ... */
    int ndevice;
    virStoragePoolSourceDevicePtr devices;

    /* Or a directory */
    char *dir;

    /* Or an adapter */
    char *adapter;

254 255 256
    /* Or a name */
    char *name;

D
David Allan 已提交
257 258 259
    /* Initiator IQN */
    virStoragePoolSourceInitiatorAttr initiator;

260 261 262
    int authType;       /* virStoragePoolAuthType */
    union {
        virStoragePoolAuthChap chap;
263
        virStoragePoolAuthCephx cephx;
264 265
    } auth;

266 267 268 269 270 271
    /* Vendor of the source */
    char *vendor;

    /* Product name of the source*/
    char *product;

272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
    int format; /* Pool type specific format such as filesystem type, or lvm version, etc */
};


typedef struct _virStoragePoolTarget virStoragePoolTarget;
typedef virStoragePoolTarget *virStoragePoolTargetPtr;
struct _virStoragePoolTarget {
    char *path;                /* Optional local filesystem mapping */
    virStoragePerms perms;     /* Default permissions for volumes */
};


typedef struct _virStoragePoolDef virStoragePoolDef;
typedef virStoragePoolDef *virStoragePoolDefPtr;
struct _virStoragePoolDef {
    /* General metadata */
    char *name;
    unsigned char uuid[VIR_UUID_BUFLEN];
    int type; /* virStoragePoolType */

E
Eric Blake 已提交
292 293 294
    unsigned long long allocation; /* bytes */
    unsigned long long capacity; /* bytes */
    unsigned long long available; /* bytes */
295 296 297 298 299 300 301 302 303

    virStoragePoolSource source;
    virStoragePoolTarget target;
};

typedef struct _virStoragePoolObj virStoragePoolObj;
typedef virStoragePoolObj *virStoragePoolObjPtr;

struct _virStoragePoolObj {
304
    virMutex lock;
305

306 307 308 309
    char *configFile;
    char *autostartLink;
    int active;
    int autostart;
310
    unsigned int asyncjobs;
311 312 313 314

    virStoragePoolDefPtr def;
    virStoragePoolDefPtr newDef;

315 316
    virStorageVolDefList volumes;
};
317

318 319 320 321 322
typedef struct _virStoragePoolObjList virStoragePoolObjList;
typedef virStoragePoolObjList *virStoragePoolObjListPtr;
struct _virStoragePoolObjList {
    unsigned int count;
    virStoragePoolObjPtr *objs;
323 324 325 326 327 328 329 330 331
};




typedef struct _virStorageDriverState virStorageDriverState;
typedef virStorageDriverState *virStorageDriverStatePtr;

struct _virStorageDriverState {
332
    virMutex lock;
333

334 335
    virStoragePoolObjList pools;

336 337 338 339
    char *configDir;
    char *autostartDir;
};

340 341 342
typedef struct _virStoragePoolSourceList virStoragePoolSourceList;
typedef virStoragePoolSourceList *virStoragePoolSourceListPtr;
struct _virStoragePoolSourceList {
343
    int type;
344 345 346
    unsigned int nsources;
    virStoragePoolSourcePtr sources;
};
347

348

349 350 351 352
static inline int virStoragePoolObjIsActive(virStoragePoolObjPtr pool) {
    return pool->active;
}

353
int virStoragePoolLoadAllConfigs(virStoragePoolObjListPtr pools,
354 355
                                 const char *configDir,
                                 const char *autostartDir);
356

357
virStoragePoolObjPtr virStoragePoolObjFindByUUID(virStoragePoolObjListPtr pools,
358
                                                 const unsigned char *uuid);
359
virStoragePoolObjPtr virStoragePoolObjFindByName(virStoragePoolObjListPtr pools,
360
                                                 const char *name);
361 362
virStoragePoolObjPtr virStoragePoolSourceFindDuplicateDevices(virStoragePoolObjPtr pool,
                                                              virStoragePoolDefPtr def);
363 364 365 366 367 368 369 370 371 372

virStorageVolDefPtr virStorageVolDefFindByKey(virStoragePoolObjPtr pool,
                                              const char *key);
virStorageVolDefPtr virStorageVolDefFindByPath(virStoragePoolObjPtr pool,
                                               const char *path);
virStorageVolDefPtr virStorageVolDefFindByName(virStoragePoolObjPtr pool,
                                               const char *name);

void virStoragePoolObjClearVols(virStoragePoolObjPtr pool);

373 374 375
virStoragePoolDefPtr virStoragePoolDefParseString(const char *xml);
virStoragePoolDefPtr virStoragePoolDefParseFile(const char *filename);
virStoragePoolDefPtr virStoragePoolDefParseNode(xmlDocPtr xml,
376
                                                xmlNodePtr root);
377
char *virStoragePoolDefFormat(virStoragePoolDefPtr def);
378

379
virStorageVolDefPtr virStorageVolDefParseString(virStoragePoolDefPtr pool,
380
                                                const char *xml);
381
virStorageVolDefPtr virStorageVolDefParseFile(virStoragePoolDefPtr pool,
382
                                              const char *filename);
383
virStorageVolDefPtr virStorageVolDefParseNode(virStoragePoolDefPtr pool,
384 385
                                              xmlDocPtr xml,
                                              xmlNodePtr root);
386
char *virStorageVolDefFormat(virStoragePoolDefPtr pool,
387 388
                             virStorageVolDefPtr def);

389
virStoragePoolObjPtr virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools,
390 391
                                                virStoragePoolDefPtr def);

392
int virStoragePoolObjSaveDef(virStorageDriverStatePtr driver,
393 394
                             virStoragePoolObjPtr pool,
                             virStoragePoolDefPtr def);
395
int virStoragePoolObjDeleteDef(virStoragePoolObjPtr pool);
396 397

void virStorageVolDefFree(virStorageVolDefPtr def);
398
void virStoragePoolSourceClear(virStoragePoolSourcePtr source);
399
void virStoragePoolSourceFree(virStoragePoolSourcePtr source);
400 401
void virStoragePoolDefFree(virStoragePoolDefPtr def);
void virStoragePoolObjFree(virStoragePoolObjPtr pool);
402 403
void virStoragePoolObjListFree(virStoragePoolObjListPtr pools);
void virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
404 405
                             virStoragePoolObjPtr pool);

406
virStoragePoolSourcePtr
407
virStoragePoolDefParseSourceString(const char *srcSpec,
408 409
                                   int pool_type);
virStoragePoolSourcePtr
410 411
virStoragePoolSourceListNewSource(virStoragePoolSourceListPtr list);
char *virStoragePoolSourceListFormat(virStoragePoolSourceListPtr def);
412

413 414 415 416
int virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr pools,
                                 virStoragePoolDefPtr def,
                                 unsigned int check_active);

417 418 419
int virStoragePoolSourceFindDuplicate(virStoragePoolObjListPtr pools,
                                      virStoragePoolDefPtr def);

D
Daniel P. Berrange 已提交
420 421 422
void virStoragePoolObjLock(virStoragePoolObjPtr obj);
void virStoragePoolObjUnlock(virStoragePoolObjPtr obj);

423 424 425 426 427 428 429 430 431 432 433 434 435 436

enum virStoragePoolFormatFileSystem {
    VIR_STORAGE_POOL_FS_AUTO = 0,
    VIR_STORAGE_POOL_FS_EXT2,
    VIR_STORAGE_POOL_FS_EXT3,
    VIR_STORAGE_POOL_FS_EXT4,
    VIR_STORAGE_POOL_FS_UFS,
    VIR_STORAGE_POOL_FS_ISO,
    VIR_STORAGE_POOL_FS_UDF,
    VIR_STORAGE_POOL_FS_GFS,
    VIR_STORAGE_POOL_FS_GFS2,
    VIR_STORAGE_POOL_FS_VFAT,
    VIR_STORAGE_POOL_FS_HFSPLUS,
    VIR_STORAGE_POOL_FS_XFS,
J
Jim Fehlig 已提交
437
    VIR_STORAGE_POOL_FS_OCFS2,
438 439
    VIR_STORAGE_POOL_FS_LAST,
};
440
VIR_ENUM_DECL(virStoragePoolFormatFileSystem)
441 442 443 444

enum virStoragePoolFormatFileSystemNet {
    VIR_STORAGE_POOL_NETFS_AUTO = 0,
    VIR_STORAGE_POOL_NETFS_NFS,
445
    VIR_STORAGE_POOL_NETFS_GLUSTERFS,
446
    VIR_STORAGE_POOL_NETFS_CIFS,
447 448
    VIR_STORAGE_POOL_NETFS_LAST,
};
449
VIR_ENUM_DECL(virStoragePoolFormatFileSystemNet)
450 451 452 453 454 455 456 457 458 459 460 461 462 463

enum virStoragePoolFormatDisk {
    VIR_STORAGE_POOL_DISK_UNKNOWN = 0,
    VIR_STORAGE_POOL_DISK_DOS = 1,
    VIR_STORAGE_POOL_DISK_DVH,
    VIR_STORAGE_POOL_DISK_GPT,
    VIR_STORAGE_POOL_DISK_MAC,
    VIR_STORAGE_POOL_DISK_BSD,
    VIR_STORAGE_POOL_DISK_PC98,
    VIR_STORAGE_POOL_DISK_SUN,
    VIR_STORAGE_POOL_DISK_LVM2,
    VIR_STORAGE_POOL_DISK_LAST,
};

464
VIR_ENUM_DECL(virStoragePoolFormatDisk)
465 466 467 468 469 470

enum virStoragePoolFormatLogical {
    VIR_STORAGE_POOL_LOGICAL_UNKNOWN = 0,
    VIR_STORAGE_POOL_LOGICAL_LVM2 = 1,
    VIR_STORAGE_POOL_LOGICAL_LAST,
};
471
VIR_ENUM_DECL(virStoragePoolFormatLogical)
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492

/*
 * XXX these are basically partition types.
 *
 * fdisk has a bazillion partition ID types
 * parted has practically none, and splits the
 * info across 3 different attributes.
 *
 * So this is a semi-generic set
 */
enum virStorageVolFormatDisk {
    VIR_STORAGE_VOL_DISK_NONE = 0,
    VIR_STORAGE_VOL_DISK_LINUX,
    VIR_STORAGE_VOL_DISK_FAT16,
    VIR_STORAGE_VOL_DISK_FAT32,
    VIR_STORAGE_VOL_DISK_LINUX_SWAP,
    VIR_STORAGE_VOL_DISK_LINUX_LVM,
    VIR_STORAGE_VOL_DISK_LINUX_RAID,
    VIR_STORAGE_VOL_DISK_EXTENDED,
    VIR_STORAGE_VOL_DISK_LAST,
};
493
VIR_ENUM_DECL(virStorageVolFormatDisk)
494

495 496 497 498 499 500 501
enum virStorageVolTypeDisk {
    VIR_STORAGE_VOL_DISK_TYPE_NONE = 0,
    VIR_STORAGE_VOL_DISK_TYPE_PRIMARY,
    VIR_STORAGE_VOL_DISK_TYPE_LOGICAL,
    VIR_STORAGE_VOL_DISK_TYPE_EXTENDED,
    VIR_STORAGE_VOL_DISK_TYPE_LAST,
};
502

503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
/*
 * Mapping of Parted fs-types
 * MUST be kept in the same order
 * as virStorageVolFormatDisk
 */
enum virStoragePartedFsType {
    VIR_STORAGE_PARTED_FS_TYPE_NONE = 0,
    VIR_STORAGE_PARTED_FS_TYPE_LINUX,
    VIR_STORAGE_PARTED_FS_TYPE_FAT16,
    VIR_STORAGE_PARTED_FS_TYPE_FAT32,
    VIR_STORAGE_PARTED_FS_TYPE_LINUX_SWAP,
    VIR_STORAGE_PARTED_FS_TYPE_LINUX_LVM,
    VIR_STORAGE_PARTED_FS_TYPE_LINUX_RAID,
    VIR_STORAGE_PARTED_FS_TYPE_EXTENDED,
    VIR_STORAGE_PARTED_FS_TYPE_LAST,
};
VIR_ENUM_DECL(virStoragePartedFsType)
520

521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
# define VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ACTIVE   \
                (VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_INACTIVE)

# define VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_PERSISTENT   \
                (VIR_CONNECT_LIST_STORAGE_POOLS_PERSISTENT | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_TRANSIENT)

# define VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_AUTOSTART    \
                (VIR_CONNECT_LIST_STORAGE_POOLS_AUTOSTART |  \
                 VIR_CONNECT_LIST_STORAGE_POOLS_NO_AUTOSTART)

# define VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_POOL_TYPE  \
                (VIR_CONNECT_LIST_STORAGE_POOLS_DIR      | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_FS       | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_NETFS    | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_LOGICAL  | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_DISK     | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_ISCSI    | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_SCSI     | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_MPATH    | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_RBD      | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_SHEEPDOG)

# define VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ALL                  \
                (VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ACTIVE     | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_PERSISTENT | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_AUTOSTART  | \
                 VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_POOL_TYPE)

int virStoragePoolList(virConnectPtr conn,
                       virStoragePoolObjList poolobjs,
                       virStoragePoolPtr **pools,
                       unsigned int flags);

556
#endif /* __VIR_STORAGE_CONF_H__ */