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 | ||||
| Version:        1.28.4 | ||||
| Release:        1%{?dist} | ||||
| Release:        2%{?dist} | ||||
| Summary:        NBD server | ||||
| 
 | ||||
| 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 | ||||
| Patch0028:     0028-scripts-Add-simple-script-for-automating-VDDK-disk-c.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 | ||||
| %if 0%{patches_touch_autotools} | ||||
| @ -1214,7 +1219,7 @@ export LIBGUESTFS_TRACE=1 | ||||
| 
 | ||||
| 
 | ||||
| %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 | ||||
|   resolves: rhbz#2011709 | ||||
| - Move nbdkit-null-plugin to nbdkit-server package | ||||
| @ -1227,6 +1232,7 @@ export LIBGUESTFS_TRACE=1 | ||||
| - Fix nbdkit-cow-filter cow-block-size=4096 | ||||
| - file: Fix implementation of cache=none for writes | ||||
|   resolves: rhbz#2029751 | ||||
| - vddk: Implement VMDK creation | ||||
| 
 | ||||
| * Thu Aug 19 2021 Richard W.M. Jones <rjones@redhat.com> - 1.26.5-1 | ||||
| - Rebase along stable branch to 1.26.5 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user