Reviewed-by: Konstantin Kostiuk <kkost...@redhat.com>

On Thu, Jun 13, 2024 at 6:44 PM Daniel P. Berrangé <berra...@redhat.com>
wrote:

> Rather than creating stubs for every command that just return
> QERR_UNSUPPORTED, use 'if' conditions in the QAPI schema to
> fully exclude generation of the commands on Windows.
>
> The command will be rejected at QMP dispatch time instead,
> avoiding reimplementing rejection by blocking the stub commands.
> This changes the error message for affected commands from
>
>     {"class": "CommandNotFound", "desc": "Command FOO has been disabled"}
>
> to
>
>     {"class": "CommandNotFound", "desc": "The command FOO has not been
> found"}
>
> This also fixes an accidental inconsistency where some commands
> (guest-get-diskstats & guest-get-cpustats) are implemented as
> stubs, yet not added to the blockedrpc list. Those change their
> error message from
>
>     {"class": "GenericError, "desc": "this feature or command is not
> currently supported"}
>
> to
>
>     {"class": "CommandNotFound", "desc": "The command FOO has not been
> found"}
>
> The final additional benefit is that the QGA protocol reference
> now documents what conditions enable use of the command.
>
> Signed-off-by: Daniel P. Berrangé <berra...@redhat.com>
> ---
>  qga/commands-posix.c |  2 +-
>  qga/commands-win32.c | 56 +-------------------------------------------
>  qga/qapi-schema.json | 45 +++++++++++++++++++++++------------
>  3 files changed, 32 insertions(+), 71 deletions(-)
>
> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> index 2a3bef7445..0dd8555867 100644
> --- a/qga/commands-posix.c
> +++ b/qga/commands-posix.c
> @@ -1280,7 +1280,7 @@ GList *ga_command_init_blockedrpcs(GList
> *blockedrpcs)
>              "guest-get-memory-blocks", "guest-set-memory-blocks",
>              "guest-get-memory-block-info",
>              NULL};
> -        char **p = (char **)list;
> +        const char **p = list;
>
>          while (*p) {
>              blockedrpcs = g_list_append(blockedrpcs, g_strdup(*p++));
> diff --git a/qga/commands-win32.c b/qga/commands-win32.c
> index 9fe670d5b4..2533e4c748 100644
> --- a/qga/commands-win32.c
> +++ b/qga/commands-win32.c
> @@ -1494,11 +1494,6 @@ out:
>      }
>  }
>
> -void qmp_guest_suspend_hybrid(Error **errp)
> -{
> -    error_setg(errp, QERR_UNSUPPORTED);
> -}
> -
>  static IP_ADAPTER_ADDRESSES *guest_get_adapters_addresses(Error **errp)
>  {
>      IP_ADAPTER_ADDRESSES *adptr_addrs = NULL;
> @@ -1862,12 +1857,6 @@ GuestLogicalProcessorList
> *qmp_guest_get_vcpus(Error **errp)
>      return NULL;
>  }
>
> -int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error
> **errp)
> -{
> -    error_setg(errp, QERR_UNSUPPORTED);
> -    return -1;
> -}
> -
>  static gchar *
>  get_net_error_message(gint error)
>  {
> @@ -1969,46 +1958,15 @@ done:
>      g_free(rawpasswddata);
>  }
>
> -GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp)
> -{
> -    error_setg(errp, QERR_UNSUPPORTED);
> -    return NULL;
> -}
> -
> -GuestMemoryBlockResponseList *
> -qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, Error **errp)
> -{
> -    error_setg(errp, QERR_UNSUPPORTED);
> -    return NULL;
> -}
> -
> -GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
> -{
> -    error_setg(errp, QERR_UNSUPPORTED);
> -    return NULL;
> -}
> -
>  /* add unsupported commands to the list of blocked RPCs */
>  GList *ga_command_init_blockedrpcs(GList *blockedrpcs)
>  {
> -    const char *list_unsupported[] = {
> -        "guest-suspend-hybrid",
> -        "guest-set-vcpus",
> -        "guest-get-memory-blocks", "guest-set-memory-blocks",
> -        "guest-get-memory-block-info",
> -        NULL};
> -    char **p = (char **)list_unsupported;
> -
> -    while (*p) {
> -        blockedrpcs = g_list_append(blockedrpcs, g_strdup(*p++));
> -    }
> -
>      if (!vss_init(true)) {
>          g_debug("vss_init failed, vss commands are going to be disabled");
>          const char *list[] = {
>              "guest-get-fsinfo", "guest-fsfreeze-status",
>              "guest-fsfreeze-freeze", "guest-fsfreeze-thaw", NULL};
> -        p = (char **)list;
> +        char **p = (char **)list;
>
>          while (*p) {
>              blockedrpcs = g_list_append(blockedrpcs, g_strdup(*p++));
> @@ -2505,15 +2463,3 @@ char *qga_get_host_name(Error **errp)
>
>      return g_utf16_to_utf8(tmp, size, NULL, NULL, NULL);
>  }
> -
> -GuestDiskStatsInfoList *qmp_guest_get_diskstats(Error **errp)
> -{
> -    error_setg(errp, QERR_UNSUPPORTED);
> -    return NULL;
> -}
> -
> -GuestCpuStatsList *qmp_guest_get_cpustats(Error **errp)
> -{
> -    error_setg(errp, QERR_UNSUPPORTED);
> -    return NULL;
> -}
> diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
> index b3de1fb6b3..b91456e9ad 100644
> --- a/qga/qapi-schema.json
> +++ b/qga/qapi-schema.json
> @@ -636,7 +636,8 @@
>  #
>  # Since: 1.1
>  ##
> -{ 'command': 'guest-suspend-hybrid', 'success-response': false }
> +{ 'command': 'guest-suspend-hybrid', 'success-response': false,
> +  'if': 'CONFIG_POSIX' }
>
>  ##
>  # @GuestIpAddressType:
> @@ -806,7 +807,8 @@
>  ##
>  { 'command': 'guest-set-vcpus',
>    'data':    {'vcpus': ['GuestLogicalProcessor'] },
> -  'returns': 'int' }
> +  'returns': 'int',
> +  'if': 'CONFIG_POSIX' }
>
>  ##
>  # @GuestDiskBusType:
> @@ -1099,7 +1101,8 @@
>  { 'struct': 'GuestMemoryBlock',
>    'data': {'phys-index': 'uint64',
>             'online': 'bool',
> -           '*can-offline': 'bool'} }
> +           '*can-offline': 'bool'},
> +  'if': 'CONFIG_POSIX' }
>
>  ##
>  # @guest-get-memory-blocks:
> @@ -1115,7 +1118,8 @@
>  # Since: 2.3
>  ##
>  { 'command': 'guest-get-memory-blocks',
> -  'returns': ['GuestMemoryBlock'] }
> +  'returns': ['GuestMemoryBlock'],
> +  'if': 'CONFIG_POSIX' }
>
>  ##
>  # @GuestMemoryBlockResponseType:
> @@ -1138,7 +1142,8 @@
>  ##
>  { 'enum': 'GuestMemoryBlockResponseType',
>    'data': ['success', 'not-found', 'operation-not-supported',
> -           'operation-failed'] }
> +           'operation-failed'],
> +  'if': 'CONFIG_POSIX' }
>
>  ##
>  # @GuestMemoryBlockResponse:
> @@ -1156,7 +1161,8 @@
>  { 'struct': 'GuestMemoryBlockResponse',
>    'data': { 'phys-index': 'uint64',
>              'response': 'GuestMemoryBlockResponseType',
> -            '*error-code': 'int' }}
> +            '*error-code': 'int' },
> +  'if': 'CONFIG_POSIX'}
>
>  ##
>  # @guest-set-memory-blocks:
> @@ -1187,7 +1193,8 @@
>  ##
>  { 'command': 'guest-set-memory-blocks',
>    'data':    {'mem-blks': ['GuestMemoryBlock'] },
> -  'returns': ['GuestMemoryBlockResponse'] }
> +  'returns': ['GuestMemoryBlockResponse'],
> +  'if': 'CONFIG_POSIX' }
>
>  ##
>  # @GuestMemoryBlockInfo:
> @@ -1199,7 +1206,8 @@
>  # Since: 2.3
>  ##
>  { 'struct': 'GuestMemoryBlockInfo',
> -  'data': {'size': 'uint64'} }
> +  'data': {'size': 'uint64'},
> +  'if': 'CONFIG_POSIX' }
>
>  ##
>  # @guest-get-memory-block-info:
> @@ -1211,7 +1219,8 @@
>  # Since: 2.3
>  ##
>  { 'command': 'guest-get-memory-block-info',
> -  'returns': 'GuestMemoryBlockInfo' }
> +  'returns': 'GuestMemoryBlockInfo',
> +  'if': 'CONFIG_POSIX' }
>
>  ##
>  # @GuestExecStatus:
> @@ -1702,7 +1711,8 @@
>    'data': {'name': 'str',
>             'major': 'uint64',
>             'minor': 'uint64',
> -           'stats': 'GuestDiskStats' } }
> +           'stats': 'GuestDiskStats' },
> +  'if': 'CONFIG_POSIX' }
>
>  ##
>  # @guest-get-diskstats:
> @@ -1714,7 +1724,8 @@
>  # Since: 7.1
>  ##
>  { 'command': 'guest-get-diskstats',
> -  'returns': ['GuestDiskStatsInfo']
> +  'returns': ['GuestDiskStatsInfo'],
> +  'if': 'CONFIG_POSIX'
>  }
>
>  ##
> @@ -1727,7 +1738,8 @@
>  # Since: 7.1
>  ##
>  { 'enum': 'GuestCpuStatsType',
> -  'data': [ 'linux' ] }
> +  'data': [ 'linux' ],
> +  'if': 'CONFIG_POSIX' }
>
>
>  ##
> @@ -1772,7 +1784,8 @@
>             '*steal': 'uint64',
>             '*guest': 'uint64',
>             '*guestnice': 'uint64'
> -           } }
> +           },
> +  'if': 'CONFIG_POSIX' }
>
>  ##
>  # @GuestCpuStats:
> @@ -1786,7 +1799,8 @@
>  { 'union': 'GuestCpuStats',
>    'base': { 'type': 'GuestCpuStatsType' },
>    'discriminator': 'type',
> -  'data': { 'linux': 'GuestLinuxCpuStats' } }
> +  'data': { 'linux': 'GuestLinuxCpuStats' },
> +  'if': 'CONFIG_POSIX' }
>
>  ##
>  # @guest-get-cpustats:
> @@ -1798,5 +1812,6 @@
>  # Since: 7.1
>  ##
>  { 'command': 'guest-get-cpustats',
> -  'returns': ['GuestCpuStats']
> +  'returns': ['GuestCpuStats'],
> +  'if': 'CONFIG_POSIX'
>  }
> --
> 2.45.1
>
>

Reply via email to