133 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.3 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.
 | 
						|
 */
 | 
						|
 | 
						|
#include "maxrest.hh"
 | 
						|
 | 
						|
using namespace std;
 | 
						|
 | 
						|
MaxRest::Server::Server(const MaxRest& maxrest, json_t* pObject)
 | 
						|
    : name       (maxrest.get<string> (pObject, "id", Presence::MANDATORY))
 | 
						|
    , address    (maxrest.get<string> (pObject, "attributes/parameters/address"))
 | 
						|
    , port       (maxrest.get<int64_t>(pObject, "attributes/parameters/port"))
 | 
						|
    , connections(maxrest.get<int64_t>(pObject, "attributes/statistics/connections"))
 | 
						|
    , state      (maxrest.get<string> (pObject, "attributes/state"))
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
MaxRest::MaxRest(TestConnections* pTest)
 | 
						|
    : m_test(*pTest)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
unique_ptr<json_t> MaxRest::servers() const
 | 
						|
{
 | 
						|
    return curl("servers");
 | 
						|
}
 | 
						|
 | 
						|
vector<MaxRest::Server> MaxRest::list_servers() const
 | 
						|
{
 | 
						|
    return get_array<Server>(servers().get(), "data", Presence::MANDATORY);
 | 
						|
}
 | 
						|
 | 
						|
json_t* MaxRest::get_object(json_t* pObject, const string& key, Presence presence) const
 | 
						|
{
 | 
						|
    json_t* pValue = json_object_get(pObject, key.c_str());
 | 
						|
 | 
						|
    if (!pValue && (presence == Presence::MANDATORY))
 | 
						|
    {
 | 
						|
        raise("Mandatory key '" + key + "' not present.");
 | 
						|
    }
 | 
						|
 | 
						|
    return pValue;
 | 
						|
}
 | 
						|
 | 
						|
json_t* MaxRest::get_leaf_object(json_t* pObject, const string& key, Presence presence) const
 | 
						|
{
 | 
						|
    auto i = key.find("/");
 | 
						|
 | 
						|
    if (i == string::npos)
 | 
						|
    {
 | 
						|
        pObject = get_object(pObject, key, presence);
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        string head = key.substr(0, i);
 | 
						|
        string tail = key.substr(i + 1);
 | 
						|
 | 
						|
        pObject = get_object(pObject, head, Presence::MANDATORY);
 | 
						|
        pObject = get_leaf_object(pObject, tail, presence);
 | 
						|
    }
 | 
						|
 | 
						|
    return pObject;
 | 
						|
}
 | 
						|
 | 
						|
unique_ptr<json_t> MaxRest::parse(const string& json) const
 | 
						|
{
 | 
						|
    json_error_t error;
 | 
						|
    unique_ptr<json_t> sRoot(json_loads(json.c_str(), 0, &error));
 | 
						|
 | 
						|
    if (!sRoot)
 | 
						|
    {
 | 
						|
        raise("JSON parsing failed: " + string(error.text));
 | 
						|
    }
 | 
						|
 | 
						|
    return sRoot;
 | 
						|
}
 | 
						|
 | 
						|
unique_ptr<json_t> MaxRest::curl(const string& path) const
 | 
						|
{
 | 
						|
    string url = "http://127.0.0.1:8989/v1/" + path;
 | 
						|
    string command = "curl -u admin:mariadb " + url;
 | 
						|
 | 
						|
    auto result = m_test.maxscales->ssh_output(command.c_str(), 0, false);
 | 
						|
 | 
						|
    if (result.first != 0)
 | 
						|
    {
 | 
						|
        raise("Invocation of curl failed: " + to_string(result.first));
 | 
						|
    }
 | 
						|
 | 
						|
    return parse(result.second);
 | 
						|
}
 | 
						|
 | 
						|
void MaxRest::raise(const std::string& message) const
 | 
						|
{
 | 
						|
    ++m_test.global_result;
 | 
						|
    throw runtime_error(message);
 | 
						|
}
 | 
						|
 | 
						|
template<>
 | 
						|
string MaxRest::get<string>(json_t* pObject, const string& key, Presence presence) const
 | 
						|
{
 | 
						|
    json_t* pValue = get_leaf_object(pObject, key, presence);
 | 
						|
 | 
						|
    if (pValue && !json_is_string(pValue))
 | 
						|
    {
 | 
						|
        raise("Key '" + key + "' is present, but value is not a string.");
 | 
						|
    }
 | 
						|
 | 
						|
    return pValue ? json_string_value(pValue) : "";
 | 
						|
}
 | 
						|
 | 
						|
template<>
 | 
						|
int64_t MaxRest::get<int64_t>(json_t* pObject, const string& key, Presence presence) const
 | 
						|
{
 | 
						|
    json_t* pValue = get_leaf_object(pObject, key, presence);
 | 
						|
 | 
						|
    if (pValue && !json_is_integer(pValue))
 | 
						|
    {
 | 
						|
        raise("Key '" + key + "' is present, but value is not an integer.");
 | 
						|
    }
 | 
						|
 | 
						|
    return pValue ? json_integer_value(pValue) : 0;
 | 
						|
}
 |