All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: "Daniel P. Berrange" <berrange@redhat.com>
Cc: Amit Shah <amit.shah@redhat.com>,
	qemu-devel@nongnu.org, Juan Quintela <quintela@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v4 25/28] migration: define 'tls-creds' and 'tls-hostname' migration parameters
Date: Fri, 18 Mar 2016 12:22:07 +0000	[thread overview]
Message-ID: <20160318122206.GG2246@work-vm> (raw)
In-Reply-To: <1457714282-6981-26-git-send-email-berrange@redhat.com>

* Daniel P. Berrange (berrange@redhat.com) wrote:
> Define two new migration parameters to be used with TLS encryption.
> The 'tls-creds' parameter provides the ID of an instance of the
> 'tls-creds' object type, or rather a subclass such as 'tls-creds-x509'.
> Providing these credentials will enable use of TLS on the migration
> data stream.
> 
> If using x509 certificates, together with a migration URI that does
> not include a hostname, the 'tls-hostname' parameter provides the
> hostname to use when verifying the server's x509 certificate. This
> allows TLS to be used in combination with fd: and exec: protocols
> where a TCP connection is established by a 3rd party outside of
> QEMU.
> 
> NB, this requires changing the migrate_set_parameter method in the
> HMP to accept a 's' (string) value instead of 'i' (integer). This
> is backwards compatible, because the parsing of strings allows the
> quotes to be optional, thus any integer is also a valid string.
> 
> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> ---
>  hmp-commands.hx       |  2 +-
>  hmp.c                 | 36 ++++++++++++++++++++++++++------
>  migration/migration.c | 14 +++++++++++++
>  qapi-schema.json      | 58 ++++++++++++++++++++++++++++++++++++++++++++++++---
>  4 files changed, 100 insertions(+), 10 deletions(-)
> 
> diff --git a/hmp-commands.hx b/hmp-commands.hx
> index 664d794..47939b5 100644
> --- a/hmp-commands.hx
> +++ b/hmp-commands.hx
> @@ -1008,7 +1008,7 @@ ETEXI
>  
>      {
>          .name       = "migrate_set_parameter",
> -        .args_type  = "parameter:s,value:i",
> +        .args_type  = "parameter:s,value:s",
>          .params     = "parameter value",
>          .help       = "Set the parameter for migration",
>          .mhandler.cmd = hmp_migrate_set_parameter,
> diff --git a/hmp.c b/hmp.c
> index 7126f17..885b514 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -293,6 +293,12 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
>          monitor_printf(mon, " %s: %" PRId64,
>              MigrationParameter_lookup[MIGRATION_PARAMETER_X_CPU_THROTTLE_INCREMENT],
>              params->x_cpu_throttle_increment);
> +        monitor_printf(mon, " %s: '%s'",
> +            MigrationParameter_lookup[MIGRATION_PARAMETER_TLS_CREDS],
> +            params->tls_creds ? : "");
> +        monitor_printf(mon, " %s: '%s'",
> +            MigrationParameter_lookup[MIGRATION_PARAMETER_TLS_HOSTNAME],
> +            params->tls_hostname ? : "");
>          monitor_printf(mon, "\n");
>      }
>  
> @@ -1242,13 +1248,16 @@ void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict)
>  void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
>  {
>      const char *param = qdict_get_str(qdict, "parameter");
> -    int value = qdict_get_int(qdict, "value");
> +    int valueint = 0;
> +    const char *valuestr = NULL;
>      Error *err = NULL;
>      bool has_compress_level = false;
>      bool has_compress_threads = false;
>      bool has_decompress_threads = false;
>      bool has_x_cpu_throttle_initial = false;
>      bool has_x_cpu_throttle_increment = false;
> +    bool has_tls_creds = false;
> +    bool has_tls_hostname = false;
>      int i;
>  
>      for (i = 0; i < MIGRATION_PARAMETER__MAX; i++) {
> @@ -1256,25 +1265,40 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
>              switch (i) {
>              case MIGRATION_PARAMETER_COMPRESS_LEVEL:
>                  has_compress_level = true;
> +                valueint = qdict_get_int(qdict, "value");

As discussed; those need to be checked to see if they're actually
valid integers.

Other than that, this looks good.

Dave

>                  break;
>              case MIGRATION_PARAMETER_COMPRESS_THREADS:
>                  has_compress_threads = true;
> +                valueint = qdict_get_int(qdict, "value");
>                  break;
>              case MIGRATION_PARAMETER_DECOMPRESS_THREADS:
>                  has_decompress_threads = true;
> +                valueint = qdict_get_int(qdict, "value");
>                  break;
>              case MIGRATION_PARAMETER_X_CPU_THROTTLE_INITIAL:
>                  has_x_cpu_throttle_initial = true;
> +                valueint = qdict_get_int(qdict, "value");
>                  break;
>              case MIGRATION_PARAMETER_X_CPU_THROTTLE_INCREMENT:
>                  has_x_cpu_throttle_increment = true;
> +                valueint = qdict_get_int(qdict, "value");
> +                break;
> +            case MIGRATION_PARAMETER_TLS_CREDS:
> +                has_tls_creds = true;
> +                valuestr = qdict_get_str(qdict, "value");
> +                break;
> +            case MIGRATION_PARAMETER_TLS_HOSTNAME:
> +                has_tls_hostname = true;
> +                valuestr = qdict_get_str(qdict, "value");
>                  break;
>              }
> -            qmp_migrate_set_parameters(has_compress_level, value,
> -                                       has_compress_threads, value,
> -                                       has_decompress_threads, value,
> -                                       has_x_cpu_throttle_initial, value,
> -                                       has_x_cpu_throttle_increment, value,
> +            qmp_migrate_set_parameters(has_compress_level, valueint,
> +                                       has_compress_threads, valueint,
> +                                       has_decompress_threads, valueint,
> +                                       has_x_cpu_throttle_initial, valueint,
> +                                       has_x_cpu_throttle_increment, valueint,
> +                                       has_tls_creds, valuestr,
> +                                       has_tls_hostname, valuestr,
>                                         &err);
>              break;
>          }
> diff --git a/migration/migration.c b/migration/migration.c
> index a056bcd..378041e 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -537,6 +537,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error **errp)
>      params->decompress_threads = s->parameters.decompress_threads;
>      params->x_cpu_throttle_initial = s->parameters.x_cpu_throttle_initial;
>      params->x_cpu_throttle_increment = s->parameters.x_cpu_throttle_increment;
> +    params->tls_creds = g_strdup(s->parameters.tls_creds);
> +    params->tls_hostname = g_strdup(s->parameters.tls_hostname);
>  
>      return params;
>  }
> @@ -738,6 +740,10 @@ void qmp_migrate_set_parameters(bool has_compress_level,
>                                  int64_t x_cpu_throttle_initial,
>                                  bool has_x_cpu_throttle_increment,
>                                  int64_t x_cpu_throttle_increment,
> +                                bool has_tls_creds,
> +                                const char *tls_creds,
> +                                bool has_tls_hostname,
> +                                const char *tls_hostname,
>                                  Error **errp)
>  {
>      MigrationState *s = migrate_get_current();
> @@ -789,6 +795,14 @@ void qmp_migrate_set_parameters(bool has_compress_level,
>      if (has_x_cpu_throttle_increment) {
>          s->parameters.x_cpu_throttle_increment = x_cpu_throttle_increment;
>      }
> +    if (has_tls_creds) {
> +        g_free(s->parameters.tls_creds);
> +        s->parameters.tls_creds = g_strdup(tls_creds);
> +    }
> +    if (has_tls_hostname) {
> +        g_free(s->parameters.tls_hostname);
> +        s->parameters.tls_hostname = g_strdup(tls_hostname);
> +    }
>  }
>  
>  
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 2fd6166..6aac524 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -617,11 +617,28 @@
>  # @x-cpu-throttle-increment: throttle percentage increase each time
>  #                            auto-converge detects that migration is not making
>  #                            progress. The default value is 10. (Since 2.5)
> +#
> +# @tls-creds: ID of the 'tls-creds' object that provides credentials for
> +#             establishing a TLS connection over the migration data channel.
> +#             On the outgoing side of the migration, the credentials must
> +#             be for a 'client' endpoint, while for the incoming side the
> +#             credentials must be for a 'server' endpoint. Setting this
> +#             will enable TLS for all migrations. The default is unset,
> +#             resulting in unsecured migration at the QEMU level. (Since 2.6)
> +#
> +# @tls-hostname: hostname of the target host for the migration. This is
> +#                required when using x509 based TLS credentials and the
> +#                migration URI does not already include a hostname. For
> +#                example if using fd: or exec: based migration, the
> +#                hostname must be provided so that the server's x509
> +#                certificate identity canbe validated. (Since 2.6)
> +#
>  # Since: 2.4
>  ##
>  { 'enum': 'MigrationParameter',
>    'data': ['compress-level', 'compress-threads', 'decompress-threads',
> -           'x-cpu-throttle-initial', 'x-cpu-throttle-increment'] }
> +           'x-cpu-throttle-initial', 'x-cpu-throttle-increment',
> +           'tls-creds', 'tls-hostname'] }
>  
>  #
>  # @migrate-set-parameters
> @@ -641,6 +658,22 @@
>  # @x-cpu-throttle-increment: throttle percentage increase each time
>  #                            auto-converge detects that migration is not making
>  #                            progress. The default value is 10. (Since 2.5)
> +#
> +# @tls-creds: ID of the 'tls-creds' object that provides credentials for
> +#             establishing a TLS connection over the migration data channel.
> +#             On the outgoing side of the migration, the credentials must
> +#             be for a 'client' endpoint, while for the incoming side the
> +#             credentials must be for a 'server' endpoint. Setting this
> +#             will enable TLS for all migrations. The default is unset,
> +#             resulting in unsecured migration at the QEMU level. (Since 2.6)
> +#
> +# @tls-hostname: hostname of the target host for the migration. This is
> +#                required when using x509 based TLS credentials and the
> +#                migration URI does not already include a hostname. For
> +#                example if using fd: or exec: based migration, the
> +#                hostname must be provided so that the server's x509
> +#                certificate identity canbe validated. (Since 2.6)
> +#
>  # Since: 2.4
>  ##
>  { 'command': 'migrate-set-parameters',
> @@ -648,7 +681,9 @@
>              '*compress-threads': 'int',
>              '*decompress-threads': 'int',
>              '*x-cpu-throttle-initial': 'int',
> -            '*x-cpu-throttle-increment': 'int'} }
> +            '*x-cpu-throttle-increment': 'int',
> +            '*tls-creds': 'str',
> +            '*tls-hostname': 'str'} }
>  
>  #
>  # @MigrationParameters
> @@ -667,6 +702,21 @@
>  #                            auto-converge detects that migration is not making
>  #                            progress. The default value is 10. (Since 2.5)
>  #
> +# @tls-creds: ID of the 'tls-creds' object that provides credentials for
> +#             establishing a TLS connection over the migration data channel.
> +#             On the outgoing side of the migration, the credentials must
> +#             be for a 'client' endpoint, while for the incoming side the
> +#             credentials must be for a 'server' endpoint. Setting this
> +#             will enable TLS for all migrations. The default is unset,
> +#             resulting in unsecured migration at the QEMU level. (Since 2.6)
> +#
> +# @tls-hostname: hostname of the target host for the migration. This is
> +#                required when using x509 based TLS credentials and the
> +#                migration URI does not already include a hostname. For
> +#                example if using fd: or exec: based migration, the
> +#                hostname must be provided so that the server's x509
> +#                certificate identity canbe validated. (Since 2.6)
> +#
>  # Since: 2.4
>  ##
>  { 'struct': 'MigrationParameters',
> @@ -674,7 +724,9 @@
>              'compress-threads': 'int',
>              'decompress-threads': 'int',
>              'x-cpu-throttle-initial': 'int',
> -            'x-cpu-throttle-increment': 'int'} }
> +            'x-cpu-throttle-increment': 'int',
> +            'tls-creds': 'str',
> +            'tls-hostname': 'str'} }
>  ##
>  # @query-migrate-parameters
>  #
> -- 
> 2.5.0
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

  reply	other threads:[~2016-03-18 12:22 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-11 16:37 [Qemu-devel] [PATCH v4 00/28] Convert migration to QIOChannel & support TLS Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 01/28] s390: use FILE instead of QEMUFile for creating text file Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 02/28] io: avoid double-free when closing QIOChannelBuffer Daniel P. Berrange
