MXS-2481 Add MaxRest functionality
- show_server - call_command
This commit is contained in:
		@ -29,14 +29,56 @@ MaxRest::MaxRest(TestConnections* pTest)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unique_ptr<json_t> MaxRest::servers() const
 | 
			
		||||
unique_ptr<json_t> MaxRest::v1_servers(const string& id) const
 | 
			
		||||
{
 | 
			
		||||
    return curl("servers");
 | 
			
		||||
    string path("servers");
 | 
			
		||||
    path += "/";
 | 
			
		||||
    path += id;
 | 
			
		||||
 | 
			
		||||
    return curl_get(path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unique_ptr<json_t> MaxRest::v1_servers() const
 | 
			
		||||
{
 | 
			
		||||
    return curl_get("servers");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MaxRest::v1_maxscale_modules(const string& module,
 | 
			
		||||
                                  const string& command,
 | 
			
		||||
                                  const string& instance,
 | 
			
		||||
                                  const std::vector<string>& params) const
 | 
			
		||||
{
 | 
			
		||||
    string path("maxscale/modules");
 | 
			
		||||
 | 
			
		||||
    path += "/";
 | 
			
		||||
    path += module;
 | 
			
		||||
    path += "/";
 | 
			
		||||
    path += command;
 | 
			
		||||
    path += "?";
 | 
			
		||||
    path += instance;
 | 
			
		||||
 | 
			
		||||
    if (!params.empty())
 | 
			
		||||
    {
 | 
			
		||||
        for (const auto& param : params)
 | 
			
		||||
        {
 | 
			
		||||
            path += "\\&";
 | 
			
		||||
            path += param;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    curl_post(path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MaxRest::Server MaxRest::show_server(const std::string& id) const
 | 
			
		||||
{
 | 
			
		||||
    unique_ptr<json_t> sObject = v1_servers(id);
 | 
			
		||||
    json_t* pData = get_object(sObject.get(), "data", Presence::MANDATORY);
 | 
			
		||||
    return Server(*this, pData);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
vector<MaxRest::Server> MaxRest::list_servers() const
 | 
			
		||||
{
 | 
			
		||||
    return get_array<Server>(servers().get(), "data", Presence::MANDATORY);
 | 
			
		||||
    return get_array<Server>(v1_servers().get(), "data", Presence::MANDATORY);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
json_t* MaxRest::get_object(json_t* pObject, const string& key, Presence presence) const
 | 
			
		||||
@ -84,19 +126,49 @@ unique_ptr<json_t> MaxRest::parse(const string& json) const
 | 
			
		||||
    return sRoot;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unique_ptr<json_t> MaxRest::curl(const string& path) const
 | 
			
		||||
unique_ptr<json_t> MaxRest::curl_get(const string& path) const
 | 
			
		||||
{
 | 
			
		||||
    return curl(GET, path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unique_ptr<json_t> MaxRest::curl_post(const string& path) const
 | 
			
		||||
{
 | 
			
		||||
    return curl(POST, path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unique_ptr<json_t> MaxRest::curl(Command command, const string& path) const
 | 
			
		||||
{
 | 
			
		||||
    string url = "http://127.0.0.1:8989/v1/" + path;
 | 
			
		||||
    string command = "curl -u admin:mariadb " + url;
 | 
			
		||||
    string curl_command = "curl -u admin:mariadb ";
 | 
			
		||||
 | 
			
		||||
    auto result = m_test.maxscales->ssh_output(command.c_str(), 0, false);
 | 
			
		||||
    switch (command)
 | 
			
		||||
    {
 | 
			
		||||
    case GET:
 | 
			
		||||
        curl_command += "-X GET ";
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case POST:
 | 
			
		||||
        curl_command += "-X POST ";
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    curl_command += url;
 | 
			
		||||
 | 
			
		||||
    auto result = m_test.maxscales->ssh_output(curl_command.c_str(), 0, false);
 | 
			
		||||
 | 
			
		||||
    if (result.first != 0)
 | 
			
		||||
    {
 | 
			
		||||
        raise("Invocation of curl failed: " + to_string(result.first));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return parse(result.second);
 | 
			
		||||
    unique_ptr<json_t> sRv;
 | 
			
		||||
 | 
			
		||||
    if (!result.second.empty())
 | 
			
		||||
    {
 | 
			
		||||
        sRv = parse(result.second);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return sRv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MaxRest::raise(const std::string& message) const
 | 
			
		||||
 | 
			
		||||
@ -57,18 +57,59 @@ public:
 | 
			
		||||
        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> servers() const;
 | 
			
		||||
    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 resrouce /v1/servers as a vector of Server objects.
 | 
			
		||||
     * @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,
 | 
			
		||||
@ -158,7 +199,7 @@ public:
 | 
			
		||||
    std::unique_ptr<json_t> parse(const std::string& json) const;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Issue a curl request to the REST-API endpoint of the MaxScale running on
 | 
			
		||||
     * 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/".
 | 
			
		||||
@ -167,10 +208,31 @@ public:
 | 
			
		||||
     *
 | 
			
		||||
     * @return  The corresponding json_t object.
 | 
			
		||||
     */
 | 
			
		||||
    std::unique_ptr<json_t> curl(const std::string& path) const;
 | 
			
		||||
    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;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user