Run model by sending message to RabbitMQ queue containing the
        run end experiment identifier. Messages are persistent to ensure that
        a worker will process process the run request at some point.

        Throws a EngineException if communication with the server fails.

        Parameters
        ----------
        model_run : ModelRunHandle
            Handle to model run
        run_url : string
            URL for model run information

def run_model(self, model_run, run_url):
        """Run model by sending message to RabbitMQ queue containing the
        run end experiment identifier. Messages are persistent to ensure that
        a worker will process process the run request at some point.

        Throws a EngineException if communication with the server fails.

        Parameters
        ----------
        model_run : ModelRunHandle
            Handle to model run
        run_url : string
            URL for model run information
        """
        # Open connection to RabbitMQ server. Will raise an exception if the
        # server is not running. In this case we raise an EngineException to
        # allow caller to delete model run.
        try:
            credentials = pika.PlainCredentials(self.user, self.password)
            con = pika.BlockingConnection(pika.ConnectionParameters(
                host=self.host,
                port=self.port,
                virtual_host=self.virtual_host,
                credentials=credentials
            ))
            channel = con.channel()
            channel.queue_declare(queue=self.queue, durable=True)
        except pika.exceptions.AMQPError as ex:
            err_msg = str(ex)
            if err_msg == '':
                err_msg = 'unable to connect to RabbitMQ: ' + self.user + '@'
                err_msg += self.host + ':' + str(self.port)
                err_msg += self.virtual_host + ' ' + self.queue
            raise EngineException(err_msg, 500)
        # Create model run request
        request = RequestFactory().get_request(model_run, run_url)
        # Send request
        channel.basic_publish(
            exchange='',
            routing_key=self.queue,
            body=json.dumps(request.to_dict()),
            properties=pika.BasicProperties(
                delivery_mode = 2, # make message persistent
            )
        )
        con.close()