[Libvir] Record an error when refusing a read-only operation

Daniel P. Berrange berrange at redhat.com
Wed Aug 16 14:30:30 UTC 2006


The libvirt.c front-end can be compiled in 'pedantic' mode in which case it
explicitly refuses operations with side-effects in read-only connections. 
When doing so, however, it was not recording any error message so feedback
to the user was misleading / obsure. This patch adds an extra error code
VIR_ERR_READ_ONLY which is used when an operation is denied due to a read
only connection.

This patch also passes 'VIR_DRV_OPEN_QUIET' to the 'open' method so tell
the XenD driver not complain if it fails to open a HV connection. This is
because it was complaining whenever trying to open a test:///default 
connection.

Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
-------------- next part --------------
Index: src/libvirt.c
===================================================================
RCS file: /data/cvs/libvirt/src/libvirt.c,v
retrieving revision 1.42
diff -c -r1.42 libvirt.c
*** src/libvirt.c	11 Aug 2006 14:40:04 -0000	1.42
--- src/libvirt.c	16 Aug 2006 15:17:43 -0000
***************
*** 240,246 ****
  
      for (i = 0;i < MAX_DRIVERS;i++) {
          if ((virDriverTab[i] != NULL) && (virDriverTab[i]->open != NULL)) {
! 	    res = virDriverTab[i]->open(ret, name, 0);
  	    /*
  	     * For a default connect to Xen make sure we manage to contact
  	     * all related drivers.
--- 240,246 ----
  
      for (i = 0;i < MAX_DRIVERS;i++) {
          if ((virDriverTab[i] != NULL) && (virDriverTab[i]->open != NULL)) {
! 	    res = virDriverTab[i]->open(ret, name, VIR_DRV_OPEN_QUIET);
  	    /*
  	     * For a default connect to Xen make sure we manage to contact
  	     * all related drivers.
***************
*** 730,737 ****
  
      conn = domain->conn;
  #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO)
          return (-1);
  #endif
  
      /*
--- 730,739 ----
  
      conn = domain->conn;
  #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO) {
!         virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
          return (-1);
+     }
  #endif
  
      /*
***************
*** 805,812 ****
  
      conn = domain->conn;
  #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO)
          return (-1);
  #endif
  
      /*
--- 807,816 ----
  
      conn = domain->conn;
  #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO) {
!         virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
          return (-1);
+     }
  #endif
  
      /*
***************
*** 857,864 ****
  
      conn = domain->conn;
  #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO)
          return (-1);
  #endif
  
      /*
--- 861,870 ----
  
      conn = domain->conn;
  #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO) {
!         virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
          return (-1);
+     }
  #endif
  
      /*
***************
*** 1030,1037 ****
  
      conn = domain->conn;
  #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO)
          return (-1);
  #endif
  
      /* Go though the driver registered entry points */
--- 1036,1045 ----
  
      conn = domain->conn;
  #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO) {
!         virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
          return (-1);
+     }
  #endif
  
      /* Go though the driver registered entry points */
***************
*** 1075,1082 ****
  
      conn = domain->conn;
  #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO)
          return (-1);
  #endif
  
      /* Go though the driver registered entry points */
--- 1083,1092 ----
  
      conn = domain->conn;
  #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO) {
!         virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
          return (-1);
+     }
  #endif
  
      /* Go though the driver registered entry points */
***************
*** 1168,1174 ****
  virDomainGetUUIDString(virDomainPtr domain, char *buf)
  {
      unsigned char uuid[16];
!     
      if (!VIR_IS_DOMAIN(domain)) {
          virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
          return (-1);
--- 1178,1184 ----
  virDomainGetUUIDString(virDomainPtr domain, char *buf)
  {
      unsigned char uuid[16];
! 
      if (!VIR_IS_DOMAIN(domain)) {
          virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
          return (-1);
***************
*** 1309,1316 ****
          return (-1);
      }
      conn = domain->conn;
!     if (domain->conn->flags & VIR_CONNECT_RO)
          return (-1);
  
      /*
       * in that case instead of trying only though one method try all availble.
--- 1319,1330 ----
          return (-1);
      }
      conn = domain->conn;
! #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO) {
!         virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
          return (-1);
+     }
+ #endif
  
      /*
       * in that case instead of trying only though one method try all availble.
***************
*** 1361,1368 ****
          return (-1);
      }
      conn = domain->conn;
!     if (domain->conn->flags & VIR_CONNECT_RO)
          return (-1);
  
      /*
       * in that case instead of trying only though one method try all availble.
--- 1375,1386 ----
          return (-1);
      }
      conn = domain->conn;
! #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO) {
!         virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
          return (-1);
+     }
+ #endif
  
      /*
       * in that case instead of trying only though one method try all availble.
***************
*** 1682,1689 ****
          virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
          return (-1);
      }
!     if (domain->conn->flags & VIR_CONNECT_RO)
          return (-1);
      if (nvcpus < 1) {
          virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
          return (-1);
--- 1700,1711 ----
          virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
          return (-1);
      }
! #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO) {
!         virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
          return (-1);
+     }
+ #endif
      if (nvcpus < 1) {
          virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
          return (-1);
***************
*** 1748,1755 ****
          virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
          return (-1);
      }
!     if (domain->conn->flags & VIR_CONNECT_RO)
          return (-1);
      if ((vcpu > 32000) || (cpumap == NULL) || (maplen < 1)) {
          virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
          return (-1);
--- 1770,1781 ----
          virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
          return (-1);
      }
! #if PEDANTIC
!     if (domain->conn->flags & VIR_CONNECT_RO) {
!         virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
          return (-1);
+     }
+ #endif
      if ((vcpu > 32000) || (cpumap == NULL) || (maplen < 1)) {
          virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
          return (-1);
Index: src/virterror.c
===================================================================
RCS file: /data/cvs/libvirt/src/virterror.c,v
retrieving revision 1.15
diff -c -r1.15 virterror.c
*** src/virterror.c	28 Jul 2006 15:10:18 -0000	1.15
--- src/virterror.c	16 Aug 2006 15:17:43 -0000
***************
*** 533,538 ****
--- 533,542 ----
  	    else
  	        errmsg = "domain %s exists already";
              break;
+         case VIR_ERR_READ_ONLY:
+ 	    errmsg = "the hypervisor connection is readonly";
+             break;
+        
      }
      return (errmsg);
  }
Index: include/libvirt/virterror.h
===================================================================
RCS file: /data/cvs/libvirt/include/libvirt/virterror.h,v
retrieving revision 1.14
diff -c -r1.14 virterror.h
*** include/libvirt/virterror.h	28 Jun 2006 18:19:13 -0000	1.14
--- include/libvirt/virterror.h	16 Aug 2006 15:17:43 -0000
***************
*** 105,111 ****
      VIR_ERR_DRIVER_FULL, /* too many drivers registered */
      VIR_ERR_CALL_FAILED, /* not supported by the drivers */
      VIR_ERR_XML_ERROR, /* an XML description is not well formed or broken */
!     VIR_ERR_DOM_EXIST /* the domain already exist */
  } virErrorNumber;
  
  /**
--- 105,112 ----
      VIR_ERR_DRIVER_FULL, /* too many drivers registered */
      VIR_ERR_CALL_FAILED, /* not supported by the drivers */
      VIR_ERR_XML_ERROR, /* an XML description is not well formed or broken */
!     VIR_ERR_DOM_EXIST, /* the domain already exist */
!     VIR_ERR_READ_ONLY /* the HV connection is readonly */
  } virErrorNumber;
  
  /**


More information about the libvir-list mailing list