vddk: Implement VMDK creation
Also apply patch: 0030-tests-Add-configure-disable-libguestfs-tests-flag.patch which was previous present in git but not applied by the spec file. Because of this the previous build warned: configure: WARNING: unrecognized options: --enable-libguestfs-tests related: rhbz#2011709
This commit is contained in:
		
							parent
							
								
									752d86cd28
								
							
						
					
					
						commit
						c8704cbb64
					
				
							
								
								
									
										538
									
								
								0031-vddk-Implement-VMDK-creation.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										538
									
								
								0031-vddk-Implement-VMDK-creation.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,538 @@ | |||||||
|  | From 62d3369404b32eb486a6c6dc12c80d638d8f8d89 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Tue, 18 Jan 2022 08:58:15 +0000 | ||||||
|  | Subject: [PATCH] vddk: Implement VMDK creation | ||||||
|  | 
 | ||||||
|  | Add the create=(true|false) parameter.  Setting this to true causes | ||||||
|  | the VMDK local file to be created.  Currently this is done on first | ||||||
|  | connection, but we might change that in future.  Various other | ||||||
|  | parameters can be used to control aspects of the VMDK file. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit a39d5773afc3ebab7e5768118a2bccb89a654585) | ||||||
|  | ---
 | ||||||
|  |  plugins/vddk/nbdkit-vddk-plugin.pod | 102 ++++++++++++++++++++++- | ||||||
|  |  plugins/vddk/vddk-structs.h         |  32 +++++++ | ||||||
|  |  plugins/vddk/vddk-stubs.h           |   7 ++ | ||||||
|  |  plugins/vddk/vddk.c                 | 125 ++++++++++++++++++++++++++++ | ||||||
|  |  plugins/vddk/vddk.h                 |   5 ++ | ||||||
|  |  tests/Makefile.am                   |   6 +- | ||||||
|  |  tests/dummy-vddk.c                  |  10 +++ | ||||||
|  |  tests/test-vddk-real-create.sh      |  70 ++++++++++++++++ | ||||||
|  |  8 files changed, 354 insertions(+), 3 deletions(-) | ||||||
|  |  create mode 100755 tests/test-vddk-real-create.sh | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/vddk/nbdkit-vddk-plugin.pod b/plugins/vddk/nbdkit-vddk-plugin.pod
 | ||||||
|  | index acec0bd2..b96192d0 100644
 | ||||||
|  | --- a/plugins/vddk/nbdkit-vddk-plugin.pod
 | ||||||
|  | +++ b/plugins/vddk/nbdkit-vddk-plugin.pod
 | ||||||
|  | @@ -6,7 +6,11 @@ nbdkit-vddk-plugin - nbdkit VMware VDDK plugin
 | ||||||
|  |   | ||||||
|  |   nbdkit vddk [file=]FILENAME | ||||||
|  |               [compression=none|zlib|fastlz|skipz] | ||||||
|  | -             [config=FILENAME] [cookie=COOKIE] [libdir=LIBRARY]
 | ||||||
|  | +             [config=FILENAME] [cookie=COOKIE]
 | ||||||
|  | +             [create=true] [create-adapter-type=ide|scsi-buslogic|...]
 | ||||||
|  | +             [create-hwversion=workstation4|workstation5|...]
 | ||||||
|  | +             [create-size=...] [create-type=monolithic-sparse|...]
 | ||||||
|  | +             [libdir=LIBRARY]
 | ||||||
|  |               [nfchostport=PORT] [single-link=true] | ||||||
|  |               [password=PASSWORD | password=- | password=+FILENAME | | ||||||
|  |                password=-FD] | ||||||
|  | @@ -26,7 +30,7 @@ yourself (see L</LIBRARY LOCATION> below).
 | ||||||
|  |   | ||||||
|  |  =head1 EXAMPLES | ||||||
|  |   | ||||||
|  | -=head2 Open a local VMDK file
 | ||||||
|  | +=head2 Open an existing local VMDK file
 | ||||||
|  |   | ||||||
|  |   nbdkit vddk /absolute/path/to/file.vmdk | ||||||
|  |   | ||||||
|  | @@ -38,6 +42,18 @@ I<-r> option):
 | ||||||
|  |   | ||||||
|  |   nbdkit -r vddk /absolute/path/to/file.vmdk | ||||||
|  |   | ||||||
|  | +=head2 Create a new local VMDK file
 | ||||||
|  | +
 | ||||||
|  | +You can use VDDK to create a VMDK file and fill it with the contents
 | ||||||
|  | +of a disk image.  Note the C<create-size> parameter is the virtual
 | ||||||
|  | +size of the final VMDK disk image and must be at least as large as the
 | ||||||
|  | +input disk:
 | ||||||
|  | +
 | ||||||
|  | + nbdkit -U - vddk \
 | ||||||
|  | +        /absolute/path/to/output.vmdk \
 | ||||||
|  | +        create=1 create-size=100M \
 | ||||||
|  | +        --run 'qemu-img convert input.qcow2 $uri'
 | ||||||
|  | +
 | ||||||
|  |  =head2 Open a file on a remote VMware ESXi hypervisor | ||||||
|  |   | ||||||
|  |  Connect directly to a VMware ESXi hypervisor and export a particular | ||||||
|  | @@ -136,6 +152,88 @@ C<VIXDISKLIB_CRED_SESSIONID> which can improve performance.  The
 | ||||||
|  |  cookie can be found by connecting to a VCenter Server over HTTPS and | ||||||
|  |  retrieving the C<vmware_soap_session> cookie. | ||||||
|  |   | ||||||
|  | +=item B<create=true>
 | ||||||
|  | +
 | ||||||
