[libvirt] [PATCH] phyp: first part of storage management driver

Eduardo Otubo otubo at linux.vnet.ibm.com
Tue May 18 21:01:40 UTC 2010


On 05/14/2010 05:27 PM, Stefan Berger wrote:
>
> libvir-list-bounces at redhat.com wrote on 05/13/2010 10:53:53 AM:
>
>
>  >
>  > Hello all,
>  >
>  > This is the first patch about storage management driver on IBM Power
>  > Hypervisor. I reviewd a couple of times but perhaps I might be missing
>  > something. Any comments are welcome.
>
> Please send the patches inline.
>
>  >
>  > diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
>  > index cec99b1..7bd203f 100644
>  > --- a/src/phyp/phyp_driver.c
>  > +++ b/src/phyp/phyp_driver.c
>  > @@ -1665,6 +1665,262 @@ virDriver phypDriver = {
>  > NULL, /* domainSnapshotDelete */
>  > };
>  >
>  > +virStorageDriver phypStorageDriver = {
>  > + .name = "PHYP",
>  > + .open = phypStorageOpen,
>  > + .close = phypStorageClose,
>  > +
>  > + .numOfPools = phypNumOfStoragePools,
>  > + .listPools = phypListStoragePools,
>  > + .numOfDefinedPools = NULL,
>  > + .listDefinedPools = NULL,
>  > + .findPoolSources = NULL,
>  > + .poolLookupByName = phypSPLookupByName,
>  > + .poolLookupByUUID = NULL,
>  > + .poolLookupByVolume = NULL,
>  > + .poolCreateXML = NULL,
>  > + .poolDefineXML = NULL,
>  > + .poolBuild = NULL,
>  > + .poolUndefine = NULL,
>  > + .poolCreate = NULL,
>  > + .poolDestroy = NULL,
>  > + .poolDelete = NULL,
>  > + .poolRefresh = NULL,
>  > + .poolGetInfo = NULL,
>  > + .poolGetXMLDesc = NULL,
>  > + .poolGetAutostart = NULL,
>  > + .poolSetAutostart = NULL,
>  > + .poolNumOfVolumes = NULL,
>  > + .poolListVolumes = NULL,
>  > +
>  > + .volLookupByName = NULL,
>  > + .volLookupByKey = NULL,
>  > + .volLookupByPath = NULL,
>  > + .volCreateXML = NULL,
>  > + .volCreateXMLFrom = NULL,
>  > + .volDelete = NULL,
>  > + .volGetInfo = NULL,
>  > + .volGetXMLDesc = NULL,
>  > + .volGetPath = NULL,
>  > + .poolIsActive = NULL,
>  > + .poolIsPersistent = NULL
>  > +};
>  > +
>  > +int
>  > +phypGetStoragePoolUUID(unsigned char *sp_uuid, const char *sp_name,
>  > + virConnectPtr conn)
>  > +{
>  > + ConnectionData *connection_data = conn->networkPrivateData;
>  > + phyp_driverPtr phyp_driver = conn->privateData;
>  > + LIBSSH2_SESSION *session = connection_data->session;
>  > + char *managed_system = phyp_driver->managed_system;
>  > + int vios_id = phyp_driver->vios_id;
>  > + int exit_status = 0;
>  > + char *cmd = NULL;
>  > + char *ret = NULL;
>  > +
>  > + if (virAsprintf(&cmd,
>  > + "viosvrcmd -m %s --id %d -c 'lsdev -dev %s -attr "
>  > + "vgserial_id'|sed '1d'|sed '1d'",
>  > + managed_system, vios_id, sp_name, sp_name) < 0) {
>  > + virReportOOMError();
>  > + goto err;
>  > + }
>  > +
>  > + ret = phypExec(session, cmd, &exit_status, conn);
>  > +
>  > + if (exit_status < 0 || ret == NULL)
>  > + goto err;
>  > +
>  > + if (memmove(sp_uuid, ret, VIR_UUID_BUFLEN) == NULL)
>  > + goto err;
>  > +
>  > + VIR_FREE(cmd);
>  > + VIR_FREE(ret);
>  > + return 0;
>  > +
>  > + err:
>  > + VIR_FREE(cmd);
>  > + VIR_FREE(ret);
>  > + return -1;
>  > +}
>  > +
>  > +int
>  > +phypGetStoragePoolID(const char *sp_name, virConnectPtr conn)
>  > +{
>  > + ConnectionData *connection_data = conn->networkPrivateData;
>  > + phyp_driverPtr phyp_driver = conn->privateData;
>  > + LIBSSH2_SESSION *session = connection_data->session;
>  > + char *managed_system = phyp_driver->managed_system;
>  > + int vios_id = phyp_driver->vios_id;
>  > + int exit_status = 0;
>  > + int sp_id = 0;
>  > + char *char_ptr;
>  > + char *cmd = NULL;
>  > + char *ret = NULL;
>  > +
>  > + if (virAsprintf(&cmd,
>  > + "viosvrcmd -m %s --id %d -c 'lssp -field Pool'"
>  > + "|sed '1d'|grep -n %s|sed -e 's/:.*$//g'",
>  > + managed_system, vios_id, sp_name) < 0) {
>  > + virReportOOMError();
>  > + goto err;
>  > + }
>  > +
>  > + ret = phypExec(session, cmd, &exit_status, conn);
>  > +
>  > + if (exit_status < 0 || ret == NULL)
>  > + goto err;
>  > +
>  > + if (virStrToLong_i(ret, &char_ptr, 10, &sp_id) == -1)
>  > + goto err;
>
> char_ptr not being used afterward -> could supply NULL instead.
>
>  > +
>  > + VIR_FREE(cmd);
>  > + VIR_FREE(ret);
>  > + return sp_id;
>  > +
>  > + err:
>  > + VIR_FREE(cmd);
>  > + VIR_FREE(ret);
>  > + return -1;
>  > +}
>  > +
>  > +virStoragePoolPtr
>  > +phypSPLookupByName(virConnectPtr conn, const char *sp_name)
>  > +{
>  > + virStoragePoolPtr sp = NULL;
>  > + int sp_id = 0;
>  > + unsigned char sp_uuid[VIR_UUID_BUFLEN];
>  > +
>  > + sp_id = phypGetStoragePoolID(sp_name, conn);
>  > + if (sp_id == -1)
>  > + return NULL;
>  > +
>  > + if (phypGetStoragePoolUUID(sp_uuid, sp_name, conn) == -1)
>  > + return NULL;
>  > +
>  > + sp = virGetStoragePool(conn, sp_name, sp_uuid);
>  > +
>  > + if (sp)
>  > + return sp;
>  > + else
>  > + return NULL;
>
> Doesn't seem necessary to do if - then here.
>
> Just a 'return sp;' should do the trick.
>
>
>  > +}
>  > +
>  > +int
>  > +phypNumOfStoragePools(virConnectPtr conn)
>
> Make this one static since it's accessed through the interface? Or is it
> exported for some debugging purpose?
>
>  > +{
>  > + ConnectionData *connection_data = conn->networkPrivateData;
>  > + phyp_driverPtr phyp_driver = conn->privateData;
>  > + LIBSSH2_SESSION *session = connection_data->session;
>  > + int exit_status = 0;
>  > + int nsp = 0;
>  > + char *char_ptr;
>  > + char *cmd = NULL;
>  > + char *ret = NULL;
>  > + char *managed_system = phyp_driver->managed_system;
>  > + int vios_id = phyp_driver->vios_id;
>  > +
>  > + if (virAsprintf(&cmd,
>  > + "viosvrcmd -m %s --id %d -c 'lssp -field "
>  > + "Pool'|sed '1d'|grep -c ^.*$",
>  > + managed_system, vios_id) < 0) {
>  > + virReportOOMError();
>  > + goto err;
>  > + }
>  > +
>  > + ret = phypExec(session, cmd, &exit_status, conn);
>  > +
>  > + if (exit_status < 0 || ret == NULL)
>  > + goto err;
>  > +
>  > + if (virStrToLong_i(ret, &char_ptr, 10, &nsp) == -1)
>  > + goto err;
>
> NULL rather than char_ptr?
>
>  > +
>  > + VIR_FREE(cmd);
>  > + VIR_FREE(ret);
>  > + return nsp;
>  > +
>  > + err:
>  > + VIR_FREE(cmd);
>  > + VIR_FREE(ret);
>  > + return -1;
>  > +}
>  > +
>  > +int
>  > +phypListStoragePools(virConnectPtr conn, char **const pools, int
> npools)
>
> Static function?
>
>  > +{
>  > + ConnectionData *connection_data = conn->networkPrivateData;
>  > + phyp_driverPtr phyp_driver = conn->privateData;
>  > + LIBSSH2_SESSION *session = connection_data->session;
>  > + char *managed_system = phyp_driver->managed_system;
>  > + int vios_id = phyp_driver->vios_id;
>  > + int exit_status = 0;
>  > + int got = 0;
>  > + int i;
>  > + char *cmd = NULL;
>  > + char *ret = NULL;
>  > + char *storage_pools = NULL;
>  > + char *char_ptr2 = NULL;
>  > +
>  > + if (virAsprintf
>  > + (&cmd,
>  > + "viosvrcmd -m %s --id %d -c 'lssp -field Pool'|sed '1d'",
>  > + managed_system, vios_id) < 0) {
>  > + virReportOOMError();
>  > + goto err;
>  > + }
>  > +
>  > + ret = phypExec(session, cmd, &exit_status, conn);
>  > +
>  > + /* I need to parse the textual return in order to get the storage
>  > pools */
>  > + if (exit_status < 0 || ret == NULL)
>  > + goto err;
>  > + else {
>  > + storage_pools = ret;
>  > +
>  > + while (got < npools) {
>  > + char_ptr2 = strchr(storage_pools, '\n');
>  > +
>  > + if (char_ptr2) {
>  > + *char_ptr2 = '\0';
>  > + if ((pools[got++] = strdup(storage_pools)) == NULL) {
>  > + virReportOOMError();
>  > + goto err;
>  > + }
>  > + char_ptr2++;
>  > + storage_pools = char_ptr2;
>  > + } else
>  > + break;
>  > + }
>  > + }
>  > +
>  > + VIR_FREE(cmd);
>  > + VIR_FREE(ret);
>  > + return got;
>  > +
>  > + err:
>  > + for (i = 0; i < got; i++)
>  > + VIR_FREE(pools[i]);
>  > + VIR_FREE(cmd);
>  > + VIR_FREE(ret);
>  > + return -1;
>  > +}
>  > +
>  > +virDrvOpenStatus
>  > +phypStorageOpen(virConnectPtr conn ATTRIBUTE_UNUSED,
>  > + virConnectAuthPtr auth ATTRIBUTE_UNUSED,
>  > + int flags ATTRIBUTE_UNUSED)
>
> Static function?
>
>  > +{
>  > + return VIR_DRV_OPEN_SUCCESS;
>  > +}
>  > +
>  > +int
>  > +phypStorageClose(virConnectPtr conn ATTRIBUTE_UNUSED)
>
> static function?
>
>  > +{
>  > + return 0;
>  > +}
>  > +
>  > int
>  > phypBuildLpar(virConnectPtr conn, virDomainDefPtr def)
>  > {
>  > @@ -2209,6 +2465,10 @@ waitsocket(int socket_fd, LIBSSH2_SESSION *
>  > session)
>  > int
>  > phypRegister(void)
>  > {
>  > - virRegisterDriver(&phypDriver);
>  > + if (virRegisterDriver(&phypDriver) < 0 )
>  > + return -1;
>  > + if(virRegisterStorageDriver(&phypStorageDriver) < 0)
>  > + return -1;
>  > +
>  > return 0;
>  > }
>  > diff --git a/src/phyp/phyp_driver.h b/src/phyp/phyp_driver.h
>  > index f680994..edd0d6c 100644
>  > --- a/src/phyp/phyp_driver.h
>  > +++ b/src/phyp/phyp_driver.h
>  > @@ -69,6 +69,32 @@ struct _phyp_driver {
>  > char *managed_system;
>  > };
>  >
>  > +
>  > +/*
>  > + * Common storage functions
>  > + * */
>  > +int phypGetStoragePoolID(const char *sp_name, virConnectPtr conn);
>  > +
>  > +int phypGetStoragePoolUUID(unsigned char *sp_uuid, const char *sp_name,
>  > + virConnectPtr conn);
>  > +
>  > +virStoragePoolPtr phypSPLookupByName(virConnectPtr conn, const char
>  > *name);
>  > +
>  > +int phypNumOfStoragePools(virConnectPtr conn);
>  > +
>  > +int phypListStoragePools(virConnectPtr conn, char **const pools,
>  > + int npools);
>  > +
>  > +virDrvOpenStatus phypStorageOpen(virConnectPtr conn ATTRIBUTE_UNUSED,
>  > + virConnectAuthPtr auth ATTRIBUTE_UNUSED,
>  > + int flags ATTRIBUTE_UNUSED);
>  > +
>  > +int phypStorageClose(virConnectPtr conn);
>
> If the don't need to be public then you can remove them from this file
> here.
>


Thanks for all the comments.

The following patch fixes the mistakes pointed by you and add a new 
function. Now the pHyp Storage Driver is able to pool-dumpxml also.

regards,
[]'s



diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
index cec99b1..f19409c 100644
--- a/src/phyp/phyp_driver.c
+++ b/src/phyp/phyp_driver.c
@@ -28,7 +28,6 @@
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <limits.h>
-#include <string.h>
  #include <stdio.h>
  #include <stdarg.h>
  #include <stdlib.h>
@@ -56,6 +55,7 @@
  #include "virterror_internal.h"
  #include "uuid.h"
  #include "domain_conf.h"
+#include "storage_conf.h"
  #include "nodeinfo.h"

  #include "phyp_driver.h"
@@ -280,7 +280,8 @@ openSSHSession(virConnectPtr conn, virConnectAuthPtr 
auth,
          username = virRequestUsername(auth, NULL, conn->uri->server);

          if (username == NULL) {
-            PHYP_ERROR(VIR_ERR_AUTH_FAILED, "%s", _("Username request 
failed"));
+            PHYP_ERROR(VIR_ERR_AUTH_FAILED, "%s",
+                       _("Username request failed"));
              goto err;
          }
      }
@@ -360,7 +361,8 @@ openSSHSession(virConnectPtr conn, virConnectAuthPtr 
auth,
          password = virRequestPassword(auth, username, conn->uri->server);

          if (password == NULL) {
-            PHYP_ERROR(VIR_ERR_AUTH_FAILED, "%s", _("Password request 
failed"));
+            PHYP_ERROR(VIR_ERR_AUTH_FAILED, "%s",
+                       _("Password request failed"));
              goto disconnect;
          }

@@ -1646,25 +1648,496 @@ virDriver phypDriver = {
      NULL,                       /* domainIsPersistent */
      NULL,                       /* cpuCompare */
      NULL,                       /* cpuBaseline */
-    NULL, /* domainGetJobInfo */
-    NULL, /* domainAbortJob */
-    NULL, /* domainMigrateSetMaxDowntime */
-    NULL, /* domainEventRegisterAny */
-    NULL, /* domainEventDeregisterAny */
-    NULL, /* domainManagedSave */
-    NULL, /* domainHasManagedSaveImage */
-    NULL, /* domainManagedSaveRemove */
-    NULL, /* domainSnapshotCreateXML */
-    NULL, /* domainSnapshotDumpXML */
-    NULL, /* domainSnapshotNum */
-    NULL, /* domainSnapshotListNames */
-    NULL, /* domainSnapshotLookupByName */
-    NULL, /* domainHasCurrentSnapshot */
-    NULL, /* domainSnapshotCurrent */
-    NULL, /* domainRevertToSnapshot */
-    NULL, /* domainSnapshotDelete */
+    NULL,                       /* domainGetJobInfo */
+    NULL,                       /* domainAbortJob */
+    NULL,                       /* domainMigrateSetMaxDowntime */
+    NULL,                       /* domainEventRegisterAny */
+    NULL,                       /* domainEventDeregisterAny */
+    NULL,                       /* domainManagedSave */
+    NULL,                       /* domainHasManagedSaveImage */
+    NULL,                       /* domainManagedSaveRemove */
+    NULL,                       /* domainSnapshotCreateXML */
+    NULL,                       /* domainSnapshotDumpXML */
+    NULL,                       /* domainSnapshotNum */
+    NULL,                       /* domainSnapshotListNames */
+    NULL,                       /* domainSnapshotLookupByName */
+    NULL,                       /* domainHasCurrentSnapshot */
+    NULL,                       /* domainSnapshotCurrent */
+    NULL,                       /* domainRevertToSnapshot */
+    NULL,                       /* domainSnapshotDelete */
  };

+virStorageDriver phypStorageDriver = {
+    .name = "PHYP",
+    .open = phypStorageOpen,
+    .close = phypStorageClose,
+
+    .numOfPools = phypNumOfStoragePools,
+    .listPools = phypListStoragePools,
+    .numOfDefinedPools = NULL,
+    .listDefinedPools = NULL,
+    .findPoolSources = NULL,
+    .poolLookupByName = phypSPLookupByName,
+    .poolLookupByUUID = phypGetStorageLookUpByUUID,
+    .poolLookupByVolume = NULL,
+    .poolCreateXML = NULL,
+    .poolDefineXML = NULL,
+    .poolBuild = NULL,
+    .poolUndefine = NULL,
+    .poolCreate = NULL,
+    .poolDestroy = NULL,
+    .poolDelete = NULL,
+    .poolRefresh = NULL,
+    .poolGetInfo = NULL,
+    .poolGetXMLDesc = phypGetStoragePoolXMLDesc,
+    .poolGetAutostart = NULL,
+    .poolSetAutostart = NULL,
+    .poolNumOfVolumes = NULL,
+    .poolListVolumes = NULL,
+
+    .volLookupByName = NULL,
+    .volLookupByKey = NULL,
+    .volLookupByPath = NULL,
+    .volCreateXML = NULL,
+    .volCreateXMLFrom = NULL,
+    .volDelete = NULL,
+    .volGetInfo = NULL,
+    .volGetXMLDesc = NULL,
+    .volGetPath = NULL,
+    .poolIsActive = NULL,
+    .poolIsPersistent = NULL
+};
+
+char *
+phypGetStoragePoolDevice(virConnectPtr conn, char *name)
+{
+    ConnectionData *connection_data = conn->networkPrivateData;
+    phyp_driverPtr phyp_driver = conn->privateData;
+    LIBSSH2_SESSION *session = connection_data->session;
+    char *managed_system = phyp_driver->managed_system;
+    int vios_id = phyp_driver->vios_id;
+    int exit_status = 0;
+    char *cmd = NULL;
+    char *ret = NULL;
+
+    if (virAsprintf(&cmd,
+                    "viosvrcmd -m %s --id %d -c "
+                    "'lssp -detail -sp %s -field name'"
+                    "|sed '1d'|sed -e 's/\\ //g'",
+                    managed_system, vios_id, name) < 0) {
+        virReportOOMError();
+        goto err;
+    }
+
+    ret = phypExec(session, cmd, &exit_status, conn);
+
+    if (exit_status < 0 || ret == NULL)
+        goto err;
+
+    char *char_ptr = strchr(ret, '\n');
+
+    if (char_ptr)
+        *char_ptr = '\0';
+
+    VIR_FREE(cmd);
+    return ret;
+
+  err:
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return NULL;
+
+}
+
+unsigned long int
+phypGetStoragePoolSize(virConnectPtr conn, char *name)
+{
+    ConnectionData *connection_data = conn->networkPrivateData;
+    phyp_driverPtr phyp_driver = conn->privateData;
+    LIBSSH2_SESSION *session = connection_data->session;
+    char *managed_system = phyp_driver->managed_system;
+    int exit_status = 0;
+    int vios_id = phyp_driver->vios_id;
+    char *cmd = NULL;
+    char *ret = NULL;
+    char *char_ptr;
+    int sp_size = 0;
+
+    if (virAsprintf(&cmd,
+                    "viosvrcmd -m %s --id %d -c "
+                    "'lssp -detail -sp %s -field size'"
+                    "|sed '1d'|sed -e 's/\\ //g'",
+                    managed_system, vios_id, name) < 0) {
+        virReportOOMError();
+        goto err;
+    }
+
+    ret = phypExec(session, cmd, &exit_status, conn);
+
+    if (exit_status < 0 || ret == NULL)
+        goto err;
+
+    if (virStrToLong_i(ret, &char_ptr, 10, &sp_size) == -1)
+        goto err;
+
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return sp_size;
+
+  err:
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return -1;
+}
+
+char *
+phypGetStoragePoolXMLDesc(virStoragePoolPtr pool,
+                          unsigned int flags ATTRIBUTE_UNUSED)
+{
+    virStoragePoolDef def;
+    memset(&def, 0, sizeof(virStoragePoolDef));
+
+    if (pool->name != NULL)
+        def.name = pool->name;
+    else {
+        VIR_ERROR("%s", "Unable to determine storage pool's name.");
+        goto err;
+    }
+
+    if (memmove(def.uuid, pool->uuid, VIR_UUID_BUFLEN) == NULL) {
+        VIR_ERROR("%s", "Unable to determine storage pool's uuid.");
+        goto err;
+    }
+
+    if ((def.capacity =
+         phypGetStoragePoolSize(pool->conn, pool->name)) == -1) {
+        VIR_ERROR("%s", "Unable to determine storage pools's size.");
+        goto err;
+    }
+
+    /* Information not avaliable */
+    def.allocation = 0;
+    def.available = 0;
+
+    def.source.ndevice = 1;
+
+    if ((def.source.adapter =
+         phypGetStoragePoolDevice(pool->conn, pool->name)) == NULL) {
+        VIR_ERROR("%s",
+                  "Unable to determine storage pools's source adapter.");
+        goto err;
+    }
+
+    return virStoragePoolDefFormat(&def);
+
+  err:
+    return NULL;
+}
+
+virStoragePoolPtr
+phypGetStorageLookUpByUUID(virConnectPtr conn, const unsigned char *uuid)
+{
+    virStoragePoolPtr sp = NULL;
+    int npools = 0;
+    int gotpools = 0;
+    char **pools = NULL;
+    unsigned int i = 0;
+    unsigned char *local_uuid = NULL;
+
+    if (VIR_ALLOC_N(local_uuid, VIR_UUID_BUFLEN) < 0) {
+        virReportOOMError();
+        goto err;
+    }
+
+    if ((npools = phypNumOfStoragePools(conn)) == -1) {
+        virReportOOMError();
+        goto err;
+    }
+
+    if (VIR_ALLOC_N(pools, npools) < 0) {
+        virReportOOMError();
+        goto err;
+    }
+
+    if ((gotpools = phypListStoragePools(conn, pools, npools)) == -1) {
+        virReportOOMError();
+        goto err;
+    }
+
+    if (gotpools != npools) {
+        virReportOOMError();
+        goto err;
+    }
+
+    for (i = 0; i < gotpools; i++) {
+        if (phypGetStoragePoolUUID(conn, local_uuid, pools[i]) == -1)
+            continue;
+
+        if (STREQLEN((char *) local_uuid, (char *) uuid, 
VIR_UUID_BUFLEN)) {
+            sp = virGetStoragePool(conn, pools[i], uuid);
+            VIR_FREE(local_uuid);
+            VIR_FREE(pools);
+
+            if (sp)
+                return sp;
+            else
+                goto err;
+        }
+    }
+
+  err:
+    VIR_FREE(local_uuid);
+    VIR_FREE(pools);
+    return NULL;
+}
+
+char *
+phypGetStoragePoolName(virConnectPtr conn, unsigned int id)
+{
+    ConnectionData *connection_data = conn->networkPrivateData;
+    phyp_driverPtr phyp_driver = conn->privateData;
+    LIBSSH2_SESSION *session = connection_data->session;
+    char *managed_system = phyp_driver->managed_system;
+    int vios_id = phyp_driver->vios_id;
+    int exit_status = 0;
+    char *cmd = NULL;
+    char *ret = NULL;
+
+    if (virAsprintf(&cmd,
+                    "viosvrcmd -m %s --id %d -c 'lsvg'|sed -n '%dp'",
+                    managed_system, vios_id, id) < 0) {
+        virReportOOMError();
+        goto err;
+    }
+
+    ret = phypExec(session, cmd, &exit_status, conn);
+
+    if (exit_status < 0 || ret == NULL)
+        goto err;
+
+    char *char_ptr = strchr(ret, '\n');
+
+    if (char_ptr)
+        *char_ptr = '\0';
+
+    VIR_FREE(cmd);
+    return ret;
+
+  err:
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return NULL;
+}
+
+int
+phypGetStoragePoolUUID(virConnectPtr conn, unsigned char *uuid,
+                       const char *name)
+{
+    ConnectionData *connection_data = conn->networkPrivateData;
+    phyp_driverPtr phyp_driver = conn->privateData;
+    LIBSSH2_SESSION *session = connection_data->session;
+    char *managed_system = phyp_driver->managed_system;
+    int vios_id = phyp_driver->vios_id;
+    int exit_status = 0;
+    char *cmd = NULL;
+    char *ret = NULL;
+
+    if (virAsprintf(&cmd,
+                    "viosvrcmd -m %s --id %d -c 'lsdev -dev %s -attr "
+                    "vgserial_id'|sed '1d'|sed '1d'",
+                    managed_system, vios_id, name) < 0) {
+        virReportOOMError();
+        goto err;
+    }
+
+    ret = phypExec(session, cmd, &exit_status, conn);
+
+    if (exit_status < 0 || ret == NULL)
+        goto err;
+
+    if (memmove(uuid, ret, VIR_UUID_BUFLEN) == NULL)
+        goto err;
+
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return 0;
+
+  err:
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return -1;
+}
+
+int
+phypGetStoragePoolID(virConnectPtr conn, const char *name)
+{
+    ConnectionData *connection_data = conn->networkPrivateData;
+    phyp_driverPtr phyp_driver = conn->privateData;
+    LIBSSH2_SESSION *session = connection_data->session;
+    char *managed_system = phyp_driver->managed_system;
+    int vios_id = phyp_driver->vios_id;
+    int exit_status = 0;
+    int sp_id = 0;
+    char *char_ptr;
+    char *cmd = NULL;
+    char *ret = NULL;
+
+    if (virAsprintf(&cmd,
+                    "viosvrcmd -m %s --id %d -c 'lssp -field Pool'"
+                    "|sed '1d'|grep -n %s|sed -e 's/:.*$//g'",
+                    managed_system, vios_id, name) < 0) {
+        virReportOOMError();
+        goto err;
+    }
+
+    ret = phypExec(session, cmd, &exit_status, conn);
+
+    if (exit_status < 0 || ret == NULL)
+        goto err;
+
+    if (virStrToLong_i(ret, &char_ptr, 10, &sp_id) == -1)
+        goto err;
+
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return sp_id;
+
+  err:
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return -1;
+}
+
+virStoragePoolPtr
+phypSPLookupByName(virConnectPtr conn, const char *name)
+{
+    virStoragePoolPtr sp = NULL;
+    unsigned char uuid[VIR_UUID_BUFLEN];
+
+    if (phypGetStoragePoolUUID(conn, uuid, name) == -1)
+        return NULL;
+
+    sp = virGetStoragePool(conn, name, uuid);
+
+    if (sp)
+        return sp;
+    else
+        return NULL;
+}
+
+int
+phypNumOfStoragePools(virConnectPtr conn)
+{
+    ConnectionData *connection_data = conn->networkPrivateData;
+    phyp_driverPtr phyp_driver = conn->privateData;
+    LIBSSH2_SESSION *session = connection_data->session;
+    int exit_status = 0;
+    int nsp = 0;
+    char *char_ptr;
+    char *cmd = NULL;
+    char *ret = NULL;
+    char *managed_system = phyp_driver->managed_system;
+    int vios_id = phyp_driver->vios_id;
+
+    if (virAsprintf(&cmd,
+                    "viosvrcmd -m %s --id %d -c 'lsvg'|grep -c ^.*$",
+                    managed_system, vios_id) < 0) {
+        virReportOOMError();
+        goto err;
+    }
+
+    ret = phypExec(session, cmd, &exit_status, conn);
+
+    if (exit_status < 0 || ret == NULL)
+        goto err;
+
+    if (virStrToLong_i(ret, &char_ptr, 10, &nsp) == -1)
+        goto err;
+
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return nsp;
+
+  err:
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return -1;
+}
+
+int
+phypListStoragePools(virConnectPtr conn, char **const pools, int npools)
+{
+    ConnectionData *connection_data = conn->networkPrivateData;
+    phyp_driverPtr phyp_driver = conn->privateData;
+    LIBSSH2_SESSION *session = connection_data->session;
+    char *managed_system = phyp_driver->managed_system;
+    int vios_id = phyp_driver->vios_id;
+    int exit_status = 0;
+    int got = 0;
+    int i;
+    char *cmd = NULL;
+    char *ret = NULL;
+    char *storage_pools = NULL;
+    char *char_ptr2 = NULL;
+
+    if (virAsprintf
+        (&cmd,
+         "viosvrcmd -m %s --id %d -c 'lsvg'",
+         managed_system, vios_id) < 0) {
+        virReportOOMError();
+        goto err;
+    }
+
+    ret = phypExec(session, cmd, &exit_status, conn);
+
+    /* I need to parse the textual return in order to get the storage 
pools */
+    if (exit_status < 0 || ret == NULL)
+        goto err;
+    else {
+        storage_pools = ret;
+
+        while (got < npools) {
+            char_ptr2 = strchr(storage_pools, '\n');
+
+            if (char_ptr2) {
+                *char_ptr2 = '\0';
+                if ((pools[got++] = strdup(storage_pools)) == NULL) {
+                    virReportOOMError();
+                    goto err;
+                }
+                char_ptr2++;
+                storage_pools = char_ptr2;
+            } else
+                break;
+        }
+    }
+
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return got;
+
+  err:
+    for (i = 0; i < got; i++)
+        VIR_FREE(pools[i]);
+    VIR_FREE(cmd);
+    VIR_FREE(ret);
+    return -1;
+}
+
+virDrvOpenStatus
+phypStorageOpen(virConnectPtr conn ATTRIBUTE_UNUSED,
+                virConnectAuthPtr auth ATTRIBUTE_UNUSED,
+                int flags ATTRIBUTE_UNUSED)
+{
+    return VIR_DRV_OPEN_SUCCESS;
+}
+
+int
+phypStorageClose(virConnectPtr conn ATTRIBUTE_UNUSED)
+{
+    return 0;
+}
+
  int
  phypBuildLpar(virConnectPtr conn, virDomainDefPtr def)
  {
@@ -2209,6 +2682,10 @@ waitsocket(int socket_fd, LIBSSH2_SESSION * session)
  int
  phypRegister(void)
  {
-    virRegisterDriver(&phypDriver);
+    if (virRegisterDriver(&phypDriver) < 0)
+        return -1;
+    if (virRegisterStorageDriver(&phypStorageDriver) < 0)
+        return -1;
+
      return 0;
  }
diff --git a/src/phyp/phyp_driver.h b/src/phyp/phyp_driver.h
index f680994..8a7e8dc 100644
--- a/src/phyp/phyp_driver.h
+++ b/src/phyp/phyp_driver.h
@@ -69,6 +69,43 @@ struct _phyp_driver {
      char *managed_system;
  };

+
+/*
+ * Common storage functions
+ * */
+
+char * phypGetStoragePoolDevice(virConnectPtr conn, char *name);
+
+unsigned long int phypGetStoragePoolSize(virConnectPtr conn, char *name);
+
+char * phypGetStoragePoolXMLDesc(virStoragePoolPtr pool, unsigned int 
flags);
+
+virStoragePoolPtr phypGetStorageLookUpByUUID(virConnectPtr conn, const 
unsigned char *uuid);
+
+char * phypGetStoragePoolName(virConnectPtr conn, unsigned int id);
+
+int phypGetStoragePoolID(virConnectPtr conn, const char *name);
+
+int phypGetStoragePoolUUID(virConnectPtr conn, unsigned char *uuid,
+                       const char *name);
+
+virStoragePoolPtr phypSPLookupByName(virConnectPtr conn, const char *name);
+
+int phypNumOfStoragePools(virConnectPtr conn);
+
+int phypListStoragePools(virConnectPtr conn, char **const pools,
+                         int npools);
+
+virDrvOpenStatus phypStorageOpen(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                 virConnectAuthPtr auth ATTRIBUTE_UNUSED,
+                                 int flags ATTRIBUTE_UNUSED);
+
+int phypStorageClose(virConnectPtr conn);
+
+/*
+ * Common driver functions
+ * */
+
  int phypCheckSPFreeSapce(virConnectPtr conn, int required_size, char *sp);

  int phypGetVIOSPartitionID(virConnectPtr conn);




-- 
Eduardo Otubo
Software Engineer
Linux Technology Center
IBM Systems & Technology Group
Mobile: +55 19 8135 0885
eotubo at linux.vnet.ibm.com




More information about the libvir-list mailing list