ADD: add a simple working version of a pod controler class
This commit is contained in:
185
src/kubecontrol/KubePod.cpp
Normal file
185
src/kubecontrol/KubePod.cpp
Normal file
@@ -0,0 +1,185 @@
|
||||
#include <filesystem>
|
||||
#include <kubecontrol/KubePod.hpp>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
namespace kubecontrol
|
||||
{
|
||||
|
||||
KubePod::KubePod(std::string Label, std::string Uuid, std::string ContainerImage):Label_(Label),Uuid_(Uuid),
|
||||
ContainerImage_(ContainerImage),EnvirmonentVars_()
|
||||
{
|
||||
ContainerRegistry_ = "kmaster.ti.unibw-hamburg.de:30808";
|
||||
EnvirmonentVars_ = std::map<std::string, std::string>();
|
||||
|
||||
this->PathToYaml_ = "config/pods/" + this->Label_ + ".yaml";
|
||||
|
||||
std::filesystem::directory_entry entry("config/pods");
|
||||
if(entry.exists() != true)
|
||||
{
|
||||
std::filesystem::create_directory("config/pods");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void KubePod::setEnvironmentVar(std::string key, std::string val)
|
||||
{
|
||||
EnvirmonentVars_.emplace(key,val);
|
||||
}
|
||||
|
||||
std::map<std::string, std::string> KubePod::GetEnvironmentVars()
|
||||
{
|
||||
return EnvirmonentVars_;
|
||||
}
|
||||
|
||||
std::string* KubePod::GetEnvironmentVar(std::string key)
|
||||
{
|
||||
if(EnvirmonentVars_.contains(key)) {
|
||||
return &EnvirmonentVars_[key];
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
std::string KubePod::createYAML()
|
||||
{
|
||||
YAML::Node node;
|
||||
|
||||
node["apiVersion"] = "v1";
|
||||
node["kind"] = "Pod";
|
||||
node["metadata"]["name"] = this->Uuid_;
|
||||
node["metadata"]["labels"]["app.kubernetes.io/name"] = this->Label_;
|
||||
|
||||
node["spec"]["containers"][0]["name"] = this->Label_+"-container";
|
||||
node["spec"]["containers"][0]["image"] = this->ContainerRegistry_ + "/" + this->ContainerImage_;
|
||||
|
||||
int i = 0;
|
||||
for (auto item :EnvirmonentVars_) {
|
||||
node["spec"]["containers"][0]["env"][i]["name"] = item.first;
|
||||
node["spec"]["containers"][0]["env"][i]["value"] = R"(item.second)";
|
||||
|
||||
}
|
||||
|
||||
|
||||
node["spec"]["restartPolicy"] = "Never";
|
||||
|
||||
std::ofstream fout(this->PathToYaml_);
|
||||
fout << node;
|
||||
fout.close();
|
||||
|
||||
return this->PathToYaml_;
|
||||
|
||||
}
|
||||
|
||||
nlohmann::json KubePod::start(std::string apiAddress,std::string token)
|
||||
{
|
||||
std::string curlURL = apiAddress;
|
||||
std::string AuthString = "Authorization: Bearer " + token;
|
||||
|
||||
std::list<std::string> headers;
|
||||
headers.push_back(AuthString);
|
||||
headers.push_back("Content-Type: application/yaml");
|
||||
|
||||
|
||||
curlpp::Cleanup cleaner;
|
||||
curlpp::Easy request;
|
||||
|
||||
WriterMemoryClass mWriterChunk;
|
||||
curlpp::types::WriteFunctionFunctor functor = std::bind(&WriterMemoryClass::WriteMemoryCallback, &mWriterChunk, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
||||
curlpp::options::WriteFunction *test = new curlpp::options::WriteFunction(functor);
|
||||
request.setOpt(test);
|
||||
|
||||
request.setOpt(new curlpp::options::HttpHeader(headers));
|
||||
|
||||
request.setOpt(new curlpp::options::Url(curlURL));
|
||||
|
||||
request.setOpt(new curlpp::options::SslVerifyPeer(false));
|
||||
|
||||
request.setOpt(new curlpp::options::Post(true));
|
||||
|
||||
|
||||
|
||||
std::ifstream is;
|
||||
is.open (this->PathToYaml_, std::ios::binary );
|
||||
is.seekg (0, std::ios::end);
|
||||
long length = is.tellg();
|
||||
is.seekg (0, std::ios::beg);
|
||||
char *buffer = new char [length];
|
||||
is.read (buffer,length);
|
||||
|
||||
|
||||
|
||||
request.setOpt(new curlpp::options::PostFields(buffer));
|
||||
|
||||
request.perform();
|
||||
auto response = mWriterChunk.getResponse();
|
||||
return nlohmann::json::parse(response);
|
||||
}
|
||||
|
||||
nlohmann::json KubePod::stop(std::string apiAddress,std::string token)
|
||||
{
|
||||
std::string curlURL = apiAddress+ this->Uuid_;
|
||||
std::string AuthString = "Authorization: Bearer " + token;
|
||||
|
||||
std::list<std::string> headers;
|
||||
headers.push_back(AuthString);
|
||||
|
||||
|
||||
curlpp::Cleanup cleaner;
|
||||
curlpp::Easy request;
|
||||
|
||||
WriterMemoryClass mWriterChunk;
|
||||
curlpp::types::WriteFunctionFunctor functor = std::bind(&WriterMemoryClass::WriteMemoryCallback, &mWriterChunk, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
||||
curlpp::options::WriteFunction *writefunction = new curlpp::options::WriteFunction(functor);
|
||||
request.setOpt(writefunction);
|
||||
|
||||
request.setOpt(new curlpp::options::HttpHeader(headers));
|
||||
request.setOpt(new curlpp::options::Url(curlURL));
|
||||
|
||||
|
||||
request.setOpt(new curlpp::options::SslVerifyPeer(false));
|
||||
|
||||
|
||||
request.setOpt(new curlpp::options::CustomRequest("DELETE"));
|
||||
// request.setOpt(new curlpp::options::Verbose(true));
|
||||
|
||||
|
||||
request.perform();
|
||||
auto response = mWriterChunk.getResponse();
|
||||
return nlohmann::json::parse(response);
|
||||
}
|
||||
|
||||
nlohmann::json KubePod::getInfo(std::string apiAddress,std::string token)
|
||||
{
|
||||
std::string curlURL = apiAddress;
|
||||
std::string AuthString = "Authorization: Bearer " + token;
|
||||
|
||||
std::list<std::string> headers;
|
||||
headers.push_back(AuthString);
|
||||
|
||||
|
||||
curlpp::Cleanup cleaner;
|
||||
curlpp::Easy request;
|
||||
|
||||
WriterMemoryClass mWriterChunk;
|
||||
|
||||
curlpp::types::WriteFunctionFunctor functor = std::bind(&WriterMemoryClass::WriteMemoryCallback, &mWriterChunk, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
||||
|
||||
curlpp::options::WriteFunction *test = new curlpp::options::WriteFunction(functor);
|
||||
request.setOpt(test);
|
||||
|
||||
request.setOpt(new curlpp::options::HttpHeader(headers));
|
||||
|
||||
request.setOpt(new curlpp::options::Url(curlURL));
|
||||
|
||||
request.setOpt(new curlpp::options::SslVerifyPeer(false));
|
||||
|
||||
|
||||
request.perform();
|
||||
auto response = mWriterChunk.getResponse();
|
||||
|
||||
return nlohmann::json::parse(response);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,27 +1,221 @@
|
||||
#include "nlohmann/json_fwd.hpp"
|
||||
#include "yaml-cpp/emitter.h"
|
||||
#include "yaml-cpp/emitterstyle.h"
|
||||
#include "yaml-cpp/node/node.h"
|
||||
#include <kubecontrol/kubecontrol.hpp>
|
||||
|
||||
#include <curl_easy.h>
|
||||
|
||||
#include <curlpp/cURLpp.hpp>
|
||||
#include <curlpp/Easy.hpp>
|
||||
#include <curlpp/Options.hpp>
|
||||
#include <curlpp/Exception.hpp>
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <yaml-cpp/yaml.h>
|
||||
|
||||
#include <loguru.hpp>
|
||||
|
||||
#include <nlohmann/json.hpp>
|
||||
|
||||
#include <kubecontrol/WriterMemoryClass.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
|
||||
namespace kubecontrol
|
||||
{
|
||||
|
||||
kubecontrol::kubecontrol(std::string pathToKubectlConfig)
|
||||
{
|
||||
|
||||
YAML::Node config = YAML::LoadFile(pathToKubectlConfig);
|
||||
LOG_S(INFO)<< "test";
|
||||
curl::curl_easy easy;
|
||||
easy.add<CURLOPT_URL>("http://<your_url_here>");
|
||||
easy.add<CURLOPT_FOLLOWLOCATION>(1L);
|
||||
|
||||
BearerToken_ = config["users"][0]["user"]["token"].as<std::string>();
|
||||
ServerAddress_ = config["clusters"][0]["cluster"]["server"].as<std::string>();
|
||||
|
||||
}
|
||||
|
||||
void kubecontrol::getPods()
|
||||
{
|
||||
std::string curlURL = ServerAddress_+"/api/v1/namespaces/hwinkel/pods/";
|
||||
std::string AuthString = "Authorization: Bearer " + BearerToken_;
|
||||
|
||||
std::list<std::string> headers;
|
||||
headers.push_back(AuthString);
|
||||
|
||||
|
||||
curlpp::Cleanup cleaner;
|
||||
curlpp::Easy request;
|
||||
|
||||
WriterMemoryClass mWriterChunk;
|
||||
|
||||
curlpp::types::WriteFunctionFunctor functor = std::bind(&WriterMemoryClass::WriteMemoryCallback, &mWriterChunk, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
||||
|
||||
curlpp::options::WriteFunction *test = new curlpp::options::WriteFunction(functor);
|
||||
request.setOpt(test);
|
||||
|
||||
request.setOpt(new curlpp::options::HttpHeader(headers));
|
||||
|
||||
request.setOpt(new curlpp::options::Url(curlURL));
|
||||
request.setOpt(new curlpp::options::SslEngineDefault());
|
||||
request.setOpt(new curlpp::options::CaPath("config/ca.crt"));
|
||||
request.setOpt(new curlpp::options::SslVerifyPeer(false));
|
||||
|
||||
|
||||
// request.setOpt(new curlpp::options::Verbose(true));
|
||||
|
||||
|
||||
request.perform();
|
||||
auto response = mWriterChunk.getResponse();
|
||||
|
||||
|
||||
|
||||
auto j = nlohmann::json::parse(response);
|
||||
LOG_S(INFO)<<j["items"][0]["metadata"];
|
||||
// std::cout << readBuffer << std::endl;
|
||||
|
||||
}
|
||||
|
||||
void kubecontrol::startPod()
|
||||
{
|
||||
std::string curlURL = ServerAddress_+"/api/v1/namespaces/hwinkel/pods/";
|
||||
std::string AuthString = "Authorization: Bearer " + BearerToken_;
|
||||
|
||||
std::list<std::string> headers;
|
||||
headers.push_back(AuthString);
|
||||
headers.push_back("Content-Type: application/yaml");
|
||||
|
||||
|
||||
curlpp::Cleanup cleaner;
|
||||
curlpp::Easy request;
|
||||
|
||||
WriterMemoryClass mWriterChunk;
|
||||
curlpp::types::WriteFunctionFunctor functor = std::bind(&WriterMemoryClass::WriteMemoryCallback, &mWriterChunk, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
||||
curlpp::options::WriteFunction *test = new curlpp::options::WriteFunction(functor);
|
||||
request.setOpt(test);
|
||||
|
||||
request.setOpt(new curlpp::options::HttpHeader(headers));
|
||||
|
||||
request.setOpt(new curlpp::options::Url(curlURL));
|
||||
|
||||
|
||||
|
||||
request.setOpt(new curlpp::options::SslEngineDefault());
|
||||
request.setOpt(new curlpp::options::CaPath("config/ca.crt"));
|
||||
request.setOpt(new curlpp::options::SslVerifyPeer(false));
|
||||
|
||||
request.setOpt(new curlpp::options::Post(true));
|
||||
|
||||
|
||||
auto yaml = createYAML();
|
||||
std::ifstream is;
|
||||
is.open ("config/pods_deployment.yaml", std::ios::binary );
|
||||
|
||||
// get length of file:
|
||||
is.seekg (0, std::ios::end);
|
||||
long length = is.tellg();
|
||||
is.seekg (0, std::ios::beg);
|
||||
|
||||
// allocate memory:
|
||||
char *buffer = new char [length];
|
||||
|
||||
// read data as a block:
|
||||
is.read (buffer,length);
|
||||
|
||||
|
||||
std::istringstream myStream((std::string( buffer )));
|
||||
int size = myStream.str().size();
|
||||
is.close();
|
||||
|
||||
|
||||
|
||||
request.setOpt(new curlpp::options::PostFields(buffer));
|
||||
|
||||
// request.setOpt(new curlpp::options::Verbose(true));
|
||||
|
||||
|
||||
request.perform();
|
||||
auto response = mWriterChunk.getResponse();
|
||||
// LOG_S(INFO)<<response;
|
||||
}
|
||||
|
||||
|
||||
void kubecontrol::deletePod(std::string uid)
|
||||
{
|
||||
std::string curlURL = ServerAddress_+"/api/v1/namespaces/hwinkel/pods/"+ uid;
|
||||
std::string AuthString = "Authorization: Bearer " + BearerToken_;
|
||||
|
||||
std::list<std::string> headers;
|
||||
headers.push_back(AuthString);
|
||||
// headers.push_back("Content-Type: application/yaml");
|
||||
|
||||
|
||||
curlpp::Cleanup cleaner;
|
||||
curlpp::Easy request;
|
||||
|
||||
WriterMemoryClass mWriterChunk;
|
||||
curlpp::types::WriteFunctionFunctor functor = std::bind(&WriterMemoryClass::WriteMemoryCallback, &mWriterChunk, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
||||
curlpp::options::WriteFunction *test = new curlpp::options::WriteFunction(functor);
|
||||
request.setOpt(test);
|
||||
|
||||
request.setOpt(new curlpp::options::HttpHeader(headers));
|
||||
|
||||
request.setOpt(new curlpp::options::Url(curlURL));
|
||||
|
||||
|
||||
|
||||
request.setOpt(new curlpp::options::SslEngineDefault());
|
||||
request.setOpt(new curlpp::options::CaPath("config/ca.crt"));
|
||||
request.setOpt(new curlpp::options::SslVerifyPeer(false));
|
||||
|
||||
// request.setOpt(new curlpp::options::Post(true));
|
||||
|
||||
// request.setOpt(new curlpp::options::PostFields("DELETE"));
|
||||
request.setOpt(new curlpp::options::CustomRequest("DELETE"));
|
||||
// request.setOpt(new curlpp::options::Verbose(true));
|
||||
|
||||
|
||||
request.perform();
|
||||
auto response = mWriterChunk.getResponse();
|
||||
// LOG_S(INFO)<<response;
|
||||
|
||||
}
|
||||
|
||||
|
||||
std::string kubecontrol::createYAML()
|
||||
{
|
||||
|
||||
|
||||
YAML::Node node;
|
||||
|
||||
node["apiVersion"] = "v1";
|
||||
node["kind"] = "Pod";
|
||||
node["metadata"]["name"] = "debug-debian";
|
||||
node["metadata"]["labels"]["app.kubernetes.io/name"] = "plaindebian";
|
||||
|
||||
node["spec"]["containers"][0]["name"] = "debug-debian-container";
|
||||
node["spec"]["containers"][0]["image"] = "kmaster.ti.unibw-hamburg.de:30808/debugdebianhenry:0.1.2";
|
||||
node["spec"]["containers"][0]["env"][0]["name"] = "OWN_SHIP_SERVER";
|
||||
node["spec"]["containers"][0]["env"][0]["value"] = "127.0.0.1";
|
||||
|
||||
node["spec"]["containers"][0]["args"].SetStyle(YAML::EmitterStyle::Flow);
|
||||
node["spec"]["containers"][0]["args"].push_back("-c");
|
||||
node["spec"]["containers"][0]["args"].push_back("while true; do echo hello; sleep 5;done");
|
||||
|
||||
node["spec"]["containers"][0]["command"].SetStyle(YAML::EmitterStyle::Flow);
|
||||
node["spec"]["containers"][0]["command"].push_back("/bin/sh");
|
||||
|
||||
node["spec"]["restartPolicy"] = "Never";
|
||||
|
||||
|
||||
std::ofstream fout("config/pods_deployment.yaml");
|
||||
fout << node;
|
||||
fout.close();
|
||||
|
||||
return "config/pods_deployment.yaml";
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user