|  | +(nbdkit E<ge> 1.30)
 | ||||||
|  | +
 | ||||||
|  | +Create a new, local VMDK file.  Instead of opening an existing VMDK
 | ||||||
|  | +file, a new VMDK file is created and opened.  The filename is given by
 | ||||||
|  | +the C<file> parameter (see below).  The file must not exist already.
 | ||||||
|  | +It is not possible to create a remote file using nbdkit.
 | ||||||
|  | +
 | ||||||
|  | +If this is used, the C<create-size> parameter is required to specify
 | ||||||
|  | +the virtual size of the disk.  Other C<create-*> parameters (see
 | ||||||
|  | +below) can be used to control the VMDK sub-format.
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-adapter-type=ide>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-adapter-type=scsi-buslogic>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-adapter-type=scsi-lsilogic>
 | ||||||
|  | +
 | ||||||
|  | +(nbdkit E<ge> 1.30)
 | ||||||
|  | +
 | ||||||
|  | +Specify the VMDK disk adapter type.  The default is C<scsi-buslogic>.
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-hwversion=workstation4>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-hwversion=workstation5>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-hwversion=workstation6>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-hwversion=esx30>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-hwversion=esx4x>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-hwversion=esx50>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-hwversion=esx51>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-hwversion=esx55>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-hwversion=esx60>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-hwversion=esx65>
 | ||||||
|  | +
 | ||||||
|  | +(nbdkit E<ge> 1.30)
 | ||||||
|  | +
 | ||||||
|  | +Specify the VMDK virtual hardware version.  The default is
 | ||||||
|  | +C<workstation5>.
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-size=>SIZE
 | ||||||
|  | +
 | ||||||
|  | +(nbdkit E<ge> 1.30)
 | ||||||
|  | +
 | ||||||
|  | +Specify the virtual size of the created disk.  The C<SIZE> can use
 | ||||||
|  | +modifiers like C<100M> etc.  It must be a multiple of 512 bytes
 | ||||||
|  | +because VMware only supports sector sizes.
 | ||||||
|  | +
 | ||||||
|  | +If you use C<create=true> then this parameter is required.
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-type=monolithic-sparse>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-type=monolithic-flat>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-type=split-sparse>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-type=split-flat>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-type=vmfs-flat>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-type=stream-optimized>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-type=vmfs-thin>
 | ||||||
|  | +
 | ||||||
|  | +=item B<create-type=vmfs-sparse>
 | ||||||
|  | +
 | ||||||
|  | +(nbdkit E<ge> 1.30)
 | ||||||
|  | +
 | ||||||
|  | +Specify the VMDK sub-format.  The default is C<monolithic-sparse>.
 | ||||||
|  | +
 | ||||||
|  | +Some VMDK sub-formats use multiple files, where the C<file> parameter
 | ||||||
|  | +specifies the "Disk Descriptor File" and the disk contents are stored
 | ||||||
|  | +in adjacent files.
 | ||||||
|  | +
 | ||||||
|  |  =item [B<file=>]FILENAME | ||||||
|  |   | ||||||
|  |  =item [B<file=>]B<[>datastoreB<] >vmname/vmnameB<.vmdk> | ||||||
|  | diff --git a/plugins/vddk/vddk-structs.h b/plugins/vddk/vddk-structs.h
 | ||||||
|  | index e97f017c..799c4aec 100644
 | ||||||
|  | --- a/plugins/vddk/vddk-structs.h
 | ||||||
|  | +++ b/plugins/vddk/vddk-structs.h
 | ||||||
|  | @@ -43,6 +43,7 @@
 | ||||||
|  |   | ||||||
|  |  typedef uint64_t VixError; | ||||||
|  |  #define VIX_OK 0 | ||||||
|  | +#define VIX_E_NOT_SUPPORTED 6
 | ||||||
|  |  #define VIX_ASYNC 25000 | ||||||
|  |   | ||||||
|  |  #define VIXDISKLIB_FLAG_OPEN_UNBUFFERED 1 | ||||||
|  | @@ -54,6 +55,28 @@ typedef uint64_t VixError;
 | ||||||
|  |   | ||||||
|  |  #define VIXDISKLIB_SECTOR_SIZE 512 | ||||||
|  |   | ||||||
|  | +enum VixDiskLibDiskType {
 | ||||||
|  | +  VIXDISKLIB_DISK_MONOLITHIC_SPARSE = 1,
 | ||||||
|  | +  VIXDISKLIB_DISK_MONOLITHIC_FLAT = 2,
 | ||||||
|  | +  VIXDISKLIB_DISK_SPLIT_SPARSE = 3,
 | ||||||
|  | +  VIXDISKLIB_DISK_SPLIT_FLAT = 4,
 | ||||||
|  | +  VIXDISKLIB_DISK_VMFS_FLAT = 5,
 | ||||||
|  | +  VIXDISKLIB_DISK_STREAM_OPTIMIZED = 6,
 | ||||||
|  | +  VIXDISKLIB_DISK_VMFS_THIN = 7,
 | ||||||
|  | +  VIXDISKLIB_DISK_VMFS_SPARSE = 8
 | ||||||
|  | +};
 | ||||||
|  | +
 | ||||||
|  | +#define VIXDISKLIB_HWVERSION_WORKSTATION_4 3
 | ||||||
|  | +#define VIXDISKLIB_HWVERSION_WORKSTATION_5 4
 | ||||||
|  | +#define VIXDISKLIB_HWVERSION_WORKSTATION_6 6
 | ||||||
|  | +#define VIXDISKLIB_HWVERSION_ESX30 4
 | ||||||
|  | +#define VIXDISKLIB_HWVERSION_ESX4X 7
 | ||||||
