Migration from vdscli to jsonrpcvdscli

Between both communication modules there is a compatibility issue. When we work with jsonrpc we do not send response status information (code, message) when method invocation was successful. We only send it when command failed. There is compatibility mode that we can set when calling jsonrpcvdscli.connect.

vdscli

Here is the code how we used to create vdscli client:

  hostPort = vdscli.cannonizeHostPort(
      self._dst,
      config.getint('addresses', 'management_port'))
  if config.getboolean('vars', 'ssl'):
      self._destServer = vdscli.connect(hostPort,
          useSSL=True,
          TransportClass=kaxmlrpclib.TcpkeepSafeTransport)
  else:
      destServer = kaxmlrpclib.Server('`[`http://`](http://)`' + hostPort)

In the old code we provide information where we want to connect in hostPort and whether we want to use ssl.

jsonrpcvdscli

Here is jsonrpcvdscli code: from vdsm import jsonrpcvdscli from vdsm.config import config requestQueues = config.get('addresses', 'request_queues') requestQueue = requestQueues.split(",")[0] destServer = jsonrpcvdscli.connect(requestQueue, host=host, port=port)

Above code use config.py to get missing information we can customize the client by providing more detail:

  from vdsm import jsonrpcvdscli
  from vdsm.config import config
  from vdsm.sslcompat import sslutils
  from vdsm import utils
  sslctx = sslutils.create_ssl_context()
  client_socket = utils.create_connected_socket(host, int(port), sslctx)
  client = clientIF.createStompClient(client_socket)
  requestQueues = config.get('addresses', 'request_queues')
  requestQueue = requestQueues.split(",")[0]
  destServer = jsonrpcvdscli.connect(requestQueue, client) 

Please note that above code do not connect during the process of creation. It is required to call a procedure to physically establish connection.

New client is not widely used so for some of the methods it is required to update _COMMAND_CONVERTER dictionary in jsonrpcvdscli module. It contain mapping of a methods called on destServer proxy object and api method names.

example

There are 2 examples in vdsm code already:

  • migration.py
  • tests/functional/utils.py