2016-03-14 19:43   ` Dr. David Alan Gilbert
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 03/28] migration: remove use of qemu_bufopen from vmstate tests Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 04/28] migration: ensure qemu_fflush() always writes full data amount Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 05/28] migration: split migration hooks out of QEMUFileOps Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 06/28] migration: introduce set_blocking function in QEMUFileOps Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 07/28] migration: force QEMUFile to blocking mode for outgoing migration Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 08/28] migration: introduce a new QEMUFile impl based on QIOChannel Daniel P. Berrange
2016-03-18 12:06   ` Dr. David Alan Gilbert
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 09/28] migration: add helpers for creating QEMUFile from a QIOChannel Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 10/28] migration: add reporting of errors for outgoing migration Daniel P. Berrange
2016-03-14 19:57   ` Dr. David Alan Gilbert
2016-03-15 10:01     ` Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 11/28] migration: convert post-copy to use QIOChannelBuffer Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 12/28] migration: convert unix socket protocol to use QIOChannel Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 13/28] migration: rename unix.c to socket.c Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 14/28] migration: convert tcp socket protocol to use QIOChannel Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 15/28] migration: convert fd " Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 16/28] migration: convert exec " Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 17/28] migration: convert RDMA to use QIOChannel interface Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 18/28] migration: convert savevm to use QIOChannel for writing to files Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 19/28] migration: delete QEMUFile buffer implementation Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 20/28] migration: delete QEMUSizedBuffer struct Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 21/28] migration: delete QEMUFile sockets implementation Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 22/28] migration: delete QEMUFile stdio implementation Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 23/28] migration: move definition of struct QEMUFile back into qemu-file.c Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 24/28] migration: don't use an array for storing migrate parameters Daniel P. Berrange
2016-03-11 16:37 ` [Qemu-devel] [PATCH v4 25/28] migration: define 'tls-creds' and 'tls-hostname' migration parameters Daniel P. Berrange
2016-03-18 12:22   ` Dr. David Alan Gilbert [this message]
2016-03-11 16:38 ` [Qemu-devel] [PATCH v4 26/28] migration: add support for encrypting data with TLS Daniel P. Berrange
2016-03-11 16:38 ` [Qemu-devel] [PATCH v4 27/28] migration: remove support for non-iovec based write handlers Daniel P. Berrange
2016-03-11 16:38 ` [Qemu-devel] [PATCH v4 28/28] migration: remove qemu_get_fd method from QEMUFile Daniel P. Berrange

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160318122206.GG2246@work-vm \
    --to=dgilbert@redhat.com \
    --cc=amit.shah@redhat.com \
    --cc=berrange@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.