 2bcee1be8b
			
		
	
	2bcee1be8b
	
	
	
		
			
			Currently tests transaction replay when node goes down. Group change test will be added and name of test will be changed accordingly.
		
			
				
	
	
		
			246 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2016 MariaDB Corporation Ab
 | |
|  *
 | |
|  * Use of this software is governed by the Business Source License included
 | |
|  * in the LICENSE.TXT file and at www.mariadb.com/bsl11.
 | |
|  *
 | |
|  * Change Date: 2022-01-01
 | |
|  *
 | |
|  * On the date above, in accordance with the Business Source License, use
 | |
|  * of this software will be governed by version 2 or later of the General
 | |
|  * Public License.
 | |
|  */
 | |
| #pragma once
 | |
| 
 | |
| #include "testconnections.h"
 | |
| #include <maxscale/jansson.hh>
 | |
| 
 | |
| /**
 | |
|  * @class MaxRest
 | |
|  *
 | |
|  * MaxRest is a class that (eventually) provides the same functionality as
 | |
|  * the command line program maxctrl, but for use in programs.
 | |
|  */
 | |
| class MaxRest
 | |
| {
 | |
| public:
 | |
|     MaxRest(const MaxRest&) = delete;
 | |
|     MaxRest& operator=(const MaxRest&) = delete;
 | |
| 
 | |
|     /**
 | |
|      * A class corresponding to a row in the output of 'maxctrl list servers'
 | |
|      */
 | |
|     struct Server
 | |
|     {
 | |
|         Server() = default;
 | |
|         Server(const MaxRest& maxrest, json_t* pObject);
 | |
| 
 | |
|         std::string name;
 | |
|         std::string address;
 | |
|         int64_t     port;
 | |
|         int64_t     connections;
 | |
|         std::string state;
 | |
|     };
 | |
| 
 | |
|     /**
 | |
|      * Constructor
 | |
|      *
 | |
|      * @param pTest  The TestConnections instance. Must exist for the lifetime
 | |
|      *               of the MaxRest instance.
 | |
|      */
 | |
|     MaxRest(TestConnections* pTest);
 | |
| 
 | |
|     /**
 | |
|      * @return  The TestConnections instance used by this instance.
 | |
|      */
 | |
|     TestConnections& test() const
 | |
|     {
 | |
|         return m_test;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return The JSON object corresponding to /v1/servers/:id:
 | |
|      */
 | |
|     std::unique_ptr<json_t> v1_servers(const std::string& id) const;
 | |
| 
 | |
|     /**
 | |
|      * @return The JSON object corresponding to /v1/servers.
 | |
|      */
 | |
|     std::unique_ptr<json_t> v1_servers() const;
 | |
| 
 | |
|     /**
 | |
|      * POST request to /v1/maxscale/modules/:module:/:command:?instance[¶m...]
 | |
|      *
 | |
|      * @param module    Module name.
 | |
|      * @param command   The command.
 | |
|      * @param instance  The object instance to execute it on.
 | |
|      * @param params    Optional arguments.
 | |
|      */
 | |
|     void v1_maxscale_modules(const std::string& module,
 | |
|                              const std::string& command,
 | |
|                              const std::string& instance,
 | |
|                              const std::vector<std::string>& params = std::vector<std::string>()) const;
 | |
| 
 | |
|     /**
 | |
|      * Call a module command.
 | |
|      *
 | |
|      * @param module    Module name.
 | |
|      * @param command   The command.
 | |
|      * @param instance  The object instance to execute it on.
 | |
|      * @param params    Optional arguments.
 | |
|      */
 | |
|     void call_command(const std::string& module,
 | |
|                       const std::string& command,
 | |
|                       const std::string& instance,
 | |
|                       const std::vector<std::string>& params = std::vector<std::string>()) const
 | |
|     {
 | |
|         return v1_maxscale_modules(module, command, instance, params);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * The equivalent of 'maxctrl list servers'
 | |
|      *
 | |
|      * @return The JSON resource /v1/servers as a vector of Server objects.
 | |
|      */
 | |
|     std::vector<Server> list_servers() const;
 | |
| 
 | |
|     /**
 | |
|      * The equivalent of 'maxctrl show server'
 | |
|      *
 | |
|      * @return The JSON resource /v1/servers/:id: as a Server object.
 | |
|      */
 | |
|     Server show_server(const std::string& id) const;
 | |
| 
 | |
|     enum class Presence
 | |
|     {
 | |
|         OPTIONAL,
 | |
|         MANDATORY
 | |
|     };
 | |
| 
 | |
|     /**
 | |
|      * Turns a JSON array at a specific path into a vector of desired type.
 | |
|      *
 | |
|      * @param pObject   The JSON object containing the JSON array.
 | |
|      * @param path      The path of the resource, e.g. "a/b/c"
 | |
|      * @param presence  Whether the path must exist or not. Note that if it is
 | |
|      *                  a true path "a/b/c", onlt the leaf may be optional, the
 | |
|      *                  components leading to the leaf must be present.
 | |
|      *
 | |
|      * @return Vector of object of desired type.
 | |
|      */
 | |
|     template<class T>
 | |
|     std::vector<T> get_array(json_t* pObject, const std::string& path, Presence presence) const
 | |
|     {
 | |
|         std::vector<T> rv;
 | |
|         pObject = get_leaf_object(pObject, path, presence);
 | |
| 
 | |
|         if (pObject)
 | |
|         {
 | |
|             if (!json_is_array(pObject))
 | |
|             {
 | |
|                 raise("'" + path + "' exists, but is not an array.");
 | |
|             }
 | |
| 
 | |
|             size_t size = json_array_size(pObject);
 | |
| 
 | |
|             for (size_t i = 0; i < size; ++i)
 | |
|             {
 | |
|                 json_t* pElement = json_array_get(pObject, i);
 | |
| 
 | |
|                 rv.push_back(T(*this, pElement));
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return rv;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get JSON object at specific key.
 | |
|      *
 | |
|      * @param pObject   The object containing the path.
 | |
|      * @param key       The key of the resource. May *not* be a path.
 | |
|      * @param presence  Whether the key must exist or not.
 | |
|      *
 | |
|      * @return The desired object, or NULL if it does not exist and @c presence is OPTIONAL.
 | |
|      */
 | |
|     json_t* get_object(json_t* pObject, const std::string& path, Presence presence) const;
 | |
| 
 | |
|     /**
 | |
|      * Get JSON object at specific path.
 | |
|      *
 | |
|      * @param pObject   The object containing the path.
 | |
|      * @param path      The path of the resource, e.g. "a/b/c"
 | |
|      * @param presence  Whether the leaf must exist or not. Note that if it is
 | |
|      *                  a true path "a/b/c", only the leaf may be optional, the
 | |
|      *                  components leading to the leaf must be present.
 | |
|      *
 | |
|      * @return The desired object, or NULL if it does not exist and @c presence is OPTIONAL.
 | |
|      */
 | |
|     json_t* get_leaf_object(json_t* pObject, const std::string& path, Presence presence) const;
 | |
| 
 | |
|     /**
 | |
|      * Get a JSON value as a particular C++ type.
 | |
|      *
 | |
|      * @param pObject   The object containing the path.
 | |
|      * @param path      The path of the resource, e.g. "a/b/c"
 | |
|      * @param presence  Whether the leaf must exist or not. Note that if it is
 | |
|      *                  a true path "a/b/c", onlt the leaf may be optional, the
 | |
|      *                  components leading to the leaf must be present.
 | |
|      *
 | |
|      * @return The desired object, or NULL if it does not exist and @c presence is OPTIONAL.
 | |
|      */
 | |
|     template<class T>
 | |
|     T get(json_t* pObject, const std::string& path, Presence presence = Presence::OPTIONAL) const;
 | |
| 
 | |
|     /**
 | |
|      * Parse a JSON object in a string.
 | |
|      *
 | |
|      * @return  The corresponding json_t object.
 | |
|      */
 | |
|     std::unique_ptr<json_t> parse(const std::string& json) const;
 | |
| 
 | |
|     /**
 | |
|      * Issue a curl GET to the REST-API endpoint of the MaxScale running on
 | |
|      * the maxscale 0 VM instance.
 | |
|      *
 | |
|      * The path will be appended to "http://127.0.0.1:8989/v1/".
 | |
|      *
 | |
|      * @param path  The path of the resource.
 | |
|      *
 | |
|      * @return  The corresponding json_t object.
 | |
|      */
 | |
|     std::unique_ptr<json_t> curl_get(const std::string& path) const;
 | |
| 
 | |
|     /**
 | |
|      * Issue a curl POST to the REST-API endpoint of the MaxScale running on
 | |
|      * the maxscale 0 VM instance.
 | |
|      *
 | |
|      * The path will be appended to "http://127.0.0.1:8989/v1/".
 | |
|      *
 | |
|      * @param path  The path of the resource.
 | |
|      *
 | |
|      * @return  The corresponding json_t object.
 | |
|      */
 | |
|     std::unique_ptr<json_t> curl_post(const std::string& path) const;
 | |
| 
 | |
|     void raise(const std::string& message) const;
 | |
| 
 | |
| private:
 | |
|     enum Command
 | |
|     {
 | |
|         GET,
 | |
|         POST
 | |
|     };
 | |
| 
 | |
|     std::unique_ptr<json_t> curl(Command command, const std::string& path) const;
 | |
| 
 | |
| private:
 | |
|     TestConnections& m_test;
 | |
| };
 | |
| 
 | |
| template<>
 | |
| std::string MaxRest::get<std::string>(json_t* pObject, const std::string& path, Presence presence) const;
 | |
| 
 | |
| template<>
 | |
| int64_t MaxRest::get<int64_t>(json_t* pObject, const std::string& path, Presence presence) const;
 |