|  | +#define VIXDISKLIB_HWVERSION_ESX50 8
 | ||||||
|  | +#define VIXDISKLIB_HWVERSION_ESX51 9
 | ||||||
|  | +#define VIXDISKLIB_HWVERSION_ESX55 10
 | ||||||
|  | +#define VIXDISKLIB_HWVERSION_ESX60 11
 | ||||||
|  | +#define VIXDISKLIB_HWVERSION_ESX65 13
 | ||||||
|  | +
 | ||||||
|  |  #define VIXDISKLIB_MIN_CHUNK_SIZE 128 | ||||||
|  |  #define VIXDISKLIB_MAX_CHUNK_NUMBER (512*1024) | ||||||
|  |   | ||||||
|  | @@ -148,4 +171,13 @@ typedef struct {
 | ||||||
|  |    VixDiskLibBlock blocks[1]; | ||||||
|  |  } VixDiskLibBlockList; | ||||||
|  |   | ||||||
|  | +typedef struct {
 | ||||||
|  | +  enum VixDiskLibDiskType diskType;
 | ||||||
|  | +  enum VixDiskLibAdapterType adapterType;
 | ||||||
|  | +  uint16_t hwVersion;
 | ||||||
|  | +  uint64_t capacity;
 | ||||||
|  | +  uint32_t logicalSectorSize;
 | ||||||
|  | +  uint32_t physicalSectorSize;
 | ||||||
|  | +} VixDiskLibCreateParams;
 | ||||||
|  | +
 | ||||||
|  |  #endif /* NBDKIT_VDDK_STRUCTS_H */ | ||||||
|  | diff --git a/plugins/vddk/vddk-stubs.h b/plugins/vddk/vddk-stubs.h
 | ||||||
|  | index 7d8644c3..d5affa10 100644
 | ||||||
|  | --- a/plugins/vddk/vddk-stubs.h
 | ||||||
|  | +++ b/plugins/vddk/vddk-stubs.h
 | ||||||
|  | @@ -99,6 +99,13 @@ STUB (VixDiskLib_Write,
 | ||||||
|  |        (VixDiskLibHandle handle, | ||||||
|  |         uint64_t start_sector, uint64_t nr_sectors, | ||||||
|  |         const unsigned char *buf)); | ||||||
|  | +STUB (VixDiskLib_Create,
 | ||||||
|  | +      VixError,
 | ||||||
|  | +      (const VixDiskLibConnection connection,
 | ||||||
|  | +       const char *path,
 | ||||||
|  | +       const VixDiskLibCreateParams *create_params,
 | ||||||
|  | +       void *progress_function_unused,
 | ||||||
|  | +       void *progress_data_unused));
 | ||||||
|  |   | ||||||
|  |  /* Added in VDDK 6.0. */ | ||||||
|  |  STUB (VixDiskLib_Flush, | ||||||
|  | diff --git a/plugins/vddk/vddk.c b/plugins/vddk/vddk.c
 | ||||||
|  | index 31e5e23b..5ebf9a2c 100644
 | ||||||
|  | --- a/plugins/vddk/vddk.c
 | ||||||
|  | +++ b/plugins/vddk/vddk.c
 | ||||||
|  | @@ -81,6 +81,14 @@ bool is_remote;                        /* true if remote connection */
 | ||||||
|  |  enum compression_type compression;     /* compression */ | ||||||
|  |  char *config;                          /* config */ | ||||||
|  |  const char *cookie;                    /* cookie */ | ||||||
|  | +bool create;                           /* create */
 | ||||||
|  | +enum VixDiskLibAdapterType create_adapter_type =
 | ||||||
|  | +  VIXDISKLIB_ADAPTER_SCSI_BUSLOGIC;    /* create-adapter-type */
 | ||||||
|  | +uint16_t create_hwversion =
 | ||||||
|  | +  VIXDISKLIB_HWVERSION_WORKSTATION_5;  /* create-hwversion */
 | ||||||
|  | +uint64_t create_size;                  /* create-size */
 | ||||||
|  | +enum VixDiskLibDiskType create_type =
 | ||||||
|  | +  VIXDISKLIB_DISK_MONOLITHIC_SPARSE;   /* create-type */
 | ||||||
|  |  const char *filename;                  /* file */ | ||||||
|  |  char *libdir;                          /* libdir */ | ||||||
|  |  uint16_t nfc_host_port;                /* nfchostport */ | ||||||
|  | @@ -119,6 +127,7 @@ static int
 | ||||||
|  |  vddk_config (const char *key, const char *value) | ||||||
|  |  { | ||||||
|  |    int r; | ||||||
|  | +  int64_t r64;
 | ||||||
|  |   | ||||||
|  |    if (strcmp (key, "compression") == 0) { | ||||||
|  |      if (strcmp (value, "zlib") == 0) | ||||||
|  | @@ -144,6 +153,82 @@ vddk_config (const char *key, const char *value)
 | ||||||
|  |    else if (strcmp (key, "cookie") == 0) { | ||||||
|  |      cookie = value; | ||||||
|  |    } | ||||||
|  | +  else if (strcmp (key, "create") == 0) {
 | ||||||
|  | +    r = nbdkit_parse_bool (value);
 | ||||||
|  | +    if (r == -1)
 | ||||||
|  | +      return -1;
 | ||||||
|  | +    create = r;
 | ||||||
|  | +  }
 | ||||||
|  | +  else if (strcmp (key, "create-adapter-type") == 0) {
 | ||||||
|  | +    if (strcmp (value, "ide") == 0)
 | ||||||
|  | +      create_adapter_type = VIXDISKLIB_ADAPTER_IDE;
 | ||||||
|  | +    else if (strcmp (value, "scsi-buslogic") == 0)
 | ||||||
|  | +      create_adapter_type = VIXDISKLIB_ADAPTER_SCSI_BUSLOGIC;
 | ||||||
|  | +    else if (strcmp (value, "scsi-lsilogic") == 0)
 | ||||||
|  | +      create_adapter_type = VIXDISKLIB_ADAPTER_SCSI_LSILOGIC;
 | ||||||
|  | +    else {
 | ||||||
|  | +      nbdkit_error ("unknown create-adapter-type: %s", value);
 | ||||||
|  | +      return -1;
 | ||||||
|  | +    }
 | ||||||
|  | +  }
 | ||||||
|  | +  else if (strcmp (key, "create-hwversion") == 0) {
 | ||||||
|  | +    if (strcmp (value, "workstation4") == 0)
 | ||||||
|  | +      create_hwversion = VIXDISKLIB_HWVERSION_WORKSTATION_4;
 | ||||||
|  | +    else if (strcmp (value, "workstation5") == 0)
 | ||||||
|  | +      create_hwversion = VIXDISKLIB_HWVERSION_WORKSTATION_5;
 | ||||||
|  | +    else if (strcmp (value, "workstation6") == 0)
 | ||||||
|  | +      create_hwversion = VIXDISKLIB_HWVERSION_WORKSTATION_6;
 | ||||||
|  | +    else if (strcmp (value, "esx30") == 0)
 | ||||||
|  | +      create_hwversion = VIXDISKLIB_HWVERSION_ESX30;
 | ||||||
|  | +    else if (strcmp (value, "esx4x") == 0)
 | ||||||
|  | +      create_hwversion = VIXDISKLIB_HWVERSION_ESX4X;
 | ||||||
|  | +    else if (strcmp (value, "esx50") == 0)
 | ||||||
|  | +      create_hwversion = VIXDISKLIB_HWVERSION_ESX50;
 | ||||||
|  | +    else if (strcmp (value, "esx51") == 0)
 | ||||||
|  | +      create_hwversion = VIXDISKLIB_HWVERSION_ESX51;
 | ||||||
|  | +    else if (strcmp (value, "esx55") == 0)
 | ||||||
|  | +      create_hwversion = VIXDISKLIB_HWVERSION_ESX55;
 | ||||||
|  | +    else if (strcmp (value, "esx60") == 0)
 | ||||||
|  | +      create_hwversion = VIXDISKLIB_HWVERSION_ESX60;
 | ||||||
|  | +    else if (strcmp (value, "esx65") == 0)
 | ||||||
|  | +      create_hwversion = VIXDISKLIB_HWVERSION_ESX65;
 | ||||||
|  | +    else {
 | ||||||
|  | +      nbdkit_error ("unknown create-hwversion: %s", value);
 | ||||||
|  | +      return -1;
 | ||||||
|  | +    }
 | ||||||
|  | +  }
 | ||||||
|  | +  else if (strcmp (key, "create-size") == 0) {
 | ||||||
|  | +    r64 = nbdkit_parse_size (value);
 | ||||||
|  | +    if (r64 == -1)
 | ||||||
|  | +      return -1;
 | ||||||
|  | +    if (r64 <= 0 || (r64 & 511) != 0) {
 | ||||||
|  | +      nbdkit_error ("create-size must be greater than zero and a multiple of 512");
 | ||||||
|  | +      return -1;
 | ||||||
|  | +    }
 | ||||||
|  | +    create_size = r64;
 | ||||||
|  | +  }
 | ||||||
|  | +  else if (strcmp (key, "create-type") == 0) {
 | ||||||
|  | +    if (strcmp (value, "monolithic-sparse") == 0)
 | ||||||
|  | +      create_type = VIXDISKLIB_DISK_MONOLITHIC_SPARSE;
 | ||||||
|  | +    else if (strcmp (value, "monolithic-flat") == 0)
 | ||||||
|  | +      create_type = VIXDISKLIB_DISK_MONOLITHIC_FLAT;
 | ||||||
|  | +    else if (strcmp (value, "split-sparse") == 0)
 | ||||||
|  | +      create_type = VIXDISKLIB_DISK_SPLIT_SPARSE;
 | ||||||
|  | +    else if (strcmp (value, "split-flat") == 0)
 | ||||||
|  | +      create_type = VIXDISKLIB_DISK_SPLIT_FLAT;
 | ||||||
|  | +    else if (strcmp (value, "vmfs-flat") == 0)
 | ||||||
|  | +      create_type = VIXDISKLIB_DISK_VMFS_FLAT;
 | ||||||
|  | +    else if (strcmp (value, "stream-optimized") == 0)
 | ||||||
|  | +      create_type = VIXDISKLIB_DISK_STREAM_OPTIMIZED;
 | ||||||
|  | +    else if (strcmp (value, "vmfs-thin") == 0)
 | ||||||
|  | +      create_type = VIXDISKLIB_DISK_VMFS_THIN;
 | ||||||
|  | +    else if (strcmp (value, "vmfs-sparse") == 0)
 | ||||||
|  | +      create_type = VIXDISKLIB_DISK_VMFS_SPARSE;
 | ||||||
|  | +    else {
 | ||||||
|  | +      nbdkit_error ("unknown create-type: %s", value);
 | ||||||
|  | +      return -1;
 | ||||||
|  | +    }
 | ||||||
|  | +  }
 | ||||||
|  |    else if (strcmp (key, "file") == 0) { | ||||||
|  |      /* NB: Don't convert this to an absolute path, because in the | ||||||
|  |       * remote case this can be a path located on the VMware server. | ||||||
|  | @@ -266,6 +351,18 @@ vddk_config_complete (void)
 | ||||||
|  |  #undef missing | ||||||
|  |    } | ||||||
|  |   | ||||||
|  | +  if (create) {
 | ||||||
|  | +    if (is_remote) {
 | ||||||
|  | +      nbdkit_error ("create=true can only be used to create local VMDK files");
 | ||||||
|  | +      return -1;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  | +    if (create_size == 0) {
 | ||||||
|  | +      nbdkit_error ("if using create=true you must specify the size using the create-size parameter");
 | ||||||
|  | +      return -1;
 | ||||||
|  | +    }
 | ||||||
|  | +  }
 | ||||||
|  | +
 | ||||||
|  |    /* Restore original LD_LIBRARY_PATH after reexec. */ | ||||||
|  |    if (restore_ld_library_path () == -1) | ||||||
|  |      return -1; | ||||||
|  | @@ -618,6 +715,34 @@ vddk_open (int readonly)
 | ||||||
|  |      goto err1; | ||||||
|  |    } | ||||||
|  |   | ||||||
|  | +  /* Creating a disk?  The first time the connection is opened we will
 | ||||||
|  | +   * create it here (we need h->connection).  Then set create=false so
 | ||||||
|  | +   * we don't create it again.  This is all serialized through
 | ||||||
|  | +   * open_close_lock so it is safe.
 | ||||||
|  | +   */
 | ||||||
|  | +  if (create) {
 | ||||||
|  | +    VixDiskLibCreateParams cparams = {
 | ||||||
|  | +      .diskType = create_type,
 | ||||||
|  | +      .adapterType = create_adapter_type,
 | ||||||
|  | +      .hwVersion = create_hwversion,
 | ||||||
|  | +      .capacity = create_size / VIXDISKLIB_SECTOR_SIZE,
 | ||||||
|  | +      .logicalSectorSize = 0,
 | ||||||
|  | +      .physicalSectorSize = 0
 | ||||||
|  | +    };
 | ||||||
|  | +
 | ||||||
|  | +    VDDK_CALL_START (VixDiskLib_Create,
 | ||||||
|  | +                     "h->connection, %s, &cparams, NULL, NULL",
 | ||||||
|  | +                     filename)
 | ||||||
|  | +      err = VixDiskLib_Create (h->connection, filename, &cparams, NULL, NULL);
 | ||||||
|  | +    VDDK_CALL_END (VixDiskLib_Create, 0);
 | ||||||
|  | +    if (err != VIX_OK) {
 | ||||||
|  | +      VDDK_ERROR (err, "VixDiskLib_Create: %s", filename);
 | ||||||
|  | +      goto err2;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  | +    create = false; /* Don't create it again. */
 | ||||||
|  | +  }
 | ||||||
|  | +
 | ||||||
|  |    flags = 0; | ||||||
|  |    if (readonly) | ||||||
|  |      flags |= VIXDISKLIB_FLAG_OPEN_READ_ONLY; | ||||||
|  | diff --git a/plugins/vddk/vddk.h b/plugins/vddk/vddk.h
 | ||||||
|  | index d99b6f4b..3a808013 100644
 | ||||||
|  | --- a/plugins/vddk/vddk.h
 | ||||||
|  | +++ b/plugins/vddk/vddk.h
 | ||||||
|  | @@ -56,6 +56,11 @@ extern bool is_remote;
 | ||||||
|  |  extern enum compression_type compression; | ||||||
|  |  extern char *config; | ||||||
|  |  extern const char *cookie; | ||||||
|  | +extern bool create;
 | ||||||
|  | +extern enum VixDiskLibAdapterType create_adapter_type;
 | ||||||
|  | +extern uint16_t create_hwversion;
 | ||||||
|  | +extern uint64_t create_size;
 | ||||||
|  | +extern enum VixDiskLibDiskType create_type;
 | ||||||
|  |  extern const char *filename; | ||||||
|  |  extern char *libdir; | ||||||
|  |  extern uint16_t nfc_host_port; | ||||||
|  | diff --git a/tests/Makefile.am b/tests/Makefile.am
 | ||||||
|  | index 43b60943..ad2d43b9 100644
 | ||||||
|  | --- a/tests/Makefile.am
 | ||||||
|  | +++ b/tests/Makefile.am
 | ||||||
|  | @@ -171,7 +171,9 @@ if HAVE_VDDK
 | ||||||
|  |  # | ||||||
|  |  #   make check-vddk vddkdir=vmware-vix-disklib-distrib | ||||||
|  |  check-vddk: | ||||||
|  | -	$(MAKE) check TESTS="test-vddk-real.sh test-vddk-real-dump-plugin.sh"
 | ||||||
|  | +	$(MAKE) check TESTS="test-vddk-real.sh
 | ||||||
|  | +	                     test-vddk-real-dump-plugin.sh
 | ||||||
|  | +	                     test-vddk-real-create.sh"
 | ||||||
|  |  endif HAVE_VDDK | ||||||
|  |   | ||||||
|  |  #---------------------------------------------------------------------- | ||||||
|  | @@ -1033,6 +1035,7 @@ TESTS += \
 | ||||||
|  |  	test-vddk-dump-plugin.sh \ | ||||||
|  |  	test-vddk-password-fd.sh \ | ||||||
|  |  	test-vddk-password-interactive.sh \ | ||||||
|  | +	test-vddk-real-create.sh \
 | ||||||
|  |  	test-vddk-real-dump-plugin.sh \ | ||||||
|  |  	test-vddk-real.sh \ | ||||||
|  |  	test-vddk-reexec.sh \ | ||||||
|  | @@ -1063,6 +1066,7 @@ EXTRA_DIST += \
 | ||||||
|  |  	test-vddk-dump-plugin.sh \ | ||||||
|  |  	test-vddk-password-fd.sh \ | ||||||
|  |  	test-vddk-password-interactive.sh \ | ||||||
|  | +	test-vddk-real-create.sh \
 | ||||||
|  |  	test-vddk-real-dump-plugin.sh \ | ||||||
|  |  	test-vddk-real.sh \ | ||||||
|  |  	test-vddk-reexec.sh \ | ||||||
|  | diff --git a/tests/dummy-vddk.c b/tests/dummy-vddk.c
 | ||||||
|  | index b6f12042..0c5e505f 100644
 | ||||||
|  | --- a/tests/dummy-vddk.c
 | ||||||
|  | +++ b/tests/dummy-vddk.c
 | ||||||
|  | @@ -236,3 +236,13 @@ VixDiskLib_Wait (VixDiskLibHandle handle)
 | ||||||
|  |  { | ||||||
|  |    return VIX_OK; | ||||||
|  |  } | ||||||
|  | +
 | ||||||
|  | +NBDKIT_DLL_PUBLIC VixError
 | ||||||
|  | +VixDiskLib_Create (const VixDiskLibConnection connection,
 | ||||||
|  | +                   const char *path,
 | ||||||
|  | +                   const VixDiskLibCreateParams *create_params,
 | ||||||
|  | +                   void *progress_function_unused,
 | ||||||
|  | +                   void *progress_data_unused)
 | ||||||
|  | +{
 | ||||||
|  | +  return VIX_E_NOT_SUPPORTED;
 | ||||||
|  | +}
 | ||||||
|  | diff --git a/tests/test-vddk-real-create.sh b/tests/test-vddk-real-create.sh
 | ||||||
|  | new file mode 100755 | ||||||
|  | index 00000000..8f39a4c9
 | ||||||
|  | --- /dev/null
 | ||||||
|  | +++ b/tests/test-vddk-real-create.sh
 | ||||||
|  | @@ -0,0 +1,70 @@
 | ||||||
|  | +#!/usr/bin/env bash
 | ||||||
|  | +# nbdkit
 | ||||||
|  | +# Copyright (C) 2018-2022 Red Hat Inc.
 | ||||||
|  | +#
 | ||||||
|  | +# Redistribution and use in source and binary forms, with or without
 | ||||||
|  | +# modification, are permitted provided that the following conditions are
 | ||||||
|  | +# met:
 | ||||||
|  | +#
 | ||||||
|  | +# * Redistributions of source code must retain the above copyright
 | ||||||
|  | +# notice, this list of conditions and the following disclaimer.
 | ||||||
|  | +#
 | ||||||
|  | +# * Redistributions in binary form must reproduce the above copyright
 | ||||||
|  | +# notice, this list of conditions and the following disclaimer in the
 | ||||||
|  | +# documentation and/or other materials provided with the distribution.
 | ||||||
|  | +#
 | ||||||
|  | +# * Neither the name of Red Hat nor the names of its contributors may be
 | ||||||
|  | +# used to endorse or promote products derived from this software without
 | ||||||
|  | +# specific prior written permission.
 | ||||||
|  | +#
 | ||||||
|  | +# THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
 | ||||||
|  | +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 | ||||||
|  | +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 | ||||||
|  | +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
 | ||||||
|  | +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||||
|  | +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||||
|  | +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 | ||||||
|  | +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | ||||||
|  | +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | ||||||
|  | +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 | ||||||
|  | +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | ||||||
|  | +# SUCH DAMAGE.
 | ||||||
|  | +
 | ||||||
|  | +source ./functions.sh
 | ||||||
|  | +set -e
 | ||||||
|  | +set -x
 | ||||||
|  | +
 | ||||||
|  | +requires test "x$vddkdir" != "x"
 | ||||||
|  | +requires test -d "$vddkdir"
 | ||||||
|  | +requires test -f "$vddkdir/lib64/libvixDiskLib.so"
 | ||||||
|  | +requires test -f disk
 | ||||||
|  | +requires nbdcopy --version
 | ||||||
|  | +requires stat --version
 | ||||||
|  | +
 | ||||||
|  | +# Testing $LD_LIBRARY_PATH stuff breaks valgrind, so skip the rest of
 | ||||||
|  | +# this test if valgrinding.
 | ||||||
|  | +if [ "x$NBDKIT_VALGRIND" = "x1" ]; then
 | ||||||
|  | +    echo "$0: skipped LD_LIBRARY_PATH test when doing valgrind"
 | ||||||
|  | +    exit 77
 | ||||||
|  | +fi
 | ||||||
|  | +
 | ||||||
|  | +# VDDK > 5.1.1 only supports x86_64.
 | ||||||
|  | +if [ `uname -m` != "x86_64" ]; then
 | ||||||
|  | +    echo "$0: unsupported architecture"
 | ||||||
|  | +    exit 77
 | ||||||
|  | +fi
 | ||||||
|  | +
 | ||||||
|  | +vmdk=$PWD/test-vddk-real-create.vmdk ;# note must be an absolute path
 | ||||||
|  | +files="$vmdk"
 | ||||||
|  | +rm -f $files
 | ||||||
|  | +cleanup_fn rm -f $files
 | ||||||
|  | +
 | ||||||
|  | +size="$(stat -c %s disk)"
 | ||||||
|  | +
 | ||||||
|  | +nbdkit -fv -U - vddk libdir="$vddkdir" $vmdk \
 | ||||||
|  | +       create=true create-size=$size \
 | ||||||
|  | +       --run 'nbdcopy disk $uri'
 | ||||||
|  | +
 | ||||||
|  | +# Check the VMDK file was created and looks reasonable.
 | ||||||
|  | +test -f $vmdk
 | ||||||
|  | +file $vmdk | grep 'VMware'
 | ||||||
|  | -- 
 | ||||||
|  | 2.31.1 | ||||||
|  | 
 | ||||||
							
								
								
									
										29
									
								
								0032-vddk-Fix-documentation-of-new-create-flag.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								0032-vddk-Fix-documentation-of-new-create-flag.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | From ff09d5df01da12758db5caaffa9dfe0ad14c8889 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Tue, 18 Jan 2022 13:14:01 +0000 | ||||||
|  | Subject: [PATCH] vddk: Fix documentation of new create flag | ||||||
|  | 
 | ||||||
|  | create=1 works, but for consistency use create=true | ||||||
|  | 
 | ||||||
|  | Fixes: commit a39d5773afc3ebab7e5768118a2bccb89a654585 | ||||||
|  | (cherry picked from commit 0b21897b64a6a1d97a8a7361e8f781ae743dedca) | ||||||
|  | ---
 | ||||||
|  |  plugins/vddk/nbdkit-vddk-plugin.pod | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/vddk/nbdkit-vddk-plugin.pod b/plugins/vddk/nbdkit-vddk-plugin.pod
 | ||||||
|  | index b96192d0..6c7ae989 100644
 | ||||||
|  | --- a/plugins/vddk/nbdkit-vddk-plugin.pod
 | ||||||
|  | +++ b/plugins/vddk/nbdkit-vddk-plugin.pod
 | ||||||
|  | @@ -51,7 +51,7 @@ input disk:
 | ||||||
|  |   | ||||||
|  |   nbdkit -U - vddk \ | ||||||
|  |          /absolute/path/to/output.vmdk \ | ||||||
|  | -        create=1 create-size=100M \
 | ||||||
|  | +        create=true create-size=100M \
 | ||||||
|  |          --run 'qemu-img convert input.qcow2 $uri' | ||||||
|  |   | ||||||
|  |  =head2 Open a file on a remote VMware ESXi hypervisor | ||||||
|  | -- 
 | ||||||
|  | 2.31.1 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,55 @@ | |||||||
|  | From 4089c9019c744f07f3d9b8035f8879588efccced Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Tue, 18 Jan 2022 20:49:21 +0000 | ||||||
|  | Subject: [PATCH] vddk: Allow create-hwversion to be specified as a number | ||||||
|  | 
 | ||||||
|  | This gives us a bit of future-proofing so we don't always need to add | ||||||
|  | new hardware versions immediately.  Another reason for this is that | ||||||
|  | VDDK allows you to specify seemingly any number here without | ||||||
|  | complaint. | ||||||
|  | 
 | ||||||
|  | Updates: commit a39d5773afc3ebab7e5768118a2bccb89a654585 | ||||||
|  | (cherry picked from commit 071e32927237c2c00d78684c8a0f2e5fbca9963e) | ||||||
|  | ---
 | ||||||
|  |  plugins/vddk/nbdkit-vddk-plugin.pod | 8 ++++++-- | ||||||
|  |  plugins/vddk/vddk.c                 | 3 ++- | ||||||
|  |  2 files changed, 8 insertions(+), 3 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/vddk/nbdkit-vddk-plugin.pod b/plugins/vddk/nbdkit-vddk-plugin.pod
 | ||||||
|  | index 6c7ae989..e6972900 100644
 | ||||||
|  | --- a/plugins/vddk/nbdkit-vddk-plugin.pod
 | ||||||
|  | +++ b/plugins/vddk/nbdkit-vddk-plugin.pod
 | ||||||
|  | @@ -195,10 +195,14 @@ Specify the VMDK disk adapter type.  The default is C<scsi-buslogic>.
 | ||||||
|  |   | ||||||
|  |  =item B<create-hwversion=esx65> | ||||||
|  |   | ||||||
|  | +=item B<create-hwversion=>N
 | ||||||
|  | +
 | ||||||
|  |  (nbdkit E<ge> 1.30) | ||||||
|  |   | ||||||
|  | -Specify the VMDK virtual hardware version.  The default is
 | ||||||
|  | -C<workstation5>.
 | ||||||
|  | +Specify the VMDK virtual hardware version.  You can give either the
 | ||||||
|  | +named version or the equivalent 16 bit number.
 | ||||||
|  | +
 | ||||||
|  | +The default is C<workstation5> (N = 4).
 | ||||||
|  |   | ||||||
|  |  =item B<create-size=>SIZE | ||||||
|  |   | ||||||
|  | diff --git a/plugins/vddk/vddk.c b/plugins/vddk/vddk.c
 | ||||||
|  | index 5ebf9a2c..bab8de6f 100644
 | ||||||
|  | --- a/plugins/vddk/vddk.c
 | ||||||
|  | +++ b/plugins/vddk/vddk.c
 | ||||||
|  | @@ -192,7 +192,8 @@ vddk_config (const char *key, const char *value)
 | ||||||
|  |        create_hwversion = VIXDISKLIB_HWVERSION_ESX60; | ||||||
|  |      else if (strcmp (value, "esx65") == 0) | ||||||
|  |        create_hwversion = VIXDISKLIB_HWVERSION_ESX65; | ||||||
|  | -    else {
 | ||||||
|  | +    else if (nbdkit_parse_uint16_t ("create-hwversion", value,
 | ||||||
|  | +                                    &create_hwversion) == -1) {
 | ||||||
|  |        nbdkit_error ("unknown create-hwversion: %s", value); | ||||||
|  |        return -1; | ||||||
|  |      } | ||||||
|  | -- 
 | ||||||
|  | 2.31.1 | ||||||
|  | 
 | ||||||
							
								
								
									
										31
									
								
								0034-tests-Fix-VDDK-tests.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								0034-tests-Fix-VDDK-tests.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | From fb9cff514ebb26a808a0ae43f64ab86df878cd77 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Tue, 18 Jan 2022 21:02:32 +0000 | ||||||
|  | Subject: [PATCH] tests: Fix VDDK tests | ||||||
|  | 
 | ||||||
|  | We need to use quoting for the subcommand split across lines. | ||||||
|  | 
 | ||||||
|  | Fixes: commit a39d5773afc3ebab7e5768118a2bccb89a654585 | ||||||
|  | (cherry picked from commit 4df525566b38202ed8a7485ac8e7f06edd5ee49a) | ||||||
|  | ---
 | ||||||
|  |  tests/Makefile.am | 4 ++-- | ||||||
|  |  1 file changed, 2 insertions(+), 2 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/tests/Makefile.am b/tests/Makefile.am
 | ||||||
|  | index ad2d43b9..62a6f05b 100644
 | ||||||
|  | --- a/tests/Makefile.am
 | ||||||
|  | +++ b/tests/Makefile.am
 | ||||||
|  | @@ -171,8 +171,8 @@ if HAVE_VDDK
 | ||||||
|  |  # | ||||||
|  |  #   make check-vddk vddkdir=vmware-vix-disklib-distrib | ||||||
|  |  check-vddk: | ||||||
|  | -	$(MAKE) check TESTS="test-vddk-real.sh
 | ||||||
|  | -	                     test-vddk-real-dump-plugin.sh
 | ||||||
|  | +	$(MAKE) check TESTS="test-vddk-real.sh \
 | ||||||
|  | +	                     test-vddk-real-dump-plugin.sh \
 | ||||||
|  |  	                     test-vddk-real-create.sh" | ||||||
|  |  endif HAVE_VDDK | ||||||
|  |   | ||||||
|  | -- 
 | ||||||
|  | 2.31.1 | ||||||
|  | 
 | ||||||
							
								
								
									
										10
									
								
								nbdkit.spec
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								nbdkit.spec
									
									
									
									
									
								
							| @ -52,7 +52,7 @@ ExclusiveArch:  x86_64 | |||||||
| 
 | 
 | ||||||
| Name:           nbdkit | Name:           nbdkit | ||||||
| Version:        1.28.4 | Version:        1.28.4 | ||||||
| Release:        1%{?dist} | Release:        2%{?dist} | ||||||
| Summary:        NBD server | Summary:        NBD server | ||||||
| 
 | 
 | ||||||
| License:        BSD | License:        BSD | ||||||
| @ -106,6 +106,11 @@ Patch0026:     0026-Revert-podwrapper.pl.in-Use-short-commit-date.patch | |||||||
| Patch0027:     0027-Fix-podwrapper.pl.in-Use-short-commit-date.patch | Patch0027:     0027-Fix-podwrapper.pl.in-Use-short-commit-date.patch | ||||||
| Patch0028:     0028-scripts-Add-simple-script-for-automating-VDDK-disk-c.patch | Patch0028:     0028-scripts-Add-simple-script-for-automating-VDDK-disk-c.patch | ||||||
| Patch0029:     0029-file-Fix-implementation-of-cache-none-for-writes.patch | Patch0029:     0029-file-Fix-implementation-of-cache-none-for-writes.patch | ||||||
|  | Patch0030:     0030-tests-Add-configure-disable-libguestfs-tests-flag.patch | ||||||
|  | Patch0031:     0031-vddk-Implement-VMDK-creation.patch | ||||||
|  | Patch0032:     0032-vddk-Fix-documentation-of-new-create-flag.patch | ||||||
|  | Patch0033:     0033-vddk-Allow-create-hwversion-to-be-specified-as-a-num.patch | ||||||
|  | Patch0034:     0034-tests-Fix-VDDK-tests.patch | ||||||
| 
 | 
 | ||||||
| BuildRequires: make | BuildRequires: make | ||||||
| %if 0%{patches_touch_autotools} | %if 0%{patches_touch_autotools} | ||||||
| @ -1214,7 +1219,7 @@ export LIBGUESTFS_TRACE=1 | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
| * Tue Jan 04 2022 Richard W.M. Jones <rjones@redhat.com> - 1.28.4-1 | * Tue Jan 18 2022 Richard W.M. Jones <rjones@redhat.com> - 1.28.4-2 | ||||||
| - Rebase to new stable branch version 1.28.4 | - Rebase to new stable branch version 1.28.4 | ||||||
|   resolves: rhbz#2011709 |   resolves: rhbz#2011709 | ||||||
| - Move nbdkit-null-plugin to nbdkit-server package | - Move nbdkit-null-plugin to nbdkit-server package | ||||||
| @ -1227,6 +1232,7 @@ export LIBGUESTFS_TRACE=1 | |||||||
| - Fix nbdkit-cow-filter cow-block-size=4096 | - Fix nbdkit-cow-filter cow-block-size=4096 | ||||||
| - file: Fix implementation of cache=none for writes | - file: Fix implementation of cache=none for writes | ||||||
|   resolves: rhbz#2029751 |   resolves: rhbz#2029751 | ||||||
|  | - vddk: Implement VMDK creation | ||||||
| 
 | 
 | ||||||
| * Thu Aug 19 2021 Richard W.M. Jones <rjones@redhat.com> - 1.26.5-1 | * Thu Aug 19 2021 Richard W.M. Jones <rjones@redhat.com> - 1.26.5-1 | ||||||
| - Rebase along stable branch to 1.26.5 | - Rebase along stable branch to 1.26.5 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user